From 78c886036afce0c940592883d9d29ced84c53370 Mon Sep 17 00:00:00 2001 From: Ali Bandali Date: Mon, 17 Mar 2025 02:55:46 -0400 Subject: [PATCH 1/3] Adding general controller to control systems --- .../.vscode/settings.json | 46 +++++++++++++++++ .../FSM_general_controller/ActiveState.cpp | 50 +++++++++++++++++++ control/FSM_general_controller/ActiveState.h | 17 +++++++ control/FSM_general_controller/ErrorState.cpp | 48 ++++++++++++++++++ control/FSM_general_controller/ErrorState.h | 17 +++++++ control/FSM_general_controller/IdleState.cpp | 48 ++++++++++++++++++ control/FSM_general_controller/IdleState.h | 17 +++++++ control/FSM_general_controller/Sensor.cpp | 26 ++++++++++ control/FSM_general_controller/Sensor.h | 21 ++++++++ control/FSM_general_controller/State.cpp | 21 ++++++++ control/FSM_general_controller/State.h | 26 ++++++++++ control/FSM_general_controller/main.cpp | 43 ++++++++++++++++ 12 files changed, 380 insertions(+) create mode 100644 control/FSM_general_controller/.vscode/settings.json create mode 100644 control/FSM_general_controller/ActiveState.cpp create mode 100644 control/FSM_general_controller/ActiveState.h create mode 100644 control/FSM_general_controller/ErrorState.cpp create mode 100644 control/FSM_general_controller/ErrorState.h create mode 100644 control/FSM_general_controller/IdleState.cpp create mode 100644 control/FSM_general_controller/IdleState.h create mode 100644 control/FSM_general_controller/Sensor.cpp create mode 100644 control/FSM_general_controller/Sensor.h create mode 100644 control/FSM_general_controller/State.cpp create mode 100644 control/FSM_general_controller/State.h create mode 100644 control/FSM_general_controller/main.cpp diff --git a/control/FSM_general_controller/.vscode/settings.json b/control/FSM_general_controller/.vscode/settings.json new file mode 100644 index 0000000..e0257cf --- /dev/null +++ b/control/FSM_general_controller/.vscode/settings.json @@ -0,0 +1,46 @@ +{ + "files.associations": { + "atomic": "cpp", + "bit": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "exception": "cpp", + "initializer_list": "cpp", + "ios": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "iterator": "cpp", + "limits": "cpp", + "memory": "cpp", + "new": "cpp", + "ostream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "typeinfo": "cpp", + "utility": "cpp", + "xfacet": "cpp", + "xiosbase": "cpp", + "xlocale": "cpp", + "xlocinfo": "cpp", + "xlocnum": "cpp", + "xmemory": "cpp", + "xstddef": "cpp", + "xstring": "cpp", + "xtr1common": "cpp", + "xutility": "cpp" + } +} diff --git a/control/FSM_general_controller/ActiveState.cpp b/control/FSM_general_controller/ActiveState.cpp new file mode 100644 index 0000000..bf9d9b6 --- /dev/null +++ b/control/FSM_general_controller/ActiveState.cpp @@ -0,0 +1,50 @@ +#include "ActiveState.h" +#include + +// Constructor +ActiveState::ActiveState() +{ +} + +// Destructor +ActiveState::~ActiveState() +{ +} + +void ActiveState::enter() +{ + cout << "\nNow in Active State \n"; +} + +void ActiveState::update() +{ + while (true) + { + cout << "1. idle \n2. error \n3. exit\n"; + int num; + cin >> num; // replace with sensor reading(s) + switch (num) + { + + // replace cases with conditionals + + case 1: + leave(); + current = idle; + return; + + case 2: + leave(); + current = error; + return; + + case 3: + exit(0); // exit program with 0 status (immediate shut down case) + } + } +} + +void ActiveState::leave() +{ + cout << "\nleaving Active State\n"; +} diff --git a/control/FSM_general_controller/ActiveState.h b/control/FSM_general_controller/ActiveState.h new file mode 100644 index 0000000..131c4bb --- /dev/null +++ b/control/FSM_general_controller/ActiveState.h @@ -0,0 +1,17 @@ +#ifndef ACTIVE_STATE_H +#define ACTIVE_STATE_H + +#include "State.h" + +class ActiveState : public State +{ + +public: + ActiveState(); + virtual ~ActiveState(); + void enter(); + void leave(); + void update(); +}; + +#endif \ No newline at end of file diff --git a/control/FSM_general_controller/ErrorState.cpp b/control/FSM_general_controller/ErrorState.cpp new file mode 100644 index 0000000..16f4e0d --- /dev/null +++ b/control/FSM_general_controller/ErrorState.cpp @@ -0,0 +1,48 @@ +#include "ErrorState.h" + +ErrorState::ErrorState() +{ +} + +ErrorState::~ErrorState() +{ +} + +void ErrorState::enter() +{ + cout << "\nNow in Error State \n"; +} + +void ErrorState::update() +{ + // loop + while (true) + { + cout << "1. active\n2. idle \n3. exit\n"; + int sensorReading; + cin >> sensorReading; // replace with sensor reading(s) + switch (sensorReading) + { + + // replace cases with conditionals + + case 1: + leave(); + current = active; + return; + + case 2: + leave(); + current = idle; + return; + + case 3: + exit(0); // exit program with 0 status (immediate shut down case) + } + } +} + +void ErrorState::leave() +{ + cout << "\nleaving Error State \n"; +} diff --git a/control/FSM_general_controller/ErrorState.h b/control/FSM_general_controller/ErrorState.h new file mode 100644 index 0000000..55a5e09 --- /dev/null +++ b/control/FSM_general_controller/ErrorState.h @@ -0,0 +1,17 @@ +#ifndef ERROR_STATE_H +#define ERROR_STATE_H + +#include "State.h" + +class ErrorState : public State +{ + +public: + ErrorState(); + virtual ~ErrorState(); + void enter(); + void leave(); + void update(); +}; + +#endif \ No newline at end of file diff --git a/control/FSM_general_controller/IdleState.cpp b/control/FSM_general_controller/IdleState.cpp new file mode 100644 index 0000000..0132c17 --- /dev/null +++ b/control/FSM_general_controller/IdleState.cpp @@ -0,0 +1,48 @@ +#include "IdleState.h" + +IdleState::IdleState() +{ +} + +IdleState::~IdleState() +{ +} + +void IdleState::enter() +{ + cout << "\nNow in Idle State \n"; +} + +void IdleState::update() +{ + while (true) + { + + cout << "1. active\n2. error \n3. exit\n"; + int num; + cin >> num; // replace with sensor reading(s) + switch (num) + { + + // replace cases with conditionals + + case 1: + leave(); + current = active; + return; + + case 2: + leave(); + current = error; + return; + + case 3: + exit(0); // exit program with 0 status (fatal subModule failure) + } + } +} + +void IdleState::leave() +{ + cout << "\nleaving Idle State\n"; +} diff --git a/control/FSM_general_controller/IdleState.h b/control/FSM_general_controller/IdleState.h new file mode 100644 index 0000000..2bb623a --- /dev/null +++ b/control/FSM_general_controller/IdleState.h @@ -0,0 +1,17 @@ +#ifndef IDLE_STATE_H +#define IDLE_STATE_H + +#include "State.h" + +class IdleState : public State +{ + +public: + IdleState(); + virtual ~IdleState(); + void enter(); + void leave(); + void update(); +}; + +#endif \ No newline at end of file diff --git a/control/FSM_general_controller/Sensor.cpp b/control/FSM_general_controller/Sensor.cpp new file mode 100644 index 0000000..ac50076 --- /dev/null +++ b/control/FSM_general_controller/Sensor.cpp @@ -0,0 +1,26 @@ + +#include "Sensor.h" + +double Sensor::max_sensor_reading = 0.0; // Initial value for max sensor reading +double Sensor::min_sensor_reading = 0.0; // Initial value for min sensor reading + +void Sensor::setMaxSensorReading(double maxReading) +{ + max_sensor_reading = maxReading; +} + +void Sensor::setMinSensorReading(double minReading) +{ + min_sensor_reading = minReading; +} + +// Getters +double Sensor::getMaxSensorReading() +{ + return max_sensor_reading; +} + +double Sensor::getMinSensorReading() +{ + return min_sensor_reading; +} \ No newline at end of file diff --git a/control/FSM_general_controller/Sensor.h b/control/FSM_general_controller/Sensor.h new file mode 100644 index 0000000..90e9eb1 --- /dev/null +++ b/control/FSM_general_controller/Sensor.h @@ -0,0 +1,21 @@ +#ifndef SENSOR_H +#define SENSOR_H + +class Sensor +{ +public: + static double max_sensor_reading; + static double min_sensor_reading; + + // Set the max and min sensor readings + static void setMaxSensorReading(double maxReading); + + static void setMinSensorReading(double minReading); + + // Getters + static double getMaxSensorReading(); + + static double getMinSensorReading(); +}; + +#endif \ No newline at end of file diff --git a/control/FSM_general_controller/State.cpp b/control/FSM_general_controller/State.cpp new file mode 100644 index 0000000..5894b4f --- /dev/null +++ b/control/FSM_general_controller/State.cpp @@ -0,0 +1,21 @@ +#include "State.h" +#include "Sensor.h" + +State::State() +{ +} + +// Destructor definition +State::~State() +{ +} + +double State::getMaxSensorReading() +{ + return Sensor::getMaxSensorReading(); +} + +double State::getMinSensorReading() +{ + return Sensor::getMinSensorReading(); +} \ No newline at end of file diff --git a/control/FSM_general_controller/State.h b/control/FSM_general_controller/State.h new file mode 100644 index 0000000..d3b3c10 --- /dev/null +++ b/control/FSM_general_controller/State.h @@ -0,0 +1,26 @@ +#ifndef STATE_H +#define STATE_H + +#include +using namespace std; + +class State +{ +public: + State(); + + virtual ~State(); + + virtual void enter() = 0; + virtual void update() = 0; + virtual void leave() = 0; + static State *current; // Declaration + static State *active; // Declaration + static State *idle; // Declaration + static State *error; // Declaration + + double getMaxSensorReading(); + double getMinSensorReading(); +}; + +#endif \ No newline at end of file diff --git a/control/FSM_general_controller/main.cpp b/control/FSM_general_controller/main.cpp new file mode 100644 index 0000000..a8ff60c --- /dev/null +++ b/control/FSM_general_controller/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include "ActiveState.h" +#include "IdleState.h" +#include "ErrorState.h" +#include "State.h" +#include "Sensor.h" + +using namespace std; + +State *State::active = new ActiveState(); +State *State::idle = new IdleState(); +State *State::error = new ErrorState(); + +// starting state +State *State::current = State::idle; + +int main(int argc, char **argv) +{ + double max_sensor_reading = 0; + double min_sensor_reading = 0; + + cout << "\n\nInput maximum sensor reading (currently not used for state transitions)\n"; + cin >> max_sensor_reading; + cout << "\n\n"; + cout << "Input minimum sensor reading (currently not used for state transitions)\n"; + cin >> min_sensor_reading; + cout << "\n\n"; + + cout << "Type 1 or 2 to change states (to exit program type 3) \n\n"; + + // Set the max and min sensor readings in the Sensor class + Sensor::setMaxSensorReading(max_sensor_reading); + Sensor::setMinSensorReading(min_sensor_reading); + + while (true) + { + State::current->enter(); + State::current->update(); + } + + return 0; +} \ No newline at end of file From 9c0470b130ea267ba20a5c289918eaa7f725641f Mon Sep 17 00:00:00 2001 From: RitvikDeshpande Date: Fri, 21 Mar 2025 19:49:10 -0400 Subject: [PATCH 2/3] Add Torque Controller to ActiveState.cpp Torque Controller assumes that the hip and knee joints follow a sinusodial pattern. We can change this, when we get real data from the AI team. Running "make run_plot", runs the control system and outputs the Joint trajectories with their respective output torques using MatPlotLib. --- .../FSM_general_controller/ActiveState.cpp | 114 +- control/FSM_general_controller/main.cpp | 6 +- control/Joint_Estimator/JointEstimator.cpp | 31 + control/Joint_Estimator/JointEstimator.h | 15 + control/Makefile | 33 + control/README.md | 62 +- control/Testing/log_output.csv | 1002 +++++++++++++++++ control/Testing/outputAnalysis.py | 99 ++ .../Torque_Controller/TorqueController.cpp | 65 ++ control/Torque_Controller/TorqueController.h | 43 + control/exo_control_test | Bin 0 -> 39288 bytes 11 files changed, 1445 insertions(+), 25 deletions(-) create mode 100644 control/Joint_Estimator/JointEstimator.cpp create mode 100644 control/Joint_Estimator/JointEstimator.h create mode 100644 control/Makefile create mode 100644 control/Testing/log_output.csv create mode 100644 control/Testing/outputAnalysis.py create mode 100644 control/Torque_Controller/TorqueController.cpp create mode 100644 control/Torque_Controller/TorqueController.h create mode 100755 control/exo_control_test diff --git a/control/FSM_general_controller/ActiveState.cpp b/control/FSM_general_controller/ActiveState.cpp index bf9d9b6..8b0f12b 100644 --- a/control/FSM_general_controller/ActiveState.cpp +++ b/control/FSM_general_controller/ActiveState.cpp @@ -1,5 +1,13 @@ #include "ActiveState.h" #include +#include "../Joint_Estimator/JointEstimator.h" +#include "../Torque_Controller/TorqueController.h" + +#include +#include +#include +#include +#include // Constructor ActiveState::ActiveState() @@ -18,30 +26,90 @@ void ActiveState::enter() void ActiveState::update() { - while (true) - { - cout << "1. idle \n2. error \n3. exit\n"; - int num; - cin >> num; // replace with sensor reading(s) - switch (num) - { - - // replace cases with conditionals - - case 1: - leave(); - current = idle; - return; - - case 2: - leave(); - current = error; - return; - - case 3: - exit(0); // exit program with 0 status (immediate shut down case) + + // Setup parameters (TODO: move these parameter definitions to another file) + TorqueController::ModelParameters params = { + .m1 = 5.65, .m2 = 3.48, + .L1 = 0.41, .L2 = 0.4879, + .r1 = 0.17, .r2 = 0.1892, + .I1 = 0.0648, .I2 = 0.0107, + .g = 9.81 + }; + + double dt = 0.01; // 10 ms loop + double t = 0.0; + + TorqueController controller(params); + JointEstimator hip_estimator(dt); + JointEstimator knee_estimator(dt); + + //Setup logging + std::ofstream log("Testing/log_output.csv"); + log << "time,hip_angle,hip_velocity,hip_acceleration," + "hip_m_acc,hip_c_vel,hip_g,hip_torque," + "knee_angle,knee_velocity,knee_acceleration," + "knee_m_acc,knee_c_vel,knee_g,knee_torque\n"; + ///////////////////////////////////////////////////////////////////////////// + + while (true) + { + + // Run simulation for 10 seconds for testing purposes (TODO: maybe create a non-blocking keyboard interrupt to change states) + if (t >= 10.0) { + std::cout << "Finished 10-second test.\n"; + leave(); + current = idle; + return; + } + + // Simulated joint angles (TODO: replace with AI later) + // make sure angle is in RADIANS!! + double hip_angle = (10.0 * M_PI / 180.0) * std::sin(2 * M_PI * 1.0 * t); + double knee_angle = (30.0 * M_PI / 180.0) * std::sin(2 * M_PI * 1.0 * t + M_PI / 4); + + // These variables are only for testing purposes + // We want to see how the coriolis and gravity term affect the torque output + double hip_m_acc, hip_c_vel, hip_g; + double knee_m_acc, knee_c_vel, knee_g; + + // Update speed, acceleration estimator + hip_estimator.update(hip_angle); + knee_estimator.update(knee_angle); + + TorqueController::JointState hip = { + .angle = hip_angle, + .velocity = hip_estimator.getVelocity(), + .acceleration = hip_estimator.getAcceleration() + }; + + TorqueController::JointState knee = { + .angle = knee_angle, + .velocity = knee_estimator.getVelocity(), + .acceleration = knee_estimator.getAcceleration() + }; + + // Compute torque + double hip_torque = 0.0, knee_torque = 0.0; + controller.computeTorque( + hip, knee, + hip_torque, knee_torque, + hip_m_acc, hip_c_vel, hip_g, + knee_m_acc, knee_c_vel, knee_g + ); + + // Output to console for now (TODO: replace with motor command) + std::cout << "Hip Torque: " << hip_torque << "\tKnee Torque: " << knee_torque << "\n"; + + // Log to CSV + log << t << "," + << hip.angle << "," << hip.velocity << "," << hip.acceleration << "," + << hip_m_acc << "," << hip_c_vel << "," << hip_g << "," << hip_torque << "," + << knee.angle << "," << knee.velocity << "," << knee.acceleration << "," + << knee_m_acc << "," << knee_c_vel << "," << knee_g << "," << knee_torque << "\n"; + + t += dt; + std::this_thread::sleep_for(std::chrono::milliseconds(10)); } - } } void ActiveState::leave() diff --git a/control/FSM_general_controller/main.cpp b/control/FSM_general_controller/main.cpp index a8ff60c..330508d 100644 --- a/control/FSM_general_controller/main.cpp +++ b/control/FSM_general_controller/main.cpp @@ -20,6 +20,8 @@ int main(int argc, char **argv) double max_sensor_reading = 0; double min_sensor_reading = 0; + /* + cout << "\n\nInput maximum sensor reading (currently not used for state transitions)\n"; cin >> max_sensor_reading; cout << "\n\n"; @@ -27,6 +29,8 @@ int main(int argc, char **argv) cin >> min_sensor_reading; cout << "\n\n"; + */ + cout << "Type 1 or 2 to change states (to exit program type 3) \n\n"; // Set the max and min sensor readings in the Sensor class @@ -40,4 +44,4 @@ int main(int argc, char **argv) } return 0; -} \ No newline at end of file +} diff --git a/control/Joint_Estimator/JointEstimator.cpp b/control/Joint_Estimator/JointEstimator.cpp new file mode 100644 index 0000000..45b03ec --- /dev/null +++ b/control/Joint_Estimator/JointEstimator.cpp @@ -0,0 +1,31 @@ +/* + * Estimates the velocity and acceleration of a joint, using numerical differentation + * + * Usage: + * JointEstimator estimator(0.01); // 10 ms timestep + * estimator.update(AI_desired_angle); + * double velocity = estimator.getVelocity(); + * double acceleration = estimator.getAcceleration(); +*/ + +#include "JointEstimator.h" + +JointEstimator::JointEstimator(double dt) : dt(dt), prev_angle(0), prev_velocity(0), velocity(0), acceleration(0) {} + +void JointEstimator::update(double current_angle) { + velocity = (current_angle - prev_angle) / dt; + acceleration = (velocity - prev_velocity) / dt; + + prev_angle = current_angle; + prev_velocity = velocity; +} + +double JointEstimator::getVelocity() const +{ + return velocity; +} + +double JointEstimator::getAcceleration() const +{ + return acceleration; +} diff --git a/control/Joint_Estimator/JointEstimator.h b/control/Joint_Estimator/JointEstimator.h new file mode 100644 index 0000000..089765d --- /dev/null +++ b/control/Joint_Estimator/JointEstimator.h @@ -0,0 +1,15 @@ +class JointEstimator { + public: + JointEstimator(double dt); + void update(double current_angle); + + double getVelocity() const; + double getAcceleration() const; + + private: + double dt; + double prev_angle; + double prev_velocity; + double velocity; + double acceleration; +}; diff --git a/control/Makefile b/control/Makefile new file mode 100644 index 0000000..89d93a1 --- /dev/null +++ b/control/Makefile @@ -0,0 +1,33 @@ +CXX = g++ +CXXFLAGS = -std=c++17 -Wall + +TARGET = exo_control_test + +SRC = \ + FSM_general_controller/main.cpp \ + FSM_general_controller/ActiveState.cpp \ + FSM_general_controller/IdleState.cpp \ + FSM_general_controller/ErrorState.cpp \ + FSM_general_controller/State.cpp \ + FSM_general_controller/Sensor.cpp \ + Joint_Estimator/JointEstimator.cpp \ + Torque_Controller/TorqueController.cpp + +INCLUDES = -IFSM_general_controller -IJoint_Estimator -ITorque_Controller + +all: $(TARGET) + +$(TARGET): + $(CXX) $(CXXFLAGS) $(INCLUDES) $(SRC) -o $(TARGET) + +run: $(TARGET) + ./$(TARGET) + +plot: + python3 Testing/outputAnalysis.py + +run_plot: run plot + +clean: + rm -f $(TARGET) + diff --git a/control/README.md b/control/README.md index b1ac365..8202611 100644 --- a/control/README.md +++ b/control/README.md @@ -1,2 +1,62 @@ # Control Systems -Submodule of McMaster Exoskeleton Embedded Software, handling feedback control loop \ No newline at end of file +Submodule of McMaster Exoskeleton Embedded Software, handling feedback control loop. + +This repository contains the **general state controller** and **torque controller**. + +## Setup + +To run this project, you will need: + +### 1. Required Software +- **C++ Compiler:** `g++` +- **Python:** `python3` (for graphing) + +### 2. Install Python Dependencies +Before running the analysis, install the required Python libraries: + +```bash +pip3 install matplotlib pandas +``` + +--- + +## How to Run the Code + +### 1. Clone the Repository +```bash +git clone +cd /control +``` + +### 2. Compile & Execute with One Command +```bash +make run_plot +``` +This will: +- **Compile the general state controller** +- **Run the FSM** +- **Log joint state and torque data** +- **Generate plots automatically** + +### 3. Navigate Through the State Controller +The program starts in the Idle State. Follow these steps: + +**Switch to Active State:** + - When prompted, enter `1` to activate the controller. + - This will simulate joint motion and compute torques. + +**Exit the Program:** + - When prompted, enter `3` to stop execution. + +--- + +## Understanding the Output +After exiting, the system will generate 3 plots: + +1. Hip Joint Data (Angle, Velocity, Acceleration, Torque) +2. Knee Joint Data (Angle, Velocity, Acceleration, Torque) +3. Torque Component Breakdown (Mass × Acceleration, Coriolis, Gravity, Total Torque) + +As an initial test case, the hip and knee joint angles follow a sinusoidal trajectory. + +TODO: Find out what AI model for hip and knee joint angles will be. diff --git a/control/Testing/log_output.csv b/control/Testing/log_output.csv new file mode 100644 index 0000000..09ecff8 --- /dev/null +++ b/control/Testing/log_output.csv @@ -0,0 +1,1002 @@ +time,hip_angle,hip_velocity,hip_acceleration,hip_m_acc,hip_c_vel,hip_g,hip_torque,knee_angle,knee_velocity,knee_acceleration,knee_m_acc,knee_c_vel,knee_g,knee_torque +0,0,0,0,1632.87,-133.896,29.4408,1528.42,0.37024,37.024,3702.4,500.833,0,6.0214,506.854 +0.01,0.010959,1.0959,109.59,-1368.28,-1.03376,29.3578,-1339.96,0.392757,2.2517,-3477.23,-422.289,0.124087,5.9398,-416.225 +0.02,0.0218748,1.09158,-0.432502,-7.38597,-0.973863,29.2697,20.9099,0.413724,2.0967,-15.5003,-2.28557,0.129313,5.8559,3.69964 +0.03,0.0327042,1.08294,-0.863297,-8.32538,-0.897855,29.1779,19.9547,0.433058,1.93342,-16.3278,-2.58372,0.132856,5.77104,3.32018 +0.04,0.0434046,1.07004,-1.29069,-9.227,-0.808792,29.0839,19.0481,0.450683,1.76251,-17.0908,-2.86997,0.134633,5.68657,2.95123 +0.05,0.0539336,1.05291,-1.71298,-10.0888,-0.710078,28.9892,18.1903,0.46653,1.58465,-17.7864,-3.1434,0.134609,5.60381,2.59501 +0.06,0.0642499,1.03162,-2.12851,-10.9089,-0.605348,28.8951,17.3809,0.480535,1.40053,-18.4118,-3.40321,0.132802,5.52404,2.25363 +0.07,0.0743125,1.00627,-2.53565,-11.6858,-0.498338,28.8033,16.6191,0.492644,1.21088,-18.9645,-3.64866,0.12928,5.44847,1.92909 +0.08,0.0840819,0.976937,-2.93278,-12.4181,-0.392758,28.7149,15.9041,0.502809,1.01646,-19.4424,-3.87912,0.124155,5.37824,1.62328 +0.09,0.0935194,0.943754,-3.31833,-13.1045,-0.292177,28.6315,15.2348,0.510989,0.818022,-19.8436,-4.09404,0.117583,5.3144,1.33794 +0.1,0.102588,0.906846,-3.69078,-13.7437,-0.199902,28.5541,14.6105,0.517152,0.616358,-20.1664,-4.29293,0.109758,5.25787,1.0747 +0.11,0.111251,0.866359,-4.04867,-14.3346,-0.118877,28.4841,14.0306,0.521275,0.412262,-20.4096,-4.47535,0.100902,5.20947,0.83502 +0.12,0.119476,0.822454,-4.39059,-14.8761,-0.0515908,28.4224,13.4947,0.52334,0.206539,-20.5723,-4.64093,0.0912604,5.1699,0.620235 +0.13,0.127229,0.775302,-4.71517,-15.3667,-0,28.3698,13.0032,0.52334,0,-20.6539,-4.78931,0.0810964,5.13973,0.431509 +0.14,0.13448,0.72509,-5.02115,-15.8052,0.0345301,28.3273,12.5567,0.521275,-0.206539,-20.6539,-4.9202,0.0706782,5.11937,0.269854 +0.15,0.1412,0.672017,-5.30731,-16.1902,0.0512687,28.2955,12.1565,0.517152,-0.412262,-20.5723,-5.03328,0.0602739,5.10913,0.136118 +0.16,0.147363,0.616292,-5.57252,-16.5202,0.050142,28.2747,11.8047,0.510989,-0.616358,-20.4096,-5.12829,0.050142,5.10913,0.0309813 +0.17,0.152944,0.558135,-5.81575,-16.7935,0.0317374,28.2654,11.5036,0.502809,-0.818022,-20.1664,-5.20495,0.0405236,5.11938,-0.0450446 +0.18,0.157922,0.497774,-6.03602,-17.0086,-0.00271351,28.2677,11.2564,0.492644,-1.01646,-19.8436,-5.263,0.0316352,5.13974,-0.0916262 +0.19,0.162277,0.43545,-6.23246,-17.1636,-0.0513716,28.2816,11.0667,0.480535,-1.21088,-19.4424,-5.30219,0.0236614,5.16992,-0.10861 +0.2,0.165991,0.371407,-6.40432,-17.2569,-0.111847,28.307,10.9382,0.46653,-1.40053,-18.9645,-5.32227,0.0167492,5.20949,-0.0960304 +0.21,0.16905,0.305898,-6.55089,-17.2868,-0.181272,28.3435,10.8754,0.450683,-1.58465,-18.4118,-5.32301,0.0110029,5.25789,-0.0541106 +0.22,0.171441,0.239181,-6.67162,-17.2516,-0.256399,28.3905,10.8825,0.433058,-1.76251,-17.7864,-5.30418,0.00648075,5.31443,0.0167296 +0.23,0.173157,0.171521,-6.76601,-17.1498,-0.333703,28.4475,10.9639,0.413724,-1.93342,-17.0908,-5.2656,0.00319279,5.37828,0.115872 +0.24,0.174189,0.103184,-6.8337,-16.9803,-0.409503,28.5135,11.1237,0.392757,-2.0967,-16.3278,-5.20711,0.00110005,5.44851,0.242499 +0.25,0.174533,0.0344401,-6.87443,-16.7419,-0.480096,28.5877,11.3657,0.37024,-2.2517,-15.5003,-5.1286,0.000115859,5.52408,0.395593 +0.26,0.174189,-0.0344401,-6.88802,-16.434,-0.541885,28.6689,11.693,0.346262,-2.39782,-14.6117,-5.03002,0.000108669,5.60385,0.573939 +0.27,0.173157,-0.103184,-6.87443,-16.0563,-0.591518,28.7558,12.108,0.320917,-2.53447,-13.6654,-4.91139,0.000906619,5.68661,0.776131 +0.28,0.171441,-0.171521,-6.8337,-15.6089,-0.626014,28.8472,12.6123,0.294306,-2.66112,-12.6651,-4.7728,0.00230373,5.77108,1.00058 +0.29,0.16905,-0.239181,-6.76601,-15.0924,-0.642888,28.9415,13.2062,0.266533,-2.77727,-11.6149,-4.61447,0.00406759,5.85594,1.24554 +0.3,0.165991,-0.305898,-6.67162,-14.508,-0.64025,29.0374,13.8891,0.237709,-2.88246,-10.5189,-4.43669,0.00594818,5.93984,1.5091 +0.31,0.162277,-0.371407,-6.55089,-13.8575,-0.616892,29.1332,14.6587,0.207946,-2.97627,-9.38128,-4.23991,0.00768776,6.02144,1.78922 +0.32,0.157922,-0.43545,-6.40432,-13.1432,-0.572349,29.2274,15.5118,0.177363,-3.05834,-8.20668,-4.02466,0.00903116,6.0994,2.08377 +0.33,0.152944,-0.497774,-6.23246,-12.3679,-0.506929,29.3185,16.4436,0.146079,-3.12834,-6.9997,-3.79166,0.00973627,6.17244,2.39051 +0.34,0.147363,-0.558135,-6.03602,-11.5352,-0.421716,29.4049,17.4481,0.11422,-3.18599,-5.76509,-3.54172,0.00958424,6.23934,2.7072 +0.35,0.1412,-0.616292,-5.81575,-10.6489,-0.318541,29.4853,18.5178,0.0819089,-3.23106,-4.50772,-3.27581,0.00838885,6.29897,3.03155 +0.36,0.13448,-0.672017,-5.57252,-9.71374,-0.199923,29.5583,19.6446,0.049275,-3.26339,-3.23257,-2.99504,0.00600476,6.35032,3.36129 +0.37,0.127229,-0.72509,-5.30731,-8.73456,-0.0689809,29.6226,20.8191,0.0164466,-3.28284,-1.94466,-2.70063,0.00233413,6.39251,3.69421 +0.38,0.119476,-0.775302,-5.02115,-7.71672,0.0706786,29.6773,22.0312,-0.0164466,-3.28933,-0.649074,-2.39395,-0.0026686,6.42481,4.02819 +0.39,0.111251,-0.822454,-4.71517,-6.66587,0.215096,29.7213,23.2705,-0.049275,-3.28284,0.649074,-2.07644,-0.0089941,6.44666,4.36123 +0.4,0.102588,-0.866359,-4.39059,-5.58788,0.360106,29.754,24.5262,-0.0819089,-3.26339,1.94466,-1.74966,-0.0165778,6.45768,4.69144 +0.41,0.0935194,-0.906846,-4.04867,-4.48875,0.501494,29.7748,25.7875,-0.11422,-3.23106,3.23257,-1.41525,-0.0253016,6.45768,5.01713 +0.42,0.0840819,-0.943754,-3.69078,-3.37454,0.635154,29.7833,27.0439,-0.146079,-3.18599,4.50772,-1.07488,-0.0349982,6.44665,5.33677 +0.43,0.0743125,-0.976937,-3.31833,-2.25126,0.75724,29.7796,28.2856,-0.177363,-3.12834,5.76509,-0.730274,-0.045457,6.4248,5.64906 +0.44,0.0642499,-1.00627,-2.93278,-1.12479,0.864308,29.7636,29.5031,-0.207946,-3.05834,6.9997,-0.38317,-0.056432,6.39249,5.95289 +0.45,0.0539336,-1.03162,-2.53565,-0.00082089,0.95344,29.7357,30.6883,-0.237709,-2.97627,8.20668,-0.035296,-0.0676508,6.3503,6.24735 +0.46,0.0434046,-1.05291,-2.12851,1.11521,1.02234,29.6963,31.8338,-0.266533,-2.88246,9.38128,0.311642,-0.0788245,6.29894,6.53176 +0.47,0.0327042,-1.07004,-1.71298,2.21822,1.06941,29.6462,32.9338,-0.294306,-2.77727,10.5189,0.655982,-0.0896588,6.2393,6.80563 +0.48,0.0218748,-1.08294,-1.29069,3.30345,1.09381,29.5862,33.9835,-0.320917,-2.66112,11.6149,0.996124,-0.0998639,6.1724,7.06866 +0.49,0.010959,-1.09158,-0.863297,4.36657,1.09543,29.5174,34.9794,-0.346262,-2.53447,12.6651,1.33054,-0.109165,6.09936,7.32074 +0.5,-2.1115e-16,-1.0959,-0.432502,5.40364,1.07496,29.4408,35.9194,-0.37024,-2.39782,13.6654,1.6578,-0.117312,6.0214,7.56189 +0.51,-0.010959,-1.0959,-7.32747e-13,6.41114,1.03376,29.3578,36.8027,-0.392757,-2.2517,14.6117,1.97656,-0.124087,5.9398,7.79227 +0.52,-0.0218748,-1.09158,0.432502,7.38597,0.973863,29.2697,37.6295,-0.413724,-2.0967,15.5003,2.28557,-0.129313,5.8559,8.01216 +0.53,-0.0327042,-1.08294,0.863297,8.32538,0.897855,29.1779,38.4012,-0.433058,-1.93342,16.3278,2.58372,-0.132856,5.77104,8.2219 +0.54,-0.0434046,-1.07004,1.29069,9.227,0.808792,29.0839,39.1197,-0.450683,-1.76251,17.0908,2.86997,-0.134633,5.68657,8.4219 +0.55,-0.0539336,-1.05291,1.71298,10.0888,0.710078,28.9892,39.788,-0.46653,-1.58465,17.7864,3.1434,-0.134609,5.60381,8.6126 +0.56,-0.0642499,-1.03162,2.12851,10.9089,0.605348,28.8951,40.4094,-0.480535,-1.40053,18.4118,3.40321,-0.132802,5.52404,8.79445 +0.57,-0.0743125,-1.00627,2.53565,11.6858,0.498338,28.8033,40.9874,-0.492644,-1.21088,18.9645,3.64866,-0.12928,5.44847,8.96785 +0.58,-0.0840819,-0.976937,2.93278,12.4181,0.392758,28.7149,41.5258,-0.502809,-1.01646,19.4424,3.87912,-0.124155,5.37824,9.13321 +0.59,-0.0935194,-0.943754,3.31833,13.1045,0.292177,28.6315,42.0281,-0.510989,-0.818022,19.8436,4.09404,-0.117583,5.3144,9.29086 +0.6,-0.102588,-0.906846,3.69078,13.7437,0.199902,28.5541,42.4978,-0.517152,-0.616358,20.1664,4.29293,-0.109758,5.25787,9.44103 +0.61,-0.111251,-0.866359,4.04867,14.3346,0.118877,28.4841,42.9376,-0.521275,-0.412262,20.4096,4.47535,-0.100902,5.20947,9.58392 +0.62,-0.119476,-0.822454,4.39059,14.8761,0.0515908,28.4224,43.35,-0.52334,-0.206539,20.5723,4.64093,-0.0912604,5.1699,9.71957 +0.63,-0.127229,-0.775302,4.71517,15.3667,-2.32258e-15,28.3698,43.7365,-0.52334,1.11022e-14,20.6539,4.78931,-0.0810964,5.13973,9.84794 +0.64,-0.13448,-0.72509,5.02115,15.8052,-0.0345301,28.3273,44.098,-0.521275,0.206539,20.6539,4.9202,-0.0706782,5.11937,9.96889 +0.65,-0.1412,-0.672017,5.30731,16.1902,-0.0512687,28.2955,44.4344,-0.517152,0.412262,20.5723,5.03328,-0.0602739,5.10913,10.0821 +0.66,-0.147363,-0.616292,5.57252,16.5202,-0.050142,28.2747,44.7447,-0.510989,0.616358,20.4096,5.12829,-0.050142,5.10913,10.1873 +0.67,-0.152944,-0.558135,5.81575,16.7935,-0.0317374,28.2654,45.0272,-0.502809,0.818022,20.1664,5.20495,-0.0405236,5.11938,10.2838 +0.68,-0.157922,-0.497774,6.03602,17.0086,0.00271351,28.2677,45.279,-0.492644,1.01646,19.8436,5.263,-0.0316352,5.13974,10.3711 +0.69,-0.162277,-0.43545,6.23246,17.1636,0.0513716,28.2816,45.4966,-0.480535,1.21088,19.4424,5.30219,-0.0236614,5.16992,10.4484 +0.7,-0.165991,-0.371407,6.40432,17.2569,0.111847,28.307,45.6758,-0.46653,1.40053,18.9645,5.32227,-0.0167492,5.20949,10.515 +0.71,-0.16905,-0.305898,6.55089,17.2868,0.181272,28.3435,45.8115,-0.450683,1.58465,18.4118,5.32301,-0.0110029,5.25789,10.5699 +0.72,-0.171441,-0.239181,6.67162,17.2516,0.256399,28.3905,45.8985,-0.433058,1.76251,17.7864,5.30418,-0.00648075,5.31443,10.6121 +0.73,-0.173157,-0.171521,6.76601,17.1498,0.333703,28.4475,45.931,-0.413724,1.93342,17.0908,5.2656,-0.00319279,5.37828,10.6407 +0.74,-0.174189,-0.103184,6.8337,16.9803,0.409503,28.5135,45.9033,-0.392757,2.0967,16.3278,5.20711,-0.00110005,5.44851,10.6545 +0.75,-0.174533,-0.0344401,6.87443,16.7419,0.480096,28.5877,45.8097,-0.37024,2.2517,15.5003,5.1286,-0.000115859,5.52408,10.6526 +0.76,-0.174189,0.0344401,6.88802,16.434,0.541885,28.6689,45.6448,-0.346262,2.39782,14.6117,5.03002,-0.000108669,5.60385,10.6338 +0.77,-0.173157,0.103184,6.87443,16.0563,0.591518,28.7558,45.4036,-0.320917,2.53447,13.6654,4.91139,-0.000906619,5.68661,10.5971 +0.78,-0.171441,0.171521,6.8337,15.6089,0.626014,28.8472,45.082,-0.294306,2.66112,12.6651,4.7728,-0.00230373,5.77108,10.5416 +0.79,-0.16905,0.239181,6.76601,15.0924,0.642888,28.9415,44.6768,-0.266533,2.77727,11.6149,4.61447,-0.00406759,5.85594,10.4663 +0.8,-0.165991,0.305898,6.67162,14.508,0.64025,29.0374,44.1856,-0.237709,2.88246,10.5189,4.43669,-0.00594818,5.93984,10.3706 +0.81,-0.162277,0.371407,6.55089,13.8575,0.616892,29.1332,43.6076,-0.207946,2.97627,9.38128,4.23991,-0.00768776,6.02144,10.2537 +0.82,-0.157922,0.43545,6.40432,13.1432,0.572349,29.2274,42.9429,-0.177363,3.05834,8.20668,4.02466,-0.00903116,6.0994,10.115 +0.83,-0.152944,0.497774,6.23246,12.3679,0.506929,29.3185,42.1933,-0.146079,3.12834,6.9997,3.79166,-0.00973627,6.17244,9.95436 +0.84,-0.147363,0.558135,6.03602,11.5352,0.421716,29.4049,41.3618,-0.11422,3.18599,5.76509,3.54172,-0.00958424,6.23934,9.77147 +0.85,-0.1412,0.616292,5.81575,10.6489,0.318541,29.4853,40.4528,-0.0819089,3.23106,4.50772,3.27581,-0.00838885,6.29897,9.56639 +0.86,-0.13448,0.672017,5.57252,9.71374,0.199923,29.5583,39.4719,-0.049275,3.26339,3.23257,2.99504,-0.00600476,6.35032,9.33935 +0.87,-0.127229,0.72509,5.30731,8.73456,0.0689809,29.6226,38.4262,-0.0164466,3.28284,1.94466,2.70063,-0.00233413,6.39251,9.09081 +0.88,-0.119476,0.775302,5.02115,7.71672,-0.0706786,29.6773,37.3233,0.0164466,3.28933,0.649074,2.39395,0.0026686,6.42481,8.82142 +0.89,-0.111251,0.822454,4.71517,6.66587,-0.215096,29.7213,36.1721,0.049275,3.28284,-0.649074,2.07644,0.0089941,6.44666,8.53209 +0.9,-0.102588,0.866359,4.39059,5.58788,-0.360106,29.754,34.9817,0.0819089,3.26339,-1.94466,1.74966,0.0165778,6.45768,8.22392 +0.91,-0.0935194,0.906846,4.04867,4.48875,-0.501494,29.7748,33.762,0.11422,3.23106,-3.23257,1.41525,0.0253016,6.45768,7.89823 +0.92,-0.0840819,0.943754,3.69078,3.37454,-0.635154,29.7833,32.5227,0.146079,3.18599,-4.50772,1.07488,0.0349982,6.44665,7.55653 +0.93,-0.0743125,0.976937,3.31833,2.25126,-0.75724,29.7796,31.2736,0.177363,3.12834,-5.76509,0.730274,0.045457,6.4248,7.20053 +0.94,-0.0642499,1.00627,2.93278,1.12479,-0.864308,29.7636,30.0241,0.207946,3.05834,-6.9997,0.38317,0.056432,6.39249,6.83209 +0.95,-0.0539336,1.03162,2.53565,0.00082089,-0.95344,29.7357,28.783,0.237709,2.97627,-8.20668,0.035296,0.0676508,6.3503,6.45324 +0.96,-0.0434046,1.05291,2.12851,-1.11521,-1.02234,29.6963,27.5587,0.266533,2.88246,-9.38128,-0.311642,0.0788245,6.29894,6.06612 +0.97,-0.0327042,1.07004,1.71298,-2.21822,-1.06941,29.6462,26.3586,0.294306,2.77727,-10.5189,-0.655982,0.0896588,6.2393,5.67298 +0.98,-0.0218748,1.08294,1.29069,-3.30345,-1.09381,29.5862,25.189,0.320917,2.66112,-11.6149,-0.996124,0.0998639,6.1724,5.27614 +0.99,-0.010959,1.09158,0.863297,-4.36657,-1.09543,29.5174,24.0554,0.346262,2.53447,-12.6651,-1.33054,0.109165,6.09936,4.87798 +1,7.32334e-16,1.0959,0.432502,-5.40364,-1.07496,29.4408,22.9622,0.37024,2.39782,-13.6654,-1.6578,0.117312,6.0214,4.48091 +1.01,0.010959,1.0959,-1.57652e-12,-6.41114,-1.03376,29.3578,21.9129,0.392757,2.2517,-14.6117,-1.97656,0.124087,5.9398,4.08733 +1.02,0.0218748,1.09158,-0.432502,-7.38597,-0.973863,29.2697,20.9099,0.413724,2.0967,-15.5003,-2.28557,0.129313,5.8559,3.69964 +1.03,0.0327042,1.08294,-0.863297,-8.32538,-0.897855,29.1779,19.9547,0.433058,1.93342,-16.3278,-2.58372,0.132856,5.77104,3.32018 +1.04,0.0434046,1.07004,-1.29069,-9.227,-0.808792,29.0839,19.0481,0.450683,1.76251,-17.0908,-2.86997,0.134633,5.68657,2.95123 +1.05,0.0539336,1.05291,-1.71298,-10.0888,-0.710078,28.9892,18.1903,0.46653,1.58465,-17.7864,-3.1434,0.134609,5.60381,2.59501 +1.06,0.0642499,1.03162,-2.12851,-10.9089,-0.605348,28.8951,17.3809,0.480535,1.40053,-18.4118,-3.40321,0.132802,5.52404,2.25363 +1.07,0.0743125,1.00627,-2.53565,-11.6858,-0.498338,28.8033,16.6191,0.492644,1.21088,-18.9645,-3.64866,0.12928,5.44847,1.92909 +1.08,0.0840819,0.976937,-2.93278,-12.4181,-0.392758,28.7149,15.9041,0.502809,1.01646,-19.4424,-3.87912,0.124155,5.37824,1.62328 +1.09,0.0935194,0.943754,-3.31833,-13.1045,-0.292177,28.6315,15.2348,0.510989,0.818022,-19.8436,-4.09404,0.117583,5.3144,1.33794 +1.1,0.102588,0.906846,-3.69078,-13.7437,-0.199902,28.5541,14.6105,0.517152,0.616358,-20.1664,-4.29293,0.109758,5.25787,1.0747 +1.11,0.111251,0.866359,-4.04867,-14.3346,-0.118877,28.4841,14.0306,0.521275,0.412262,-20.4096,-4.47535,0.100902,5.20947,0.83502 +1.12,0.119476,0.822454,-4.39059,-14.8761,-0.0515908,28.4224,13.4947,0.52334,0.206539,-20.5723,-4.64093,0.0912604,5.1699,0.620235 +1.13,0.127229,0.775302,-4.71517,-15.3667,2.32258e-15,28.3698,13.0032,0.52334,-1.11022e-14,-20.6539,-4.78931,0.0810964,5.13973,0.431509 +1.14,0.13448,0.72509,-5.02115,-15.8052,0.0345301,28.3273,12.5567,0.521275,-0.206539,-20.6539,-4.9202,0.0706782,5.11937,0.269854 +1.15,0.1412,0.672017,-5.30731,-16.1902,0.0512687,28.2955,12.1565,0.517152,-0.412262,-20.5723,-5.03328,0.0602739,5.10913,0.136118 +1.16,0.147363,0.616292,-5.57252,-16.5202,0.050142,28.2747,11.8047,0.510989,-0.616358,-20.4096,-5.12829,0.050142,5.10913,0.0309813 +1.17,0.152944,0.558135,-5.81575,-16.7935,0.0317374,28.2654,11.5036,0.502809,-0.818022,-20.1664,-5.20495,0.0405236,5.11938,-0.0450446 +1.18,0.157922,0.497774,-6.03602,-17.0086,-0.00271351,28.2677,11.2564,0.492644,-1.01646,-19.8436,-5.263,0.0316352,5.13974,-0.0916262 +1.19,0.162277,0.43545,-6.23246,-17.1636,-0.0513716,28.2816,11.0667,0.480535,-1.21088,-19.4424,-5.30219,0.0236614,5.16992,-0.10861 +1.2,0.165991,0.371407,-6.40432,-17.2569,-0.111847,28.307,10.9382,0.46653,-1.40053,-18.9645,-5.32227,0.0167492,5.20949,-0.0960304 +1.21,0.16905,0.305898,-6.55089,-17.2868,-0.181272,28.3435,10.8754,0.450683,-1.58465,-18.4118,-5.32301,0.0110029,5.25789,-0.0541106 +1.22,0.171441,0.239181,-6.67162,-17.2516,-0.256399,28.3905,10.8825,0.433058,-1.76251,-17.7864,-5.30418,0.00648075,5.31443,0.0167296 +1.23,0.173157,0.171521,-6.76601,-17.1498,-0.333703,28.4475,10.9639,0.413724,-1.93342,-17.0908,-5.2656,0.00319279,5.37828,0.115872 +1.24,0.174189,0.103184,-6.8337,-16.9803,-0.409503,28.5135,11.1237,0.392757,-2.0967,-16.3278,-5.20711,0.00110005,5.44851,0.242499 +1.25,0.174533,0.0344401,-6.87443,-16.7419,-0.480096,28.5877,11.3657,0.37024,-2.2517,-15.5003,-5.1286,0.000115859,5.52408,0.395593 +1.26,0.174189,-0.0344401,-6.88802,-16.434,-0.541885,28.6689,11.693,0.346262,-2.39782,-14.6117,-5.03002,0.000108669,5.60385,0.573939 +1.27,0.173157,-0.103184,-6.87443,-16.0563,-0.591518,28.7558,12.108,0.320917,-2.53447,-13.6654,-4.91139,0.000906619,5.68661,0.776131 +1.28,0.171441,-0.171521,-6.8337,-15.6089,-0.626014,28.8472,12.6123,0.294306,-2.66112,-12.6651,-4.7728,0.00230373,5.77108,1.00058 +1.29,0.16905,-0.239181,-6.76601,-15.0924,-0.642888,28.9415,13.2062,0.266533,-2.77727,-11.6149,-4.61447,0.00406759,5.85594,1.24554 +1.3,0.165991,-0.305898,-6.67162,-14.508,-0.64025,29.0374,13.8891,0.237709,-2.88246,-10.5189,-4.43669,0.00594818,5.93984,1.5091 +1.31,0.162277,-0.371407,-6.55089,-13.8575,-0.616892,29.1332,14.6587,0.207946,-2.97627,-9.38128,-4.23991,0.00768776,6.02144,1.78922 +1.32,0.157922,-0.43545,-6.40432,-13.1432,-0.572349,29.2274,15.5118,0.177363,-3.05834,-8.20668,-4.02466,0.00903116,6.0994,2.08377 +1.33,0.152944,-0.497774,-6.23246,-12.3679,-0.506929,29.3185,16.4436,0.146079,-3.12834,-6.9997,-3.79166,0.00973627,6.17244,2.39051 +1.34,0.147363,-0.558135,-6.03602,-11.5352,-0.421716,29.4049,17.4481,0.11422,-3.18599,-5.76509,-3.54172,0.00958424,6.23934,2.7072 +1.35,0.1412,-0.616292,-5.81575,-10.6489,-0.318541,29.4853,18.5178,0.0819089,-3.23106,-4.50772,-3.27581,0.00838885,6.29897,3.03155 +1.36,0.13448,-0.672017,-5.57252,-9.71374,-0.199923,29.5583,19.6446,0.049275,-3.26339,-3.23257,-2.99504,0.00600476,6.35032,3.36129 +1.37,0.127229,-0.72509,-5.30731,-8.73456,-0.0689809,29.6226,20.8191,0.0164466,-3.28284,-1.94466,-2.70063,0.00233413,6.39251,3.69421 +1.38,0.119476,-0.775302,-5.02115,-7.71672,0.0706786,29.6773,22.0312,-0.0164466,-3.28933,-0.649074,-2.39395,-0.0026686,6.42481,4.02819 +1.39,0.111251,-0.822454,-4.71517,-6.66587,0.215096,29.7213,23.2705,-0.049275,-3.28284,0.649074,-2.07644,-0.0089941,6.44666,4.36123 +1.4,0.102588,-0.866359,-4.39059,-5.58788,0.360106,29.754,24.5262,-0.0819089,-3.26339,1.94466,-1.74966,-0.0165778,6.45768,4.69144 +1.41,0.0935194,-0.906846,-4.04867,-4.48875,0.501494,29.7748,25.7875,-0.11422,-3.23106,3.23257,-1.41525,-0.0253016,6.45768,5.01713 +1.42,0.0840819,-0.943754,-3.69078,-3.37454,0.635154,29.7833,27.0439,-0.146079,-3.18599,4.50772,-1.07488,-0.0349982,6.44665,5.33677 +1.43,0.0743125,-0.976937,-3.31833,-2.25126,0.75724,29.7796,28.2856,-0.177363,-3.12834,5.76509,-0.730274,-0.045457,6.4248,5.64906 +1.44,0.0642499,-1.00627,-2.93278,-1.12479,0.864308,29.7636,29.5031,-0.207946,-3.05834,6.9997,-0.38317,-0.056432,6.39249,5.95289 +1.45,0.0539336,-1.03162,-2.53565,-0.00082089,0.95344,29.7357,30.6883,-0.237709,-2.97627,8.20668,-0.035296,-0.0676508,6.3503,6.24735 +1.46,0.0434046,-1.05291,-2.12851,1.11521,1.02234,29.6963,31.8338,-0.266533,-2.88246,9.38128,0.311642,-0.0788245,6.29894,6.53176 +1.47,0.0327042,-1.07004,-1.71298,2.21822,1.06941,29.6462,32.9338,-0.294306,-2.77727,10.5189,0.655982,-0.0896588,6.2393,6.80563 +1.48,0.0218748,-1.08294,-1.29069,3.30345,1.09381,29.5862,33.9835,-0.320917,-2.66112,11.6149,0.996124,-0.0998639,6.1724,7.06866 +1.49,0.010959,-1.09158,-0.863297,4.36657,1.09543,29.5174,34.9794,-0.346262,-2.53447,12.6651,1.33054,-0.109165,6.09936,7.32074 +1.5,-1.17601e-15,-1.0959,-0.432502,5.40364,1.07496,29.4408,35.9194,-0.37024,-2.39782,13.6654,1.6578,-0.117312,6.0214,7.56189 +1.51,-0.010959,-1.0959,2.22045e-14,6.41114,1.03376,29.3578,36.8027,-0.392757,-2.2517,14.6117,1.97656,-0.124087,5.9398,7.79227 +1.52,-0.0218748,-1.09158,0.432502,7.38597,0.973863,29.2697,37.6295,-0.413724,-2.0967,15.5003,2.28557,-0.129313,5.8559,8.01216 +1.53,-0.0327042,-1.08294,0.863297,8.32538,0.897855,29.1779,38.4012,-0.433058,-1.93342,16.3278,2.58372,-0.132856,5.77104,8.2219 +1.54,-0.0434046,-1.07004,1.29069,9.227,0.808792,29.0839,39.1197,-0.450683,-1.76251,17.0908,2.86997,-0.134633,5.68657,8.4219 +1.55,-0.0539336,-1.05291,1.71298,10.0888,0.710078,28.9892,39.788,-0.46653,-1.58465,17.7864,3.1434,-0.134609,5.60381,8.6126 +1.56,-0.0642499,-1.03162,2.12851,10.9089,0.605348,28.8951,40.4094,-0.480535,-1.40053,18.4118,3.40321,-0.132802,5.52404,8.79445 +1.57,-0.0743125,-1.00627,2.53565,11.6858,0.498338,28.8033,40.9874,-0.492644,-1.21088,18.9645,3.64866,-0.12928,5.44847,8.96785 +1.58,-0.0840819,-0.976937,2.93278,12.4181,0.392758,28.7149,41.5258,-0.502809,-1.01646,19.4424,3.87912,-0.124155,5.37824,9.13321 +1.59,-0.0935194,-0.943754,3.31833,13.1045,0.292177,28.6315,42.0281,-0.510989,-0.818022,19.8436,4.09404,-0.117583,5.3144,9.29086 +1.6,-0.102588,-0.906846,3.69078,13.7437,0.199902,28.5541,42.4978,-0.517152,-0.616358,20.1664,4.29293,-0.109758,5.25787,9.44103 +1.61,-0.111251,-0.866359,4.04867,14.3346,0.118877,28.4841,42.9376,-0.521275,-0.412262,20.4096,4.47535,-0.100902,5.20947,9.58392 +1.62,-0.119476,-0.822454,4.39059,14.8761,0.0515908,28.4224,43.35,-0.52334,-0.206539,20.5723,4.64093,-0.0912604,5.1699,9.71957 +1.63,-0.127229,-0.775302,4.71517,15.3667,-4.64516e-15,28.3698,43.7365,-0.52334,2.22045e-14,20.6539,4.78931,-0.0810964,5.13973,9.84794 +1.64,-0.13448,-0.72509,5.02115,15.8052,-0.0345301,28.3273,44.098,-0.521275,0.206539,20.6539,4.9202,-0.0706782,5.11937,9.96889 +1.65,-0.1412,-0.672017,5.30731,16.1902,-0.0512687,28.2955,44.4344,-0.517152,0.412262,20.5723,5.03328,-0.0602739,5.10913,10.0821 +1.66,-0.147363,-0.616292,5.57252,16.5202,-0.050142,28.2747,44.7447,-0.510989,0.616358,20.4096,5.12829,-0.050142,5.10913,10.1873 +1.67,-0.152944,-0.558135,5.81575,16.7935,-0.0317374,28.2654,45.0272,-0.502809,0.818022,20.1664,5.20495,-0.0405236,5.11938,10.2838 +1.68,-0.157922,-0.497774,6.03602,17.0086,0.00271351,28.2677,45.279,-0.492644,1.01646,19.8436,5.263,-0.0316352,5.13974,10.3711 +1.69,-0.162277,-0.43545,6.23246,17.1636,0.0513716,28.2816,45.4966,-0.480535,1.21088,19.4424,5.30219,-0.0236614,5.16992,10.4484 +1.7,-0.165991,-0.371407,6.40432,17.2569,0.111847,28.307,45.6758,-0.46653,1.40053,18.9645,5.32227,-0.0167492,5.20949,10.515 +1.71,-0.16905,-0.305898,6.55089,17.2868,0.181272,28.3435,45.8115,-0.450683,1.58465,18.4118,5.32301,-0.0110029,5.25789,10.5699 +1.72,-0.171441,-0.239181,6.67162,17.2516,0.256399,28.3905,45.8985,-0.433058,1.76251,17.7864,5.30418,-0.00648075,5.31443,10.6121 +1.73,-0.173157,-0.171521,6.76601,17.1498,0.333703,28.4475,45.931,-0.413724,1.93342,17.0908,5.2656,-0.00319279,5.37828,10.6407 +1.74,-0.174189,-0.103184,6.8337,16.9803,0.409503,28.5135,45.9033,-0.392757,2.0967,16.3278,5.20711,-0.00110005,5.44851,10.6545 +1.75,-0.174533,-0.0344401,6.87443,16.7419,0.480096,28.5877,45.8097,-0.37024,2.2517,15.5003,5.1286,-0.000115859,5.52408,10.6526 +1.76,-0.174189,0.0344401,6.88802,16.434,0.541885,28.6689,45.6448,-0.346262,2.39782,14.6117,5.03002,-0.000108669,5.60385,10.6338 +1.77,-0.173157,0.103184,6.87443,16.0563,0.591518,28.7558,45.4036,-0.320917,2.53447,13.6654,4.91139,-0.000906619,5.68661,10.5971 +1.78,-0.171441,0.171521,6.8337,15.6089,0.626014,28.8472,45.082,-0.294306,2.66112,12.6651,4.7728,-0.00230373,5.77108,10.5416 +1.79,-0.16905,0.239181,6.76601,15.0924,0.642888,28.9415,44.6768,-0.266533,2.77727,11.6149,4.61447,-0.00406759,5.85594,10.4663 +1.8,-0.165991,0.305898,6.67162,14.508,0.64025,29.0374,44.1856,-0.237709,2.88246,10.5189,4.43669,-0.00594818,5.93984,10.3706 +1.81,-0.162277,0.371407,6.55089,13.8575,0.616892,29.1332,43.6076,-0.207946,2.97627,9.38128,4.23991,-0.00768776,6.02144,10.2537 +1.82,-0.157922,0.43545,6.40432,13.1432,0.572349,29.2274,42.9429,-0.177363,3.05834,8.20668,4.02466,-0.00903116,6.0994,10.115 +1.83,-0.152944,0.497774,6.23246,12.3679,0.506929,29.3185,42.1933,-0.146079,3.12834,6.9997,3.79166,-0.00973627,6.17244,9.95436 +1.84,-0.147363,0.558135,6.03602,11.5352,0.421716,29.4049,41.3618,-0.11422,3.18599,5.76509,3.54172,-0.00958424,6.23934,9.77147 +1.85,-0.1412,0.616292,5.81575,10.6489,0.318541,29.4853,40.4528,-0.0819089,3.23106,4.50772,3.27581,-0.00838885,6.29897,9.56639 +1.86,-0.13448,0.672017,5.57252,9.71374,0.199923,29.5583,39.4719,-0.049275,3.26339,3.23257,2.99504,-0.00600476,6.35032,9.33935 +1.87,-0.127229,0.72509,5.30731,8.73456,0.0689809,29.6226,38.4262,-0.0164466,3.28284,1.94466,2.70063,-0.00233413,6.39251,9.09081 +1.88,-0.119476,0.775302,5.02115,7.71672,-0.0706786,29.6773,37.3233,0.0164466,3.28933,0.649074,2.39395,0.0026686,6.42481,8.82142 +1.89,-0.111251,0.822454,4.71517,6.66587,-0.215096,29.7213,36.1721,0.049275,3.28284,-0.649074,2.07644,0.0089941,6.44666,8.53209 +1.9,-0.102588,0.866359,4.39059,5.58788,-0.360106,29.754,34.9817,0.0819089,3.26339,-1.94466,1.74966,0.0165778,6.45768,8.22392 +1.91,-0.0935194,0.906846,4.04867,4.48875,-0.501494,29.7748,33.762,0.11422,3.23106,-3.23257,1.41525,0.0253016,6.45768,7.89823 +1.92,-0.0840819,0.943754,3.69078,3.37454,-0.635154,29.7833,32.5227,0.146079,3.18599,-4.50772,1.07488,0.0349982,6.44665,7.55653 +1.93,-0.0743125,0.976937,3.31833,2.25126,-0.75724,29.7796,31.2736,0.177363,3.12834,-5.76509,0.730274,0.045457,6.4248,7.20053 +1.94,-0.0642499,1.00627,2.93278,1.12479,-0.864308,29.7636,30.0241,0.207946,3.05834,-6.9997,0.38317,0.056432,6.39249,6.83209 +1.95,-0.0539336,1.03162,2.53565,0.00082089,-0.95344,29.7357,28.783,0.237709,2.97627,-8.20668,0.035296,0.0676508,6.3503,6.45324 +1.96,-0.0434046,1.05291,2.12851,-1.11521,-1.02234,29.6963,27.5587,0.266533,2.88246,-9.38128,-0.311642,0.0788245,6.29894,6.06612 +1.97,-0.0327042,1.07004,1.71298,-2.21822,-1.06941,29.6462,26.3586,0.294306,2.77727,-10.5189,-0.655982,0.0896588,6.2393,5.67298 +1.98,-0.0218748,1.08294,1.29069,-3.30345,-1.09381,29.5862,25.189,0.320917,2.66112,-11.6149,-0.996124,0.0998639,6.1724,5.27614 +1.99,-0.010959,1.09158,0.863297,-4.36657,-1.09543,29.5174,24.0554,0.346262,2.53447,-12.6651,-1.33054,0.109165,6.09936,4.87798 +2,1.46467e-15,1.0959,0.432502,-5.40364,-1.07496,29.4408,22.9622,0.37024,2.39782,-13.6654,-1.6578,0.117312,6.0214,4.48091 +2.01,0.010959,1.0959,-3.13083e-12,-6.41114,-1.03376,29.3578,21.9129,0.392757,2.2517,-14.6117,-1.97656,0.124087,5.9398,4.08733 +2.02,0.0218748,1.09158,-0.432502,-7.38597,-0.973863,29.2697,20.9099,0.413724,2.0967,-15.5003,-2.28557,0.129313,5.8559,3.69964 +2.03,0.0327042,1.08294,-0.863297,-8.32538,-0.897855,29.1779,19.9547,0.433058,1.93342,-16.3278,-2.58372,0.132856,5.77104,3.32018 +2.04,0.0434046,1.07004,-1.29069,-9.227,-0.808792,29.0839,19.0481,0.450683,1.76251,-17.0908,-2.86997,0.134633,5.68657,2.95123 +2.05,0.0539336,1.05291,-1.71298,-10.0888,-0.710078,28.9892,18.1903,0.46653,1.58465,-17.7864,-3.1434,0.134609,5.60381,2.59501 +2.06,0.0642499,1.03162,-2.12851,-10.9089,-0.605348,28.8951,17.3809,0.480535,1.40053,-18.4118,-3.40321,0.132802,5.52404,2.25363 +2.07,0.0743125,1.00627,-2.53565,-11.6858,-0.498338,28.8033,16.6191,0.492644,1.21088,-18.9645,-3.64866,0.12928,5.44847,1.92909 +2.08,0.0840819,0.976937,-2.93278,-12.4181,-0.392758,28.7149,15.9041,0.502809,1.01646,-19.4424,-3.87912,0.124155,5.37824,1.62328 +2.09,0.0935194,0.943754,-3.31833,-13.1045,-0.292177,28.6315,15.2348,0.510989,0.818022,-19.8436,-4.09404,0.117583,5.3144,1.33794 +2.1,0.102588,0.906846,-3.69078,-13.7437,-0.199902,28.5541,14.6105,0.517152,0.616358,-20.1664,-4.29293,0.109758,5.25787,1.0747 +2.11,0.111251,0.866359,-4.04867,-14.3346,-0.118877,28.4841,14.0306,0.521275,0.412262,-20.4096,-4.47535,0.100902,5.20947,0.83502 +2.12,0.119476,0.822454,-4.39059,-14.8761,-0.0515908,28.4224,13.4947,0.52334,0.206539,-20.5723,-4.64093,0.0912604,5.1699,0.620235 +2.13,0.127229,0.775302,-4.71517,-15.3667,-6.96774e-15,28.3698,13.0032,0.52334,3.33067e-14,-20.6539,-4.78931,0.0810964,5.13973,0.431509 +2.14,0.13448,0.72509,-5.02115,-15.8052,0.0345301,28.3273,12.5567,0.521275,-0.206539,-20.6539,-4.9202,0.0706782,5.11937,0.269854 +2.15,0.1412,0.672017,-5.30731,-16.1902,0.0512687,28.2955,12.1565,0.517152,-0.412262,-20.5723,-5.03328,0.0602739,5.10913,0.136118 +2.16,0.147363,0.616292,-5.57252,-16.5202,0.050142,28.2747,11.8047,0.510989,-0.616358,-20.4096,-5.12829,0.050142,5.10913,0.0309813 +2.17,0.152944,0.558135,-5.81575,-16.7935,0.0317374,28.2654,11.5036,0.502809,-0.818022,-20.1664,-5.20495,0.0405236,5.11938,-0.0450446 +2.18,0.157922,0.497774,-6.03602,-17.0086,-0.00271351,28.2677,11.2564,0.492644,-1.01646,-19.8436,-5.263,0.0316352,5.13974,-0.0916262 +2.19,0.162277,0.43545,-6.23246,-17.1636,-0.0513716,28.2816,11.0667,0.480535,-1.21088,-19.4424,-5.30219,0.0236614,5.16992,-0.10861 +2.2,0.165991,0.371407,-6.40432,-17.2569,-0.111847,28.307,10.9382,0.46653,-1.40053,-18.9645,-5.32227,0.0167492,5.20949,-0.0960304 +2.21,0.16905,0.305898,-6.55089,-17.2868,-0.181272,28.3435,10.8754,0.450683,-1.58465,-18.4118,-5.32301,0.0110029,5.25789,-0.0541106 +2.22,0.171441,0.239181,-6.67162,-17.2516,-0.256399,28.3905,10.8825,0.433058,-1.76251,-17.7864,-5.30418,0.00648075,5.31443,0.0167296 +2.23,0.173157,0.171521,-6.76601,-17.1498,-0.333703,28.4475,10.9639,0.413724,-1.93342,-17.0908,-5.2656,0.00319279,5.37828,0.115872 +2.24,0.174189,0.103184,-6.8337,-16.9803,-0.409503,28.5135,11.1237,0.392757,-2.0967,-16.3278,-5.20711,0.00110005,5.44851,0.242499 +2.25,0.174533,0.0344401,-6.87443,-16.7419,-0.480096,28.5877,11.3657,0.37024,-2.2517,-15.5003,-5.1286,0.000115859,5.52408,0.395593 +2.26,0.174189,-0.0344401,-6.88802,-16.434,-0.541885,28.6689,11.693,0.346262,-2.39782,-14.6117,-5.03002,0.000108669,5.60385,0.573939 +2.27,0.173157,-0.103184,-6.87443,-16.0563,-0.591518,28.7558,12.108,0.320917,-2.53447,-13.6654,-4.91139,0.000906619,5.68661,0.776131 +2.28,0.171441,-0.171521,-6.8337,-15.6089,-0.626014,28.8472,12.6123,0.294306,-2.66112,-12.6651,-4.7728,0.00230373,5.77108,1.00058 +2.29,0.16905,-0.239181,-6.76601,-15.0924,-0.642888,28.9415,13.2062,0.266533,-2.77727,-11.6149,-4.61447,0.00406759,5.85594,1.24554 +2.3,0.165991,-0.305898,-6.67162,-14.508,-0.64025,29.0374,13.8891,0.237709,-2.88246,-10.5189,-4.43669,0.00594818,5.93984,1.5091 +2.31,0.162277,-0.371407,-6.55089,-13.8575,-0.616892,29.1332,14.6587,0.207946,-2.97627,-9.38128,-4.23991,0.00768776,6.02144,1.78922 +2.32,0.157922,-0.43545,-6.40432,-13.1432,-0.572349,29.2274,15.5118,0.177363,-3.05834,-8.20668,-4.02466,0.00903116,6.0994,2.08377 +2.33,0.152944,-0.497774,-6.23246,-12.3679,-0.506929,29.3185,16.4436,0.146079,-3.12834,-6.9997,-3.79166,0.00973627,6.17244,2.39051 +2.34,0.147363,-0.558135,-6.03602,-11.5352,-0.421716,29.4049,17.4481,0.11422,-3.18599,-5.76509,-3.54172,0.00958424,6.23934,2.7072 +2.35,0.1412,-0.616292,-5.81575,-10.6489,-0.318541,29.4853,18.5178,0.0819089,-3.23106,-4.50772,-3.27581,0.00838885,6.29897,3.03155 +2.36,0.13448,-0.672017,-5.57252,-9.71374,-0.199923,29.5583,19.6446,0.049275,-3.26339,-3.23257,-2.99504,0.00600476,6.35032,3.36129 +2.37,0.127229,-0.72509,-5.30731,-8.73456,-0.0689809,29.6226,20.8191,0.0164466,-3.28284,-1.94466,-2.70063,0.00233413,6.39251,3.69421 +2.38,0.119476,-0.775302,-5.02115,-7.71672,0.0706786,29.6773,22.0312,-0.0164466,-3.28933,-0.649074,-2.39395,-0.0026686,6.42481,4.02819 +2.39,0.111251,-0.822454,-4.71517,-6.66587,0.215096,29.7213,23.2705,-0.049275,-3.28284,0.649074,-2.07644,-0.0089941,6.44666,4.36123 +2.4,0.102588,-0.866359,-4.39059,-5.58788,0.360106,29.754,24.5262,-0.0819089,-3.26339,1.94466,-1.74966,-0.0165778,6.45768,4.69144 +2.41,0.0935194,-0.906846,-4.04867,-4.48875,0.501494,29.7748,25.7875,-0.11422,-3.23106,3.23257,-1.41525,-0.0253016,6.45768,5.01713 +2.42,0.0840819,-0.943754,-3.69078,-3.37454,0.635154,29.7833,27.0439,-0.146079,-3.18599,4.50772,-1.07488,-0.0349982,6.44665,5.33677 +2.43,0.0743125,-0.976937,-3.31833,-2.25126,0.75724,29.7796,28.2856,-0.177363,-3.12834,5.76509,-0.730274,-0.045457,6.4248,5.64906 +2.44,0.0642499,-1.00627,-2.93278,-1.12479,0.864308,29.7636,29.5031,-0.207946,-3.05834,6.9997,-0.38317,-0.056432,6.39249,5.95289 +2.45,0.0539336,-1.03162,-2.53565,-0.00082089,0.95344,29.7357,30.6883,-0.237709,-2.97627,8.20668,-0.035296,-0.0676508,6.3503,6.24735 +2.46,0.0434046,-1.05291,-2.12851,1.11521,1.02234,29.6963,31.8338,-0.266533,-2.88246,9.38128,0.311642,-0.0788245,6.29894,6.53176 +2.47,0.0327042,-1.07004,-1.71298,2.21822,1.06941,29.6462,32.9338,-0.294306,-2.77727,10.5189,0.655982,-0.0896588,6.2393,6.80563 +2.48,0.0218748,-1.08294,-1.29069,3.30345,1.09381,29.5862,33.9835,-0.320917,-2.66112,11.6149,0.996124,-0.0998639,6.1724,7.06866 +2.49,0.010959,-1.09158,-0.863297,4.36657,1.09543,29.5174,34.9794,-0.346262,-2.53447,12.6651,1.33054,-0.109165,6.09936,7.32074 +2.5,1.0338e-14,-1.0959,-0.432502,5.40364,1.07496,29.4408,35.9194,-0.37024,-2.39782,13.6654,1.6578,-0.117312,6.0214,7.56189 +2.51,-0.010959,-1.0959,-3.9968e-13,6.41114,1.03376,29.3578,36.8027,-0.392757,-2.2517,14.6117,1.97656,-0.124087,5.9398,7.79227 +2.52,-0.0218748,-1.09158,0.432502,7.38597,0.973863,29.2697,37.6295,-0.413724,-2.0967,15.5003,2.28557,-0.129313,5.8559,8.01216 +2.53,-0.0327042,-1.08294,0.863297,8.32538,0.897855,29.1779,38.4012,-0.433058,-1.93342,16.3278,2.58372,-0.132856,5.77104,8.2219 +2.54,-0.0434046,-1.07004,1.29069,9.227,0.808792,29.0839,39.1197,-0.450683,-1.76251,17.0908,2.86997,-0.134633,5.68657,8.4219 +2.55,-0.0539336,-1.05291,1.71298,10.0888,0.710078,28.9892,39.788,-0.46653,-1.58465,17.7864,3.1434,-0.134609,5.60381,8.6126 +2.56,-0.0642499,-1.03162,2.12851,10.9089,0.605348,28.8951,40.4094,-0.480535,-1.40053,18.4118,3.40321,-0.132802,5.52404,8.79445 +2.57,-0.0743125,-1.00627,2.53565,11.6858,0.498338,28.8033,40.9874,-0.492644,-1.21088,18.9645,3.64866,-0.12928,5.44847,8.96785 +2.58,-0.0840819,-0.976937,2.93278,12.4181,0.392758,28.7149,41.5258,-0.502809,-1.01646,19.4424,3.87912,-0.124155,5.37824,9.13321 +2.59,-0.0935194,-0.943754,3.31833,13.1045,0.292177,28.6315,42.0281,-0.510989,-0.818022,19.8436,4.09404,-0.117583,5.3144,9.29086 +2.6,-0.102588,-0.906846,3.69078,13.7437,0.199902,28.5541,42.4978,-0.517152,-0.616358,20.1664,4.29293,-0.109758,5.25787,9.44103 +2.61,-0.111251,-0.866359,4.04867,14.3346,0.118877,28.4841,42.9376,-0.521275,-0.412262,20.4096,4.47535,-0.100902,5.20947,9.58392 +2.62,-0.119476,-0.822454,4.39059,14.8761,0.0515908,28.4224,43.35,-0.52334,-0.206539,20.5723,4.64093,-0.0912604,5.1699,9.71957 +2.63,-0.127229,-0.775302,4.71517,15.3667,5.34194e-14,28.3698,43.7365,-0.52334,-2.55351e-13,20.6539,4.78931,-0.0810964,5.13973,9.84794 +2.64,-0.13448,-0.72509,5.02115,15.8052,-0.0345301,28.3273,44.098,-0.521275,0.206539,20.6539,4.9202,-0.0706782,5.11937,9.96889 +2.65,-0.1412,-0.672017,5.30731,16.1902,-0.0512687,28.2955,44.4344,-0.517152,0.412262,20.5723,5.03328,-0.0602739,5.10913,10.0821 +2.66,-0.147363,-0.616292,5.57252,16.5202,-0.050142,28.2747,44.7447,-0.510989,0.616358,20.4096,5.12829,-0.050142,5.10913,10.1873 +2.67,-0.152944,-0.558135,5.81575,16.7935,-0.0317374,28.2654,45.0272,-0.502809,0.818022,20.1664,5.20495,-0.0405236,5.11938,10.2838 +2.68,-0.157922,-0.497774,6.03602,17.0086,0.00271351,28.2677,45.279,-0.492644,1.01646,19.8436,5.263,-0.0316352,5.13974,10.3711 +2.69,-0.162277,-0.43545,6.23246,17.1636,0.0513716,28.2816,45.4966,-0.480535,1.21088,19.4424,5.30219,-0.0236614,5.16992,10.4484 +2.7,-0.165991,-0.371407,6.40432,17.2569,0.111847,28.307,45.6758,-0.46653,1.40053,18.9645,5.32227,-0.0167492,5.20949,10.515 +2.71,-0.16905,-0.305898,6.55089,17.2868,0.181272,28.3435,45.8115,-0.450683,1.58465,18.4118,5.32301,-0.0110029,5.25789,10.5699 +2.72,-0.171441,-0.239181,6.67162,17.2516,0.256399,28.3905,45.8985,-0.433058,1.76251,17.7864,5.30418,-0.00648075,5.31443,10.6121 +2.73,-0.173157,-0.171521,6.76601,17.1498,0.333703,28.4475,45.931,-0.413724,1.93342,17.0908,5.2656,-0.00319279,5.37828,10.6407 +2.74,-0.174189,-0.103184,6.8337,16.9803,0.409503,28.5135,45.9033,-0.392757,2.0967,16.3278,5.20711,-0.00110005,5.44851,10.6545 +2.75,-0.174533,-0.0344401,6.87443,16.7419,0.480096,28.5877,45.8097,-0.37024,2.2517,15.5003,5.1286,-0.000115859,5.52408,10.6526 +2.76,-0.174189,0.0344401,6.88802,16.434,0.541885,28.6689,45.6448,-0.346262,2.39782,14.6117,5.03002,-0.000108669,5.60385,10.6338 +2.77,-0.173157,0.103184,6.87443,16.0563,0.591518,28.7558,45.4036,-0.320917,2.53447,13.6654,4.91139,-0.000906619,5.68661,10.5971 +2.78,-0.171441,0.171521,6.8337,15.6089,0.626014,28.8472,45.082,-0.294306,2.66112,12.6651,4.7728,-0.00230373,5.77108,10.5416 +2.79,-0.16905,0.239181,6.76601,15.0924,0.642888,28.9415,44.6768,-0.266533,2.77727,11.6149,4.61447,-0.00406759,5.85594,10.4663 +2.8,-0.165991,0.305898,6.67162,14.508,0.64025,29.0374,44.1856,-0.237709,2.88246,10.5189,4.43669,-0.00594818,5.93984,10.3706 +2.81,-0.162277,0.371407,6.55089,13.8575,0.616892,29.1332,43.6076,-0.207946,2.97627,9.38128,4.23991,-0.00768776,6.02144,10.2537 +2.82,-0.157922,0.43545,6.40432,13.1432,0.572349,29.2274,42.9429,-0.177363,3.05834,8.20668,4.02466,-0.00903116,6.0994,10.115 +2.83,-0.152944,0.497774,6.23246,12.3679,0.506929,29.3185,42.1933,-0.146079,3.12834,6.9997,3.79166,-0.00973627,6.17244,9.95436 +2.84,-0.147363,0.558135,6.03602,11.5352,0.421716,29.4049,41.3618,-0.11422,3.18599,5.76509,3.54172,-0.00958424,6.23934,9.77147 +2.85,-0.1412,0.616292,5.81575,10.6489,0.318541,29.4853,40.4528,-0.0819089,3.23106,4.50772,3.27581,-0.00838885,6.29897,9.56639 +2.86,-0.13448,0.672017,5.57252,9.71374,0.199923,29.5583,39.4719,-0.049275,3.26339,3.23257,2.99504,-0.00600476,6.35032,9.33935 +2.87,-0.127229,0.72509,5.30731,8.73456,0.0689809,29.6226,38.4262,-0.0164466,3.28284,1.94466,2.70063,-0.00233413,6.39251,9.09081 +2.88,-0.119476,0.775302,5.02115,7.71672,-0.0706786,29.6773,37.3233,0.0164466,3.28933,0.649074,2.39395,0.0026686,6.42481,8.82142 +2.89,-0.111251,0.822454,4.71517,6.66587,-0.215096,29.7213,36.1721,0.049275,3.28284,-0.649074,2.07644,0.0089941,6.44666,8.53209 +2.9,-0.102588,0.866359,4.39059,5.58788,-0.360106,29.754,34.9817,0.0819089,3.26339,-1.94466,1.74966,0.0165778,6.45768,8.22392 +2.91,-0.0935194,0.906846,4.04867,4.48875,-0.501494,29.7748,33.762,0.11422,3.23106,-3.23257,1.41525,0.0253016,6.45768,7.89823 +2.92,-0.0840819,0.943754,3.69078,3.37454,-0.635154,29.7833,32.5227,0.146079,3.18599,-4.50772,1.07488,0.0349982,6.44665,7.55653 +2.93,-0.0743125,0.976937,3.31833,2.25126,-0.75724,29.7796,31.2736,0.177363,3.12834,-5.76509,0.730274,0.045457,6.4248,7.20053 +2.94,-0.0642499,1.00627,2.93278,1.12479,-0.864308,29.7636,30.0241,0.207946,3.05834,-6.9997,0.38317,0.056432,6.39249,6.83209 +2.95,-0.0539336,1.03162,2.53565,0.00082089,-0.95344,29.7357,28.783,0.237709,2.97627,-8.20668,0.035296,0.0676508,6.3503,6.45324 +2.96,-0.0434046,1.05291,2.12851,-1.11521,-1.02234,29.6963,27.5587,0.266533,2.88246,-9.38128,-0.311642,0.0788245,6.29894,6.06612 +2.97,-0.0327042,1.07004,1.71298,-2.21822,-1.06941,29.6462,26.3586,0.294306,2.77727,-10.5189,-0.655982,0.0896588,6.2393,5.67298 +2.98,-0.0218748,1.08294,1.29069,-3.30345,-1.09381,29.5862,25.189,0.320917,2.66112,-11.6149,-0.996124,0.0998639,6.1724,5.27614 +2.99,-0.010959,1.09158,0.863297,-4.36657,-1.09543,29.5174,24.0554,0.346262,2.53447,-12.6651,-1.33054,0.109165,6.09936,4.87798 +3,-2.18305e-14,1.0959,0.432502,-5.40364,-1.07496,29.4408,22.9622,0.37024,2.39782,-13.6654,-1.6578,0.117312,6.0214,4.48091 +3.01,0.010959,1.0959,-5.32907e-12,-6.41114,-1.03376,29.3578,21.9129,0.392757,2.2517,-14.6117,-1.97656,0.124087,5.9398,4.08733 +3.02,0.0218748,1.09158,-0.432502,-7.38597,-0.973863,29.2697,20.9099,0.413724,2.0967,-15.5003,-2.28557,0.129313,5.8559,3.69964 +3.03,0.0327042,1.08294,-0.863297,-8.32538,-0.897855,29.1779,19.9547,0.433058,1.93342,-16.3278,-2.58372,0.132856,5.77104,3.32018 +3.04,0.0434046,1.07004,-1.29069,-9.227,-0.808792,29.0839,19.0481,0.450683,1.76251,-17.0908,-2.86997,0.134633,5.68657,2.95123 +3.05,0.0539336,1.05291,-1.71298,-10.0888,-0.710078,28.9892,18.1903,0.46653,1.58465,-17.7864,-3.1434,0.134609,5.60381,2.59501 +3.06,0.0642499,1.03162,-2.12851,-10.9089,-0.605348,28.8951,17.3809,0.480535,1.40053,-18.4118,-3.40321,0.132802,5.52404,2.25363 +3.07,0.0743125,1.00627,-2.53565,-11.6858,-0.498338,28.8033,16.6191,0.492644,1.21088,-18.9645,-3.64866,0.12928,5.44847,1.92909 +3.08,0.0840819,0.976937,-2.93278,-12.4181,-0.392758,28.7149,15.9041,0.502809,1.01646,-19.4424,-3.87912,0.124155,5.37824,1.62328 +3.09,0.0935194,0.943754,-3.31833,-13.1045,-0.292177,28.6315,15.2348,0.510989,0.818022,-19.8436,-4.09404,0.117583,5.3144,1.33794 +3.1,0.102588,0.906846,-3.69078,-13.7437,-0.199902,28.5541,14.6105,0.517152,0.616358,-20.1664,-4.29293,0.109758,5.25787,1.0747 +3.11,0.111251,0.866359,-4.04867,-14.3346,-0.118877,28.4841,14.0306,0.521275,0.412262,-20.4096,-4.47535,0.100902,5.20947,0.83502 +3.12,0.119476,0.822454,-4.39059,-14.8761,-0.0515908,28.4224,13.4947,0.52334,0.206539,-20.5723,-4.64093,0.0912604,5.1699,0.620235 +3.13,0.127229,0.775302,-4.71517,-15.3667,-9.9871e-14,28.3698,13.0032,0.52334,4.77396e-13,-20.6539,-4.78931,0.0810964,5.13973,0.431509 +3.14,0.13448,0.72509,-5.02115,-15.8052,0.0345301,28.3273,12.5567,0.521275,-0.206539,-20.6539,-4.9202,0.0706782,5.11937,0.269854 +3.15,0.1412,0.672017,-5.30731,-16.1902,0.0512687,28.2955,12.1565,0.517152,-0.412262,-20.5723,-5.03328,0.0602739,5.10913,0.136118 +3.16,0.147363,0.616292,-5.57252,-16.5202,0.050142,28.2747,11.8047,0.510989,-0.616358,-20.4096,-5.12829,0.050142,5.10913,0.0309813 +3.17,0.152944,0.558135,-5.81575,-16.7935,0.0317374,28.2654,11.5036,0.502809,-0.818022,-20.1664,-5.20495,0.0405236,5.11938,-0.0450446 +3.18,0.157922,0.497774,-6.03602,-17.0086,-0.00271351,28.2677,11.2564,0.492644,-1.01646,-19.8436,-5.263,0.0316352,5.13974,-0.0916262 +3.19,0.162277,0.43545,-6.23246,-17.1636,-0.0513716,28.2816,11.0667,0.480535,-1.21088,-19.4424,-5.30219,0.0236614,5.16992,-0.10861 +3.2,0.165991,0.371407,-6.40432,-17.2569,-0.111847,28.307,10.9382,0.46653,-1.40053,-18.9645,-5.32227,0.0167492,5.20949,-0.0960304 +3.21,0.16905,0.305898,-6.55089,-17.2868,-0.181272,28.3435,10.8754,0.450683,-1.58465,-18.4118,-5.32301,0.0110029,5.25789,-0.0541106 +3.22,0.171441,0.239181,-6.67162,-17.2516,-0.256399,28.3905,10.8825,0.433058,-1.76251,-17.7864,-5.30418,0.00648075,5.31443,0.0167296 +3.23,0.173157,0.171521,-6.76601,-17.1498,-0.333703,28.4475,10.9639,0.413724,-1.93342,-17.0908,-5.2656,0.00319279,5.37828,0.115872 +3.24,0.174189,0.103184,-6.8337,-16.9803,-0.409503,28.5135,11.1237,0.392757,-2.0967,-16.3278,-5.20711,0.00110005,5.44851,0.242499 +3.25,0.174533,0.0344401,-6.87443,-16.7419,-0.480096,28.5877,11.3657,0.37024,-2.2517,-15.5003,-5.1286,0.000115859,5.52408,0.395593 +3.26,0.174189,-0.0344401,-6.88802,-16.434,-0.541885,28.6689,11.693,0.346262,-2.39782,-14.6117,-5.03002,0.000108669,5.60385,0.573939 +3.27,0.173157,-0.103184,-6.87443,-16.0563,-0.591518,28.7558,12.108,0.320917,-2.53447,-13.6654,-4.91139,0.000906619,5.68661,0.776131 +3.28,0.171441,-0.171521,-6.8337,-15.6089,-0.626014,28.8472,12.6123,0.294306,-2.66112,-12.6651,-4.7728,0.00230373,5.77108,1.00058 +3.29,0.16905,-0.239181,-6.76601,-15.0924,-0.642888,28.9415,13.2062,0.266533,-2.77727,-11.6149,-4.61447,0.00406759,5.85594,1.24554 +3.3,0.165991,-0.305898,-6.67162,-14.508,-0.64025,29.0374,13.8891,0.237709,-2.88246,-10.5189,-4.43669,0.00594818,5.93984,1.5091 +3.31,0.162277,-0.371407,-6.55089,-13.8575,-0.616892,29.1332,14.6587,0.207946,-2.97627,-9.38128,-4.23991,0.00768776,6.02144,1.78922 +3.32,0.157922,-0.43545,-6.40432,-13.1432,-0.572349,29.2274,15.5118,0.177363,-3.05834,-8.20668,-4.02466,0.00903116,6.0994,2.08377 +3.33,0.152944,-0.497774,-6.23246,-12.3679,-0.506929,29.3185,16.4436,0.146079,-3.12834,-6.9997,-3.79166,0.00973627,6.17244,2.39051 +3.34,0.147363,-0.558135,-6.03602,-11.5352,-0.421716,29.4049,17.4481,0.11422,-3.18599,-5.76509,-3.54172,0.00958424,6.23934,2.7072 +3.35,0.1412,-0.616292,-5.81575,-10.6489,-0.318541,29.4853,18.5178,0.0819089,-3.23106,-4.50772,-3.27581,0.00838885,6.29897,3.03155 +3.36,0.13448,-0.672017,-5.57252,-9.71374,-0.199923,29.5583,19.6446,0.049275,-3.26339,-3.23257,-2.99504,0.00600476,6.35032,3.36129 +3.37,0.127229,-0.72509,-5.30731,-8.73456,-0.0689809,29.6226,20.8191,0.0164466,-3.28284,-1.94466,-2.70063,0.00233413,6.39251,3.69421 +3.38,0.119476,-0.775302,-5.02115,-7.71672,0.0706786,29.6773,22.0312,-0.0164466,-3.28933,-0.649074,-2.39395,-0.0026686,6.42481,4.02819 +3.39,0.111251,-0.822454,-4.71517,-6.66587,0.215096,29.7213,23.2705,-0.049275,-3.28284,0.649074,-2.07644,-0.0089941,6.44666,4.36123 +3.4,0.102588,-0.866359,-4.39059,-5.58788,0.360106,29.754,24.5262,-0.0819089,-3.26339,1.94466,-1.74966,-0.0165778,6.45768,4.69144 +3.41,0.0935194,-0.906846,-4.04867,-4.48875,0.501494,29.7748,25.7875,-0.11422,-3.23106,3.23257,-1.41525,-0.0253016,6.45768,5.01713 +3.42,0.0840819,-0.943754,-3.69078,-3.37454,0.635154,29.7833,27.0439,-0.146079,-3.18599,4.50772,-1.07488,-0.0349982,6.44665,5.33677 +3.43,0.0743125,-0.976937,-3.31833,-2.25126,0.75724,29.7796,28.2856,-0.177363,-3.12834,5.76509,-0.730274,-0.045457,6.4248,5.64906 +3.44,0.0642499,-1.00627,-2.93278,-1.12479,0.864308,29.7636,29.5031,-0.207946,-3.05834,6.9997,-0.38317,-0.056432,6.39249,5.95289 +3.45,0.0539336,-1.03162,-2.53565,-0.00082089,0.95344,29.7357,30.6883,-0.237709,-2.97627,8.20668,-0.035296,-0.0676508,6.3503,6.24735 +3.46,0.0434046,-1.05291,-2.12851,1.11521,1.02234,29.6963,31.8338,-0.266533,-2.88246,9.38128,0.311642,-0.0788245,6.29894,6.53176 +3.47,0.0327042,-1.07004,-1.71298,2.21822,1.06941,29.6462,32.9338,-0.294306,-2.77727,10.5189,0.655982,-0.0896588,6.2393,6.80563 +3.48,0.0218748,-1.08294,-1.29069,3.30345,1.09381,29.5862,33.9835,-0.320917,-2.66112,11.6149,0.996124,-0.0998639,6.1724,7.06866 +3.49,0.010959,-1.09158,-0.863297,4.36657,1.09543,29.5174,34.9794,-0.346262,-2.53447,12.6651,1.33054,-0.109165,6.09936,7.32074 +3.5,3.36332e-14,-1.0959,-0.432502,5.40364,1.07496,29.4408,35.9194,-0.37024,-2.39782,13.6654,1.6578,-0.117312,6.0214,7.56189 +3.51,-0.010959,-1.0959,-1.33227e-12,6.41114,1.03376,29.3578,36.8027,-0.392757,-2.2517,14.6117,1.97656,-0.124087,5.9398,7.79227 +3.52,-0.0218748,-1.09158,0.432502,7.38597,0.973863,29.2697,37.6295,-0.413724,-2.0967,15.5003,2.28557,-0.129313,5.8559,8.01216 +3.53,-0.0327042,-1.08294,0.863297,8.32538,0.897855,29.1779,38.4012,-0.433058,-1.93342,16.3278,2.58372,-0.132856,5.77104,8.2219 +3.54,-0.0434046,-1.07004,1.29069,9.227,0.808792,29.0839,39.1197,-0.450683,-1.76251,17.0908,2.86997,-0.134633,5.68657,8.4219 +3.55,-0.0539336,-1.05291,1.71298,10.0888,0.710078,28.9892,39.788,-0.46653,-1.58465,17.7864,3.1434,-0.134609,5.60381,8.6126 +3.56,-0.0642499,-1.03162,2.12851,10.9089,0.605348,28.8951,40.4094,-0.480535,-1.40053,18.4118,3.40321,-0.132802,5.52404,8.79445 +3.57,-0.0743125,-1.00627,2.53565,11.6858,0.498338,28.8033,40.9874,-0.492644,-1.21088,18.9645,3.64866,-0.12928,5.44847,8.96785 +3.58,-0.0840819,-0.976937,2.93278,12.4181,0.392758,28.7149,41.5258,-0.502809,-1.01646,19.4424,3.87912,-0.124155,5.37824,9.13321 +3.59,-0.0935194,-0.943754,3.31833,13.1045,0.292177,28.6315,42.0281,-0.510989,-0.818022,19.8436,4.09404,-0.117583,5.3144,9.29086 +3.6,-0.102588,-0.906846,3.69078,13.7437,0.199902,28.5541,42.4978,-0.517152,-0.616358,20.1664,4.29293,-0.109758,5.25787,9.44103 +3.61,-0.111251,-0.866359,4.04867,14.3346,0.118877,28.4841,42.9376,-0.521275,-0.412262,20.4096,4.47535,-0.100902,5.20947,9.58392 +3.62,-0.119476,-0.822454,4.39059,14.8761,0.0515908,28.4224,43.35,-0.52334,-0.206539,20.5723,4.64093,-0.0912604,5.1699,9.71957 +3.63,-0.127229,-0.775302,4.71517,15.3667,1.44e-13,28.3698,43.7365,-0.52334,-6.88338e-13,20.6539,4.78931,-0.0810964,5.13973,9.84794 +3.64,-0.13448,-0.72509,5.02115,15.8052,-0.0345301,28.3273,44.098,-0.521275,0.206539,20.6539,4.9202,-0.0706782,5.11937,9.96889 +3.65,-0.1412,-0.672017,5.30731,16.1902,-0.0512687,28.2955,44.4344,-0.517152,0.412262,20.5723,5.03328,-0.0602739,5.10913,10.0821 +3.66,-0.147363,-0.616292,5.57252,16.5202,-0.050142,28.2747,44.7447,-0.510989,0.616358,20.4096,5.12829,-0.050142,5.10913,10.1873 +3.67,-0.152944,-0.558135,5.81575,16.7935,-0.0317374,28.2654,45.0272,-0.502809,0.818022,20.1664,5.20495,-0.0405236,5.11938,10.2838 +3.68,-0.157922,-0.497774,6.03602,17.0086,0.00271351,28.2677,45.279,-0.492644,1.01646,19.8436,5.263,-0.0316352,5.13974,10.3711 +3.69,-0.162277,-0.43545,6.23246,17.1636,0.0513716,28.2816,45.4966,-0.480535,1.21088,19.4424,5.30219,-0.0236614,5.16992,10.4484 +3.7,-0.165991,-0.371407,6.40432,17.2569,0.111847,28.307,45.6758,-0.46653,1.40053,18.9645,5.32227,-0.0167492,5.20949,10.515 +3.71,-0.16905,-0.305898,6.55089,17.2868,0.181272,28.3435,45.8115,-0.450683,1.58465,18.4118,5.32301,-0.0110029,5.25789,10.5699 +3.72,-0.171441,-0.239181,6.67162,17.2516,0.256399,28.3905,45.8985,-0.433058,1.76251,17.7864,5.30418,-0.00648075,5.31443,10.6121 +3.73,-0.173157,-0.171521,6.76601,17.1498,0.333703,28.4475,45.931,-0.413724,1.93342,17.0908,5.2656,-0.00319279,5.37828,10.6407 +3.74,-0.174189,-0.103184,6.8337,16.9803,0.409503,28.5135,45.9033,-0.392757,2.0967,16.3278,5.20711,-0.00110005,5.44851,10.6545 +3.75,-0.174533,-0.0344401,6.87443,16.7419,0.480096,28.5877,45.8097,-0.37024,2.2517,15.5003,5.1286,-0.000115859,5.52408,10.6526 +3.76,-0.174189,0.0344401,6.88802,16.434,0.541885,28.6689,45.6448,-0.346262,2.39782,14.6117,5.03002,-0.000108669,5.60385,10.6338 +3.77,-0.173157,0.103184,6.87443,16.0563,0.591518,28.7558,45.4036,-0.320917,2.53447,13.6654,4.91139,-0.000906619,5.68661,10.5971 +3.78,-0.171441,0.171521,6.8337,15.6089,0.626014,28.8472,45.082,-0.294306,2.66112,12.6651,4.7728,-0.00230373,5.77108,10.5416 +3.79,-0.16905,0.239181,6.76601,15.0924,0.642888,28.9415,44.6768,-0.266533,2.77727,11.6149,4.61447,-0.00406759,5.85594,10.4663 +3.8,-0.165991,0.305898,6.67162,14.508,0.64025,29.0374,44.1856,-0.237709,2.88246,10.5189,4.43669,-0.00594818,5.93984,10.3706 +3.81,-0.162277,0.371407,6.55089,13.8575,0.616892,29.1332,43.6076,-0.207946,2.97627,9.38128,4.23991,-0.00768776,6.02144,10.2537 +3.82,-0.157922,0.43545,6.40432,13.1432,0.572349,29.2274,42.9429,-0.177363,3.05834,8.20668,4.02466,-0.00903116,6.0994,10.115 +3.83,-0.152944,0.497774,6.23246,12.3679,0.506929,29.3185,42.1933,-0.146079,3.12834,6.9997,3.79166,-0.00973627,6.17244,9.95436 +3.84,-0.147363,0.558135,6.03602,11.5352,0.421716,29.4049,41.3618,-0.11422,3.18599,5.76509,3.54172,-0.00958424,6.23934,9.77147 +3.85,-0.1412,0.616292,5.81575,10.6489,0.318541,29.4853,40.4528,-0.0819089,3.23106,4.50772,3.27581,-0.00838885,6.29897,9.56639 +3.86,-0.13448,0.672017,5.57252,9.71374,0.199923,29.5583,39.4719,-0.049275,3.26339,3.23257,2.99504,-0.00600476,6.35032,9.33935 +3.87,-0.127229,0.72509,5.30731,8.73456,0.0689809,29.6226,38.4262,-0.0164466,3.28284,1.94466,2.70063,-0.00233413,6.39251,9.09081 +3.88,-0.119476,0.775302,5.02115,7.71672,-0.0706786,29.6773,37.3233,0.0164466,3.28933,0.649074,2.39395,0.0026686,6.42481,8.82142 +3.89,-0.111251,0.822454,4.71517,6.66587,-0.215096,29.7213,36.1721,0.049275,3.28284,-0.649074,2.07644,0.0089941,6.44666,8.53209 +3.9,-0.102588,0.866359,4.39059,5.58788,-0.360106,29.754,34.9817,0.0819089,3.26339,-1.94466,1.74966,0.0165778,6.45768,8.22392 +3.91,-0.0935194,0.906846,4.04867,4.48875,-0.501494,29.7748,33.762,0.11422,3.23106,-3.23257,1.41525,0.0253016,6.45768,7.89823 +3.92,-0.0840819,0.943754,3.69078,3.37454,-0.635154,29.7833,32.5227,0.146079,3.18599,-4.50772,1.07488,0.0349982,6.44665,7.55653 +3.93,-0.0743125,0.976937,3.31833,2.25126,-0.75724,29.7796,31.2736,0.177363,3.12834,-5.76509,0.730274,0.045457,6.4248,7.20053 +3.94,-0.0642499,1.00627,2.93278,1.12479,-0.864308,29.7636,30.0241,0.207946,3.05834,-6.9997,0.38317,0.056432,6.39249,6.83209 +3.95,-0.0539336,1.03162,2.53565,0.00082089,-0.95344,29.7357,28.783,0.237709,2.97627,-8.20668,0.035296,0.0676508,6.3503,6.45324 +3.96,-0.0434046,1.05291,2.12851,-1.11521,-1.02234,29.6963,27.5587,0.266533,2.88246,-9.38128,-0.311642,0.0788245,6.29894,6.06612 +3.97,-0.0327042,1.07004,1.71298,-2.21822,-1.06941,29.6462,26.3586,0.294306,2.77727,-10.5189,-0.655982,0.0896588,6.2393,5.67298 +3.98,-0.0218748,1.08294,1.29069,-3.30345,-1.09381,29.5862,25.189,0.320917,2.66112,-11.6149,-0.996124,0.0998639,6.1724,5.27614 +3.99,-0.010959,1.09158,0.863297,-4.36657,-1.09543,29.5174,24.0554,0.346262,2.53447,-12.6651,-1.33054,0.109165,6.09936,4.87798 +4,-4.54358e-14,1.0959,0.432502,-5.40364,-1.07496,29.4408,22.9622,0.37024,2.39782,-13.6654,-1.6578,0.117312,6.0214,4.48091 +4.01,0.010959,1.0959,1.75415e-12,-6.41114,-1.03376,29.3578,21.9129,0.392757,2.2517,-14.6117,-1.97656,0.124087,5.9398,4.08733 +4.02,0.0218748,1.09158,-0.432502,-7.38597,-0.973863,29.2697,20.9099,0.413724,2.0967,-15.5003,-2.28557,0.129313,5.8559,3.69964 +4.03,0.0327042,1.08294,-0.863297,-8.32538,-0.897855,29.1779,19.9547,0.433058,1.93342,-16.3278,-2.58372,0.132856,5.77104,3.32018 +4.04,0.0434046,1.07004,-1.29069,-9.227,-0.808792,29.0839,19.0481,0.450683,1.76251,-17.0908,-2.86997,0.134633,5.68657,2.95123 +4.05,0.0539336,1.05291,-1.71298,-10.0888,-0.710078,28.9892,18.1903,0.46653,1.58465,-17.7864,-3.1434,0.134609,5.60381,2.59501 +4.06,0.0642499,1.03162,-2.12851,-10.9089,-0.605348,28.8951,17.3809,0.480535,1.40053,-18.4118,-3.40321,0.132802,5.52404,2.25363 +4.07,0.0743125,1.00627,-2.53565,-11.6858,-0.498338,28.8033,16.6191,0.492644,1.21088,-18.9645,-3.64866,0.12928,5.44847,1.92909 +4.08,0.0840819,0.976937,-2.93278,-12.4181,-0.392758,28.7149,15.9041,0.502809,1.01646,-19.4424,-3.87912,0.124155,5.37824,1.62328 +4.09,0.0935194,0.943754,-3.31833,-13.1045,-0.292177,28.6315,15.2348,0.510989,0.818022,-19.8436,-4.09404,0.117583,5.3144,1.33794 +4.1,0.102588,0.906846,-3.69078,-13.7437,-0.199902,28.5541,14.6105,0.517152,0.616358,-20.1664,-4.29293,0.109758,5.25787,1.0747 +4.11,0.111251,0.866359,-4.04867,-14.3346,-0.118877,28.4841,14.0306,0.521275,0.412262,-20.4096,-4.47535,0.100902,5.20947,0.83502 +4.12,0.119476,0.822454,-4.39059,-14.8761,-0.0515908,28.4224,13.4947,0.52334,0.206539,-20.5723,-4.64093,0.0912604,5.1699,0.620235 +4.13,0.127229,0.775302,-4.71517,-15.3667,-1.88129e-13,28.3698,13.0032,0.52334,8.99281e-13,-20.6539,-4.78931,0.0810964,5.13973,0.431509 +4.14,0.13448,0.72509,-5.02115,-15.8052,0.0345301,28.3273,12.5567,0.521275,-0.206539,-20.6539,-4.9202,0.0706782,5.11937,0.269854 +4.15,0.1412,0.672017,-5.30731,-16.1902,0.0512687,28.2955,12.1565,0.517152,-0.412262,-20.5723,-5.03328,0.0602739,5.10913,0.136118 +4.16,0.147363,0.616292,-5.57252,-16.5202,0.050142,28.2747,11.8047,0.510989,-0.616358,-20.4096,-5.12829,0.050142,5.10913,0.0309813 +4.17,0.152944,0.558135,-5.81575,-16.7935,0.0317374,28.2654,11.5036,0.502809,-0.818022,-20.1664,-5.20495,0.0405236,5.11938,-0.0450446 +4.18,0.157922,0.497774,-6.03602,-17.0086,-0.00271351,28.2677,11.2564,0.492644,-1.01646,-19.8436,-5.263,0.0316352,5.13974,-0.0916262 +4.19,0.162277,0.43545,-6.23246,-17.1636,-0.0513716,28.2816,11.0667,0.480535,-1.21088,-19.4424,-5.30219,0.0236614,5.16992,-0.10861 +4.2,0.165991,0.371407,-6.40432,-17.2569,-0.111847,28.307,10.9382,0.46653,-1.40053,-18.9645,-5.32227,0.0167492,5.20949,-0.0960304 +4.21,0.16905,0.305898,-6.55089,-17.2868,-0.181272,28.3435,10.8754,0.450683,-1.58465,-18.4118,-5.32301,0.0110029,5.25789,-0.0541106 +4.22,0.171441,0.239181,-6.67162,-17.2516,-0.256399,28.3905,10.8825,0.433058,-1.76251,-17.7864,-5.30418,0.00648075,5.31443,0.0167296 +4.23,0.173157,0.171521,-6.76601,-17.1498,-0.333703,28.4475,10.9639,0.413724,-1.93342,-17.0908,-5.2656,0.00319279,5.37828,0.115872 +4.24,0.174189,0.103184,-6.8337,-16.9803,-0.409503,28.5135,11.1237,0.392757,-2.0967,-16.3278,-5.20711,0.00110005,5.44851,0.242499 +4.25,0.174533,0.0344401,-6.87443,-16.7419,-0.480096,28.5877,11.3657,0.37024,-2.2517,-15.5003,-5.1286,0.000115859,5.52408,0.395593 +4.26,0.174189,-0.0344401,-6.88802,-16.434,-0.541885,28.6689,11.693,0.346262,-2.39782,-14.6117,-5.03002,0.000108669,5.60385,0.573939 +4.27,0.173157,-0.103184,-6.87443,-16.0563,-0.591518,28.7558,12.108,0.320917,-2.53447,-13.6654,-4.91139,0.000906619,5.68661,0.776131 +4.28,0.171441,-0.171521,-6.8337,-15.6089,-0.626014,28.8472,12.6123,0.294306,-2.66112,-12.6651,-4.7728,0.00230373,5.77108,1.00058 +4.29,0.16905,-0.239181,-6.76601,-15.0924,-0.642888,28.9415,13.2062,0.266533,-2.77727,-11.6149,-4.61447,0.00406759,5.85594,1.24554 +4.3,0.165991,-0.305898,-6.67162,-14.508,-0.64025,29.0374,13.8891,0.237709,-2.88246,-10.5189,-4.43669,0.00594818,5.93984,1.5091 +4.31,0.162277,-0.371407,-6.55089,-13.8575,-0.616892,29.1332,14.6587,0.207946,-2.97627,-9.38128,-4.23991,0.00768776,6.02144,1.78922 +4.32,0.157922,-0.43545,-6.40432,-13.1432,-0.572349,29.2274,15.5118,0.177363,-3.05834,-8.20668,-4.02466,0.00903116,6.0994,2.08377 +4.33,0.152944,-0.497774,-6.23246,-12.3679,-0.506929,29.3185,16.4436,0.146079,-3.12834,-6.9997,-3.79166,0.00973627,6.17244,2.39051 +4.34,0.147363,-0.558135,-6.03602,-11.5352,-0.421716,29.4049,17.4481,0.11422,-3.18599,-5.76509,-3.54172,0.00958424,6.23934,2.7072 +4.35,0.1412,-0.616292,-5.81575,-10.6489,-0.318541,29.4853,18.5178,0.0819089,-3.23106,-4.50772,-3.27581,0.00838885,6.29897,3.03155 +4.36,0.13448,-0.672017,-5.57252,-9.71374,-0.199923,29.5583,19.6446,0.049275,-3.26339,-3.23257,-2.99504,0.00600476,6.35032,3.36129 +4.37,0.127229,-0.72509,-5.30731,-8.73456,-0.0689809,29.6226,20.8191,0.0164466,-3.28284,-1.94466,-2.70063,0.00233413,6.39251,3.69421 +4.38,0.119476,-0.775302,-5.02115,-7.71672,0.0706786,29.6773,22.0312,-0.0164466,-3.28933,-0.649074,-2.39395,-0.0026686,6.42481,4.02819 +4.39,0.111251,-0.822454,-4.71517,-6.66587,0.215096,29.7213,23.2705,-0.049275,-3.28284,0.649074,-2.07644,-0.0089941,6.44666,4.36123 +4.4,0.102588,-0.866359,-4.39059,-5.58788,0.360106,29.754,24.5262,-0.0819089,-3.26339,1.94466,-1.74966,-0.0165778,6.45768,4.69144 +4.41,0.0935194,-0.906846,-4.04867,-4.48875,0.501494,29.7748,25.7875,-0.11422,-3.23106,3.23257,-1.41525,-0.0253016,6.45768,5.01713 +4.42,0.0840819,-0.943754,-3.69078,-3.37454,0.635154,29.7833,27.0439,-0.146079,-3.18599,4.50772,-1.07488,-0.0349982,6.44665,5.33677 +4.43,0.0743125,-0.976937,-3.31833,-2.25126,0.75724,29.7796,28.2856,-0.177363,-3.12834,5.76509,-0.730274,-0.045457,6.4248,5.64906 +4.44,0.0642499,-1.00627,-2.93278,-1.12479,0.864308,29.7636,29.5031,-0.207946,-3.05834,6.9997,-0.38317,-0.056432,6.39249,5.95289 +4.45,0.0539336,-1.03162,-2.53565,-0.00082089,0.95344,29.7357,30.6883,-0.237709,-2.97627,8.20668,-0.035296,-0.0676508,6.3503,6.24735 +4.46,0.0434046,-1.05291,-2.12851,1.11521,1.02234,29.6963,31.8338,-0.266533,-2.88246,9.38128,0.311642,-0.0788245,6.29894,6.53176 +4.47,0.0327042,-1.07004,-1.71298,2.21822,1.06941,29.6462,32.9338,-0.294306,-2.77727,10.5189,0.655982,-0.0896588,6.2393,6.80563 +4.48,0.0218748,-1.08294,-1.29069,3.30345,1.09381,29.5862,33.9835,-0.320917,-2.66112,11.6149,0.996124,-0.0998639,6.1724,7.06866 +4.49,0.010959,-1.09158,-0.863297,4.36657,1.09543,29.5174,34.9794,-0.346262,-2.53447,12.6651,1.33054,-0.109165,6.09936,7.32074 +4.5,5.66183e-14,-1.0959,-0.432502,5.40364,1.07496,29.4408,35.9194,-0.37024,-2.39782,13.6654,1.6578,-0.117312,6.0214,7.56189 +4.51,-0.010959,-1.0959,-2.26485e-12,6.41114,1.03376,29.3578,36.8027,-0.392757,-2.2517,14.6117,1.97656,-0.124087,5.9398,7.79227 +4.52,-0.0218748,-1.09158,0.432502,7.38597,0.973863,29.2697,37.6295,-0.413724,-2.0967,15.5003,2.28557,-0.129313,5.8559,8.01216 +4.53,-0.0327042,-1.08294,0.863297,8.32538,0.897855,29.1779,38.4012,-0.433058,-1.93342,16.3278,2.58372,-0.132856,5.77104,8.2219 +4.54,-0.0434046,-1.07004,1.29069,9.227,0.808792,29.0839,39.1197,-0.450683,-1.76251,17.0908,2.86997,-0.134633,5.68657,8.4219 +4.55,-0.0539336,-1.05291,1.71298,10.0888,0.710078,28.9892,39.788,-0.46653,-1.58465,17.7864,3.1434,-0.134609,5.60381,8.6126 +4.56,-0.0642499,-1.03162,2.12851,10.9089,0.605348,28.8951,40.4094,-0.480535,-1.40053,18.4118,3.40321,-0.132802,5.52404,8.79445 +4.57,-0.0743125,-1.00627,2.53565,11.6858,0.498338,28.8033,40.9874,-0.492644,-1.21088,18.9645,3.64866,-0.12928,5.44847,8.96785 +4.58,-0.0840819,-0.976937,2.93278,12.4181,0.392758,28.7149,41.5258,-0.502809,-1.01646,19.4424,3.87912,-0.124155,5.37824,9.13321 +4.59,-0.0935194,-0.943754,3.31833,13.1045,0.292177,28.6315,42.0281,-0.510989,-0.818022,19.8436,4.09404,-0.117583,5.3144,9.29086 +4.6,-0.102588,-0.906846,3.69078,13.7437,0.199902,28.5541,42.4978,-0.517152,-0.616358,20.1664,4.29293,-0.109758,5.25787,9.44103 +4.61,-0.111251,-0.866359,4.04867,14.3346,0.118877,28.4841,42.9376,-0.521275,-0.412262,20.4096,4.47535,-0.100902,5.20947,9.58392 +4.62,-0.119476,-0.822454,4.39059,14.8761,0.0515908,28.4224,43.35,-0.52334,-0.206539,20.5723,4.64093,-0.0912604,5.1699,9.71957 +4.63,-0.127229,-0.775302,4.71517,15.3667,2.32258e-13,28.3698,43.7365,-0.52334,-1.11022e-12,20.6539,4.78931,-0.0810964,5.13973,9.84794 +4.64,-0.13448,-0.72509,5.02115,15.8052,-0.0345301,28.3273,44.098,-0.521275,0.206539,20.6539,4.9202,-0.0706782,5.11937,9.96889 +4.65,-0.1412,-0.672017,5.30731,16.1902,-0.0512687,28.2955,44.4344,-0.517152,0.412262,20.5723,5.03328,-0.0602739,5.10913,10.0821 +4.66,-0.147363,-0.616292,5.57252,16.5202,-0.050142,28.2747,44.7447,-0.510989,0.616358,20.4096,5.12829,-0.050142,5.10913,10.1873 +4.67,-0.152944,-0.558135,5.81575,16.7935,-0.0317374,28.2654,45.0272,-0.502809,0.818022,20.1664,5.20495,-0.0405236,5.11938,10.2838 +4.68,-0.157922,-0.497774,6.03602,17.0086,0.00271351,28.2677,45.279,-0.492644,1.01646,19.8436,5.263,-0.0316352,5.13974,10.3711 +4.69,-0.162277,-0.43545,6.23246,17.1636,0.0513716,28.2816,45.4966,-0.480535,1.21088,19.4424,5.30219,-0.0236614,5.16992,10.4484 +4.7,-0.165991,-0.371407,6.40432,17.2569,0.111847,28.307,45.6758,-0.46653,1.40053,18.9645,5.32227,-0.0167492,5.20949,10.515 +4.71,-0.16905,-0.305898,6.55089,17.2868,0.181272,28.3435,45.8115,-0.450683,1.58465,18.4118,5.32301,-0.0110029,5.25789,10.5699 +4.72,-0.171441,-0.239181,6.67162,17.2516,0.256399,28.3905,45.8985,-0.433058,1.76251,17.7864,5.30418,-0.00648075,5.31443,10.6121 +4.73,-0.173157,-0.171521,6.76601,17.1498,0.333703,28.4475,45.931,-0.413724,1.93342,17.0908,5.2656,-0.00319279,5.37828,10.6407 +4.74,-0.174189,-0.103184,6.8337,16.9803,0.409503,28.5135,45.9033,-0.392757,2.0967,16.3278,5.20711,-0.00110005,5.44851,10.6545 +4.75,-0.174533,-0.0344401,6.87443,16.7419,0.480096,28.5877,45.8097,-0.37024,2.2517,15.5003,5.1286,-0.000115859,5.52408,10.6526 +4.76,-0.174189,0.0344401,6.88802,16.434,0.541885,28.6689,45.6448,-0.346262,2.39782,14.6117,5.03002,-0.000108669,5.60385,10.6338 +4.77,-0.173157,0.103184,6.87443,16.0563,0.591518,28.7558,45.4036,-0.320917,2.53447,13.6654,4.91139,-0.000906619,5.68661,10.5971 +4.78,-0.171441,0.171521,6.8337,15.6089,0.626014,28.8472,45.082,-0.294306,2.66112,12.6651,4.7728,-0.00230373,5.77108,10.5416 +4.79,-0.16905,0.239181,6.76601,15.0924,0.642888,28.9415,44.6768,-0.266533,2.77727,11.6149,4.61447,-0.00406759,5.85594,10.4663 +4.8,-0.165991,0.305898,6.67162,14.508,0.64025,29.0374,44.1856,-0.237709,2.88246,10.5189,4.43669,-0.00594818,5.93984,10.3706 +4.81,-0.162277,0.371407,6.55089,13.8575,0.616892,29.1332,43.6076,-0.207946,2.97627,9.38128,4.23991,-0.00768776,6.02144,10.2537 +4.82,-0.157922,0.43545,6.40432,13.1432,0.572349,29.2274,42.9429,-0.177363,3.05834,8.20668,4.02466,-0.00903116,6.0994,10.115 +4.83,-0.152944,0.497774,6.23246,12.3679,0.506929,29.3185,42.1933,-0.146079,3.12834,6.9997,3.79166,-0.00973627,6.17244,9.95436 +4.84,-0.147363,0.558135,6.03602,11.5352,0.421716,29.4049,41.3618,-0.11422,3.18599,5.76509,3.54172,-0.00958424,6.23934,9.77147 +4.85,-0.1412,0.616292,5.81575,10.6489,0.318541,29.4853,40.4528,-0.0819089,3.23106,4.50772,3.27581,-0.00838885,6.29897,9.56639 +4.86,-0.13448,0.672017,5.57252,9.71374,0.199923,29.5583,39.4719,-0.049275,3.26339,3.23257,2.99504,-0.00600476,6.35032,9.33935 +4.87,-0.127229,0.72509,5.30731,8.73456,0.0689809,29.6226,38.4262,-0.0164466,3.28284,1.94466,2.70063,-0.00233413,6.39251,9.09081 +4.88,-0.119476,0.775302,5.02115,7.71672,-0.0706786,29.6773,37.3233,0.0164466,3.28933,0.649074,2.39395,0.0026686,6.42481,8.82142 +4.89,-0.111251,0.822454,4.71517,6.66587,-0.215096,29.7213,36.1721,0.049275,3.28284,-0.649074,2.07644,0.0089941,6.44666,8.53209 +4.9,-0.102588,0.866359,4.39059,5.58788,-0.360106,29.754,34.9817,0.0819089,3.26339,-1.94466,1.74966,0.0165778,6.45768,8.22392 +4.91,-0.0935194,0.906846,4.04867,4.48875,-0.501494,29.7748,33.762,0.11422,3.23106,-3.23257,1.41525,0.0253016,6.45768,7.89823 +4.92,-0.0840819,0.943754,3.69078,3.37454,-0.635154,29.7833,32.5227,0.146079,3.18599,-4.50772,1.07488,0.0349982,6.44665,7.55653 +4.93,-0.0743125,0.976937,3.31833,2.25126,-0.75724,29.7796,31.2736,0.177363,3.12834,-5.76509,0.730274,0.045457,6.4248,7.20053 +4.94,-0.0642499,1.00627,2.93278,1.12479,-0.864308,29.7636,30.0241,0.207946,3.05834,-6.9997,0.38317,0.056432,6.39249,6.83209 +4.95,-0.0539336,1.03162,2.53565,0.00082089,-0.95344,29.7357,28.783,0.237709,2.97627,-8.20668,0.035296,0.0676508,6.3503,6.45324 +4.96,-0.0434046,1.05291,2.12851,-1.11521,-1.02234,29.6963,27.5587,0.266533,2.88246,-9.38128,-0.311642,0.0788245,6.29894,6.06612 +4.97,-0.0327042,1.07004,1.71298,-2.21822,-1.06941,29.6462,26.3586,0.294306,2.77727,-10.5189,-0.655982,0.0896588,6.2393,5.67298 +4.98,-0.0218748,1.08294,1.29069,-3.30345,-1.09381,29.5862,25.189,0.320917,2.66112,-11.6149,-0.996124,0.0998639,6.1724,5.27614 +4.99,-0.010959,1.09158,0.863297,-4.36657,-1.09543,29.5174,24.0554,0.346262,2.53447,-12.6651,-1.33054,0.109165,6.09936,4.87798 +5,-6.84209e-14,1.0959,0.432502,-5.40364,-1.07496,29.4408,22.9622,0.37024,2.39782,-13.6654,-1.6578,0.117312,6.0214,4.48091 +5.01,0.010959,1.0959,2.70894e-12,-6.41114,-1.03376,29.3578,21.9129,0.392757,2.2517,-14.6117,-1.97656,0.124087,5.9398,4.08733 +5.02,0.0218748,1.09158,-0.432502,-7.38597,-0.973863,29.2697,20.9099,0.413724,2.0967,-15.5003,-2.28557,0.129313,5.8559,3.69964 +5.03,0.0327042,1.08294,-0.863297,-8.32538,-0.897855,29.1779,19.9547,0.433058,1.93342,-16.3278,-2.58372,0.132856,5.77104,3.32018 +5.04,0.0434046,1.07004,-1.29069,-9.227,-0.808792,29.0839,19.0481,0.450683,1.76251,-17.0908,-2.86997,0.134633,5.68657,2.95123 +5.05,0.0539336,1.05291,-1.71298,-10.0888,-0.710078,28.9892,18.1903,0.46653,1.58465,-17.7864,-3.1434,0.134609,5.60381,2.59501 +5.06,0.0642499,1.03162,-2.12851,-10.9089,-0.605348,28.8951,17.3809,0.480535,1.40053,-18.4118,-3.40321,0.132802,5.52404,2.25363 +5.07,0.0743125,1.00627,-2.53565,-11.6858,-0.498338,28.8033,16.6191,0.492644,1.21088,-18.9645,-3.64866,0.12928,5.44847,1.92909 +5.08,0.0840819,0.976937,-2.93278,-12.4181,-0.392758,28.7149,15.9041,0.502809,1.01646,-19.4424,-3.87912,0.124155,5.37824,1.62328 +5.09,0.0935194,0.943754,-3.31833,-13.1045,-0.292177,28.6315,15.2348,0.510989,0.818022,-19.8436,-4.09404,0.117583,5.3144,1.33794 +5.1,0.102588,0.906846,-3.69078,-13.7437,-0.199902,28.5541,14.6105,0.517152,0.616358,-20.1664,-4.29293,0.109758,5.25787,1.0747 +5.11,0.111251,0.866359,-4.04867,-14.3346,-0.118877,28.4841,14.0306,0.521275,0.412262,-20.4096,-4.47535,0.100902,5.20947,0.83502 +5.12,0.119476,0.822454,-4.39059,-14.8761,-0.0515908,28.4224,13.4947,0.52334,0.206539,-20.5723,-4.64093,0.0912604,5.1699,0.620235 +5.13,0.127229,0.775302,-4.71517,-15.3667,-2.83355e-13,28.3698,13.0032,0.52334,1.35447e-12,-20.6539,-4.78931,0.0810964,5.13973,0.431509 +5.14,0.13448,0.72509,-5.02115,-15.8052,0.0345301,28.3273,12.5567,0.521275,-0.206539,-20.6539,-4.9202,0.0706782,5.11937,0.269854 +5.15,0.1412,0.672017,-5.30731,-16.1902,0.0512687,28.2955,12.1565,0.517152,-0.412262,-20.5723,-5.03328,0.0602739,5.10913,0.136118 +5.16,0.147363,0.616292,-5.57252,-16.5202,0.050142,28.2747,11.8047,0.510989,-0.616358,-20.4096,-5.12829,0.050142,5.10913,0.0309813 +5.17,0.152944,0.558135,-5.81575,-16.7935,0.0317374,28.2654,11.5036,0.502809,-0.818022,-20.1664,-5.20495,0.0405236,5.11938,-0.0450446 +5.18,0.157922,0.497774,-6.03602,-17.0086,-0.00271351,28.2677,11.2564,0.492644,-1.01646,-19.8436,-5.263,0.0316352,5.13974,-0.0916262 +5.19,0.162277,0.43545,-6.23246,-17.1636,-0.0513716,28.2816,11.0667,0.480535,-1.21088,-19.4424,-5.30219,0.0236614,5.16992,-0.10861 +5.2,0.165991,0.371407,-6.40432,-17.2569,-0.111847,28.307,10.9382,0.46653,-1.40053,-18.9645,-5.32227,0.0167492,5.20949,-0.0960304 +5.21,0.16905,0.305898,-6.55089,-17.2868,-0.181272,28.3435,10.8754,0.450683,-1.58465,-18.4118,-5.32301,0.0110029,5.25789,-0.0541106 +5.22,0.171441,0.239181,-6.67162,-17.2516,-0.256399,28.3905,10.8825,0.433058,-1.76251,-17.7864,-5.30418,0.00648075,5.31443,0.0167296 +5.23,0.173157,0.171521,-6.76601,-17.1498,-0.333703,28.4475,10.9639,0.413724,-1.93342,-17.0908,-5.2656,0.00319279,5.37828,0.115872 +5.24,0.174189,0.103184,-6.8337,-16.9803,-0.409503,28.5135,11.1237,0.392757,-2.0967,-16.3278,-5.20711,0.00110005,5.44851,0.242499 +5.25,0.174533,0.0344401,-6.87443,-16.7419,-0.480096,28.5877,11.3657,0.37024,-2.2517,-15.5003,-5.1286,0.000115859,5.52408,0.395593 +5.26,0.174189,-0.0344401,-6.88802,-16.434,-0.541885,28.6689,11.693,0.346262,-2.39782,-14.6117,-5.03002,0.000108669,5.60385,0.573939 +5.27,0.173157,-0.103184,-6.87443,-16.0563,-0.591518,28.7558,12.108,0.320917,-2.53447,-13.6654,-4.91139,0.000906619,5.68661,0.776131 +5.28,0.171441,-0.171521,-6.8337,-15.6089,-0.626014,28.8472,12.6123,0.294306,-2.66112,-12.6651,-4.7728,0.00230373,5.77108,1.00058 +5.29,0.16905,-0.239181,-6.76601,-15.0924,-0.642888,28.9415,13.2062,0.266533,-2.77727,-11.6149,-4.61447,0.00406759,5.85594,1.24554 +5.3,0.165991,-0.305898,-6.67162,-14.508,-0.64025,29.0374,13.8891,0.237709,-2.88246,-10.5189,-4.43669,0.00594818,5.93984,1.5091 +5.31,0.162277,-0.371407,-6.55089,-13.8575,-0.616892,29.1332,14.6587,0.207946,-2.97627,-9.38128,-4.23991,0.00768776,6.02144,1.78922 +5.32,0.157922,-0.43545,-6.40432,-13.1432,-0.572349,29.2274,15.5118,0.177363,-3.05834,-8.20668,-4.02466,0.00903116,6.0994,2.08377 +5.33,0.152944,-0.497774,-6.23246,-12.3679,-0.506929,29.3185,16.4436,0.146079,-3.12834,-6.9997,-3.79166,0.00973627,6.17244,2.39051 +5.34,0.147363,-0.558135,-6.03602,-11.5352,-0.421716,29.4049,17.4481,0.11422,-3.18599,-5.76509,-3.54172,0.00958424,6.23934,2.7072 +5.35,0.1412,-0.616292,-5.81575,-10.6489,-0.318541,29.4853,18.5178,0.0819089,-3.23106,-4.50772,-3.27581,0.00838885,6.29897,3.03155 +5.36,0.13448,-0.672017,-5.57252,-9.71374,-0.199923,29.5583,19.6446,0.049275,-3.26339,-3.23257,-2.99504,0.00600476,6.35032,3.36129 +5.37,0.127229,-0.72509,-5.30731,-8.73456,-0.0689809,29.6226,20.8191,0.0164466,-3.28284,-1.94466,-2.70063,0.00233413,6.39251,3.69421 +5.38,0.119476,-0.775302,-5.02115,-7.71672,0.0706786,29.6773,22.0312,-0.0164466,-3.28933,-0.649074,-2.39395,-0.0026686,6.42481,4.02819 +5.39,0.111251,-0.822454,-4.71517,-6.66587,0.215096,29.7213,23.2705,-0.049275,-3.28284,0.649074,-2.07644,-0.0089941,6.44666,4.36123 +5.4,0.102588,-0.866359,-4.39059,-5.58788,0.360106,29.754,24.5262,-0.0819089,-3.26339,1.94466,-1.74966,-0.0165778,6.45768,4.69144 +5.41,0.0935194,-0.906846,-4.04867,-4.48875,0.501494,29.7748,25.7875,-0.11422,-3.23106,3.23257,-1.41525,-0.0253016,6.45768,5.01713 +5.42,0.0840819,-0.943754,-3.69078,-3.37454,0.635154,29.7833,27.0439,-0.146079,-3.18599,4.50772,-1.07488,-0.0349982,6.44665,5.33677 +5.43,0.0743125,-0.976937,-3.31833,-2.25126,0.75724,29.7796,28.2856,-0.177363,-3.12834,5.76509,-0.730274,-0.045457,6.4248,5.64906 +5.44,0.0642499,-1.00627,-2.93278,-1.12479,0.864308,29.7636,29.5031,-0.207946,-3.05834,6.9997,-0.38317,-0.056432,6.39249,5.95289 +5.45,0.0539336,-1.03162,-2.53565,-0.00082089,0.95344,29.7357,30.6883,-0.237709,-2.97627,8.20668,-0.035296,-0.0676508,6.3503,6.24735 +5.46,0.0434046,-1.05291,-2.12851,1.11521,1.02234,29.6963,31.8338,-0.266533,-2.88246,9.38128,0.311642,-0.0788245,6.29894,6.53176 +5.47,0.0327042,-1.07004,-1.71298,2.21822,1.06941,29.6462,32.9338,-0.294306,-2.77727,10.5189,0.655982,-0.0896588,6.2393,6.80563 +5.48,0.0218748,-1.08294,-1.29069,3.30345,1.09381,29.5862,33.9835,-0.320917,-2.66112,11.6149,0.996124,-0.0998639,6.1724,7.06866 +5.49,0.010959,-1.09158,-0.863297,4.36657,1.09543,29.5174,34.9794,-0.346262,-2.53447,12.6651,1.33054,-0.109165,6.09936,7.32074 +5.5,8.02236e-14,-1.0959,-0.432502,5.40364,1.07496,29.4408,35.9194,-0.37024,-2.39782,13.6654,1.6578,-0.117312,6.0214,7.56189 +5.51,-0.010959,-1.0959,-3.15303e-12,6.41114,1.03376,29.3578,36.8027,-0.392757,-2.2517,14.6117,1.97656,-0.124087,5.9398,7.79227 +5.52,-0.0218748,-1.09158,0.432502,7.38597,0.973863,29.2697,37.6295,-0.413724,-2.0967,15.5003,2.28557,-0.129313,5.8559,8.01216 +5.53,-0.0327042,-1.08294,0.863297,8.32538,0.897855,29.1779,38.4012,-0.433058,-1.93342,16.3278,2.58372,-0.132856,5.77104,8.2219 +5.54,-0.0434046,-1.07004,1.29069,9.227,0.808792,29.0839,39.1197,-0.450683,-1.76251,17.0908,2.86997,-0.134633,5.68657,8.4219 +5.55,-0.0539336,-1.05291,1.71298,10.0888,0.710078,28.9892,39.788,-0.46653,-1.58465,17.7864,3.1434,-0.134609,5.60381,8.6126 +5.56,-0.0642499,-1.03162,2.12851,10.9089,0.605348,28.8951,40.4094,-0.480535,-1.40053,18.4118,3.40321,-0.132802,5.52404,8.79445 +5.57,-0.0743125,-1.00627,2.53565,11.6858,0.498338,28.8033,40.9874,-0.492644,-1.21088,18.9645,3.64866,-0.12928,5.44847,8.96785 +5.58,-0.0840819,-0.976937,2.93278,12.4181,0.392758,28.7149,41.5258,-0.502809,-1.01646,19.4424,3.87912,-0.124155,5.37824,9.13321 +5.59,-0.0935194,-0.943754,3.31833,13.1045,0.292177,28.6315,42.0281,-0.510989,-0.818022,19.8436,4.09404,-0.117583,5.3144,9.29086 +5.6,-0.102588,-0.906846,3.69078,13.7437,0.199902,28.5541,42.4978,-0.517152,-0.616358,20.1664,4.29293,-0.109758,5.25787,9.44103 +5.61,-0.111251,-0.866359,4.04867,14.3346,0.118877,28.4841,42.9376,-0.521275,-0.412262,20.4096,4.47535,-0.100902,5.20947,9.58392 +5.62,-0.119476,-0.822454,4.39059,14.8761,0.0515908,28.4224,43.35,-0.52334,-0.206539,20.5723,4.64093,-0.0912604,5.1699,9.71957 +5.63,-0.127229,-0.775302,4.71517,15.3667,3.29806e-13,28.3698,43.7365,-0.52334,-1.57652e-12,20.6539,4.78931,-0.0810964,5.13973,9.84794 +5.64,-0.13448,-0.72509,5.02115,15.8052,-0.0345301,28.3273,44.098,-0.521275,0.206539,20.6539,4.9202,-0.0706782,5.11937,9.96889 +5.65,-0.1412,-0.672017,5.30731,16.1902,-0.0512687,28.2955,44.4344,-0.517152,0.412262,20.5723,5.03328,-0.0602739,5.10913,10.0821 +5.66,-0.147363,-0.616292,5.57252,16.5202,-0.050142,28.2747,44.7447,-0.510989,0.616358,20.4096,5.12829,-0.050142,5.10913,10.1873 +5.67,-0.152944,-0.558135,5.81575,16.7935,-0.0317374,28.2654,45.0272,-0.502809,0.818022,20.1664,5.20495,-0.0405236,5.11938,10.2838 +5.68,-0.157922,-0.497774,6.03602,17.0086,0.00271351,28.2677,45.279,-0.492644,1.01646,19.8436,5.263,-0.0316352,5.13974,10.3711 +5.69,-0.162277,-0.43545,6.23246,17.1636,0.0513716,28.2816,45.4966,-0.480535,1.21088,19.4424,5.30219,-0.0236614,5.16992,10.4484 +5.7,-0.165991,-0.371407,6.40432,17.2569,0.111847,28.307,45.6758,-0.46653,1.40053,18.9645,5.32227,-0.0167492,5.20949,10.515 +5.71,-0.16905,-0.305898,6.55089,17.2868,0.181272,28.3435,45.8115,-0.450683,1.58465,18.4118,5.32301,-0.0110029,5.25789,10.5699 +5.72,-0.171441,-0.239181,6.67162,17.2516,0.256399,28.3905,45.8985,-0.433058,1.76251,17.7864,5.30418,-0.00648075,5.31443,10.6121 +5.73,-0.173157,-0.171521,6.76601,17.1498,0.333703,28.4475,45.931,-0.413724,1.93342,17.0908,5.2656,-0.00319279,5.37828,10.6407 +5.74,-0.174189,-0.103184,6.8337,16.9803,0.409503,28.5135,45.9033,-0.392757,2.0967,16.3278,5.20711,-0.00110005,5.44851,10.6545 +5.75,-0.174533,-0.0344401,6.87443,16.7419,0.480096,28.5877,45.8097,-0.37024,2.2517,15.5003,5.1286,-0.000115859,5.52408,10.6526 +5.76,-0.174189,0.0344401,6.88802,16.434,0.541885,28.6689,45.6448,-0.346262,2.39782,14.6117,5.03002,-0.000108669,5.60385,10.6338 +5.77,-0.173157,0.103184,6.87443,16.0563,0.591518,28.7558,45.4036,-0.320917,2.53447,13.6654,4.91139,-0.000906619,5.68661,10.5971 +5.78,-0.171441,0.171521,6.8337,15.6089,0.626014,28.8472,45.082,-0.294306,2.66112,12.6651,4.7728,-0.00230373,5.77108,10.5416 +5.79,-0.16905,0.239181,6.76601,15.0924,0.642888,28.9415,44.6768,-0.266533,2.77727,11.6149,4.61447,-0.00406759,5.85594,10.4663 +5.8,-0.165991,0.305898,6.67162,14.508,0.64025,29.0374,44.1856,-0.237709,2.88246,10.5189,4.43669,-0.00594818,5.93984,10.3706 +5.81,-0.162277,0.371407,6.55089,13.8575,0.616892,29.1332,43.6076,-0.207946,2.97627,9.38128,4.23991,-0.00768776,6.02144,10.2537 +5.82,-0.157922,0.43545,6.40432,13.1432,0.572349,29.2274,42.9429,-0.177363,3.05834,8.20668,4.02466,-0.00903116,6.0994,10.115 +5.83,-0.152944,0.497774,6.23246,12.3679,0.506929,29.3185,42.1933,-0.146079,3.12834,6.9997,3.79166,-0.00973627,6.17244,9.95436 +5.84,-0.147363,0.558135,6.03602,11.5352,0.421716,29.4049,41.3618,-0.11422,3.18599,5.76509,3.54172,-0.00958424,6.23934,9.77147 +5.85,-0.1412,0.616292,5.81575,10.6489,0.318541,29.4853,40.4528,-0.0819089,3.23106,4.50772,3.27581,-0.00838885,6.29897,9.56639 +5.86,-0.13448,0.672017,5.57252,9.71374,0.199923,29.5583,39.4719,-0.049275,3.26339,3.23257,2.99504,-0.00600476,6.35032,9.33935 +5.87,-0.127229,0.72509,5.30731,8.73456,0.0689809,29.6226,38.4262,-0.0164466,3.28284,1.94466,2.70063,-0.00233413,6.39251,9.09081 +5.88,-0.119476,0.775302,5.02115,7.71672,-0.0706786,29.6773,37.3233,0.0164466,3.28933,0.649074,2.39395,0.0026686,6.42481,8.82142 +5.89,-0.111251,0.822454,4.71517,6.66587,-0.215096,29.7213,36.1721,0.049275,3.28284,-0.649074,2.07644,0.0089941,6.44666,8.53209 +5.9,-0.102588,0.866359,4.39059,5.58788,-0.360106,29.754,34.9817,0.0819089,3.26339,-1.94466,1.74966,0.0165778,6.45768,8.22392 +5.91,-0.0935194,0.906846,4.04867,4.48875,-0.501494,29.7748,33.762,0.11422,3.23106,-3.23257,1.41525,0.0253016,6.45768,7.89823 +5.92,-0.0840819,0.943754,3.69078,3.37454,-0.635154,29.7833,32.5227,0.146079,3.18599,-4.50772,1.07488,0.0349982,6.44665,7.55653 +5.93,-0.0743125,0.976937,3.31833,2.25126,-0.75724,29.7796,31.2736,0.177363,3.12834,-5.76509,0.730274,0.045457,6.4248,7.20053 +5.94,-0.0642499,1.00627,2.93278,1.12479,-0.864308,29.7636,30.0241,0.207946,3.05834,-6.9997,0.38317,0.056432,6.39249,6.83209 +5.95,-0.0539336,1.03162,2.53565,0.00082089,-0.95344,29.7357,28.783,0.237709,2.97627,-8.20668,0.035296,0.0676508,6.3503,6.45324 +5.96,-0.0434046,1.05291,2.12851,-1.11521,-1.02234,29.6963,27.5587,0.266533,2.88246,-9.38128,-0.311642,0.0788245,6.29894,6.06612 +5.97,-0.0327042,1.07004,1.71298,-2.21822,-1.06941,29.6462,26.3586,0.294306,2.77727,-10.5189,-0.655982,0.0896588,6.2393,5.67298 +5.98,-0.0218748,1.08294,1.29069,-3.30345,-1.09381,29.5862,25.189,0.320917,2.66112,-11.6149,-0.996124,0.0998639,6.1724,5.27614 +5.99,-0.010959,1.09158,0.863297,-4.36657,-1.09543,29.5174,24.0554,0.346262,2.53447,-12.6651,-1.33054,0.109165,6.09936,4.87798 +6,-9.20262e-14,1.0959,0.432502,-5.40364,-1.07496,29.4408,22.9622,0.37024,2.39782,-13.6654,-1.6578,0.117312,6.0214,4.48091 +6.01,0.010959,1.0959,1.59872e-11,-6.41114,-1.03376,29.3578,21.9129,0.392757,2.2517,-14.6117,-1.97656,0.124087,5.9398,4.08733 +6.02,0.0218748,1.09158,-0.432502,-7.38597,-0.973863,29.2697,20.9099,0.413724,2.0967,-15.5003,-2.28557,0.129313,5.8559,3.69964 +6.03,0.0327042,1.08294,-0.863297,-8.32538,-0.897855,29.1779,19.9547,0.433058,1.93342,-16.3278,-2.58372,0.132856,5.77104,3.32018 +6.04,0.0434046,1.07004,-1.29069,-9.227,-0.808792,29.0839,19.0481,0.450683,1.76251,-17.0908,-2.86997,0.134633,5.68657,2.95123 +6.05,0.0539336,1.05291,-1.71298,-10.0888,-0.710078,28.9892,18.1903,0.46653,1.58465,-17.7864,-3.1434,0.134609,5.60381,2.59501 +6.06,0.0642499,1.03162,-2.12851,-10.9089,-0.605348,28.8951,17.3809,0.480535,1.40053,-18.4118,-3.40321,0.132802,5.52404,2.25363 +6.07,0.0743125,1.00627,-2.53565,-11.6858,-0.498338,28.8033,16.6191,0.492644,1.21088,-18.9645,-3.64866,0.12928,5.44847,1.92909 +6.08,0.0840819,0.976937,-2.93278,-12.4181,-0.392758,28.7149,15.9041,0.502809,1.01646,-19.4424,-3.87912,0.124155,5.37824,1.62328 +6.09,0.0935194,0.943754,-3.31833,-13.1045,-0.292177,28.6315,15.2348,0.510989,0.818022,-19.8436,-4.09404,0.117583,5.3144,1.33794 +6.1,0.102588,0.906846,-3.69078,-13.7437,-0.199902,28.5541,14.6105,0.517152,0.616358,-20.1664,-4.29293,0.109758,5.25787,1.0747 +6.11,0.111251,0.866359,-4.04867,-14.3346,-0.118877,28.4841,14.0306,0.521275,0.412262,-20.4096,-4.47535,0.100902,5.20947,0.83502 +6.12,0.119476,0.822454,-4.39059,-14.8761,-0.0515908,28.4224,13.4947,0.52334,0.206539,-20.5723,-4.64093,0.0912604,5.1699,0.620235 +6.13,0.127229,0.775302,-4.71517,-15.3667,-3.76258e-13,28.3698,13.0032,0.52334,1.79856e-12,-20.6539,-4.78931,0.0810964,5.13973,0.431509 +6.14,0.13448,0.72509,-5.02115,-15.8052,0.0345301,28.3273,12.5567,0.521275,-0.206539,-20.6539,-4.9202,0.0706782,5.11937,0.269854 +6.15,0.1412,0.672017,-5.30731,-16.1902,0.0512687,28.2955,12.1565,0.517152,-0.412262,-20.5723,-5.03328,0.0602739,5.10913,0.136118 +6.16,0.147363,0.616292,-5.57252,-16.5202,0.050142,28.2747,11.8047,0.510989,-0.616358,-20.4096,-5.12829,0.050142,5.10913,0.0309813 +6.17,0.152944,0.558135,-5.81575,-16.7935,0.0317374,28.2654,11.5036,0.502809,-0.818022,-20.1664,-5.20495,0.0405236,5.11938,-0.0450446 +6.18,0.157922,0.497774,-6.03602,-17.0086,-0.00271351,28.2677,11.2564,0.492644,-1.01646,-19.8436,-5.263,0.0316352,5.13974,-0.0916262 +6.19,0.162277,0.43545,-6.23246,-17.1636,-0.0513716,28.2816,11.0667,0.480535,-1.21088,-19.4424,-5.30219,0.0236614,5.16992,-0.10861 +6.2,0.165991,0.371407,-6.40432,-17.2569,-0.111847,28.307,10.9382,0.46653,-1.40053,-18.9645,-5.32227,0.0167492,5.20949,-0.0960304 +6.21,0.16905,0.305898,-6.55089,-17.2868,-0.181272,28.3435,10.8754,0.450683,-1.58465,-18.4118,-5.32301,0.0110029,5.25789,-0.0541106 +6.22,0.171441,0.239181,-6.67162,-17.2516,-0.256399,28.3905,10.8825,0.433058,-1.76251,-17.7864,-5.30418,0.00648075,5.31443,0.0167296 +6.23,0.173157,0.171521,-6.76601,-17.1498,-0.333703,28.4475,10.9639,0.413724,-1.93342,-17.0908,-5.2656,0.00319279,5.37828,0.115872 +6.24,0.174189,0.103184,-6.8337,-16.9803,-0.409503,28.5135,11.1237,0.392757,-2.0967,-16.3278,-5.20711,0.00110005,5.44851,0.242499 +6.25,0.174533,0.0344401,-6.87443,-16.7419,-0.480096,28.5877,11.3657,0.37024,-2.2517,-15.5003,-5.1286,0.000115859,5.52408,0.395593 +6.26,0.174189,-0.0344401,-6.88802,-16.434,-0.541885,28.6689,11.693,0.346262,-2.39782,-14.6117,-5.03002,0.000108669,5.60385,0.573939 +6.27,0.173157,-0.103184,-6.87443,-16.0563,-0.591518,28.7558,12.108,0.320917,-2.53447,-13.6654,-4.91139,0.000906619,5.68661,0.776131 +6.28,0.171441,-0.171521,-6.8337,-15.6089,-0.626014,28.8472,12.6123,0.294306,-2.66112,-12.6651,-4.7728,0.00230373,5.77108,1.00058 +6.29,0.16905,-0.239181,-6.76601,-15.0924,-0.642888,28.9415,13.2062,0.266533,-2.77727,-11.6149,-4.61447,0.00406759,5.85594,1.24554 +6.3,0.165991,-0.305898,-6.67162,-14.508,-0.64025,29.0374,13.8891,0.237709,-2.88246,-10.5189,-4.43669,0.00594818,5.93984,1.5091 +6.31,0.162277,-0.371407,-6.55089,-13.8575,-0.616892,29.1332,14.6587,0.207946,-2.97627,-9.38128,-4.23991,0.00768776,6.02144,1.78922 +6.32,0.157922,-0.43545,-6.40432,-13.1432,-0.572349,29.2274,15.5118,0.177363,-3.05834,-8.20668,-4.02466,0.00903116,6.0994,2.08377 +6.33,0.152944,-0.497774,-6.23246,-12.3679,-0.506929,29.3185,16.4436,0.146079,-3.12834,-6.9997,-3.79166,0.00973627,6.17244,2.39051 +6.34,0.147363,-0.558135,-6.03602,-11.5352,-0.421716,29.4049,17.4481,0.11422,-3.18599,-5.76509,-3.54172,0.00958424,6.23934,2.7072 +6.35,0.1412,-0.616292,-5.81575,-10.6489,-0.318541,29.4853,18.5178,0.0819089,-3.23106,-4.50772,-3.27581,0.00838885,6.29897,3.03155 +6.36,0.13448,-0.672017,-5.57252,-9.71374,-0.199923,29.5583,19.6446,0.049275,-3.26339,-3.23257,-2.99504,0.00600476,6.35032,3.36129 +6.37,0.127229,-0.72509,-5.30731,-8.73456,-0.0689809,29.6226,20.8191,0.0164466,-3.28284,-1.94466,-2.70063,0.00233413,6.39251,3.69421 +6.38,0.119476,-0.775302,-5.02115,-7.71672,0.0706786,29.6773,22.0312,-0.0164466,-3.28933,-0.649074,-2.39395,-0.0026686,6.42481,4.02819 +6.39,0.111251,-0.822454,-4.71517,-6.66587,0.215096,29.7213,23.2705,-0.049275,-3.28284,0.649074,-2.07644,-0.0089941,6.44666,4.36123 +6.4,0.102588,-0.866359,-4.39059,-5.58788,0.360106,29.754,24.5262,-0.0819089,-3.26339,1.94466,-1.74966,-0.0165778,6.45768,4.69144 +6.41,0.0935194,-0.906846,-4.04867,-4.48875,0.501494,29.7748,25.7875,-0.11422,-3.23106,3.23257,-1.41525,-0.0253016,6.45768,5.01713 +6.42,0.0840819,-0.943754,-3.69078,-3.37454,0.635154,29.7833,27.0439,-0.146079,-3.18599,4.50772,-1.07488,-0.0349982,6.44665,5.33677 +6.43,0.0743125,-0.976937,-3.31833,-2.25126,0.75724,29.7796,28.2856,-0.177363,-3.12834,5.76509,-0.730274,-0.045457,6.4248,5.64906 +6.44,0.0642499,-1.00627,-2.93278,-1.12479,0.864308,29.7636,29.5031,-0.207946,-3.05834,6.9997,-0.38317,-0.056432,6.39249,5.95289 +6.45,0.0539336,-1.03162,-2.53565,-0.00082089,0.95344,29.7357,30.6883,-0.237709,-2.97627,8.20668,-0.035296,-0.0676508,6.3503,6.24735 +6.46,0.0434046,-1.05291,-2.12851,1.11521,1.02234,29.6963,31.8338,-0.266533,-2.88246,9.38128,0.311642,-0.0788245,6.29894,6.53176 +6.47,0.0327042,-1.07004,-1.71298,2.21822,1.06941,29.6462,32.9338,-0.294306,-2.77727,10.5189,0.655982,-0.0896588,6.2393,6.80563 +6.48,0.0218748,-1.08294,-1.29069,3.30345,1.09381,29.5862,33.9835,-0.320917,-2.66112,11.6149,0.996124,-0.0998639,6.1724,7.06866 +6.49,0.010959,-1.09158,-0.863297,4.36657,1.09543,29.5174,34.9794,-0.346262,-2.53447,12.6651,1.33054,-0.109165,6.09936,7.32074 +6.5,1.03829e-13,-1.0959,-0.432502,5.40364,1.07496,29.4408,35.9194,-0.37024,-2.39782,13.6654,1.6578,-0.117312,6.0214,7.56189 +6.51,-0.010959,-1.0959,-1.64757e-11,6.41114,1.03376,29.3578,36.8027,-0.392757,-2.2517,14.6117,1.97656,-0.124087,5.9398,7.79227 +6.52,-0.0218748,-1.09158,0.432502,7.38597,0.973863,29.2697,37.6295,-0.413724,-2.0967,15.5003,2.28557,-0.129313,5.8559,8.01216 +6.53,-0.0327042,-1.08294,0.863297,8.32538,0.897855,29.1779,38.4012,-0.433058,-1.93342,16.3278,2.58372,-0.132856,5.77104,8.2219 +6.54,-0.0434046,-1.07004,1.29069,9.227,0.808792,29.0839,39.1197,-0.450683,-1.76251,17.0908,2.86997,-0.134633,5.68657,8.4219 +6.55,-0.0539336,-1.05291,1.71298,10.0888,0.710078,28.9892,39.788,-0.46653,-1.58465,17.7864,3.1434,-0.134609,5.60381,8.6126 +6.56,-0.0642499,-1.03162,2.12851,10.9089,0.605348,28.8951,40.4094,-0.480535,-1.40053,18.4118,3.40321,-0.132802,5.52404,8.79445 +6.57,-0.0743125,-1.00627,2.53565,11.6858,0.498338,28.8033,40.9874,-0.492644,-1.21088,18.9645,3.64866,-0.12928,5.44847,8.96785 +6.58,-0.0840819,-0.976937,2.93278,12.4181,0.392758,28.7149,41.5258,-0.502809,-1.01646,19.4424,3.87912,-0.124155,5.37824,9.13321 +6.59,-0.0935194,-0.943754,3.31833,13.1045,0.292177,28.6315,42.0281,-0.510989,-0.818022,19.8436,4.09404,-0.117583,5.3144,9.29086 +6.6,-0.102588,-0.906846,3.69078,13.7437,0.199902,28.5541,42.4978,-0.517152,-0.616358,20.1664,4.29293,-0.109758,5.25787,9.44103 +6.61,-0.111251,-0.866359,4.04867,14.3346,0.118877,28.4841,42.9376,-0.521275,-0.412262,20.4096,4.47535,-0.100902,5.20947,9.58392 +6.62,-0.119476,-0.822454,4.39059,14.8761,0.0515908,28.4224,43.35,-0.52334,-0.206539,20.5723,4.64093,-0.0912604,5.1699,9.71957 +6.63,-0.127229,-0.775302,4.71517,15.3667,4.2271e-13,28.3698,43.7365,-0.52334,-2.02061e-12,20.6539,4.78931,-0.0810964,5.13973,9.84794 +6.64,-0.13448,-0.72509,5.02115,15.8052,-0.0345301,28.3273,44.098,-0.521275,0.206539,20.6539,4.9202,-0.0706782,5.11937,9.96889 +6.65,-0.1412,-0.672017,5.30731,16.1902,-0.0512687,28.2955,44.4344,-0.517152,0.412262,20.5723,5.03328,-0.0602739,5.10913,10.0821 +6.66,-0.147363,-0.616292,5.57252,16.5202,-0.050142,28.2747,44.7447,-0.510989,0.616358,20.4096,5.12829,-0.050142,5.10913,10.1873 +6.67,-0.152944,-0.558135,5.81575,16.7935,-0.0317374,28.2654,45.0272,-0.502809,0.818022,20.1664,5.20495,-0.0405236,5.11938,10.2838 +6.68,-0.157922,-0.497774,6.03602,17.0086,0.00271351,28.2677,45.279,-0.492644,1.01646,19.8436,5.263,-0.0316352,5.13974,10.3711 +6.69,-0.162277,-0.43545,6.23246,17.1636,0.0513716,28.2816,45.4966,-0.480535,1.21088,19.4424,5.30219,-0.0236614,5.16992,10.4484 +6.7,-0.165991,-0.371407,6.40432,17.2569,0.111847,28.307,45.6758,-0.46653,1.40053,18.9645,5.32227,-0.0167492,5.20949,10.515 +6.71,-0.16905,-0.305898,6.55089,17.2868,0.181272,28.3435,45.8115,-0.450683,1.58465,18.4118,5.32301,-0.0110029,5.25789,10.5699 +6.72,-0.171441,-0.239181,6.67162,17.2516,0.256399,28.3905,45.8985,-0.433058,1.76251,17.7864,5.30418,-0.00648075,5.31443,10.6121 +6.73,-0.173157,-0.171521,6.76601,17.1498,0.333703,28.4475,45.931,-0.413724,1.93342,17.0908,5.2656,-0.00319279,5.37828,10.6407 +6.74,-0.174189,-0.103184,6.8337,16.9803,0.409503,28.5135,45.9033,-0.392757,2.0967,16.3278,5.20711,-0.00110005,5.44851,10.6545 +6.75,-0.174533,-0.0344401,6.87443,16.7419,0.480096,28.5877,45.8097,-0.37024,2.2517,15.5003,5.1286,-0.000115859,5.52408,10.6526 +6.76,-0.174189,0.0344401,6.88802,16.434,0.541885,28.6689,45.6448,-0.346262,2.39782,14.6117,5.03002,-0.000108669,5.60385,10.6338 +6.77,-0.173157,0.103184,6.87443,16.0563,0.591518,28.7558,45.4036,-0.320917,2.53447,13.6654,4.91139,-0.000906619,5.68661,10.5971 +6.78,-0.171441,0.171521,6.8337,15.6089,0.626014,28.8472,45.082,-0.294306,2.66112,12.6651,4.7728,-0.00230373,5.77108,10.5416 +6.79,-0.16905,0.239181,6.76601,15.0924,0.642888,28.9415,44.6768,-0.266533,2.77727,11.6149,4.61447,-0.00406759,5.85594,10.4663 +6.8,-0.165991,0.305898,6.67162,14.508,0.64025,29.0374,44.1856,-0.237709,2.88246,10.5189,4.43669,-0.00594818,5.93984,10.3706 +6.81,-0.162277,0.371407,6.55089,13.8575,0.616892,29.1332,43.6076,-0.207946,2.97627,9.38128,4.23991,-0.00768776,6.02144,10.2537 +6.82,-0.157922,0.43545,6.40432,13.1432,0.572349,29.2274,42.9429,-0.177363,3.05834,8.20668,4.02466,-0.00903116,6.0994,10.115 +6.83,-0.152944,0.497774,6.23246,12.3679,0.506929,29.3185,42.1933,-0.146079,3.12834,6.9997,3.79166,-0.00973627,6.17244,9.95436 +6.84,-0.147363,0.558135,6.03602,11.5352,0.421716,29.4049,41.3618,-0.11422,3.18599,5.76509,3.54172,-0.00958424,6.23934,9.77147 +6.85,-0.1412,0.616292,5.81575,10.6489,0.318541,29.4853,40.4528,-0.0819089,3.23106,4.50772,3.27581,-0.00838885,6.29897,9.56639 +6.86,-0.13448,0.672017,5.57252,9.71374,0.199923,29.5583,39.4719,-0.049275,3.26339,3.23257,2.99504,-0.00600476,6.35032,9.33935 +6.87,-0.127229,0.72509,5.30731,8.73456,0.0689809,29.6226,38.4262,-0.0164466,3.28284,1.94466,2.70063,-0.00233413,6.39251,9.09081 +6.88,-0.119476,0.775302,5.02115,7.71672,-0.0706786,29.6773,37.3233,0.0164466,3.28933,0.649074,2.39395,0.0026686,6.42481,8.82142 +6.89,-0.111251,0.822454,4.71517,6.66587,-0.215096,29.7213,36.1721,0.049275,3.28284,-0.649074,2.07644,0.0089941,6.44666,8.53209 +6.9,-0.102588,0.866359,4.39059,5.58788,-0.360106,29.754,34.9817,0.0819089,3.26339,-1.94466,1.74966,0.0165778,6.45768,8.22392 +6.91,-0.0935194,0.906846,4.04867,4.48875,-0.501494,29.7748,33.762,0.11422,3.23106,-3.23257,1.41525,0.0253016,6.45768,7.89823 +6.92,-0.0840819,0.943754,3.69078,3.37454,-0.635154,29.7833,32.5227,0.146079,3.18599,-4.50772,1.07488,0.0349982,6.44665,7.55653 +6.93,-0.0743125,0.976937,3.31833,2.25126,-0.75724,29.7796,31.2736,0.177363,3.12834,-5.76509,0.730274,0.045457,6.4248,7.20053 +6.94,-0.0642499,1.00627,2.93278,1.12479,-0.864308,29.7636,30.0241,0.207946,3.05834,-6.9997,0.38317,0.056432,6.39249,6.83209 +6.95,-0.0539336,1.03162,2.53565,0.00082089,-0.95344,29.7357,28.783,0.237709,2.97627,-8.20668,0.035296,0.0676508,6.3503,6.45324 +6.96,-0.0434046,1.05291,2.12851,-1.11521,-1.02234,29.6963,27.5587,0.266533,2.88246,-9.38128,-0.311642,0.0788245,6.29894,6.06612 +6.97,-0.0327042,1.07004,1.71298,-2.21822,-1.06941,29.6462,26.3586,0.294306,2.77727,-10.5189,-0.655982,0.0896588,6.2393,5.67298 +6.98,-0.0218748,1.08294,1.29069,-3.30345,-1.09381,29.5862,25.189,0.320917,2.66112,-11.6149,-0.996124,0.0998639,6.1724,5.27614 +6.99,-0.010959,1.09158,0.863297,-4.36657,-1.09543,29.5174,24.0554,0.346262,2.53447,-12.6651,-1.33054,0.109165,6.09936,4.87798 +7,-1.15631e-13,1.0959,0.432502,-5.40364,-1.07496,29.4408,22.9622,0.37024,2.39782,-13.6654,-1.6578,0.117312,6.0214,4.48091 +7.01,0.010959,1.0959,1.68976e-11,-6.41114,-1.03376,29.3578,21.9129,0.392757,2.2517,-14.6117,-1.97656,0.124087,5.9398,4.08733 +7.02,0.0218748,1.09158,-0.432502,-7.38597,-0.973863,29.2697,20.9099,0.413724,2.0967,-15.5003,-2.28557,0.129313,5.8559,3.69964 +7.03,0.0327042,1.08294,-0.863297,-8.32538,-0.897855,29.1779,19.9547,0.433058,1.93342,-16.3278,-2.58372,0.132856,5.77104,3.32018 +7.04,0.0434046,1.07004,-1.29069,-9.227,-0.808792,29.0839,19.0481,0.450683,1.76251,-17.0908,-2.86997,0.134633,5.68657,2.95123 +7.05,0.0539336,1.05291,-1.71298,-10.0888,-0.710078,28.9892,18.1903,0.46653,1.58465,-17.7864,-3.1434,0.134609,5.60381,2.59501 +7.06,0.0642499,1.03162,-2.12851,-10.9089,-0.605348,28.8951,17.3809,0.480535,1.40053,-18.4118,-3.40321,0.132802,5.52404,2.25363 +7.07,0.0743125,1.00627,-2.53565,-11.6858,-0.498338,28.8033,16.6191,0.492644,1.21088,-18.9645,-3.64866,0.12928,5.44847,1.92909 +7.08,0.0840819,0.976937,-2.93278,-12.4181,-0.392758,28.7149,15.9041,0.502809,1.01646,-19.4424,-3.87912,0.124155,5.37824,1.62328 +7.09,0.0935194,0.943754,-3.31833,-13.1045,-0.292177,28.6315,15.2348,0.510989,0.818022,-19.8436,-4.09404,0.117583,5.3144,1.33794 +7.1,0.102588,0.906846,-3.69078,-13.7437,-0.199902,28.5541,14.6105,0.517152,0.616358,-20.1664,-4.29293,0.109758,5.25787,1.0747 +7.11,0.111251,0.866359,-4.04867,-14.3346,-0.118877,28.4841,14.0306,0.521275,0.412262,-20.4096,-4.47535,0.100902,5.20947,0.83502 +7.12,0.119476,0.822454,-4.39059,-14.8761,-0.0515908,28.4224,13.4947,0.52334,0.206539,-20.5723,-4.64093,0.0912604,5.1699,0.620235 +7.13,0.127229,0.775302,-4.71517,-15.3667,-4.66839e-13,28.3698,13.0032,0.52334,2.23155e-12,-20.6539,-4.78931,0.0810964,5.13973,0.431509 +7.14,0.13448,0.72509,-5.02115,-15.8052,0.0345301,28.3273,12.5567,0.521275,-0.206539,-20.6539,-4.9202,0.0706782,5.11937,0.269854 +7.15,0.1412,0.672017,-5.30731,-16.1902,0.0512687,28.2955,12.1565,0.517152,-0.412262,-20.5723,-5.03328,0.0602739,5.10913,0.136118 +7.16,0.147363,0.616292,-5.57252,-16.5202,0.050142,28.2747,11.8047,0.510989,-0.616358,-20.4096,-5.12829,0.050142,5.10913,0.0309813 +7.17,0.152944,0.558135,-5.81575,-16.7935,0.0317374,28.2654,11.5036,0.502809,-0.818022,-20.1664,-5.20495,0.0405236,5.11938,-0.0450446 +7.18,0.157922,0.497774,-6.03602,-17.0086,-0.00271351,28.2677,11.2564,0.492644,-1.01646,-19.8436,-5.263,0.0316352,5.13974,-0.0916262 +7.19,0.162277,0.43545,-6.23246,-17.1636,-0.0513716,28.2816,11.0667,0.480535,-1.21088,-19.4424,-5.30219,0.0236614,5.16992,-0.10861 +7.2,0.165991,0.371407,-6.40432,-17.2569,-0.111847,28.307,10.9382,0.46653,-1.40053,-18.9645,-5.32227,0.0167492,5.20949,-0.0960304 +7.21,0.16905,0.305898,-6.55089,-17.2868,-0.181272,28.3435,10.8754,0.450683,-1.58465,-18.4118,-5.32301,0.0110029,5.25789,-0.0541106 +7.22,0.171441,0.239181,-6.67162,-17.2516,-0.256399,28.3905,10.8825,0.433058,-1.76251,-17.7864,-5.30418,0.00648075,5.31443,0.0167296 +7.23,0.173157,0.171521,-6.76601,-17.1498,-0.333703,28.4475,10.9639,0.413724,-1.93342,-17.0908,-5.2656,0.00319279,5.37828,0.115872 +7.24,0.174189,0.103184,-6.8337,-16.9803,-0.409503,28.5135,11.1237,0.392757,-2.0967,-16.3278,-5.20711,0.00110005,5.44851,0.242499 +7.25,0.174533,0.0344401,-6.87443,-16.7419,-0.480096,28.5877,11.3657,0.37024,-2.2517,-15.5003,-5.1286,0.000115859,5.52408,0.395593 +7.26,0.174189,-0.0344401,-6.88802,-16.434,-0.541885,28.6689,11.693,0.346262,-2.39782,-14.6117,-5.03002,0.000108669,5.60385,0.573939 +7.27,0.173157,-0.103184,-6.87443,-16.0563,-0.591518,28.7558,12.108,0.320917,-2.53447,-13.6654,-4.91139,0.000906619,5.68661,0.776131 +7.28,0.171441,-0.171521,-6.8337,-15.6089,-0.626014,28.8472,12.6123,0.294306,-2.66112,-12.6651,-4.7728,0.00230373,5.77108,1.00058 +7.29,0.16905,-0.239181,-6.76601,-15.0924,-0.642888,28.9415,13.2062,0.266533,-2.77727,-11.6149,-4.61447,0.00406759,5.85594,1.24554 +7.3,0.165991,-0.305898,-6.67162,-14.508,-0.64025,29.0374,13.8891,0.237709,-2.88246,-10.5189,-4.43669,0.00594818,5.93984,1.5091 +7.31,0.162277,-0.371407,-6.55089,-13.8575,-0.616892,29.1332,14.6587,0.207946,-2.97627,-9.38128,-4.23991,0.00768776,6.02144,1.78922 +7.32,0.157922,-0.43545,-6.40432,-13.1432,-0.572349,29.2274,15.5118,0.177363,-3.05834,-8.20668,-4.02466,0.00903116,6.0994,2.08377 +7.33,0.152944,-0.497774,-6.23246,-12.3679,-0.506929,29.3185,16.4436,0.146079,-3.12834,-6.9997,-3.79166,0.00973627,6.17244,2.39051 +7.34,0.147363,-0.558135,-6.03602,-11.5352,-0.421716,29.4049,17.4481,0.11422,-3.18599,-5.76509,-3.54172,0.00958424,6.23934,2.7072 +7.35,0.1412,-0.616292,-5.81575,-10.6489,-0.318541,29.4853,18.5178,0.0819089,-3.23106,-4.50772,-3.27581,0.00838885,6.29897,3.03155 +7.36,0.13448,-0.672017,-5.57252,-9.71374,-0.199923,29.5583,19.6446,0.049275,-3.26339,-3.23257,-2.99504,0.00600476,6.35032,3.36129 +7.37,0.127229,-0.72509,-5.30731,-8.73456,-0.0689809,29.6226,20.8191,0.0164466,-3.28284,-1.94466,-2.70063,0.00233413,6.39251,3.69421 +7.38,0.119476,-0.775302,-5.02115,-7.71672,0.0706786,29.6773,22.0312,-0.0164466,-3.28933,-0.649074,-2.39395,-0.0026686,6.42481,4.02819 +7.39,0.111251,-0.822454,-4.71517,-6.66587,0.215096,29.7213,23.2705,-0.049275,-3.28284,0.649074,-2.07644,-0.0089941,6.44666,4.36123 +7.4,0.102588,-0.866359,-4.39059,-5.58788,0.360106,29.754,24.5262,-0.0819089,-3.26339,1.94466,-1.74966,-0.0165778,6.45768,4.69144 +7.41,0.0935194,-0.906846,-4.04867,-4.48875,0.501494,29.7748,25.7875,-0.11422,-3.23106,3.23257,-1.41525,-0.0253016,6.45768,5.01713 +7.42,0.0840819,-0.943754,-3.69078,-3.37454,0.635154,29.7833,27.0439,-0.146079,-3.18599,4.50772,-1.07488,-0.0349982,6.44665,5.33677 +7.43,0.0743125,-0.976937,-3.31833,-2.25126,0.75724,29.7796,28.2856,-0.177363,-3.12834,5.76509,-0.730274,-0.045457,6.4248,5.64906 +7.44,0.0642499,-1.00627,-2.93278,-1.12479,0.864308,29.7636,29.5031,-0.207946,-3.05834,6.9997,-0.38317,-0.056432,6.39249,5.95289 +7.45,0.0539336,-1.03162,-2.53565,-0.00082089,0.95344,29.7357,30.6883,-0.237709,-2.97627,8.20668,-0.035296,-0.0676508,6.3503,6.24735 +7.46,0.0434046,-1.05291,-2.12851,1.11521,1.02234,29.6963,31.8338,-0.266533,-2.88246,9.38128,0.311642,-0.0788245,6.29894,6.53176 +7.47,0.0327042,-1.07004,-1.71298,2.21822,1.06941,29.6462,32.9338,-0.294306,-2.77727,10.5189,0.655982,-0.0896588,6.2393,6.80563 +7.48,0.0218748,-1.08294,-1.29069,3.30345,1.09381,29.5862,33.9835,-0.320917,-2.66112,11.6149,0.996124,-0.0998639,6.1724,7.06866 +7.49,0.010959,-1.09158,-0.863297,4.36657,1.09543,29.5174,34.9794,-0.346262,-2.53447,12.6651,1.33054,-0.109165,6.09936,7.32074 +7.5,1.27434e-13,-1.0959,-0.432502,5.40364,1.07496,29.4408,35.9194,-0.37024,-2.39782,13.6654,1.6578,-0.117312,6.0214,7.56189 +7.51,-0.010959,-1.0959,-1.74527e-11,6.41114,1.03376,29.3578,36.8027,-0.392757,-2.2517,14.6117,1.97656,-0.124087,5.9398,7.79227 +7.52,-0.0218748,-1.09158,0.432502,7.38597,0.973863,29.2697,37.6295,-0.413724,-2.0967,15.5003,2.28557,-0.129313,5.8559,8.01216 +7.53,-0.0327042,-1.08294,0.863297,8.32538,0.897855,29.1779,38.4012,-0.433058,-1.93342,16.3278,2.58372,-0.132856,5.77104,8.2219 +7.54,-0.0434046,-1.07004,1.29069,9.227,0.808792,29.0839,39.1197,-0.450683,-1.76251,17.0908,2.86997,-0.134633,5.68657,8.4219 +7.55,-0.0539336,-1.05291,1.71298,10.0888,0.710078,28.9892,39.788,-0.46653,-1.58465,17.7864,3.1434,-0.134609,5.60381,8.6126 +7.56,-0.0642499,-1.03162,2.12851,10.9089,0.605348,28.8951,40.4094,-0.480535,-1.40053,18.4118,3.40321,-0.132802,5.52404,8.79445 +7.57,-0.0743125,-1.00627,2.53565,11.6858,0.498338,28.8033,40.9874,-0.492644,-1.21088,18.9645,3.64866,-0.12928,5.44847,8.96785 +7.58,-0.0840819,-0.976937,2.93278,12.4181,0.392758,28.7149,41.5258,-0.502809,-1.01646,19.4424,3.87912,-0.124155,5.37824,9.13321 +7.59,-0.0935194,-0.943754,3.31833,13.1045,0.292177,28.6315,42.0281,-0.510989,-0.818022,19.8436,4.09404,-0.117583,5.3144,9.29086 +7.6,-0.102588,-0.906846,3.69078,13.7437,0.199902,28.5541,42.4978,-0.517152,-0.616358,20.1664,4.29293,-0.109758,5.25787,9.44103 +7.61,-0.111251,-0.866359,4.04867,14.3346,0.118877,28.4841,42.9376,-0.521275,-0.412262,20.4096,4.47535,-0.100902,5.20947,9.58392 +7.62,-0.119476,-0.822454,4.39059,14.8761,0.0515908,28.4224,43.35,-0.52334,-0.206539,20.5723,4.64093,-0.0912604,5.1699,9.71957 +7.63,-0.127229,-0.775302,4.71517,15.3667,5.1329e-13,28.3698,43.7365,-0.52334,-2.45359e-12,20.6539,4.78931,-0.0810964,5.13973,9.84794 +7.64,-0.13448,-0.72509,5.02115,15.8052,-0.0345301,28.3273,44.098,-0.521275,0.206539,20.6539,4.9202,-0.0706782,5.11937,9.96889 +7.65,-0.1412,-0.672017,5.30731,16.1902,-0.0512687,28.2955,44.4344,-0.517152,0.412262,20.5723,5.03328,-0.0602739,5.10913,10.0821 +7.66,-0.147363,-0.616292,5.57252,16.5202,-0.050142,28.2747,44.7447,-0.510989,0.616358,20.4096,5.12829,-0.050142,5.10913,10.1873 +7.67,-0.152944,-0.558135,5.81575,16.7935,-0.0317374,28.2654,45.0272,-0.502809,0.818022,20.1664,5.20495,-0.0405236,5.11938,10.2838 +7.68,-0.157922,-0.497774,6.03602,17.0086,0.00271351,28.2677,45.279,-0.492644,1.01646,19.8436,5.263,-0.0316352,5.13974,10.3711 +7.69,-0.162277,-0.43545,6.23246,17.1636,0.0513716,28.2816,45.4966,-0.480535,1.21088,19.4424,5.30219,-0.0236614,5.16992,10.4484 +7.7,-0.165991,-0.371407,6.40432,17.2569,0.111847,28.307,45.6758,-0.46653,1.40053,18.9645,5.32227,-0.0167492,5.20949,10.515 +7.71,-0.16905,-0.305898,6.55089,17.2868,0.181272,28.3435,45.8115,-0.450683,1.58465,18.4118,5.32301,-0.0110029,5.25789,10.5699 +7.72,-0.171441,-0.239181,6.67162,17.2516,0.256399,28.3905,45.8985,-0.433058,1.76251,17.7864,5.30418,-0.00648075,5.31443,10.6121 +7.73,-0.173157,-0.171521,6.76601,17.1498,0.333703,28.4475,45.931,-0.413724,1.93342,17.0908,5.2656,-0.00319279,5.37828,10.6407 +7.74,-0.174189,-0.103184,6.8337,16.9803,0.409503,28.5135,45.9033,-0.392757,2.0967,16.3278,5.20711,-0.00110005,5.44851,10.6545 +7.75,-0.174533,-0.0344401,6.87443,16.7419,0.480096,28.5877,45.8097,-0.37024,2.2517,15.5003,5.1286,-0.000115859,5.52408,10.6526 +7.76,-0.174189,0.0344401,6.88802,16.434,0.541885,28.6689,45.6448,-0.346262,2.39782,14.6117,5.03002,-0.000108669,5.60385,10.6338 +7.77,-0.173157,0.103184,6.87443,16.0563,0.591518,28.7558,45.4036,-0.320917,2.53447,13.6654,4.91139,-0.000906619,5.68661,10.5971 +7.78,-0.171441,0.171521,6.8337,15.6089,0.626014,28.8472,45.082,-0.294306,2.66112,12.6651,4.7728,-0.00230373,5.77108,10.5416 +7.79,-0.16905,0.239181,6.76601,15.0924,0.642888,28.9415,44.6768,-0.266533,2.77727,11.6149,4.61447,-0.00406759,5.85594,10.4663 +7.8,-0.165991,0.305898,6.67162,14.508,0.64025,29.0374,44.1856,-0.237709,2.88246,10.5189,4.43669,-0.00594818,5.93984,10.3706 +7.81,-0.162277,0.371407,6.55089,13.8575,0.616892,29.1332,43.6076,-0.207946,2.97627,9.38128,4.23991,-0.00768776,6.02144,10.2537 +7.82,-0.157922,0.43545,6.40432,13.1432,0.572349,29.2274,42.9429,-0.177363,3.05834,8.20668,4.02466,-0.00903116,6.0994,10.115 +7.83,-0.152944,0.497774,6.23246,12.3679,0.506929,29.3185,42.1933,-0.146079,3.12834,6.9997,3.79166,-0.00973627,6.17244,9.95436 +7.84,-0.147363,0.558135,6.03602,11.5352,0.421716,29.4049,41.3618,-0.11422,3.18599,5.76509,3.54172,-0.00958424,6.23934,9.77147 +7.85,-0.1412,0.616292,5.81575,10.6489,0.318541,29.4853,40.4528,-0.0819089,3.23106,4.50772,3.27581,-0.00838885,6.29897,9.56639 +7.86,-0.13448,0.672017,5.57252,9.71374,0.199923,29.5583,39.4719,-0.049275,3.26339,3.23257,2.99504,-0.00600476,6.35032,9.33935 +7.87,-0.127229,0.72509,5.30731,8.73456,0.0689809,29.6226,38.4262,-0.0164466,3.28284,1.94466,2.70063,-0.00233413,6.39251,9.09081 +7.88,-0.119476,0.775302,5.02115,7.71672,-0.0706786,29.6773,37.3233,0.0164466,3.28933,0.649074,2.39395,0.0026686,6.42481,8.82142 +7.89,-0.111251,0.822454,4.71517,6.66587,-0.215096,29.7213,36.1721,0.049275,3.28284,-0.649074,2.07644,0.0089941,6.44666,8.53209 +7.9,-0.102588,0.866359,4.39059,5.58788,-0.360106,29.754,34.9817,0.0819089,3.26339,-1.94466,1.74966,0.0165778,6.45768,8.22392 +7.91,-0.0935194,0.906846,4.04867,4.48875,-0.501494,29.7748,33.762,0.11422,3.23106,-3.23257,1.41525,0.0253016,6.45768,7.89823 +7.92,-0.0840819,0.943754,3.69078,3.37454,-0.635154,29.7833,32.5227,0.146079,3.18599,-4.50772,1.07488,0.0349982,6.44665,7.55653 +7.93,-0.0743125,0.976937,3.31833,2.25126,-0.75724,29.7796,31.2736,0.177363,3.12834,-5.76509,0.730274,0.045457,6.4248,7.20053 +7.94,-0.0642499,1.00627,2.93278,1.12479,-0.864308,29.7636,30.0241,0.207946,3.05834,-6.9997,0.38317,0.056432,6.39249,6.83209 +7.95,-0.0539336,1.03162,2.53565,0.00082089,-0.95344,29.7357,28.783,0.237709,2.97627,-8.20668,0.035296,0.0676508,6.3503,6.45324 +7.96,-0.0434046,1.05291,2.12851,-1.11521,-1.02234,29.6963,27.5587,0.266533,2.88246,-9.38128,-0.311642,0.0788245,6.29894,6.06612 +7.97,-0.0327042,1.07004,1.71298,-2.21822,-1.06941,29.6462,26.3586,0.294306,2.77727,-10.5189,-0.655982,0.0896588,6.2393,5.67298 +7.98,-0.0218748,1.08294,1.29069,-3.30345,-1.09381,29.5862,25.189,0.320917,2.66112,-11.6149,-0.996124,0.0998639,6.1724,5.27614 +7.99,-0.010959,1.09158,0.863297,-4.36657,-1.09543,29.5174,24.0554,0.346262,2.53447,-12.6651,-1.33054,0.109165,6.09936,4.87798 +8,-1.39237e-13,1.0959,0.432502,-5.40364,-1.07496,29.4408,22.9622,0.37024,2.39782,-13.6654,-1.6578,0.117312,6.0214,4.48091 +8.01,0.010959,1.0959,1.78302e-11,-6.41114,-1.03376,29.3578,21.9129,0.392757,2.2517,-14.6117,-1.97656,0.124087,5.9398,4.08733 +8.02,0.0218748,1.09158,-0.432502,-7.38597,-0.973863,29.2697,20.9099,0.413724,2.0967,-15.5003,-2.28557,0.129313,5.8559,3.69964 +8.03,0.0327042,1.08294,-0.863297,-8.32538,-0.897855,29.1779,19.9547,0.433058,1.93342,-16.3278,-2.58372,0.132856,5.77104,3.32018 +8.04,0.0434046,1.07004,-1.29069,-9.227,-0.808792,29.0839,19.0481,0.450683,1.76251,-17.0908,-2.86997,0.134633,5.68657,2.95123 +8.05,0.0539336,1.05291,-1.71298,-10.0888,-0.710078,28.9892,18.1903,0.46653,1.58465,-17.7864,-3.1434,0.134609,5.60381,2.59501 +8.06,0.0642499,1.03162,-2.12851,-10.9089,-0.605348,28.8951,17.3809,0.480535,1.40053,-18.4118,-3.40321,0.132802,5.52404,2.25363 +8.07,0.0743125,1.00627,-2.53565,-11.6858,-0.498338,28.8033,16.6191,0.492644,1.21088,-18.9645,-3.64866,0.12928,5.44847,1.92909 +8.08,0.0840819,0.976937,-2.93278,-12.4181,-0.392758,28.7149,15.9041,0.502809,1.01646,-19.4424,-3.87912,0.124155,5.37824,1.62328 +8.09,0.0935194,0.943754,-3.31833,-13.1045,-0.292177,28.6315,15.2348,0.510989,0.818022,-19.8436,-4.09404,0.117583,5.3144,1.33794 +8.1,0.102588,0.906846,-3.69078,-13.7437,-0.199902,28.5541,14.6105,0.517152,0.616358,-20.1664,-4.29293,0.109758,5.25787,1.0747 +8.11,0.111251,0.866359,-4.04867,-14.3346,-0.118877,28.4841,14.0306,0.521275,0.412262,-20.4096,-4.47535,0.100902,5.20947,0.83502 +8.12,0.119476,0.822454,-4.39059,-14.8761,-0.0515908,28.4224,13.4947,0.52334,0.206539,-20.5723,-4.64093,0.0912604,5.1699,0.620235 +8.13,0.127229,0.775302,-4.71517,-15.3667,-5.59742e-13,28.3698,13.0032,0.52334,2.67564e-12,-20.6539,-4.78931,0.0810964,5.13973,0.431509 +8.14,0.13448,0.72509,-5.02115,-15.8052,0.0345301,28.3273,12.5567,0.521275,-0.206539,-20.6539,-4.9202,0.0706782,5.11937,0.269854 +8.15,0.1412,0.672017,-5.30731,-16.1902,0.0512687,28.2955,12.1565,0.517152,-0.412262,-20.5723,-5.03328,0.0602739,5.10913,0.136118 +8.16,0.147363,0.616292,-5.57252,-16.5202,0.050142,28.2747,11.8047,0.510989,-0.616358,-20.4096,-5.12829,0.050142,5.10913,0.0309813 +8.17,0.152944,0.558135,-5.81575,-16.7935,0.0317374,28.2654,11.5036,0.502809,-0.818022,-20.1664,-5.20495,0.0405236,5.11938,-0.0450446 +8.18,0.157922,0.497774,-6.03602,-17.0086,-0.00271351,28.2677,11.2564,0.492644,-1.01646,-19.8436,-5.263,0.0316352,5.13974,-0.0916262 +8.19,0.162277,0.43545,-6.23246,-17.1636,-0.0513716,28.2816,11.0667,0.480535,-1.21088,-19.4424,-5.30219,0.0236614,5.16992,-0.10861 +8.2,0.165991,0.371407,-6.40432,-17.2569,-0.111847,28.307,10.9382,0.46653,-1.40053,-18.9645,-5.32227,0.0167492,5.20949,-0.0960304 +8.21,0.16905,0.305898,-6.55089,-17.2868,-0.181272,28.3435,10.8754,0.450683,-1.58465,-18.4118,-5.32301,0.0110029,5.25789,-0.0541106 +8.22,0.171441,0.239181,-6.67162,-17.2516,-0.256399,28.3905,10.8825,0.433058,-1.76251,-17.7864,-5.30418,0.00648075,5.31443,0.0167296 +8.23,0.173157,0.171521,-6.76601,-17.1498,-0.333703,28.4475,10.9639,0.413724,-1.93342,-17.0908,-5.2656,0.00319279,5.37828,0.115872 +8.24,0.174189,0.103184,-6.8337,-16.9803,-0.409503,28.5135,11.1237,0.392757,-2.0967,-16.3278,-5.20711,0.00110005,5.44851,0.242499 +8.25,0.174533,0.0344401,-6.87443,-16.7419,-0.480096,28.5877,11.3657,0.37024,-2.2517,-15.5003,-5.1286,0.000115859,5.52408,0.395593 +8.26,0.174189,-0.0344401,-6.88802,-16.434,-0.541885,28.6689,11.693,0.346262,-2.39782,-14.6117,-5.03002,0.000108669,5.60385,0.573939 +8.27,0.173157,-0.103184,-6.87443,-16.0563,-0.591518,28.7558,12.108,0.320917,-2.53447,-13.6654,-4.91139,0.000906619,5.68661,0.776131 +8.28,0.171441,-0.171521,-6.8337,-15.6089,-0.626014,28.8472,12.6123,0.294306,-2.66112,-12.6651,-4.7728,0.00230373,5.77108,1.00058 +8.29,0.16905,-0.239181,-6.76601,-15.0924,-0.642888,28.9415,13.2062,0.266533,-2.77727,-11.6149,-4.61447,0.00406759,5.85594,1.24554 +8.3,0.165991,-0.305898,-6.67162,-14.508,-0.64025,29.0374,13.8891,0.237709,-2.88246,-10.5189,-4.43669,0.00594818,5.93984,1.5091 +8.31,0.162277,-0.371407,-6.55089,-13.8575,-0.616892,29.1332,14.6587,0.207946,-2.97627,-9.38128,-4.23991,0.00768776,6.02144,1.78922 +8.32,0.157922,-0.43545,-6.40432,-13.1432,-0.572349,29.2274,15.5118,0.177363,-3.05834,-8.20668,-4.02466,0.00903116,6.0994,2.08377 +8.33,0.152944,-0.497774,-6.23246,-12.3679,-0.506929,29.3185,16.4436,0.146079,-3.12834,-6.9997,-3.79166,0.00973627,6.17244,2.39051 +8.34,0.147363,-0.558135,-6.03602,-11.5352,-0.421716,29.4049,17.4481,0.11422,-3.18599,-5.76509,-3.54172,0.00958424,6.23934,2.7072 +8.35,0.1412,-0.616292,-5.81575,-10.6489,-0.318541,29.4853,18.5178,0.0819089,-3.23106,-4.50772,-3.27581,0.00838885,6.29897,3.03155 +8.36,0.13448,-0.672017,-5.57252,-9.71374,-0.199923,29.5583,19.6446,0.049275,-3.26339,-3.23257,-2.99504,0.00600476,6.35032,3.36129 +8.37,0.127229,-0.72509,-5.30731,-8.73456,-0.0689809,29.6226,20.8191,0.0164466,-3.28284,-1.94466,-2.70063,0.00233413,6.39251,3.69421 +8.38,0.119476,-0.775302,-5.02115,-7.71672,0.0706786,29.6773,22.0312,-0.0164466,-3.28933,-0.649074,-2.39395,-0.0026686,6.42481,4.02819 +8.39,0.111251,-0.822454,-4.71517,-6.66587,0.215096,29.7213,23.2705,-0.049275,-3.28284,0.649074,-2.07644,-0.0089941,6.44666,4.36123 +8.4,0.102588,-0.866359,-4.39059,-5.58788,0.360106,29.754,24.5262,-0.0819089,-3.26339,1.94466,-1.74966,-0.0165778,6.45768,4.69144 +8.41,0.0935194,-0.906846,-4.04867,-4.48875,0.501494,29.7748,25.7875,-0.11422,-3.23106,3.23257,-1.41525,-0.0253016,6.45768,5.01713 +8.42,0.0840819,-0.943754,-3.69078,-3.37454,0.635154,29.7833,27.0439,-0.146079,-3.18599,4.50772,-1.07488,-0.0349982,6.44665,5.33677 +8.43,0.0743125,-0.976937,-3.31833,-2.25126,0.75724,29.7796,28.2856,-0.177363,-3.12834,5.76509,-0.730274,-0.045457,6.4248,5.64906 +8.44,0.0642499,-1.00627,-2.93278,-1.12479,0.864308,29.7636,29.5031,-0.207946,-3.05834,6.9997,-0.38317,-0.056432,6.39249,5.95289 +8.45,0.0539336,-1.03162,-2.53565,-0.00082089,0.95344,29.7357,30.6883,-0.237709,-2.97627,8.20668,-0.035296,-0.0676508,6.3503,6.24735 +8.46,0.0434046,-1.05291,-2.12851,1.11521,1.02234,29.6963,31.8338,-0.266533,-2.88246,9.38128,0.311642,-0.0788245,6.29894,6.53176 +8.47,0.0327042,-1.07004,-1.71298,2.21822,1.06941,29.6462,32.9338,-0.294306,-2.77727,10.5189,0.655982,-0.0896588,6.2393,6.80563 +8.48,0.0218748,-1.08294,-1.29069,3.30345,1.09381,29.5862,33.9835,-0.320917,-2.66112,11.6149,0.996124,-0.0998639,6.1724,7.06866 +8.49,0.010959,-1.09158,-0.863297,4.36657,1.09543,29.5174,34.9794,-0.346262,-2.53447,12.6651,1.33054,-0.109165,6.09936,7.32074 +8.5,1.49799e-13,-1.0959,-0.432502,5.40364,1.07496,29.4408,35.9194,-0.37024,-2.39782,13.6654,1.6578,-0.117312,6.0214,7.56189 +8.51,-0.010959,-1.0959,6.4837e-12,6.41114,1.03376,29.3578,36.8027,-0.392757,-2.2517,14.6117,1.97656,-0.124087,5.9398,7.79227 +8.52,-0.0218748,-1.09158,0.432502,7.38597,0.973863,29.2697,37.6295,-0.413724,-2.0967,15.5003,2.28557,-0.129313,5.8559,8.01216 +8.53,-0.0327042,-1.08294,0.863297,8.32538,0.897855,29.1779,38.4012,-0.433058,-1.93342,16.3278,2.58372,-0.132856,5.77104,8.2219 +8.54,-0.0434046,-1.07004,1.29069,9.227,0.808792,29.0839,39.1197,-0.450683,-1.76251,17.0908,2.86997,-0.134633,5.68657,8.4219 +8.55,-0.0539336,-1.05291,1.71298,10.0888,0.710078,28.9892,39.788,-0.46653,-1.58465,17.7864,3.1434,-0.134609,5.60381,8.6126 +8.56,-0.0642499,-1.03162,2.12851,10.9089,0.605348,28.8951,40.4094,-0.480535,-1.40053,18.4118,3.40321,-0.132802,5.52404,8.79445 +8.57,-0.0743125,-1.00627,2.53565,11.6858,0.498338,28.8033,40.9874,-0.492644,-1.21088,18.9645,3.64866,-0.12928,5.44847,8.96785 +8.58,-0.0840819,-0.976937,2.93278,12.4181,0.392758,28.7149,41.5258,-0.502809,-1.01646,19.4424,3.87912,-0.124155,5.37824,9.13321 +8.59,-0.0935194,-0.943754,3.31833,13.1045,0.292177,28.6315,42.0281,-0.510989,-0.818022,19.8436,4.09404,-0.117583,5.3144,9.29086 +8.6,-0.102588,-0.906846,3.69078,13.7437,0.199902,28.5541,42.4978,-0.517152,-0.616358,20.1664,4.29293,-0.109758,5.25787,9.44103 +8.61,-0.111251,-0.866359,4.04867,14.3346,0.118877,28.4841,42.9376,-0.521275,-0.412262,20.4096,4.47535,-0.100902,5.20947,9.58392 +8.62,-0.119476,-0.822454,4.39059,14.8761,0.0515908,28.4224,43.35,-0.52334,-0.206539,20.5723,4.64093,-0.0912604,5.1699,9.71957 +8.63,-0.127229,-0.775302,4.71517,15.3667,6.06194e-13,28.3698,43.7365,-0.52334,-2.89768e-12,20.6539,4.78931,-0.0810964,5.13973,9.84794 +8.64,-0.13448,-0.72509,5.02115,15.8052,-0.0345301,28.3273,44.098,-0.521275,0.206539,20.6539,4.9202,-0.0706782,5.11937,9.96889 +8.65,-0.1412,-0.672017,5.30731,16.1902,-0.0512687,28.2955,44.4344,-0.517152,0.412262,20.5723,5.03328,-0.0602739,5.10913,10.0821 +8.66,-0.147363,-0.616292,5.57252,16.5202,-0.050142,28.2747,44.7447,-0.510989,0.616358,20.4096,5.12829,-0.050142,5.10913,10.1873 +8.67,-0.152944,-0.558135,5.81575,16.7935,-0.0317374,28.2654,45.0272,-0.502809,0.818022,20.1664,5.20495,-0.0405236,5.11938,10.2838 +8.68,-0.157922,-0.497774,6.03602,17.0086,0.00271351,28.2677,45.279,-0.492644,1.01646,19.8436,5.263,-0.0316352,5.13974,10.3711 +8.69,-0.162277,-0.43545,6.23246,17.1636,0.0513716,28.2816,45.4966,-0.480535,1.21088,19.4424,5.30219,-0.0236614,5.16992,10.4484 +8.7,-0.165991,-0.371407,6.40432,17.2569,0.111847,28.307,45.6758,-0.46653,1.40053,18.9645,5.32227,-0.0167492,5.20949,10.515 +8.71,-0.16905,-0.305898,6.55089,17.2868,0.181272,28.3435,45.8115,-0.450683,1.58465,18.4118,5.32301,-0.0110029,5.25789,10.5699 +8.72,-0.171441,-0.239181,6.67162,17.2516,0.256399,28.3905,45.8985,-0.433058,1.76251,17.7864,5.30418,-0.00648075,5.31443,10.6121 +8.73,-0.173157,-0.171521,6.76601,17.1498,0.333703,28.4475,45.931,-0.413724,1.93342,17.0908,5.2656,-0.00319279,5.37828,10.6407 +8.74,-0.174189,-0.103184,6.8337,16.9803,0.409503,28.5135,45.9033,-0.392757,2.0967,16.3278,5.20711,-0.00110005,5.44851,10.6545 +8.75,-0.174533,-0.0344401,6.87443,16.7419,0.480096,28.5877,45.8097,-0.37024,2.2517,15.5003,5.1286,-0.000115859,5.52408,10.6526 +8.76,-0.174189,0.0344401,6.88802,16.434,0.541885,28.6689,45.6448,-0.346262,2.39782,14.6117,5.03002,-0.000108669,5.60385,10.6338 +8.77,-0.173157,0.103184,6.87443,16.0563,0.591518,28.7558,45.4036,-0.320917,2.53447,13.6654,4.91139,-0.000906619,5.68661,10.5971 +8.78,-0.171441,0.171521,6.8337,15.6089,0.626014,28.8472,45.082,-0.294306,2.66112,12.6651,4.7728,-0.00230373,5.77108,10.5416 +8.79,-0.16905,0.239181,6.76601,15.0924,0.642888,28.9415,44.6768,-0.266533,2.77727,11.6149,4.61447,-0.00406759,5.85594,10.4663 +8.8,-0.165991,0.305898,6.67162,14.508,0.64025,29.0374,44.1856,-0.237709,2.88246,10.5189,4.43669,-0.00594818,5.93984,10.3706 +8.81,-0.162277,0.371407,6.55089,13.8575,0.616892,29.1332,43.6076,-0.207946,2.97627,9.38128,4.23991,-0.00768776,6.02144,10.2537 +8.82,-0.157922,0.43545,6.40432,13.1432,0.572349,29.2274,42.9429,-0.177363,3.05834,8.20668,4.02466,-0.00903116,6.0994,10.115 +8.83,-0.152944,0.497774,6.23246,12.3679,0.506929,29.3185,42.1933,-0.146079,3.12834,6.9997,3.79166,-0.00973627,6.17244,9.95436 +8.84,-0.147363,0.558135,6.03602,11.5352,0.421716,29.4049,41.3618,-0.11422,3.18599,5.76509,3.54172,-0.00958424,6.23934,9.77147 +8.85,-0.1412,0.616292,5.81575,10.6489,0.318541,29.4853,40.4528,-0.0819089,3.23106,4.50772,3.27581,-0.00838885,6.29897,9.56639 +8.86,-0.13448,0.672017,5.57252,9.71374,0.199923,29.5583,39.4719,-0.049275,3.26339,3.23257,2.99504,-0.00600476,6.35032,9.33935 +8.87,-0.127229,0.72509,5.30731,8.73456,0.0689809,29.6226,38.4262,-0.0164466,3.28284,1.94466,2.70063,-0.00233413,6.39251,9.09081 +8.88,-0.119476,0.775302,5.02115,7.71672,-0.0706786,29.6773,37.3233,0.0164466,3.28933,0.649074,2.39395,0.0026686,6.42481,8.82142 +8.89,-0.111251,0.822454,4.71517,6.66587,-0.215096,29.7213,36.1721,0.049275,3.28284,-0.649074,2.07644,0.0089941,6.44666,8.53209 +8.9,-0.102588,0.866359,4.39059,5.58788,-0.360106,29.754,34.9817,0.0819089,3.26339,-1.94466,1.74966,0.0165778,6.45768,8.22392 +8.91,-0.0935194,0.906846,4.04867,4.48875,-0.501494,29.7748,33.762,0.11422,3.23106,-3.23257,1.41525,0.0253016,6.45768,7.89823 +8.92,-0.0840819,0.943754,3.69078,3.37454,-0.635154,29.7833,32.5227,0.146079,3.18599,-4.50772,1.07488,0.0349982,6.44665,7.55653 +8.93,-0.0743125,0.976937,3.31833,2.25126,-0.75724,29.7796,31.2736,0.177363,3.12834,-5.76509,0.730274,0.045457,6.4248,7.20053 +8.94,-0.0642499,1.00627,2.93278,1.12479,-0.864308,29.7636,30.0241,0.207946,3.05834,-6.9997,0.38317,0.056432,6.39249,6.83209 +8.95,-0.0539336,1.03162,2.53565,0.00082089,-0.95344,29.7357,28.783,0.237709,2.97627,-8.20668,0.035296,0.0676508,6.3503,6.45324 +8.96,-0.0434046,1.05291,2.12851,-1.11521,-1.02234,29.6963,27.5587,0.266533,2.88246,-9.38128,-0.311642,0.0788245,6.29894,6.06612 +8.97,-0.0327042,1.07004,1.71298,-2.21822,-1.06941,29.6462,26.3586,0.294306,2.77727,-10.5189,-0.655982,0.0896588,6.2393,5.67298 +8.98,-0.0218748,1.08294,1.29069,-3.30345,-1.09381,29.5862,25.189,0.320917,2.66112,-11.6149,-0.996124,0.0998639,6.1724,5.27614 +8.99,-0.010959,1.09158,0.863297,-4.36657,-1.09543,29.5174,24.0554,0.346262,2.53447,-12.6651,-1.33054,0.109165,6.09936,4.87798 +9,-1.61602e-13,1.0959,0.432502,-5.40364,-1.07496,29.4408,22.9622,0.37024,2.39782,-13.6654,-1.6578,0.117312,6.0214,4.48091 +9.01,0.010959,1.0959,-5.9952e-12,-6.41114,-1.03376,29.3578,21.9129,0.392757,2.2517,-14.6117,-1.97656,0.124087,5.9398,4.08733 +9.02,0.0218748,1.09158,-0.432502,-7.38597,-0.973863,29.2697,20.9099,0.413724,2.0967,-15.5003,-2.28557,0.129313,5.8559,3.69964 +9.03,0.0327042,1.08294,-0.863297,-8.32538,-0.897855,29.1779,19.9547,0.433058,1.93342,-16.3278,-2.58372,0.132856,5.77104,3.32018 +9.04,0.0434046,1.07004,-1.29069,-9.227,-0.808792,29.0839,19.0481,0.450683,1.76251,-17.0908,-2.86997,0.134633,5.68657,2.95123 +9.05,0.0539336,1.05291,-1.71298,-10.0888,-0.710078,28.9892,18.1903,0.46653,1.58465,-17.7864,-3.1434,0.134609,5.60381,2.59501 +9.06,0.0642499,1.03162,-2.12851,-10.9089,-0.605348,28.8951,17.3809,0.480535,1.40053,-18.4118,-3.40321,0.132802,5.52404,2.25363 +9.07,0.0743125,1.00627,-2.53565,-11.6858,-0.498338,28.8033,16.6191,0.492644,1.21088,-18.9645,-3.64866,0.12928,5.44847,1.92909 +9.08,0.0840819,0.976937,-2.93278,-12.4181,-0.392758,28.7149,15.9041,0.502809,1.01646,-19.4424,-3.87912,0.124155,5.37824,1.62328 +9.09,0.0935194,0.943754,-3.31833,-13.1045,-0.292177,28.6315,15.2348,0.510989,0.818022,-19.8436,-4.09404,0.117583,5.3144,1.33794 +9.1,0.102588,0.906846,-3.69078,-13.7437,-0.199902,28.5541,14.6105,0.517152,0.616358,-20.1664,-4.29293,0.109758,5.25787,1.0747 +9.11,0.111251,0.866359,-4.04867,-14.3346,-0.118877,28.4841,14.0306,0.521275,0.412262,-20.4096,-4.47535,0.100902,5.20947,0.83502 +9.12,0.119476,0.822454,-4.39059,-14.8761,-0.0515908,28.4224,13.4947,0.52334,0.206539,-20.5723,-4.64093,0.0912604,5.1699,0.620235 +9.13,0.127229,0.775302,-4.71517,-15.3667,-6.52645e-13,28.3698,13.0032,0.52334,3.11973e-12,-20.6539,-4.78931,0.0810964,5.13973,0.431509 +9.14,0.13448,0.72509,-5.02115,-15.8052,0.0345301,28.3273,12.5567,0.521275,-0.206539,-20.6539,-4.9202,0.0706782,5.11937,0.269854 +9.15,0.1412,0.672017,-5.30731,-16.1902,0.0512687,28.2955,12.1565,0.517152,-0.412262,-20.5723,-5.03328,0.0602739,5.10913,0.136118 +9.16,0.147363,0.616292,-5.57252,-16.5202,0.050142,28.2747,11.8047,0.510989,-0.616358,-20.4096,-5.12829,0.050142,5.10913,0.0309813 +9.17,0.152944,0.558135,-5.81575,-16.7935,0.0317374,28.2654,11.5036,0.502809,-0.818022,-20.1664,-5.20495,0.0405236,5.11938,-0.0450446 +9.18,0.157922,0.497774,-6.03602,-17.0086,-0.00271351,28.2677,11.2564,0.492644,-1.01646,-19.8436,-5.263,0.0316352,5.13974,-0.0916262 +9.19,0.162277,0.43545,-6.23246,-17.1636,-0.0513716,28.2816,11.0667,0.480535,-1.21088,-19.4424,-5.30219,0.0236614,5.16992,-0.10861 +9.2,0.165991,0.371407,-6.40432,-17.2569,-0.111847,28.307,10.9382,0.46653,-1.40053,-18.9645,-5.32227,0.0167492,5.20949,-0.0960304 +9.21,0.16905,0.305898,-6.55089,-17.2868,-0.181272,28.3435,10.8754,0.450683,-1.58465,-18.4118,-5.32301,0.0110029,5.25789,-0.0541106 +9.22,0.171441,0.239181,-6.67162,-17.2516,-0.256399,28.3905,10.8825,0.433058,-1.76251,-17.7864,-5.30418,0.00648075,5.31443,0.0167296 +9.23,0.173157,0.171521,-6.76601,-17.1498,-0.333703,28.4475,10.9639,0.413724,-1.93342,-17.0908,-5.2656,0.00319279,5.37828,0.115872 +9.24,0.174189,0.103184,-6.8337,-16.9803,-0.409503,28.5135,11.1237,0.392757,-2.0967,-16.3278,-5.20711,0.00110005,5.44851,0.242499 +9.25,0.174533,0.0344401,-6.87443,-16.7419,-0.480096,28.5877,11.3657,0.37024,-2.2517,-15.5003,-5.1286,0.000115859,5.52408,0.395593 +9.26,0.174189,-0.0344401,-6.88802,-16.434,-0.541885,28.6689,11.693,0.346262,-2.39782,-14.6117,-5.03002,0.000108669,5.60385,0.573939 +9.27,0.173157,-0.103184,-6.87443,-16.0563,-0.591518,28.7558,12.108,0.320917,-2.53447,-13.6654,-4.91139,0.000906619,5.68661,0.776131 +9.28,0.171441,-0.171521,-6.8337,-15.6089,-0.626014,28.8472,12.6123,0.294306,-2.66112,-12.6651,-4.7728,0.00230373,5.77108,1.00058 +9.29,0.16905,-0.239181,-6.76601,-15.0924,-0.642888,28.9415,13.2062,0.266533,-2.77727,-11.6149,-4.61447,0.00406759,5.85594,1.24554 +9.3,0.165991,-0.305898,-6.67162,-14.508,-0.64025,29.0374,13.8891,0.237709,-2.88246,-10.5189,-4.43669,0.00594818,5.93984,1.5091 +9.31,0.162277,-0.371407,-6.55089,-13.8575,-0.616892,29.1332,14.6587,0.207946,-2.97627,-9.38128,-4.23991,0.00768776,6.02144,1.78922 +9.32,0.157922,-0.43545,-6.40432,-13.1432,-0.572349,29.2274,15.5118,0.177363,-3.05834,-8.20668,-4.02466,0.00903116,6.0994,2.08377 +9.33,0.152944,-0.497774,-6.23246,-12.3679,-0.506929,29.3185,16.4436,0.146079,-3.12834,-6.9997,-3.79166,0.00973627,6.17244,2.39051 +9.34,0.147363,-0.558135,-6.03602,-11.5352,-0.421716,29.4049,17.4481,0.11422,-3.18599,-5.76509,-3.54172,0.00958424,6.23934,2.7072 +9.35,0.1412,-0.616292,-5.81575,-10.6489,-0.318541,29.4853,18.5178,0.0819089,-3.23106,-4.50772,-3.27581,0.00838885,6.29897,3.03155 +9.36,0.13448,-0.672017,-5.57252,-9.71374,-0.199923,29.5583,19.6446,0.049275,-3.26339,-3.23257,-2.99504,0.00600476,6.35032,3.36129 +9.37,0.127229,-0.72509,-5.30731,-8.73456,-0.0689809,29.6226,20.8191,0.0164466,-3.28284,-1.94466,-2.70063,0.00233413,6.39251,3.69421 +9.38,0.119476,-0.775302,-5.02115,-7.71672,0.0706786,29.6773,22.0312,-0.0164466,-3.28933,-0.649074,-2.39395,-0.0026686,6.42481,4.02819 +9.39,0.111251,-0.822454,-4.71517,-6.66587,0.215096,29.7213,23.2705,-0.049275,-3.28284,0.649074,-2.07644,-0.0089941,6.44666,4.36123 +9.4,0.102588,-0.866359,-4.39059,-5.58788,0.360106,29.754,24.5262,-0.0819089,-3.26339,1.94466,-1.74966,-0.0165778,6.45768,4.69144 +9.41,0.0935194,-0.906846,-4.04867,-4.48875,0.501494,29.7748,25.7875,-0.11422,-3.23106,3.23257,-1.41525,-0.0253016,6.45768,5.01713 +9.42,0.0840819,-0.943754,-3.69078,-3.37454,0.635154,29.7833,27.0439,-0.146079,-3.18599,4.50772,-1.07488,-0.0349982,6.44665,5.33677 +9.43,0.0743125,-0.976937,-3.31833,-2.25126,0.75724,29.7796,28.2856,-0.177363,-3.12834,5.76509,-0.730274,-0.045457,6.4248,5.64906 +9.44,0.0642499,-1.00627,-2.93278,-1.12479,0.864308,29.7636,29.5031,-0.207946,-3.05834,6.9997,-0.38317,-0.056432,6.39249,5.95289 +9.45,0.0539336,-1.03162,-2.53565,-0.00082089,0.95344,29.7357,30.6883,-0.237709,-2.97627,8.20668,-0.035296,-0.0676508,6.3503,6.24735 +9.46,0.0434046,-1.05291,-2.12851,1.11521,1.02234,29.6963,31.8338,-0.266533,-2.88246,9.38128,0.311642,-0.0788245,6.29894,6.53176 +9.47,0.0327042,-1.07004,-1.71298,2.21822,1.06941,29.6462,32.9338,-0.294306,-2.77727,10.5189,0.655982,-0.0896588,6.2393,6.80563 +9.48,0.0218748,-1.08294,-1.29069,3.30345,1.09381,29.5862,33.9835,-0.320917,-2.66112,11.6149,0.996124,-0.0998639,6.1724,7.06866 +9.49,0.010959,-1.09158,-0.863297,4.36657,1.09543,29.5174,34.9794,-0.346262,-2.53447,12.6651,1.33054,-0.109165,6.09936,7.32074 +9.5,1.73404e-13,-1.0959,-0.432502,5.40364,1.07496,29.4408,35.9194,-0.37024,-2.39782,13.6654,1.6578,-0.117312,6.0214,7.56189 +9.51,-0.010959,-1.0959,5.55112e-12,6.41114,1.03376,29.3578,36.8027,-0.392757,-2.2517,14.6117,1.97656,-0.124087,5.9398,7.79227 +9.52,-0.0218748,-1.09158,0.432502,7.38597,0.973863,29.2697,37.6295,-0.413724,-2.0967,15.5003,2.28557,-0.129313,5.8559,8.01216 +9.53,-0.0327042,-1.08294,0.863297,8.32538,0.897855,29.1779,38.4012,-0.433058,-1.93342,16.3278,2.58372,-0.132856,5.77104,8.2219 +9.54,-0.0434046,-1.07004,1.29069,9.227,0.808792,29.0839,39.1197,-0.450683,-1.76251,17.0908,2.86997,-0.134633,5.68657,8.4219 +9.55,-0.0539336,-1.05291,1.71298,10.0888,0.710078,28.9892,39.788,-0.46653,-1.58465,17.7864,3.1434,-0.134609,5.60381,8.6126 +9.56,-0.0642499,-1.03162,2.12851,10.9089,0.605348,28.8951,40.4094,-0.480535,-1.40053,18.4118,3.40321,-0.132802,5.52404,8.79445 +9.57,-0.0743125,-1.00627,2.53565,11.6858,0.498338,28.8033,40.9874,-0.492644,-1.21088,18.9645,3.64866,-0.12928,5.44847,8.96785 +9.58,-0.0840819,-0.976937,2.93278,12.4181,0.392758,28.7149,41.5258,-0.502809,-1.01646,19.4424,3.87912,-0.124155,5.37824,9.13321 +9.59,-0.0935194,-0.943754,3.31833,13.1045,0.292177,28.6315,42.0281,-0.510989,-0.818022,19.8436,4.09404,-0.117583,5.3144,9.29086 +9.6,-0.102588,-0.906846,3.69078,13.7437,0.199902,28.5541,42.4978,-0.517152,-0.616358,20.1664,4.29293,-0.109758,5.25787,9.44103 +9.61,-0.111251,-0.866359,4.04867,14.3346,0.118877,28.4841,42.9376,-0.521275,-0.412262,20.4096,4.47535,-0.100902,5.20947,9.58392 +9.62,-0.119476,-0.822454,4.39059,14.8761,0.0515908,28.4224,43.35,-0.52334,-0.206539,20.5723,4.64093,-0.0912604,5.1699,9.71957 +9.63,-0.127229,-0.775302,4.71517,15.3667,6.99097e-13,28.3698,43.7365,-0.52334,-3.34177e-12,20.6539,4.78931,-0.0810964,5.13973,9.84794 +9.64,-0.13448,-0.72509,5.02115,15.8052,-0.0345301,28.3273,44.098,-0.521275,0.206539,20.6539,4.9202,-0.0706782,5.11937,9.96889 +9.65,-0.1412,-0.672017,5.30731,16.1902,-0.0512687,28.2955,44.4344,-0.517152,0.412262,20.5723,5.03328,-0.0602739,5.10913,10.0821 +9.66,-0.147363,-0.616292,5.57252,16.5202,-0.050142,28.2747,44.7447,-0.510989,0.616358,20.4096,5.12829,-0.050142,5.10913,10.1873 +9.67,-0.152944,-0.558135,5.81575,16.7935,-0.0317374,28.2654,45.0272,-0.502809,0.818022,20.1664,5.20495,-0.0405236,5.11938,10.2838 +9.68,-0.157922,-0.497774,6.03602,17.0086,0.00271351,28.2677,45.279,-0.492644,1.01646,19.8436,5.263,-0.0316352,5.13974,10.3711 +9.69,-0.162277,-0.43545,6.23246,17.1636,0.0513716,28.2816,45.4966,-0.480535,1.21088,19.4424,5.30219,-0.0236614,5.16992,10.4484 +9.7,-0.165991,-0.371407,6.40432,17.2569,0.111847,28.307,45.6758,-0.46653,1.40053,18.9645,5.32227,-0.0167492,5.20949,10.515 +9.71,-0.16905,-0.305898,6.55089,17.2868,0.181272,28.3435,45.8115,-0.450683,1.58465,18.4118,5.32301,-0.0110029,5.25789,10.5699 +9.72,-0.171441,-0.239181,6.67162,17.2516,0.256399,28.3905,45.8985,-0.433058,1.76251,17.7864,5.30418,-0.00648075,5.31443,10.6121 +9.73,-0.173157,-0.171521,6.76601,17.1498,0.333703,28.4475,45.931,-0.413724,1.93342,17.0908,5.2656,-0.00319279,5.37828,10.6407 +9.74,-0.174189,-0.103184,6.8337,16.9803,0.409503,28.5135,45.9033,-0.392757,2.0967,16.3278,5.20711,-0.00110005,5.44851,10.6545 +9.75,-0.174533,-0.0344401,6.87443,16.7419,0.480096,28.5877,45.8097,-0.37024,2.2517,15.5003,5.1286,-0.000115859,5.52408,10.6526 +9.76,-0.174189,0.0344401,6.88802,16.434,0.541885,28.6689,45.6448,-0.346262,2.39782,14.6117,5.03002,-0.000108669,5.60385,10.6338 +9.77,-0.173157,0.103184,6.87443,16.0563,0.591518,28.7558,45.4036,-0.320917,2.53447,13.6654,4.91139,-0.000906619,5.68661,10.5971 +9.78,-0.171441,0.171521,6.8337,15.6089,0.626014,28.8472,45.082,-0.294306,2.66112,12.6651,4.7728,-0.00230373,5.77108,10.5416 +9.79,-0.16905,0.239181,6.76601,15.0924,0.642888,28.9415,44.6768,-0.266533,2.77727,11.6149,4.61447,-0.00406759,5.85594,10.4663 +9.8,-0.165991,0.305898,6.67162,14.508,0.64025,29.0374,44.1856,-0.237709,2.88246,10.5189,4.43669,-0.00594818,5.93984,10.3706 +9.81,-0.162277,0.371407,6.55089,13.8575,0.616892,29.1332,43.6076,-0.207946,2.97627,9.38128,4.23991,-0.00768776,6.02144,10.2537 +9.82,-0.157922,0.43545,6.40432,13.1432,0.572349,29.2274,42.9429,-0.177363,3.05834,8.20668,4.02466,-0.00903116,6.0994,10.115 +9.83,-0.152944,0.497774,6.23246,12.3679,0.506929,29.3185,42.1933,-0.146079,3.12834,6.9997,3.79166,-0.00973627,6.17244,9.95436 +9.84,-0.147363,0.558135,6.03602,11.5352,0.421716,29.4049,41.3618,-0.11422,3.18599,5.76509,3.54172,-0.00958424,6.23934,9.77147 +9.85,-0.1412,0.616292,5.81575,10.6489,0.318541,29.4853,40.4528,-0.0819089,3.23106,4.50772,3.27581,-0.00838885,6.29897,9.56639 +9.86,-0.13448,0.672017,5.57252,9.71374,0.199923,29.5583,39.4719,-0.049275,3.26339,3.23257,2.99504,-0.00600476,6.35032,9.33935 +9.87,-0.127229,0.72509,5.30731,8.73456,0.0689809,29.6226,38.4262,-0.0164466,3.28284,1.94466,2.70063,-0.00233413,6.39251,9.09081 +9.88,-0.119476,0.775302,5.02115,7.71672,-0.0706786,29.6773,37.3233,0.0164466,3.28933,0.649074,2.39395,0.0026686,6.42481,8.82142 +9.89,-0.111251,0.822454,4.71517,6.66587,-0.215096,29.7213,36.1721,0.049275,3.28284,-0.649074,2.07644,0.0089941,6.44666,8.53209 +9.9,-0.102588,0.866359,4.39059,5.58788,-0.360106,29.754,34.9817,0.0819089,3.26339,-1.94466,1.74966,0.0165778,6.45768,8.22392 +9.91,-0.0935194,0.906846,4.04867,4.48875,-0.501494,29.7748,33.762,0.11422,3.23106,-3.23257,1.41525,0.0253016,6.45768,7.89823 +9.92,-0.0840819,0.943754,3.69078,3.37454,-0.635154,29.7833,32.5227,0.146079,3.18599,-4.50772,1.07488,0.0349982,6.44665,7.55653 +9.93,-0.0743125,0.976937,3.31833,2.25126,-0.75724,29.7796,31.2736,0.177363,3.12834,-5.76509,0.730274,0.045457,6.4248,7.20053 +9.94,-0.0642499,1.00627,2.93278,1.12479,-0.864308,29.7636,30.0241,0.207946,3.05834,-6.9997,0.38317,0.056432,6.39249,6.83209 +9.95,-0.0539336,1.03162,2.53565,0.00082089,-0.95344,29.7357,28.783,0.237709,2.97627,-8.20668,0.035296,0.0676508,6.3503,6.45324 +9.96,-0.0434046,1.05291,2.12851,-1.11521,-1.02234,29.6963,27.5587,0.266533,2.88246,-9.38128,-0.311642,0.0788245,6.29894,6.06612 +9.97,-0.0327042,1.07004,1.71298,-2.21822,-1.06941,29.6462,26.3586,0.294306,2.77727,-10.5189,-0.655982,0.0896588,6.2393,5.67298 +9.98,-0.0218748,1.08294,1.29069,-3.30345,-1.09381,29.5862,25.189,0.320917,2.66112,-11.6149,-0.996124,0.0998639,6.1724,5.27614 +9.99,-0.010959,1.09158,0.863297,-4.36657,-1.09543,29.5174,24.0554,0.346262,2.53447,-12.6651,-1.33054,0.109165,6.09936,4.87798 +10,-1.85207e-13,1.0959,0.432502,-5.40364,-1.07496,29.4408,22.9622,0.37024,2.39782,-13.6654,-1.6578,0.117312,6.0214,4.48091 diff --git a/control/Testing/outputAnalysis.py b/control/Testing/outputAnalysis.py new file mode 100644 index 0000000..85c2d09 --- /dev/null +++ b/control/Testing/outputAnalysis.py @@ -0,0 +1,99 @@ +import pandas as pd +import matplotlib.pyplot as plt +import os + +# Get the absolute path for the script directory +script_dir = os.path.dirname(os.path.abspath(__file__)) +csv_path = os.path.join(script_dir, "log_output.csv") + +# Load the CSV log +df = pd.read_csv(csv_path) + +# Skip the first 200ms of data to avoid the initial spike +df = df[df["time"] > 0.2].reset_index(drop=True) + +# Hip Figure +fig_hip, axs_hip = plt.subplots(4, 1, figsize=(10, 8)) +fig_hip.suptitle("Hip Joint Data", fontsize=16) + +axs_hip[0].plot(df["time"], df["hip_angle"], color='blue') +axs_hip[0].set_title("Hip Angle (rad)") +axs_hip[0].set_ylabel("rad") + +axs_hip[1].plot(df["time"], df["hip_velocity"], color='green') +axs_hip[1].set_title("Hip Velocity (rad/s)") +axs_hip[1].set_ylabel("rad/s") + +axs_hip[2].plot(df["time"], df["hip_acceleration"], color='orange') +axs_hip[2].set_title("Hip Acceleration (rad/s²)") +axs_hip[2].set_ylabel("rad/s²") + +axs_hip[3].plot(df["time"], df["hip_torque"], color='red') +axs_hip[3].set_title("Hip Torque (Nm)") +axs_hip[3].set_ylabel("Nm") +axs_hip[3].set_xlabel("Time (s)") + +for ax in axs_hip: + ax.grid(True) + +fig_hip.tight_layout(rect=[0, 0.03, 1, 0.95]) + +# Knee Figure +fig_knee, axs_knee = plt.subplots(4, 1, figsize=(10, 8)) +fig_knee.suptitle("Knee Joint Data", fontsize=16) + +axs_knee[0].plot(df["time"], df["knee_angle"], color='blue') +axs_knee[0].set_title("Knee Angle (rad)") +axs_knee[0].set_ylabel("rad") + +axs_knee[1].plot(df["time"], df["knee_velocity"], color='green') +axs_knee[1].set_title("Knee Velocity (rad/s)") +axs_knee[1].set_ylabel("rad/s") + +axs_knee[2].plot(df["time"], df["knee_acceleration"], color='orange') +axs_knee[2].set_title("Knee Acceleration (rad/s²)") +axs_knee[2].set_ylabel("rad/s²") + +axs_knee[3].plot(df["time"], df["knee_torque"], color='red') +axs_knee[3].set_title("Knee Torque (Nm)") +axs_knee[3].set_ylabel("Nm") +axs_knee[3].set_xlabel("Time (s)") + +for ax in axs_knee: + ax.grid(True) + +fig_knee.tight_layout(rect=[0, 0.03, 1, 0.95]) + +# Torque Components +# (Mass Matrix * acceleration) +# Correalis +# Gravity compensation +fig_torque, axs_torque = plt.subplots(2, 1, figsize=(10, 6)) +fig_torque.suptitle("Torque Component Breakdown", fontsize=16) + +# Hip torque breakdown +axs_torque[0].plot(df["time"], df["hip_m_acc"], label="M * acc", color="purple") +axs_torque[0].plot(df["time"], df["hip_c_vel"], label="C * vel", color="orange") +axs_torque[0].plot(df["time"], df["hip_g"], label="Gravity", color="green") +axs_torque[0].plot(df["time"], df["hip_torque"], label="Total Torque", color="red", linestyle="--") +axs_torque[0].set_title("Hip Torque Components") +axs_torque[0].set_ylabel("Nm") +axs_torque[0].legend() +axs_torque[0].grid(True) + +# Knee torque breakdown +axs_torque[1].plot(df["time"], df["knee_m_acc"], label="M * acc", color="purple") +axs_torque[1].plot(df["time"], df["knee_c_vel"], label="C * vel", color="orange") +axs_torque[1].plot(df["time"], df["knee_g"], label="Gravity", color="green") +axs_torque[1].plot(df["time"], df["knee_torque"], label="Total Torque", color="red", linestyle="--") +axs_torque[1].set_title("Knee Torque Components") +axs_torque[1].set_ylabel("Nm") +axs_torque[1].set_xlabel("Time (s)") +axs_torque[1].legend() +axs_torque[1].grid(True) + +fig_torque.tight_layout(rect=[0, 0.03, 1, 0.95]) + +# Show all figures +plt.show() + diff --git a/control/Torque_Controller/TorqueController.cpp b/control/Torque_Controller/TorqueController.cpp new file mode 100644 index 0000000..14bcb8d --- /dev/null +++ b/control/Torque_Controller/TorqueController.cpp @@ -0,0 +1,65 @@ +/* + * Computes the desired assistive torques for the hip and knee joints based on + * joint angles, velocities, accelerations, and a Mass Matrix + * + * The torque is calculated using: + * T = M(acceleration) * q̈ + C(velocity) * G(angle) + * + * Model derivation and justification are provided in the "Exoskeleton System Controller" document + */ + +#include "TorqueController.h" +#include +#include + +TorqueController::TorqueController(const ModelParameters& p) : params(p) {} + +void TorqueController::computeTorque(const JointState& hip, const JointState& knee, double& hip_torque, double& knee_torque, double& hip_m_acc, double& hip_c_vel, double& hip_g, double& knee_m_acc, double& knee_c_vel, double& knee_g) { + std::array, 2> M, C; + std::array G; + + computeMassMatrix(hip.angle, knee.angle, M); + computeCoriolisMatrix(hip.angle, knee.angle, hip.velocity, knee.velocity, C); + computeGravityVector(hip.angle, knee.angle, G); + + std::array acc = { hip.acceleration, knee.acceleration }; + std::array vel = { hip.velocity, knee.velocity }; + + // Compute each torque component + hip_m_acc = M[0][0]*acc[0] + M[0][1]*acc[1]; + hip_c_vel = C[0][0]*vel[0] + C[0][1]*vel[1]; + hip_g = G[0]; + + knee_m_acc = M[1][0]*acc[0] + M[1][1]*acc[1]; + knee_c_vel = C[1][0]*vel[0] + C[1][1]*vel[1]; + knee_g = G[1]; + + // Total torque + hip_torque = hip_m_acc + hip_c_vel + hip_g; + knee_torque = knee_m_acc + knee_c_vel + knee_g; +} + +void TorqueController::computeMassMatrix(double q1, double q2, std::array, 2>& M) { + const auto& p = params; + M[0][0] = p.m1 * p.r1 * p.r1 + p.I1 + p.m2 * (p.L1 * p.L1 + p.r2 * p.r2 + 2 * p.L1 * p.r2 * std::cos(q2)); + M[0][1] = p.m2 * (p.L1 * p.r2 * std::cos(q2) + p.r2 * p.r2) + p.I1; + M[1][0] = M[0][1]; + M[1][1] = p.m2 * p.r2 * p.r2 + p.I2; +} + +void TorqueController::computeCoriolisMatrix(double q1, double q2, double dq1, double dq2, std::array, 2>& C) { + const auto& p = params; + double s = std::sin(q2); + double term = p.m2 * p.L1 * p.r2 * s; + + C[0][0] = -term * dq2; + C[0][1] = -term * dq1 - term * dq2; + C[1][0] = term * dq1; + C[1][1] = 0; +} + +void TorqueController::computeGravityVector(double q1, double q2, std::array& G) { + const auto& p = params; + G[0] = p.m1 * p.g * p.r1 * std::cos(q1) + p.m2 * p.g * (p.L1 * std::cos(q1) + p.r2 * std::cos(q1 + q2)); + G[1] = p.m2 * p.g * p.r2 * std::cos(q1 + q2); +} diff --git a/control/Torque_Controller/TorqueController.h b/control/Torque_Controller/TorqueController.h new file mode 100644 index 0000000..9d12ee9 --- /dev/null +++ b/control/Torque_Controller/TorqueController.h @@ -0,0 +1,43 @@ +#include + +class TorqueController { +public: + struct JointState { + double angle; + double velocity; + double acceleration; + }; + + /* + * ModelParameters + * ---------------- + * Physical parameters of the limb segments + * + * m1 - Mass of thigh + * m2 - Mass of shank + * L1 - Length of thigh + * L2 - Length of shank + * r1 - Distance from hip joint to COM of thigh + * r2 - Distance from knee joint to COM of shank + * I1 - Moment of inertia of thigh about COM + * I2 - Moment of inertia of shank about COM + * g - Gravity constant + */ + struct ModelParameters { + double m1, m2; + double L1, L2; + double r1, r2; + double I1, I2; + double g; + }; + + TorqueController(const ModelParameters& params); + void computeTorque(const JointState& hip, const JointState& knee, double& hip_torque, double& knee_torque, double& hip_m_acc, double& hip_c_vel, double& hip_g, double& knee_m_acc, double& knee_c_vel, double& knee_g); + +private: + ModelParameters params; + void computeMassMatrix(double q1, double q2, std::array, 2>& M); + void computeCoriolisMatrix(double q1, double q2, double dq1, double dq2, std::array, 2>& C); + void computeGravityVector(double q1, double q2, std::array& G); +}; + diff --git a/control/exo_control_test b/control/exo_control_test new file mode 100755 index 0000000000000000000000000000000000000000..2b542195c05eb18f410e5d3c00af0f5b79bc261a GIT binary patch literal 39288 zcmeHwdwg6~wf~uhgGD(wZJCYa4q@-#z zkVZ1ZXna@UN<_WZ$GzsKDDhE9DbgTbiC#a~U=ib!6R8jpueqr7_xW(MFBVJ2+mZqhdF3^+ zG01NZ>oUYMGQ|lxoG=z^Nw)52NoRTGJyWLT-76(*Y%>&#JeW-VVzER+A{lGkxw9pn zgjlb<&n?&TY@LW{cl-AmJ0Wo_wyUNl7H_MGHzi}q>K$Hr2SnaJ5kl;g=Me{eYFd)b ziH2Qi`R@L>{3@;Av(l-=&YxE{w|b+TnKejS2^5R0u{Rk!>is;_Tsu#0KC*$A=73pui!df9SpGWF8)$A)#A)|+eBY3mzCmFNX|>L+pAIt?ku zDXYXVIszo2TtAGtL~#FB$OonmEI{bqZWvD?4%8dQ?#m5hu4cj2Fy1X;72<;kmm=i* zP2OY}W)9++$O|IOL%6cFrTNOb#EvU#_tw<{^LG{k_4shh*UXFmW7$>r)_>-bcmHvD z`(oq;5pv(wp;A$Hz82{z*YA&%nLA&HGfw9p-%p zeEu%pyvMgAUswjM*_i*O`U9wS66!~LB39IQ#5xD0lsTaId(43g2f*Ap8T5C}XAM-j z5Gtq4{_$cv0|116WOk?mJsTlu7_i$d8`}3-Phz-rn|CYu8+y#XXwOCz+XBwk19zBr zgJW>5|Ndd?Ez~#F)dnM~ve6!uhSVXnbI6(rJ=2YQmr}*qj{DhY%ZEaWd;B_!|Ui|TgG6E(G4kcq}zNf+Sxu~_`A+P z{i+XB=H&Q6 z>!APsEsvr5_D53(n_znDPBoTPTDL`cj&-ljrbk6n52M0CYn5(Ehi%yo)IR9nx0HfC zwI4CNQN1yK9%n5x(KvwDq73&$`pt1HKBRziq1v#j8;{G5> zJs@=-Vp;$FkEFU;TrqYq<-dPObaIUs(I?tjX81okWDf%Wxoh3yDb@Nso7dC&yj6r5 zBGWog`>e+=gCY;&vQy8$w)~#R0%@?@9=M;lCueO#^dVdu_l7D|g~{A`Kj7JJK!Jux5L#4g6*uVAdEf^7R!U)7hee@}D)MmqG^h;f8;k7=O|S^8(| zlfwO|xAmE5@0LGUT#Z1c3(cR ztD4`+1a9f$dLD%?G0CCPwY6+{j{Za$PTW@+{*P(b)xGLJw*!>y`@v1f#O*quOJ&Pj zPdWx$=MkUP$h7tm*LX>f&;0g)%Ct$g{5=E)5s zRjjQ>f3Nu)7gX8ym_i?zX(8H>H9k`9e@nGa_LzTrlR24dz8J(!;<(#?B9U$kpZ3Xa z^Dh_!TzcUi+CFS8yO`=C!N)3e{)jZ7eZ+r%>t8HB#&w%VbS8MLYf=6V^N60uBD{_3 zRmoV&e1bx)MOxsP^&^bA9PN$vl&-_-!5ZZ9Gd=vX#&f`_Z~NpO8=>|r|NVbFUS5`- zL$k(*JwM(OoQo;)o6Z`%^F_vgf0{1FuCx0m_y8A()*U3m8B-X~SUtZNbC%u1uwT(} zY;H&o_t2o)7LzISdFvW-a=bnQ*YM2GT)%7im%8Pji+RE+{|ou${~ltM{KQo9zt2(` z{U3O(TmH5A<=&+Wzpu z3F|35jbhMDM0?Np4es&L&O@Mc>|mD5JwK=UtuI5kE}7*I%06GFY$Yi-{n4rUm3~K9 zhLdyhf{d_zszLI6B>Jp~Uxos`rRy;YtV7S)ntA*G)?-aYDA!Z;FpKwa;K9KT4*s3h zbg3xS6~u%Q9Xz+|>9-Dk`uqrqcVvjxXa6YAMoMH_E|o&XXFLQ8?({D@5A`Tvx*{ipxVL9zu9PKSiG6i4KDp?0-lTfsY!eIBF zjg!&k!~U+NP!elR_DXtA>m5SdQeEF=HwgE8!9D)KO!Ww@%tuY%08R1m-Mat%W+zi)(ca!RB{CXBvO^~qAla>x0VMl$628;BUnS{9 zGE%CT(fcvou3px$p;yV@(A(P&WYyYT5$#z~4hMkiUWm!V`pPrPm?Igb4>C=qDaEqR zMcGu>u!GJt*#C4s*y}a>kb}%L+1Wbli<*7VL1!B5hsnMO?8?ey;83$Y`)18I;NW8# ze7)rRpFbd->N?;cGp(es+Qpi^-$7>@?3>7bpJw0hATv$&-DLk0cD5nD&p~Gz?0&Mh zY4&ahnQ5}qH?4a$dxwM0G}uQlqO9ebz0E;pn(V5pS~Yu~srjsb;To(3uANX0m@rvu|^dnI=0O%=!x+A0fWnL1!B5uO$1sHG9-SW}58EUj{XM z#6f2o>_0gV>?<^TnS;zU+3CC1Ud}_O!vt}Q2(3uAN^<+Q%d!$ocqYg6D zWLG2g_*ts$BMv&#V1FIi_krCWslB{mlTqIsx2YQg(?_~4hbD6jNa{TpLK63I=2-t$ zkiO}veCvBY$r%6eB#QNP4Y4%l8CH**pPF-6eUHilWk{i-3ornkcS^oLz+IPA>ltj| zSbNb9@A{_mSOn`PENNONQd^Ei^<(Eq^wuN&P{UeRND=KLxDUSvE{8kY%;n6X*C<%2=7Fo^jKg5o89QsqE(gJ{wuj zaaDzt1J|N_Zc^Q%2J#6cob|Mvo3;wbomup|4A!Cv3Mp#JtK%m z<;ii>dYiNOY!>JC@y*B`=SI7AyJj2)Bdh>Ml7Ea0 z|F8p|!%MFSqS_|1V3}?^+P8I$e2B=yzv3G-N^j|xFqWG+VDlc+Qkx=O3j;v&5dGf3~MM@6eUoa4*nD~)W(^&zg1te zzip@7KK?u&u^jtxE_+zFC_}&(dd|3<4LtGlR4}c-y?;ghZQU_&bj{Qq$-*|Yuhp{f zX290iwLfF~X3rU)r>E)aPh>B+?ccFzg5j*_k&bSN=Fht9S**gjpK8fwsIq5w?FLtG*usVQ+l>g z%(K>Gjyi)`?WJD2+|`&^3>&r|per=0iU5&3(##_VcM# z!6!~NKS+BEAS_3FzcW7l_HutSmp)GWXn&fp@WP$-D|grXv8q?c`22NOdgBnSQV;yu zpkq+k-?i z5=Yzb<-h=O2*d+w{|v+f))o@$?|uA{UyT2J)c=Wed#iG`*X_?*|B4gn5BnU&ZlT@Z zX?@e}r@!ZEf9J7Kro6hRj6&-PK8v79V`$Ep^%1oPVvZgygOm^r-T|t;pA!VXniEj= zDGL)B_$H3l^JSmvQg?sq`W7cQti71Rds{~=?jL9w5pR8Z zzH{C$UPAvKz2s;a?C#tTnnwGnBVK#GJnd(FnfBxP(0IJ)e=++#`H0g1e%M?a00wvH zE92eK-?aY(?1?_WChQR|?h-?h)qX<_IX%UV$@>U&u<8|O`%lT9(d_Y(v8Ng@yqDOj zj9F!9F7z6ap)zV+%?z#)aJK-3v;ByBUdY-0eDeX;M=z~C&iP8Ospyvz)=I8{vGEJt zEbBH70GYGwjeY%oL7jJ?hpyG*!Hc76Lmuq!^^8xwR>1xz*Gqc;vqY^~Ue5hb%2wk( ztzX(csNZ^&&B{-wUs;*`Pt5ps;T-dA&x$zj;Ju|cV>DWaer`+7cmLG3hR?3JLi24R zUy6J^D_)_pu#tZdr=5Dt=TqiyIxU}n9|w!NZ}l*vz`t*~E2GfAk5lsaM!FK0R(ydO zjP@37zK|K%!zrp_DpfqLmM_jCE7L_*ND)5ngpXVOP+@$Fwp7mfO#2(!k9YrQ|7Y=1 z%{uf%{`O0G+?&+?H|J*E|NGeL6R+3O{3qW3PS5)ANpTqvH#HtFGv5MPa~`TXDV0!FH09$Aw}%|M?Ag$hXbSi zzsIf1I`p%A?YGZs2f7Q(e0QSvrTTrY8tZUt{o{H8JEi6% z_7`}WUvv$gtKI7^L0mSz3sjA7>_eU#Sp?mgdoBK zgv@P_x8c;rF&vn}p{b3y^>XStIH?yk=#K!|EyNfgtpnCK3Mnr)9TOGGl@|-cHgfb? zhl}!a^tN_b=g(3al9hI!-^J5TB0^`VvrSq!y8&-593@o7Zf5kh52&+3i;E#Jbws7# zf;8Jeu3}Y49iURQOC7X;Q@|goQR>M3Fr8t|aFjAK5;XBCl!W+R5)i8@5Pyu~@S+B~ z@$JqwwQhk5m;u`RRNWuYRjBkmT8PpysB2&Y743Zv+CoJW0UNadtwxoj)PjrzO+({-~0m4smjEuv`c zBH;sCf)@7~N3l>wgeLCO#9k7pKI@?Rl;=@DXq#AbUaIR*n!MRjMY*mbZR0mMXxkL6 zy-!Q9=(@He{1w1%Xfz{2mwZwadr6>{tb598wf4aaj#8x?>w- zSYO3sLPt9l9gdC z*F}P;of%js=|mKDX_uye{gSIjrP*(zfX!tmqMUjtFbb73?0r(MXaKVvtCRBAMQ9_l z8x`Yh#WHQ6Eri?qaM`%uzYwMfnEl}S3EKW&PN4@dgN>;^zZClzwwJycX|f!EV49ST z(pnGN$X)pWOIy~rHQ$y2|3b2;)1gebTLcBR{Yd1vEi{zY<}Oa0wl94ZfZ~RAi zXOZ{oA}BT=d!=ZTc9$)>jA~#)qztXZ9bmD_nxXv-Kb+ehI>5UJb<`p|ZLO458DuQiz!Db@+y&&W~ze4R3aIY^$t zol*aLhN9m>mHc%?!^6mFfR(OekIkox$$`*~1)0vRMw;yXRC#JS0csoAh}y2(ILg|F zvudMaYSLzf2htTj!5gXFfBcAv6&*;|NEIP^zBxb+-B(}KEUK?~>X;nxD>|TEl?xY>ucgd68jVpo{z5nh$<0?GjBV&>icoo2=fFubS4l}f$M&U@N=*{f%s8`w4H}w z5e`^L{HEvlh0W^vZgu7Q;rNB! z>UxK|zF%Fr{=j!Qc*r<@+&9m_TaL4fmKo=jOatE;_FZ(=>_-ZGmwde7X9d0o3a&Pc z_Z1dlVc1i+)G!Ve7Cm0*d$d`RMWD@NG9szm+wwA#UQ>;r}o6_ z8fy~Cy*j(5CSDhBu1+Qz8&pPpth%N~rD|d*sZzVtHQCsFb8Gzan;PPAk*1Pqahl+i zr*gDFmDCbda+j8)WzI3)f)9OLcE@Xj;m{Q=aeM_^8-yK_i{=>7L{qR*)%?bwF?&5K z&%imx<;I-4c=aAM++~l9mDbhPWo#5)6s%TOo3nUPFy7n@V$;DX8lOkp)+*t^DhGuZ!Hi_Ni+YyzSwY8jr7xw_H)S`Ow%(!+7Uf z7X8#G`Fl;|r=M+FG3TdqBe)>-vz2RK_`}mf%YU)*@Shjn@WBVax6*&tl6&r5HoWq- zUme;1osSQ!ytqF#@XPV8mG*hba9BHw(%+#8ldED)sbEBBE@#tqp>Rm)uR*DsF~XS( z)2I4o@&d%f3k4(M*?He&M1ODj6@U#0f8a(pe#FjS5YL*U*tHB`Jv{G?_>>j#*@(xm zYgB@`AG=^{5szROk>6v7u&FeNxDW9#F*X@1K@VWNybbZd8w}%Bm^b^+$Ll!6Sdihn z%~u;$x>DZ&;(koSBL#+U0&$?o@HOGJ{m^W~7ed`wm;0*b0wV;m)73H0@C{+7uOEAn z_)ydrISYAbp)3s0barOG*W!5%bm*Bq&;juZQwQc_VXb1U?p2J3FcqsC6X-C7!ca%W zP)Eg3Ma57@#ZX7Z*oajzUp-Pj-w`o}$y5xJsTihGF>ZY-<~La^$0jl6D=Nm=ZddW^ zB!0cbXfl3*4)!@?9CT7K-%t?q)fnTT#OFzjuD~zQfv!+7eTDc!i7!%dutP<-G_7JP zU<@cl1ICEN=suOtzEh-fYQ{lc)Nja^cL^cnNvuCs4j7?Jb-r<# zj%|5EdE^C@eCQ|TM>GrfQVgE^A!{zegi@i!dDP(^clYA5#EE%i{}w;EHr$>2qiNN-`5Z>#b(Aw5ne<% zXC^i)5SkF~Lclh?4_oQJ_aHopU=$m^cOd)(p_Di)Cds=IMi3^kOA(80(SK-ebG)UsJ`Q~Sru7xcC9zm|DK;Cc>*C8> zTjH^u)iv>?xp`AXD7H9JYdVXSB^p~|JE~jaOLxVSU@`Y7s+JKBCwC`WV#(dj@#@;; zEp_pDQ*38rv$=Wwri$3on%&Kf4UJ{Bt$G)8T^lk>ReIfqy0D25vVSIjPQi;&WugXu zwvd0tZ(R*I!(nX2Hpi09)rn-wx*F3&-ty`?wgQ`#%rKYgze{M=*PODbwPANdmuP)< zChFolT6gAF$Si4WiZ__$>ucWOtbbapYfh%VJW3{DwRm-X9wnPw%*}}$`ZZ3;wX`MP zkZj%yH8)o*iJdHa9)+i_dhOzzT`@INU5i=k&~iylqQU83B{kTJcV?8#Ll=gqu zDDfzs9u!M3lJF-mF+gf};16O}<4-#BFGVJ5>StSR2y(%4X4hu0^u zJs}orNmkd~6sy^N6K1zWojYe&Yjrc+qo%RNz+W9rB#l^oyuPMsuMulWG~kkKu8Sj% zT@OQqL)4x z`o`jm8Qv6o35_SuC5&fQYRL& z2(~;`b$9wGuOG)WuxX2YUiz^AsVe-sk2MaeA~x93I1{?-l4_yt0#S@35Tv}Of)3b z%Mi0-acpxf=BVs{c(=PuxHqB$H&)~3(q`7y;=ZTuh^5ud&DDF?ZK?>z*41vPUyM77 zz8aq^Kyw?Q!pKcfAtXYsZpI6)K;m7&zVHC(!}u{K^;UX6ED&?#@HR&R$^)om5=hL*QaJYTe|rnR{l1IRR9C|X0_j+twX zkKzv+_NzJ%;7YAAcT;Ul)mm@Enu(dloB7O4w3V*fM_0{mYyYh5wtjwAp)o}JjODUV zt?`pAo?7GaSw?|s-Ir$Jp0d%vVz8jB-gtiIa-+K#DpW#T2Zy~qGkmt#9;*jHA0T~V zGcE(0QHXXME@s>R6U31U=JV25A*LNGW|7~jBEK)@VEy-Ed*tmg4i~R6eq6lPcoxiK z9IPG6{h;4gc})%Gf1O>5j8%?T%gDTEwow!|CT7UX$pbT&YDWkg`->efGCOCl4|_Z< zYe z`{$vz@uIOHX52Nez8d$fZ_b-IvneuB7z*~!2nCyhp+J!9>+%p1!9buq6buCeOauWt zd>{p@s;Yv)2yiGgHh-*O#21PnGZ-lkmLr7%kx+Rs0AZm3Fle|0R1w61faWBZ5`hH7 zqcT=UPKfO*9-7fnI93p3Q*OdN?i^o-F@_hb=rdzbFyA#3pN|))r1PCKafRTB;5!BL zT{P*hL;G1C?}8P+Meu;&PYWIq{Dj~L44sp-uXT;LU=^1P=%f!49ndS;6IkUxSBpRlnf%g8KyT5zMm*3;xbeLNFEd=Xyc ztM=eUJ#mlVNKoTZn=bfFyzpoFF~M&aY@Dade@JkZ;Ku}a2%e3D0^}bOTq8KZy$saf zB{(Gb=Yl%~ufhQX@(&2UUGRip{+SrkgE&|~dGA6yiOU5)FStYS3bdQ_e!<;>#{?e} z9KZnu$}2~^S-wi}e!(4r9~0as_-wS3<%a|(1dj>+wczp#wfq%m2g~yy1ncV(+$Z>H z!9#*g=*jZ@L*gudui%j2rKpGWCc&M8`vs2(9!9NhZUhorwZxsBz;F|@{c$1d5PcY9x zQT`_c^E?#smjssx{;uHNf*%vyCiqu^`vm`4aKGT<%XRw(1ixPJZvWZNE%VW1A?)wtN8l_CvCh)m;bQf zD#2eC92ESJ;EpSG`PagL)TeKW#&N;r%QXJ7;E_^|kK1(N4;5bir}KBZAum4+!oN+$Z?cg2zN(eqKm>7}7t-h-X8u)w=!{1vjnIc>YXH=Xo=- z{fpospbjj<|ss^^dO7xI?i0|E_#Q@ItBoZo%DB z{;R~k03>Pt!wO?O&C>W0VAKOI)xXCzX4U$q%cU{DFaSv7TRiwd51v)*F2CA?Z}H%- zc<`@0_&nIcS^stq{;&rh@!+3&u;sx9eBCJ@uV`HOS`WU-gKziX`#gBqga7Wq7tD3n zx5y;V{BO2;W0^7~u%QFv24U-$(c%!ea;{2)xJq7~#JVeui)q;R%GFBa9*Z z3gOoXzd`sd!tW4Hw%$j<`vZjkM98PZPeA)A!YIPy2wt6jfxIzi@>0_8vYZvDT{v&awcMr7%H+0GRwg&HRHk!_#jUlA;!@j5 z@#yU&WfXVi=BzrSy0dKhJ(25Vzx{G%lXt_*)-<6w>NOh>T_(FQ+TF8j_q@20kwOd+ZeVC zRV24H(nYvE?v_R!V<5943opUDU%z+%|w579juj_P1C50=p1XN@TsBj3V@CewN zC17i|fUOPzTU`ROx4&a*%lq{CmT>r_j>@EORB||AT8C6lpKr-`s78**savD- zxGaQYe>h~3eW1_e3B*`frlPd}SH?`UVrdM=>Ub*>VT(&*XhIU_dvFAz1}7l!)*c^0 zH`K%(mE=4&n7fwBSY?RyEJHmNB{7~ova9kQJY0&iLA#Q>GxhMqpDHgWE3;aVv#~N| z)a=>ekfhfZ;z~Hq*i>Ds4wdN-$1?@YK4}3N3!dbPtI{csBaxl;7EEz-GlBjig zmCF}O)8}DvvNQh))Y29ViUx-ca7}d-O@__MEf!q;`!XD^Ex{?YYKM}}mgcv|%g~O+ zj!NC_;L$uBENhOpw8U#M>=MmtiaM#aRcQ3)9 z7IRo>DvjL7!#5;w=6px^rB~q+ORxM57!4UG*rpq|*1sIH48cCKS>m||W0p6Xo^ zVBBP5th%4Ynh(&k#M4;nmgWGbH_;llr*8{`M(duym?w(o2zii@Wp_0%jbi8}{HsCVl{d`8-$lqHsRK;(UZ9AY8rS+SRKz z;0uM;9kF$4e{4}rQxgbjJ*W2x2sSjm-!SF=&MVW#+~0Pg8%%Rg?vKIbfyANR^u8CP zNY|<=!6{7lw?kNXdQJ6g*t`T493yw#si`1azLk4Iu?9TW+AH;wYQPD{RsQ9R_pzIg zlAaOmS-X_8NcMwCX3El&NqQLNt^0&ptFNUp-eyj-X6epdj@w#ZM{UFRBBr^6&Kink zzF8DEWp+tyU1c~{nSPSht((5fl)N+E?7V9@mwqCpZaSLAH^IX87nB?hQ)*p0mDb@U z_Q#ocLUpb_Fq=B9aH20aL0^(q3CG5vlOC0N4u-mTw1M$t55Q%)6So-xwM8>g_fAKOt1f=`DE;*gPrkAM)+8XC( z%jWfX#>GC8ns?oGoWLd&SBh^i8ypTVk037R2$!Z6-BVrH8gE(GW=>-qO`~?#J)|w? zJ!JYr+c~qX^9pkt=46epTpvR}GtOv3)6DJ=^vW{llVVmgASL@dY|3)m1XbB)QJ=&) z@7V4(Wz3yd^mICV8e&`;dMCoX+PYk7I<+`&?i_8?lRVwoG_R2`vP-0{+!LqU>|s2! zrH2RS?`e-@?M$eQU(vffidzG&12T|TIlNSOao7_UT{rP-n+p`igbFuSER>;Fa7SWtYn)B{^2#F zGT@YV8n+75wp1RUI7u5h-a@en-lgL7#`Lsxci;0*wz^ykoGF%x;gSaY8JA}KWt6%^ zJ^v0$n>j`4#c+kX#13o%#Jp^3Tu;H8{uVyu{uVyrT);Ztk_vNRWd^=eJL z2^&b&JL=*g! Date: Tue, 1 Apr 2025 16:25:07 -0400 Subject: [PATCH 3/3] Saving changes before swithing remote Integrate IMU joint anle input into torque controller - Replaced sinusoidal test angles with real data from AI team (JSON) - Added IMUDataLoader directory to load and preprocess Right Knee joint angles - JointEstimator now supports variable dt from IMU timestamps - Skipped noisy samples with dt < 10ms to avoid torque spikes - Updated ActiveState.cpp to run a 120 second test for real data TODO: - Add support for AI-predicted hip angles (currently using simulated sine wave) - Think about how to handle the knee angle normalization: - Currently we assume min roll = full extension (0 rad), but that may not be correct --- .../FSM_general_controller/ActiveState.cpp | 54 +- control/IMU_DataLoader/IMUDataLoader.cpp | 90 + control/IMU_DataLoader/IMUDataLoader.h | 20 + control/IMU_DataLoader/json.hpp | 24765 ++++++++++++++++ control/Joint_Estimator/JointEstimator.cpp | 43 +- control/Joint_Estimator/JointEstimator.h | 10 +- control/Makefile | 5 +- control/Testing/log_output.csv | 2191 +- control/Testing/outputAnalysis.py | 2 +- control/exo_control_test | Bin 39288 -> 774240 bytes control/joint_data.json | 3018 ++ 11 files changed, 29157 insertions(+), 1041 deletions(-) create mode 100644 control/IMU_DataLoader/IMUDataLoader.cpp create mode 100644 control/IMU_DataLoader/IMUDataLoader.h create mode 100644 control/IMU_DataLoader/json.hpp create mode 100644 control/joint_data.json diff --git a/control/FSM_general_controller/ActiveState.cpp b/control/FSM_general_controller/ActiveState.cpp index 8b0f12b..2eaee78 100644 --- a/control/FSM_general_controller/ActiveState.cpp +++ b/control/FSM_general_controller/ActiveState.cpp @@ -2,6 +2,8 @@ #include #include "../Joint_Estimator/JointEstimator.h" #include "../Torque_Controller/TorqueController.h" +#include "../IMU_DataLoader/IMUDataLoader.h" +using namespace IMUDataLoader; #include #include @@ -36,12 +38,23 @@ void ActiveState::update() .g = 9.81 }; - double dt = 0.01; // 10 ms loop - double t = 0.0; - TorqueController controller(params); - JointEstimator hip_estimator(dt); - JointEstimator knee_estimator(dt); + + // Load IMU Data + JointData knee_data = loadJointData("joint_data.json", "Right Knee"); + const std::vector& timestamps = knee_data.timestamps; + const std::vector& knee_angles = knee_data.angles_rad; + + // These variables are only for testing purposes + // We want to see how the coriolis and gravity term affect the torque output + double hip_m_acc, hip_c_vel, hip_g; + double knee_m_acc, knee_c_vel, knee_g; + + JointEstimator hip_estimator; + JointEstimator knee_estimator; + + hip_estimator.prime((10.0 * M_PI / 180.0) * std::sin(2 * M_PI * 1.0 * timestamps[0])); + knee_estimator.prime(knee_angles[0]); //Setup logging std::ofstream log("Testing/log_output.csv"); @@ -51,30 +64,30 @@ void ActiveState::update() "knee_m_acc,knee_c_vel,knee_g,knee_torque\n"; ///////////////////////////////////////////////////////////////////////////// - while (true) - { + for (size_t i = 1; i < knee_angles.size(); ++i) + { + double t = timestamps[i]; + double dt = timestamps[i] - timestamps[i - 1]; // Run simulation for 10 seconds for testing purposes (TODO: maybe create a non-blocking keyboard interrupt to change states) - if (t >= 10.0) { - std::cout << "Finished 10-second test.\n"; + if (t >= 120.0) { + std::cout << "Finished 120-second test.\n"; leave(); current = idle; return; } - // Simulated joint angles (TODO: replace with AI later) - // make sure angle is in RADIANS!! double hip_angle = (10.0 * M_PI / 180.0) * std::sin(2 * M_PI * 1.0 * t); - double knee_angle = (30.0 * M_PI / 180.0) * std::sin(2 * M_PI * 1.0 * t + M_PI / 4); + double knee_angle = knee_angles[i]; - // These variables are only for testing purposes - // We want to see how the coriolis and gravity term affect the torque output - double hip_m_acc, hip_c_vel, hip_g; - double knee_m_acc, knee_c_vel, knee_g; + // Simulated joint angles (TODO: replace with AI later) + // make sure angle is in RADIANS!! + // double hip_angle = (10.0 * M_PI / 180.0) * std::sin(2 * M_PI * 1.0 * t); + // double knee_angle = (20.0 * M_PI / 180.0) * std::sin(2 * M_PI * 1.0 * t + M_PI / 4); // Update speed, acceleration estimator - hip_estimator.update(hip_angle); - knee_estimator.update(knee_angle); + hip_estimator.update(hip_angle, dt); + knee_estimator.update(knee_angle, dt); TorqueController::JointState hip = { .angle = hip_angle, @@ -98,7 +111,7 @@ void ActiveState::update() ); // Output to console for now (TODO: replace with motor command) - std::cout << "Hip Torque: " << hip_torque << "\tKnee Torque: " << knee_torque << "\n"; + std::cout << "Time: " << t << "\tHip Torque: " << hip_torque << "\tKnee Torque: " << knee_torque << "\n"; // Log to CSV log << t << "," @@ -107,8 +120,7 @@ void ActiveState::update() << knee.angle << "," << knee.velocity << "," << knee.acceleration << "," << knee_m_acc << "," << knee_c_vel << "," << knee_g << "," << knee_torque << "\n"; - t += dt; - std::this_thread::sleep_for(std::chrono::milliseconds(10)); + std::this_thread::sleep_for(std::chrono::duration(dt)); } } diff --git a/control/IMU_DataLoader/IMUDataLoader.cpp b/control/IMU_DataLoader/IMUDataLoader.cpp new file mode 100644 index 0000000..cdbf664 --- /dev/null +++ b/control/IMU_DataLoader/IMUDataLoader.cpp @@ -0,0 +1,90 @@ +#include "IMUDataLoader.h" +#include +#include +#include "json.hpp" +#include +#include +#include +#include +#include +#include + +using json = nlohmann::json; + +namespace IMUDataLoader { + + // Helper: Convert timestamp string to time in seconds since epoch + double parseTimestampToSeconds(const std::string& timestamp_str) { + std::tm t = {}; + double milliseconds = 0.0; + + std::istringstream ss(timestamp_str); + ss >> std::get_time(&t, "%Y-%m-%d %H:%M:%S"); // Parse main time portion + + // Now get the fractional seconds (milliseconds) + if (ss.peek() == '.') { + ss.ignore(); + std::string ms_str; + std::getline(ss, ms_str); + milliseconds = std::stod("0." + ms_str); + } + + std::time_t time_epoch = std::mktime(&t); // Convert to epoch time (seconds) + return static_cast(time_epoch) + milliseconds; + } + + JointData loadJointData(const std::string& filepath, const std::string& location) { + std::ifstream file(filepath); + if (!file.is_open()) { + throw std::runtime_error("Unable to open file: " + filepath); + } + + json j; + file >> j; + + std::vector raw_angles_deg; + std::vector raw_timestamps; + + std::string line; + while (std::getline(file, line)) { + if (line.empty()) continue; + + json frame = json::parse(line); + + std::string time_str = frame["timestamp"]; + double time_sec = parseTimestampToSeconds(time_str); + + for (const auto& sensor : frame["sensors"]) { + if (sensor["location"] == location) { + double roll = sensor["euler"]["roll"]; + raw_timestamps.push_back(time_sec); + raw_angles_deg.push_back(roll); + } + } + } + + if (raw_angles_deg.empty()) { + throw std::runtime_error("No data found for location: " + location); + } + + // Normalize timestamps to start at 0 + double t0 = raw_timestamps.front(); + for (double& t : raw_timestamps) { + t -= t0; + } + + // Estimate full extension + double min_roll = *std::min_element(raw_angles_deg.begin(), raw_angles_deg.end()); + + std::vector angles_rad; + for (double deg : raw_angles_deg) { + double shifted = deg - min_roll; + double rad = shifted * M_PI / 180.0; + angles_rad.push_back(rad); + } + + return JointData{ raw_timestamps, angles_rad }; + } + +} + diff --git a/control/IMU_DataLoader/IMUDataLoader.h b/control/IMU_DataLoader/IMUDataLoader.h new file mode 100644 index 0000000..ed36abe --- /dev/null +++ b/control/IMU_DataLoader/IMUDataLoader.h @@ -0,0 +1,20 @@ +/* + * Loads and processes roll angles for a given IMU data (e.g., "Right Knee") from a JSON file. + * Assumes: + * - IMU data is in degrees and must be converted to radians. + * - Offset is applied to align the most extended position to 0 rad. + * +*/ + +#include +#include + +namespace IMUDataLoader { + + struct JointData { + std::vector timestamps; // in seconds + std::vector angles_rad; // shifted so that 0 = full extension + }; + + JointData loadJointData(const std::string& filepath, const std::string& location); +} diff --git a/control/IMU_DataLoader/json.hpp b/control/IMU_DataLoader/json.hpp new file mode 100644 index 0000000..8b72ea6 --- /dev/null +++ b/control/IMU_DataLoader/json.hpp @@ -0,0 +1,24765 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + +/****************************************************************************\ + * Note on documentation: The source files contain links to the online * + * documentation of the public API at https://json.nlohmann.me. This URL * + * contains the most recent documentation and should also be applicable to * + * previous versions; documentation for deprecated functions is not * + * removed, but marked deprecated. See "Generate documentation" section in * + * file docs/README.md. * +\****************************************************************************/ + +#ifndef INCLUDE_NLOHMANN_JSON_HPP_ +#define INCLUDE_NLOHMANN_JSON_HPP_ + +#include // all_of, find, for_each +#include // nullptr_t, ptrdiff_t, size_t +#include // hash, less +#include // initializer_list +#ifndef JSON_NO_IO + #include // istream, ostream +#endif // JSON_NO_IO +#include // random_access_iterator_tag +#include // unique_ptr +#include // string, stoi, to_string +#include // declval, forward, move, pair, swap +#include // vector + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// This file contains all macro definitions affecting or depending on the ABI + +#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK + #if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH) + #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 11 || NLOHMANN_JSON_VERSION_PATCH != 3 + #warning "Already included a different version of the library!" + #endif + #endif +#endif + +#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_MINOR 11 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_PATCH 3 // NOLINT(modernize-macro-to-enum) + +#ifndef JSON_DIAGNOSTICS + #define JSON_DIAGNOSTICS 0 +#endif + +#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0 +#endif + +#if JSON_DIAGNOSTICS + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag +#else + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS +#endif + +#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp +#else + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION + #define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0 +#endif + +// Construct the namespace ABI tags component +#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) json_abi ## a ## b +#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b) \ + NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) + +#define NLOHMANN_JSON_ABI_TAGS \ + NLOHMANN_JSON_ABI_TAGS_CONCAT( \ + NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \ + NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON) + +// Construct the namespace version component +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \ + _v ## major ## _ ## minor ## _ ## patch +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) + +#if NLOHMANN_JSON_NAMESPACE_NO_VERSION +#define NLOHMANN_JSON_NAMESPACE_VERSION +#else +#define NLOHMANN_JSON_NAMESPACE_VERSION \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \ + NLOHMANN_JSON_VERSION_MINOR, \ + NLOHMANN_JSON_VERSION_PATCH) +#endif + +// Combine namespace components +#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b +#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \ + NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) + +#ifndef NLOHMANN_JSON_NAMESPACE +#define NLOHMANN_JSON_NAMESPACE \ + nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN +#define NLOHMANN_JSON_NAMESPACE_BEGIN \ + namespace nlohmann \ + { \ + inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) \ + { +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_END +#define NLOHMANN_JSON_NAMESPACE_END \ + } /* namespace (inline namespace) NOLINT(readability/namespace) */ \ + } // namespace nlohmann +#endif + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // transform +#include // array +#include // forward_list +#include // inserter, front_inserter, end +#include // map +#include // string +#include // tuple, make_tuple +#include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible +#include // unordered_map +#include // pair, declval +#include // valarray + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // nullptr_t +#include // exception +#if JSON_DIAGNOSTICS + #include // accumulate +#endif +#include // runtime_error +#include // to_string +#include // vector + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // array +#include // size_t +#include // uint8_t +#include // string + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // declval, pair +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template struct make_void +{ + using type = void; +}; +template using void_t = typename make_void::type; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +// https://en.cppreference.com/w/cpp/experimental/is_detected +struct nonesuch +{ + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(nonesuch const&) = delete; + nonesuch(nonesuch const&&) = delete; + void operator=(nonesuch const&) = delete; + void operator=(nonesuch&&) = delete; +}; + +template class Op, + class... Args> +struct detector +{ + using value_t = std::false_type; + using type = Default; +}; + +template class Op, class... Args> +struct detector>, Op, Args...> +{ + using value_t = std::true_type; + using type = Op; +}; + +template class Op, class... Args> +using is_detected = typename detector::value_t; + +template class Op, class... Args> +struct is_detected_lazy : is_detected { }; + +template class Op, class... Args> +using detected_t = typename detector::type; + +template class Op, class... Args> +using detected_or = detector; + +template class Op, class... Args> +using detected_or_t = typename detected_or::type; + +template class Op, class... Args> +using is_detected_exact = std::is_same>; + +template class Op, class... Args> +using is_detected_convertible = + std::is_convertible, To>; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + + +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-FileCopyrightText: 2016-2021 Evan Nemerson +// SPDX-License-Identifier: MIT + +/* Hedley - https://nemequ.github.io/hedley + * Created by Evan Nemerson + */ + +#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15) +#if defined(JSON_HEDLEY_VERSION) + #undef JSON_HEDLEY_VERSION +#endif +#define JSON_HEDLEY_VERSION 15 + +#if defined(JSON_HEDLEY_STRINGIFY_EX) + #undef JSON_HEDLEY_STRINGIFY_EX +#endif +#define JSON_HEDLEY_STRINGIFY_EX(x) #x + +#if defined(JSON_HEDLEY_STRINGIFY) + #undef JSON_HEDLEY_STRINGIFY +#endif +#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x) + +#if defined(JSON_HEDLEY_CONCAT_EX) + #undef JSON_HEDLEY_CONCAT_EX +#endif +#define JSON_HEDLEY_CONCAT_EX(a,b) a##b + +#if defined(JSON_HEDLEY_CONCAT) + #undef JSON_HEDLEY_CONCAT +#endif +#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b) + +#if defined(JSON_HEDLEY_CONCAT3_EX) + #undef JSON_HEDLEY_CONCAT3_EX +#endif +#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c + +#if defined(JSON_HEDLEY_CONCAT3) + #undef JSON_HEDLEY_CONCAT3 +#endif +#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c) + +#if defined(JSON_HEDLEY_VERSION_ENCODE) + #undef JSON_HEDLEY_VERSION_ENCODE +#endif +#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision)) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR) + #undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR) + #undef JSON_HEDLEY_VERSION_DECODE_MINOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION) + #undef JSON_HEDLEY_VERSION_DECODE_REVISION +#endif +#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000) + +#if defined(JSON_HEDLEY_GNUC_VERSION) + #undef JSON_HEDLEY_GNUC_VERSION +#endif +#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) +#elif defined(__GNUC__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0) +#endif + +#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK) + #undef JSON_HEDLEY_GNUC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GNUC_VERSION) + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION) + #undef JSON_HEDLEY_MSVC_VERSION +#endif +#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100) +#elif defined(_MSC_FULL_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10) +#elif defined(_MSC_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK) + #undef JSON_HEDLEY_MSVC_VERSION_CHECK +#endif +#if !defined(JSON_HEDLEY_MSVC_VERSION) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) +#elif defined(_MSC_VER) && (_MSC_VER >= 1200) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) +#else + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor))) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION) + #undef JSON_HEDLEY_INTEL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE) +#elif defined(__INTEL_COMPILER) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_VERSION) + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #undef JSON_HEDLEY_INTEL_CL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL) + #define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION) + #undef JSON_HEDLEY_PGI_VERSION +#endif +#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__) + #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION_CHECK) + #undef JSON_HEDLEY_PGI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PGI_VERSION) + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #undef JSON_HEDLEY_SUNPRO_VERSION +#endif +#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10) +#elif defined(__SUNPRO_C) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf) +#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10) +#elif defined(__SUNPRO_CC) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK) + #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#endif +#if defined(__EMSCRIPTEN__) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION) + #undef JSON_HEDLEY_ARM_VERSION +#endif +#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100) +#elif defined(__CC_ARM) && defined(__ARMCC_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION_CHECK) + #undef JSON_HEDLEY_ARM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_ARM_VERSION) + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION) + #undef JSON_HEDLEY_IBM_VERSION +#endif +#if defined(__ibmxl__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__) +#elif defined(__xlC__) && defined(__xlC_ver__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff) +#elif defined(__xlC__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION_CHECK) + #undef JSON_HEDLEY_IBM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IBM_VERSION) + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_VERSION) + #undef JSON_HEDLEY_TI_VERSION +#endif +#if \ + defined(__TI_COMPILER_VERSION__) && \ + ( \ + defined(__TMS470__) || defined(__TI_ARM__) || \ + defined(__MSP430__) || \ + defined(__TMS320C2000__) \ + ) +#if (__TI_COMPILER_VERSION__ >= 16000000) + #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif +#endif + +#if defined(JSON_HEDLEY_TI_VERSION_CHECK) + #undef JSON_HEDLEY_TI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_VERSION) + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #undef JSON_HEDLEY_TI_CL2000_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__) + #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #undef JSON_HEDLEY_TI_CL430_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__) + #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #undef JSON_HEDLEY_TI_ARMCL_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__)) + #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK) + #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #undef JSON_HEDLEY_TI_CL6X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__) + #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #undef JSON_HEDLEY_TI_CL7X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__) + #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #undef JSON_HEDLEY_TI_CLPRU_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__) + #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION) + #undef JSON_HEDLEY_CRAY_VERSION +#endif +#if defined(_CRAYC) + #if defined(_RELEASE_PATCHLEVEL) + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL) + #else + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK) + #undef JSON_HEDLEY_CRAY_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_CRAY_VERSION) + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION) + #undef JSON_HEDLEY_IAR_VERSION +#endif +#if defined(__IAR_SYSTEMS_ICC__) + #if __VER__ > 1000 + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000)) + #else + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION_CHECK) + #undef JSON_HEDLEY_IAR_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IAR_VERSION) + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION) + #undef JSON_HEDLEY_TINYC_VERSION +#endif +#if defined(__TINYC__) + #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK) + #undef JSON_HEDLEY_TINYC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION) + #undef JSON_HEDLEY_DMC_VERSION +#endif +#if defined(__DMC__) + #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION_CHECK) + #undef JSON_HEDLEY_DMC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_DMC_VERSION) + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #undef JSON_HEDLEY_COMPCERT_VERSION +#endif +#if defined(__COMPCERT_VERSION__) + #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK) + #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION) + #undef JSON_HEDLEY_PELLES_VERSION +#endif +#if defined(__POCC__) + #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK) + #undef JSON_HEDLEY_PELLES_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PELLES_VERSION) + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #undef JSON_HEDLEY_MCST_LCC_VERSION +#endif +#if defined(__LCC__) && defined(__LCC_MINOR__) + #define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK) + #undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION) + #undef JSON_HEDLEY_GCC_VERSION +#endif +#if \ + defined(JSON_HEDLEY_GNUC_VERSION) && \ + !defined(__clang__) && \ + !defined(JSON_HEDLEY_INTEL_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_ARM_VERSION) && \ + !defined(JSON_HEDLEY_CRAY_VERSION) && \ + !defined(JSON_HEDLEY_TI_VERSION) && \ + !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL430_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \ + !defined(__COMPCERT__) && \ + !defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_ATTRIBUTE +#endif +#if \ + defined(__has_attribute) && \ + ( \ + (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \ + ) +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute) +#else +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#endif +#if \ + defined(__has_cpp_attribute) && \ + defined(__cplusplus) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#endif +#if !defined(__cplusplus) || !defined(__has_cpp_attribute) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#elif \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \ + (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_BUILTIN) + #undef JSON_HEDLEY_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin) +#else + #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN) + #undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN) + #undef JSON_HEDLEY_GCC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_FEATURE) + #undef JSON_HEDLEY_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature) +#else + #define JSON_HEDLEY_HAS_FEATURE(feature) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE) + #undef JSON_HEDLEY_GNUC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_FEATURE) + #undef JSON_HEDLEY_GCC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_EXTENSION) + #undef JSON_HEDLEY_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension) +#else + #define JSON_HEDLEY_HAS_EXTENSION(extension) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION) + #undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION) + #undef JSON_HEDLEY_GCC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_WARNING) + #undef JSON_HEDLEY_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning) +#else + #define JSON_HEDLEY_HAS_WARNING(warning) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_WARNING) + #undef JSON_HEDLEY_GNUC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_WARNING) + #undef JSON_HEDLEY_GCC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + defined(__clang__) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \ + (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR)) + #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_PRAGMA(value) __pragma(value) +#else + #define JSON_HEDLEY_PRAGMA(value) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH) + #undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#endif +#if defined(JSON_HEDLEY_DIAGNOSTIC_POP) + #undef JSON_HEDLEY_DIAGNOSTIC_POP +#endif +#if defined(__clang__) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push)) + #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop)) +#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_PUSH + #define JSON_HEDLEY_DIAGNOSTIC_POP +#endif + +/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat") +# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions") +# if JSON_HEDLEY_HAS_WARNING("-Wc++1z-extensions") +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# endif +#endif +#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x +#endif + +#if defined(JSON_HEDLEY_CONST_CAST) + #undef JSON_HEDLEY_CONST_CAST +#endif +#if defined(__cplusplus) +# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast(expr)) +#elif \ + JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_REINTERPRET_CAST) + #undef JSON_HEDLEY_REINTERPRET_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast(expr)) +#else + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_STATIC_CAST) + #undef JSON_HEDLEY_STATIC_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast(expr)) +#else + #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_CPP_CAST) + #undef JSON_HEDLEY_CPP_CAST +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast") +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \ + ((T) (expr)) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0) +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("diag_suppress=Pe137") \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr)) +# endif +#else +# define JSON_HEDLEY_CPP_CAST(T, expr) (expr) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1216,1444,1445") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068)) +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 161") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292)) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097,1098") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunused-function") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("clang diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("GCC diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("diag_suppress 3142") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif + +#if defined(JSON_HEDLEY_DEPRECATED) + #undef JSON_HEDLEY_DEPRECATED +#endif +#if defined(JSON_HEDLEY_DEPRECATED_FOR) + #undef JSON_HEDLEY_DEPRECATED_FOR +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement)) +#elif \ + (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since))) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement))) +#elif defined(__cplusplus) && (__cplusplus >= 201402L) + #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]]) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated") + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated") +#else + #define JSON_HEDLEY_DEPRECATED(since) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) +#endif + +#if defined(JSON_HEDLEY_UNAVAILABLE) + #undef JSON_HEDLEY_UNAVAILABLE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since))) +#else + #define JSON_HEDLEY_UNAVAILABLE(available_since) +#endif + +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT +#endif +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__)) +#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) +#elif defined(_Check_return_) /* SAL */ + #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_ + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_ +#else + #define JSON_HEDLEY_WARN_UNUSED_RESULT + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) +#endif + +#if defined(JSON_HEDLEY_SENTINEL) + #undef JSON_HEDLEY_SENTINEL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position))) +#else + #define JSON_HEDLEY_SENTINEL(position) +#endif + +#if defined(JSON_HEDLEY_NO_RETURN) + #undef JSON_HEDLEY_NO_RETURN +#endif +#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NO_RETURN __noreturn +#elif \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L + #define JSON_HEDLEY_NO_RETURN _Noreturn +#elif defined(__cplusplus) && (__cplusplus >= 201103L) + #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NO_RETURN __attribute((noreturn)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#else + #define JSON_HEDLEY_NO_RETURN +#endif + +#if defined(JSON_HEDLEY_NO_ESCAPE) + #undef JSON_HEDLEY_NO_ESCAPE +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape) + #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__)) +#else + #define JSON_HEDLEY_NO_ESCAPE +#endif + +#if defined(JSON_HEDLEY_UNREACHABLE) + #undef JSON_HEDLEY_UNREACHABLE +#endif +#if defined(JSON_HEDLEY_UNREACHABLE_RETURN) + #undef JSON_HEDLEY_UNREACHABLE_RETURN +#endif +#if defined(JSON_HEDLEY_ASSUME) + #undef JSON_HEDLEY_ASSUME +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_ASSUME(expr) __assume(expr) +#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume) + #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr) +#elif \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #if defined(__cplusplus) + #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr) + #else + #define JSON_HEDLEY_ASSUME(expr) _nassert(expr) + #endif +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable() +#elif defined(JSON_HEDLEY_ASSUME) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif +#if !defined(JSON_HEDLEY_ASSUME) + #if defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1))) + #else + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr) + #endif +#endif +#if defined(JSON_HEDLEY_UNREACHABLE) + #if \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value)) + #else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE() + #endif +#else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value) +#endif +#if !defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif + +JSON_HEDLEY_DIAGNOSTIC_PUSH +#if JSON_HEDLEY_HAS_WARNING("-Wpedantic") + #pragma clang diagnostic ignored "-Wpedantic" +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus) + #pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +#endif +#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0) + #if defined(__clang__) + #pragma clang diagnostic ignored "-Wvariadic-macros" + #elif defined(JSON_HEDLEY_GCC_VERSION) + #pragma GCC diagnostic ignored "-Wvariadic-macros" + #endif +#endif +#if defined(JSON_HEDLEY_NON_NULL) + #undef JSON_HEDLEY_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__))) +#else + #define JSON_HEDLEY_NON_NULL(...) +#endif +JSON_HEDLEY_DIAGNOSTIC_POP + +#if defined(JSON_HEDLEY_PRINTF_FORMAT) + #undef JSON_HEDLEY_PRINTF_FORMAT +#endif +#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check))) +#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check))) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(format) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check))) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check)) +#else + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) +#endif + +#if defined(JSON_HEDLEY_CONSTEXPR) + #undef JSON_HEDLEY_CONSTEXPR +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr) + #endif +#endif +#if !defined(JSON_HEDLEY_CONSTEXPR) + #define JSON_HEDLEY_CONSTEXPR +#endif + +#if defined(JSON_HEDLEY_PREDICT) + #undef JSON_HEDLEY_PREDICT +#endif +#if defined(JSON_HEDLEY_LIKELY) + #undef JSON_HEDLEY_LIKELY +#endif +#if defined(JSON_HEDLEY_UNLIKELY) + #undef JSON_HEDLEY_UNLIKELY +#endif +#if defined(JSON_HEDLEY_UNPREDICTABLE) + #undef JSON_HEDLEY_UNPREDICTABLE +#endif +#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable) + #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr)) +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability)) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 ) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 ) +#elif \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, expected, probability) \ + (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \ + })) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \ + })) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) +#else +# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_LIKELY(expr) (!!(expr)) +# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr)) +#endif +#if !defined(JSON_HEDLEY_UNPREDICTABLE) + #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5) +#endif + +#if defined(JSON_HEDLEY_MALLOC) + #undef JSON_HEDLEY_MALLOC +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_MALLOC __attribute__((__malloc__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_MALLOC __declspec(restrict) +#else + #define JSON_HEDLEY_MALLOC +#endif + +#if defined(JSON_HEDLEY_PURE) + #undef JSON_HEDLEY_PURE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PURE __attribute__((__pure__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) +# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data") +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \ + ) +# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;") +#else +# define JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_CONST) + #undef JSON_HEDLEY_CONST +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(const) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_CONST __attribute__((__const__)) +#elif \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_CONST _Pragma("no_side_effect") +#else + #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_RESTRICT) + #undef JSON_HEDLEY_RESTRICT +#endif +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT restrict +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + defined(__clang__) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RESTRICT __restrict +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT _Restrict +#else + #define JSON_HEDLEY_RESTRICT +#endif + +#if defined(JSON_HEDLEY_INLINE) + #undef JSON_HEDLEY_INLINE +#endif +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + (defined(__cplusplus) && (__cplusplus >= 199711L)) + #define JSON_HEDLEY_INLINE inline +#elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0) + #define JSON_HEDLEY_INLINE __inline__ +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_INLINE __inline +#else + #define JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_ALWAYS_INLINE) + #undef JSON_HEDLEY_ALWAYS_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) +# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_ALWAYS_INLINE __forceinline +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \ + ) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced") +#else +# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_NEVER_INLINE) + #undef JSON_HEDLEY_NEVER_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#else + #define JSON_HEDLEY_NEVER_INLINE +#endif + +#if defined(JSON_HEDLEY_PRIVATE) + #undef JSON_HEDLEY_PRIVATE +#endif +#if defined(JSON_HEDLEY_PUBLIC) + #undef JSON_HEDLEY_PUBLIC +#endif +#if defined(JSON_HEDLEY_IMPORT) + #undef JSON_HEDLEY_IMPORT +#endif +#if defined(_WIN32) || defined(__CYGWIN__) +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC __declspec(dllexport) +# define JSON_HEDLEY_IMPORT __declspec(dllimport) +#else +# if \ + JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + ( \ + defined(__TI_EABI__) && \ + ( \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \ + ) \ + ) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden"))) +# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default"))) +# else +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC +# endif +# define JSON_HEDLEY_IMPORT extern +#endif + +#if defined(JSON_HEDLEY_NO_THROW) + #undef JSON_HEDLEY_NO_THROW +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NO_THROW __declspec(nothrow) +#else + #define JSON_HEDLEY_NO_THROW +#endif + +#if defined(JSON_HEDLEY_FALL_THROUGH) + #undef JSON_HEDLEY_FALL_THROUGH +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__)) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]]) +#elif defined(__fallthrough) /* SAL */ + #define JSON_HEDLEY_FALL_THROUGH __fallthrough +#else + #define JSON_HEDLEY_FALL_THROUGH +#endif + +#if defined(JSON_HEDLEY_RETURNS_NON_NULL) + #undef JSON_HEDLEY_RETURNS_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__)) +#elif defined(_Ret_notnull_) /* SAL */ + #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_ +#else + #define JSON_HEDLEY_RETURNS_NON_NULL +#endif + +#if defined(JSON_HEDLEY_ARRAY_PARAM) + #undef JSON_HEDLEY_ARRAY_PARAM +#endif +#if \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ + !defined(__STDC_NO_VLA__) && \ + !defined(__cplusplus) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_ARRAY_PARAM(name) (name) +#else + #define JSON_HEDLEY_ARRAY_PARAM(name) +#endif + +#if defined(JSON_HEDLEY_IS_CONSTANT) + #undef JSON_HEDLEY_IS_CONSTANT +#endif +#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR) + #undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#endif +/* JSON_HEDLEY_IS_CONSTEXPR_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #undef JSON_HEDLEY_IS_CONSTEXPR_ +#endif +#if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr) +#endif +#if !defined(__cplusplus) +# if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*) +#endif +# elif \ + ( \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ + !defined(JSON_HEDLEY_SUNPRO_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION)) || \ + (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0) +#endif +# elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + defined(JSON_HEDLEY_INTEL_VERSION) || \ + defined(JSON_HEDLEY_TINYC_VERSION) || \ + defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \ + defined(JSON_HEDLEY_TI_CL2000_VERSION) || \ + defined(JSON_HEDLEY_TI_CL6X_VERSION) || \ + defined(JSON_HEDLEY_TI_CL7X_VERSION) || \ + defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \ + defined(__clang__) +# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \ + sizeof(void) != \ + sizeof(*( \ + 1 ? \ + ((void*) ((expr) * 0L) ) : \ +((struct { char v[sizeof(void) * 2]; } *) 1) \ + ) \ + ) \ + ) +# endif +#endif +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1)) +#else + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) (0) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr) +#endif + +#if defined(JSON_HEDLEY_BEGIN_C_DECLS) + #undef JSON_HEDLEY_BEGIN_C_DECLS +#endif +#if defined(JSON_HEDLEY_END_C_DECLS) + #undef JSON_HEDLEY_END_C_DECLS +#endif +#if defined(JSON_HEDLEY_C_DECL) + #undef JSON_HEDLEY_C_DECL +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_BEGIN_C_DECLS extern "C" { + #define JSON_HEDLEY_END_C_DECLS } + #define JSON_HEDLEY_C_DECL extern "C" +#else + #define JSON_HEDLEY_BEGIN_C_DECLS + #define JSON_HEDLEY_END_C_DECLS + #define JSON_HEDLEY_C_DECL +#endif + +#if defined(JSON_HEDLEY_STATIC_ASSERT) + #undef JSON_HEDLEY_STATIC_ASSERT +#endif +#if \ + !defined(__cplusplus) && ( \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \ + (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + defined(_Static_assert) \ + ) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message) +#elif \ + (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message)) +#else +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) +#endif + +#if defined(JSON_HEDLEY_NULL) + #undef JSON_HEDLEY_NULL +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr) + #elif defined(NULL) + #define JSON_HEDLEY_NULL NULL + #else + #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0) + #endif +#elif defined(NULL) + #define JSON_HEDLEY_NULL NULL +#else + #define JSON_HEDLEY_NULL ((void*) 0) +#endif + +#if defined(JSON_HEDLEY_MESSAGE) + #undef JSON_HEDLEY_MESSAGE +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_MESSAGE(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(message msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg) +#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_WARNING) + #undef JSON_HEDLEY_WARNING +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_WARNING(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(clang warning msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_REQUIRE) + #undef JSON_HEDLEY_REQUIRE +#endif +#if defined(JSON_HEDLEY_REQUIRE_MSG) + #undef JSON_HEDLEY_REQUIRE_MSG +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if) +# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat") +# define JSON_HEDLEY_REQUIRE(expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), #expr, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), msg, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error"))) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error"))) +# endif +#else +# define JSON_HEDLEY_REQUIRE(expr) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) +#endif + +#if defined(JSON_HEDLEY_FLAGS) + #undef JSON_HEDLEY_FLAGS +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING("-Wbitfield-enum-conversion")) + #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__)) +#else + #define JSON_HEDLEY_FLAGS +#endif + +#if defined(JSON_HEDLEY_FLAGS_CAST) + #undef JSON_HEDLEY_FLAGS_CAST +#endif +#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0) +# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("warning(disable:188)") \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr) +#endif + +#if defined(JSON_HEDLEY_EMPTY_BASES) + #undef JSON_HEDLEY_EMPTY_BASES +#endif +#if \ + (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases) +#else + #define JSON_HEDLEY_EMPTY_BASES +#endif + +/* Remaining macros are deprecated. */ + +#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#endif +#if defined(__clang__) + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0) +#else + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN) + #undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#endif +#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin) + +#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE) + #undef JSON_HEDLEY_CLANG_HAS_FEATURE +#endif +#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature) + +#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION) + #undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#endif +#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension) + +#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_WARNING) + #undef JSON_HEDLEY_CLANG_HAS_WARNING +#endif +#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning) + +#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */ + + +// This file contains all internal macro definitions (except those affecting ABI) +// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them + +// #include + + +// exclude unsupported compilers +#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) + #if defined(__clang__) + #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #endif +#endif + +// C++ language standard detection +// if the user manually specified the used c++ version this is skipped +#if !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11) + #if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) + #define JSON_HAS_CPP_14 + #endif + // the cpp 11 flag is always specified because it is the minimal required version + #define JSON_HAS_CPP_11 +#endif + +#ifdef __has_include + #if __has_include() + #include + #endif +#endif + +#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM) + #ifdef JSON_HAS_CPP_17 + #if defined(__cpp_lib_filesystem) + #define JSON_HAS_FILESYSTEM 1 + #elif defined(__cpp_lib_experimental_filesystem) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif !defined(__has_include) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #endif + + // std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/ + #if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__clang_major__) && __clang_major__ < 7 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support + #if defined(_MSC_VER) && _MSC_VER < 1914 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before iOS 13 + #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before macOS Catalina + #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + #endif +#endif + +#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_FILESYSTEM + #define JSON_HAS_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_THREE_WAY_COMPARISON + #if defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907L \ + && defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L + #define JSON_HAS_THREE_WAY_COMPARISON 1 + #else + #define JSON_HAS_THREE_WAY_COMPARISON 0 + #endif +#endif + +#ifndef JSON_HAS_RANGES + // ranges header shipping in GCC 11.1.0 (released 2021-04-27) has syntax error + #if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427 + #define JSON_HAS_RANGES 0 + #elif defined(__cpp_lib_ranges) + #define JSON_HAS_RANGES 1 + #else + #define JSON_HAS_RANGES 0 + #endif +#endif + +#ifndef JSON_HAS_STATIC_RTTI + #if !defined(_HAS_STATIC_RTTI) || _HAS_STATIC_RTTI != 0 + #define JSON_HAS_STATIC_RTTI 1 + #else + #define JSON_HAS_STATIC_RTTI 0 + #endif +#endif + +#ifdef JSON_HAS_CPP_17 + #define JSON_INLINE_VARIABLE inline +#else + #define JSON_INLINE_VARIABLE +#endif + +#if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address) + #define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]] +#else + #define JSON_NO_UNIQUE_ADDRESS +#endif + +// disable documentation warnings on clang +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +#endif + +// allow disabling exceptions +#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) + #define JSON_THROW(exception) throw exception + #define JSON_TRY try + #define JSON_CATCH(exception) catch(exception) + #define JSON_INTERNAL_CATCH(exception) catch(exception) +#else + #include + #define JSON_THROW(exception) std::abort() + #define JSON_TRY if(true) + #define JSON_CATCH(exception) if(false) + #define JSON_INTERNAL_CATCH(exception) if(false) +#endif + +// override exception macros +#if defined(JSON_THROW_USER) + #undef JSON_THROW + #define JSON_THROW JSON_THROW_USER +#endif +#if defined(JSON_TRY_USER) + #undef JSON_TRY + #define JSON_TRY JSON_TRY_USER +#endif +#if defined(JSON_CATCH_USER) + #undef JSON_CATCH + #define JSON_CATCH JSON_CATCH_USER + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_CATCH_USER +#endif +#if defined(JSON_INTERNAL_CATCH_USER) + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER +#endif + +// allow overriding assert +#if !defined(JSON_ASSERT) + #include // assert + #define JSON_ASSERT(x) assert(x) +#endif + +// allow to access some private functions (needed by the test suite) +#if defined(JSON_TESTS_PRIVATE) + #define JSON_PRIVATE_UNLESS_TESTED public +#else + #define JSON_PRIVATE_UNLESS_TESTED private +#endif + +/*! +@brief macro to briefly define a mapping between an enum and JSON +@def NLOHMANN_JSON_SERIALIZE_ENUM +@since version 3.4.0 +*/ +#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ + template \ + inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [e](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.first == e; \ + }); \ + j = ((it != std::end(m)) ? it : std::begin(m))->second; \ + } \ + template \ + inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [&j](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.second == j; \ + }); \ + e = ((it != std::end(m)) ? it : std::begin(m))->first; \ + } + +// Ugly macros to avoid uglier copy-paste when specializing basic_json. They +// may be removed in the future once the class is split. + +#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ + template class ObjectType, \ + template class ArrayType, \ + class StringType, class BooleanType, class NumberIntegerType, \ + class NumberUnsignedType, class NumberFloatType, \ + template class AllocatorType, \ + template class JSONSerializer, \ + class BinaryType, \ + class CustomBaseClass> + +#define NLOHMANN_BASIC_JSON_TPL \ + basic_json + +// Macros to simplify conversion from/to types + +#define NLOHMANN_JSON_EXPAND( x ) x +#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME +#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \ + NLOHMANN_JSON_PASTE64, \ + NLOHMANN_JSON_PASTE63, \ + NLOHMANN_JSON_PASTE62, \ + NLOHMANN_JSON_PASTE61, \ + NLOHMANN_JSON_PASTE60, \ + NLOHMANN_JSON_PASTE59, \ + NLOHMANN_JSON_PASTE58, \ + NLOHMANN_JSON_PASTE57, \ + NLOHMANN_JSON_PASTE56, \ + NLOHMANN_JSON_PASTE55, \ + NLOHMANN_JSON_PASTE54, \ + NLOHMANN_JSON_PASTE53, \ + NLOHMANN_JSON_PASTE52, \ + NLOHMANN_JSON_PASTE51, \ + NLOHMANN_JSON_PASTE50, \ + NLOHMANN_JSON_PASTE49, \ + NLOHMANN_JSON_PASTE48, \ + NLOHMANN_JSON_PASTE47, \ + NLOHMANN_JSON_PASTE46, \ + NLOHMANN_JSON_PASTE45, \ + NLOHMANN_JSON_PASTE44, \ + NLOHMANN_JSON_PASTE43, \ + NLOHMANN_JSON_PASTE42, \ + NLOHMANN_JSON_PASTE41, \ + NLOHMANN_JSON_PASTE40, \ + NLOHMANN_JSON_PASTE39, \ + NLOHMANN_JSON_PASTE38, \ + NLOHMANN_JSON_PASTE37, \ + NLOHMANN_JSON_PASTE36, \ + NLOHMANN_JSON_PASTE35, \ + NLOHMANN_JSON_PASTE34, \ + NLOHMANN_JSON_PASTE33, \ + NLOHMANN_JSON_PASTE32, \ + NLOHMANN_JSON_PASTE31, \ + NLOHMANN_JSON_PASTE30, \ + NLOHMANN_JSON_PASTE29, \ + NLOHMANN_JSON_PASTE28, \ + NLOHMANN_JSON_PASTE27, \ + NLOHMANN_JSON_PASTE26, \ + NLOHMANN_JSON_PASTE25, \ + NLOHMANN_JSON_PASTE24, \ + NLOHMANN_JSON_PASTE23, \ + NLOHMANN_JSON_PASTE22, \ + NLOHMANN_JSON_PASTE21, \ + NLOHMANN_JSON_PASTE20, \ + NLOHMANN_JSON_PASTE19, \ + NLOHMANN_JSON_PASTE18, \ + NLOHMANN_JSON_PASTE17, \ + NLOHMANN_JSON_PASTE16, \ + NLOHMANN_JSON_PASTE15, \ + NLOHMANN_JSON_PASTE14, \ + NLOHMANN_JSON_PASTE13, \ + NLOHMANN_JSON_PASTE12, \ + NLOHMANN_JSON_PASTE11, \ + NLOHMANN_JSON_PASTE10, \ + NLOHMANN_JSON_PASTE9, \ + NLOHMANN_JSON_PASTE8, \ + NLOHMANN_JSON_PASTE7, \ + NLOHMANN_JSON_PASTE6, \ + NLOHMANN_JSON_PASTE5, \ + NLOHMANN_JSON_PASTE4, \ + NLOHMANN_JSON_PASTE3, \ + NLOHMANN_JSON_PASTE2, \ + NLOHMANN_JSON_PASTE1)(__VA_ARGS__)) +#define NLOHMANN_JSON_PASTE2(func, v1) func(v1) +#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2) +#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3) +#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4) +#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5) +#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6) +#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7) +#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8) +#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9) +#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10) +#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) +#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) +#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) +#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) +#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) +#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) +#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) +#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) +#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) +#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) +#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) +#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) +#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) +#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) +#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) +#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) +#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) +#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) +#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) +#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) +#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) +#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) +#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) +#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) +#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) +#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) +#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) +#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) +#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) +#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) +#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) +#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) +#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) +#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) +#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) +#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) +#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) +#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) +#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) +#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) +#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) +#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) +#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) +#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) +#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) +#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) +#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) +#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) +#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) +#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) +#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) +#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) +#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) + +#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1; +#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1); +#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1); + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +// inspired from https://stackoverflow.com/a/26745591 +// allows to call any std function as if (e.g. with begin): +// using std::begin; begin(x); +// +// it allows using the detected idiom to retrieve the return type +// of such an expression +#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \ + namespace detail { \ + using std::std_name; \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + } \ + \ + namespace detail2 { \ + struct std_name##_tag \ + { \ + }; \ + \ + template \ + std_name##_tag std_name(T&&...); \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + \ + template \ + struct would_call_std_##std_name \ + { \ + static constexpr auto const value = ::nlohmann::detail:: \ + is_detected_exact::value; \ + }; \ + } /* namespace detail2 */ \ + \ + template \ + struct would_call_std_##std_name : detail2::would_call_std_##std_name \ + { \ + } + +#ifndef JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_USE_IMPLICIT_CONVERSIONS 1 +#endif + +#if JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_EXPLICIT +#else + #define JSON_EXPLICIT explicit +#endif + +#ifndef JSON_DISABLE_ENUM_SERIALIZATION + #define JSON_DISABLE_ENUM_SERIALIZATION 0 +#endif + +#ifndef JSON_USE_GLOBAL_UDLS + #define JSON_USE_GLOBAL_UDLS 1 +#endif + +#if JSON_HAS_THREE_WAY_COMPARISON + #include // partial_ordering +#endif + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/////////////////////////// +// JSON type enumeration // +/////////////////////////// + +/*! +@brief the JSON type enumeration + +This enumeration collects the different JSON types. It is internally used to +distinguish the stored values, and the functions @ref basic_json::is_null(), +@ref basic_json::is_object(), @ref basic_json::is_array(), +@ref basic_json::is_string(), @ref basic_json::is_boolean(), +@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), +@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), +@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and +@ref basic_json::is_structured() rely on it. + +@note There are three enumeration entries (number_integer, number_unsigned, and +number_float), because the library distinguishes these three types for numbers: +@ref basic_json::number_unsigned_t is used for unsigned integers, +@ref basic_json::number_integer_t is used for signed integers, and +@ref basic_json::number_float_t is used for floating-point numbers or to +approximate integers which do not fit in the limits of their respective type. + +@sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON +value with the default value for a given type + +@since version 1.0.0 +*/ +enum class value_t : std::uint8_t +{ + null, ///< null value + object, ///< object (unordered set of name/value pairs) + array, ///< array (ordered collection of values) + string, ///< string value + boolean, ///< boolean value + number_integer, ///< number value (signed integer) + number_unsigned, ///< number value (unsigned integer) + number_float, ///< number value (floating-point) + binary, ///< binary array (ordered collection of bytes) + discarded ///< discarded by the parser callback function +}; + +/*! +@brief comparison operator for JSON types + +Returns an ordering that is similar to Python: +- order: null < boolean < number < object < array < string < binary +- furthermore, each type is not smaller than itself +- discarded values are not comparable +- binary is represented as a b"" string in python and directly comparable to a + string; however, making a binary array directly comparable with a string would + be surprising behavior in a JSON file. + +@since version 1.0.0 +*/ +#if JSON_HAS_THREE_WAY_COMPARISON + inline std::partial_ordering operator<=>(const value_t lhs, const value_t rhs) noexcept // *NOPAD* +#else + inline bool operator<(const value_t lhs, const value_t rhs) noexcept +#endif +{ + static constexpr std::array order = {{ + 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, + 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, + 6 /* binary */ + } + }; + + const auto l_index = static_cast(lhs); + const auto r_index = static_cast(rhs); +#if JSON_HAS_THREE_WAY_COMPARISON + if (l_index < order.size() && r_index < order.size()) + { + return order[l_index] <=> order[r_index]; // *NOPAD* + } + return std::partial_ordering::unordered; +#else + return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; +#endif +} + +// GCC selects the built-in operator< over an operator rewritten from +// a user-defined spaceship operator +// Clang, MSVC, and ICC select the rewritten candidate +// (see GCC bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105200) +#if JSON_HAS_THREE_WAY_COMPARISON && defined(__GNUC__) +inline bool operator<(const value_t lhs, const value_t rhs) noexcept +{ + return std::is_lt(lhs <=> rhs); // *NOPAD* +} +#endif + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/*! +@brief replace all occurrences of a substring by another string + +@param[in,out] s the string to manipulate; changed so that all + occurrences of @a f are replaced with @a t +@param[in] f the substring to replace with @a t +@param[in] t the string to replace @a f + +@pre The search string @a f must not be empty. **This precondition is +enforced with an assertion.** + +@since version 2.0.0 +*/ +template +inline void replace_substring(StringType& s, const StringType& f, + const StringType& t) +{ + JSON_ASSERT(!f.empty()); + for (auto pos = s.find(f); // find first occurrence of f + pos != StringType::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t, and + pos = s.find(f, pos + t.size())) // find next occurrence of f + {} +} + +/*! + * @brief string escaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to escape + * @return escaped string + * + * Note the order of escaping "~" to "~0" and "/" to "~1" is important. + */ +template +inline StringType escape(StringType s) +{ + replace_substring(s, StringType{"~"}, StringType{"~0"}); + replace_substring(s, StringType{"/"}, StringType{"~1"}); + return s; +} + +/*! + * @brief string unescaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to unescape + * @return unescaped string + * + * Note the order of escaping "~1" to "/" and "~0" to "~" is important. + */ +template +static void unescape(StringType& s) +{ + replace_substring(s, StringType{"~1"}, StringType{"/"}); + replace_substring(s, StringType{"~0"}, StringType{"~"}); +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // size_t + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/// struct to capture the start position of the current token +struct position_t +{ + /// the total number of characters read + std::size_t chars_read_total = 0; + /// the number of characters read in the current line + std::size_t chars_read_current_line = 0; + /// the number of lines read + std::size_t lines_read = 0; + + /// conversion to size_t to preserve SAX interface + constexpr operator size_t() const + { + return chars_read_total; + } +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-FileCopyrightText: 2018 The Abseil Authors +// SPDX-License-Identifier: MIT + + + +#include // array +#include // size_t +#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type +#include // index_sequence, make_index_sequence, index_sequence_for + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +using uncvref_t = typename std::remove_cv::type>::type; + +#ifdef JSON_HAS_CPP_14 + +// the following utilities are natively available in C++14 +using std::enable_if_t; +using std::index_sequence; +using std::make_index_sequence; +using std::index_sequence_for; + +#else + +// alias templates to reduce boilerplate +template +using enable_if_t = typename std::enable_if::type; + +// The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h +// which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0. + +//// START OF CODE FROM GOOGLE ABSEIL + +// integer_sequence +// +// Class template representing a compile-time integer sequence. An instantiation +// of `integer_sequence` has a sequence of integers encoded in its +// type through its template arguments (which is a common need when +// working with C++11 variadic templates). `absl::integer_sequence` is designed +// to be a drop-in replacement for C++14's `std::integer_sequence`. +// +// Example: +// +// template< class T, T... Ints > +// void user_function(integer_sequence); +// +// int main() +// { +// // user_function's `T` will be deduced to `int` and `Ints...` +// // will be deduced to `0, 1, 2, 3, 4`. +// user_function(make_integer_sequence()); +// } +template +struct integer_sequence +{ + using value_type = T; + static constexpr std::size_t size() noexcept + { + return sizeof...(Ints); + } +}; + +// index_sequence +// +// A helper template for an `integer_sequence` of `size_t`, +// `absl::index_sequence` is designed to be a drop-in replacement for C++14's +// `std::index_sequence`. +template +using index_sequence = integer_sequence; + +namespace utility_internal +{ + +template +struct Extend; + +// Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency. +template +struct Extend, SeqSize, 0> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >; +}; + +template +struct Extend, SeqSize, 1> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >; +}; + +// Recursion helper for 'make_integer_sequence'. +// 'Gen::type' is an alias for 'integer_sequence'. +template +struct Gen +{ + using type = + typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type; +}; + +template +struct Gen +{ + using type = integer_sequence; +}; + +} // namespace utility_internal + +// Compile-time sequences of integers + +// make_integer_sequence +// +// This template alias is equivalent to +// `integer_sequence`, and is designed to be a drop-in +// replacement for C++14's `std::make_integer_sequence`. +template +using make_integer_sequence = typename utility_internal::Gen::type; + +// make_index_sequence +// +// This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`, +// and is designed to be a drop-in replacement for C++14's +// `std::make_index_sequence`. +template +using make_index_sequence = make_integer_sequence; + +// index_sequence_for +// +// Converts a typename pack into an index sequence of the same length, and +// is designed to be a drop-in replacement for C++14's +// `std::index_sequence_for()` +template +using index_sequence_for = make_index_sequence; + +//// END OF CODE FROM GOOGLE ABSEIL + +#endif + +// dispatch utility (taken from ranges-v3) +template struct priority_tag : priority_tag < N - 1 > {}; +template<> struct priority_tag<0> {}; + +// taken from ranges-v3 +template +struct static_const +{ + static JSON_INLINE_VARIABLE constexpr T value{}; +}; + +#ifndef JSON_HAS_CPP_17 + template + constexpr T static_const::value; +#endif + +template +inline constexpr std::array make_array(Args&& ... args) +{ + return std::array {{static_cast(std::forward(args))...}}; +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // numeric_limits +#include // false_type, is_constructible, is_integral, is_same, true_type +#include // declval +#include // tuple +#include // char_traits + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // random_access_iterator_tag + +// #include + +// #include + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +struct iterator_types {}; + +template +struct iterator_types < + It, + void_t> +{ + using difference_type = typename It::difference_type; + using value_type = typename It::value_type; + using pointer = typename It::pointer; + using reference = typename It::reference; + using iterator_category = typename It::iterator_category; +}; + +// This is required as some compilers implement std::iterator_traits in a way that +// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. +template +struct iterator_traits +{ +}; + +template +struct iterator_traits < T, enable_if_t < !std::is_pointer::value >> + : iterator_types +{ +}; + +template +struct iterator_traits::value>> +{ + using iterator_category = std::random_access_iterator_tag; + using value_type = T; + using difference_type = ptrdiff_t; + using pointer = T*; + using reference = T&; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin); + +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end); + +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann +// SPDX-License-Identifier: MIT + +#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ + #define INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + #include // int64_t, uint64_t + #include // map + #include // allocator + #include // string + #include // vector + + // #include + + + /*! + @brief namespace for Niels Lohmann + @see https://github.com/nlohmann + @since version 1.0.0 + */ + NLOHMANN_JSON_NAMESPACE_BEGIN + + /*! + @brief default JSONSerializer template argument + + This serializer ignores the template arguments and uses ADL + ([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) + for serialization. + */ + template + struct adl_serializer; + + /// a class to store JSON values + /// @sa https://json.nlohmann.me/api/basic_json/ + template class ObjectType = + std::map, + template class ArrayType = std::vector, + class StringType = std::string, class BooleanType = bool, + class NumberIntegerType = std::int64_t, + class NumberUnsignedType = std::uint64_t, + class NumberFloatType = double, + template class AllocatorType = std::allocator, + template class JSONSerializer = + adl_serializer, + class BinaryType = std::vector, // cppcheck-suppress syntaxError + class CustomBaseClass = void> + class basic_json; + + /// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document + /// @sa https://json.nlohmann.me/api/json_pointer/ + template + class json_pointer; + + /*! + @brief default specialization + @sa https://json.nlohmann.me/api/json/ + */ + using json = basic_json<>; + + /// @brief a minimal map-like container that preserves insertion order + /// @sa https://json.nlohmann.me/api/ordered_map/ + template + struct ordered_map; + + /// @brief specialization that maintains the insertion order of object keys + /// @sa https://json.nlohmann.me/api/ordered_json/ + using ordered_json = basic_json; + + NLOHMANN_JSON_NAMESPACE_END + +#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + +NLOHMANN_JSON_NAMESPACE_BEGIN +/*! +@brief detail namespace with internal helper functions + +This namespace collects functions that should not be exposed, +implementations of some @ref basic_json methods, and meta-programming helpers. + +@since version 2.1.0 +*/ +namespace detail +{ + +///////////// +// helpers // +///////////// + +// Note to maintainers: +// +// Every trait in this file expects a non CV-qualified type. +// The only exceptions are in the 'aliases for detected' section +// (i.e. those of the form: decltype(T::member_function(std::declval()))) +// +// In this case, T has to be properly CV-qualified to constraint the function arguments +// (e.g. to_json(BasicJsonType&, const T&)) + +template struct is_basic_json : std::false_type {}; + +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct is_basic_json : std::true_type {}; + +// used by exceptions create() member functions +// true_type for pointer to possibly cv-qualified basic_json or std::nullptr_t +// false_type otherwise +template +struct is_basic_json_context : + std::integral_constant < bool, + is_basic_json::type>::type>::value + || std::is_same::value > +{}; + +////////////////////// +// json_ref helpers // +////////////////////// + +template +class json_ref; + +template +struct is_json_ref : std::false_type {}; + +template +struct is_json_ref> : std::true_type {}; + +////////////////////////// +// aliases for detected // +////////////////////////// + +template +using mapped_type_t = typename T::mapped_type; + +template +using key_type_t = typename T::key_type; + +template +using value_type_t = typename T::value_type; + +template +using difference_type_t = typename T::difference_type; + +template +using pointer_t = typename T::pointer; + +template +using reference_t = typename T::reference; + +template +using iterator_category_t = typename T::iterator_category; + +template +using to_json_function = decltype(T::to_json(std::declval()...)); + +template +using from_json_function = decltype(T::from_json(std::declval()...)); + +template +using get_template_function = decltype(std::declval().template get()); + +// trait checking if JSONSerializer::from_json(json const&, udt&) exists +template +struct has_from_json : std::false_type {}; + +// trait checking if j.get is valid +// use this trait instead of std::is_constructible or std::is_convertible, +// both rely on, or make use of implicit conversions, and thus fail when T +// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958) +template +struct is_getable +{ + static constexpr bool value = is_detected::value; +}; + +template +struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if JSONSerializer::from_json(json const&) exists +// this overload is used for non-default-constructible user-defined-types +template +struct has_non_default_from_json : std::false_type {}; + +template +struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if BasicJsonType::json_serializer::to_json exists +// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion. +template +struct has_to_json : std::false_type {}; + +template +struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +template +using detect_key_compare = typename T::key_compare; + +template +struct has_key_compare : std::integral_constant::value> {}; + +// obtains the actual object key comparator +template +struct actual_object_comparator +{ + using object_t = typename BasicJsonType::object_t; + using object_comparator_t = typename BasicJsonType::default_object_comparator_t; + using type = typename std::conditional < has_key_compare::value, + typename object_t::key_compare, object_comparator_t>::type; +}; + +template +using actual_object_comparator_t = typename actual_object_comparator::type; + +///////////////// +// char_traits // +///////////////// + +// Primary template of char_traits calls std char_traits +template +struct char_traits : std::char_traits +{}; + +// Explicitly define char traits for unsigned char since it is not standard +template<> +struct char_traits : std::char_traits +{ + using char_type = unsigned char; + using int_type = uint64_t; + + // Redefine to_int_type function + static int_type to_int_type(char_type c) noexcept + { + return static_cast(c); + } + + static char_type to_char_type(int_type i) noexcept + { + return static_cast(i); + } + + static constexpr int_type eof() noexcept + { + return static_cast(EOF); + } +}; + +// Explicitly define char traits for signed char since it is not standard +template<> +struct char_traits : std::char_traits +{ + using char_type = signed char; + using int_type = uint64_t; + + // Redefine to_int_type function + static int_type to_int_type(char_type c) noexcept + { + return static_cast(c); + } + + static char_type to_char_type(int_type i) noexcept + { + return static_cast(i); + } + + static constexpr int_type eof() noexcept + { + return static_cast(EOF); + } +}; + +/////////////////// +// is_ functions // +/////////////////// + +// https://en.cppreference.com/w/cpp/types/conjunction +template struct conjunction : std::true_type { }; +template struct conjunction : B { }; +template +struct conjunction +: std::conditional(B::value), conjunction, B>::type {}; + +// https://en.cppreference.com/w/cpp/types/negation +template struct negation : std::integral_constant < bool, !B::value > { }; + +// Reimplementation of is_constructible and is_default_constructible, due to them being broken for +// std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367). +// This causes compile errors in e.g. clang 3.5 or gcc 4.9. +template +struct is_default_constructible : std::is_default_constructible {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_constructible : std::is_constructible {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_iterator_traits : std::false_type {}; + +template +struct is_iterator_traits> +{ + private: + using traits = iterator_traits; + + public: + static constexpr auto value = + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value; +}; + +template +struct is_range +{ + private: + using t_ref = typename std::add_lvalue_reference::type; + + using iterator = detected_t; + using sentinel = detected_t; + + // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator + // and https://en.cppreference.com/w/cpp/iterator/sentinel_for + // but reimplementing these would be too much work, as a lot of other concepts are used underneath + static constexpr auto is_iterator_begin = + is_iterator_traits>::value; + + public: + static constexpr bool value = !std::is_same::value && !std::is_same::value && is_iterator_begin; +}; + +template +using iterator_t = enable_if_t::value, result_of_begin())>>; + +template +using range_value_t = value_type_t>>; + +// The following implementation of is_complete_type is taken from +// https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/ +// and is written by Xiang Fan who agreed to using it in this library. + +template +struct is_complete_type : std::false_type {}; + +template +struct is_complete_type : std::true_type {}; + +template +struct is_compatible_object_type_impl : std::false_type {}; + +template +struct is_compatible_object_type_impl < + BasicJsonType, CompatibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + // macOS's is_constructible does not play well with nonesuch... + static constexpr bool value = + is_constructible::value && + is_constructible::value; +}; + +template +struct is_compatible_object_type + : is_compatible_object_type_impl {}; + +template +struct is_constructible_object_type_impl : std::false_type {}; + +template +struct is_constructible_object_type_impl < + BasicJsonType, ConstructibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + static constexpr bool value = + (is_default_constructible::value && + (std::is_move_assignable::value || + std::is_copy_assignable::value) && + (is_constructible::value && + std::is_same < + typename object_t::mapped_type, + typename ConstructibleObjectType::mapped_type >::value)) || + (has_from_json::value || + has_non_default_from_json < + BasicJsonType, + typename ConstructibleObjectType::mapped_type >::value); +}; + +template +struct is_constructible_object_type + : is_constructible_object_type_impl {}; + +template +struct is_compatible_string_type +{ + static constexpr auto value = + is_constructible::value; +}; + +template +struct is_constructible_string_type +{ + // launder type through decltype() to fix compilation failure on ICPC +#ifdef __INTEL_COMPILER + using laundered_type = decltype(std::declval()); +#else + using laundered_type = ConstructibleStringType; +#endif + + static constexpr auto value = + conjunction < + is_constructible, + is_detected_exact>::value; +}; + +template +struct is_compatible_array_type_impl : std::false_type {}; + +template +struct is_compatible_array_type_impl < + BasicJsonType, CompatibleArrayType, + enable_if_t < + is_detected::value&& + is_iterator_traits>>::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 + !std::is_same>::value >> +{ + static constexpr bool value = + is_constructible>::value; +}; + +template +struct is_compatible_array_type + : is_compatible_array_type_impl {}; + +template +struct is_constructible_array_type_impl : std::false_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t::value >> + : std::true_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t < !std::is_same::value&& + !is_compatible_string_type::value&& + is_default_constructible::value&& +(std::is_move_assignable::value || + std::is_copy_assignable::value)&& +is_detected::value&& +is_iterator_traits>>::value&& +is_detected::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 +!std::is_same>::value&& + is_complete_type < + detected_t>::value >> +{ + using value_type = range_value_t; + + static constexpr bool value = + std::is_same::value || + has_from_json::value || + has_non_default_from_json < + BasicJsonType, + value_type >::value; +}; + +template +struct is_constructible_array_type + : is_constructible_array_type_impl {}; + +template +struct is_compatible_integer_type_impl : std::false_type {}; + +template +struct is_compatible_integer_type_impl < + RealIntegerType, CompatibleNumberIntegerType, + enable_if_t < std::is_integral::value&& + std::is_integral::value&& + !std::is_same::value >> +{ + // is there an assert somewhere on overflows? + using RealLimits = std::numeric_limits; + using CompatibleLimits = std::numeric_limits; + + static constexpr auto value = + is_constructible::value && + CompatibleLimits::is_integer && + RealLimits::is_signed == CompatibleLimits::is_signed; +}; + +template +struct is_compatible_integer_type + : is_compatible_integer_type_impl {}; + +template +struct is_compatible_type_impl: std::false_type {}; + +template +struct is_compatible_type_impl < + BasicJsonType, CompatibleType, + enable_if_t::value >> +{ + static constexpr bool value = + has_to_json::value; +}; + +template +struct is_compatible_type + : is_compatible_type_impl {}; + +template +struct is_constructible_tuple : std::false_type {}; + +template +struct is_constructible_tuple> : conjunction...> {}; + +template +struct is_json_iterator_of : std::false_type {}; + +template +struct is_json_iterator_of : std::true_type {}; + +template +struct is_json_iterator_of : std::true_type +{}; + +// checks if a given type T is a template specialization of Primary +template