diff --git a/.gitignore b/.gitignore index da6ed1a..0c289a1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -# Project exclude paths +# Project exclude paths /cmake-build-debug/ \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore index 13566b8..1c2fda5 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -1,8 +1,8 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/PhysicsFormula.iml b/.idea/PhysicsFormula.iml index f08604b..6d70257 100644 --- a/.idea/PhysicsFormula.iml +++ b/.idea/PhysicsFormula.iml @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml index a55e7a1..df5f35d 100644 --- a/.idea/codeStyles/codeStyleConfig.xml +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 79b3c94..f1c67df 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 68962e0..ee276c7 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -1,8 +1,8 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..9661ac7 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/Angle.cpp b/Angle.cpp index 01467bf..dcdca8b 100644 --- a/Angle.cpp +++ b/Angle.cpp @@ -1,65 +1,65 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// -#include - -#include "Angle.h" - -//float rez::AngleLines2D( const Line2d& l1, const Line2d l2) -//{ -// auto mag_l1 = l1.direction().magnitude(); -// auto mag_l2 = l2.direction().magnitude(); -// auto dot = dotProduct(l1.direction(), l2.direction()); -// -// auto theta = acos( fabs(dot) / (mag_l1 * mag_l2)); -// return RadianceToDegrees(theta); -//} - -//float rez::AngleLines3D(const Line& l1, const Line& l2) -//{ -// auto mag_l1 = l1.direction().magnitude(); -// auto mag_l2 = l2.direction().magnitude(); -// auto dot = dotProduct(l1.direction(), l2.direction()); -// -// auto theta = acos(fabs(dot) / (mag_l1 * mag_l2)); -// return RadianceToDegrees(theta); -//} - -//float rez::AngleLinePlane(const Line& l, const Planef p) -//{ -// auto dot = dotProduct(l.direction(), p.getNormal()); -// auto theta = acos(fabs(dot)); -// theta = RadianceToDegrees(theta); -// return 90- theta; -//} - -using namespace rez; - -template -static float getAngle(rez::Vector v1, rez::Vector v2) -{ - auto dot = dotProduct(v1, v2); - auto theta = acos(fabs(dot)); - return RadianceToDegrees(theta); -} - -float rez::AngleLines2D(const Line2d& l1, const Line2d l2) -{ - return getAngle(l1.direction(), l2.direction()); -} - -float rez::AngleLines3D(const Line& l1, const Line& l2) -{ - return getAngle(l1.direction(), l2.direction()); -} - -float rez::AngleLinePlane(const Line& l, const Planef p) -{ - auto theta = getAngle(l.direction(), p.getNormal()); - return 90 - theta; -} - -float rez::AnglePlanes(const Planef p1, const Planef p2) -{ - return getAngle(p1.getNormal(), p2.getNormal()); -} +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// +#include + +#include "Angle.h" + +//float rez::AngleLines2D( const Line2d& l1, const Line2d l2) +//{ +// auto mag_l1 = l1.direction().magnitude(); +// auto mag_l2 = l2.direction().magnitude(); +// auto dot = dotProduct(l1.direction(), l2.direction()); +// +// auto theta = acos( fabs(dot) / (mag_l1 * mag_l2)); +// return RadianceToDegrees(theta); +//} + +//float rez::AngleLines3D(const Line& l1, const Line& l2) +//{ +// auto mag_l1 = l1.direction().magnitude(); +// auto mag_l2 = l2.direction().magnitude(); +// auto dot = dotProduct(l1.direction(), l2.direction()); +// +// auto theta = acos(fabs(dot) / (mag_l1 * mag_l2)); +// return RadianceToDegrees(theta); +//} + +//float rez::AngleLinePlane(const Line& l, const Planef p) +//{ +// auto dot = dotProduct(l.direction(), p.getNormal()); +// auto theta = acos(fabs(dot)); +// theta = RadianceToDegrees(theta); +// return 90- theta; +//} + +using namespace rez; + +template +static float getAngle(rez::Vector v1, rez::Vector v2) +{ + auto dot = dotProduct(v1, v2); + auto theta = acos(fabs(dot)); + return RadianceToDegrees(theta); +} + +float rez::AngleLines2D(const Line2d& l1, const Line2d l2) +{ + return getAngle(l1.direction(), l2.direction()); +} + +float rez::AngleLines3D(const Line& l1, const Line& l2) +{ + return getAngle(l1.direction(), l2.direction()); +} + +float rez::AngleLinePlane(const Line& l, const Planef p) +{ + auto theta = getAngle(l.direction(), p.getNormal()); + return 90 - theta; +} + +float rez::AnglePlanes(const Planef p1, const Planef p2) +{ + return getAngle(p1.getNormal(), p2.getNormal()); +} diff --git a/Angle.h b/Angle.h index d05e23e..e727268 100644 --- a/Angle.h +++ b/Angle.h @@ -1,19 +1,19 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_ANGLE_H -#define PHYSICSFORMULA_ANGLE_H -#include "Line.h" -#include "Plane.h" - -namespace rez { - float AngleLines2D(const Line2d& l1, const Line2d l2); - - float AngleLines3D(const Line& l1, const Line& l2); - - float AngleLinePlane(const Line& l, const Planef p); - - float AnglePlanes(const Planef p1, const Planef p2); -}; -#endif //PHYSICSFORMULA_ANGLE_H +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_ANGLE_H +#define PHYSICSFORMULA_ANGLE_H +#include "Line.h" +#include "Plane.h" + +namespace rez { + float AngleLines2D(const Line2d& l1, const Line2d l2); + + float AngleLines3D(const Line& l1, const Line& l2); + + float AngleLinePlane(const Line& l, const Planef p); + + float AnglePlanes(const Planef p1, const Planef p2); +}; +#endif //PHYSICSFORMULA_ANGLE_H diff --git a/AtomicPhysics.h b/AtomicPhysics.h index ac8138b..cca561b 100644 --- a/AtomicPhysics.h +++ b/AtomicPhysics.h @@ -1,429 +1,429 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_ATOMICPHYSICS_H -#define PHYSICSFORMULA_ATOMICPHYSICS_H - -#include "ElectricCharge.h" -#include "PeriodicElements.h" -// speed of light in a vacuum is 299792458 m/s -constexpr auto _LIGHT_SPEED_ = 2.99792458e8;//2.9979*10^8 - - -/// -/// the Rydberg constant is expressed for either hydrogen as R_H or at the limit -/// of infinite nuclear mass as R_∞. In either case, the constant is used to -/// express the limiting value of the highest wave number (inverse wavelength) -/// of any photon that can be emitted from an atom, or, alternatively, -/// the wave number of the lowest-energy photon capable of ionizing an atom from -/// its ground state. The hydrogen spectral series can be expressed simply in -/// terms of the Rydberg constant for hydrogen R_H and the Rydberg formula. -/// -constexpr auto _RYDBERG_ = 1.09678e7; -constexpr auto _R_H_ = _RYDBERG_; - -/// -/// The Bohr radius is a physical constant, equal to the most probable distance -/// between the nucleus and the electron in a hydrogen atom in its ground state. -/// It is named after Niels Bohr, due to its role in the Bohr model of an atom. -/// Its value is 5.29177210903×10⁻¹¹ -/// -constexpr auto _BOHR_RADIUS_ = 5.29177210903e-11; -constexpr auto _A_B_ = (_PLANKS_J_*_PLANKS_J_)/(4.0*(_PI_*_PI_)*_ELECTRON_MASS_*_k_*(_PROTON_CHARGE_*_PROTON_CHARGE_)); - -/// -/// After performing an uncertainty analysis, it was found that the electron -/// charge to mass ratio is most accurately reported as 1.71×10¹¹ ± 5.9×10^9 C/kg -/// -constexpr auto _Q2M_E_ = _ELECTRON_CHARGE_/_ELECTRON_MASS_; - -/// -/// The Proton Charge to Mass ratio is 95788335.8 C/kg. -/// -constexpr auto _Q2M_P_ = _PROTON_CHARGE_/_PROTON_MASS_; - -/// -/// The atomic physics object count -/// -static int atomicPhysics_objectCount = 0; - -static struct HydrogenSpectralSeries -{ - HydrogenSpectralSeries() - {} - HydrogenSpectralSeries(int further ) - { - FURTHER = further; - } - const long double LYMAN = 1.0; - const long double BALMER = 2.0; - const long double PASCHEN = 3.0; - const long double BRACKETT = 4.0; - const long double PFUND = 5.0; - const long double HUMPHREYS = 6.0; - long double FURTHER = 7.0; // FURTHER >6 - -}n_f; - -//α=224,ß=225,π=227,Σ=228,σ=229,µ=230,τ=231,Φ=232,Θ=233 -//Ω=234,δ=235,∞=236,φ=237,ε=238,∩=239,≡=240,Γ=226,γ, σ, ϑ, Å, Ώ, λ, γ, Δ -/** - * @class AtomicPhysics - * @details class of static methods that relate to chapter 30 of the - * open-stax college physics text book. - * @author Ryan Zurrin - * dateBuilt 6/8/2021 - * lastEdit 6/8/2021 - */ -class AtomicPhysics -{ - - long double atomPhysicsVar; - static auto countIncrease() { atomicPhysics_objectCount += 1; } - static auto countDecrease() { atomicPhysics_objectCount -= 1; } -public: - AtomicPhysics() - { - - atomPhysicsVar = 0.0; - countIncrease(); - } - - /** - * @brief copy constructor - */ - AtomicPhysics(const AtomicPhysics& t) - { - atomPhysicsVar = t.atomPhysicsVar; - countIncrease(); - } - /** - * #brief move constructor - */ - AtomicPhysics(AtomicPhysics&& t) noexcept - { - atomPhysicsVar = t.atomPhysicsVar; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - AtomicPhysics& operator=(AtomicPhysics&& t) noexcept - { - if (this != &t) - { - std::swap(atomPhysicsVar, t.atomPhysicsVar); - countIncrease(); - } - return *this; - } - - /** - * @brief user-defined copy assignment (copy-and-swap idiom) - */ - AtomicPhysics& operator=(AtomicPhysics other) - { - std::swap(atomPhysicsVar, other.atomPhysicsVar); - return *this; - } - - static void show_objectCount() { std::cout << "\n atomic physics object count: " - << atomicPhysics_objectCount << std::endl; } - static int get_objectCount() { return atomicPhysics_objectCount; } - - auto setTemplateVar(long double var) { atomPhysicsVar = var; } - [[nodiscard]] auto getTemplateVar() const { return atomPhysicsVar; } - - - /// - /// Rutherford found the size of the nucleus to be about 10−15 m . - /// This implied a huge density. Calculate what would this density be for some - /// other element such as gold. - /// - /// The element mass. - /// - template - static constexpr auto elementDensityFromNucleusSize(const T elementMass); - - /// - /// In Millikan’s oil-drop experiment, one looks at a small oil drop held - /// motionless between two plates. Take the voltage between the plates to - /// be 2033 V, and the plate separation to be 2.00 cm. The oil drop - /// (of density 0.81 g/cm3) has a diameter of 4.0×10−6 m . Calculate the - /// charge on the drop, in terms of electron units - /// - /// The volts. - /// The plate separation distance. - /// The density. - /// The diameter - /// charge on the oil drop - template - static constexpr auto chargeOnDrop(const V volts, const D d, const P p, const A diameter); - - /// - /// An aspiring physicist wants to build a scale model of a hydrogen atom - /// for her science fair project. If the atom is d m in diameter, - /// how big should she try to make the nucleus - /// - /// The diameter. - /// size of nucleus on model - template - static constexpr auto toScale(const D d); - - /// - /// calculate the wavelength within the hydrogen spectrum using the Rydberg - /// constant and this formula. n_i and n_f are integer values where n_i is - /// always at least one larger then n_f. - /// - /// positive integer larger then > n_f - /// The positive integer associated with some series.. - /// wavelength of hydrogen spectrum element - template - static constexpr auto hydrogenSpectrum_wavelength(const NI n_i, const NF n_f); - - /// - /// If a hydrogen atom has its electron in the n=4 state, - /// Calculate how much energy in eV is needed to ionize it. - /// - /// The state. - /// The e 0. - /// - template - static constexpr auto energyToIonizedState(const N state, const E E_0); - - /// - /// A hydrogen atom in an excited state can be ionized with less energy - /// than when it is in its ground state(e_0). What is n for a hydrogen atom if - /// 0.850 eV(e_i) of energy can ionize it - /// - /// The e 0. - /// The e i. - /// - template - static constexpr auto stateOfExcitedAtom(const E0 e_0, const EI e_i); - - /// - /// How much energy in eV is needed to ionize the ion from this excited state? - /// - /// The e 0. - /// The atomic weight or mass (z). - /// The excited state the atom is in now. - /// energy needed to ionize atom from excited state - template - static constexpr auto energyNeededToIonizeAtom(const E0 e_0, const Z z, const N n); - - /// - /// Find the radius of a hydrogen atom in the n=2 state according to Bohr’s - /// theory. - /// - /// The n. - /// The z. - /// - template - static constexpr auto atomRadius_nState(const N n, const Z z); - - /// - /// What is the smallest-wavelength line in the Balmer series? Is it in the - /// visible part of the spectrum? - /// - /// The n f. - /// - template - static constexpr auto smallest_wavelength(const NF n_f); - - /// - /// A wavelength of 4.653 μm is observed in a hydrogen spectrum for a - /// transition that ends in the nf=5 level. What was ni for the initial - /// level of the electron - /// - /// The theta. - /// The n f. - /// - template - static constexpr auto initialEnergyLevel(const W theta, const NF n_f); - - /// - /// Atoms can be ionized by thermal collisions, such as at the high - /// temperatures found in the solar corona. One such ion is C^+5(z), a carbon - /// atom with only a single electron. What is the wavelength of the first - /// line(n_f) in this ion’s Paschen series(n_i) - /// - /// The ground state. - /// The atomic number z. - /// The initial electron orbit. - /// The final electron orbit. - /// - template - static constexpr auto wavelength_nLineInIonsSeries( - const E0 e_0, const Z z, const N n_i, const N n_f); - - /// - /// Calculate the shortest-wavelength x-ray radiation that can be generated - /// in an x-ray tube with an applied voltage of 50.0 kV(volts) - /// - /// The volts. - /// shortest wavelength - template - static constexpr auto shortestWavelength_xRayTubeAppliedVoltage(const V volts); - - /// - /// Calculate the photon energy in eV - /// - /// The theta. - /// energy in eV - template - static constexpr auto photonEnergy_eV(const W theta); - - /// - /// What are the approximate energies of the Kα x-rays for copper(z) - /// - /// The e 0. - /// The z. - /// energy of x-ray for Kα transition - template - static constexpr auto energyK_alphaTransition(const E0 e_0, const Z z); - - /// - /// What are the approximate energies of the Kβ x-rays for copper(z) - /// - /// The e 0. - /// The z. - /// energy of x-ray for Kβ transition - template - static constexpr auto energyK_betaTransition(const E0 e_0, const Z z); - - /// - /// A helium-neon laser is pumped by electric discharge. Calculate the wavelength - /// the electromagnetic radiation would need to be to pump it if it was - /// being energized by 20.61eV(volts). - /// - /// The energy supplied. - /// wavelength - template - static constexpr auto wavelengthNeededToPumpLaserTo_evState(const E energy); - - /// - /// Calculate the magnitude of the angular momentum for an l=1(l) electron. - /// - /// The l. - /// magnitude of angular momentum - template - static constexpr auto magnitudeAngularMomentum(const L l); - - - - ~AtomicPhysics() = default; - - - - -}; -#endif //PHYSICSFORMULA_ATOMICPHYSICS_H - -template -constexpr auto AtomicPhysics::elementDensityFromNucleusSize(const T elementMass) -{ - return elementMass / ((4.0 / 3.0) * _PI_ * (pow((1e-15/2.0), 3))); -} - -template -constexpr auto AtomicPhysics::chargeOnDrop(const V volts, const D d, const P p, const A diameter) -{ - return ((d * _PI_ * pow(diameter, 3) * p * _Ga_) / (6.0 * volts))* (1/_PROTON_CHARGE_); -} - -template -constexpr auto AtomicPhysics::toScale(const D d) -{ - return (d * 1e-15) / 1e-10; -} - -template -constexpr auto AtomicPhysics::hydrogenSpectrum_wavelength(const NI n_i, const NF n_f) -{ - return 1.0 / (_RYDBERG_ * ((1.0 / (n_f * n_f)) - (1.0 / (n_i * n_i)))); -} - -template -constexpr auto AtomicPhysics::energyToIonizedState(const N state, const E E_0) -{ - return E_0 / pow(state, 2); -} - -template -constexpr auto AtomicPhysics::stateOfExcitedAtom(const E0 e_0, const EI e_i) -{ - return sqrt(-e_0 / -e_i); -} - -template -constexpr auto AtomicPhysics::energyNeededToIonizeAtom(const E0 e_0, const Z z, const N n) -{ - - return -(e_0 * ((z*z)/(n*n))); -} - -template -constexpr auto AtomicPhysics::atomRadius_nState(const N n, const Z z) -{ - return ((n * n) / z) * _A_B_; -} - -template -constexpr auto AtomicPhysics::smallest_wavelength(const NF n_f) -{ - return (n_f * n_f) / _RYDBERG_; -} - -template -constexpr auto AtomicPhysics::initialEnergyLevel(const W theta, const NF n_f) -{ - return n_f * sqrt((theta * _RYDBERG_) / ((_RYDBERG_ * theta) - (n_f * n_f))); -} - -template -constexpr auto AtomicPhysics::wavelength_nLineInIonsSeries(const E0 e_0, const Z z, const N n_i, const N n_f) -{ - auto E_i = energyNeededToIonizeAtom(e_0, z, n_i); - auto E_f = energyNeededToIonizeAtom(e_0, z, n_f); - return _PLANKS_C_ / (E_i - E_f); -} - -template -constexpr auto AtomicPhysics::shortestWavelength_xRayTubeAppliedVoltage(const V volts) -{ - return (_PLANKS_J_*_LIGHT_SPEED_) / (_PROTON_CHARGE_ * volts); -} - -template -constexpr auto AtomicPhysics::photonEnergy_eV(const W theta) -{ - return _PLANKS_C_ / theta; -} - -template -constexpr auto AtomicPhysics::energyK_alphaTransition(const E0 e_0, const Z z) -{ - return e_0 * (z * z) * (1.0 - (1.0 / (2.0 * 2.0))); -} - -template -constexpr auto AtomicPhysics::energyK_betaTransition(const E0 e_0, const Z z) -{ - return e_0 * (z * z) * (1.0 - (1.0 / (3.0 * 3.0))); -} - -template -constexpr auto AtomicPhysics::wavelengthNeededToPumpLaserTo_evState(const E energy) -{ - return _PLANKS_C_ / energy; -} - -template -constexpr auto AtomicPhysics::magnitudeAngularMomentum(const L l) -{ - return sqrt(l * (l + 1.0)) * (_PLANKS_J_ / (2.0 * _PI_)); -} - - +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_ATOMICPHYSICS_H +#define PHYSICSFORMULA_ATOMICPHYSICS_H + +#include "ElectricCharge.h" +#include "PeriodicElements.h" +// speed of light in a vacuum is 299792458 m/s +constexpr auto _LIGHT_SPEED_ = 2.99792458e8;//2.9979*10^8 + + +/// +/// the Rydberg constant is expressed for either hydrogen as R_H or at the limit +/// of infinite nuclear mass as R_∞. In either case, the constant is used to +/// express the limiting value of the highest wave number (inverse wavelength) +/// of any photon that can be emitted from an atom, or, alternatively, +/// the wave number of the lowest-energy photon capable of ionizing an atom from +/// its ground state. The hydrogen spectral series can be expressed simply in +/// terms of the Rydberg constant for hydrogen R_H and the Rydberg formula. +/// +constexpr auto _RYDBERG_ = 1.09678e7; +constexpr auto _R_H_ = _RYDBERG_; + +/// +/// The Bohr radius is a physical constant, equal to the most probable distance +/// between the nucleus and the electron in a hydrogen atom in its ground state. +/// It is named after Niels Bohr, due to its role in the Bohr model of an atom. +/// Its value is 5.29177210903×10⁻¹¹ +/// +constexpr auto _BOHR_RADIUS_ = 5.29177210903e-11; +constexpr auto _A_B_ = (_PLANKS_J_*_PLANKS_J_)/(4.0*(_PI_*_PI_)*_ELECTRON_MASS_*_k_*(_PROTON_CHARGE_*_PROTON_CHARGE_)); + +/// +/// After performing an uncertainty analysis, it was found that the electron +/// charge to mass ratio is most accurately reported as 1.71×10¹¹ ± 5.9×10^9 C/kg +/// +constexpr auto _Q2M_E_ = _ELECTRON_CHARGE_/_ELECTRON_MASS_; + +/// +/// The Proton Charge to Mass ratio is 95788335.8 C/kg. +/// +constexpr auto _Q2M_P_ = _PROTON_CHARGE_/_PROTON_MASS_; + +/// +/// The atomic physics object count +/// +static int atomicPhysics_objectCount = 0; + +static struct HydrogenSpectralSeries +{ + HydrogenSpectralSeries() + {} + HydrogenSpectralSeries(int further ) + { + FURTHER = further; + } + const long double LYMAN = 1.0; + const long double BALMER = 2.0; + const long double PASCHEN = 3.0; + const long double BRACKETT = 4.0; + const long double PFUND = 5.0; + const long double HUMPHREYS = 6.0; + long double FURTHER = 7.0; // FURTHER >6 + +}n_f; + +//α=224,ß=225,π=227,Σ=228,σ=229,µ=230,τ=231,Φ=232,Θ=233 +//Ω=234,δ=235,∞=236,φ=237,ε=238,∩=239,≡=240,Γ=226,γ, σ, ϑ, Å, Ώ, λ, γ, Δ +/** + * @class AtomicPhysics + * @details class of static methods that relate to chapter 30 of the + * open-stax college physics text book. + * @author Ryan Zurrin + * dateBuilt 6/8/2021 + * lastEdit 6/8/2021 + */ +class AtomicPhysics +{ + + long double atomPhysicsVar; + static auto countIncrease() { atomicPhysics_objectCount += 1; } + static auto countDecrease() { atomicPhysics_objectCount -= 1; } +public: + AtomicPhysics() + { + + atomPhysicsVar = 0.0; + countIncrease(); + } + + /** + * @brief copy constructor + */ + AtomicPhysics(const AtomicPhysics& t) + { + atomPhysicsVar = t.atomPhysicsVar; + countIncrease(); + } + /** + * #brief move constructor + */ + AtomicPhysics(AtomicPhysics&& t) noexcept + { + atomPhysicsVar = t.atomPhysicsVar; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + AtomicPhysics& operator=(AtomicPhysics&& t) noexcept + { + if (this != &t) + { + std::swap(atomPhysicsVar, t.atomPhysicsVar); + countIncrease(); + } + return *this; + } + + /** + * @brief user-defined copy assignment (copy-and-swap idiom) + */ + AtomicPhysics& operator=(AtomicPhysics other) + { + std::swap(atomPhysicsVar, other.atomPhysicsVar); + return *this; + } + + static void show_objectCount() { std::cout << "\n atomic physics object count: " + << atomicPhysics_objectCount << std::endl; } + static int get_objectCount() { return atomicPhysics_objectCount; } + + auto setTemplateVar(long double var) { atomPhysicsVar = var; } + [[nodiscard]] auto getTemplateVar() const { return atomPhysicsVar; } + + + /// + /// Rutherford found the size of the nucleus to be about 10−15 m . + /// This implied a huge density. Calculate what would this density be for some + /// other element such as gold. + /// + /// The element mass. + /// + template + static constexpr auto elementDensityFromNucleusSize(const T elementMass); + + /// + /// In Millikan’s oil-drop experiment, one looks at a small oil drop held + /// motionless between two plates. Take the voltage between the plates to + /// be 2033 V, and the plate separation to be 2.00 cm. The oil drop + /// (of density 0.81 g/cm3) has a diameter of 4.0×10−6 m . Calculate the + /// charge on the drop, in terms of electron units + /// + /// The volts. + /// The plate separation distance. + /// The density. + /// The diameter + /// charge on the oil drop + template + static constexpr auto chargeOnDrop(const V volts, const D d, const P p, const A diameter); + + /// + /// An aspiring physicist wants to build a scale model of a hydrogen atom + /// for her science fair project. If the atom is d m in diameter, + /// how big should she try to make the nucleus + /// + /// The diameter. + /// size of nucleus on model + template + static constexpr auto toScale(const D d); + + /// + /// calculate the wavelength within the hydrogen spectrum using the Rydberg + /// constant and this formula. n_i and n_f are integer values where n_i is + /// always at least one larger then n_f. + /// + /// positive integer larger then > n_f + /// The positive integer associated with some series.. + /// wavelength of hydrogen spectrum element + template + static constexpr auto hydrogenSpectrum_wavelength(const NI n_i, const NF n_f); + + /// + /// If a hydrogen atom has its electron in the n=4 state, + /// Calculate how much energy in eV is needed to ionize it. + /// + /// The state. + /// The e 0. + /// + template + static constexpr auto energyToIonizedState(const N state, const E E_0); + + /// + /// A hydrogen atom in an excited state can be ionized with less energy + /// than when it is in its ground state(e_0). What is n for a hydrogen atom if + /// 0.850 eV(e_i) of energy can ionize it + /// + /// The e 0. + /// The e i. + /// + template + static constexpr auto stateOfExcitedAtom(const E0 e_0, const EI e_i); + + /// + /// How much energy in eV is needed to ionize the ion from this excited state? + /// + /// The e 0. + /// The atomic weight or mass (z). + /// The excited state the atom is in now. + /// energy needed to ionize atom from excited state + template + static constexpr auto energyNeededToIonizeAtom(const E0 e_0, const Z z, const N n); + + /// + /// Find the radius of a hydrogen atom in the n=2 state according to Bohr’s + /// theory. + /// + /// The n. + /// The z. + /// + template + static constexpr auto atomRadius_nState(const N n, const Z z); + + /// + /// What is the smallest-wavelength line in the Balmer series? Is it in the + /// visible part of the spectrum? + /// + /// The n f. + /// + template + static constexpr auto smallest_wavelength(const NF n_f); + + /// + /// A wavelength of 4.653 μm is observed in a hydrogen spectrum for a + /// transition that ends in the nf=5 level. What was ni for the initial + /// level of the electron + /// + /// The theta. + /// The n f. + /// + template + static constexpr auto initialEnergyLevel(const W theta, const NF n_f); + + /// + /// Atoms can be ionized by thermal collisions, such as at the high + /// temperatures found in the solar corona. One such ion is C^+5(z), a carbon + /// atom with only a single electron. What is the wavelength of the first + /// line(n_f) in this ion’s Paschen series(n_i) + /// + /// The ground state. + /// The atomic number z. + /// The initial electron orbit. + /// The final electron orbit. + /// + template + static constexpr auto wavelength_nLineInIonsSeries( + const E0 e_0, const Z z, const N n_i, const N n_f); + + /// + /// Calculate the shortest-wavelength x-ray radiation that can be generated + /// in an x-ray tube with an applied voltage of 50.0 kV(volts) + /// + /// The volts. + /// shortest wavelength + template + static constexpr auto shortestWavelength_xRayTubeAppliedVoltage(const V volts); + + /// + /// Calculate the photon energy in eV + /// + /// The theta. + /// energy in eV + template + static constexpr auto photonEnergy_eV(const W theta); + + /// + /// What are the approximate energies of the Kα x-rays for copper(z) + /// + /// The e 0. + /// The z. + /// energy of x-ray for Kα transition + template + static constexpr auto energyK_alphaTransition(const E0 e_0, const Z z); + + /// + /// What are the approximate energies of the Kβ x-rays for copper(z) + /// + /// The e 0. + /// The z. + /// energy of x-ray for Kβ transition + template + static constexpr auto energyK_betaTransition(const E0 e_0, const Z z); + + /// + /// A helium-neon laser is pumped by electric discharge. Calculate the wavelength + /// the electromagnetic radiation would need to be to pump it if it was + /// being energized by 20.61eV(volts). + /// + /// The energy supplied. + /// wavelength + template + static constexpr auto wavelengthNeededToPumpLaserTo_evState(const E energy); + + /// + /// Calculate the magnitude of the angular momentum for an l=1(l) electron. + /// + /// The l. + /// magnitude of angular momentum + template + static constexpr auto magnitudeAngularMomentum(const L l); + + + + ~AtomicPhysics() = default; + + + + +}; +#endif //PHYSICSFORMULA_ATOMICPHYSICS_H + +template +constexpr auto AtomicPhysics::elementDensityFromNucleusSize(const T elementMass) +{ + return elementMass / ((4.0 / 3.0) * _PI_ * (pow((1e-15/2.0), 3))); +} + +template +constexpr auto AtomicPhysics::chargeOnDrop(const V volts, const D d, const P p, const A diameter) +{ + return ((d * _PI_ * pow(diameter, 3) * p * _Ga_) / (6.0 * volts))* (1/_PROTON_CHARGE_); +} + +template +constexpr auto AtomicPhysics::toScale(const D d) +{ + return (d * 1e-15) / 1e-10; +} + +template +constexpr auto AtomicPhysics::hydrogenSpectrum_wavelength(const NI n_i, const NF n_f) +{ + return 1.0 / (_RYDBERG_ * ((1.0 / (n_f * n_f)) - (1.0 / (n_i * n_i)))); +} + +template +constexpr auto AtomicPhysics::energyToIonizedState(const N state, const E E_0) +{ + return E_0 / pow(state, 2); +} + +template +constexpr auto AtomicPhysics::stateOfExcitedAtom(const E0 e_0, const EI e_i) +{ + return sqrt(-e_0 / -e_i); +} + +template +constexpr auto AtomicPhysics::energyNeededToIonizeAtom(const E0 e_0, const Z z, const N n) +{ + + return -(e_0 * ((z*z)/(n*n))); +} + +template +constexpr auto AtomicPhysics::atomRadius_nState(const N n, const Z z) +{ + return ((n * n) / z) * _A_B_; +} + +template +constexpr auto AtomicPhysics::smallest_wavelength(const NF n_f) +{ + return (n_f * n_f) / _RYDBERG_; +} + +template +constexpr auto AtomicPhysics::initialEnergyLevel(const W theta, const NF n_f) +{ + return n_f * sqrt((theta * _RYDBERG_) / ((_RYDBERG_ * theta) - (n_f * n_f))); +} + +template +constexpr auto AtomicPhysics::wavelength_nLineInIonsSeries(const E0 e_0, const Z z, const N n_i, const N n_f) +{ + auto E_i = energyNeededToIonizeAtom(e_0, z, n_i); + auto E_f = energyNeededToIonizeAtom(e_0, z, n_f); + return _PLANKS_C_ / (E_i - E_f); +} + +template +constexpr auto AtomicPhysics::shortestWavelength_xRayTubeAppliedVoltage(const V volts) +{ + return (_PLANKS_J_*_LIGHT_SPEED_) / (_PROTON_CHARGE_ * volts); +} + +template +constexpr auto AtomicPhysics::photonEnergy_eV(const W theta) +{ + return _PLANKS_C_ / theta; +} + +template +constexpr auto AtomicPhysics::energyK_alphaTransition(const E0 e_0, const Z z) +{ + return e_0 * (z * z) * (1.0 - (1.0 / (2.0 * 2.0))); +} + +template +constexpr auto AtomicPhysics::energyK_betaTransition(const E0 e_0, const Z z) +{ + return e_0 * (z * z) * (1.0 - (1.0 / (3.0 * 3.0))); +} + +template +constexpr auto AtomicPhysics::wavelengthNeededToPumpLaserTo_evState(const E energy) +{ + return _PLANKS_C_ / energy; +} + +template +constexpr auto AtomicPhysics::magnitudeAngularMomentum(const L l) +{ + return sqrt(l * (l + 1.0)) * (_PLANKS_J_ / (2.0 * _PI_)); +} + + diff --git a/BinarySearchTree.h b/BinarySearchTree.h index 804e7d1..2667fa9 100644 --- a/BinarySearchTree.h +++ b/BinarySearchTree.h @@ -1,373 +1,373 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_BINARYSEARCHTREE_H -#define PHYSICSFORMULA_BINARYSEARCHTREE_H -// TODO Implement the BST, Braided Search tree and Randomized Search tree as well - -#include -#include -#include -#include -using namespace std; - - -namespace rez { - - template< class KType, class VType, class Compare = std::less> - class BST { - - struct BSTNode { - KType key = {}; - VType value = {}; - BSTNode* left = nullptr; - BSTNode* right = nullptr; - BSTNode* parent = nullptr; - - public: - BSTNode() {} - - BSTNode(KType& _key, VType& _value, BSTNode* _left = nullptr, BSTNode* _right = nullptr, BSTNode* _parent = nullptr) : - key(_key), value(_value), left(_left), right(_right), parent(_parent) {} - }; - - BSTNode* root = nullptr; - Compare comp; - - BSTNode* find(KType& _key); - void transplant(BSTNode* u, BSTNode* v); - BSTNode* treeMin(BSTNode* branch_root); - BSTNode* treeMax(BSTNode* branch_root); - BSTNode* findSplitNode(KType& _min, KType& _max); - bool isLeaf(BSTNode* _node); - void addTreeToAList(BSTNode* _node, std::list&, bool addFront = false); - - public: - BST(KType& _key, VType& _value) { - root = new BSTNode(_key, _value); - } - - BST(std::list>& _data, const unsigned int _root_index = 0) { - root = new BSTNode(_data[_root_index].first, _data[_root_index].second); - for (size_t i = 0; i < _data.size(); i++) { - if (i != _root_index) { - insert(_data[i]); - } - } - } - - void insert(const KType& _value); - void insert(std::list&); - void remove(const KType& _value); - void find(const KType&, const KType&, std::list&); - std::pair predecessor(const KType& _value); - std::pair successor(const KType& _value); - - std::pair minimum(BSTNode* _node = nullptr); - std::pair maximum(BSTNode* _node = nullptr); - bool isEmpty() { - if (root) - return true; - return false; - } - - void inOrderTraverse(BSTNode*, std::list&); - void inOrderTraverse(); - void inOrderHelper(BSTNode* root); - void preOrderTraverse(BSTNode*, std::list&); - void postOrderTraverse(BSTNode*, std::list&); - }; -#endif //PHYSICSFORMULA_BINARYSEARCHTREE_H - - - template - typename BST::BSTNode* BST::find(KType& _key) { - BSTNode* current = root; - while (current && current->key != _key) { - if (comp(current->key, _key)) - current = current->right_child; - else - current = current->left_child; - } - - // Given key is not found in this tree - return current; - } - - template - void BST::transplant(BSTNode* u, BSTNode* v) - { - if (!u->parent) - root = v; - else if (u == u->parent->left_child) - u->parent->left_child = v; - else - u->parent->right_child = v; - - if (v) - v->parent = u->parent; - } - - template - typename BST::BSTNode* BST::treeMin(BSTNode* _branch_root) - { - BSTNode* temp_node = _branch_root; - while (temp_node && temp_node->left_child) { - temp_node = temp_node->left_child; - } - temp_node; - } - - template - typename BST::BSTNode* BST::treeMax(BSTNode* _branch_root) { - BSTNode* temp_node = _branch_root; - while (temp_node && temp_node->right_child) { - temp_node = temp_node->right_child; - } - - return temp_node; - } - - template - typename BST::BSTNode* BST::findSplitNode(KType& _min, KType& _max) { - auto v = root; - while (!isLeaf(v) && (_max <= v->key || _min > v->key)) { - if (_max <= v->key) - v = v->left; - else - v = v->right; - } - return v; - } - - template - bool BST::isLeaf(BSTNode* _node) - { - if (_node && _node->left && _node->right) - return true; - return false; - } - - template - void BST::addTreeToAList(BSTNode* _node, std::list& _list, bool addFront) { - std::list values; - inOrderTravers(_node, values); - if (addFront) - _list.insert(_list.begin(), values.begin(), values.end()); - else - _list.insert(_list.end(), values.begin(), values.end()); - } - - template - void BST::insert(const KType& _value) { - if (!root) { - root = new BSTNode(_value); - return; - } - else { - BSTNode* temp = root; - while (true) { - if (comp(temp->key, _value)) { - if (temp->left) - temp = temp->left; - else { - temp->left = new BSTNode(_value); - temp->left->parent = temp; - break; - } - } - else { - if (temp->right) - temp = temp->right; - else { - temp->right = new BSTNode(_value); - temp->right->parent = temp; - break; - } - } - } - } - } - - template - void BST::insert(std::list& _list) { - for (const auto& key : _list) { - insert(key); - } - } - - template - void BST::remove(const KType& _value) { - BSTNode* current_node = find(_value); - - if (current_node) { - BSTNode* current_left = current_node->left_child; - BSTNode* current_right = current_node->right_child; - - if (isLeaf(current_node)) - transplant(current_node, nullptr); - - if (!current_left) { - transplant(current_node, current_right); - } - else if (!current_right) { - transplant(current_node, current_left); - } - else { - BSTNode* right_min = treeMin(current_right); - if (right_min->parent != current_node) { - transplant(right_min, right_min->right_child); - right_min->right_child = current_node->right_child; - right_min->right_child->parent = right_min; - } - - transplant(current_node, right_min); - right_min->left_child = current_node->left_child; - right_min->left_child->parent = right_min; - } - } - } - - template - void BST::find(const KType& _min, const KType& _max, std::list& _list) - { - auto v_split = findSplitNode(_min, _max); - if (isLeaf(v_split)) { - if (v_split->key >= _min && v_split->key < _max) - _list.insert(_list.push_front(v_split->key)); - } - else { - //Follow the path to left boundary - auto v = v_split->left; - while (!isLeaf(v)) { - if (_min <= v->key) { - addTreeToAList(v->right, _list, true); - _list.push_front(v->key); - v = v->left; - } - else - v = v->right; - } - if (v->key >= _min) - _list.insert(_list.push_front(v->key)); - - v = v_split->right; - while (!isLeaf(v)) { - if (_max >= v->key) { - addTreeToAList(v->left, _list); - v = v->right; - } - else - v = v->left; - } - if (v->key <= _max) - _list.insert(_list.push_back(v->key)); - } - } - - template - std::pair BST::predecessor(const KType& _value) { - //BSTNode* current_node = find(_value); - //if (current_node){ - // BSTNode* max_left = nullptr; - // max_left = treeMax(current_node->left_child); - // if (max_left) - // return max_left->key; - // else { - // auto parent = current_node->parent; - // while (parent && parent->parent){ - // parent = parent->parent; - // if (parent->left) - // return parent->key; - // } - // } - //} - //return _value; - } - - template - std::pair BST::successor(const KType& _value) { - //BSTNode* current_node = find(_value); - //if (current_node){ - // BSTNode* min_right = nullptr; - // min_right = treeMax(current_node->right_child); - // if (min_right) - // return min_right->key; - // else { - // auto parent = current_node->parent; - // while (parent && parent->parent) { - // parent = parent->parent; - // if (parent->right) - // return parent->key; - // } - // } - //} - //return _value; - } - - template - void BST::inOrderTraverse(BSTNode* _node, std::list& _list) { - if (!_node) - return; - inOrderTravers(_node->left, _list); - _list.push_back(_node->value); - inOrderTravers(_node->right, _list); - } - - template - inline void BST::inOrderTraverse() - { - BSTNode* curr = root; - if (!curr) - return; - inOrderHelper(curr); - } - - template - inline void BST::inOrderHelper(BSTNode* root) - { - inOrderHelper(root->left); - std::cout << root->key << " "; - inOrderHelper(root->right); - } - - template - void BST::preOrderTraverse(BSTNode* _node, std::list& _list) { - if (!_node) - return; - _list.push_back(_node->value); - inOrderTravers(_node->left, _list); - inOrderTravers(_node->right, _list); - } - - template - void BST::postOrderTraverse(BSTNode* _node, std::list& _list) { - if (!_node) - return; - inOrderTravers(_node->left, _list); - inOrderTravers(_node->right, _list); - _list.push_back(_node->value); - }\ - - template - std::pair BST::minimum(BSTNode* _node) { - if (!_node) - _node = root; - auto temp = _node; - while (temp->left) - temp = temp->left; - return std::pair(temp->key, temp->value); - } - - template - std::pair BST::maximum(BSTNode* _node) { - if (!_node) - _node = root; - auto temp = _node; - while (temp->right) - temp = temp->right; - return std::pair(temp->key, temp->value); - } -} - +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_BINARYSEARCHTREE_H +#define PHYSICSFORMULA_BINARYSEARCHTREE_H +// TODO Implement the BST, Braided Search tree and Randomized Search tree as well + +#include +#include +#include +#include +using namespace std; + + +namespace rez { + + template< class KType, class VType, class Compare = std::less> + class BST { + + struct BSTNode { + KType key = {}; + VType value = {}; + BSTNode* left = nullptr; + BSTNode* right = nullptr; + BSTNode* parent = nullptr; + + public: + BSTNode() {} + + BSTNode(KType& _key, VType& _value, BSTNode* _left = nullptr, BSTNode* _right = nullptr, BSTNode* _parent = nullptr) : + key(_key), value(_value), left(_left), right(_right), parent(_parent) {} + }; + + BSTNode* root = nullptr; + Compare comp; + + BSTNode* find(KType& _key); + void transplant(BSTNode* u, BSTNode* v); + BSTNode* treeMin(BSTNode* branch_root); + BSTNode* treeMax(BSTNode* branch_root); + BSTNode* findSplitNode(KType& _min, KType& _max); + bool isLeaf(BSTNode* _node); + void addTreeToAList(BSTNode* _node, std::list&, bool addFront = false); + + public: + BST(KType& _key, VType& _value) { + root = new BSTNode(_key, _value); + } + + BST(std::list>& _data, const unsigned int _root_index = 0) { + root = new BSTNode(_data[_root_index].first, _data[_root_index].second); + for (size_t i = 0; i < _data.size(); i++) { + if (i != _root_index) { + insert(_data[i]); + } + } + } + + void insert(const KType& _value); + void insert(std::list&); + void remove(const KType& _value); + void find(const KType&, const KType&, std::list&); + std::pair predecessor(const KType& _value); + std::pair successor(const KType& _value); + + std::pair minimum(BSTNode* _node = nullptr); + std::pair maximum(BSTNode* _node = nullptr); + bool isEmpty() { + if (root) + return true; + return false; + } + + void inOrderTraverse(BSTNode*, std::list&); + void inOrderTraverse(); + void inOrderHelper(BSTNode* root); + void preOrderTraverse(BSTNode*, std::list&); + void postOrderTraverse(BSTNode*, std::list&); + }; +#endif //PHYSICSFORMULA_BINARYSEARCHTREE_H + + + template + typename BST::BSTNode* BST::find(KType& _key) { + BSTNode* current = root; + while (current && current->key != _key) { + if (comp(current->key, _key)) + current = current->right_child; + else + current = current->left_child; + } + + // Given key is not found in this tree + return current; + } + + template + void BST::transplant(BSTNode* u, BSTNode* v) + { + if (!u->parent) + root = v; + else if (u == u->parent->left_child) + u->parent->left_child = v; + else + u->parent->right_child = v; + + if (v) + v->parent = u->parent; + } + + template + typename BST::BSTNode* BST::treeMin(BSTNode* _branch_root) + { + BSTNode* temp_node = _branch_root; + while (temp_node && temp_node->left_child) { + temp_node = temp_node->left_child; + } + temp_node; + } + + template + typename BST::BSTNode* BST::treeMax(BSTNode* _branch_root) { + BSTNode* temp_node = _branch_root; + while (temp_node && temp_node->right_child) { + temp_node = temp_node->right_child; + } + + return temp_node; + } + + template + typename BST::BSTNode* BST::findSplitNode(KType& _min, KType& _max) { + auto v = root; + while (!isLeaf(v) && (_max <= v->key || _min > v->key)) { + if (_max <= v->key) + v = v->left; + else + v = v->right; + } + return v; + } + + template + bool BST::isLeaf(BSTNode* _node) + { + if (_node && _node->left && _node->right) + return true; + return false; + } + + template + void BST::addTreeToAList(BSTNode* _node, std::list& _list, bool addFront) { + std::list values; + inOrderTravers(_node, values); + if (addFront) + _list.insert(_list.begin(), values.begin(), values.end()); + else + _list.insert(_list.end(), values.begin(), values.end()); + } + + template + void BST::insert(const KType& _value) { + if (!root) { + root = new BSTNode(_value); + return; + } + else { + BSTNode* temp = root; + while (true) { + if (comp(temp->key, _value)) { + if (temp->left) + temp = temp->left; + else { + temp->left = new BSTNode(_value); + temp->left->parent = temp; + break; + } + } + else { + if (temp->right) + temp = temp->right; + else { + temp->right = new BSTNode(_value); + temp->right->parent = temp; + break; + } + } + } + } + } + + template + void BST::insert(std::list& _list) { + for (const auto& key : _list) { + insert(key); + } + } + + template + void BST::remove(const KType& _value) { + BSTNode* current_node = find(_value); + + if (current_node) { + BSTNode* current_left = current_node->left_child; + BSTNode* current_right = current_node->right_child; + + if (isLeaf(current_node)) + transplant(current_node, nullptr); + + if (!current_left) { + transplant(current_node, current_right); + } + else if (!current_right) { + transplant(current_node, current_left); + } + else { + BSTNode* right_min = treeMin(current_right); + if (right_min->parent != current_node) { + transplant(right_min, right_min->right_child); + right_min->right_child = current_node->right_child; + right_min->right_child->parent = right_min; + } + + transplant(current_node, right_min); + right_min->left_child = current_node->left_child; + right_min->left_child->parent = right_min; + } + } + } + + template + void BST::find(const KType& _min, const KType& _max, std::list& _list) + { + auto v_split = findSplitNode(_min, _max); + if (isLeaf(v_split)) { + if (v_split->key >= _min && v_split->key < _max) + _list.insert(_list.push_front(v_split->key)); + } + else { + //Follow the path to left boundary + auto v = v_split->left; + while (!isLeaf(v)) { + if (_min <= v->key) { + addTreeToAList(v->right, _list, true); + _list.push_front(v->key); + v = v->left; + } + else + v = v->right; + } + if (v->key >= _min) + _list.insert(_list.push_front(v->key)); + + v = v_split->right; + while (!isLeaf(v)) { + if (_max >= v->key) { + addTreeToAList(v->left, _list); + v = v->right; + } + else + v = v->left; + } + if (v->key <= _max) + _list.insert(_list.push_back(v->key)); + } + } + + template + std::pair BST::predecessor(const KType& _value) { + //BSTNode* current_node = find(_value); + //if (current_node){ + // BSTNode* max_left = nullptr; + // max_left = treeMax(current_node->left_child); + // if (max_left) + // return max_left->key; + // else { + // auto parent = current_node->parent; + // while (parent && parent->parent){ + // parent = parent->parent; + // if (parent->left) + // return parent->key; + // } + // } + //} + //return _value; + } + + template + std::pair BST::successor(const KType& _value) { + //BSTNode* current_node = find(_value); + //if (current_node){ + // BSTNode* min_right = nullptr; + // min_right = treeMax(current_node->right_child); + // if (min_right) + // return min_right->key; + // else { + // auto parent = current_node->parent; + // while (parent && parent->parent) { + // parent = parent->parent; + // if (parent->right) + // return parent->key; + // } + // } + //} + //return _value; + } + + template + void BST::inOrderTraverse(BSTNode* _node, std::list& _list) { + if (!_node) + return; + inOrderTravers(_node->left, _list); + _list.push_back(_node->value); + inOrderTravers(_node->right, _list); + } + + template + inline void BST::inOrderTraverse() + { + BSTNode* curr = root; + if (!curr) + return; + inOrderHelper(curr); + } + + template + inline void BST::inOrderHelper(BSTNode* root) + { + inOrderHelper(root->left); + std::cout << root->key << " "; + inOrderHelper(root->right); + } + + template + void BST::preOrderTraverse(BSTNode* _node, std::list& _list) { + if (!_node) + return; + _list.push_back(_node->value); + inOrderTravers(_node->left, _list); + inOrderTravers(_node->right, _list); + } + + template + void BST::postOrderTraverse(BSTNode* _node, std::list& _list) { + if (!_node) + return; + inOrderTravers(_node->left, _list); + inOrderTravers(_node->right, _list); + _list.push_back(_node->value); + }\ + + template + std::pair BST::minimum(BSTNode* _node) { + if (!_node) + _node = root; + auto temp = _node; + while (temp->left) + temp = temp->left; + return std::pair(temp->key, temp->value); + } + + template + std::pair BST::maximum(BSTNode* _node) { + if (!_node) + _node = root; + auto temp = _node; + while (temp->right) + temp = temp->right; + return std::pair(temp->key, temp->value); + } +} + diff --git a/BinarySpacePartition.h b/BinarySpacePartition.h index cae6105..5ca5820 100644 --- a/BinarySpacePartition.h +++ b/BinarySpacePartition.h @@ -1,328 +1,328 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_BINARYSPACEPARTITION_H -#define PHYSICSFORMULA_BINARYSPACEPARTITION_H -#pragma once - -#include "Core.h" -#include "Vector.h" -#include "Line.h" -#include "Point.h" -#include "GeoUtils.h" -#include "Intersection.h" - -#include -#include -#include - -namespace rez { -#define MIN_ELEMENTS_PER_PARTITION 4 - - enum class SEG_TYPES { - POSITIVE, - NEGATIVE, - INTERSECT - }; - - //TODO : Remove this class asap - class BSP2D { - struct BSP2DNode { - BSP2DNode* neg = nullptr; - BSP2DNode* pos = nullptr; - rez::Line2dStd split_line; - std::vector points_list; - - BSP2DNode(std::vector _points) : points_list(_points) { - } - - BSP2DNode(rez::Line2dStd _line, - BSP2DNode* _neg = nullptr, BSP2DNode* _pos = nullptr) - : split_line(_line), neg(_neg), pos(_pos) { - } - - BSP2DNode(std::vector _points, rez::Line2dStd _line, - BSP2DNode* _neg = nullptr, BSP2DNode* _pos = nullptr) - : points_list(_points), split_line(_line), neg(_neg), pos(_pos) - {} - }; - - BSP2DNode* root = nullptr; - - rez::Line2dStd getSplitLine(std::vector& _points_list, rez::Line2dStd* _prev_line); - - bool isALeaf(BSP2DNode* _node); - - BSP2DNode* constructBSP2D(std::vector& _points_list, rez::Line2dStd* _prev_line); - - void getSplitLineList(BSP2DNode* _node, std::vector& _points_list); - - public: - BSP2D(std::vector& _points_list) { - root = constructBSP2D(_points_list, nullptr); - } - - void getSplitLines(std::vector& _lines_list); - }; - -#endif //PHYSICSFORMULA_BINARYSPACEPARTITION_H - - bool BSP2D::isALeaf(BSP2DNode* _node) - { - if (_node && (_node->neg || _node->pos)) - return false; - return true; - } - - rez::Line2dStd BSP2D::getSplitLine(std::vector& _points_list, rez::Line2dStd* _prev_line) - { - const uint32_t size = _points_list.size(); - std::sort(_points_list.begin(), _points_list.end()); - rez::Point2d p1, p2; - rez::Line2dStd line; - - if (!_prev_line) { - p1.assign(X, (_points_list[0][X] + _points_list[1][X]) / 2); - p1.assign(Y, (_points_list[0][Y] + _points_list[1][Y]) / 2); - p2.assign(X, (_points_list[size - 1][X] + _points_list[size - 2][X]) / 2); - p2.assign(Y, (_points_list[size - 1][Y] + _points_list[size - 2][Y]) / 2); - line = rez::Line2dStd(p1, p2, true); - } - else if (false) { - - float nxy = 0.0, x_sum = 0.0, y_sum = 0.0, n_x_sqr_sum = 0.0; - - for (const auto& point : _points_list) - { - nxy += point[X] * point[Y]; - x_sum += point[X]; - y_sum += point[Y]; - n_x_sqr_sum += x_sum * x_sum; - } - - nxy *= size; - n_x_sqr_sum *= size; - - auto slope = (nxy - (x_sum) * (y_sum)) / (n_x_sqr_sum - x_sum * x_sum); - auto intercept = (size * y_sum - slope * x_sum) / size; - - srand((unsigned)time(0)); - auto s = rand() % 50; - s /= 25.0; - p2.assign(X, -slope * s); - p2.assign(Y, 1 + s); - - line = rez::Line2dStd(p1, p2, false); - } - else { - float x_sum = 0.0, y_sum = 0.0; - for (const auto& point : _points_list) - { - x_sum += point[X]; - y_sum += point[Y]; - } - p1.assign(X, x_sum / size); - p1.assign(Y, y_sum / size); - - p2.assign(X, -_prev_line->getDir()[Y] + 0.2); - p2.assign(Y, _prev_line->getDir()[X] + 0.2); - - line = rez::Line2dStd(p1, p2, false); - } - - Vector2f normal(-line.getDir()[Y], line.getDir()[X]); - auto d = dotProduct(normal, p2); - line.setD(d); - return line; - } - - BSP2D::BSP2DNode* BSP2D::constructBSP2D(std::vector& _points_list, - rez::Line2dStd* _prev_line) - { - const uint32_t size = _points_list.size(); - if (size <= MIN_ELEMENTS_PER_PARTITION) { - - return new BSP2DNode(_points_list); - } - rez::Line2dStd split_line = getSplitLine(_points_list, _prev_line); - - std::vector pos_vec; - std::vector neg_vec; - - std::copy_if(_points_list.begin(), _points_list.end(), - std::back_inserter(neg_vec), - [&](const rez::Point2d& point) - { - return rez::left(split_line, point); - }); - - std::copy_if(_points_list.begin(), _points_list.end(), - std::back_inserter(pos_vec), - [&](const rez::Point2d& point) - { - return !rez::left(split_line, point); - }); - - auto left = constructBSP2D(neg_vec, &split_line); - auto right = constructBSP2D(pos_vec, &split_line); - - return new BSP2DNode(split_line, left, right); - } - - void BSP2D::getSplitLineList(BSP2DNode* _node, std::vector& _lines_list) - { - if (!isALeaf(_node)) { - _lines_list.push_back(_node->split_line); - getSplitLineList(_node->neg, _lines_list); - getSplitLineList(_node->pos, _lines_list); - } - } - - void BSP2D::getSplitLines(std::vector& _lines_list) { - getSplitLineList(root, _lines_list); - } - - class BSP2DSegments { - struct BSP2DSegNode { - BSP2DSegNode* neg = nullptr; - BSP2DSegNode* pos = nullptr; - rez::Line2d split_line; - rez::Segment2d segment; - - BSP2DSegNode(rez::Segment2d _segment) : segment(_segment) { - } - - BSP2DSegNode(rez::Line2d _line, - BSP2DSegNode* _neg = nullptr, BSP2DSegNode* _pos = nullptr) - : split_line(_line), neg(_neg), pos(_pos) { - } - - BSP2DSegNode(rez::Segment2d _segment, rez::Line2d _line, - BSP2DSegNode* _neg = nullptr, BSP2DSegNode* _pos = nullptr) - : segment(_segment), split_line(_line), neg(_neg), pos(_pos) - {} - }; - - BSP2DSegNode* constructBSP2D(std::vector& _seg_list); - rez::Line2d getSplitLine(std::vector& _seg_list, int& _index); - SEG_TYPES classifySegmenetToLine(rez::Segment2d& _seg, rez::Line2d& _line, rez::Segment2d& _pos_seg, - rez::Segment2d& _neg_seg); - - BSP2DSegNode* root; - - void printNode(BSP2DSegNode*, int depth); - - public: - BSP2DSegments(std::vector& _segment_list) { - root = constructBSP2D(_segment_list); - } - - void print(); - }; - - BSP2DSegments::BSP2DSegNode* rez::BSP2DSegments::constructBSP2D(std::vector& _seg_list) - { - int size = _seg_list.size(); - if (size > 1) { - int split_seg_index = -1; - std::vector pos_list, neg_list; - rez::Segment2d pos_seg, neg_seg; - rez::Line2d split_line = getSplitLine(_seg_list, split_seg_index); - - for (size_t i = 0; i < size; i++) { - if (i != split_seg_index) { - switch (classifySegmenetToLine(_seg_list[i], split_line, pos_seg, neg_seg)) - { - case SEG_TYPES::INTERSECT: - pos_list.push_back(pos_seg); - neg_list.push_back(neg_seg); - break; - case SEG_TYPES::POSITIVE: - pos_list.push_back(pos_seg); - break; - default: - neg_list.push_back(pos_seg); - break; - } - } - } - - BSP2DSegNode* left = constructBSP2D(pos_list); - BSP2DSegNode* right = constructBSP2D(neg_list); - return new BSP2DSegNode(_seg_list[split_seg_index], split_line, left, right); - } - } - - inline rez::Line2d BSP2DSegments::getSplitLine(std::vector& _seg_list, int& _index) - { - int min_intersections = INT_MAX; - Line2d min_intersect_line; - - for (size_t i = 0; i < _seg_list.size(); i++) { - auto seg = _seg_list[i]; - Vector2f dir = seg.p2 - seg.p1; - Line2d line(seg.p1, dir); - int this_intersections = 0; - - for (size_t j = 0; j < _seg_list.size(); j++) { - if (i != j) - if (rez::intersect(line, _seg_list[j])) - this_intersections++; - } - - if (this_intersections < min_intersections) { - min_intersect_line = line; - _index = i; - } - } - return min_intersect_line; - } - - inline SEG_TYPES BSP2DSegments::classifySegmenetToLine(rez::Segment2d& _seg, rez::Line2d& _line, - rez::Segment2d& _pos_seg, rez::Segment2d& _neg_seg) - { - rez::Point2d intersect_point; - bool is_intersect = rez::intersect(_line, _seg, intersect_point); - if (is_intersect) { - if (left(_line, _seg.p1)) { - _pos_seg.p1 = _seg.p1; - _pos_seg.p2 = intersect_point; - _neg_seg.p1 = intersect_point; - _neg_seg.p2 = _seg.p2; - } - else { - _pos_seg.p1 = _seg.p2; - _pos_seg.p2 = intersect_point; - _neg_seg.p1 = intersect_point; - _neg_seg.p2 = _seg.p1; - } - return SEG_TYPES::INTERSECT; - } - else if (left(_line, _seg.p1)) { - return SEG_TYPES::POSITIVE; - } - - return SEG_TYPES::NEGATIVE; - } - - void BSP2DSegments::printNode(BSP2DSegNode* _node, int depth) { - if (!_node) - return; - - printNode(_node->pos, depth + 1); - - int space = 0; - while (space < depth) - std::cout << " "; - std::cout << "< (" << _node->segment.p1[X] << "," << _node->segment.p1[Y] << ") - (" - << _node->segment.p2[X] << "," << _node->segment.p2[Y] << ")\n"; - - printNode(_node->neg, depth + 1); - } - - void BSP2DSegments::print() { - printNode(root, 0); - } -} - +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_BINARYSPACEPARTITION_H +#define PHYSICSFORMULA_BINARYSPACEPARTITION_H +#pragma once + +#include "Core.h" +#include "Vector.h" +#include "Line.h" +#include "Point.h" +#include "GeoUtils.h" +#include "Intersection.h" + +#include +#include +#include + +namespace rez { +#define MIN_ELEMENTS_PER_PARTITION 4 + + enum class SEG_TYPES { + POSITIVE, + NEGATIVE, + INTERSECT + }; + + //TODO : Remove this class asap + class BSP2D { + struct BSP2DNode { + BSP2DNode* neg = nullptr; + BSP2DNode* pos = nullptr; + rez::Line2dStd split_line; + std::vector points_list; + + BSP2DNode(std::vector _points) : points_list(_points) { + } + + BSP2DNode(rez::Line2dStd _line, + BSP2DNode* _neg = nullptr, BSP2DNode* _pos = nullptr) + : split_line(_line), neg(_neg), pos(_pos) { + } + + BSP2DNode(std::vector _points, rez::Line2dStd _line, + BSP2DNode* _neg = nullptr, BSP2DNode* _pos = nullptr) + : points_list(_points), split_line(_line), neg(_neg), pos(_pos) + {} + }; + + BSP2DNode* root = nullptr; + + rez::Line2dStd getSplitLine(std::vector& _points_list, rez::Line2dStd* _prev_line); + + bool isALeaf(BSP2DNode* _node); + + BSP2DNode* constructBSP2D(std::vector& _points_list, rez::Line2dStd* _prev_line); + + void getSplitLineList(BSP2DNode* _node, std::vector& _points_list); + + public: + BSP2D(std::vector& _points_list) { + root = constructBSP2D(_points_list, nullptr); + } + + void getSplitLines(std::vector& _lines_list); + }; + +#endif //PHYSICSFORMULA_BINARYSPACEPARTITION_H + + bool BSP2D::isALeaf(BSP2DNode* _node) + { + if (_node && (_node->neg || _node->pos)) + return false; + return true; + } + + rez::Line2dStd BSP2D::getSplitLine(std::vector& _points_list, rez::Line2dStd* _prev_line) + { + const uint32_t size = _points_list.size(); + std::sort(_points_list.begin(), _points_list.end()); + rez::Point2d p1, p2; + rez::Line2dStd line; + + if (!_prev_line) { + p1.assign(X, (_points_list[0][X] + _points_list[1][X]) / 2); + p1.assign(Y, (_points_list[0][Y] + _points_list[1][Y]) / 2); + p2.assign(X, (_points_list[size - 1][X] + _points_list[size - 2][X]) / 2); + p2.assign(Y, (_points_list[size - 1][Y] + _points_list[size - 2][Y]) / 2); + line = rez::Line2dStd(p1, p2, true); + } + else if (false) { + + float nxy = 0.0, x_sum = 0.0, y_sum = 0.0, n_x_sqr_sum = 0.0; + + for (const auto& point : _points_list) + { + nxy += point[X] * point[Y]; + x_sum += point[X]; + y_sum += point[Y]; + n_x_sqr_sum += x_sum * x_sum; + } + + nxy *= size; + n_x_sqr_sum *= size; + + auto slope = (nxy - (x_sum) * (y_sum)) / (n_x_sqr_sum - x_sum * x_sum); + auto intercept = (size * y_sum - slope * x_sum) / size; + + srand((unsigned)time(0)); + auto s = rand() % 50; + s /= 25.0; + p2.assign(X, -slope * s); + p2.assign(Y, 1 + s); + + line = rez::Line2dStd(p1, p2, false); + } + else { + float x_sum = 0.0, y_sum = 0.0; + for (const auto& point : _points_list) + { + x_sum += point[X]; + y_sum += point[Y]; + } + p1.assign(X, x_sum / size); + p1.assign(Y, y_sum / size); + + p2.assign(X, -_prev_line->getDir()[Y] + 0.2); + p2.assign(Y, _prev_line->getDir()[X] + 0.2); + + line = rez::Line2dStd(p1, p2, false); + } + + Vector2f normal(-line.getDir()[Y], line.getDir()[X]); + auto d = dotProduct(normal, p2); + line.setD(d); + return line; + } + + BSP2D::BSP2DNode* BSP2D::constructBSP2D(std::vector& _points_list, + rez::Line2dStd* _prev_line) + { + const uint32_t size = _points_list.size(); + if (size <= MIN_ELEMENTS_PER_PARTITION) { + + return new BSP2DNode(_points_list); + } + rez::Line2dStd split_line = getSplitLine(_points_list, _prev_line); + + std::vector pos_vec; + std::vector neg_vec; + + std::copy_if(_points_list.begin(), _points_list.end(), + std::back_inserter(neg_vec), + [&](const rez::Point2d& point) + { + return rez::left(split_line, point); + }); + + std::copy_if(_points_list.begin(), _points_list.end(), + std::back_inserter(pos_vec), + [&](const rez::Point2d& point) + { + return !rez::left(split_line, point); + }); + + auto left = constructBSP2D(neg_vec, &split_line); + auto right = constructBSP2D(pos_vec, &split_line); + + return new BSP2DNode(split_line, left, right); + } + + void BSP2D::getSplitLineList(BSP2DNode* _node, std::vector& _lines_list) + { + if (!isALeaf(_node)) { + _lines_list.push_back(_node->split_line); + getSplitLineList(_node->neg, _lines_list); + getSplitLineList(_node->pos, _lines_list); + } + } + + void BSP2D::getSplitLines(std::vector& _lines_list) { + getSplitLineList(root, _lines_list); + } + + class BSP2DSegments { + struct BSP2DSegNode { + BSP2DSegNode* neg = nullptr; + BSP2DSegNode* pos = nullptr; + rez::Line2d split_line; + rez::Segment2d segment; + + BSP2DSegNode(rez::Segment2d _segment) : segment(_segment) { + } + + BSP2DSegNode(rez::Line2d _line, + BSP2DSegNode* _neg = nullptr, BSP2DSegNode* _pos = nullptr) + : split_line(_line), neg(_neg), pos(_pos) { + } + + BSP2DSegNode(rez::Segment2d _segment, rez::Line2d _line, + BSP2DSegNode* _neg = nullptr, BSP2DSegNode* _pos = nullptr) + : segment(_segment), split_line(_line), neg(_neg), pos(_pos) + {} + }; + + BSP2DSegNode* constructBSP2D(std::vector& _seg_list); + rez::Line2d getSplitLine(std::vector& _seg_list, int& _index); + SEG_TYPES classifySegmenetToLine(rez::Segment2d& _seg, rez::Line2d& _line, rez::Segment2d& _pos_seg, + rez::Segment2d& _neg_seg); + + BSP2DSegNode* root; + + void printNode(BSP2DSegNode*, int depth); + + public: + BSP2DSegments(std::vector& _segment_list) { + root = constructBSP2D(_segment_list); + } + + void print(); + }; + + BSP2DSegments::BSP2DSegNode* rez::BSP2DSegments::constructBSP2D(std::vector& _seg_list) + { + int size = _seg_list.size(); + if (size > 1) { + int split_seg_index = -1; + std::vector pos_list, neg_list; + rez::Segment2d pos_seg, neg_seg; + rez::Line2d split_line = getSplitLine(_seg_list, split_seg_index); + + for (size_t i = 0; i < size; i++) { + if (i != split_seg_index) { + switch (classifySegmenetToLine(_seg_list[i], split_line, pos_seg, neg_seg)) + { + case SEG_TYPES::INTERSECT: + pos_list.push_back(pos_seg); + neg_list.push_back(neg_seg); + break; + case SEG_TYPES::POSITIVE: + pos_list.push_back(pos_seg); + break; + default: + neg_list.push_back(pos_seg); + break; + } + } + } + + BSP2DSegNode* left = constructBSP2D(pos_list); + BSP2DSegNode* right = constructBSP2D(neg_list); + return new BSP2DSegNode(_seg_list[split_seg_index], split_line, left, right); + } + } + + inline rez::Line2d BSP2DSegments::getSplitLine(std::vector& _seg_list, int& _index) + { + int min_intersections = INT_MAX; + Line2d min_intersect_line; + + for (size_t i = 0; i < _seg_list.size(); i++) { + auto seg = _seg_list[i]; + Vector2f dir = seg.p2 - seg.p1; + Line2d line(seg.p1, dir); + int this_intersections = 0; + + for (size_t j = 0; j < _seg_list.size(); j++) { + if (i != j) + if (rez::intersect(line, _seg_list[j])) + this_intersections++; + } + + if (this_intersections < min_intersections) { + min_intersect_line = line; + _index = i; + } + } + return min_intersect_line; + } + + inline SEG_TYPES BSP2DSegments::classifySegmenetToLine(rez::Segment2d& _seg, rez::Line2d& _line, + rez::Segment2d& _pos_seg, rez::Segment2d& _neg_seg) + { + rez::Point2d intersect_point; + bool is_intersect = rez::intersect(_line, _seg, intersect_point); + if (is_intersect) { + if (left(_line, _seg.p1)) { + _pos_seg.p1 = _seg.p1; + _pos_seg.p2 = intersect_point; + _neg_seg.p1 = intersect_point; + _neg_seg.p2 = _seg.p2; + } + else { + _pos_seg.p1 = _seg.p2; + _pos_seg.p2 = intersect_point; + _neg_seg.p1 = intersect_point; + _neg_seg.p2 = _seg.p1; + } + return SEG_TYPES::INTERSECT; + } + else if (left(_line, _seg.p1)) { + return SEG_TYPES::POSITIVE; + } + + return SEG_TYPES::NEGATIVE; + } + + void BSP2DSegments::printNode(BSP2DSegNode* _node, int depth) { + if (!_node) + return; + + printNode(_node->pos, depth + 1); + + int space = 0; + while (space < depth) + std::cout << " "; + std::cout << "< (" << _node->segment.p1[X] << "," << _node->segment.p1[Y] << ") - (" + << _node->segment.p2[X] << "," << _node->segment.p2[Y] << ")\n"; + + printNode(_node->neg, depth + 1); + } + + void BSP2DSegments::print() { + printNode(root, 0); + } +} + diff --git a/Boundries.h b/Boundries.h index dbf7142..1bba8e3 100644 --- a/Boundries.h +++ b/Boundries.h @@ -1,25 +1,25 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_BOUNDRIES_H -#define PHYSICSFORMULA_BOUNDRIES_H -#include "Point.h" - -namespace rez { - - struct AABB { - float x_min; - float x_max; - float y_min; - float y_max; - - bool isInside(Point2d& point) { - if (x_min <= point[X] && point[X] <= x_max - && y_min <= point[Y] && point[Y] <= y_max) - return true; - return false; - } - }; -} -#endif //PHYSICSFORMULA_BOUNDRIES_H +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_BOUNDRIES_H +#define PHYSICSFORMULA_BOUNDRIES_H +#include "Point.h" + +namespace rez { + + struct AABB { + float x_min; + float x_max; + float y_min; + float y_max; + + bool isInside(Point2d& point) { + if (x_min <= point[X] && point[X] <= x_max + && y_min <= point[Y] && point[Y] <= y_max) + return true; + return false; + } + }; +} +#endif //PHYSICSFORMULA_BOUNDRIES_H diff --git a/Bounds.h b/Bounds.h index a443b34..5e58706 100644 --- a/Bounds.h +++ b/Bounds.h @@ -1,15 +1,15 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_BOUNDS_H -#define PHYSICSFORMULA_BOUNDS_H -namespace rez { - struct BoundRectangle { - float left_x = 0.0; - float right_x = 0.0; - float top_y = 0.0; - float bot_y = 0.0; - }; -} -#endif //PHYSICSFORMULA_BOUNDS_H +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_BOUNDS_H +#define PHYSICSFORMULA_BOUNDS_H +namespace rez { + struct BoundRectangle { + float left_x = 0.0; + float right_x = 0.0; + float top_y = 0.0; + float bot_y = 0.0; + }; +} +#endif //PHYSICSFORMULA_BOUNDS_H diff --git a/Calculus.h b/Calculus.h index 359a3f7..050ef30 100644 --- a/Calculus.h +++ b/Calculus.h @@ -1,256 +1,256 @@ -// -// Created by Ryan.Zurrin001 on 1/22/2022. -// - -#ifndef PHYSICSFORMULA_CALCULUS_H -#define PHYSICSFORMULA_CALCULUS_H -#include -#include -#include -#define _USE_MATH_DEFINES -float pi = M_PI; -using namespace std; - -float sine(){ - float low_lim_sine,upp_lim_sine; - float anti_der_low_sine, anti_der_upp_sine,integral_sine; - cout << "What is the Lower Limit of your sinousidal curve? Please enter below in No. Values"<> low_lim_sine; - cout << "Enter Upper Limit"<> upp_lim_sine; - - if (((upp_lim_sine)-(low_lim_sine))<=pi){ - cout << "(d/dx) of sine x = -cos x"<pi){ - cout << "You are trying to find the area of 2 different wavelengths, this not possible because more than one integral will have to be integrated more than once!!!!!"<> low_lim_cos; - cout << "Enter Upper Limit"<> upp_lim_cos; - if (((upp_lim_cos)-(low_lim_cos))<=pi){ - cout << "(d/dx) of sine x = -cos x"<pi){ - cout << "You are trying to find the area of 2 different wavelengths, this not possible because more than one integral will have to be integrated more than once!!!!!"<> a; - - - cout << "Enter the Lower Limit"<< endl; - cin >> low_lim_exp; - cout << "Enter the upper limit"<> upp_lim_exp; - - cout << "Press 1 to continue"<> continuation; - - if (continuation==1){ - exponent1 = upp_lim_exp; - base1 = a; - anti_derv1= pow(base1,exponent1); - integral_exp1 = (anti_derv1)/log(a); - cout << "The total antiderivative of an exponential curve for the upper limit is "<< integral_exp1 <> continue_on; - if (continue_on==1){ - exponent2 = low_lim_exp; - base2=a; - anti_derv2 = pow(base2,exponent2); - integral_exp2 = (anti_derv2)/log(a); - cout << "The total antiderivative of an exponential curve for the lower limit is "<< integral_exp2 <> a; - cout << "Enter the coefficient of x"<> b; - cout << "Enter the y-intercept"<> c; - cout << "Enter the lower limit of the curve:" <> low_lim_quad; - cout << "Enter the upper limit of the curve:"<> upp_lim_quad; - - cout << "So your function is: f(x)= " << a << "x^2+" << b << "x+" << c << endl; - - - cout << "Press enter to substitute Upper limit for x"<> a2; - cout << "Enter the coefficient of x"<> b2; - cout << "Enter the y-intercept"<> c2; - - diff1=(2*a2); - diff2=(b2); - diff3=(0); - cout << "So your function is: f(x)= " << a2 << "x^2+" << b2 << "x+" << c2 << endl; - - cout << "The derivative of the function abouve is: " << diff1<<"x + "<< diff2<<" + "<> type_calc; -// -// if (type_calc=="Integration"){ -// -// cout << "Welcome to integration!!"<> choice; -// -// switch(choice){ -// case 1: -// sine(); -// break; -// case 2: -// cosine(); -// break; -// case 4: -// exponential(); -// break; -// case 5: -// quadratic(); -// break; -// } -// } -// -// else if (type_calc=="Differentiation"){ -// cout << "Welcome to differentiation!!"< +#include +#include +#define _USE_MATH_DEFINES +float pi = M_PI; +using namespace std; + +float sine(){ + float low_lim_sine,upp_lim_sine; + float anti_der_low_sine, anti_der_upp_sine,integral_sine; + cout << "What is the Lower Limit of your sinousidal curve? Please enter below in No. Values"<> low_lim_sine; + cout << "Enter Upper Limit"<> upp_lim_sine; + + if (((upp_lim_sine)-(low_lim_sine))<=pi){ + cout << "(d/dx) of sine x = -cos x"<pi){ + cout << "You are trying to find the area of 2 different wavelengths, this not possible because more than one integral will have to be integrated more than once!!!!!"<> low_lim_cos; + cout << "Enter Upper Limit"<> upp_lim_cos; + if (((upp_lim_cos)-(low_lim_cos))<=pi){ + cout << "(d/dx) of sine x = -cos x"<pi){ + cout << "You are trying to find the area of 2 different wavelengths, this not possible because more than one integral will have to be integrated more than once!!!!!"<> a; + + + cout << "Enter the Lower Limit"<< endl; + cin >> low_lim_exp; + cout << "Enter the upper limit"<> upp_lim_exp; + + cout << "Press 1 to continue"<> continuation; + + if (continuation==1){ + exponent1 = upp_lim_exp; + base1 = a; + anti_derv1= pow(base1,exponent1); + integral_exp1 = (anti_derv1)/log(a); + cout << "The total antiderivative of an exponential curve for the upper limit is "<< integral_exp1 <> continue_on; + if (continue_on==1){ + exponent2 = low_lim_exp; + base2=a; + anti_derv2 = pow(base2,exponent2); + integral_exp2 = (anti_derv2)/log(a); + cout << "The total antiderivative of an exponential curve for the lower limit is "<< integral_exp2 <> a; + cout << "Enter the coefficient of x"<> b; + cout << "Enter the y-intercept"<> c; + cout << "Enter the lower limit of the curve:" <> low_lim_quad; + cout << "Enter the upper limit of the curve:"<> upp_lim_quad; + + cout << "So your function is: f(x)= " << a << "x^2+" << b << "x+" << c << endl; + + + cout << "Press enter to substitute Upper limit for x"<> a2; + cout << "Enter the coefficient of x"<> b2; + cout << "Enter the y-intercept"<> c2; + + diff1=(2*a2); + diff2=(b2); + diff3=(0); + cout << "So your function is: f(x)= " << a2 << "x^2+" << b2 << "x+" << c2 << endl; + + cout << "The derivative of the function abouve is: " << diff1<<"x + "<< diff2<<" + "<> type_calc; +// +// if (type_calc=="Integration"){ +// +// cout << "Welcome to integration!!"<> choice; +// +// switch(choice){ +// case 1: +// sine(); +// break; +// case 2: +// cosine(); +// break; +// case 4: +// exponential(); +// break; +// case 5: +// quadratic(); +// break; +// } +// } +// +// else if (type_calc=="Differentiation"){ +// cout << "Welcome to differentiation!!"< -#include -constexpr auto pi_ = 3.14159265358979323846; - -static int circleObjectCount = 0; -typedef long double ld; - -class Circle -{ - ld radius; - ld circumference; - ld area; - static auto countIncrease() { circleObjectCount += 1; } - static auto countDecrease() { circleObjectCount -= 1; } - ld calculateRadius()const; - ld calculateCircumference()const; - ld calculateArea()const; -public: - - Circle() - { - radius = 0.0; - circumference = 0.0; - area = 0.0; - countIncrease(); - } - - Circle(ld radius) - { - this->radius = radius; - this->circumference = calculateCircumference(); - this->area = calculateArea(); - countIncrease(); - } - - /** - * @brief copy constructor - */ - Circle(const Circle& s) - { - radius = s.radius; - circumference = s.circumference; - area = s.area; - countIncrease(); - } - /** - * #brief move constructor - */ - Circle(Circle&& s) noexcept - { - radius = s.radius; - circumference = s.circumference; - area = s.area; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Circle& operator=(Circle&& s) noexcept - { - if (this != &s) - { - radius = s.radius; - circumference = s.circumference; - area = s.area; - countIncrease(); - } - return *this; - } - - Circle& operator=(Circle other) - { - std::swap(radius, other.radius); - std::swap(circumference, other.circumference); - std::swap(area, other.area); - return *this; - } - - static void show_objectCount() { - std::cout << "\n circle object count: " - << circleObjectCount << std::endl; - } - static int get_objectCount() { return circleObjectCount; } - - - ~Circle() = default; - - auto setArea(ld a); - auto setRadius(ld r); - auto setCircumference(ld c); - - [[nodiscard]] auto getRadius() const { return radius; } - [[nodiscard]] auto getCircumference() const { return circumference; } - [[nodiscard]] auto getArea() const { return area; } - - void printCircleInfo()const; -}; - -#endif //PHYSICSFORMULA_CIRCLE_H -inline ld Circle::calculateRadius() const -{ - return circumference / (2.0 * pi_); -} - -inline ld Circle::calculateCircumference() const -{ - return 2.0* pi_ * radius; -} - -inline ld Circle::calculateArea() const -{ - return pi_ * (radius * radius); -} - -inline auto Circle::setArea(ld a) -{ - area = a; - radius = sqrt(area / pi_); - circumference = calculateCircumference(); -} - -inline auto Circle::setRadius(ld r) -{ - radius = r; - circumference = calculateCircumference(); - area = calculateArea(); -} - -inline auto Circle::setCircumference(ld c) -{ - circumference = c; - radius = calculateRadius(); - area = calculateArea(); -} - -inline void Circle::printCircleInfo() const -{ - std::cout << "radius: " << radius << std::endl; - std::cout << "circumference: " << circumference << std::endl; - std::cout << "area: " << area << std::endl; -} - - +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_CIRCLE_H +#define PHYSICSFORMULA_CIRCLE_H +/** + * @class Circle + * @details class to represent a Circle object + * @author Ryan Zurrin + * @dateBuilt 11/5/2021 + * @lastEdit 11/5/2021 + */ +#include +#include +constexpr auto pi_ = 3.14159265358979323846; + +static int circleObjectCount = 0; +typedef long double ld; + +class Circle +{ + ld radius; + ld circumference; + ld area; + static auto countIncrease() { circleObjectCount += 1; } + static auto countDecrease() { circleObjectCount -= 1; } + ld calculateRadius()const; + ld calculateCircumference()const; + ld calculateArea()const; +public: + + Circle() + { + radius = 0.0; + circumference = 0.0; + area = 0.0; + countIncrease(); + } + + Circle(ld radius) + { + this->radius = radius; + this->circumference = calculateCircumference(); + this->area = calculateArea(); + countIncrease(); + } + + /** + * @brief copy constructor + */ + Circle(const Circle& s) + { + radius = s.radius; + circumference = s.circumference; + area = s.area; + countIncrease(); + } + /** + * #brief move constructor + */ + Circle(Circle&& s) noexcept + { + radius = s.radius; + circumference = s.circumference; + area = s.area; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Circle& operator=(Circle&& s) noexcept + { + if (this != &s) + { + radius = s.radius; + circumference = s.circumference; + area = s.area; + countIncrease(); + } + return *this; + } + + Circle& operator=(Circle other) + { + std::swap(radius, other.radius); + std::swap(circumference, other.circumference); + std::swap(area, other.area); + return *this; + } + + static void show_objectCount() { + std::cout << "\n circle object count: " + << circleObjectCount << std::endl; + } + static int get_objectCount() { return circleObjectCount; } + + + ~Circle() = default; + + auto setArea(ld a); + auto setRadius(ld r); + auto setCircumference(ld c); + + [[nodiscard]] auto getRadius() const { return radius; } + [[nodiscard]] auto getCircumference() const { return circumference; } + [[nodiscard]] auto getArea() const { return area; } + + void printCircleInfo()const; +}; + +#endif //PHYSICSFORMULA_CIRCLE_H +inline ld Circle::calculateRadius() const +{ + return circumference / (2.0 * pi_); +} + +inline ld Circle::calculateCircumference() const +{ + return 2.0* pi_ * radius; +} + +inline ld Circle::calculateArea() const +{ + return pi_ * (radius * radius); +} + +inline auto Circle::setArea(ld a) +{ + area = a; + radius = sqrt(area / pi_); + circumference = calculateCircumference(); +} + +inline auto Circle::setRadius(ld r) +{ + radius = r; + circumference = calculateCircumference(); + area = calculateArea(); +} + +inline auto Circle::setCircumference(ld c) +{ + circumference = c; + radius = calculateRadius(); + area = calculateArea(); +} + +inline void Circle::printCircleInfo() const +{ + std::cout << "radius: " << radius << std::endl; + std::cout << "circumference: " << circumference << std::endl; + std::cout << "area: " << area << std::endl; +} + + diff --git a/Circuits.h b/Circuits.h index 1704cfc..a56131b 100644 --- a/Circuits.h +++ b/Circuits.h @@ -1,563 +1,563 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_CIRCUITS_H -#define PHYSICSFORMULA_CIRCUITS_H -/** - * @class Circuits - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @dateBuilt 3/3/2021 - * @lastEdit 3/3/2021 - */ -#include -#include "ElectricCurrent.h" - -static int circuits_objectCount = 0; - -class Circuits: - public ElectricCurrent -{ - -public: - Circuits* _circuitPtr; - - - Circuits() - { - _circuitPtr = nullptr; - _circuitVal = 0.0; - countIncrease(); - } - Circuits(long double val) - { - _circuitPtr = nullptr; - _circuitVal = val; - countIncrease(); - } - - /** - * @brief copy constructor - */ - Circuits(const Circuits& c) - { - _circuitPtr = c._circuitPtr; - _circuitVal = 0.0; - countIncrease(); - } - /** - * #brief move constructor - */ - Circuits(Circuits&& c) noexcept - { - _circuitPtr = c._circuitPtr; - _circuitVal = c._circuitVal; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Circuits& operator=(const Circuits& c) - { - if (this != &c) - { - _circuitPtr = c._circuitPtr; - _circuitVal = c._circuitVal; - countIncrease(); - } - return *this; - } - - static void show_objectCount() { std::cout << "\n circuits object count: " - << circuits_objectCount << std::endl; } - static int get_objectCount() { return circuits_objectCount; } - - constexpr void setCircuitVal(long double val) { _circuitVal = val; } - - - /// - /// Calculates the total resistance of a Series of resistors. - /// - /// The resistor 1. - /// The resistor 2. - /// The resistor 3. - /// The resistor 4. - /// The resistor 5. - /// The resistor 6. - /// The resistor 7. - /// The resistor 8. - /// The resistor 9. - /// The resistor 10. - /// resistance in ohms - static constexpr long double seriesResistance(const long double R1, const long double R2, const long double R3, const long double R4, - const long double R5, const long double R6, const long double R7, const long double R8, const long double R9, const long double R10); - - /// - /// Calculates the total resistance of resistors hooked up in parallel. - /// - /// The resistor 1. - /// The resistor 2. - /// The resistor 3. - /// The resistor 4. - /// The resistor 5. - /// The resistor 6. - /// The resistor 7. - /// The resistor 8. - /// The resistor 9. - /// The resistor 10. - /// resistance in ohms - static constexpr long double parallelResistance(const long double R1, const long double R2, const long double R3, const long double R4, - const long double R5, const long double R6, const long double R7, const long double R8, const long double R9, const long double R10); - - /// - /// Calculates the total capacitor of a Series of capacitors. - /// - /// The capacitor 1. - /// The capacitor 2. - /// The capacitor 3. - /// The capacitor 4. - /// The capacitor 5. - /// The capacitor 6. - /// The capacitor 7. - /// The capacitor 8. - /// The capacitor 9. - /// The capacitor 10. - /// capacitance (F) - static constexpr long double seriesCapacitance(const long double C1, const long double C2, const long double C3, const long double C4, - const long double C5, const long double C6, const long double C7, const long double C8, const long double C9, const long double C10); - - /// - /// Calculates the total resistance of resistors hooked up in parallel. - /// - /// The capacitor 1. - /// The capacitor 2. - /// The capacitor 3. - /// The capacitor 4. - /// The capacitor 5. - /// The capacitor 6. - /// The capacitor 7. - /// The capacitor 8. - /// The capacitor 9. - /// The capacitor 10. - /// capacitance (F) - static constexpr long double parallelCapacitance(const long double C1, const long double C2, const long double C3, const long double C4, - const long double C5, const long double C6, const long double C7, const long double C8, const long double C9, const long double C10); - - - /// - /// Calculates the terminal voltage. - /// - /// The electromotive force. - /// The internal resistance. - /// The Charge. - /// Voltage - static constexpr long double terminalVoltage(const long double emf, const long double r, const long double I); - - - /// - /// Calculates the Current of a ohms law. - /// - /// The EMF. - /// The resistance load of all resistors connected. - /// The internal resistance. - /// current I in amperes - static constexpr long double current_OhmsLaw(const long double emf, const long double RLoad, const long double r); - - /// - /// Calculates the powers dissipated - /// - /// The current. - /// The Resistance load. - /// power output in watts (W)S - static constexpr long double powerDissipation(const long double I, const long double R); - - /// - /// add the total emfs for a series connection. where emf is the electromagnetic force - /// - /// The emf1. - /// The emf2. - /// The emf3. - /// The emf4. - /// net emf - static constexpr long double emfsParallelConnection_added(const long double emf1, const long double emf2, const long double emf3, const long double emf4); - - /// - /// add the total emfs for a series connection. where emf is the electromagnetic force - /// - /// The emf1. - /// The emf2. - /// The emf3. - /// The emf4. - /// - static constexpr long double emfsSeriesConnection_subtracted(const long double emf1, const long double emf2, const long double emf3, const long double emf4); - - /// - /// calculates the internals resistance. - /// - /// The terminal voltage. - /// The emf. - /// The current. - /// the internal resistance (r) - static constexpr long double internalResistance(const long double Vt, const long double E, const long double I); - - /// - /// calculates the RC time constant of a circuit containing a resistor and a - /// capacitor. - /// - /// The resistance. - /// The capacitance. - /// tau(Greek letter) - static constexpr long double timeConstant_RC(const long double R, const long double C); - - /// - /// calculates the resistances from time constant and capacitance. - /// - /// The tau(time constant). - /// The capacitance. - /// the resistance Ohms - static constexpr long double resistance_fromTimeConstant(const long double tau, const long double C); - - /// - /// calculates the capacitance from time constant and resistance. - /// - /// The tau. - /// The resistance. - /// - static constexpr long double capacitance_fromTimeConstant(const long double tau, const long double R); - - /// - /// Voltages the vs time charging capacitor. - /// - /// The EMF. - /// The time. - /// The resistance. - /// The capacitance. - /// - static long double voltageVsTimeChargingCapacitor(const long double emf, const long double t, const long double R, const long double C); - - /// - /// calculates the Frequency from cycles and seconds. - /// - /// The cycles. - /// The seconds. - /// frequency - static constexpr long double frequency(const long double cycles, const long double seconds); - - /// - /// Frequencies the specified period. - /// - /// The period. - /// - static constexpr long double frequency(const long double period); - - /// - /// calculates the periods from the specified f. - /// - /// The f. - /// period - static constexpr long double period(const long double f); - - - /// - /// Resistances from DC equations. - /// - /// The time. - /// The V/E . - /// The capacitance. - /// - static long double resistance_fromDCequations(const long double t, const long double VoverE, const long double C); - - /// - /// calculates using the exact exponential treatment, how much time is required to - /// discharge a C F capacitor through a R Ω resistor down to pOv% of - /// its original voltage. - /// - /// The capacitance. - /// The resistance. - /// The percent of original voltage. - /// time in seconds - static long double time_fromDischargeEquation(const long double C, const long double R, const long double pOv); - - /// - /// If you wish to take a picture of a bullet traveling at v m/s, then a - /// very brief flash of light produced by an RC discharge through a flash - /// tube can limit blurring. Assuming d m of motion during one RC constant - /// is acceptable, and given that the flash is driven by a C F capacitor, - /// what is the resistance in the flash tube? - /// - /// The distance in meters. - /// The capacitance. - /// The velocity. - /// resistance in Ohms - static constexpr long double resistance_fromDistanceVelocity(const long double d, const long double C, const long double v); - - /// - /// A flashing lamp in a Christmas earring is based on an RC discharge of a - /// capacitor through its resistance. The effective duration of the flash - /// is t s, during which it produces an average 0.500 W from an average - /// 3.00 V. calculates the energy it dissipates? - /// - /// The power. - /// The time. - /// energy in joules - static constexpr long double energyUsed(const long double P, const long double t); - - /// A flashing lamp in a Christmas earring is based on an RC discharge of a - /// capacitor through its resistance. The effective duration of the flash - /// is t s, during which it produces an average 0.500 W from an average - /// 3.00 V. calculates the charge that moves through the lamp. - /// The power. - /// The volts. - /// The time. - /// coulombs - static constexpr long double charge_fromPowerVoltsTime(const long double P, const long double V, const long double t); - - /// - /// A C F capacitor charged to V is discharged through a resistor. - /// Calculate the temperature increase of the resistor, given that its of a mass - /// in kg and its specific heat is c kJ/kg⋅C∘, noting that most of the thermal - /// energy is retained in the short time of the discharge. - /// - /// The capacitance. - /// The volts. - /// The mass. - /// The specific heat. - /// temp in C - static constexpr long double temperatureIncreaseOfResistor(const long double C, const long double V, const long double mass, const long double c); - - /// - /// EMFs the specified r. - /// - /// The r. - /// The r load. - /// The i. - /// - static constexpr long double emf(const long double r, const long double R_load, const long double I); - - - - ~Circuits() - { - delete _circuitPtr; - } - -private: - static void countIncrease() { circuits_objectCount += 1; } - static void countDecrease() { circuits_objectCount -= 1; } - long double _circuitVal; - -}; -#endif //PHYSICSFORMULA_CIRCUITS_H - -constexpr long double Circuits::seriesResistance(const long double R1 = 0, const long double R2 = 0, const long double R3 = 0, - const long double R4 = 0, const long double R5 = 0, const long double R6 = 0, const long double R7 = 0, const long double R8 = 0, - const long double R9 = 0, const long double R10 = 0) -{ - - return R1 + R2 + R3 + R4 + R5 + R6 + R7 + R8 + R9 + R10;//Ohms -} - -constexpr long double Circuits::parallelResistance(const long double R1 = 0, const long double R2 = 0, const long double R3 = 0, - const long double R4 = 0, const long double R5 = 0, const long double R6 = 0, const long double R7 = 0, const long double R8 = 0, - const long double R9 = 0, const long double R10 = 0) -{ - long double total = 0; - if (R1>0) - { - total += 1 / R1; - } - if (R2>0) - { - total += 1 / R2; - } - if (R3 > 0) - { - total += 1 / R3; - } - if (R4 > 0) - { - total += 1 / R4; - } - if (R5 > 0) - { - total += 1 / R5; - } - if (R6 > 0) - { - total += 1 / R6; - } - if (R7 > 0) - { - total += 1 / R7; - } - if (R8 > 0) - { - total += 1 / R8; - } - if (R9 > 0) - { - total += 1 / R9; - } - if (R10 > 0) - { - total += 1 / R10; - } - return 1/total; -} - -constexpr long double Circuits::seriesCapacitance(const long double C1, const long double C2, const long double C3, const long double C4, const long double C5, const long double C6, const long double C7, const long double C8, const long double C9, const long double C10) -{ - long double total = 0; - if (C1>0) - { - total += 1 / C1; - } - if (C2>0) - { - total += 1 / C2; - } - if (C3 > 0) - { - total += 1 / C3; - } - if (C4 > 0) - { - total += 1 / C4; - } - if (C5 > 0) - { - total += 1 / C5; - } - if (C6 > 0) - { - total += 1 / C6; - } - if (C7 > 0) - { - total += 1 / C7; - } - if (C8 > 0) - { - total += 1 / C8; - } - if (C9 > 0) - { - total += 1 / C9; - } - if (C10 > 0) - { - total += 1 / C10; - } - return 1/total; - - -} - -constexpr long double Circuits::parallelCapacitance(const long double C1, const long double C2, const long double C3, const long double C4, const long double C5, const long double C6, const long double C7, const long double C8, const long double C9, const long double C10) -{ - return C1 + C2 + C3 + C4 + C5 + C6 + C7 + C8 + C9 + C10;//Ohms - -} - -constexpr long double Circuits::terminalVoltage(const long double emf, const long double r, const long double I) -{ - return emf - I*r;// V -} - -constexpr long double Circuits::current_OhmsLaw(const long double emf, const long double RLoad, const long double r) -{ - return emf/(RLoad+r);//amperes (I) -} - -constexpr long double Circuits::powerDissipation(const long double I, const long double Rload) -{ - return (I*I)*Rload;//Watts -} - -constexpr long double Circuits::emfsParallelConnection_added(const long double emf1=0, const long double emf2=0, const long double emf3=0, const long double emf4=0) -{ - return emf1 + emf2 + emf3 + emf4; -} - -constexpr long double Circuits::emfsSeriesConnection_subtracted(const long double emf1=0, const long double emf2=0, const long double emf3=0, const long double emf4=0) -{ - return emf1 - emf2 - emf3 - emf4; -} - -constexpr long double Circuits::internalResistance(const long double Vt, const long double E, const long double I) -{ - return (Vt - E)/I;//Ohms -} - -constexpr long double Circuits::timeConstant_RC(const long double R, const long double C) -{ - return R*C;//seconds -} - -constexpr long double Circuits::resistance_fromTimeConstant(const long double tau, const long double C) -{ - return tau/C;//Ohms -} - -constexpr long double Circuits::capacitance_fromTimeConstant(const long double tau, const long double R) -{ - return tau/R;//Farads -} - -inline long double Circuits::voltageVsTimeChargingCapacitor(const long double emf, const long double t, const long double R, const long double C) -{ - const double tau = R * C; - const double toRaise = -t / tau; - return emf*(1.0 - exp(toRaise)); -} - -constexpr long double Circuits::frequency(const long double cycles, const long double seconds) -{ - return cycles/seconds; -} - -constexpr long double Circuits::frequency(const long double period) -{ - return 1 / period; -} - -constexpr long double Circuits::period(const long double f) -{ - return 1 / f;//period t -} - -inline long double Circuits::resistance_fromDCequations(const long double t, const long double VoverE, const long double C) -{ - return (-t/(log(1-VoverE)*C));//ohms -} - -inline long double Circuits::time_fromDischargeEquation(const long double C, const long double R, const long double pOv) -{ - return -R*C*log(pOv/100.0);//seconds -} - -constexpr long double Circuits::resistance_fromDistanceVelocity(const long double d, const long double C, const long double v) -{ - return d / (C * v);//Ohms -} - -constexpr long double Circuits::energyUsed(const long double P, const long double t) -{ - return P*t;//joules -} - -constexpr long double Circuits::charge_fromPowerVoltsTime(const long double P, const long double V, const long double t) -{ - return (P/V)*t;//C -} - -constexpr long double Circuits::temperatureIncreaseOfResistor(const long double C, const long double V, const long double mass, const long double c) -{ - return (C*(V*V))/(2.0*mass*c);//temperature in C -} - -constexpr long double Circuits::emf(const long double r, const long double R_load, const long double I) -{ - return I * (r + R_load); -} +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_CIRCUITS_H +#define PHYSICSFORMULA_CIRCUITS_H +/** + * @class Circuits + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @dateBuilt 3/3/2021 + * @lastEdit 3/3/2021 + */ +#include +#include "ElectricCurrent.h" + +static int circuits_objectCount = 0; + +class Circuits: + public ElectricCurrent +{ + +public: + Circuits* _circuitPtr; + + + Circuits() + { + _circuitPtr = nullptr; + _circuitVal = 0.0; + countIncrease(); + } + Circuits(long double val) + { + _circuitPtr = nullptr; + _circuitVal = val; + countIncrease(); + } + + /** + * @brief copy constructor + */ + Circuits(const Circuits& c) + { + _circuitPtr = c._circuitPtr; + _circuitVal = 0.0; + countIncrease(); + } + /** + * #brief move constructor + */ + Circuits(Circuits&& c) noexcept + { + _circuitPtr = c._circuitPtr; + _circuitVal = c._circuitVal; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Circuits& operator=(const Circuits& c) + { + if (this != &c) + { + _circuitPtr = c._circuitPtr; + _circuitVal = c._circuitVal; + countIncrease(); + } + return *this; + } + + static void show_objectCount() { std::cout << "\n circuits object count: " + << circuits_objectCount << std::endl; } + static int get_objectCount() { return circuits_objectCount; } + + constexpr void setCircuitVal(long double val) { _circuitVal = val; } + + + /// + /// Calculates the total resistance of a Series of resistors. + /// + /// The resistor 1. + /// The resistor 2. + /// The resistor 3. + /// The resistor 4. + /// The resistor 5. + /// The resistor 6. + /// The resistor 7. + /// The resistor 8. + /// The resistor 9. + /// The resistor 10. + /// resistance in ohms + static constexpr long double seriesResistance(const long double R1, const long double R2, const long double R3, const long double R4, + const long double R5, const long double R6, const long double R7, const long double R8, const long double R9, const long double R10); + + /// + /// Calculates the total resistance of resistors hooked up in parallel. + /// + /// The resistor 1. + /// The resistor 2. + /// The resistor 3. + /// The resistor 4. + /// The resistor 5. + /// The resistor 6. + /// The resistor 7. + /// The resistor 8. + /// The resistor 9. + /// The resistor 10. + /// resistance in ohms + static constexpr long double parallelResistance(const long double R1, const long double R2, const long double R3, const long double R4, + const long double R5, const long double R6, const long double R7, const long double R8, const long double R9, const long double R10); + + /// + /// Calculates the total capacitor of a Series of capacitors. + /// + /// The capacitor 1. + /// The capacitor 2. + /// The capacitor 3. + /// The capacitor 4. + /// The capacitor 5. + /// The capacitor 6. + /// The capacitor 7. + /// The capacitor 8. + /// The capacitor 9. + /// The capacitor 10. + /// capacitance (F) + static constexpr long double seriesCapacitance(const long double C1, const long double C2, const long double C3, const long double C4, + const long double C5, const long double C6, const long double C7, const long double C8, const long double C9, const long double C10); + + /// + /// Calculates the total resistance of resistors hooked up in parallel. + /// + /// The capacitor 1. + /// The capacitor 2. + /// The capacitor 3. + /// The capacitor 4. + /// The capacitor 5. + /// The capacitor 6. + /// The capacitor 7. + /// The capacitor 8. + /// The capacitor 9. + /// The capacitor 10. + /// capacitance (F) + static constexpr long double parallelCapacitance(const long double C1, const long double C2, const long double C3, const long double C4, + const long double C5, const long double C6, const long double C7, const long double C8, const long double C9, const long double C10); + + + /// + /// Calculates the terminal voltage. + /// + /// The electromotive force. + /// The internal resistance. + /// The Charge. + /// Voltage + static constexpr long double terminalVoltage(const long double emf, const long double r, const long double I); + + + /// + /// Calculates the Current of a ohms law. + /// + /// The EMF. + /// The resistance load of all resistors connected. + /// The internal resistance. + /// current I in amperes + static constexpr long double current_OhmsLaw(const long double emf, const long double RLoad, const long double r); + + /// + /// Calculates the powers dissipated + /// + /// The current. + /// The Resistance load. + /// power output in watts (W)S + static constexpr long double powerDissipation(const long double I, const long double R); + + /// + /// add the total emfs for a series connection. where emf is the electromagnetic force + /// + /// The emf1. + /// The emf2. + /// The emf3. + /// The emf4. + /// net emf + static constexpr long double emfsParallelConnection_added(const long double emf1, const long double emf2, const long double emf3, const long double emf4); + + /// + /// add the total emfs for a series connection. where emf is the electromagnetic force + /// + /// The emf1. + /// The emf2. + /// The emf3. + /// The emf4. + /// + static constexpr long double emfsSeriesConnection_subtracted(const long double emf1, const long double emf2, const long double emf3, const long double emf4); + + /// + /// calculates the internals resistance. + /// + /// The terminal voltage. + /// The emf. + /// The current. + /// the internal resistance (r) + static constexpr long double internalResistance(const long double Vt, const long double E, const long double I); + + /// + /// calculates the RC time constant of a circuit containing a resistor and a + /// capacitor. + /// + /// The resistance. + /// The capacitance. + /// tau(Greek letter) + static constexpr long double timeConstant_RC(const long double R, const long double C); + + /// + /// calculates the resistances from time constant and capacitance. + /// + /// The tau(time constant). + /// The capacitance. + /// the resistance Ohms + static constexpr long double resistance_fromTimeConstant(const long double tau, const long double C); + + /// + /// calculates the capacitance from time constant and resistance. + /// + /// The tau. + /// The resistance. + /// + static constexpr long double capacitance_fromTimeConstant(const long double tau, const long double R); + + /// + /// Voltages the vs time charging capacitor. + /// + /// The EMF. + /// The time. + /// The resistance. + /// The capacitance. + /// + static long double voltageVsTimeChargingCapacitor(const long double emf, const long double t, const long double R, const long double C); + + /// + /// calculates the Frequency from cycles and seconds. + /// + /// The cycles. + /// The seconds. + /// frequency + static constexpr long double frequency(const long double cycles, const long double seconds); + + /// + /// Frequencies the specified period. + /// + /// The period. + /// + static constexpr long double frequency(const long double period); + + /// + /// calculates the periods from the specified f. + /// + /// The f. + /// period + static constexpr long double period(const long double f); + + + /// + /// Resistances from DC equations. + /// + /// The time. + /// The V/E . + /// The capacitance. + /// + static long double resistance_fromDCequations(const long double t, const long double VoverE, const long double C); + + /// + /// calculates using the exact exponential treatment, how much time is required to + /// discharge a C F capacitor through a R Ω resistor down to pOv% of + /// its original voltage. + /// + /// The capacitance. + /// The resistance. + /// The percent of original voltage. + /// time in seconds + static long double time_fromDischargeEquation(const long double C, const long double R, const long double pOv); + + /// + /// If you wish to take a picture of a bullet traveling at v m/s, then a + /// very brief flash of light produced by an RC discharge through a flash + /// tube can limit blurring. Assuming d m of motion during one RC constant + /// is acceptable, and given that the flash is driven by a C F capacitor, + /// what is the resistance in the flash tube? + /// + /// The distance in meters. + /// The capacitance. + /// The velocity. + /// resistance in Ohms + static constexpr long double resistance_fromDistanceVelocity(const long double d, const long double C, const long double v); + + /// + /// A flashing lamp in a Christmas earring is based on an RC discharge of a + /// capacitor through its resistance. The effective duration of the flash + /// is t s, during which it produces an average 0.500 W from an average + /// 3.00 V. calculates the energy it dissipates? + /// + /// The power. + /// The time. + /// energy in joules + static constexpr long double energyUsed(const long double P, const long double t); + + /// A flashing lamp in a Christmas earring is based on an RC discharge of a + /// capacitor through its resistance. The effective duration of the flash + /// is t s, during which it produces an average 0.500 W from an average + /// 3.00 V. calculates the charge that moves through the lamp. + /// The power. + /// The volts. + /// The time. + /// coulombs + static constexpr long double charge_fromPowerVoltsTime(const long double P, const long double V, const long double t); + + /// + /// A C F capacitor charged to V is discharged through a resistor. + /// Calculate the temperature increase of the resistor, given that its of a mass + /// in kg and its specific heat is c kJ/kg⋅C∘, noting that most of the thermal + /// energy is retained in the short time of the discharge. + /// + /// The capacitance. + /// The volts. + /// The mass. + /// The specific heat. + /// temp in C + static constexpr long double temperatureIncreaseOfResistor(const long double C, const long double V, const long double mass, const long double c); + + /// + /// EMFs the specified r. + /// + /// The r. + /// The r load. + /// The i. + /// + static constexpr long double emf(const long double r, const long double R_load, const long double I); + + + + ~Circuits() + { + delete _circuitPtr; + } + +private: + static void countIncrease() { circuits_objectCount += 1; } + static void countDecrease() { circuits_objectCount -= 1; } + long double _circuitVal; + +}; +#endif //PHYSICSFORMULA_CIRCUITS_H + +constexpr long double Circuits::seriesResistance(const long double R1 = 0, const long double R2 = 0, const long double R3 = 0, + const long double R4 = 0, const long double R5 = 0, const long double R6 = 0, const long double R7 = 0, const long double R8 = 0, + const long double R9 = 0, const long double R10 = 0) +{ + + return R1 + R2 + R3 + R4 + R5 + R6 + R7 + R8 + R9 + R10;//Ohms +} + +constexpr long double Circuits::parallelResistance(const long double R1 = 0, const long double R2 = 0, const long double R3 = 0, + const long double R4 = 0, const long double R5 = 0, const long double R6 = 0, const long double R7 = 0, const long double R8 = 0, + const long double R9 = 0, const long double R10 = 0) +{ + long double total = 0; + if (R1>0) + { + total += 1 / R1; + } + if (R2>0) + { + total += 1 / R2; + } + if (R3 > 0) + { + total += 1 / R3; + } + if (R4 > 0) + { + total += 1 / R4; + } + if (R5 > 0) + { + total += 1 / R5; + } + if (R6 > 0) + { + total += 1 / R6; + } + if (R7 > 0) + { + total += 1 / R7; + } + if (R8 > 0) + { + total += 1 / R8; + } + if (R9 > 0) + { + total += 1 / R9; + } + if (R10 > 0) + { + total += 1 / R10; + } + return 1/total; +} + +constexpr long double Circuits::seriesCapacitance(const long double C1, const long double C2, const long double C3, const long double C4, const long double C5, const long double C6, const long double C7, const long double C8, const long double C9, const long double C10) +{ + long double total = 0; + if (C1>0) + { + total += 1 / C1; + } + if (C2>0) + { + total += 1 / C2; + } + if (C3 > 0) + { + total += 1 / C3; + } + if (C4 > 0) + { + total += 1 / C4; + } + if (C5 > 0) + { + total += 1 / C5; + } + if (C6 > 0) + { + total += 1 / C6; + } + if (C7 > 0) + { + total += 1 / C7; + } + if (C8 > 0) + { + total += 1 / C8; + } + if (C9 > 0) + { + total += 1 / C9; + } + if (C10 > 0) + { + total += 1 / C10; + } + return 1/total; + + +} + +constexpr long double Circuits::parallelCapacitance(const long double C1, const long double C2, const long double C3, const long double C4, const long double C5, const long double C6, const long double C7, const long double C8, const long double C9, const long double C10) +{ + return C1 + C2 + C3 + C4 + C5 + C6 + C7 + C8 + C9 + C10;//Ohms + +} + +constexpr long double Circuits::terminalVoltage(const long double emf, const long double r, const long double I) +{ + return emf - I*r;// V +} + +constexpr long double Circuits::current_OhmsLaw(const long double emf, const long double RLoad, const long double r) +{ + return emf/(RLoad+r);//amperes (I) +} + +constexpr long double Circuits::powerDissipation(const long double I, const long double Rload) +{ + return (I*I)*Rload;//Watts +} + +constexpr long double Circuits::emfsParallelConnection_added(const long double emf1=0, const long double emf2=0, const long double emf3=0, const long double emf4=0) +{ + return emf1 + emf2 + emf3 + emf4; +} + +constexpr long double Circuits::emfsSeriesConnection_subtracted(const long double emf1=0, const long double emf2=0, const long double emf3=0, const long double emf4=0) +{ + return emf1 - emf2 - emf3 - emf4; +} + +constexpr long double Circuits::internalResistance(const long double Vt, const long double E, const long double I) +{ + return (Vt - E)/I;//Ohms +} + +constexpr long double Circuits::timeConstant_RC(const long double R, const long double C) +{ + return R*C;//seconds +} + +constexpr long double Circuits::resistance_fromTimeConstant(const long double tau, const long double C) +{ + return tau/C;//Ohms +} + +constexpr long double Circuits::capacitance_fromTimeConstant(const long double tau, const long double R) +{ + return tau/R;//Farads +} + +inline long double Circuits::voltageVsTimeChargingCapacitor(const long double emf, const long double t, const long double R, const long double C) +{ + const double tau = R * C; + const double toRaise = -t / tau; + return emf*(1.0 - exp(toRaise)); +} + +constexpr long double Circuits::frequency(const long double cycles, const long double seconds) +{ + return cycles/seconds; +} + +constexpr long double Circuits::frequency(const long double period) +{ + return 1 / period; +} + +constexpr long double Circuits::period(const long double f) +{ + return 1 / f;//period t +} + +inline long double Circuits::resistance_fromDCequations(const long double t, const long double VoverE, const long double C) +{ + return (-t/(log(1-VoverE)*C));//ohms +} + +inline long double Circuits::time_fromDischargeEquation(const long double C, const long double R, const long double pOv) +{ + return -R*C*log(pOv/100.0);//seconds +} + +constexpr long double Circuits::resistance_fromDistanceVelocity(const long double d, const long double C, const long double v) +{ + return d / (C * v);//Ohms +} + +constexpr long double Circuits::energyUsed(const long double P, const long double t) +{ + return P*t;//joules +} + +constexpr long double Circuits::charge_fromPowerVoltsTime(const long double P, const long double V, const long double t) +{ + return (P/V)*t;//C +} + +constexpr long double Circuits::temperatureIncreaseOfResistor(const long double C, const long double V, const long double mass, const long double c) +{ + return (C*(V*V))/(2.0*mass*c);//temperature in C +} + +constexpr long double Circuits::emf(const long double r, const long double R_load, const long double I) +{ + return I * (r + R_load); +} diff --git a/Cone.h b/Cone.h index d9093cb..7d7cdde 100644 --- a/Cone.h +++ b/Cone.h @@ -1,155 +1,155 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_CONE_H -#define PHYSICSFORMULA_CONE_H -/** - * @class Cone - * @details class to represent a Cone object - * @author Ryan Zurrin - * @dateBuilt 11/4/2021 - * @lastEdit 11/4/2021 - */ -#include -#include -#define _PI_ 3.14159265358979323846 - -static int coneObjectCount = 0; -typedef long double ld; - -class Cone -{ - ld height; - ld radius; - ld volume; - ld surfaceArea; - static auto countIncrease() { coneObjectCount += 1; } - static auto countDecrease() { coneObjectCount -= 1; } - ld calculateVolume()const; - ld calculateSurfaceArea()const; -public: - - Cone() - { - height = 0.0; - radius = 0.0; - volume = 0.0; - surfaceArea = 0.0; - countIncrease(); - } - - Cone(ld height, ld radius) - { - this->height = height; - this->radius = radius; - this->volume = calculateVolume(); - this->surfaceArea = calculateSurfaceArea(); - countIncrease(); - } - - /** - * @brief copy constructor - */ - Cone(const Cone& s) - { - height = s.height; - radius = s.radius; - volume = s.volume; - surfaceArea = s.surfaceArea; - countIncrease(); - } - /** - * #brief move constructor - */ - Cone(Cone&& s) noexcept - { - height = s.height; - radius = s.radius; - volume = s.volume; - surfaceArea = s.surfaceArea; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Cone& operator=(Cone&& s) noexcept - { - if (this != &s) - { - height = s.height; - radius = s.radius; - volume = s.volume; - surfaceArea = s.surfaceArea; - countIncrease(); - } - return *this; - } - - Cone& operator=(Cone other) - { - std::swap(height, other.height); - std::swap(radius, other.radius); - std::swap(volume, other.volume); - std::swap(surfaceArea, other.surfaceArea); - return *this; - } - - static void show_objectCount() { - std::cout << "\n cone object count: " - << coneObjectCount << std::endl; - } - static int get_objectCount() { return coneObjectCount; } - - - ~Cone() = default; - - auto setHeight(ld h); - auto setRadius(ld r); - - [[nodiscard]] auto getHeight() const { return height; } - [[nodiscard]] auto getRadius() const { return radius; } - [[nodiscard]] auto getVolume() const { return volume; } - [[nodiscard]] auto getSurfaceArea() const { return surfaceArea; } - [[nodiscard]] auto getWeight(ld densityKgM) const; - - void printConeInfo()const; -}; - -#endif //PHYSICSFORMULA_CONE_H -inline ld Cone::calculateVolume() const -{ - return (1.0/3.0)*_PI_*(radius*radius)*height; -} - -inline ld Cone::calculateSurfaceArea() const -{ - return _PI_*radius*(sqrt((radius*radius) + (height*height)))+ _PI_*(radius*radius); -} - -inline auto Cone::setHeight(ld h) -{ - height = h; - volume = calculateVolume(); - surfaceArea = calculateSurfaceArea(); -} - -inline auto Cone::setRadius(ld r) -{ - radius = r; - volume = calculateVolume(); - surfaceArea = calculateSurfaceArea(); -} - -inline auto Cone::getWeight(ld densityKgM) const -{ - return densityKgM * volume; -} - -inline void Cone::printConeInfo() const -{ - std::cout << "height: " << height << std::endl; - std::cout << "radius: " << radius << std::endl; - std::cout << "volume: " << volume << std::endl; - std::cout << "surface area: " << surfaceArea << std::endl; -} +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_CONE_H +#define PHYSICSFORMULA_CONE_H +/** + * @class Cone + * @details class to represent a Cone object + * @author Ryan Zurrin + * @dateBuilt 11/4/2021 + * @lastEdit 11/4/2021 + */ +#include +#include +#define _PI_ 3.14159265358979323846 + +static int coneObjectCount = 0; +typedef long double ld; + +class Cone +{ + ld height; + ld radius; + ld volume; + ld surfaceArea; + static auto countIncrease() { coneObjectCount += 1; } + static auto countDecrease() { coneObjectCount -= 1; } + ld calculateVolume()const; + ld calculateSurfaceArea()const; +public: + + Cone() + { + height = 0.0; + radius = 0.0; + volume = 0.0; + surfaceArea = 0.0; + countIncrease(); + } + + Cone(ld height, ld radius) + { + this->height = height; + this->radius = radius; + this->volume = calculateVolume(); + this->surfaceArea = calculateSurfaceArea(); + countIncrease(); + } + + /** + * @brief copy constructor + */ + Cone(const Cone& s) + { + height = s.height; + radius = s.radius; + volume = s.volume; + surfaceArea = s.surfaceArea; + countIncrease(); + } + /** + * #brief move constructor + */ + Cone(Cone&& s) noexcept + { + height = s.height; + radius = s.radius; + volume = s.volume; + surfaceArea = s.surfaceArea; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Cone& operator=(Cone&& s) noexcept + { + if (this != &s) + { + height = s.height; + radius = s.radius; + volume = s.volume; + surfaceArea = s.surfaceArea; + countIncrease(); + } + return *this; + } + + Cone& operator=(Cone other) + { + std::swap(height, other.height); + std::swap(radius, other.radius); + std::swap(volume, other.volume); + std::swap(surfaceArea, other.surfaceArea); + return *this; + } + + static void show_objectCount() { + std::cout << "\n cone object count: " + << coneObjectCount << std::endl; + } + static int get_objectCount() { return coneObjectCount; } + + + ~Cone() = default; + + auto setHeight(ld h); + auto setRadius(ld r); + + [[nodiscard]] auto getHeight() const { return height; } + [[nodiscard]] auto getRadius() const { return radius; } + [[nodiscard]] auto getVolume() const { return volume; } + [[nodiscard]] auto getSurfaceArea() const { return surfaceArea; } + [[nodiscard]] auto getWeight(ld densityKgM) const; + + void printConeInfo()const; +}; + +#endif //PHYSICSFORMULA_CONE_H +inline ld Cone::calculateVolume() const +{ + return (1.0/3.0)*_PI_*(radius*radius)*height; +} + +inline ld Cone::calculateSurfaceArea() const +{ + return _PI_*radius*(sqrt((radius*radius) + (height*height)))+ _PI_*(radius*radius); +} + +inline auto Cone::setHeight(ld h) +{ + height = h; + volume = calculateVolume(); + surfaceArea = calculateSurfaceArea(); +} + +inline auto Cone::setRadius(ld r) +{ + radius = r; + volume = calculateVolume(); + surfaceArea = calculateSurfaceArea(); +} + +inline auto Cone::getWeight(ld densityKgM) const +{ + return densityKgM * volume; +} + +inline void Cone::printConeInfo() const +{ + std::cout << "height: " << height << std::endl; + std::cout << "radius: " << radius << std::endl; + std::cout << "volume: " << volume << std::endl; + std::cout << "surface area: " << surfaceArea << std::endl; +} diff --git a/Convexhull.cpp b/Convexhull.cpp index 39aa625..17716c1 100644 --- a/Convexhull.cpp +++ b/Convexhull.cpp @@ -1,609 +1,609 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#include "Convexhull.h" -#include "GeoUtils.h" -#include "Distance.h" -#include "Inclusion.h" - -#include -#include - -using namespace rez; - -void rez::convexhull2DGiftwrapping(std::vector& _points, std::vector& _convex) -{ - if (_points.size() <= 3) - return; - - // For giftwarpping algorithm we have to pick a point which should be in the convexhull. - // This point could be top most, bot most, left most or right most point. I pick bot most - - // Get the bottom point - Point2d bottom_point = _points[0]; - - for (Point2d& point : _points) { - if ((point[Y] < bottom_point[Y]) - || (point[Y] == bottom_point[Y]) && (point[X] < bottom_point[X])) { - bottom_point = point; - } - } - - Point2d min_polar_point = _points[0]; - float current_polor_angle = 360.0; - - // Finding the second points in the convexhull by calculating poloar angle related to bottom point - for (size_t i = 0; i < _points.size(); i++) { - float polar_angle = polarAngle(_points[i], bottom_point); - if (bottom_point != _points[i] && current_polor_angle > polar_angle) { - current_polor_angle = polar_angle; - min_polar_point = _points[i]; - } - } - - // Add the first two points of the convexhull - _convex.push_back(bottom_point); - _convex.push_back(min_polar_point); - - // Make the second point of the current convexhull point list the referece to calculate next point. - Point2d ref_point = min_polar_point; - int index_before_last = 0; - - while (true) { - current_polor_angle = 360.0; - for (size_t i = 0; i < _points.size(); i++) { - Vector2f vec1 = ref_point - _convex[index_before_last]; // vector for line from last two vert in the convexhull - Vector2f vec2 = _points[i] - ref_point; - - float between_angle = angle(vec1, vec2); - if (ref_point != _points[i] && current_polor_angle > between_angle) { - current_polor_angle = between_angle; - min_polar_point = _points[i]; - } - } - - if (min_polar_point == bottom_point) - break; - - index_before_last++; - _convex.push_back(min_polar_point); - ref_point = min_polar_point; - } -} - - - -void rez::convexhull2DModifiedGrahams(std::vector& _points, - std::vector& _convex) -{ - if (_points.size() <= 3) - return; - - //Sort the points left to right order - std::sort(_points.begin(), _points.end()); - - std::vector l_upper; - std::vector l_lower; - - // Append left most point and next one l_upper. - l_upper.push_back(*_points.begin()); - l_upper.push_back(*(std::next(_points.begin()))); - - int index = 0; - for (size_t i = 2; i < _points.size(); i++) - { - index = l_upper.size(); - const auto& next_point = _points[i]; - while (l_upper.size() > 1 && left(l_upper[index - 2], l_upper[index - 1], next_point)) - { - l_upper.pop_back(); - index = l_upper.size(); - } - - l_upper.push_back(next_point); - } - - //Reverse the points right to left order to construct l_lower - std::reverse(_points.begin(), _points.end()); - - // Append Right most point and next one l_lower. - l_lower.push_back(*_points.begin()); - l_lower.push_back(*(std::next(_points.begin()))); - - for (size_t i = 2; i < _points.size(); i++) - { - index = l_lower.size(); - const auto& next_point = _points[i]; - - while (l_lower.size() > 1 && left(l_lower[index - 2], l_lower[index - 1], next_point)) - { - l_lower.pop_back(); - index = l_lower.size(); - } - - l_lower.push_back(next_point); - } - - // Left-most and Right-most points are repeating. So removed those from one of half hulls - l_upper.pop_back(); - l_lower.pop_back(); - - _convex.insert(_convex.end(), l_upper.begin(), l_upper.end()); - _convex.insert(_convex.end(), l_lower.begin(), l_lower.end()); -} - -void rez::convexhull2DIncremental(std::vector& _points, std::vector& _convex) -{ - //Sort the points left to right order - std::sort(_points.begin(), _points.end(), [](const Point3d& a, const Point3d& b) { - if ((a[X] < b[X]) - || (a[X] == b[X]) && (a[Y] < b[Y])) - { - return true; - } - return false; - }); - - _convex.push_back(_points[0]); - _convex.push_back(_points[1]); - _convex.push_back(_points[2]); - - int points_size = _points.size(); - - for (size_t i = 3; i < _points.size(); i++) - { - // If the points is inside the current hull, we can skip it - if (isInside(_points[i], _convex)) - continue; - - // Get the index of closetest point in current hull - int index = getClosestPointIndex(_points[i], _convex); - Point3d line_point = _convex[index]; - Point3d current_point; - int uindex = index + 1; - while (true) - { - current_point = _convex[uindex % points_size]; - - if (!right(_points[i], line_point, current_point)) - break; - - line_point = current_point; - uindex += 1; - } - - line_point = _convex[index]; - int lindex = index - 1; - while (true) - { - if (lindex < 0) - lindex = points_size - 1; - - current_point = _convex[lindex]; - - if (!left(_points[i], line_point, current_point)) - break; - - line_point = current_point; - lindex -= 1; - } - - std::vector new_convex; - - if (lindex < uindex) - { - new_convex.insert(new_convex.begin(), _convex.begin(), _convex.begin() + lindex); - new_convex.push_back(_convex[lindex]); - new_convex.insert(new_convex.end(), _convex.begin() + uindex, _convex.end()); - } - else - { - new_convex.insert(new_convex.begin(), _convex.begin() + uindex, _convex.begin() + lindex); - new_convex.push_back(_convex[lindex]); - } - - _convex = new_convex; - } -} - -template -void getHull(Iterator first, Iterator last, Polygon& _results) -{ - unsigned const length = std::distance(first, last); - - if (length == 1) - { - _results.Insert(*first); - } - else - { - Iterator const mid_point = first + length / 2; - - Polygon left_poly; - Polygon right_poly; - - getHull(first, mid_point, left_poly); - getHull(mid_point, last, right_poly); - - merge(left_poly, right_poly, _results); - } -} - -void rez::convexhull2DDivideAndConquer(std::vector& _points, Polygon& _results) -{ - //Sort the points left to right order - std::sort(_points.begin(), _points.end(), [](const Point3d& a, const Point3d& b) { - if ((a[X] < b[X]) - || (a[X] == b[X]) && (a[Y] < b[Y])) - { - return true; - } - return false; - }); - - getHull(_points.begin(), _points.end(), _results); -} - -static void find_hull(std::vector& _points, std::vector& _convex, Point3d& _l, Point3d& _r) -{ - if (!_points.size()) - return; - - if (_points.size() == 1) - { - _convex.push_back(_points[0]); - return; - } - - Point3d maxd_point = _points[0]; - float max_d = 0; - - for (Point3d& pnt : _points) - { - float this_distance = distance(_l, _r, pnt); - if (this_distance > max_d) - { - max_d = this_distance; - maxd_point = pnt; - } - } - - _convex.push_back(maxd_point); - - std::vector s1; - std::vector s2; - - for (Point3d& pnt : _points) - { - if (leftOrBetween(_l, maxd_point, pnt)) - s1.push_back(pnt); - else if (left(maxd_point, _r, pnt)) - s2.push_back(pnt); - } - - find_hull(s1, _convex, _l, _r); - find_hull(s2, _convex, _r, _l); -} - -void rez::convexhull2DQuickhull(std::vector& _points, std::vector& _convex) -{ - if (_points.size() <= 3) - return; - - // Step 1 : Get the two extreme points Left top and right bot - Point3d left_top = _points[0]; - Point3d right_bot = _points[0]; - - for (Point3d& point : _points) - { - if ((point[X] < left_top[X]) - || (point[X] == left_top[X]) && (point[Y] > left_top[X])) - { - left_top = point; - } - - if ((point[X] > right_bot[X]) - || (point[X] == right_bot[X]) && (point[Y] < right_bot[X])) - { - right_bot = point; - } - } - - _convex.push_back(left_top); - _convex.push_back(right_bot); - - std::vector s1; - std::vector s2; - - for (Point3d& point : _points) - { - if (leftOrBetween(left_top, right_bot, point)) - s1.push_back(point); - else if (right(left_top, right_bot, point)) - s2.push_back(point); - } - - find_hull(s1, _convex, left_top, right_bot); - find_hull(s2, _convex, right_bot, left_top); -} - -static bool incident_face(Face* _face, Edge3d* _edge) -{ - auto r1 = std::find(_face->vertices.begin(), _face->vertices.end(), _edge->vertices[0]); - auto r2 = std::find(_face->vertices.begin(), _face->vertices.end(), _edge->vertices[1]); - if (r1 != std::end(_face->vertices) && r1 != std::end(_face->vertices)) - return true; - return false; -} - -static void adjust_normal(Face* _face, Point3d& _ref_point) -{ - // ref point is inside one. If it sees the orientation as counter clockwise, we need to adjust the face normal direction. - // If the this is opposite what we need. - int order = FaceVisibility(*_face, _ref_point); - if (order < 0) { - _face->normal_switch_needed = true; - } -} - -static void construct_initial_polyhedron(std::vector& _points, int i, std::vector& faces, std::vector& edges, - Point3d& ref_point) -{ - // Create the initial tetrahedron - faces.push_back(new Face(_points[i + 0], _points[i + 1], _points[i + 2])); - faces.push_back(new Face(_points[i + 0], _points[i + 1], _points[i + 3])); - faces.push_back(new Face(_points[i + 1], _points[i + 2], _points[i + 3])); - faces.push_back(new Face(_points[i + 2], _points[i + 0], _points[i + 3])); - - for (size_t i = 0; i < faces.size(); i++) - { - adjust_normal(faces[i], ref_point); - } - - edges.push_back(new Edge3d(_points[i + 0], _points[i + 1])); - edges.push_back(new Edge3d(_points[i + 1], _points[i + 2])); - edges.push_back(new Edge3d(_points[i + 2], _points[i + 0])); - edges.push_back(new Edge3d(_points[i + 0], _points[i + 3])); - edges.push_back(new Edge3d(_points[i + 1], _points[i + 3])); - edges.push_back(new Edge3d(_points[i + 2], _points[i + 3])); - - //Set the boundary edges for faces - faces[0]->addEdge(edges[0]); - faces[0]->addEdge(edges[1]); - faces[0]->addEdge(edges[2]); - - faces[1]->addEdge(edges[0]); - faces[1]->addEdge(edges[3]); - faces[1]->addEdge(edges[4]); - - faces[2]->addEdge(edges[1]); - faces[2]->addEdge(edges[4]); - faces[2]->addEdge(edges[5]); - - faces[3]->addEdge(edges[2]); - faces[3]->addEdge(edges[5]); - faces[3]->addEdge(edges[3]); - - // set the incident faces for edges - edges[0]->faces[0] = faces[0]; - edges[0]->faces[1] = faces[1]; - - edges[1]->faces[0] = faces[0]; - edges[1]->faces[1] = faces[2]; - - edges[2]->faces[0] = faces[0]; - edges[2]->faces[1] = faces[3]; - - edges[3]->faces[0] = faces[1]; - edges[3]->faces[1] = faces[3]; - - edges[4]->faces[0] = faces[2]; - edges[4]->faces[1] = faces[1]; - - edges[5]->faces[0] = faces[3]; - edges[5]->faces[1] = faces[2]; -} - -void rez::convexhull3D(std::vector& _points, std::vector& faces) -{ - // Step 1 : Pick 4 points that do not lie in same plane. If we cannot find such points - // - then all the points as in one plane and we can use 2d convexhull algo to find the hull. - // 1. Pick two points.(P1, P2) - // 2. Pick thired point that do not in P1, P2 line. P3 - // 3. Pick fourth point that do not lie in P1, P2, P3 plane. - - std::vector vertices; - for (size_t i = 0; i < _points.size(); i++) - { - vertices.push_back(new Vertex3d(&_points[i])); - } - - std::vector edges; - - size_t i = 0, j = 0; - bool found_noncoplaner = false; - for (i = 0; i < _points.size() - 3; i++) - { - if (!coplaner(_points[i], _points[i + 1], _points[i + 2], _points[i + 3])) - { - found_noncoplaner = true; - break; - } - } - - if (!found_noncoplaner) - { - std::cout << "All the points are coplaner" << std::endl; - return; - } - - // We need to find a point inside the - float x_mean = (_points[i][X] + _points[i + 1][X] + _points[i + 2][X] + _points[i + 3][X]) / 4; - float y_mean = (_points[i][Y] + _points[i + 1][Y] + _points[i + 2][Y] + _points[i + 3][Y]) / 4; - float z_mean = (_points[i][Z] + _points[i + 1][Z] + _points[i + 2][Z] + _points[i + 3][Z]) / 4; - float x_p = x_mean; - float y_p = y_mean; - float z_p = z_mean; - - Point3d point_ref(x_p, y_p, z_p); - construct_initial_polyhedron(vertices, i, faces, edges, point_ref); - - //Points used to construct the p - vertices[i]->processed = true; - vertices[i + 1]->processed = true; - vertices[i + 2]->processed = true; - vertices[i + 3]->processed = true; - - // Step 2 : Add next point Pr to the current convexhull - // 1. Pr can be inside the current hull. Then there's nothing to be done. - // 2. Pr lies outside the convexhull. In this case we need to compute new hull. - - for (size_t i = 0; i < vertices.size(); i++) - { - if (vertices[i]->processed) - continue; - - std::vector visible_faces; - std::vector border_edges; - std::vector tobe_deleted_edges; - - // Point has not yet processed and it is outside the current hull. - for (size_t j = 0; j < faces.size(); j++) - { - float volum = FaceVisibility(*faces[j], *vertices[i]->point); - - //if (order == CCW && volum < 0 || order == CW && volum > 0) - if ((!faces[j]->normal_switch_needed && volum < 0) - || (faces[j]->normal_switch_needed && volum > 0)) - { - faces[j]->visible = true; - visible_faces.push_back(faces[j]); - } - } - - if (!visible_faces.size()) - continue; // Point is inside - - for (size_t k = 0; k < visible_faces.size(); k++) - { - for (size_t j = 0; j < visible_faces[k]->edges.size(); j++) - { - if (visible_faces[k]->edges[j]->faces[0]->visible && - visible_faces[k]->edges[j]->faces[1]->visible) - { - tobe_deleted_edges.push_back(visible_faces[k]->edges[j]); - } - else - { - //Atleast one edge in visible faces is visible - border_edges.push_back(visible_faces[k]->edges[j]); - } - } - } - - std::vector new_faces; - std::vector new_edges; - - const unsigned int new_size = border_edges.size(); - - // We need to find the unique points in border edges. - std::list unque_vertices; - for (size_t j = 0; j < new_size; j++) - { - unque_vertices.push_back(border_edges[j]->vertices[0]); - unque_vertices.push_back(border_edges[j]->vertices[1]); - } - - // Due to below sorting we cannot rely on the created order for adding faces to the edge. So we need to explicitly check - // for incident faces in that case. - unque_vertices.sort(); - unque_vertices.unique([](Vertex3d* a, Vertex3d* b) { return *(a->point) == *(b->point); }); - std::list::iterator it; - - for (size_t j = 0; j < new_size; j++) - { - it = unque_vertices.begin(); - std::advance(it, j); - - // New faces and edges for new convex polyhedron - new_edges.push_back(new Edge3d(*it, vertices[i])); - new_faces.push_back(new Face(border_edges[j]->vertices[0], vertices[i], border_edges[j]->vertices[1])); - - //Add new face referece to borader edges - if (border_edges[j]->faces[0]->visible) - { - border_edges[j]->faces[0] = new_faces[new_faces.size() - 1]; - } - else - { - border_edges[j]->faces[1] = new_faces[new_faces.size() - 1]; - } - } - - //Adjust the faces normals - for (size_t j = 0; j < new_size; j++) - { - adjust_normal(new_faces[j], point_ref); - } - - // Added faces for edges - // Based on our assumptions we must have exactly two faces incident wiht each edge - for (size_t j = 0; j < new_edges.size(); j++) - { - std::vector incident_faces; - - for (size_t k = 0; k < new_faces.size(); k++) - { - if (incident_face(new_faces[k], new_edges[j])) - incident_faces.push_back(new_faces[k]); - } - - new_edges[j]->faces[0] = incident_faces[0]; - new_edges[j]->faces[1] = incident_faces[1]; - } - - // Added edges for faces - for (size_t j = 0; j < new_size; j++) - { - new_faces[j]->addEdge(border_edges[j]); - for (size_t k = 0; k < new_edges.size(); k++) - { - auto r1 = std::find(new_faces[j]->vertices.begin(), - new_faces[j]->vertices.end(), new_edges[k]->vertices[0]); - auto r2 = std::find(new_faces[j]->vertices.begin(), - new_faces[j]->vertices.end(), new_edges[k]->vertices[1]); - - if (incident_face(new_faces[j], new_edges[k])) - new_faces[j]->addEdge(new_edges[k]); - } - } - - // Deleted the edges from to be deleted list - for (size_t k = 0; k < tobe_deleted_edges.size(); k++) - { - for (size_t j = 0; j < edges.size(); j++) - { - if (*tobe_deleted_edges[k] == *edges[j]) - edges.erase(edges.begin() + j); - } - } - - // Delete the visible faces. - for (size_t k = 0; k < visible_faces.size(); k++) - { - for (size_t j = 0; j < faces.size(); j++) - { - if (visible_faces[k] == faces[j]) - faces.erase(faces.begin() + j); - } - } - - faces.insert(faces.end(), new_faces.begin(), new_faces.end()); - edges.insert(edges.end(), new_edges.begin(), new_edges.end()); - } -} - -void rez::convexhull3DQuickhull(std::vector& _points, Polygon& _results) -{ +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#include "Convexhull.h" +#include "GeoUtils.h" +#include "Distance.h" +#include "Inclusion.h" + +#include +#include + +using namespace rez; + +void rez::convexhull2DGiftwrapping(std::vector& _points, std::vector& _convex) +{ + if (_points.size() <= 3) + return; + + // For giftwarpping algorithm we have to pick a point which should be in the convexhull. + // This point could be top most, bot most, left most or right most point. I pick bot most + + // Get the bottom point + Point2d bottom_point = _points[0]; + + for (Point2d& point : _points) { + if ((point[Y] < bottom_point[Y]) + || (point[Y] == bottom_point[Y]) && (point[X] < bottom_point[X])) { + bottom_point = point; + } + } + + Point2d min_polar_point = _points[0]; + float current_polor_angle = 360.0; + + // Finding the second points in the convexhull by calculating poloar angle related to bottom point + for (size_t i = 0; i < _points.size(); i++) { + float polar_angle = polarAngle(_points[i], bottom_point); + if (bottom_point != _points[i] && current_polor_angle > polar_angle) { + current_polor_angle = polar_angle; + min_polar_point = _points[i]; + } + } + + // Add the first two points of the convexhull + _convex.push_back(bottom_point); + _convex.push_back(min_polar_point); + + // Make the second point of the current convexhull point list the referece to calculate next point. + Point2d ref_point = min_polar_point; + int index_before_last = 0; + + while (true) { + current_polor_angle = 360.0; + for (size_t i = 0; i < _points.size(); i++) { + Vector2f vec1 = ref_point - _convex[index_before_last]; // vector for line from last two vert in the convexhull + Vector2f vec2 = _points[i] - ref_point; + + float between_angle = angle(vec1, vec2); + if (ref_point != _points[i] && current_polor_angle > between_angle) { + current_polor_angle = between_angle; + min_polar_point = _points[i]; + } + } + + if (min_polar_point == bottom_point) + break; + + index_before_last++; + _convex.push_back(min_polar_point); + ref_point = min_polar_point; + } +} + + + +void rez::convexhull2DModifiedGrahams(std::vector& _points, + std::vector& _convex) +{ + if (_points.size() <= 3) + return; + + //Sort the points left to right order + std::sort(_points.begin(), _points.end()); + + std::vector l_upper; + std::vector l_lower; + + // Append left most point and next one l_upper. + l_upper.push_back(*_points.begin()); + l_upper.push_back(*(std::next(_points.begin()))); + + int index = 0; + for (size_t i = 2; i < _points.size(); i++) + { + index = l_upper.size(); + const auto& next_point = _points[i]; + while (l_upper.size() > 1 && left(l_upper[index - 2], l_upper[index - 1], next_point)) + { + l_upper.pop_back(); + index = l_upper.size(); + } + + l_upper.push_back(next_point); + } + + //Reverse the points right to left order to construct l_lower + std::reverse(_points.begin(), _points.end()); + + // Append Right most point and next one l_lower. + l_lower.push_back(*_points.begin()); + l_lower.push_back(*(std::next(_points.begin()))); + + for (size_t i = 2; i < _points.size(); i++) + { + index = l_lower.size(); + const auto& next_point = _points[i]; + + while (l_lower.size() > 1 && left(l_lower[index - 2], l_lower[index - 1], next_point)) + { + l_lower.pop_back(); + index = l_lower.size(); + } + + l_lower.push_back(next_point); + } + + // Left-most and Right-most points are repeating. So removed those from one of half hulls + l_upper.pop_back(); + l_lower.pop_back(); + + _convex.insert(_convex.end(), l_upper.begin(), l_upper.end()); + _convex.insert(_convex.end(), l_lower.begin(), l_lower.end()); +} + +void rez::convexhull2DIncremental(std::vector& _points, std::vector& _convex) +{ + //Sort the points left to right order + std::sort(_points.begin(), _points.end(), [](const Point3d& a, const Point3d& b) { + if ((a[X] < b[X]) + || (a[X] == b[X]) && (a[Y] < b[Y])) + { + return true; + } + return false; + }); + + _convex.push_back(_points[0]); + _convex.push_back(_points[1]); + _convex.push_back(_points[2]); + + int points_size = _points.size(); + + for (size_t i = 3; i < _points.size(); i++) + { + // If the points is inside the current hull, we can skip it + if (isInside(_points[i], _convex)) + continue; + + // Get the index of closetest point in current hull + int index = getClosestPointIndex(_points[i], _convex); + Point3d line_point = _convex[index]; + Point3d current_point; + int uindex = index + 1; + while (true) + { + current_point = _convex[uindex % points_size]; + + if (!right(_points[i], line_point, current_point)) + break; + + line_point = current_point; + uindex += 1; + } + + line_point = _convex[index]; + int lindex = index - 1; + while (true) + { + if (lindex < 0) + lindex = points_size - 1; + + current_point = _convex[lindex]; + + if (!left(_points[i], line_point, current_point)) + break; + + line_point = current_point; + lindex -= 1; + } + + std::vector new_convex; + + if (lindex < uindex) + { + new_convex.insert(new_convex.begin(), _convex.begin(), _convex.begin() + lindex); + new_convex.push_back(_convex[lindex]); + new_convex.insert(new_convex.end(), _convex.begin() + uindex, _convex.end()); + } + else + { + new_convex.insert(new_convex.begin(), _convex.begin() + uindex, _convex.begin() + lindex); + new_convex.push_back(_convex[lindex]); + } + + _convex = new_convex; + } +} + +template +void getHull(Iterator first, Iterator last, Polygon& _results) +{ + unsigned const length = std::distance(first, last); + + if (length == 1) + { + _results.Insert(*first); + } + else + { + Iterator const mid_point = first + length / 2; + + Polygon left_poly; + Polygon right_poly; + + getHull(first, mid_point, left_poly); + getHull(mid_point, last, right_poly); + + merge(left_poly, right_poly, _results); + } +} + +void rez::convexhull2DDivideAndConquer(std::vector& _points, Polygon& _results) +{ + //Sort the points left to right order + std::sort(_points.begin(), _points.end(), [](const Point3d& a, const Point3d& b) { + if ((a[X] < b[X]) + || (a[X] == b[X]) && (a[Y] < b[Y])) + { + return true; + } + return false; + }); + + getHull(_points.begin(), _points.end(), _results); +} + +static void find_hull(std::vector& _points, std::vector& _convex, Point3d& _l, Point3d& _r) +{ + if (!_points.size()) + return; + + if (_points.size() == 1) + { + _convex.push_back(_points[0]); + return; + } + + Point3d maxd_point = _points[0]; + float max_d = 0; + + for (Point3d& pnt : _points) + { + float this_distance = distance(_l, _r, pnt); + if (this_distance > max_d) + { + max_d = this_distance; + maxd_point = pnt; + } + } + + _convex.push_back(maxd_point); + + std::vector s1; + std::vector s2; + + for (Point3d& pnt : _points) + { + if (leftOrBetween(_l, maxd_point, pnt)) + s1.push_back(pnt); + else if (left(maxd_point, _r, pnt)) + s2.push_back(pnt); + } + + find_hull(s1, _convex, _l, _r); + find_hull(s2, _convex, _r, _l); +} + +void rez::convexhull2DQuickhull(std::vector& _points, std::vector& _convex) +{ + if (_points.size() <= 3) + return; + + // Step 1 : Get the two extreme points Left top and right bot + Point3d left_top = _points[0]; + Point3d right_bot = _points[0]; + + for (Point3d& point : _points) + { + if ((point[X] < left_top[X]) + || (point[X] == left_top[X]) && (point[Y] > left_top[X])) + { + left_top = point; + } + + if ((point[X] > right_bot[X]) + || (point[X] == right_bot[X]) && (point[Y] < right_bot[X])) + { + right_bot = point; + } + } + + _convex.push_back(left_top); + _convex.push_back(right_bot); + + std::vector s1; + std::vector s2; + + for (Point3d& point : _points) + { + if (leftOrBetween(left_top, right_bot, point)) + s1.push_back(point); + else if (right(left_top, right_bot, point)) + s2.push_back(point); + } + + find_hull(s1, _convex, left_top, right_bot); + find_hull(s2, _convex, right_bot, left_top); +} + +static bool incident_face(Face* _face, Edge3d* _edge) +{ + auto r1 = std::find(_face->vertices.begin(), _face->vertices.end(), _edge->vertices[0]); + auto r2 = std::find(_face->vertices.begin(), _face->vertices.end(), _edge->vertices[1]); + if (r1 != std::end(_face->vertices) && r1 != std::end(_face->vertices)) + return true; + return false; +} + +static void adjust_normal(Face* _face, Point3d& _ref_point) +{ + // ref point is inside one. If it sees the orientation as counter clockwise, we need to adjust the face normal direction. + // If the this is opposite what we need. + int order = FaceVisibility(*_face, _ref_point); + if (order < 0) { + _face->normal_switch_needed = true; + } +} + +static void construct_initial_polyhedron(std::vector& _points, int i, std::vector& faces, std::vector& edges, + Point3d& ref_point) +{ + // Create the initial tetrahedron + faces.push_back(new Face(_points[i + 0], _points[i + 1], _points[i + 2])); + faces.push_back(new Face(_points[i + 0], _points[i + 1], _points[i + 3])); + faces.push_back(new Face(_points[i + 1], _points[i + 2], _points[i + 3])); + faces.push_back(new Face(_points[i + 2], _points[i + 0], _points[i + 3])); + + for (size_t i = 0; i < faces.size(); i++) + { + adjust_normal(faces[i], ref_point); + } + + edges.push_back(new Edge3d(_points[i + 0], _points[i + 1])); + edges.push_back(new Edge3d(_points[i + 1], _points[i + 2])); + edges.push_back(new Edge3d(_points[i + 2], _points[i + 0])); + edges.push_back(new Edge3d(_points[i + 0], _points[i + 3])); + edges.push_back(new Edge3d(_points[i + 1], _points[i + 3])); + edges.push_back(new Edge3d(_points[i + 2], _points[i + 3])); + + //Set the boundary edges for faces + faces[0]->addEdge(edges[0]); + faces[0]->addEdge(edges[1]); + faces[0]->addEdge(edges[2]); + + faces[1]->addEdge(edges[0]); + faces[1]->addEdge(edges[3]); + faces[1]->addEdge(edges[4]); + + faces[2]->addEdge(edges[1]); + faces[2]->addEdge(edges[4]); + faces[2]->addEdge(edges[5]); + + faces[3]->addEdge(edges[2]); + faces[3]->addEdge(edges[5]); + faces[3]->addEdge(edges[3]); + + // set the incident faces for edges + edges[0]->faces[0] = faces[0]; + edges[0]->faces[1] = faces[1]; + + edges[1]->faces[0] = faces[0]; + edges[1]->faces[1] = faces[2]; + + edges[2]->faces[0] = faces[0]; + edges[2]->faces[1] = faces[3]; + + edges[3]->faces[0] = faces[1]; + edges[3]->faces[1] = faces[3]; + + edges[4]->faces[0] = faces[2]; + edges[4]->faces[1] = faces[1]; + + edges[5]->faces[0] = faces[3]; + edges[5]->faces[1] = faces[2]; +} + +void rez::convexhull3D(std::vector& _points, std::vector& faces) +{ + // Step 1 : Pick 4 points that do not lie in same plane. If we cannot find such points + // - then all the points as in one plane and we can use 2d convexhull algo to find the hull. + // 1. Pick two points.(P1, P2) + // 2. Pick thired point that do not in P1, P2 line. P3 + // 3. Pick fourth point that do not lie in P1, P2, P3 plane. + + std::vector vertices; + for (size_t i = 0; i < _points.size(); i++) + { + vertices.push_back(new Vertex3d(&_points[i])); + } + + std::vector edges; + + size_t i = 0, j = 0; + bool found_noncoplaner = false; + for (i = 0; i < _points.size() - 3; i++) + { + if (!coplaner(_points[i], _points[i + 1], _points[i + 2], _points[i + 3])) + { + found_noncoplaner = true; + break; + } + } + + if (!found_noncoplaner) + { + std::cout << "All the points are coplaner" << std::endl; + return; + } + + // We need to find a point inside the + float x_mean = (_points[i][X] + _points[i + 1][X] + _points[i + 2][X] + _points[i + 3][X]) / 4; + float y_mean = (_points[i][Y] + _points[i + 1][Y] + _points[i + 2][Y] + _points[i + 3][Y]) / 4; + float z_mean = (_points[i][Z] + _points[i + 1][Z] + _points[i + 2][Z] + _points[i + 3][Z]) / 4; + float x_p = x_mean; + float y_p = y_mean; + float z_p = z_mean; + + Point3d point_ref(x_p, y_p, z_p); + construct_initial_polyhedron(vertices, i, faces, edges, point_ref); + + //Points used to construct the p + vertices[i]->processed = true; + vertices[i + 1]->processed = true; + vertices[i + 2]->processed = true; + vertices[i + 3]->processed = true; + + // Step 2 : Add next point Pr to the current convexhull + // 1. Pr can be inside the current hull. Then there's nothing to be done. + // 2. Pr lies outside the convexhull. In this case we need to compute new hull. + + for (size_t i = 0; i < vertices.size(); i++) + { + if (vertices[i]->processed) + continue; + + std::vector visible_faces; + std::vector border_edges; + std::vector tobe_deleted_edges; + + // Point has not yet processed and it is outside the current hull. + for (size_t j = 0; j < faces.size(); j++) + { + float volum = FaceVisibility(*faces[j], *vertices[i]->point); + + //if (order == CCW && volum < 0 || order == CW && volum > 0) + if ((!faces[j]->normal_switch_needed && volum < 0) + || (faces[j]->normal_switch_needed && volum > 0)) + { + faces[j]->visible = true; + visible_faces.push_back(faces[j]); + } + } + + if (!visible_faces.size()) + continue; // Point is inside + + for (size_t k = 0; k < visible_faces.size(); k++) + { + for (size_t j = 0; j < visible_faces[k]->edges.size(); j++) + { + if (visible_faces[k]->edges[j]->faces[0]->visible && + visible_faces[k]->edges[j]->faces[1]->visible) + { + tobe_deleted_edges.push_back(visible_faces[k]->edges[j]); + } + else + { + //Atleast one edge in visible faces is visible + border_edges.push_back(visible_faces[k]->edges[j]); + } + } + } + + std::vector new_faces; + std::vector new_edges; + + const unsigned int new_size = border_edges.size(); + + // We need to find the unique points in border edges. + std::list unque_vertices; + for (size_t j = 0; j < new_size; j++) + { + unque_vertices.push_back(border_edges[j]->vertices[0]); + unque_vertices.push_back(border_edges[j]->vertices[1]); + } + + // Due to below sorting we cannot rely on the created order for adding faces to the edge. So we need to explicitly check + // for incident faces in that case. + unque_vertices.sort(); + unque_vertices.unique([](Vertex3d* a, Vertex3d* b) { return *(a->point) == *(b->point); }); + std::list::iterator it; + + for (size_t j = 0; j < new_size; j++) + { + it = unque_vertices.begin(); + std::advance(it, j); + + // New faces and edges for new convex polyhedron + new_edges.push_back(new Edge3d(*it, vertices[i])); + new_faces.push_back(new Face(border_edges[j]->vertices[0], vertices[i], border_edges[j]->vertices[1])); + + //Add new face referece to borader edges + if (border_edges[j]->faces[0]->visible) + { + border_edges[j]->faces[0] = new_faces[new_faces.size() - 1]; + } + else + { + border_edges[j]->faces[1] = new_faces[new_faces.size() - 1]; + } + } + + //Adjust the faces normals + for (size_t j = 0; j < new_size; j++) + { + adjust_normal(new_faces[j], point_ref); + } + + // Added faces for edges + // Based on our assumptions we must have exactly two faces incident wiht each edge + for (size_t j = 0; j < new_edges.size(); j++) + { + std::vector incident_faces; + + for (size_t k = 0; k < new_faces.size(); k++) + { + if (incident_face(new_faces[k], new_edges[j])) + incident_faces.push_back(new_faces[k]); + } + + new_edges[j]->faces[0] = incident_faces[0]; + new_edges[j]->faces[1] = incident_faces[1]; + } + + // Added edges for faces + for (size_t j = 0; j < new_size; j++) + { + new_faces[j]->addEdge(border_edges[j]); + for (size_t k = 0; k < new_edges.size(); k++) + { + auto r1 = std::find(new_faces[j]->vertices.begin(), + new_faces[j]->vertices.end(), new_edges[k]->vertices[0]); + auto r2 = std::find(new_faces[j]->vertices.begin(), + new_faces[j]->vertices.end(), new_edges[k]->vertices[1]); + + if (incident_face(new_faces[j], new_edges[k])) + new_faces[j]->addEdge(new_edges[k]); + } + } + + // Deleted the edges from to be deleted list + for (size_t k = 0; k < tobe_deleted_edges.size(); k++) + { + for (size_t j = 0; j < edges.size(); j++) + { + if (*tobe_deleted_edges[k] == *edges[j]) + edges.erase(edges.begin() + j); + } + } + + // Delete the visible faces. + for (size_t k = 0; k < visible_faces.size(); k++) + { + for (size_t j = 0; j < faces.size(); j++) + { + if (visible_faces[k] == faces[j]) + faces.erase(faces.begin() + j); + } + } + + faces.insert(faces.end(), new_faces.begin(), new_faces.end()); + edges.insert(edges.end(), new_edges.begin(), new_edges.end()); + } +} + +void rez::convexhull3DQuickhull(std::vector& _points, Polygon& _results) +{ } \ No newline at end of file diff --git a/Convexhull.h b/Convexhull.h index 20dc5f8..a97d5ce 100644 --- a/Convexhull.h +++ b/Convexhull.h @@ -1,57 +1,57 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_CONVEXHULL_H -#define PHYSICSFORMULA_CONVEXHULL_H - -#include -#include - -#include "Point.h" -#include "Polygon.h" -#include "Polyhedron.h" - -namespace rez -{ - // Note : All the 2D algorithms assume the provided points are in single plane. If not the result could be wrong - - // Compute the points in the convex hull. - // Assumptions : (Preprocess the points sets to satisfy following assumptions) - // The points are in XY 2D plane. - // No duplicate points. - void convexhull2DGiftwrapping(std::vector& _points, std::vector& _convex); - - // Compute the points in the convex hull. Assume the points are in XY 2D plane. - // Note : Order of the [_points] will be changed due to internal sort calls - // Assumptions : (Preprocess the points sets to satisfy following assumptions) - // The points are in XY 2D plane. - // No duplicate points. - void convexhull2DModifiedGrahams(std::vector& _points, std::vector& _convex); - - // Compute the points in the convex hull in incremental way. Assume the points are in XY 2D plane. - // Pre order the points from left to right to reduce the time - // Explain why we need pre sorting - void convexhull2DIncremental(std::vector& _points, std::vector& _convex); - - // Compute the points in the convex hull by following divide and conquire methodology. - // Assume the points are in XY 2D plane. - void convexhull2DDivideAndConquer(std::vector& _points, Polygon& _results); - - // Compute the points in the convex hull. - // Assume the points are in XY 2D plane. - // Keep in mind Points in _convex is in the convex hull but not in any perticular order. - // - So need to correct the order before using to construct a polygon - void convexhull2DQuickhull(std::vector& _points, std::vector& _convex); - - // Compute the points in the convex hull in 3D space using incremental methodology. - // Assume there are no duplicate points. - void convexhull3D(std::vector& _points, std::vector& faces); - - // Compute the points in the convex hull. - // TODO : Have not implemented yet - void convexhull3DQuickhull(std::vector& _points, Polygon& _results); - -} - +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_CONVEXHULL_H +#define PHYSICSFORMULA_CONVEXHULL_H + +#include +#include + +#include "Point.h" +#include "Polygon.h" +#include "Polyhedron.h" + +namespace rez +{ + // Note : All the 2D algorithms assume the provided points are in single plane. If not the result could be wrong + + // Compute the points in the convex hull. + // Assumptions : (Preprocess the points sets to satisfy following assumptions) + // The points are in XY 2D plane. + // No duplicate points. + void convexhull2DGiftwrapping(std::vector& _points, std::vector& _convex); + + // Compute the points in the convex hull. Assume the points are in XY 2D plane. + // Note : Order of the [_points] will be changed due to internal sort calls + // Assumptions : (Preprocess the points sets to satisfy following assumptions) + // The points are in XY 2D plane. + // No duplicate points. + void convexhull2DModifiedGrahams(std::vector& _points, std::vector& _convex); + + // Compute the points in the convex hull in incremental way. Assume the points are in XY 2D plane. + // Pre order the points from left to right to reduce the time + // Explain why we need pre sorting + void convexhull2DIncremental(std::vector& _points, std::vector& _convex); + + // Compute the points in the convex hull by following divide and conquire methodology. + // Assume the points are in XY 2D plane. + void convexhull2DDivideAndConquer(std::vector& _points, Polygon& _results); + + // Compute the points in the convex hull. + // Assume the points are in XY 2D plane. + // Keep in mind Points in _convex is in the convex hull but not in any perticular order. + // - So need to correct the order before using to construct a polygon + void convexhull2DQuickhull(std::vector& _points, std::vector& _convex); + + // Compute the points in the convex hull in 3D space using incremental methodology. + // Assume there are no duplicate points. + void convexhull3D(std::vector& _points, std::vector& faces); + + // Compute the points in the convex hull. + // TODO : Have not implemented yet + void convexhull3DQuickhull(std::vector& _points, Polygon& _results); + +} + #endif //PHYSICSFORMULA_CONVEXHULL_H \ No newline at end of file diff --git a/Core.h b/Core.h index 0d33a9f..48e273a 100644 --- a/Core.h +++ b/Core.h @@ -1,59 +1,59 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_CORE_H -#define PHYSICSFORMULA_CORE_H -#define _USE_MATH_DEFINES - -#include - -namespace rez { -#define TOLERANCE 0.0000000001 -#define TOLERANCEL 0.00001 -#define TOLERANCELL 0.01 -#define ZERO 0.0 - -#define CW 1 -#define CCW 2 - - typedef unsigned int uint; - typedef const unsigned int cuint; - - - enum RELATIVE_POSITION { - LEFT, RIGHT, BEYOND, BEHIND, BETWEEN, ORIGIN, DESTINATION - }; - - - enum INTERSECTION_OPS { - CROSSES, - POSITIVE, - NEGATIVE, - COINCIDENT - }; - - static bool isEqualD(double x, double y) - { - return fabs(x - y) < TOLERANCE; - } - - static bool isEqualDL(double x, double y) - { - return fabs(x - y) < TOLERANCEL; - } - - static bool isEqualDLL(double x, double y) - { - return fabs(x - y) < TOLERANCELL; - } - - static bool _xor(bool x, bool y) { - return x ^ y; - } - - static float RadianceToDegrees(float radiance) { - return radiance * 360 / (2 * M_PI); - } -} -#endif //PHYSICSFORMULA_CORE_H +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_CORE_H +#define PHYSICSFORMULA_CORE_H +#define _USE_MATH_DEFINES + +#include + +namespace rez { +#define TOLERANCE 0.0000000001 +#define TOLERANCEL 0.00001 +#define TOLERANCELL 0.01 +#define ZERO 0.0 + +#define CW 1 +#define CCW 2 + + typedef unsigned int uint; + typedef const unsigned int cuint; + + + enum RELATIVE_POSITION { + LEFT, RIGHT, BEYOND, BEHIND, BETWEEN, ORIGIN, DESTINATION + }; + + + enum INTERSECTION_OPS { + CROSSES, + POSITIVE, + NEGATIVE, + COINCIDENT + }; + + static bool isEqualD(double x, double y) + { + return fabs(x - y) < TOLERANCE; + } + + static bool isEqualDL(double x, double y) + { + return fabs(x - y) < TOLERANCEL; + } + + static bool isEqualDLL(double x, double y) + { + return fabs(x - y) < TOLERANCELL; + } + + static bool _xor(bool x, bool y) { + return x ^ y; + } + + static float RadianceToDegrees(float radiance) { + return radiance * 360 / (2 * M_PI); + } +} +#endif //PHYSICSFORMULA_CORE_H diff --git a/Cube.h b/Cube.h index b483d8c..bb33056 100644 --- a/Cube.h +++ b/Cube.h @@ -1,160 +1,160 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_CUBE_H -#define PHYSICSFORMULA_CUBE_H -/** - * @class Cube - * @details Cube class that represents a cube object - * @author Ryan Zurrin - * @dateBuilt 11/4/2021 - * @lastEdit 11/4/2021 - */ -#include -#include - -static int cubeObjectCount = 0; -typedef long double ld; - -class Cube -{ - ld side; - ld surfaceArea; - ld volume; - static auto countIncrease() { cubeObjectCount += 1; } - static auto countDecrease() { cubeObjectCount -= 1; } - ld calculateSide()const; - ld calculateSurfaceArea()const; - ld calculateVolume()const; -public: - - Cube() - { - side = 0.0; - surfaceArea = 0.0; - volume = 0.0; - countIncrease(); - } - - Cube(ld side) - { - this->side = side; - this->surfaceArea = calculateSurfaceArea(); - this->volume = calculateVolume(); - countIncrease(); - } - - /** - * @brief copy constructor - */ - Cube(const Cube& s) - { - side = s.side; - surfaceArea = s.surfaceArea; - volume = s.volume; - countIncrease(); - } - /** - * #brief move constructor - */ - Cube(Cube&& s) noexcept - { - side = s.side; - surfaceArea = s.surfaceArea; - volume = s.volume; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Cube& operator=(Cube&& s) noexcept - { - if (this != &s) - { - side = s.side; - surfaceArea = s.surfaceArea; - volume = s.volume; - countIncrease(); - } - return *this; - } - - Cube& operator=(Cube other) - { - std::swap(side, other.side); - std::swap(surfaceArea, other.surfaceArea); - std::swap(volume, other.volume); - return *this; - } - - static void show_objectCount() { - std::cout << "\n cube object count: " - << cubeObjectCount << std::endl; - } - static int get_objectCount() { return cubeObjectCount; } - - - ~Cube() = default; - - auto setSide(ld s); - auto setSurfaceArea(ld sa); - auto setVolume(ld v); - - [[nodiscard]] auto getSide() const { return side; } - [[nodiscard]] auto getSurfaceArea() const { return surfaceArea; } - [[nodiscard]] auto getVolume() const { return volume; } - [[nodiscard]] auto getWeight(ld densityKgM) const; - - void printCubeInfo()const; - -}; - -#endif //PHYSICSFORMULA_CUBE_H -inline ld Cube::calculateSide() const -{ - return std::cbrt(volume); -} -inline ld Cube::calculateSurfaceArea() const -{ - return 6.0 * (side * side); -} - -inline ld Cube::calculateVolume() const -{ - return (side*side*side); -} - -inline auto Cube::setSide(ld s) -{ - side = s; - volume = calculateVolume(); - surfaceArea = calculateSurfaceArea(); -} - -inline auto Cube::setSurfaceArea(ld sa) -{ - surfaceArea = sa; - side = sqrt(surfaceArea / 6); - volume = calculateVolume(); -} - -inline auto Cube::setVolume(ld v) -{ - volume = v; - side = calculateSide(); - surfaceArea = calculateSurfaceArea(); -} - -inline auto Cube::getWeight(ld densityKgM) const -{ - return densityKgM * volume; -} - -inline void Cube::printCubeInfo() const -{ - std::cout << "side: " << side << std::endl; - std::cout << "surface area: " << surfaceArea << std::endl; - std::cout << "volume: " << volume << std::endl; -} - +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_CUBE_H +#define PHYSICSFORMULA_CUBE_H +/** + * @class Cube + * @details Cube class that represents a cube object + * @author Ryan Zurrin + * @dateBuilt 11/4/2021 + * @lastEdit 11/4/2021 + */ +#include +#include + +static int cubeObjectCount = 0; +typedef long double ld; + +class Cube +{ + ld side; + ld surfaceArea; + ld volume; + static auto countIncrease() { cubeObjectCount += 1; } + static auto countDecrease() { cubeObjectCount -= 1; } + ld calculateSide()const; + ld calculateSurfaceArea()const; + ld calculateVolume()const; +public: + + Cube() + { + side = 0.0; + surfaceArea = 0.0; + volume = 0.0; + countIncrease(); + } + + Cube(ld side) + { + this->side = side; + this->surfaceArea = calculateSurfaceArea(); + this->volume = calculateVolume(); + countIncrease(); + } + + /** + * @brief copy constructor + */ + Cube(const Cube& s) + { + side = s.side; + surfaceArea = s.surfaceArea; + volume = s.volume; + countIncrease(); + } + /** + * #brief move constructor + */ + Cube(Cube&& s) noexcept + { + side = s.side; + surfaceArea = s.surfaceArea; + volume = s.volume; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Cube& operator=(Cube&& s) noexcept + { + if (this != &s) + { + side = s.side; + surfaceArea = s.surfaceArea; + volume = s.volume; + countIncrease(); + } + return *this; + } + + Cube& operator=(Cube other) + { + std::swap(side, other.side); + std::swap(surfaceArea, other.surfaceArea); + std::swap(volume, other.volume); + return *this; + } + + static void show_objectCount() { + std::cout << "\n cube object count: " + << cubeObjectCount << std::endl; + } + static int get_objectCount() { return cubeObjectCount; } + + + ~Cube() = default; + + auto setSide(ld s); + auto setSurfaceArea(ld sa); + auto setVolume(ld v); + + [[nodiscard]] auto getSide() const { return side; } + [[nodiscard]] auto getSurfaceArea() const { return surfaceArea; } + [[nodiscard]] auto getVolume() const { return volume; } + [[nodiscard]] auto getWeight(ld densityKgM) const; + + void printCubeInfo()const; + +}; + +#endif //PHYSICSFORMULA_CUBE_H +inline ld Cube::calculateSide() const +{ + return std::cbrt(volume); +} +inline ld Cube::calculateSurfaceArea() const +{ + return 6.0 * (side * side); +} + +inline ld Cube::calculateVolume() const +{ + return (side*side*side); +} + +inline auto Cube::setSide(ld s) +{ + side = s; + volume = calculateVolume(); + surfaceArea = calculateSurfaceArea(); +} + +inline auto Cube::setSurfaceArea(ld sa) +{ + surfaceArea = sa; + side = sqrt(surfaceArea / 6); + volume = calculateVolume(); +} + +inline auto Cube::setVolume(ld v) +{ + volume = v; + side = calculateSide(); + surfaceArea = calculateSurfaceArea(); +} + +inline auto Cube::getWeight(ld densityKgM) const +{ + return densityKgM * volume; +} + +inline void Cube::printCubeInfo() const +{ + std::cout << "side: " << side << std::endl; + std::cout << "surface area: " << surfaceArea << std::endl; + std::cout << "volume: " << volume << std::endl; +} + diff --git a/Cylinder.h b/Cylinder.h index 134ba9b..8399962 100644 --- a/Cylinder.h +++ b/Cylinder.h @@ -1,154 +1,154 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_CYLINDER_H -#define PHYSICSFORMULA_CYLINDER_H -/** - * @class Cylinder - * @details class to represent a Cylinder object - * @author Ryan Zurrin - * @dateBuilt 11/4/2021 - * @lastEdit 11/4/2021 - */ -#include -#define PI_ 3.14159265358979323846 - -static int cylinderObjectCount = 0; -typedef long double ld; - -class Cylinder -{ - ld height; - ld radius; - ld volume; - ld surfaceArea; - static auto countIncrease() { cylinderObjectCount += 1; } - static auto countDecrease() { cylinderObjectCount -= 1; } - ld calculateVolume()const; - ld calculateSurfaceArea()const; -public: - - Cylinder() - { - height = 0.0; - radius = 0.0; - volume = 0.0; - surfaceArea = 0.0; - countIncrease(); - } - - Cylinder(ld height, ld radius) - { - this->height = height; - this->radius = radius; - this->volume = calculateVolume(); - this->surfaceArea = calculateSurfaceArea(); - countIncrease(); - } - - /** - * @brief copy constructor - */ - Cylinder(const Cylinder& s) - { - height = s.height; - radius = s.radius; - volume = s.volume; - surfaceArea = s.surfaceArea; - countIncrease(); - } - /** - * #brief move constructor - */ - Cylinder(Cylinder&& s) noexcept - { - height = s.height; - radius = s.radius; - volume = s.volume; - surfaceArea = s.surfaceArea; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Cylinder& operator=(Cylinder&& s) noexcept - { - if (this != &s) - { - height = s.height; - radius = s.radius; - volume = s.volume; - surfaceArea = s.surfaceArea; - countIncrease(); - } - return *this; - } - - Cylinder& operator=(Cylinder other) - { - std::swap(height, other.height); - std::swap(radius, other.radius); - std::swap(volume, other.volume); - std::swap(surfaceArea, other.surfaceArea); - return *this; - } - - static void show_objectCount() { - std::cout << "\n cylinder object count: " - << cylinderObjectCount << std::endl; - } - static int get_objectCount() { return cylinderObjectCount; } - - - ~Cylinder() = default; - - auto setHeight(ld h); - auto setRadius(ld r); - - [[nodiscard]] auto getHeight() const { return height; } - [[nodiscard]] auto getRadius() const { return radius; } - [[nodiscard]] auto getVolume() const { return volume; } - [[nodiscard]] auto getSurfaceArea() const { return surfaceArea; } - [[nodiscard]] auto getWeight(ld densityKgM) const; - - void printCylinderInfo()const; -}; - -#endif //PHYSICSFORMULA_CYLINDER_H -inline ld Cylinder::calculateVolume() const -{ - return PI_ * (radius*radius) * height; -} - -inline ld Cylinder::calculateSurfaceArea() const -{ - return 2.0 * PI_ * (radius * radius) + 2.0 * PI_ * radius * height; -} - -inline auto Cylinder::setHeight(ld h) -{ - height = h; - volume = calculateVolume(); - surfaceArea = calculateSurfaceArea(); -} - -inline auto Cylinder::setRadius(ld r) -{ - radius = r; - volume = calculateVolume(); - surfaceArea = calculateSurfaceArea(); -} - -inline auto Cylinder::getWeight(ld densityKgM) const -{ - return densityKgM * volume; -} - -inline void Cylinder::printCylinderInfo() const -{ - std::cout << "height: " << height << std::endl; - std::cout << "radius: " << radius << std::endl; - std::cout << "volume: " << volume << std::endl; - std::cout << "surface area: " << surfaceArea << std::endl; +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_CYLINDER_H +#define PHYSICSFORMULA_CYLINDER_H +/** + * @class Cylinder + * @details class to represent a Cylinder object + * @author Ryan Zurrin + * @dateBuilt 11/4/2021 + * @lastEdit 11/4/2021 + */ +#include +#define PI_ 3.14159265358979323846 + +static int cylinderObjectCount = 0; +typedef long double ld; + +class Cylinder +{ + ld height; + ld radius; + ld volume; + ld surfaceArea; + static auto countIncrease() { cylinderObjectCount += 1; } + static auto countDecrease() { cylinderObjectCount -= 1; } + ld calculateVolume()const; + ld calculateSurfaceArea()const; +public: + + Cylinder() + { + height = 0.0; + radius = 0.0; + volume = 0.0; + surfaceArea = 0.0; + countIncrease(); + } + + Cylinder(ld height, ld radius) + { + this->height = height; + this->radius = radius; + this->volume = calculateVolume(); + this->surfaceArea = calculateSurfaceArea(); + countIncrease(); + } + + /** + * @brief copy constructor + */ + Cylinder(const Cylinder& s) + { + height = s.height; + radius = s.radius; + volume = s.volume; + surfaceArea = s.surfaceArea; + countIncrease(); + } + /** + * #brief move constructor + */ + Cylinder(Cylinder&& s) noexcept + { + height = s.height; + radius = s.radius; + volume = s.volume; + surfaceArea = s.surfaceArea; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Cylinder& operator=(Cylinder&& s) noexcept + { + if (this != &s) + { + height = s.height; + radius = s.radius; + volume = s.volume; + surfaceArea = s.surfaceArea; + countIncrease(); + } + return *this; + } + + Cylinder& operator=(Cylinder other) + { + std::swap(height, other.height); + std::swap(radius, other.radius); + std::swap(volume, other.volume); + std::swap(surfaceArea, other.surfaceArea); + return *this; + } + + static void show_objectCount() { + std::cout << "\n cylinder object count: " + << cylinderObjectCount << std::endl; + } + static int get_objectCount() { return cylinderObjectCount; } + + + ~Cylinder() = default; + + auto setHeight(ld h); + auto setRadius(ld r); + + [[nodiscard]] auto getHeight() const { return height; } + [[nodiscard]] auto getRadius() const { return radius; } + [[nodiscard]] auto getVolume() const { return volume; } + [[nodiscard]] auto getSurfaceArea() const { return surfaceArea; } + [[nodiscard]] auto getWeight(ld densityKgM) const; + + void printCylinderInfo()const; +}; + +#endif //PHYSICSFORMULA_CYLINDER_H +inline ld Cylinder::calculateVolume() const +{ + return PI_ * (radius*radius) * height; +} + +inline ld Cylinder::calculateSurfaceArea() const +{ + return 2.0 * PI_ * (radius * radius) + 2.0 * PI_ * radius * height; +} + +inline auto Cylinder::setHeight(ld h) +{ + height = h; + volume = calculateVolume(); + surfaceArea = calculateSurfaceArea(); +} + +inline auto Cylinder::setRadius(ld r) +{ + radius = r; + volume = calculateVolume(); + surfaceArea = calculateSurfaceArea(); +} + +inline auto Cylinder::getWeight(ld densityKgM) const +{ + return densityKgM * volume; +} + +inline void Cylinder::printCylinderInfo() const +{ + std::cout << "height: " << height << std::endl; + std::cout << "radius: " << radius << std::endl; + std::cout << "volume: " << volume << std::endl; + std::cout << "surface area: " << surfaceArea << std::endl; } \ No newline at end of file diff --git a/Derivation.h b/Derivation.h index 1756b39..cd5cfbb 100644 --- a/Derivation.h +++ b/Derivation.h @@ -1,14 +1,14 @@ -// -// Created by Ryan.Zurrin001 on 1/28/2022. -// - -#ifndef PHYSICSFORMULA_DERIVATION_H -#define PHYSICSFORMULA_DERIVATION_H -#include -using namespace std; - - - - - -#endif //PHYSICSFORMULA_DERIVATION_H +// +// Created by Ryan.Zurrin001 on 1/28/2022. +// + +#ifndef PHYSICSFORMULA_DERIVATION_H +#define PHYSICSFORMULA_DERIVATION_H +#include +using namespace std; + + + + + +#endif //PHYSICSFORMULA_DERIVATION_H diff --git a/Distance.cpp b/Distance.cpp index 30f542f..9eb7b24 100644 --- a/Distance.cpp +++ b/Distance.cpp @@ -1,60 +1,60 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// -#include "Distance.h" - -float rez::distance(Point3d& A, Point3d& B, Point3d& C) -{ - Vector3f AB = B - A; //direction vector of line - Vector3f CA = A - C; - Vector3f cross = crossProduct3d(CA, AB); - - float mag_cross = cross.magnitude(); - float mag_dir = AB.magnitude(); - - float distance = mag_cross / mag_dir; - return distance; -} - -float rez::distance(Line& line, Point3d& C) -{ - // TODO we can simple call distance frunction which takes three points here as well. - // But then the methodology of finding the distance is not visible to students. So keep this. - // Ignor the fact that we duplicate the similar implementation, which is not the best practise. - Vector3f AC = C - line.point(); - auto t = dotProduct(line.direction(), AC); - - auto xt = line.point() + line.direction() * t; - auto dist_vec = xt - C; - - return dist_vec.magnitude(); -} - -float rez::distance(Line2d& line, Point2d& C) -{ - return 0.0; -} - -float rez::distance(Point3d& p1, Point3d& p2) -{ - float dx = p1[X] - p2[X]; - float dy = p1[Y] - p2[Y]; - float dz = p1[Z] - p2[Z]; - - float distance = sqrt(pow(dx, 2) + pow(dy, 2) + pow(dz, 2)); - return distance; -} - -float rez::distance(Point2d& p1, Point2d& p2) -{ - float dx = p1[X] - p2[X]; - float dy = p1[Y] - p2[Y]; - float distance = sqrt(pow(dx, 2) + pow(dy, 2)); - return distance; -} - -float rez::distance(Planef& p, Point3d& Q) -{ - auto result = dotProduct(p.getNormal(), Q) - p.getD(); - return result; -} +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// +#include "Distance.h" + +float rez::distance(Point3d& A, Point3d& B, Point3d& C) +{ + Vector3f AB = B - A; //direction vector of line + Vector3f CA = A - C; + Vector3f cross = crossProduct3d(CA, AB); + + float mag_cross = cross.magnitude(); + float mag_dir = AB.magnitude(); + + float distance = mag_cross / mag_dir; + return distance; +} + +float rez::distance(Line& line, Point3d& C) +{ + // TODO we can simple call distance frunction which takes three points here as well. + // But then the methodology of finding the distance is not visible to students. So keep this. + // Ignor the fact that we duplicate the similar implementation, which is not the best practise. + Vector3f AC = C - line.point(); + auto t = dotProduct(line.direction(), AC); + + auto xt = line.point() + line.direction() * t; + auto dist_vec = xt - C; + + return dist_vec.magnitude(); +} + +float rez::distance(Line2d& line, Point2d& C) +{ + return 0.0; +} + +float rez::distance(Point3d& p1, Point3d& p2) +{ + float dx = p1[X] - p2[X]; + float dy = p1[Y] - p2[Y]; + float dz = p1[Z] - p2[Z]; + + float distance = sqrt(pow(dx, 2) + pow(dy, 2) + pow(dz, 2)); + return distance; +} + +float rez::distance(Point2d& p1, Point2d& p2) +{ + float dx = p1[X] - p2[X]; + float dy = p1[Y] - p2[Y]; + float distance = sqrt(pow(dx, 2) + pow(dy, 2)); + return distance; +} + +float rez::distance(Planef& p, Point3d& Q) +{ + auto result = dotProduct(p.getNormal(), Q) - p.getD(); + return result; +} diff --git a/Distance.h b/Distance.h index 659090c..c40f83b 100644 --- a/Distance.h +++ b/Distance.h @@ -1,34 +1,34 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_DISTANCE_H -#define PHYSICSFORMULA_DISTANCE_H -#pragma once -// Include functions to calculate distance between different geometric promitives -#include "Point.h" -#include "Line.h" -#include "Plane.h" - -namespace rez { - - /// - /// Returns the distance to the point C from line [AB]. Return value > 0 - /// Not the sign distance. - /// One end point of the segment - /// Other end point of the segment - /// Point we need to find the distance from the segment - /// void - float distance(Point3d& A, Point3d& B, Point3d& C); - - float distance(Line& line, Point3d& C); - - float distance(Line2d& line, Point2d& C); - - float distance(Point3d& p1, Point3d& p2); - - float distance(Point2d& p1, Point2d& p2); - - float distance(Planef& p, Point3d& Q); -} -#endif //PHYSICSFORMULA_DISTANCE_H +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_DISTANCE_H +#define PHYSICSFORMULA_DISTANCE_H +#pragma once +// Include functions to calculate distance between different geometric promitives +#include "Point.h" +#include "Line.h" +#include "Plane.h" + +namespace rez { + + /// + /// Returns the distance to the point C from line [AB]. Return value > 0 + /// Not the sign distance. + /// One end point of the segment + /// Other end point of the segment + /// Point we need to find the distance from the segment + /// void + float distance(Point3d& A, Point3d& B, Point3d& C); + + float distance(Line& line, Point3d& C); + + float distance(Line2d& line, Point2d& C); + + float distance(Point3d& p1, Point3d& p2); + + float distance(Point2d& p1, Point2d& p2); + + float distance(Planef& p, Point3d& Q); +} +#endif //PHYSICSFORMULA_DISTANCE_H diff --git a/Drag.h b/Drag.h index df84a97..6d09a49 100644 --- a/Drag.h +++ b/Drag.h @@ -1,252 +1,252 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_DRAG_H -#define PHYSICSFORMULA_DRAG_H -// Drag class for extending the physics class -// author: Ryan Zurrin -// last Modified: 10/10/2020 -#include -#include -#include "Friction.h" -#include "Vector2D.h" - -//drag objects static counter -static int drag_objectCount = 0; - -static constexpr struct DragCoefficients -{ - const long double toyotaCamry = .28; // returns .28 - const long double fordFocus = .32; // returns .32 - const long double hodnaCivic = .36; // returns .36 - const long double ferrariTestarossa = .37; // returns .37 - const long double dodgeRamPickup = .43; // returns .43 - const long double sphere = .45; // returns.45 - const long double hummerH2SUV = .64; // returns .64 - const long double skyDiver_feetFirst = .70; // returns .70 - const long double bicycle = .90; // returns .90 - const long double skyDiver_horizontal = 1.0; // returns 1.0 - const long double circularFlatPlate = 1.12; // returns 1.12 - const long double dolphin = .0036; // returns .0036 - const long double bird = .4; // returns .4 - const long double frisbee = .080; // returns .080 - const long double rectangularBox = 2.1; //returns 2.1 - const long double longFlatPlate90deg = 1.98; // returns 1.98 - const long double motorcycleAndRider = 1.8; // returns 1.8 - const long double personUpright = 1.15; // returns 1.15 - const long double convertibleOpenTop = .65; // returns .65 - const long double supersonicFighter = .016; // returns .016 - const long double solarPanelArray6x4 = 4.1; // returns 4.1 - - -}drag_coefficients; - -class Drag: - public Friction -{ - -private: - static void countIncrease() { drag_objectCount += 1; } - static void countDecrease() { drag_objectCount -= 1; } - long double _dragForce_; - long double _dragCoefficient_; - long double _dragVal; - -public: - static void countShow() { std::cout << "drag count: " << drag_objectCount << std::endl; } - Drag* _ptrDrag; - - /** - * @brief displays the data stored in the dragForce variable - */ - void show_dragForce()const { std::cout << "drag force: " << _dragForce_ << std::endl; } - /** - * @brief displays the data stored in the dragCoefficient variable - */ - void show_dragCoefficient()const { std::cout << "drag coefficient: " << _dragCoefficient_ << std::endl; } - - /** - * @brief sets the dragForce variable; - */ - void set_dragForce(const long double dF) { _dragForce_ = dF; } - /** - * @brief sets the dragCoefficient variable; - */ - void set_dragCoefficient(const long double C) { _dragCoefficient_ = C; } - - void setDragVal(long double val) { _dragVal = val; } - - - //suppresses the default constructor - Drag() - { - _ptrDrag = nullptr; - _dragForce_ = 0.0; - _dragCoefficient_ = 0.0; - _dragVal = 0.0; - countIncrease(); - //countShow(); - } - Drag(string obj) - { - - _ptrDrag = nullptr; - _dragForce_ = 0.0; - _dragVal = 0.0; - _dragCoefficient_ = setCoefficient(obj); - countIncrease(); - } - - Drag(long double dC) - { - _ptrDrag = nullptr; - _dragForce_ = 0.0; - _dragCoefficient_ = dC; - _dragVal = 0.0; - countIncrease(); - } - - //copy constructor - Drag(const Drag& r) - { - _ptrDrag = r._ptrDrag; - _dragForce_ = r._dragForce_; - _dragCoefficient_ = r._dragCoefficient_; - _dragVal = r._dragVal; - countIncrease(); - //countShow(); - } - - //copy assignment operator - Drag& operator=(const Drag& r) - { - if (this != &r) - { - _dragForce_ = r._dragForce_; - _ptrDrag = r._ptrDrag; - _dragCoefficient_ = r._dragCoefficient_; - _dragVal = r._dragVal; - countIncrease(); - //countShow(); - } - return *this; - } -private: - static long double setCoefficient(string &test) - { - long double val = 0; - transform(test.begin(), test.end(), test.begin(), ::tolower); - if (test == "airfoil") { return val = .05; } - if (test == "toyotacamry" || test == "toyota camry") { return val = .28; } - if (test == "fordfocus" || test == "Ford focus") { return val = .32; } - if (test == "hodnacivic") { return val = .36; } - if (test == "ferrariTestarossa") { return val = .37; } - if (test == "dodgeRamPickup") { return val = .43; } - if (test == "sphere") { return val = .45; } - if (test == "hummerH2SUV") { return val = .64; } - if (test == "skyDiverFeetFirst" || test == "skyDiverff") { return val = .70; } - if (test == "skyDiver_horizontal") { return val = 1.0; } - if (test == "bicycle") { return val = .90; } - if (test == "dolphin") { return val = .0036; } - if (test == "bird") { return val = .4; } - if (test == "frisbee") { return val = .080; } - if (test == "rectangularBox") { return val = 2.1; } - if (test == "longFlatPlate90deg") { return val = 1.98; } - if (test == "motorcycleAndRider") { return val = 1.8; } - if (test == "personUpright") { return val = 1.15; } - if (test == "convertibleOpenTop") { return val = .65; } - if (test == "supersonicFighter") { return val = .016; } - if (test == "solarPanels") { return val = 4.1; } - else - val = stod(test); - - return val; - } - -public: - /** - * @brief Returns the value in the dragForce variable - * @returns dragForce - */ - long double return_dragForce()const { return _dragForce_; } - - /** - * @brief Returns the value in the dragCoefficient variable - * @returns drag coefficient - */ - long double return_dragCoefficient()const { return _dragCoefficient_; } - - /** - * @brief Returns the terminal velocity from drag force equation. - * fx = sqrt((2 * (mass * acceleration))/(density * dragCoeff * areaFace)) - * @param mass of the object - * @param dragCoeff is the drag coefficient - * @param areaFace is the area the drag is working against - * @param density of the material falling - * @param acceleration is default to gravity 9.8 - * @returns the terminal velocity. - */ - static long double terminal_velocity(const long double mass, - const long double dragCoeff, - const long double areaFace, - const long double density, - const long double acceleration = 9.8) - { - return sqrt((2 * (mass * acceleration))/(density * dragCoeff * areaFace)); - } - - /** - * @brief Returns the drag force experienced by an object. - * fx =.5 * (dragCoeff * density * areaFace * pow(velocity, 2)) - * @param dragCoeff can be found with tables or by computation - * @param areaFace is total area being effected by drag and resistance - * @param density of the moving object - * @param velocity is the speed with a direction - * @returns: drag force - */ - static long double drag_force(const long double dragCoeff, const long double areaFace, const long double density, const long double velocity) - { return .5 * (dragCoeff * density * areaFace * pow(velocity, 2)); } - - /** - * @brief Returns the frictional force – also called drag force – exerted on spherical objects with very - * small Reynolds numbers in a viscous fluid. fx = 6 * PI * radius * viscosity * velocity - * @param radius of object - * @param viscosity of fluid - * @param velocity of object in fluid - * @returns force of sphere moving through a viscous matter - */ - static long double stokes_law(const long double radius, const long double viscosity, const long double velocity) - { return 6.0 * _PI_ * radius * viscosity * velocity; } - - /** - * @brief Returns the viscosity of a fluid by using the time it takes an objects with - * know density and diameter. - * fx = (2 * density * time * (radius * radius) * _G_) / (9 * distance) - * @param density of object being measured - * @param diameter of the object - * @param distance the object is falling through the fluid - * @param time it takes in seconds for the objects to reach bottom - * @returns the viscosity of a fluid - */ - static long double viscosity(const long double density, const long double diameter, const long double distance, const long double time) - { - const long double radius = diameter / 2; - return (2 * density * time * (radius * radius) * _Ga_) / (9 * distance); - } - - - /** - * destructor - */ - ~Drag() - { - delete _ptrDrag; - countDecrease(); - //countShow(); - } - -}; -#endif //PHYSICSFORMULA_DRAG_H - - +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_DRAG_H +#define PHYSICSFORMULA_DRAG_H +// Drag class for extending the physics class +// author: Ryan Zurrin +// last Modified: 10/10/2020 +#include +#include +#include "Friction.h" +#include "Vector2D.h" + +//drag objects static counter +static int drag_objectCount = 0; + +static constexpr struct DragCoefficients +{ + const long double toyotaCamry = .28; // returns .28 + const long double fordFocus = .32; // returns .32 + const long double hodnaCivic = .36; // returns .36 + const long double ferrariTestarossa = .37; // returns .37 + const long double dodgeRamPickup = .43; // returns .43 + const long double sphere = .45; // returns.45 + const long double hummerH2SUV = .64; // returns .64 + const long double skyDiver_feetFirst = .70; // returns .70 + const long double bicycle = .90; // returns .90 + const long double skyDiver_horizontal = 1.0; // returns 1.0 + const long double circularFlatPlate = 1.12; // returns 1.12 + const long double dolphin = .0036; // returns .0036 + const long double bird = .4; // returns .4 + const long double frisbee = .080; // returns .080 + const long double rectangularBox = 2.1; //returns 2.1 + const long double longFlatPlate90deg = 1.98; // returns 1.98 + const long double motorcycleAndRider = 1.8; // returns 1.8 + const long double personUpright = 1.15; // returns 1.15 + const long double convertibleOpenTop = .65; // returns .65 + const long double supersonicFighter = .016; // returns .016 + const long double solarPanelArray6x4 = 4.1; // returns 4.1 + + +}drag_coefficients; + +class Drag: + public Friction +{ + +private: + static void countIncrease() { drag_objectCount += 1; } + static void countDecrease() { drag_objectCount -= 1; } + long double _dragForce_; + long double _dragCoefficient_; + long double _dragVal; + +public: + static void countShow() { std::cout << "drag count: " << drag_objectCount << std::endl; } + Drag* _ptrDrag; + + /** + * @brief displays the data stored in the dragForce variable + */ + void show_dragForce()const { std::cout << "drag force: " << _dragForce_ << std::endl; } + /** + * @brief displays the data stored in the dragCoefficient variable + */ + void show_dragCoefficient()const { std::cout << "drag coefficient: " << _dragCoefficient_ << std::endl; } + + /** + * @brief sets the dragForce variable; + */ + void set_dragForce(const long double dF) { _dragForce_ = dF; } + /** + * @brief sets the dragCoefficient variable; + */ + void set_dragCoefficient(const long double C) { _dragCoefficient_ = C; } + + void setDragVal(long double val) { _dragVal = val; } + + + //suppresses the default constructor + Drag() + { + _ptrDrag = nullptr; + _dragForce_ = 0.0; + _dragCoefficient_ = 0.0; + _dragVal = 0.0; + countIncrease(); + //countShow(); + } + Drag(string obj) + { + + _ptrDrag = nullptr; + _dragForce_ = 0.0; + _dragVal = 0.0; + _dragCoefficient_ = setCoefficient(obj); + countIncrease(); + } + + Drag(long double dC) + { + _ptrDrag = nullptr; + _dragForce_ = 0.0; + _dragCoefficient_ = dC; + _dragVal = 0.0; + countIncrease(); + } + + //copy constructor + Drag(const Drag& r) + { + _ptrDrag = r._ptrDrag; + _dragForce_ = r._dragForce_; + _dragCoefficient_ = r._dragCoefficient_; + _dragVal = r._dragVal; + countIncrease(); + //countShow(); + } + + //copy assignment operator + Drag& operator=(const Drag& r) + { + if (this != &r) + { + _dragForce_ = r._dragForce_; + _ptrDrag = r._ptrDrag; + _dragCoefficient_ = r._dragCoefficient_; + _dragVal = r._dragVal; + countIncrease(); + //countShow(); + } + return *this; + } +private: + static long double setCoefficient(string &test) + { + long double val = 0; + transform(test.begin(), test.end(), test.begin(), ::tolower); + if (test == "airfoil") { return val = .05; } + if (test == "toyotacamry" || test == "toyota camry") { return val = .28; } + if (test == "fordfocus" || test == "Ford focus") { return val = .32; } + if (test == "hodnacivic") { return val = .36; } + if (test == "ferrariTestarossa") { return val = .37; } + if (test == "dodgeRamPickup") { return val = .43; } + if (test == "sphere") { return val = .45; } + if (test == "hummerH2SUV") { return val = .64; } + if (test == "skyDiverFeetFirst" || test == "skyDiverff") { return val = .70; } + if (test == "skyDiver_horizontal") { return val = 1.0; } + if (test == "bicycle") { return val = .90; } + if (test == "dolphin") { return val = .0036; } + if (test == "bird") { return val = .4; } + if (test == "frisbee") { return val = .080; } + if (test == "rectangularBox") { return val = 2.1; } + if (test == "longFlatPlate90deg") { return val = 1.98; } + if (test == "motorcycleAndRider") { return val = 1.8; } + if (test == "personUpright") { return val = 1.15; } + if (test == "convertibleOpenTop") { return val = .65; } + if (test == "supersonicFighter") { return val = .016; } + if (test == "solarPanels") { return val = 4.1; } + else + val = stod(test); + + return val; + } + +public: + /** + * @brief Returns the value in the dragForce variable + * @returns dragForce + */ + long double return_dragForce()const { return _dragForce_; } + + /** + * @brief Returns the value in the dragCoefficient variable + * @returns drag coefficient + */ + long double return_dragCoefficient()const { return _dragCoefficient_; } + + /** + * @brief Returns the terminal velocity from drag force equation. + * fx = sqrt((2 * (mass * acceleration))/(density * dragCoeff * areaFace)) + * @param mass of the object + * @param dragCoeff is the drag coefficient + * @param areaFace is the area the drag is working against + * @param density of the material falling + * @param acceleration is default to gravity 9.8 + * @returns the terminal velocity. + */ + static long double terminal_velocity(const long double mass, + const long double dragCoeff, + const long double areaFace, + const long double density, + const long double acceleration = 9.8) + { + return sqrt((2 * (mass * acceleration))/(density * dragCoeff * areaFace)); + } + + /** + * @brief Returns the drag force experienced by an object. + * fx =.5 * (dragCoeff * density * areaFace * pow(velocity, 2)) + * @param dragCoeff can be found with tables or by computation + * @param areaFace is total area being effected by drag and resistance + * @param density of the moving object + * @param velocity is the speed with a direction + * @returns: drag force + */ + static long double drag_force(const long double dragCoeff, const long double areaFace, const long double density, const long double velocity) + { return .5 * (dragCoeff * density * areaFace * pow(velocity, 2)); } + + /** + * @brief Returns the frictional force – also called drag force – exerted on spherical objects with very + * small Reynolds numbers in a viscous fluid. fx = 6 * PI * radius * viscosity * velocity + * @param radius of object + * @param viscosity of fluid + * @param velocity of object in fluid + * @returns force of sphere moving through a viscous matter + */ + static long double stokes_law(const long double radius, const long double viscosity, const long double velocity) + { return 6.0 * _PI_ * radius * viscosity * velocity; } + + /** + * @brief Returns the viscosity of a fluid by using the time it takes an objects with + * know density and diameter. + * fx = (2 * density * time * (radius * radius) * _G_) / (9 * distance) + * @param density of object being measured + * @param diameter of the object + * @param distance the object is falling through the fluid + * @param time it takes in seconds for the objects to reach bottom + * @returns the viscosity of a fluid + */ + static long double viscosity(const long double density, const long double diameter, const long double distance, const long double time) + { + const long double radius = diameter / 2; + return (2 * density * time * (radius * radius) * _Ga_) / (9 * distance); + } + + + /** + * destructor + */ + ~Drag() + { + delete _ptrDrag; + countDecrease(); + //countShow(); + } + +}; +#endif //PHYSICSFORMULA_DRAG_H + + diff --git a/ETL.h b/ETL.h index f928a61..b61ae3a 100644 --- a/ETL.h +++ b/ETL.h @@ -1,174 +1,174 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_ETL_H -#define PHYSICSFORMULA_ETL_H - -#include -#include -#include -#include -#include -#include -#include "MatrixND.h" - -/** - * @class ETL - * @details Extract transform and load, class for reading in data from a csv - * file and transforms it for use in machine learning and data analysis - * @author AI coding, implemented by Ryan Zurrin - * dateBuilt 5/26/2021 - * lastEdit 5/26/2021 - */ -template -class ETL -{ - std::string dataset; - std::string delimiter; - bool header; - -public: - ETL() - { - dataset = ""; - delimiter = " "; - header = false; - } - ETL(std::string data, std::string separator, bool head) : dataset(std::move(data)), delimiter(std::move(separator)), header(head) - {} - - std::vector> readCSV(); - MatrixND CSVtoMatrix(std::vector> ds, int rows, int cols); - - static MatrixND Normalize(MatrixND data, bool normalizeTarget); - //auto Mean(Eigen::MatrixXd data) -> decltype(data.colwise().mean()); - //auto Std(Eigen::MatrixXd data) -> decltype(((data.array().square().colwise().sum())/(data.rows()-1)).sqrt()); - - std::tuple,MatrixND,MatrixND,MatrixND> - TrainTestSplit(MatrixND data, float train_size)const; - - void VectorToFile(std::vector vector, std::string filename)const; - static void EigenToFile(MatrixND data,const std::string& filename); -}; - -#endif //PHYSICSFORMULA_ETL_H -template -std::vector> ETL::readCSV() -{ - - std::ifstream file(dataset); - std::vector> dataString; - - std::string line = ""; - - while(getline(file,line)){ - std::vector vec; - std::stringstream ss(line); - std::string token; - while(getline(ss,token,delimiter[0])){ - vec.push_back(token); - } - dataString.push_back(vec); - } - - file.close(); - //print out the data -// for(int i = 0; i < dataString.size(); i++){ -// for(int j = 0; j < dataString[i].size(); j++){ -// std::cout << dataString[i][j] << " "; -// } -// std::cout << std::endl; -// } - - return dataString; -} -template -MatrixND ETL::CSVtoMatrix(std::vector> - ds, int rows, int cols) -{ - if(header){ - rows = rows - 1; - } - - MatrixND data(rows,cols); - // adding the data from vector to matrix - for(int i = 0; i < rows; i++){ - for(int j = 0; j < cols; ++j){ - data(i,j) = std::stod(ds[i][j]); - } - } - return data; -} -template -inline std::tuple,MatrixND,MatrixND,MatrixND> -ETL::TrainTestSplit(MatrixND data, float train_size)const -{ - - const int rows = static_cast( data.rows()); - const int train_rows = static_cast( round(train_size*rows)); - const int test_rows = rows - train_rows; - - MatrixND train = data.topRows(train_rows); - - MatrixND X_train = train.leftCols(data.cols()-1); - MatrixND y_train = train.rightCols(1); - - MatrixND test = data.bottomRows(test_rows); - - MatrixND X_test = test.leftCols(data.cols()-1); - MatrixND y_test = test.rightCols(1); - - return std::make_tuple(X_train, y_train, X_test, y_test); -} -template -inline auto Mean(MatrixND data) -> decltype(data.colwise().mean()) -{ - return data.colwise().mean(); -} -template -inline auto Std(MatrixND data) -> -decltype(((data.array().square().colwise().sum())/(data.rows()-1)).sqrt()) -{ - return ((data.array().square().colwise().sum())/(data.rows()-1)).sqrt(); -} -template -inline MatrixND ETL::Normalize(MatrixND data, bool normalizeTarget) -{ - MatrixND dataNorm; - if(normalizeTarget==true) { - dataNorm = data; - } else { - dataNorm = data.leftCols(data.cols()-1); - } - - auto mean = dataNorm.colwise().mean(); - MatrixND scaled_data = dataNorm.rowwise() - mean; - auto std = ((scaled_data.array().square().colwise().sum()) / - (scaled_data.rows() - 1)).sqrt(); - - MatrixND norm = scaled_data.array().rowwise()/std; - - if(normalizeTarget==false) { - norm.conservativeResize(norm.rows(), norm.cols()+1); - norm.col(norm.cols()-1) = data.rightCols(1); - } - - return norm; -} -template -inline void ETL::VectorToFile(std::vector vector, std::string filename)const -{ - std::ofstream output_file(filename); - std::ostream_iterator output_iterator(output_file, "\n"); - std::copy(vector.begin(), vector.end(), output_iterator); -} -template -inline void ETL::EigenToFile(MatrixND data,const std::string& filename) -{ - std::ofstream output_file(filename); - if(output_file.is_open()){ - output_file << data << "\n"; - } -} - +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_ETL_H +#define PHYSICSFORMULA_ETL_H + +#include +#include +#include +#include +#include +#include +#include "MatrixND.h" + +/** + * @class ETL + * @details Extract transform and load, class for reading in data from a csv + * file and transforms it for use in machine learning and data analysis + * @author AI coding, implemented by Ryan Zurrin + * dateBuilt 5/26/2021 + * lastEdit 5/26/2021 + */ +template +class ETL +{ + std::string dataset; + std::string delimiter; + bool header; + +public: + ETL() + { + dataset = ""; + delimiter = " "; + header = false; + } + ETL(std::string data, std::string separator, bool head) : dataset(std::move(data)), delimiter(std::move(separator)), header(head) + {} + + std::vector> readCSV(); + MatrixND CSVtoMatrix(std::vector> ds, int rows, int cols); + + static MatrixND Normalize(MatrixND data, bool normalizeTarget); + //auto Mean(Eigen::MatrixXd data) -> decltype(data.colwise().mean()); + //auto Std(Eigen::MatrixXd data) -> decltype(((data.array().square().colwise().sum())/(data.rows()-1)).sqrt()); + + std::tuple,MatrixND,MatrixND,MatrixND> + TrainTestSplit(MatrixND data, float train_size)const; + + void VectorToFile(std::vector vector, std::string filename)const; + static void EigenToFile(MatrixND data,const std::string& filename); +}; + +#endif //PHYSICSFORMULA_ETL_H +template +std::vector> ETL::readCSV() +{ + + std::ifstream file(dataset); + std::vector> dataString; + + std::string line = ""; + + while(getline(file,line)){ + std::vector vec; + std::stringstream ss(line); + std::string token; + while(getline(ss,token,delimiter[0])){ + vec.push_back(token); + } + dataString.push_back(vec); + } + + file.close(); + //print out the data +// for(int i = 0; i < dataString.size(); i++){ +// for(int j = 0; j < dataString[i].size(); j++){ +// std::cout << dataString[i][j] << " "; +// } +// std::cout << std::endl; +// } + + return dataString; +} +template +MatrixND ETL::CSVtoMatrix(std::vector> + ds, int rows, int cols) +{ + if(header){ + rows = rows - 1; + } + + MatrixND data(rows,cols); + // adding the data from vector to matrix + for(int i = 0; i < rows; i++){ + for(int j = 0; j < cols; ++j){ + data(i,j) = std::stod(ds[i][j]); + } + } + return data; +} +template +inline std::tuple,MatrixND,MatrixND,MatrixND> +ETL::TrainTestSplit(MatrixND data, float train_size)const +{ + + const int rows = static_cast( data.rows()); + const int train_rows = static_cast( round(train_size*rows)); + const int test_rows = rows - train_rows; + + MatrixND train = data.topRows(train_rows); + + MatrixND X_train = train.leftCols(data.cols()-1); + MatrixND y_train = train.rightCols(1); + + MatrixND test = data.bottomRows(test_rows); + + MatrixND X_test = test.leftCols(data.cols()-1); + MatrixND y_test = test.rightCols(1); + + return std::make_tuple(X_train, y_train, X_test, y_test); +} +template +inline auto Mean(MatrixND data) -> decltype(data.colwise().mean()) +{ + return data.colwise().mean(); +} +template +inline auto Std(MatrixND data) -> +decltype(((data.array().square().colwise().sum())/(data.rows()-1)).sqrt()) +{ + return ((data.array().square().colwise().sum())/(data.rows()-1)).sqrt(); +} +template +inline MatrixND ETL::Normalize(MatrixND data, bool normalizeTarget) +{ + MatrixND dataNorm; + if(normalizeTarget==true) { + dataNorm = data; + } else { + dataNorm = data.leftCols(data.cols()-1); + } + + auto mean = dataNorm.colwise().mean(); + MatrixND scaled_data = dataNorm.rowwise() - mean; + auto std = ((scaled_data.array().square().colwise().sum()) / + (scaled_data.rows() - 1)).sqrt(); + + MatrixND norm = scaled_data.array().rowwise()/std; + + if(normalizeTarget==false) { + norm.conservativeResize(norm.rows(), norm.cols()+1); + norm.col(norm.cols()-1) = data.rightCols(1); + } + + return norm; +} +template +inline void ETL::VectorToFile(std::vector vector, std::string filename)const +{ + std::ofstream output_file(filename); + std::ostream_iterator output_iterator(output_file, "\n"); + std::copy(vector.begin(), vector.end(), output_iterator); +} +template +inline void ETL::EigenToFile(MatrixND data,const std::string& filename) +{ + std::ofstream output_file(filename); + if(output_file.is_open()){ + output_file << data << "\n"; + } +} + diff --git a/Elasticity.h b/Elasticity.h index 011439f..64c4a59 100644 --- a/Elasticity.h +++ b/Elasticity.h @@ -1,279 +1,279 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_ELASTICITY_H -#define PHYSICSFORMULA_ELASTICITY_H -// class for doing physics problems -// author: Ryan Zurrin -// last Modified: 10/11/2020 -#include -#include -#include -#define PI 3.14159265 -using namespace std; - -//static object counter for Elasticity class -static int elasticity_objectCount = 0; - -static struct Elastic_Moduli // all units are multiplied by(10^9 N/m^2) -{ - /// - vector aluminum{70e9, 25e9, 75e9}; - /// - vector bone_tension{ - 16 * pow(10, 9), 80 * pow(10, 9), 8 * pow(10, 9) - }; - /// - vector bone_compression{ - 9 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9) - }; - /// - vector brass{ - 90 * pow(10, 9), 35 * pow(10, 9), 75 * pow(10, 9) - }; - /// - vector brick{15 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9)}; - /// - vector concrete{ - 20 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9) - }; - /// - vector glass{ - 70 * pow(10, 9), 20 * pow(10, 9), 30 * pow(10, 9) - }; - /// - vector granite{ - 45 * pow(10, 9), 20 * pow(10, 9), 45 * pow(10, 9) - }; - /// - vector hair_human{ - 10 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9) - }; - /// - vector hardwood{ - 25 * pow(10, 9), 10 * pow(10, 9), 0 * pow(10, 9) - }; - /// - vector cast_iron{ - 100 * pow(10, 9), 40 * pow(10, 9), 90 * pow(10, 9) - }; - /// - vector lead{16 * pow(10, 9), 5 * pow(10, 9), 50 * pow(10, 9)}; - /// - vector marble{ - 60 * pow(10, 9), 20 * pow(10, 9), 70 * pow(10, 9) - }; - /// - vector nylon{5 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9)}; - /// - vector polystyrene{ - 3 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9) - }; - /// - vector silk{6 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9)}; - /// - vector spider_thread{ - 3 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9) - }; - /// - vector steel{ - 210 * pow(10, 9), 80 * pow(10, 9), 130 * pow(10, 9) - }; - /// - vector tendon{1 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9)}; - /// - vector acetone{ - 0 * pow(10, 9), 0 * pow(10, 9), 0.7 * pow(10, 9) - }; - /// - vector ethanol{ - 0 * pow(10, 9), 0 * pow(10, 9), 0.9 * pow(10, 9) - }; - /// - vector glycerin{ - 0 * pow(10, 9), 0 * pow(10, 9), 4.5 * pow(10, 9) - }; - /// - vector mercury{ - 0 * pow(10, 9), 0 * pow(10, 9), 25 * pow(10, 9) - }; - /// - vector water{0 * pow(10, 9), 0 * pow(10, 9), 2.2 * pow(10, 9)}; -} moduli; - - -class Elasticity -{ -public: - static void countShow() { std::cout << "elasticity count: " << elasticity_objectCount << std::endl; } - - void setElasticityVal(long double val) { _elasticityVal = val; } - - Elasticity* _ptrElastic; - - /** - * structure: Elastic_Moduli vector - * components: Y, S, B - * purpose: store data on elastic moduli for using in physics calculations - * returns: specified component value - */ - - - // default constructor - Elasticity() - { - _ptrElastic = nullptr; - _elasticityVal = 0.0; - countIncrease(); - //countShow(); - } - Elasticity(long double val) - { - _ptrElastic = nullptr; - _elasticityVal = 0.0; - countIncrease(); - - } - - // copy constructor - Elasticity(const Elasticity& e) - { - _ptrElastic = e._ptrElastic; - _elasticityVal = e._elasticityVal; - countIncrease(); - //countShow(); - } - - // copy assignment operator - Elasticity& operator=(const Elasticity& r) - { - if (this != &r) - { - _ptrElastic = r._ptrElastic; - _elasticityVal = r._elasticityVal; - countIncrease(); - //countShow(); - } - return *this; - } - - - /** - * method: cross_sectional(const long double radius) - * arguments: radius - * purpose: calculates the cross sectional, which is used in many elasticity problems - * returns: long double, cross sectional - */ - static long double cross_sectional_area(const long double radius) - { return PI * (radius * radius); } - - /** - * Returns the calculated deformation of an object which is used in hooks law equation - * @param appliedForce the force in newtons - * @param modulus values can be accessed by .moduli. - * @param crossSectionalArea - * @param original * - * @returns the deformation - */ - static long double deformations(const long double appliedForce, const long double modulus, const long double diameter, const long double original) - { return (1 / modulus) * (appliedForce / (PI * (diameter * diameter)) * original); } - - /** - * method: stress_usingY(const long double YoungsModulus, const long double strain) - * arguments: 1)YoungsModulus 2)strain - * purpose: calculates the stress which is defined as the ratio of force to area - * returns: long double, stress - */ - static long double stress_usingY(const long double youngsModulus, const long double strain) - { return youngsModulus * strain; } - - /** - * method: stress_usingF(const long double force, const long double area) - * arguments: 1)force 2)area = PI*r^2 - * purpose: calculates the stress which is defined as the ratio of force to area - * returns: long double, stress - */ - static long double stress_usingF(const long double force, const long double area) - { return force / area; } - - /** - * method: strain(const long double change_in_length, const long double total_length) - * arguments: 1)change_in_length 2)total_length - * purpose: calculates the strain which is defined as the ratio of the change in length to length - * returns: long double, strain - */ - static long double strain(const long double change_in_length, const long double total_length) - { return change_in_length / total_length; } - - - /// - /// Uses Hookes law to find the force applied - /// - /// The force constant. - /// The deformation from starting point. - /// force applied - static long double hookes_law(const long double k, const long double x) - { return k * x; } - - - /** - * method: deforming_force(const long double modulus, const long double crossSectionalArea, const long double originalLength, const long double amountDeformed) - * arguments: 1)modulus 2)crossSectionalArea 3)originalLength 4)amountDeformed - * purpose: calculates the force required to bend or deform a something depending on the material - * returns: long double, deforming force - */ - static long double deforming_force(const long double modulus, const long double crossSectionalArea, const long double originalLength, const long double amountDeformed) - { return ((modulus) * (crossSectionalArea) / (originalLength)) * amountDeformed; } - - /** - * Returns the total displacement to the side of an object due to a sheering force. - * @param length total length of the object - * @param diameter of object - * @param forceN in newtons - * @param sheerModuli for the material being measured - * @returns displacement of a material to side due to sheering force - */ - static long double displacement_side_sheer_force(const long double length, const long double diameter, const long double forceN, const long double sheerModuli) - { - return (1 / sheerModuli) * (4 / (PI * (diameter * diameter))) * forceN * length; - } - - /** - * @brief Returns the amount of compression an object undergoes, such as weight on a steel beam - * @param length is the length of the object - * @param crossSectionalArea is the area as if it was sliced in half - * @param youngsModulus is the modulus used in this equation - * @param force is the amount of force being applied - * @returns the compression amount in meters - */ - static long double compression(const long double length, const long double crossSectionalArea, const long double youngsModulus, const long double force) - { - return (force * length) / (youngsModulus * crossSectionalArea); - } - - /** - * @brief Returns the maximum force something will take before it fails - * @param compressiveStrength is dependant on the material used - * @param crossSectionalArea is the area of a cross section of the object - * @returns the max force before failure will occur - */ - static long double max_support_force(const long double compressiveStrength, const long double crossSectionalArea) - { - return compressiveStrength * crossSectionalArea; - } - - ~Elasticity() - { - delete _ptrElastic; - countDecrease(); - //countShow(); - } - -private: - - static void countIncrease() { elasticity_objectCount += 1; } - static void countDecrease() { elasticity_objectCount -= 1; } - long double _elasticityVal; -}; -#endif //PHYSICSFORMULA_ELASTICITY_H +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_ELASTICITY_H +#define PHYSICSFORMULA_ELASTICITY_H +// class for doing physics problems +// author: Ryan Zurrin +// last Modified: 10/11/2020 +#include +#include +#include +#define PI 3.14159265 +using namespace std; + +//static object counter for Elasticity class +static int elasticity_objectCount = 0; + +static struct Elastic_Moduli // all units are multiplied by(10^9 N/m^2) +{ + /// + vector aluminum{70e9, 25e9, 75e9}; + /// + vector bone_tension{ + 16 * pow(10, 9), 80 * pow(10, 9), 8 * pow(10, 9) + }; + /// + vector bone_compression{ + 9 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9) + }; + /// + vector brass{ + 90 * pow(10, 9), 35 * pow(10, 9), 75 * pow(10, 9) + }; + /// + vector brick{15 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9)}; + /// + vector concrete{ + 20 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9) + }; + /// + vector glass{ + 70 * pow(10, 9), 20 * pow(10, 9), 30 * pow(10, 9) + }; + /// + vector granite{ + 45 * pow(10, 9), 20 * pow(10, 9), 45 * pow(10, 9) + }; + /// + vector hair_human{ + 10 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9) + }; + /// + vector hardwood{ + 25 * pow(10, 9), 10 * pow(10, 9), 0 * pow(10, 9) + }; + /// + vector cast_iron{ + 100 * pow(10, 9), 40 * pow(10, 9), 90 * pow(10, 9) + }; + /// + vector lead{16 * pow(10, 9), 5 * pow(10, 9), 50 * pow(10, 9)}; + /// + vector marble{ + 60 * pow(10, 9), 20 * pow(10, 9), 70 * pow(10, 9) + }; + /// + vector nylon{5 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9)}; + /// + vector polystyrene{ + 3 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9) + }; + /// + vector silk{6 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9)}; + /// + vector spider_thread{ + 3 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9) + }; + /// + vector steel{ + 210 * pow(10, 9), 80 * pow(10, 9), 130 * pow(10, 9) + }; + /// + vector tendon{1 * pow(10, 9), 0 * pow(10, 9), 0 * pow(10, 9)}; + /// + vector acetone{ + 0 * pow(10, 9), 0 * pow(10, 9), 0.7 * pow(10, 9) + }; + /// + vector ethanol{ + 0 * pow(10, 9), 0 * pow(10, 9), 0.9 * pow(10, 9) + }; + /// + vector glycerin{ + 0 * pow(10, 9), 0 * pow(10, 9), 4.5 * pow(10, 9) + }; + /// + vector mercury{ + 0 * pow(10, 9), 0 * pow(10, 9), 25 * pow(10, 9) + }; + /// + vector water{0 * pow(10, 9), 0 * pow(10, 9), 2.2 * pow(10, 9)}; +} moduli; + + +class Elasticity +{ +public: + static void countShow() { std::cout << "elasticity count: " << elasticity_objectCount << std::endl; } + + void setElasticityVal(long double val) { _elasticityVal = val; } + + Elasticity* _ptrElastic; + + /** + * structure: Elastic_Moduli vector + * components: Y, S, B + * purpose: store data on elastic moduli for using in physics calculations + * returns: specified component value + */ + + + // default constructor + Elasticity() + { + _ptrElastic = nullptr; + _elasticityVal = 0.0; + countIncrease(); + //countShow(); + } + Elasticity(long double val) + { + _ptrElastic = nullptr; + _elasticityVal = 0.0; + countIncrease(); + + } + + // copy constructor + Elasticity(const Elasticity& e) + { + _ptrElastic = e._ptrElastic; + _elasticityVal = e._elasticityVal; + countIncrease(); + //countShow(); + } + + // copy assignment operator + Elasticity& operator=(const Elasticity& r) + { + if (this != &r) + { + _ptrElastic = r._ptrElastic; + _elasticityVal = r._elasticityVal; + countIncrease(); + //countShow(); + } + return *this; + } + + + /** + * method: cross_sectional(const long double radius) + * arguments: radius + * purpose: calculates the cross sectional, which is used in many elasticity problems + * returns: long double, cross sectional + */ + static long double cross_sectional_area(const long double radius) + { return PI * (radius * radius); } + + /** + * Returns the calculated deformation of an object which is used in hooks law equation + * @param appliedForce the force in newtons + * @param modulus values can be accessed by .moduli. + * @param crossSectionalArea + * @param original * + * @returns the deformation + */ + static long double deformations(const long double appliedForce, const long double modulus, const long double diameter, const long double original) + { return (1 / modulus) * (appliedForce / (PI * (diameter * diameter)) * original); } + + /** + * method: stress_usingY(const long double YoungsModulus, const long double strain) + * arguments: 1)YoungsModulus 2)strain + * purpose: calculates the stress which is defined as the ratio of force to area + * returns: long double, stress + */ + static long double stress_usingY(const long double youngsModulus, const long double strain) + { return youngsModulus * strain; } + + /** + * method: stress_usingF(const long double force, const long double area) + * arguments: 1)force 2)area = PI*r^2 + * purpose: calculates the stress which is defined as the ratio of force to area + * returns: long double, stress + */ + static long double stress_usingF(const long double force, const long double area) + { return force / area; } + + /** + * method: strain(const long double change_in_length, const long double total_length) + * arguments: 1)change_in_length 2)total_length + * purpose: calculates the strain which is defined as the ratio of the change in length to length + * returns: long double, strain + */ + static long double strain(const long double change_in_length, const long double total_length) + { return change_in_length / total_length; } + + + /// + /// Uses Hookes law to find the force applied + /// + /// The force constant. + /// The deformation from starting point. + /// force applied + static long double hookes_law(const long double k, const long double x) + { return k * x; } + + + /** + * method: deforming_force(const long double modulus, const long double crossSectionalArea, const long double originalLength, const long double amountDeformed) + * arguments: 1)modulus 2)crossSectionalArea 3)originalLength 4)amountDeformed + * purpose: calculates the force required to bend or deform a something depending on the material + * returns: long double, deforming force + */ + static long double deforming_force(const long double modulus, const long double crossSectionalArea, const long double originalLength, const long double amountDeformed) + { return ((modulus) * (crossSectionalArea) / (originalLength)) * amountDeformed; } + + /** + * Returns the total displacement to the side of an object due to a sheering force. + * @param length total length of the object + * @param diameter of object + * @param forceN in newtons + * @param sheerModuli for the material being measured + * @returns displacement of a material to side due to sheering force + */ + static long double displacement_side_sheer_force(const long double length, const long double diameter, const long double forceN, const long double sheerModuli) + { + return (1 / sheerModuli) * (4 / (PI * (diameter * diameter))) * forceN * length; + } + + /** + * @brief Returns the amount of compression an object undergoes, such as weight on a steel beam + * @param length is the length of the object + * @param crossSectionalArea is the area as if it was sliced in half + * @param youngsModulus is the modulus used in this equation + * @param force is the amount of force being applied + * @returns the compression amount in meters + */ + static long double compression(const long double length, const long double crossSectionalArea, const long double youngsModulus, const long double force) + { + return (force * length) / (youngsModulus * crossSectionalArea); + } + + /** + * @brief Returns the maximum force something will take before it fails + * @param compressiveStrength is dependant on the material used + * @param crossSectionalArea is the area of a cross section of the object + * @returns the max force before failure will occur + */ + static long double max_support_force(const long double compressiveStrength, const long double crossSectionalArea) + { + return compressiveStrength * crossSectionalArea; + } + + ~Elasticity() + { + delete _ptrElastic; + countDecrease(); + //countShow(); + } + +private: + + static void countIncrease() { elasticity_objectCount += 1; } + static void countDecrease() { elasticity_objectCount -= 1; } + long double _elasticityVal; +}; +#endif //PHYSICSFORMULA_ELASTICITY_H diff --git a/ElectricCharge.h b/ElectricCharge.h index 6ed3060..4aaedd5 100644 --- a/ElectricCharge.h +++ b/ElectricCharge.h @@ -1,748 +1,748 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_ELECTRICCHARGE_H -#define PHYSICSFORMULA_ELECTRICCHARGE_H -/** - * @class ElectricCharge - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @dateBuilt 12/31/2020 - * @lastEdit 2/8/2021 - */ -#include -#include - -#include "Vector2D.h" -typedef long double ld; - -/// -/// The meters light travels in one light year -/// -constexpr auto METERS_1LY = 9460730472580800; - -//pi = 3.14159265359 -constexpr auto _pi_ = 3.14159265359; -/// -/// Vacuum permittivity, commonly denoted ε0 (pronounced as "epsilon nought" -/// or "epsilon zero") is the value of the absolute dielectric permittivity -/// of classical vacuum. -/// -constexpr auto _e0_ = 8.854187819013e-12; // 8.8542e-12 -/// -/// Coulombs constant 8.988 * pow(10.0, 9)Nm^2)/C^2 -/// -constexpr auto _k_ = 8.9875517923e9; //8.988 * pow(10.0, 9)Nm^2)/C^2 -constexpr auto _K_ = 1.0 / (4.0 * _pi_ * _e0_); -/// -/// The electron = -1.6 * 10^-19 C -/// -constexpr auto _ELECTRON_CHARGE_ = -(1.602176634e-19); //-1.6e-19 - -/// -/// The proton = 1.6 * 10^-19C -/// -constexpr auto _PROTON_CHARGE_ = 1.602176634e-19; // 1.6e-19 -constexpr auto _COULOMB_ = 1.0 / (_ELECTRON_CHARGE_); - -constexpr auto _ELECTRON_MASS_ = 9.1093837015e-31; //9.11e-31 -constexpr auto _PROTON_MASS_ = 1.67262e-27; //1.673e-27 - -constexpr auto _PLANKS_J_ = 6.62607004e-34; -constexpr auto _PLANKS_EM_ = 4.14e-15; -constexpr auto _PLANKS_C_ = _PLANKS_EM_ * 2.99792e8; - -static int electricCharge_objectCount = 0; - -static struct ScientificNotationUnits -{ - typedef ScientificNotationUnits snu; - ld refVal; - const ld YOTTA = pow(10, 24); //10^24 - const ld ZETTA = pow(10, 21); //10^21 - const ld EXA = pow(10, 18); //10^18 - const ld PETA = pow(10, 15); //10^15 - const ld TERA = pow(10, 12); //10^12 - const ld GIGA = pow(10, 9); //10^9 - const ld MEGA = pow(10, 6); //10^6 - const ld KILO = pow(10, 3); //10^3 - const ld HECTO = pow(10, 2); //10^2 - const ld DECA = pow(10, 1); //10^1 - const ld DECI = pow(10, -1); //10^-1 - const ld CENTI = pow(10, -2); //10^-2 - const ld MILLA = pow(10, -3); //10^-3 - const ld MICRO = pow(10, -6); //10^-6 - const ld NANO = pow(10, -9); //10^-9 - const ld PICO = pow(10, -12); //10^-12 - const ld FEMTO = pow(10, -15); //10^-15 - const ld ATTO = pow(10, -18); //10^-18 - const ld ZEPTO = pow(10, -21); //10^-21 - const ld YOCTO = pow(10, -24); //10^-24 - friend snu operator+(const snu &r, const snu &l) - { return l.refVal + r.refVal; } - snu operator+(ld rhs)const - { return this->refVal + rhs; } - friend snu operator-(const snu &r, const snu &l) - { return l.refVal - r.refVal; } - snu operator-(ld rhs)const - { return this->refVal - rhs; } - friend snu operator*(const snu &r, const snu &l) - { return l.refVal * r.refVal; } - snu operator*(ld rhs)const - { return this->refVal * rhs; } - friend snu operator/(const snu &r, const snu &l) - { return l.refVal / r.refVal; } - snu operator/(ld rhs)const - { return this->refVal / rhs; } - ScientificNotationUnits() - { - refVal = 0.0; - } - ScientificNotationUnits(ld v) - { - refVal = v; - } - ~ScientificNotationUnits() = default; -} SU; - - -class ElectricCharge -{ -public: - ElectricCharge* _electricChargePtr; - - ElectricCharge() - { - _electricChargePtr = nullptr; - _electricChargeVal = 0.0; - countIncrease(); - } - - ElectricCharge(ld val) - { - _electricChargePtr = nullptr; - _electricChargeVal = 0.0; - countIncrease(); - } - - /** - * @brief copy constructor - */ - ElectricCharge(const ElectricCharge& t) - { - _electricChargePtr = t._electricChargePtr; - _electricChargeVal = t._electricChargeVal; - countIncrease(); - } - - /** - * #brief move constructor - */ - ElectricCharge(ElectricCharge&& t) noexcept - { - _electricChargePtr = t._electricChargePtr; - _electricChargeVal = t._electricChargeVal; - countIncrease(); - } - - /** - * @brief copy assignment operator - */ - ElectricCharge& operator=(const ElectricCharge& t) - { - if (this != &t) - { - _electricChargePtr = t._electricChargePtr; - _electricChargeVal = t._electricChargeVal; - countIncrease(); - } - return *this; - } - - static void show_objectCount() - { - std::cout << "\n electric charge object count: " << - electricCharge_objectCount << std::endl; - } - - static int get_objectCount() { return electricCharge_objectCount; } - - /// - /// Crates mass from energy. - /// - /// The energy. - /// The c. - /// energy - static constexpr ld massFromEnergy(ld E, ld c); - /// - /// Masses from energy. - /// - /// The electrons mass. - /// energy - static constexpr ld massFromEnergy(ld M); - - /// - /// Totals the electron mass. - /// - /// The total electrons. - /// mass of electrons in kg - static constexpr ld totalElectronMass(ld Ne); - - /// - /// Totals the proton mass. - /// - /// The total protons. - /// mass of protons in kg - static constexpr ld totalProtonMass(ld Np); - - /// - /// Totals the mass. - /// - /// The total electrons. - /// The total protons. - /// the total mass of protons and electrons - static constexpr ld totalMass(ld Ne, ld Np); - - /// - /// Calculates the magnitude between two electrostatic forces q1 and q2 - /// - /// The q1. - /// The q2. - /// The r. - /// - static constexpr ld electrostaticForce(ld q1, ld q2, ld r); - - /// - /// Charges the of electrostatic force equal point charges. - /// - /// The q. - /// The mass. - /// The r. - /// - static ld chargeOfElectrostaticForce_equalPointCharges(ld q, ld mass, ld r); - - /// - /// Electrics the field e. - /// - /// The q. - /// The r. - /// - static constexpr ld electricFieldForce(ld Q, ld r); - - /// - /// calculates the force by an electric field and current - /// - /// The current. - /// The electric field strength. - /// - static constexpr ld forceByElectricField(ld q, ld E); - - /// - /// Calculates the electrons needed to form a charge of baseNumber to the - /// su power. - /// - /// The base number. - /// The scientific notation multiple. - /// number of electrons - static constexpr ld electrons(ld baseNumber, ld su); - - /// - /// Electrons the count. - /// - /// The protons. - /// The net charge. - /// - static ld netElectronCount(ld protons, ld netCharge); - - /// - /// Coulombs the specified base number. - /// - /// The base number. - /// The su. - /// - static constexpr ld coulombs(ld baseNumber, ld su); - - /// - /// Hows the many fewer electrons then protons. - /// - /// The net charge. - /// - static ld howManyFewerElectronsThenProtons(ld netCharge); - - /// - /// Fractions the protons no electrons. - /// - /// The protons. - /// The net charge. - /// - static ld fractionProtonsNoElectrons(ld protons, ld netCharge); - - /// - /// Forces the change two point charges. - /// - /// The f. - /// The factor change. - /// - static constexpr ld forceChangeTwoPointCharges(ld F, ld factorChange); - - /// - /// Electrics the field. - /// - /// The force. - /// The charge. - /// - static constexpr ld electricField(ld F, ld q); - - /// - /// Calculates the magnitude of a point charge that creates a electric field - /// force of F, at a distance of r meters. - /// - /// The force of the electric field in N/C. - /// The distance it causes this force. - /// magnitude of the point charge (C) - static constexpr ld magnitudePointCharge(ld E, ld r); - - /// - /// Calculates the charge of a point particle having a force of F acting on - /// it with a electric field strength of E at its location. - /// - /// The force acting on a charge. - /// The electric field strength. - /// - static constexpr ld charge(const ld F, const ld E); - - - - /// - /// Separations the between point charges. - /// - /// point charge 1. - /// point charge 2. - /// The Force in Newtons. - /// - static ld separationBetweenPointCharges(ld q1, ld q2, ld F); - - /// - /// Hows the many electrons. - /// - /// The total particles. - /// The net charge. - /// - static constexpr ld howManyElectrons(ld totalParticles, ld netCharge); - - /// - /// Minimums the charge to lift object. - /// - /// The radius. - /// The charge. - /// The mass. - /// - static constexpr ld minimumChargeToLiftObject(ld r, ld charge, ld m); - - /// - /// A wrecking yard inventor wants to pick up cars by charging a ball - /// of radius r (d/2) by inducing an equal and opposite charge on the car. - /// If a car has a mass of m kg and the ball is to be able to lift it from - /// a distance of l meters away, What minimum charge must be used? - /// - /// The radius of bass. - /// The length of initial lift . - /// The mass. - /// the minimum charge needed in C - static ld minimumChargeToLiftCar(ld r, ld l, ld m); - - /// - /// Superposition principle. Adding charges up. - /// - /// The f1. - /// The f2. - /// The f3. - /// The f4. - /// The f5. - /// The f6. - /// net charge - static constexpr ld superpositionPrinciple - (ld f1, ld f2, ld f3, ld f4, ld f5, ld f6); - - /// - /// Distance between points. - /// - /// The q1. - /// The q2. - /// The f. - /// - static ld distanceBetweenPoints(ld q1, ld q2, ld F); - - /// - /// Angles the vertical axis. - /// - /// The force of the electric field. - /// The mass. - /// - static ld angleVerticalAxis(ld Fe, ld mass); - - /// - /// Two raindrops with equal masses of m are in a thunderhead r meters apart - /// when they each acquire charges of q1 and q2. Find their acceleration. - /// - /// The mass. - /// The distance between particles. - /// The charge on particle 1. - /// The charge on particle 2. - /// acceleration in m/s^2 - static constexpr ld accelerationOfParticles(ld m, ld r, ld q1, ld q2); - - /// - /// Calculate the electric field strength near a conducting sphere with a - /// d diameter of d meters that has q_excess amount of excess charge on it. - /// - /// The diameter. - /// The excess charge. - /// Electric field strength - static constexpr ld electricFieldStrength(ld d, ld q_excess); - - /// - /// A charged insulating ball of mass m hangs on a long string with a length - /// that don't matter, in a uniform horizontal electric field. - /// Given the charge on the ball is q Coulombs, find the strength of the field. - /// - /// The mass. - /// The angle theta. - /// The charge of the mass. - /// the strength of the electric field - static ld electricFieldStrength(ld m, ld theta, ld q); - - /// - /// four equal charges q lie on the corners of a square. A fifth charge Q - /// is on a mass m directly above the center of the square, at a height - /// equal to the length d of one side of the square. - /// Determine the magnitude of q in terms of Q , m , and d , - /// if the Coulomb force is to equal the weight of m. - /// - /// The charge of the center point. - /// The mass in center. - /// The length of a side and height of the center. - /// the charge of the corner points - static ld magnitudeOfq_termsOf_Q_m_d(ld Q, ld m, ld d); - - /// - /// Calculate the angular velocity Ω of an electron orbiting a proton in - /// the hydrogen atom, given the radius of the orbit is r meters. - /// You may assume that the proton is stationary and the centripetal - /// force is supplied by Coulomb attraction. - /// - /// The radius. - /// The mass electron. - /// The charge of electron. - /// angular velocity (rad/s) - static ld angularVelocityOfElectronOrbitingProton(ld r, ld m, ld q); - - /// - /// Point charges of q1C and q2 C are placed l meters apart. Where can a - /// third charge be placed so that the net force on it is zero? - /// - /// The distance between the two particles. - /// The charge of particle 1. - /// The charge of particle 2. - /// the distance to place the third particle - static ld distanceToPlaceThirdChargeToMakeZero(ld l, ld q1, ld q2); - - /// - /// Using the symmetry of the arrangement, determine the direction of the - /// force on q which is in the center of a square with four point charges of - /// equal charges of positive q1 and q2 in top corners and negative q3 - /// and q4 in bottom corners, given that qa=qb=+qx4 C and qc=qd=−qx4 C. - /// Calculate the magnitude of the force on the charge q , given that the - /// square is l meters on a side and q=q1 C - /// - /// The charge of the four corners. - /// The length of a side. - /// The charge in the center point. - /// the angle. - /// force on the point q - static ld magnitudeOfForceOn_q(ld qx4, ld lSide, ld q1, ld theta); - - /// - /// Find the electric field at the location of qa in Figure 18.52 given - /// that qb=qc=qd=+qb C, q=−qm nC, and the square is l cm on a side. - /// - /// The charge of 3 particles. - /// The charge on the middle particle. - /// The length of a side. - /// the electric field force n N/C - static ld electricFieldAtLocation(ld qb, ld qm, ld l); - - /// - /// Electrics the field at center triangle. - /// - /// The qa. - /// The qb. - /// The qc. - /// The l. - /// - static std::vector electricFieldAtCenterTriangle(ld qa, ld qb, ld qc, ld l); - - void setElectricChargeVal(ld val) { _electricChargeVal = val; } - - - ~ElectricCharge() - { - delete _electricChargePtr; - } - -private: - static void countIncrease() { electricCharge_objectCount += 1; } - static void countDecrease() { electricCharge_objectCount -= 1; } - ld _electricChargeVal; -}; -#endif //PHYSICSFORMULA_ELECTRICCHARGE_H - -constexpr ld ElectricCharge::massFromEnergy(const ld E, const ld c) -{ - return E / (c * c); -} - -constexpr ld ElectricCharge::massFromEnergy(const ld M) -{ - return 2.0 * M; -} - -constexpr ld ElectricCharge::totalElectronMass(const ld Ne) -{ - return Ne * _ELECTRON_MASS_; -} - -constexpr ld ElectricCharge::totalProtonMass(const ld Np) -{ - return Np * _PROTON_MASS_; -} - -constexpr ld ElectricCharge::totalMass(const ld Ne, const ld Np) -{ - return totalElectronMass(Ne) + totalProtonMass(Np); -} - -constexpr ld ElectricCharge::electrostaticForce( - const ld q1, const ld q2, const ld r -) -{ - return (_k_ * q1 * q2) / (r * r); -} - -inline ld ElectricCharge::chargeOfElectrostaticForce_equalPointCharges( - const ld q, const ld mass, const ld r -) -{ - return r * (sqrt((mass * _Ga_) / _k_)); -} - -constexpr ld ElectricCharge::electricFieldForce( - const ld Q, const ld r -) -{ - return (_k_ * Q) / (r * r); -} - -constexpr ld ElectricCharge::forceByElectricField( - const ld q, const ld E -) -{ - return q * E; -} - -constexpr ld ElectricCharge::coulombs( - const ld baseNumber, const ld su -) -{ - return baseNumber * su * _PROTON_CHARGE_; -} - -inline ld ElectricCharge::howManyFewerElectronsThenProtons( - const ld netCharge -) -{ - return netCharge / abs(_ELECTRON_CHARGE_); -} - -inline ld ElectricCharge::fractionProtonsNoElectrons( - const ld protons, const ld netCharge -) -{ - const ld temp = howManyFewerElectronsThenProtons(netCharge); - return temp / protons; -} - -constexpr ld ElectricCharge::forceChangeTwoPointCharges( - const ld F, const ld factorChange -) -{ - return F / (factorChange * factorChange); -} - -constexpr ld ElectricCharge::electricField( - const ld F, const ld q -) -{ - return F / q; -} - -constexpr ld ElectricCharge::magnitudePointCharge( - const ld E, const ld r -) -{ - return ((r * r) * E) / _k_; -} - -constexpr ld ElectricCharge::charge(const ld F, const ld E) -{ - return F / E; -} - -inline ld ElectricCharge::separationBetweenPointCharges( - const ld q1, const ld q2, const ld F -) -{ - return sqrt((_k_ * (q1 * q2)) / F); -} - -constexpr ld ElectricCharge::howManyElectrons( - const ld totalParticles, const ld netCharge -) -{ - const ld NeMinusNp = netCharge / _ELECTRON_CHARGE_; - const ld total = totalParticles + NeMinusNp; - const ld Ne = total / 2.0; - - return Ne; -} - -constexpr ld ElectricCharge::minimumChargeToLiftObject( - const ld r, const ld charge, const ld m -) -{ - return (m * _Ga_ * (r * r)) / (_k_ * charge); -} - -inline ld ElectricCharge::minimumChargeToLiftCar( - const ld r, const ld l, const ld m -) -{ - return (r + l) * sqrt((m * _Ga_) / _k_); -} - -constexpr ld ElectricCharge::superpositionPrinciple( - const ld f1 = 0, const ld f2 = 0, const ld f3 = 0, const ld f4 = 0, - const ld f5 = 0, const ld f6 = 0 -) -{ - return f1 + f2 + f3 + f4 + f5 + f6; -} - -inline ld ElectricCharge::distanceBetweenPoints( - const ld q1, const ld q2, const ld F -) -{ - return sqrt((_k_ * abs(q1) * abs(q2)) / F); -} - -inline ld ElectricCharge::angleVerticalAxis( - const ld Fe, const ld mass -) -{ - return atan((Fe / (mass * _Ga_))) * DEGREE; -} - -constexpr ld ElectricCharge::accelerationOfParticles( - const ld m, const ld r, const ld q1, const ld q2 -) -{ - return (_k_ * (q1 * q2)) / (m * (r * r)); -} - -constexpr ld ElectricCharge::electricFieldStrength(const ld d, const ld q_excess) -{ - return (4.0 * _k_ * q_excess) / (d * d); -} - -inline ld ElectricCharge::electricFieldStrength( - const ld m, const ld theta, const ld q -) -{ - return (m * _Ga_ * tan(theta * RADIAN)) / q; -} - -inline ld ElectricCharge::magnitudeOfq_termsOf_Q_m_d( - const ld Q, const ld m, const ld d -) -{ - return (3.0 * sqrt(6.0) * (d * d) * m * _Ga_) / (16.0 * _k_ * Q); -} - -inline ld ElectricCharge::angularVelocityOfElectronOrbitingProton( - const ld r, const ld m, const ld q -) -{ - return q * sqrt((_k_) / (m * r)); -} - -inline ld ElectricCharge::distanceToPlaceThirdChargeToMakeZero( - const ld l, const ld q1, const ld q2 -) -{ - return (l * sqrt(q2 / q1)) / (1.0 - sqrt(q2 / q1)); -} - -inline ld ElectricCharge::magnitudeOfForceOn_q( - const ld qx4, const ld lSide, const ld q1, const ld theta = 45.0 -) -{ - return ((8.0 * _k_ * qx4 * q1) / (lSide * lSide)) * sin(theta * RADIAN); -} - -inline ld ElectricCharge::electricFieldAtLocation( - const ld qb, const ld qm, const ld l -) -{ - return (_k_ / (l * l)) * (sqrt(2) * qb + (qb / 2.0) - 2 * qm); -} - -inline std::vector ElectricCharge::electricFieldAtCenterTriangle( - const ld qa, const ld qb, const ld qc, const ld l -) -{ - std::vector results = {0.0, 0.0}; - const ld sr_rthx = 3.0 * sqrt(3); - //cout << "3*srty3: " << sr_rthx << endl; - const ld y = sr_rthx * _k_; - //cout << "ktimessqrt3: " << y << endl; - const ld z = 2 * (l * l); - //cout << "2timeslength: " << z << endl; - const ld w = y / z; - //cout << "topdividedbybottom: " << w << endl; - const ld j = abs(qb) + abs(qc); - //cout << "qb+qc: " << j << endl; - const ld Ex = w * j; - //cout << "Ex: " << Ex << endl; - const ld Ey = ((3.0 * _k_) / (l * l)) * (-qa - abs((qb / 2)) + abs((qc / 2)) - ); - //cout << "Ey: " << Ey << endl; - results[0] = sqrt((Ex * Ex) + (Ey * Ey)); - results[1] = atan((Ey / Ex)) * 180 / _pi_; - - return results; -} - -constexpr ld ElectricCharge::electrons( - const ld baseNumber, const ld su -) -{ - return (baseNumber * su) / _ELECTRON_CHARGE_; -} - -inline ld ElectricCharge::netElectronCount( - const ld protons, const ld netCharge -) -{ - return protons + ((-abs(netCharge)) / _PROTON_CHARGE_); -} +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_ELECTRICCHARGE_H +#define PHYSICSFORMULA_ELECTRICCHARGE_H +/** + * @class ElectricCharge + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @dateBuilt 12/31/2020 + * @lastEdit 2/8/2021 + */ +#include +#include + +#include "Vector2D.h" +typedef long double ld; + +/// +/// The meters light travels in one light year +/// +constexpr auto METERS_1LY = 9460730472580800; + +//pi = 3.14159265359 +constexpr auto _pi_ = 3.14159265359; +/// +/// Vacuum permittivity, commonly denoted ε0 (pronounced as "epsilon nought" +/// or "epsilon zero") is the value of the absolute dielectric permittivity +/// of classical vacuum. +/// +constexpr auto _e0_ = 8.854187819013e-12; // 8.8542e-12 +/// +/// Coulombs constant 8.988 * pow(10.0, 9)Nm^2)/C^2 +/// +constexpr auto _k_ = 8.9875517923e9; //8.988 * pow(10.0, 9)Nm^2)/C^2 +constexpr auto _K_ = 1.0 / (4.0 * _pi_ * _e0_); +/// +/// The electron = -1.6 * 10^-19 C +/// +constexpr auto _ELECTRON_CHARGE_ = -(1.602176634e-19); //-1.6e-19 + +/// +/// The proton = 1.6 * 10^-19C +/// +constexpr auto _PROTON_CHARGE_ = 1.602176634e-19; // 1.6e-19 +constexpr auto _COULOMB_ = 1.0 / (_ELECTRON_CHARGE_); + +constexpr auto _ELECTRON_MASS_ = 9.1093837015e-31; //9.11e-31 +constexpr auto _PROTON_MASS_ = 1.67262e-27; //1.673e-27 + +constexpr auto _PLANKS_J_ = 6.62607004e-34; +constexpr auto _PLANKS_EM_ = 4.14e-15; +constexpr auto _PLANKS_C_ = _PLANKS_EM_ * 2.99792e8; + +static int electricCharge_objectCount = 0; + +static struct ScientificNotationUnits +{ + typedef ScientificNotationUnits snu; + ld refVal; + const ld YOTTA = pow(10, 24); //10^24 + const ld ZETTA = pow(10, 21); //10^21 + const ld EXA = pow(10, 18); //10^18 + const ld PETA = pow(10, 15); //10^15 + const ld TERA = pow(10, 12); //10^12 + const ld GIGA = pow(10, 9); //10^9 + const ld MEGA = pow(10, 6); //10^6 + const ld KILO = pow(10, 3); //10^3 + const ld HECTO = pow(10, 2); //10^2 + const ld DECA = pow(10, 1); //10^1 + const ld DECI = pow(10, -1); //10^-1 + const ld CENTI = pow(10, -2); //10^-2 + const ld MILLA = pow(10, -3); //10^-3 + const ld MICRO = pow(10, -6); //10^-6 + const ld NANO = pow(10, -9); //10^-9 + const ld PICO = pow(10, -12); //10^-12 + const ld FEMTO = pow(10, -15); //10^-15 + const ld ATTO = pow(10, -18); //10^-18 + const ld ZEPTO = pow(10, -21); //10^-21 + const ld YOCTO = pow(10, -24); //10^-24 + friend snu operator+(const snu &r, const snu &l) + { return l.refVal + r.refVal; } + snu operator+(ld rhs)const + { return this->refVal + rhs; } + friend snu operator-(const snu &r, const snu &l) + { return l.refVal - r.refVal; } + snu operator-(ld rhs)const + { return this->refVal - rhs; } + friend snu operator*(const snu &r, const snu &l) + { return l.refVal * r.refVal; } + snu operator*(ld rhs)const + { return this->refVal * rhs; } + friend snu operator/(const snu &r, const snu &l) + { return l.refVal / r.refVal; } + snu operator/(ld rhs)const + { return this->refVal / rhs; } + ScientificNotationUnits() + { + refVal = 0.0; + } + ScientificNotationUnits(ld v) + { + refVal = v; + } + ~ScientificNotationUnits() = default; +} SU; + + +class ElectricCharge +{ +public: + ElectricCharge* _electricChargePtr; + + ElectricCharge() + { + _electricChargePtr = nullptr; + _electricChargeVal = 0.0; + countIncrease(); + } + + ElectricCharge(ld val) + { + _electricChargePtr = nullptr; + _electricChargeVal = 0.0; + countIncrease(); + } + + /** + * @brief copy constructor + */ + ElectricCharge(const ElectricCharge& t) + { + _electricChargePtr = t._electricChargePtr; + _electricChargeVal = t._electricChargeVal; + countIncrease(); + } + + /** + * #brief move constructor + */ + ElectricCharge(ElectricCharge&& t) noexcept + { + _electricChargePtr = t._electricChargePtr; + _electricChargeVal = t._electricChargeVal; + countIncrease(); + } + + /** + * @brief copy assignment operator + */ + ElectricCharge& operator=(const ElectricCharge& t) + { + if (this != &t) + { + _electricChargePtr = t._electricChargePtr; + _electricChargeVal = t._electricChargeVal; + countIncrease(); + } + return *this; + } + + static void show_objectCount() + { + std::cout << "\n electric charge object count: " << + electricCharge_objectCount << std::endl; + } + + static int get_objectCount() { return electricCharge_objectCount; } + + /// + /// Crates mass from energy. + /// + /// The energy. + /// The c. + /// energy + static constexpr ld massFromEnergy(ld E, ld c); + /// + /// Masses from energy. + /// + /// The electrons mass. + /// energy + static constexpr ld massFromEnergy(ld M); + + /// + /// Totals the electron mass. + /// + /// The total electrons. + /// mass of electrons in kg + static constexpr ld totalElectronMass(ld Ne); + + /// + /// Totals the proton mass. + /// + /// The total protons. + /// mass of protons in kg + static constexpr ld totalProtonMass(ld Np); + + /// + /// Totals the mass. + /// + /// The total electrons. + /// The total protons. + /// the total mass of protons and electrons + static constexpr ld totalMass(ld Ne, ld Np); + + /// + /// Calculates the magnitude between two electrostatic forces q1 and q2 + /// + /// The q1. + /// The q2. + /// The r. + /// + static constexpr ld electrostaticForce(ld q1, ld q2, ld r); + + /// + /// Charges the of electrostatic force equal point charges. + /// + /// The q. + /// The mass. + /// The r. + /// + static ld chargeOfElectrostaticForce_equalPointCharges(ld q, ld mass, ld r); + + /// + /// Electrics the field e. + /// + /// The q. + /// The r. + /// + static constexpr ld electricFieldForce(ld Q, ld r); + + /// + /// calculates the force by an electric field and current + /// + /// The current. + /// The electric field strength. + /// + static constexpr ld forceByElectricField(ld q, ld E); + + /// + /// Calculates the electrons needed to form a charge of baseNumber to the + /// su power. + /// + /// The base number. + /// The scientific notation multiple. + /// number of electrons + static constexpr ld electrons(ld baseNumber, ld su); + + /// + /// Electrons the count. + /// + /// The protons. + /// The net charge. + /// + static ld netElectronCount(ld protons, ld netCharge); + + /// + /// Coulombs the specified base number. + /// + /// The base number. + /// The su. + /// + static constexpr ld coulombs(ld baseNumber, ld su); + + /// + /// Hows the many fewer electrons then protons. + /// + /// The net charge. + /// + static ld howManyFewerElectronsThenProtons(ld netCharge); + + /// + /// Fractions the protons no electrons. + /// + /// The protons. + /// The net charge. + /// + static ld fractionProtonsNoElectrons(ld protons, ld netCharge); + + /// + /// Forces the change two point charges. + /// + /// The f. + /// The factor change. + /// + static constexpr ld forceChangeTwoPointCharges(ld F, ld factorChange); + + /// + /// Electrics the field. + /// + /// The force. + /// The charge. + /// + static constexpr ld electricField(ld F, ld q); + + /// + /// Calculates the magnitude of a point charge that creates a electric field + /// force of F, at a distance of r meters. + /// + /// The force of the electric field in N/C. + /// The distance it causes this force. + /// magnitude of the point charge (C) + static constexpr ld magnitudePointCharge(ld E, ld r); + + /// + /// Calculates the charge of a point particle having a force of F acting on + /// it with a electric field strength of E at its location. + /// + /// The force acting on a charge. + /// The electric field strength. + /// + static constexpr ld charge(const ld F, const ld E); + + + + /// + /// Separations the between point charges. + /// + /// point charge 1. + /// point charge 2. + /// The Force in Newtons. + /// + static ld separationBetweenPointCharges(ld q1, ld q2, ld F); + + /// + /// Hows the many electrons. + /// + /// The total particles. + /// The net charge. + /// + static constexpr ld howManyElectrons(ld totalParticles, ld netCharge); + + /// + /// Minimums the charge to lift object. + /// + /// The radius. + /// The charge. + /// The mass. + /// + static constexpr ld minimumChargeToLiftObject(ld r, ld charge, ld m); + + /// + /// A wrecking yard inventor wants to pick up cars by charging a ball + /// of radius r (d/2) by inducing an equal and opposite charge on the car. + /// If a car has a mass of m kg and the ball is to be able to lift it from + /// a distance of l meters away, What minimum charge must be used? + /// + /// The radius of bass. + /// The length of initial lift . + /// The mass. + /// the minimum charge needed in C + static ld minimumChargeToLiftCar(ld r, ld l, ld m); + + /// + /// Superposition principle. Adding charges up. + /// + /// The f1. + /// The f2. + /// The f3. + /// The f4. + /// The f5. + /// The f6. + /// net charge + static constexpr ld superpositionPrinciple + (ld f1, ld f2, ld f3, ld f4, ld f5, ld f6); + + /// + /// Distance between points. + /// + /// The q1. + /// The q2. + /// The f. + /// + static ld distanceBetweenPoints(ld q1, ld q2, ld F); + + /// + /// Angles the vertical axis. + /// + /// The force of the electric field. + /// The mass. + /// + static ld angleVerticalAxis(ld Fe, ld mass); + + /// + /// Two raindrops with equal masses of m are in a thunderhead r meters apart + /// when they each acquire charges of q1 and q2. Find their acceleration. + /// + /// The mass. + /// The distance between particles. + /// The charge on particle 1. + /// The charge on particle 2. + /// acceleration in m/s^2 + static constexpr ld accelerationOfParticles(ld m, ld r, ld q1, ld q2); + + /// + /// Calculate the electric field strength near a conducting sphere with a + /// d diameter of d meters that has q_excess amount of excess charge on it. + /// + /// The diameter. + /// The excess charge. + /// Electric field strength + static constexpr ld electricFieldStrength(ld d, ld q_excess); + + /// + /// A charged insulating ball of mass m hangs on a long string with a length + /// that don't matter, in a uniform horizontal electric field. + /// Given the charge on the ball is q Coulombs, find the strength of the field. + /// + /// The mass. + /// The angle theta. + /// The charge of the mass. + /// the strength of the electric field + static ld electricFieldStrength(ld m, ld theta, ld q); + + /// + /// four equal charges q lie on the corners of a square. A fifth charge Q + /// is on a mass m directly above the center of the square, at a height + /// equal to the length d of one side of the square. + /// Determine the magnitude of q in terms of Q , m , and d , + /// if the Coulomb force is to equal the weight of m. + /// + /// The charge of the center point. + /// The mass in center. + /// The length of a side and height of the center. + /// the charge of the corner points + static ld magnitudeOfq_termsOf_Q_m_d(ld Q, ld m, ld d); + + /// + /// Calculate the angular velocity Ω of an electron orbiting a proton in + /// the hydrogen atom, given the radius of the orbit is r meters. + /// You may assume that the proton is stationary and the centripetal + /// force is supplied by Coulomb attraction. + /// + /// The radius. + /// The mass electron. + /// The charge of electron. + /// angular velocity (rad/s) + static ld angularVelocityOfElectronOrbitingProton(ld r, ld m, ld q); + + /// + /// Point charges of q1C and q2 C are placed l meters apart. Where can a + /// third charge be placed so that the net force on it is zero? + /// + /// The distance between the two particles. + /// The charge of particle 1. + /// The charge of particle 2. + /// the distance to place the third particle + static ld distanceToPlaceThirdChargeToMakeZero(ld l, ld q1, ld q2); + + /// + /// Using the symmetry of the arrangement, determine the direction of the + /// force on q which is in the center of a square with four point charges of + /// equal charges of positive q1 and q2 in top corners and negative q3 + /// and q4 in bottom corners, given that qa=qb=+qx4 C and qc=qd=−qx4 C. + /// Calculate the magnitude of the force on the charge q , given that the + /// square is l meters on a side and q=q1 C + /// + /// The charge of the four corners. + /// The length of a side. + /// The charge in the center point. + /// the angle. + /// force on the point q + static ld magnitudeOfForceOn_q(ld qx4, ld lSide, ld q1, ld theta); + + /// + /// Find the electric field at the location of qa in Figure 18.52 given + /// that qb=qc=qd=+qb C, q=−qm nC, and the square is l cm on a side. + /// + /// The charge of 3 particles. + /// The charge on the middle particle. + /// The length of a side. + /// the electric field force n N/C + static ld electricFieldAtLocation(ld qb, ld qm, ld l); + + /// + /// Electrics the field at center triangle. + /// + /// The qa. + /// The qb. + /// The qc. + /// The l. + /// + static std::vector electricFieldAtCenterTriangle(ld qa, ld qb, ld qc, ld l); + + void setElectricChargeVal(ld val) { _electricChargeVal = val; } + + + ~ElectricCharge() + { + delete _electricChargePtr; + } + +private: + static void countIncrease() { electricCharge_objectCount += 1; } + static void countDecrease() { electricCharge_objectCount -= 1; } + ld _electricChargeVal; +}; +#endif //PHYSICSFORMULA_ELECTRICCHARGE_H + +constexpr ld ElectricCharge::massFromEnergy(const ld E, const ld c) +{ + return E / (c * c); +} + +constexpr ld ElectricCharge::massFromEnergy(const ld M) +{ + return 2.0 * M; +} + +constexpr ld ElectricCharge::totalElectronMass(const ld Ne) +{ + return Ne * _ELECTRON_MASS_; +} + +constexpr ld ElectricCharge::totalProtonMass(const ld Np) +{ + return Np * _PROTON_MASS_; +} + +constexpr ld ElectricCharge::totalMass(const ld Ne, const ld Np) +{ + return totalElectronMass(Ne) + totalProtonMass(Np); +} + +constexpr ld ElectricCharge::electrostaticForce( + const ld q1, const ld q2, const ld r +) +{ + return (_k_ * q1 * q2) / (r * r); +} + +inline ld ElectricCharge::chargeOfElectrostaticForce_equalPointCharges( + const ld q, const ld mass, const ld r +) +{ + return r * (sqrt((mass * _Ga_) / _k_)); +} + +constexpr ld ElectricCharge::electricFieldForce( + const ld Q, const ld r +) +{ + return (_k_ * Q) / (r * r); +} + +constexpr ld ElectricCharge::forceByElectricField( + const ld q, const ld E +) +{ + return q * E; +} + +constexpr ld ElectricCharge::coulombs( + const ld baseNumber, const ld su +) +{ + return baseNumber * su * _PROTON_CHARGE_; +} + +inline ld ElectricCharge::howManyFewerElectronsThenProtons( + const ld netCharge +) +{ + return netCharge / abs(_ELECTRON_CHARGE_); +} + +inline ld ElectricCharge::fractionProtonsNoElectrons( + const ld protons, const ld netCharge +) +{ + const ld temp = howManyFewerElectronsThenProtons(netCharge); + return temp / protons; +} + +constexpr ld ElectricCharge::forceChangeTwoPointCharges( + const ld F, const ld factorChange +) +{ + return F / (factorChange * factorChange); +} + +constexpr ld ElectricCharge::electricField( + const ld F, const ld q +) +{ + return F / q; +} + +constexpr ld ElectricCharge::magnitudePointCharge( + const ld E, const ld r +) +{ + return ((r * r) * E) / _k_; +} + +constexpr ld ElectricCharge::charge(const ld F, const ld E) +{ + return F / E; +} + +inline ld ElectricCharge::separationBetweenPointCharges( + const ld q1, const ld q2, const ld F +) +{ + return sqrt((_k_ * (q1 * q2)) / F); +} + +constexpr ld ElectricCharge::howManyElectrons( + const ld totalParticles, const ld netCharge +) +{ + const ld NeMinusNp = netCharge / _ELECTRON_CHARGE_; + const ld total = totalParticles + NeMinusNp; + const ld Ne = total / 2.0; + + return Ne; +} + +constexpr ld ElectricCharge::minimumChargeToLiftObject( + const ld r, const ld charge, const ld m +) +{ + return (m * _Ga_ * (r * r)) / (_k_ * charge); +} + +inline ld ElectricCharge::minimumChargeToLiftCar( + const ld r, const ld l, const ld m +) +{ + return (r + l) * sqrt((m * _Ga_) / _k_); +} + +constexpr ld ElectricCharge::superpositionPrinciple( + const ld f1 = 0, const ld f2 = 0, const ld f3 = 0, const ld f4 = 0, + const ld f5 = 0, const ld f6 = 0 +) +{ + return f1 + f2 + f3 + f4 + f5 + f6; +} + +inline ld ElectricCharge::distanceBetweenPoints( + const ld q1, const ld q2, const ld F +) +{ + return sqrt((_k_ * abs(q1) * abs(q2)) / F); +} + +inline ld ElectricCharge::angleVerticalAxis( + const ld Fe, const ld mass +) +{ + return atan((Fe / (mass * _Ga_))) * DEGREE; +} + +constexpr ld ElectricCharge::accelerationOfParticles( + const ld m, const ld r, const ld q1, const ld q2 +) +{ + return (_k_ * (q1 * q2)) / (m * (r * r)); +} + +constexpr ld ElectricCharge::electricFieldStrength(const ld d, const ld q_excess) +{ + return (4.0 * _k_ * q_excess) / (d * d); +} + +inline ld ElectricCharge::electricFieldStrength( + const ld m, const ld theta, const ld q +) +{ + return (m * _Ga_ * tan(theta * RADIAN)) / q; +} + +inline ld ElectricCharge::magnitudeOfq_termsOf_Q_m_d( + const ld Q, const ld m, const ld d +) +{ + return (3.0 * sqrt(6.0) * (d * d) * m * _Ga_) / (16.0 * _k_ * Q); +} + +inline ld ElectricCharge::angularVelocityOfElectronOrbitingProton( + const ld r, const ld m, const ld q +) +{ + return q * sqrt((_k_) / (m * r)); +} + +inline ld ElectricCharge::distanceToPlaceThirdChargeToMakeZero( + const ld l, const ld q1, const ld q2 +) +{ + return (l * sqrt(q2 / q1)) / (1.0 - sqrt(q2 / q1)); +} + +inline ld ElectricCharge::magnitudeOfForceOn_q( + const ld qx4, const ld lSide, const ld q1, const ld theta = 45.0 +) +{ + return ((8.0 * _k_ * qx4 * q1) / (lSide * lSide)) * sin(theta * RADIAN); +} + +inline ld ElectricCharge::electricFieldAtLocation( + const ld qb, const ld qm, const ld l +) +{ + return (_k_ / (l * l)) * (sqrt(2) * qb + (qb / 2.0) - 2 * qm); +} + +inline std::vector ElectricCharge::electricFieldAtCenterTriangle( + const ld qa, const ld qb, const ld qc, const ld l +) +{ + std::vector results = {0.0, 0.0}; + const ld sr_rthx = 3.0 * sqrt(3); + //cout << "3*srty3: " << sr_rthx << endl; + const ld y = sr_rthx * _k_; + //cout << "ktimessqrt3: " << y << endl; + const ld z = 2 * (l * l); + //cout << "2timeslength: " << z << endl; + const ld w = y / z; + //cout << "topdividedbybottom: " << w << endl; + const ld j = abs(qb) + abs(qc); + //cout << "qb+qc: " << j << endl; + const ld Ex = w * j; + //cout << "Ex: " << Ex << endl; + const ld Ey = ((3.0 * _k_) / (l * l)) * (-qa - abs((qb / 2)) + abs((qc / 2)) + ); + //cout << "Ey: " << Ey << endl; + results[0] = sqrt((Ex * Ex) + (Ey * Ey)); + results[1] = atan((Ey / Ex)) * 180 / _pi_; + + return results; +} + +constexpr ld ElectricCharge::electrons( + const ld baseNumber, const ld su +) +{ + return (baseNumber * su) / _ELECTRON_CHARGE_; +} + +inline ld ElectricCharge::netElectronCount( + const ld protons, const ld netCharge +) +{ + return protons + ((-abs(netCharge)) / _PROTON_CHARGE_); +} diff --git a/ElectricCurrent.h b/ElectricCurrent.h index 2ffb8f4..7f0c25c 100644 --- a/ElectricCurrent.h +++ b/ElectricCurrent.h @@ -1,951 +1,951 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_ELECTRICCURRENT_H -#define PHYSICSFORMULA_ELECTRICCURRENT_H -#pragma once -/** - * @class ElectricCurrent - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @dateBuilt 12/31/2020 - * @lastEdit 12/31/2020 - */ -#include "ElectricPotential.h" - - -#include - -//#include "Circuits.h" - -[[maybe_unused]] static struct Resistivities -{ - const ld SILVER = 1.59 * pow(10, -8); //1.59e-8 conductor, OHm*m - const ld COPPER = 1.72 * pow(10, -8); //1.72e-8 conductor, OHm*m - const ld GOLD = 2.44 * pow(10, -8); //2.44e-8 conductor, OHm*m - const ld ALUMINUM = 2.65 * pow(10, -8); //conductor, OHm*m - const ld TUNGSTEN = 5.6 * pow(10, -8); //conductor, OHm*m - const ld IRON = 9.71 * pow(10, -8); //conductor, OHm*m - const ld PLATINUM = 10.6 * pow(10, -8); //conductor, OHm*m - const ld STEEL = 20.0 * pow(10, -8); //conductor, OHm*m - const ld LEAD = 22.0 * pow(10, -8); //conductor, OHm*m - const ld MANGANIN = 44.0 * pow(10, -8); //conductor, OHm*m - const ld CONSTANTAN = 49.0 * pow(10, -8); //conductor, OHm*m - const ld MERCURY = 96.0 * pow(10, -8); //conductor, OHm*m - const ld NICHROME = 100.0 * pow(10, -8); //conductor, OHm*m - - const ld CARBON_PURE = 3.5 * pow(10, 5); //semiconductor, OHm*m - /// - /// The CARBON variable can be between 3.5 and 60 * 10^5 OHm*m. there is a - /// setCARBON method you can use to adjust its value. Its not checked so if you - /// put in a invalid number its on you, your calculation will be wrong. In the - /// argument only pass the first part, example 18.7. not 18.7*10^5. that gets added - /// automatically. - /// - ld CARBON = 10 * pow(10, 5); //semiconductor, OHm*m - /// - /// Sets the carbon variable. - /// - /// The value passed should be between 3.5 and 60. - void setCARBON(ld value) { CARBON = value * pow(10, 5); } - - const ld GERMANIUM_PURE = 600.0 * pow(10, -3); //semiconductor, OHm*m - /// - /// The GERMANIUM variable can be between 1 and 600 * 10^5 OHm*m. there is a - /// setGERMANIUM method you can use to adjust its value. Its not checked so if you - /// put in a invalid number its on you, your calculation will be wrong. In the - /// argument only pass the first part, example 18.7. not 18.7*10^-3. that gets added - /// automatically. - /// - ld GERMANIUM = 300 * pow(10, -3); //semiconductor, OHm*m - /// - /// Sets the GERMANIUM variable. - /// - /// The value passed should be between 1 and 600. - void setGERMANIUM(ld value) { GERMANIUM = value * pow(10, -3); } - - const ld SILICON_PURE = 2300; //2300semiconductor, OHm*m - /// - /// The SILICON variable can be between .1 and 2300 OHm*m. there is a - /// setSILICON method you can use to adjust its value. Its not checked so if you - /// put in a invalid number its on you, your calculation will be wrong. - /// - ld SILICON = .1; // .1 - 2300 semiconductor, OHm*m - /// - /// Sets the Silicon variable. - /// - /// The value passed should be between .1 and 2299. - void setSILICON(ld value) { SILICON = value * pow(10, -3); } - - const ld AMBER = 5.0 * pow(10, 14); // insulator, OHm*m - - /// - /// The GLASS variable can be between 10^9 and 10^14 OHm*m. there is a - /// setGLASS method you can use to adjust its value. Its not checked so if you - /// put in a invalid number its on you, your calculation will be wrong. - /// - ld GLASS = pow(10,9); //semiconductor, OHm*m - /// - /// Sets the GLASS variable. - /// - /// The value passed should be between 10^9 - 10^14. - void setGLASS(ld value) { GLASS = pow(10, value); } - - /// - /// The WOOD variable can be between 10^8 and 10^11 OHm*m. there is a - /// setWOOD method you can use to adjust its value of the power. Its not checked so if you - /// put in a invalid number its on you, your calculation will be wrong. - /// - ld WOOD = pow(10, 9); // 10^X conductor, OHm*m - /// - /// Sets the GLASS variable. - /// - /// The value passed should be between 10^9 - 10^14. - void setWOOD(ld X) { GLASS = pow(10, X); } - - -}resistivity; - - -static struct TemperatureCoefficientsOfResistivity -{ - const ld SILVER = 3.8 * pow(10, -3); //3.8e-3 1/C - const ld COPPER = 3.9 * pow(10, -3); //3.9e-3 1/C - const ld GOLD = 3.4 * pow(10, -3); //3.4e-3 1/C - const ld ALUMINUM = 3.9 * pow(10, -3); //3.9e-3 1/C - const ld TUNGSTEN = 4.5 * pow(10, -3); //4.5e-3 1/C - const ld IRON = 5.0 * pow(10, -3); //5.0e-3 1/C - const ld PLATINUM = 3.93 * pow(10, -3); //3.93e-3 1/C - const ld LEAD = 3.9 * pow(10, -3); //3.9e-3 1/C - const ld MANGANIN = .000 * pow(10, -3); //.0000e-3 1/C - const ld CONSTANTAN = 0.002 * pow(10, -3); //.002e-3 1/C - const ld MERCURY = .89 * pow(10, -3); //.89e-3 1/C - const ld NICHROME = .4 * pow(10, -3); //.4e-3 1/C - const ld CARBON = -.5 * pow(10, -3); //-.5e-3 1/C - const ld GERMANIUM = -50 * pow(10, -3); //-50e-3 1/C - const ld SILCONE = -70 * pow(10, -3); //-70e-3 1/C - -}tempCoefResistivity; - -static struct AWGWireSizesByGauge -{ - const ld AWG0000 = 11.6840*pow(10, -3);// 11.6840mm diameter - const ld AWG000 = 10.4038*pow(10, -3);// 10.4038mm diameter - const ld AWG00 = 9.2659*pow(10, -3);// 9.2659mm diameter - const ld AWG0 = 8.2525*pow(10, -3);// 8.2525mm diameter - const ld AWG1 = 7.3482*pow(10, -3);// 7.3482mm diameter - const ld AWG2 = 6.5430*pow(10, -3);// 6.5430mm diameter - const ld AWG3 = 5.8268*pow(10, -3);// 5.8268mm diameter - const ld AWG4 = 5.1892*pow(10, -3);// 5.1892mm diameter - const ld AWG5 = 4.6203*pow(10, -3);// 4.6203mm diameter - const ld AWG6 = 4.1148*pow(10, -3);// 4.1148mm diameter - const ld AWG7 = 3.6652*pow(10, -3);// 3.6652mm diameter - const ld AWG8 = 3.2639*pow(10, -3);// 3.2639mm diameter - const ld AWG9 = 2.9058*pow(10, -3);// 2.9058mm diameter - const ld AWG10 = 2.5883*pow(10, -3);// 2.5883mm diameter - const ld AWG11 = 2.3038*pow(10, -3);// 2.3038mm diameter - const ld AWG12 = 2.0523*pow(10, -3);// 2.0523mm diameter - const ld AWG13 = 1.8288*pow(10, -3);// 1.8288mm diameter - const ld AWG14 = 1.6281*pow(10, -3);// 1.6281mm diameter - const ld AWG15 = 1.4503*pow(10, -3);// 1.4503mm diameter - const ld AWG16 = 1.2903*pow(10, -3);// 1.2903mm diameter - const ld AWG17 = 1.1506*pow(10, -3);// 1.1506mm diameter - const ld AWG18 = 1.0236*pow(10, -3);// 1.0236mm diameter - const ld AWG19 = 0.9119*pow(10, -3);// 0.9119mm diameter - const ld AWG20 = 0.8128*pow(10, -3);// 0.8128mm diameter - const ld AWG21 = 0.7239*pow(10, -3);// 0.7239mm diameter - const ld AWG22 = 0.6452*pow(10, -3);// 0.6452mm diameter - const ld AWG23 = 0.5740*pow(10, -3);// 0.5740mm diameter - const ld AWG24 = 0.5105*pow(10, -3);// 0.5105mm diameter - const ld AWG25 = 0.4547*pow(10, -3);// 0.4547mm diameter -}AWG; - -//static object counter for ElectricCurrent class -static int electricCurrent_objectCount = 0; - - -class ElectricCurrent -{ -public: - ElectricCurrent* _electricCurrentPtr; - - - ElectricCurrent() - { - _electricCurrentPtr = nullptr; - _electricCurrentVal = 0.0; - countIncrease(); - //cout << "in electicCurrent count: " << electricCurrent_objectCount << endl; - } - - ElectricCurrent(ld val) - { - _electricCurrentPtr = nullptr; - _electricCurrentVal = 0.0; - countIncrease(); - - } - - /** - * @brief copy constructor - */ - ElectricCurrent(const ElectricCurrent& t) - { - _electricCurrentPtr = t._electricCurrentPtr; - _electricCurrentVal = t._electricCurrentVal; - countIncrease(); - } - /** - * #brief move constructor - */ - ElectricCurrent(ElectricCurrent&& t) noexcept - { - _electricCurrentPtr = t._electricCurrentPtr; - _electricCurrentVal = t._electricCurrentVal; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - ElectricCurrent& operator=(const ElectricCurrent& t) - { - if (this != &t) - { - _electricCurrentPtr = t._electricCurrentPtr; - _electricCurrentVal = t._electricCurrentVal; - countIncrease(); - } - return *this; - } - - static void show_objectCount() { std::cout << "\n electric current object count: " << electricCurrent_objectCount << std::endl; } - static int get_objectCount() { return electricCurrent_objectCount; } - - - /// - /// calculates the area using the radius. - /// - /// The radius. - /// area(m^2) - static ld area_r(const ld r); - - /// - /// Calculates the area from the diameter - /// - /// The diameter. - /// area(m^2) - static ld area_d(const ld d); - - /// - /// calculates the electric current (I) defined as the rate at which charge - /// (Q) flows through a given time (t). - /// - /// The change in current. - /// The time over which current passes through. - /// the electric current SI unit of ampere (A) - static ld electricCurrent(const ld Q, const ld t); - - /// - /// Times it takes charge Q to flow through a current of I amperes - /// - /// The charge. - /// The current. - /// time in seconds - static ld timeItTakesChargeToFlow(const ld Q, const ld I); - - /// - /// Calculates the Electrics charge Q - /// - /// The current. - /// The time in seconds. - /// the charge in coulombs - static ld electricCharge(const ld I, const ld t); - - /// - /// Calculates the current (I) using the number of free charges(n) per unit - /// volume (Ax) where the charge per n is given by q and t is the unit time. - /// I = (q * n * Ax) / t; - /// - /// The charge. - /// The number of free charges. - /// The volume of segment Ax is the area * distance - /// where for a circle would be pi*r^2 * x where x is the length. - /// The unit time the charge is moved over. - /// The current - static ld current_qnAx_t(const ld q, const ld n, const ld Ax, const ld t); - - /// - /// Calculates the current (I) using the number of free charges(n) per unit - /// volume(A) each carrying a charge of q with a drift velocity of vd. - /// - /// The number of free charges. - /// The charge on each. - /// the area. - /// The drift velocity. - /// the current - static ld current_nqAvd(const ld n, const ld q, const ld A, const ld vd); - - /// - /// Calculates the currents using ohms law of voltage over resistances. - /// - /// The voltage. - /// The resistance. - /// current in Amperes - static ld current_ohms(const ld V, const ld R); - - /// - /// Calculates the current from rearranging the power equations - /// - /// The power in watts. - /// The resistance. - /// the current in amperes(I) - static ld current_fromPowerEq(const ld P, const ld R); - - /// - /// Calculates the currents from power and volts. - /// - /// The power in watts. - /// The volts. - /// - static ld current_fromPowerAndVolts(const ld P, const ld V); - - /// - /// calculates the resistances of an ohmic conducting material - /// - /// The volts. - /// The current (A). - /// (V/A)one volt per Ampere - static ld resistance_ohmic(const ld V, const ld I); - - /// - /// Calculates the resistance of resistor with a resistivity of p and a - /// length of l with a area of A(pir^2, in a circular resistor). - /// - /// The resistivity. - /// The length. - /// The cross sectional area. - /// Resistance Ohms - static ld resistanceUsingResistivity(const ld p, const ld l, const ld A); - - /// - /// calculates the resistance of a piece of wire with a length of l, - /// having a diameter of d and a resistivity of p, which depends on the - /// material its made from. copper is a p = 1.72e-8 Ohms/m - /// - /// The resistivity. - /// The length. - /// The diameter. - /// the resistance in Ohms - static ld resistanceUsingResistivityWire(const ld p, const ld l, const ld d); - - /// - /// calculates the cross sectional areas the of a resistor. - /// - /// The resistivity. - /// The Resistance. - /// The length. - /// area of resistor (m^2) - static ld areaOfResistor(const ld p, const ld R, const ld l); - - /// - /// Calculates the length of a resistor. - /// - /// the cross sectional area. - /// The resistance. - /// The resistivity. - /// the length of resistor (m) - static ld lengthOfResistor(const ld A, const ld R, const ld p); - - - /// - /// Calculates the Lengths of filament. - /// - /// The diameter. - /// The resistance. - /// The resistivity. - /// - static ld lengthOfFilament(const ld d, const ld R, const ld p); - - /// - /// As part of a class project you are given m g of copper and asked - /// to fabricate a wire with uniform cross-section. You use up 95% of the - /// copper and make a wire with a resistance of 0.800 Ω. The resistivity - /// of copper is 1.72 10-8 Ω · m and its density is 8.92 103 kg/m3 - /// - /// The mass. - /// The resistance. - /// The resistivity. - /// The density. - /// length of wire - static ld lengthOfWireMade(const ld m, const ld R, const ld p, const ld pd); - - /// - /// Calculates the resistivity of a resistor. - /// - /// The resistance. - /// area. - /// The length. - /// - static ld resistivityOfResistor(const ld R, const ld A, const ld l); - - /// - /// Of what material is a wire made, if it is a length of (l)m long with a - ///(d)m diameter and has a resistance of R ohms at 20.0∘C - /// - /// The length. - /// The diameter. - /// The resistance. - /// Ohm m - static ld resistivity(const ld l, const ld d, const ld R); - - /// - /// Calculates the voltages drop across a resistor. - /// - /// The current (Amperes). - /// The resistance. - /// The voltage - static ld voltageDropAcrossResistor(const ld I, const ld R); - - /// - /// Calculates the drifts the velocity (V_d) of a common wire. - /// - /// The charge. - /// The diameter. - /// The current (Amperes). - /// The density per kg/m^3. - /// The atomic mass. - /// drift velocity m/s - static ld driftVelocity_commonWire(const ld q, const ld diameter, const ld I, const ld p, const ld mass); - - /// - /// Drifts the velocity common wire n. - /// - /// The number of electrons per cubic meter. - /// The charge. - /// The diameter. - /// The current. - /// drift velocity m/s - static ld driftVelocity_commonWire_n(const ld n, const ld q, const ld diameter, const ld I); - - /// - /// Calculates the crosses sectional area - /// - /// The resistivity. - /// The length. - /// The resistance. - /// cross sectional area (m^2) - static ld crossSectionalArea(const ld p, const ld l, const ld R); - - /// - /// Calculates the change in resistances from the effects of a - /// change in temperature. - /// - /// The initial cold resistance - /// The temperature coefficients of resistivity. - /// The change in the temperature. - /// the new resistance in Ohms - static ld resistanceChangeFromTemperature(const ld R0, const ld tCoR, const ld tempChange); - - - - /// - /// calculates the electrical power from current and volts - /// - /// The current. - /// The volts. - /// energy from electrical(W) - static ld electricalPowerAndEnergy_IV(const ld I, const ld V); - - /// - /// calculates the electrical power from volts and resistance - /// - /// The volts. - /// The resistance. - /// energy from electrical (W) - static ld electricalPowerAndEnergy_V2R(const ld V, const ld R); - - /// - /// Some makes of older cars have 6.00-V electrical systems. (a) What is - /// the hot resistance of a 30.0-W headlight in such a car? - /// - /// The power. - /// The volts. - /// resistance - static ld resistanceFromPowerAndVolts(const ld P, const ld V); - - /// - /// Calculates the resistance from power and current. - /// - /// The power. - /// The current. - /// Ohms - static ld resistanceFromPowerAndCurrent(const ld P, const ld I); - - /// - /// calculates the electrical power from current and resistance - /// - /// The current. - /// The resistance. - /// energy from electrical (W) - static ld electricalPowerAndEnergy_I2R(const ld I, const ld R); - - /// - /// A charge of (Q) C of charge passes through a pocket calculator’s solar - /// cells in t seconds. What is the power output, given the calculator’s - /// voltage output is a voltage of V. - /// - /// The charge. - /// The time. - /// The voltage. - /// the watts - static ld powerOutputOverTime(const ld Q, const ld t, const ld V); - - /// - /// Calculates the total electrons that pass through a charge. - /// - /// The charge in coulombs. - /// Ne, number of electrons - static ld electronsThatPassThroughACharge(const ld Q); - - /// - /// If a large cyclotron directs a beam of freeProtons nuclei onto a target - /// with a beam current of I Amperes. Calculate How many nuclei per second - /// this is. - /// - /// The current. - /// The number of free protons. - /// nuclei/second - static ld nucleiPerSecond(const ld I, const ld freeProtons); - - /// - /// Calculates the ratio of the resistivity of wire1 to that of wire2, if they have - /// the same resistance per unit length (as they might in household wiring) - /// - /// The the bigger resistivity. - /// The smaller resistivity. - /// the ratio meaning the size of the smaller resistivity value will - /// to by this value bigger - static ld ratioOfDiametersInWires(const ld p1, const ld p2); - - /// - /// Calculates the current flows through a diameter of (d) rod with a - /// resistivity of (p) that is a length of (l)m long, when (V) voltage is - /// applied to it? (Such a rod may be used to make nuclear- particle - /// detectors, for example.) - /// - /// The applied voltage. - /// The resistivity. - /// The diameter. - /// The length. - /// the Amperes - static ld currentFlowThroughOfMaterial(const ld V, const ld p, const ld d, const ld l); - - /// - /// A resistor made of Nichrome wire is used in an application where its - /// resistance cannot change more than 1.00% from its value at 20.0∘C . - /// Over what temperature range can it be used? - /// - /// The temperature coefficient of resistivity. - /// The maximum change percent. - /// temperature - static ld maximumTempchange(const ld tempCoEffOfResistivity, const ld maxChangePercent); - - /// - /// With a 1200-W toaster, how much electrical energy is needed to make a - /// slice of toast (cooking time = 1 minute)? At 9.0 cents/kW⋅h, how much does this cost?. - /// - /// The power inWatts. - /// The time in seconds. - /// The rate per KWH. - /// total cost to use electricity - static ld costOfElectricityUsed_kWh(const ld P, const ld t, const ld ratePerKwh); - - /// - /// An old light bulb draws only 50.0 W, rather than its original 60.0 W, - /// due to evaporative thinning of its filament. By what factor is its - /// diameter reduced, assuming uniform thinning along its length? Neglect - /// any effects caused by temperature differences. - /// - /// The starting wattage. - /// The final wattage. - /// factor which diameter decreases - static ld factorDiameterReduced(const ld Pi, const ld Pf); - - /// - /// Calculates the total time. - /// - /// The charge. - /// The power. - /// time - static ld timeTotal(const ld Q, const ld P); - - /// - /// Times the total. - /// - /// The charge . - /// The current. - /// The volts. - /// time - static ld timeTotal(const ld Q, const ld I, const ld V); - - /// - /// How much time is needed for a surgical cauterizer to raise the - /// temperature of m1 g of tissue from 37.0∘C to 100∘C and then boil - /// away 0.500 g of water, if it puts out 2.00 mA at 15.0 kV? Ignore heat - /// transfer to the surroundings. - /// - /// The mass of tissue. - /// The specific heat of water(sub new substance value). - /// The initial temperature. - /// The temperature to raise to. - /// The mass of water to boil. - /// The latent heat of vaporization . - /// The current. - /// The volts. - /// time in seconds - static ld timeToRaiseTemperature(const ld m1, const ld c, const ld Ti, const ld Tf, const ld m2, const ld Lv, const ld I, const ld V); - - /// - /// What is the cost of heating a hot tub containing 1500 kg of water from - /// 10.0∘C to 40.0∘C , assuming 75.0% efficiency to account for heat - /// transfer to the surroundings? The cost of electricity is 9 cents/kW ⋅h . - /// - /// The mass of the water. - /// The specific heat. - /// The initial temp. - /// The final temp. - /// The eff. - /// The rate. - /// cost in cents - static ld costToHeatHotTub(const ld m, const ld c, const ld Ti, const ld Tf, const ld eff, const ld rate); - - /// - /// RMSs the current. - /// - /// The peek current. - /// rms current - static ld rmsCurrent(const ld Io); - - /// - /// Peeks the current. - /// - /// The rms current. - /// - static ld peekCurrent(const ld Irms); - - /// - /// RMSs the voltage. - /// - /// The peek voltage. - /// voltage - static ld rmsVoltage(const ld Vo); - - /// - /// Peeks the voltage. - /// - /// The VRMS. - /// peek volage - static ld peekVoltage(const ld Vrms); - - /// - /// What is the peak power consumption of a Vrms AC microwave oven - /// that draws Irms A? - /// - /// The VRMS. - /// The irms. - /// - static ld peekPower(const ld Vrms, const ld Irms); - - /// - /// Voltages the ac. - /// - /// The peek voltage. - /// The frequency in hertz. - /// The time we are looking to find the voltage at. - /// voltage - static ld voltageAC(const ld Vo, const ld f, const ld t); - - /// - /// Currents the ac. - /// - /// The is the peek current (Io = Vo/R). - /// The frequency in hertz. - /// The time we are looking to find the current at. - /// amperes - static ld currentAC(const ld Io, const ld f, const ld t); - - /// - /// Temporaries the coeff of resistivity. - /// - /// The r. - /// The r o. - /// The t i. - /// The t f. - /// - static ld tempCoeffOfResistivity(const ld R, const ld R_o, const ld T_i, const ld T_f); - - void setElectricCurrentVal(ld val) { _electricCurrentVal = val; } - - ~ElectricCurrent() - { - delete _electricCurrentPtr; - } - -private: - ld _electricCurrentVal; - static void countIncrease() { electricCurrent_objectCount += 1; } - static void countDecrease() { electricCurrent_objectCount -= 1; } - -}; - -inline ld ElectricCurrent::area_r(const ld r) -{ - return _PI_ * (r*r);//m^2 -} - -inline ld ElectricCurrent::area_d(const ld d) -{ - return _PI_*((d*d)/4);//m^2 -} - -inline ld ElectricCurrent::electricCurrent(const ld Q, const ld t) -{ - return Q / t;//Amperes(I) -} - -inline ld ElectricCurrent::timeItTakesChargeToFlow(const ld Q, const ld I) -{ - return Q / I;//seconds(s) -} - -inline ld ElectricCurrent::electricCharge(const ld I, const ld t) -{ - return I * t;//Coulombs(C) -} - -inline ld ElectricCurrent::current_qnAx_t(const ld q, const ld n, const ld Ax, const ld t) -{ - return (q * n * Ax) / t;//Amperes or Coulombs/second -} - -inline ld ElectricCurrent::current_nqAvd(const ld n, const ld q, const ld A, const ld vd) -{ - return n * q * A * vd;//Amperes or C/s -} - -inline ld ElectricCurrent::current_ohms(const ld V, const ld R) -{ - return V / R;//Amperes(I) -} - -inline ld ElectricCurrent::current_fromPowerEq(const ld P, const ld R) -{ - return sqrt(P/R);//Amperes(I) -} - -inline ld ElectricCurrent::current_fromPowerAndVolts(const ld P, const ld V) -{ - return P/V;//Amperes -} - -inline ld ElectricCurrent::resistance_ohmic(const ld V, const ld I) -{ - return V / I;//Ohms -} - -inline ld ElectricCurrent::resistanceUsingResistivity(const ld p, const ld l, const ld A) -{ - return p*(l / A);//Ohms -} - - -inline ld ElectricCurrent::resistanceUsingResistivityWire(const ld p, const ld l, const ld d) -{ - return p * l * (4.0 / (_PI_ * (d * d)));//Ohms -} - -inline ld ElectricCurrent::areaOfResistor(const ld p, const ld R, const ld l) -{ - return p * (l / R);//m^2 -} - -inline ld ElectricCurrent::lengthOfResistor(const ld A, const ld R, const ld p) -{ - return (A * R) / p;//m -} - -inline ld ElectricCurrent::lengthOfFilament(const ld d, const ld R, const ld p) -{ - return (_PI_*(d*d)*R)/(4.0*p);//meters -} - -inline ld ElectricCurrent::lengthOfWireMade(const ld m, const ld R, const ld p, const ld pd) -{ - return sqrt((m*R)/(pd*p));//m -} - -inline ld ElectricCurrent::resistivityOfResistor(const ld R, const ld A, const ld l) -{ - return (A * R) / l;//Ohms/m -} - -inline ld ElectricCurrent::resistivity(const ld l, const ld d, const ld R) -{ - return (_PI_*(d*d)*R)/(4.0*l);//Ohms meters -} - -inline ld ElectricCurrent::voltageDropAcrossResistor(const ld I, const ld R) -{ - return I * R;//volts -} - -inline ld ElectricCurrent::driftVelocity_commonWire(const ld q, const ld diameter, const ld I, const ld p, const ld mass) -{ - const ld n = (AVOGADRO_ * 1000.0 * p) / (mass); - return I / (n * q * (_PI_*pow(diameter/2.0,2))); -} - -inline ld ElectricCurrent::driftVelocity_commonWire_n(const ld n, const ld q, const ld diameter, const ld I) -{ - return I / (n * q * (_PI_ * pow(diameter / 2, 2))); -} - -inline ld ElectricCurrent::crossSectionalArea(const ld p, const ld l, const ld R) -{ - return (p * l) / R; -} - -inline ld ElectricCurrent::resistanceChangeFromTemperature(const ld R0, const ld tCoR, const ld tempChange) -{ - return R0 * (1.0 + tCoR * tempChange); -} - -inline ld ElectricCurrent::electricalPowerAndEnergy_IV(const ld I, const ld V) -{ - return I * V;//Watts -} - -inline ld ElectricCurrent::electricalPowerAndEnergy_V2R(const ld V, const ld R) -{ - return (V * V) / R;//Watts -} - -inline ld ElectricCurrent::resistanceFromPowerAndVolts(const ld P, const ld V) -{ - return (V*V)/P;//Ohms -} - -inline ld ElectricCurrent::resistanceFromPowerAndCurrent(const ld P, const ld I) -{ - return P/(I*I);//Ohms -} - -inline ld ElectricCurrent::electricalPowerAndEnergy_I2R(const ld I, const ld R) -{ - return (I * I) * R;//Watts -} - -inline ld ElectricCurrent::powerOutputOverTime(const ld Q, const ld t, const ld V) -{ - return (Q/t)*V;//watts -} - -inline ld ElectricCurrent::electronsThatPassThroughACharge(const ld Q) -{ - return Q / _PROTON_CHARGE_; -} - -inline ld ElectricCurrent::nucleiPerSecond(const ld I, const ld freeProtons) -{ - return I / (freeProtons * _PROTON_CHARGE_); -} - -inline ld ElectricCurrent::ratioOfDiametersInWires(const ld p1, const ld p2) -{ - return sqrt(p1/p2); -} - -inline ld ElectricCurrent::currentFlowThroughOfMaterial(const ld V, const ld p, const ld d, const ld l) -{ - return (V*_PI_*(d*d))/(4.0*p*l);//Amperes(I) -} - -inline ld ElectricCurrent::maximumTempchange(const ld tempCoEffOfResistivity, const ld maxChangePercent) -{ - return (maxChangePercent/100)/tempCoEffOfResistivity; -} - -inline ld ElectricCurrent::costOfElectricityUsed_kWh(const ld P, const ld t, const ld ratePerKwh) -{ - const ld joules = P * t; - - return (joules * ratePerKwh)/(1000.0*3600); -} - -inline ld ElectricCurrent::factorDiameterReduced(const ld Pi, const ld Pf) -{ - return sqrt(Pf / Pi); -} - -inline ld ElectricCurrent::timeTotal(const ld Q, const ld P) -{ - return Q / P;//seconds -} - -inline ld ElectricCurrent::timeTotal(const ld Q, const ld I, const ld V) -{ - return Q/(I*V); -} - -inline ld ElectricCurrent::timeToRaiseTemperature(const ld m1, const ld c, const ld Ti, const ld Tf, const ld m2, const ld Lv, const ld I, const ld V) -{ - return (m1*c*(Tf-Ti)+ m2*Lv)/(I*V);//time(s) -} - -inline ld ElectricCurrent::costToHeatHotTub(const ld m, const ld c, const ld Ti, const ld Tf, const ld eff, const ld rate) -{ - return ((m*c*(Tf-Ti))/eff)*(rate/(1000.0*3600)); -} - -inline ld ElectricCurrent::rmsCurrent(const ld Io) -{ - return Io/sqrt(2); -} - -inline ld ElectricCurrent::peekCurrent(const ld Irms) -{ - return sqrt(2) * Irms; -} - -inline ld ElectricCurrent::rmsVoltage(const ld Vo) -{ - return Vo / sqrt(2); -} - -inline ld ElectricCurrent::peekVoltage(const ld Vrms) -{ - return sqrt(2)*Vrms; -} - -inline ld ElectricCurrent::peekPower(const ld Vrms, const ld Irms) -{ - return 2.0*(Vrms*Irms); -} - -inline ld ElectricCurrent::voltageAC(const ld Vo, const ld f, const ld t) -{ - return Vo * sin(2*_PI_)*f*t;// volts -} - -inline ld ElectricCurrent::currentAC(const ld Io, const ld f, const ld t) -{ - return Io * sin(2 * _PI_) * f * t;//amperes -} - -inline ld ElectricCurrent::tempCoeffOfResistivity(const ld R, const ld R_o, const ld T_i, const ld T_f) -{ - return ((R / R_o) - 1.0) / (T_f - T_i); -} - -#endif //PHYSICSFORMULA_ELECTRICCURRENT_H +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_ELECTRICCURRENT_H +#define PHYSICSFORMULA_ELECTRICCURRENT_H +#pragma once +/** + * @class ElectricCurrent + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @dateBuilt 12/31/2020 + * @lastEdit 12/31/2020 + */ +#include "ElectricPotential.h" + + +#include + +//#include "Circuits.h" + +[[maybe_unused]] static struct Resistivities +{ + const ld SILVER = 1.59 * pow(10, -8); //1.59e-8 conductor, OHm*m + const ld COPPER = 1.72 * pow(10, -8); //1.72e-8 conductor, OHm*m + const ld GOLD = 2.44 * pow(10, -8); //2.44e-8 conductor, OHm*m + const ld ALUMINUM = 2.65 * pow(10, -8); //conductor, OHm*m + const ld TUNGSTEN = 5.6 * pow(10, -8); //conductor, OHm*m + const ld IRON = 9.71 * pow(10, -8); //conductor, OHm*m + const ld PLATINUM = 10.6 * pow(10, -8); //conductor, OHm*m + const ld STEEL = 20.0 * pow(10, -8); //conductor, OHm*m + const ld LEAD = 22.0 * pow(10, -8); //conductor, OHm*m + const ld MANGANIN = 44.0 * pow(10, -8); //conductor, OHm*m + const ld CONSTANTAN = 49.0 * pow(10, -8); //conductor, OHm*m + const ld MERCURY = 96.0 * pow(10, -8); //conductor, OHm*m + const ld NICHROME = 100.0 * pow(10, -8); //conductor, OHm*m + + const ld CARBON_PURE = 3.5 * pow(10, 5); //semiconductor, OHm*m + /// + /// The CARBON variable can be between 3.5 and 60 * 10^5 OHm*m. there is a + /// setCARBON method you can use to adjust its value. Its not checked so if you + /// put in a invalid number its on you, your calculation will be wrong. In the + /// argument only pass the first part, example 18.7. not 18.7*10^5. that gets added + /// automatically. + /// + ld CARBON = 10 * pow(10, 5); //semiconductor, OHm*m + /// + /// Sets the carbon variable. + /// + /// The value passed should be between 3.5 and 60. + void setCARBON(ld value) { CARBON = value * pow(10, 5); } + + const ld GERMANIUM_PURE = 600.0 * pow(10, -3); //semiconductor, OHm*m + /// + /// The GERMANIUM variable can be between 1 and 600 * 10^5 OHm*m. there is a + /// setGERMANIUM method you can use to adjust its value. Its not checked so if you + /// put in a invalid number its on you, your calculation will be wrong. In the + /// argument only pass the first part, example 18.7. not 18.7*10^-3. that gets added + /// automatically. + /// + ld GERMANIUM = 300 * pow(10, -3); //semiconductor, OHm*m + /// + /// Sets the GERMANIUM variable. + /// + /// The value passed should be between 1 and 600. + void setGERMANIUM(ld value) { GERMANIUM = value * pow(10, -3); } + + const ld SILICON_PURE = 2300; //2300semiconductor, OHm*m + /// + /// The SILICON variable can be between .1 and 2300 OHm*m. there is a + /// setSILICON method you can use to adjust its value. Its not checked so if you + /// put in a invalid number its on you, your calculation will be wrong. + /// + ld SILICON = .1; // .1 - 2300 semiconductor, OHm*m + /// + /// Sets the Silicon variable. + /// + /// The value passed should be between .1 and 2299. + void setSILICON(ld value) { SILICON = value * pow(10, -3); } + + const ld AMBER = 5.0 * pow(10, 14); // insulator, OHm*m + + /// + /// The GLASS variable can be between 10^9 and 10^14 OHm*m. there is a + /// setGLASS method you can use to adjust its value. Its not checked so if you + /// put in a invalid number its on you, your calculation will be wrong. + /// + ld GLASS = pow(10,9); //semiconductor, OHm*m + /// + /// Sets the GLASS variable. + /// + /// The value passed should be between 10^9 - 10^14. + void setGLASS(ld value) { GLASS = pow(10, value); } + + /// + /// The WOOD variable can be between 10^8 and 10^11 OHm*m. there is a + /// setWOOD method you can use to adjust its value of the power. Its not checked so if you + /// put in a invalid number its on you, your calculation will be wrong. + /// + ld WOOD = pow(10, 9); // 10^X conductor, OHm*m + /// + /// Sets the GLASS variable. + /// + /// The value passed should be between 10^9 - 10^14. + void setWOOD(ld X) { GLASS = pow(10, X); } + + +}resistivity; + + +static struct TemperatureCoefficientsOfResistivity +{ + const ld SILVER = 3.8 * pow(10, -3); //3.8e-3 1/C + const ld COPPER = 3.9 * pow(10, -3); //3.9e-3 1/C + const ld GOLD = 3.4 * pow(10, -3); //3.4e-3 1/C + const ld ALUMINUM = 3.9 * pow(10, -3); //3.9e-3 1/C + const ld TUNGSTEN = 4.5 * pow(10, -3); //4.5e-3 1/C + const ld IRON = 5.0 * pow(10, -3); //5.0e-3 1/C + const ld PLATINUM = 3.93 * pow(10, -3); //3.93e-3 1/C + const ld LEAD = 3.9 * pow(10, -3); //3.9e-3 1/C + const ld MANGANIN = .000 * pow(10, -3); //.0000e-3 1/C + const ld CONSTANTAN = 0.002 * pow(10, -3); //.002e-3 1/C + const ld MERCURY = .89 * pow(10, -3); //.89e-3 1/C + const ld NICHROME = .4 * pow(10, -3); //.4e-3 1/C + const ld CARBON = -.5 * pow(10, -3); //-.5e-3 1/C + const ld GERMANIUM = -50 * pow(10, -3); //-50e-3 1/C + const ld SILCONE = -70 * pow(10, -3); //-70e-3 1/C + +}tempCoefResistivity; + +static struct AWGWireSizesByGauge +{ + const ld AWG0000 = 11.6840*pow(10, -3);// 11.6840mm diameter + const ld AWG000 = 10.4038*pow(10, -3);// 10.4038mm diameter + const ld AWG00 = 9.2659*pow(10, -3);// 9.2659mm diameter + const ld AWG0 = 8.2525*pow(10, -3);// 8.2525mm diameter + const ld AWG1 = 7.3482*pow(10, -3);// 7.3482mm diameter + const ld AWG2 = 6.5430*pow(10, -3);// 6.5430mm diameter + const ld AWG3 = 5.8268*pow(10, -3);// 5.8268mm diameter + const ld AWG4 = 5.1892*pow(10, -3);// 5.1892mm diameter + const ld AWG5 = 4.6203*pow(10, -3);// 4.6203mm diameter + const ld AWG6 = 4.1148*pow(10, -3);// 4.1148mm diameter + const ld AWG7 = 3.6652*pow(10, -3);// 3.6652mm diameter + const ld AWG8 = 3.2639*pow(10, -3);// 3.2639mm diameter + const ld AWG9 = 2.9058*pow(10, -3);// 2.9058mm diameter + const ld AWG10 = 2.5883*pow(10, -3);// 2.5883mm diameter + const ld AWG11 = 2.3038*pow(10, -3);// 2.3038mm diameter + const ld AWG12 = 2.0523*pow(10, -3);// 2.0523mm diameter + const ld AWG13 = 1.8288*pow(10, -3);// 1.8288mm diameter + const ld AWG14 = 1.6281*pow(10, -3);// 1.6281mm diameter + const ld AWG15 = 1.4503*pow(10, -3);// 1.4503mm diameter + const ld AWG16 = 1.2903*pow(10, -3);// 1.2903mm diameter + const ld AWG17 = 1.1506*pow(10, -3);// 1.1506mm diameter + const ld AWG18 = 1.0236*pow(10, -3);// 1.0236mm diameter + const ld AWG19 = 0.9119*pow(10, -3);// 0.9119mm diameter + const ld AWG20 = 0.8128*pow(10, -3);// 0.8128mm diameter + const ld AWG21 = 0.7239*pow(10, -3);// 0.7239mm diameter + const ld AWG22 = 0.6452*pow(10, -3);// 0.6452mm diameter + const ld AWG23 = 0.5740*pow(10, -3);// 0.5740mm diameter + const ld AWG24 = 0.5105*pow(10, -3);// 0.5105mm diameter + const ld AWG25 = 0.4547*pow(10, -3);// 0.4547mm diameter +}AWG; + +//static object counter for ElectricCurrent class +static int electricCurrent_objectCount = 0; + + +class ElectricCurrent +{ +public: + ElectricCurrent* _electricCurrentPtr; + + + ElectricCurrent() + { + _electricCurrentPtr = nullptr; + _electricCurrentVal = 0.0; + countIncrease(); + //cout << "in electicCurrent count: " << electricCurrent_objectCount << endl; + } + + ElectricCurrent(ld val) + { + _electricCurrentPtr = nullptr; + _electricCurrentVal = 0.0; + countIncrease(); + + } + + /** + * @brief copy constructor + */ + ElectricCurrent(const ElectricCurrent& t) + { + _electricCurrentPtr = t._electricCurrentPtr; + _electricCurrentVal = t._electricCurrentVal; + countIncrease(); + } + /** + * #brief move constructor + */ + ElectricCurrent(ElectricCurrent&& t) noexcept + { + _electricCurrentPtr = t._electricCurrentPtr; + _electricCurrentVal = t._electricCurrentVal; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + ElectricCurrent& operator=(const ElectricCurrent& t) + { + if (this != &t) + { + _electricCurrentPtr = t._electricCurrentPtr; + _electricCurrentVal = t._electricCurrentVal; + countIncrease(); + } + return *this; + } + + static void show_objectCount() { std::cout << "\n electric current object count: " << electricCurrent_objectCount << std::endl; } + static int get_objectCount() { return electricCurrent_objectCount; } + + + /// + /// calculates the area using the radius. + /// + /// The radius. + /// area(m^2) + static ld area_r(const ld r); + + /// + /// Calculates the area from the diameter + /// + /// The diameter. + /// area(m^2) + static ld area_d(const ld d); + + /// + /// calculates the electric current (I) defined as the rate at which charge + /// (Q) flows through a given time (t). + /// + /// The change in current. + /// The time over which current passes through. + /// the electric current SI unit of ampere (A) + static ld electricCurrent(const ld Q, const ld t); + + /// + /// Times it takes charge Q to flow through a current of I amperes + /// + /// The charge. + /// The current. + /// time in seconds + static ld timeItTakesChargeToFlow(const ld Q, const ld I); + + /// + /// Calculates the Electrics charge Q + /// + /// The current. + /// The time in seconds. + /// the charge in coulombs + static ld electricCharge(const ld I, const ld t); + + /// + /// Calculates the current (I) using the number of free charges(n) per unit + /// volume (Ax) where the charge per n is given by q and t is the unit time. + /// I = (q * n * Ax) / t; + /// + /// The charge. + /// The number of free charges. + /// The volume of segment Ax is the area * distance + /// where for a circle would be pi*r^2 * x where x is the length. + /// The unit time the charge is moved over. + /// The current + static ld current_qnAx_t(const ld q, const ld n, const ld Ax, const ld t); + + /// + /// Calculates the current (I) using the number of free charges(n) per unit + /// volume(A) each carrying a charge of q with a drift velocity of vd. + /// + /// The number of free charges. + /// The charge on each. + /// the area. + /// The drift velocity. + /// the current + static ld current_nqAvd(const ld n, const ld q, const ld A, const ld vd); + + /// + /// Calculates the currents using ohms law of voltage over resistances. + /// + /// The voltage. + /// The resistance. + /// current in Amperes + static ld current_ohms(const ld V, const ld R); + + /// + /// Calculates the current from rearranging the power equations + /// + /// The power in watts. + /// The resistance. + /// the current in amperes(I) + static ld current_fromPowerEq(const ld P, const ld R); + + /// + /// Calculates the currents from power and volts. + /// + /// The power in watts. + /// The volts. + /// + static ld current_fromPowerAndVolts(const ld P, const ld V); + + /// + /// calculates the resistances of an ohmic conducting material + /// + /// The volts. + /// The current (A). + /// (V/A)one volt per Ampere + static ld resistance_ohmic(const ld V, const ld I); + + /// + /// Calculates the resistance of resistor with a resistivity of p and a + /// length of l with a area of A(pir^2, in a circular resistor). + /// + /// The resistivity. + /// The length. + /// The cross sectional area. + /// Resistance Ohms + static ld resistanceUsingResistivity(const ld p, const ld l, const ld A); + + /// + /// calculates the resistance of a piece of wire with a length of l, + /// having a diameter of d and a resistivity of p, which depends on the + /// material its made from. copper is a p = 1.72e-8 Ohms/m + /// + /// The resistivity. + /// The length. + /// The diameter. + /// the resistance in Ohms + static ld resistanceUsingResistivityWire(const ld p, const ld l, const ld d); + + /// + /// calculates the cross sectional areas the of a resistor. + /// + /// The resistivity. + /// The Resistance. + /// The length. + /// area of resistor (m^2) + static ld areaOfResistor(const ld p, const ld R, const ld l); + + /// + /// Calculates the length of a resistor. + /// + /// the cross sectional area. + /// The resistance. + /// The resistivity. + /// the length of resistor (m) + static ld lengthOfResistor(const ld A, const ld R, const ld p); + + + /// + /// Calculates the Lengths of filament. + /// + /// The diameter. + /// The resistance. + /// The resistivity. + /// + static ld lengthOfFilament(const ld d, const ld R, const ld p); + + /// + /// As part of a class project you are given m g of copper and asked + /// to fabricate a wire with uniform cross-section. You use up 95% of the + /// copper and make a wire with a resistance of 0.800 Ω. The resistivity + /// of copper is 1.72 10-8 Ω · m and its density is 8.92 103 kg/m3 + /// + /// The mass. + /// The resistance. + /// The resistivity. + /// The density. + /// length of wire + static ld lengthOfWireMade(const ld m, const ld R, const ld p, const ld pd); + + /// + /// Calculates the resistivity of a resistor. + /// + /// The resistance. + /// area. + /// The length. + /// + static ld resistivityOfResistor(const ld R, const ld A, const ld l); + + /// + /// Of what material is a wire made, if it is a length of (l)m long with a + ///(d)m diameter and has a resistance of R ohms at 20.0∘C + /// + /// The length. + /// The diameter. + /// The resistance. + /// Ohm m + static ld resistivity(const ld l, const ld d, const ld R); + + /// + /// Calculates the voltages drop across a resistor. + /// + /// The current (Amperes). + /// The resistance. + /// The voltage + static ld voltageDropAcrossResistor(const ld I, const ld R); + + /// + /// Calculates the drifts the velocity (V_d) of a common wire. + /// + /// The charge. + /// The diameter. + /// The current (Amperes). + /// The density per kg/m^3. + /// The atomic mass. + /// drift velocity m/s + static ld driftVelocity_commonWire(const ld q, const ld diameter, const ld I, const ld p, const ld mass); + + /// + /// Drifts the velocity common wire n. + /// + /// The number of electrons per cubic meter. + /// The charge. + /// The diameter. + /// The current. + /// drift velocity m/s + static ld driftVelocity_commonWire_n(const ld n, const ld q, const ld diameter, const ld I); + + /// + /// Calculates the crosses sectional area + /// + /// The resistivity. + /// The length. + /// The resistance. + /// cross sectional area (m^2) + static ld crossSectionalArea(const ld p, const ld l, const ld R); + + /// + /// Calculates the change in resistances from the effects of a + /// change in temperature. + /// + /// The initial cold resistance + /// The temperature coefficients of resistivity. + /// The change in the temperature. + /// the new resistance in Ohms + static ld resistanceChangeFromTemperature(const ld R0, const ld tCoR, const ld tempChange); + + + + /// + /// calculates the electrical power from current and volts + /// + /// The current. + /// The volts. + /// energy from electrical(W) + static ld electricalPowerAndEnergy_IV(const ld I, const ld V); + + /// + /// calculates the electrical power from volts and resistance + /// + /// The volts. + /// The resistance. + /// energy from electrical (W) + static ld electricalPowerAndEnergy_V2R(const ld V, const ld R); + + /// + /// Some makes of older cars have 6.00-V electrical systems. (a) What is + /// the hot resistance of a 30.0-W headlight in such a car? + /// + /// The power. + /// The volts. + /// resistance + static ld resistanceFromPowerAndVolts(const ld P, const ld V); + + /// + /// Calculates the resistance from power and current. + /// + /// The power. + /// The current. + /// Ohms + static ld resistanceFromPowerAndCurrent(const ld P, const ld I); + + /// + /// calculates the electrical power from current and resistance + /// + /// The current. + /// The resistance. + /// energy from electrical (W) + static ld electricalPowerAndEnergy_I2R(const ld I, const ld R); + + /// + /// A charge of (Q) C of charge passes through a pocket calculator’s solar + /// cells in t seconds. What is the power output, given the calculator’s + /// voltage output is a voltage of V. + /// + /// The charge. + /// The time. + /// The voltage. + /// the watts + static ld powerOutputOverTime(const ld Q, const ld t, const ld V); + + /// + /// Calculates the total electrons that pass through a charge. + /// + /// The charge in coulombs. + /// Ne, number of electrons + static ld electronsThatPassThroughACharge(const ld Q); + + /// + /// If a large cyclotron directs a beam of freeProtons nuclei onto a target + /// with a beam current of I Amperes. Calculate How many nuclei per second + /// this is. + /// + /// The current. + /// The number of free protons. + /// nuclei/second + static ld nucleiPerSecond(const ld I, const ld freeProtons); + + /// + /// Calculates the ratio of the resistivity of wire1 to that of wire2, if they have + /// the same resistance per unit length (as they might in household wiring) + /// + /// The the bigger resistivity. + /// The smaller resistivity. + /// the ratio meaning the size of the smaller resistivity value will + /// to by this value bigger + static ld ratioOfDiametersInWires(const ld p1, const ld p2); + + /// + /// Calculates the current flows through a diameter of (d) rod with a + /// resistivity of (p) that is a length of (l)m long, when (V) voltage is + /// applied to it? (Such a rod may be used to make nuclear- particle + /// detectors, for example.) + /// + /// The applied voltage. + /// The resistivity. + /// The diameter. + /// The length. + /// the Amperes + static ld currentFlowThroughOfMaterial(const ld V, const ld p, const ld d, const ld l); + + /// + /// A resistor made of Nichrome wire is used in an application where its + /// resistance cannot change more than 1.00% from its value at 20.0∘C . + /// Over what temperature range can it be used? + /// + /// The temperature coefficient of resistivity. + /// The maximum change percent. + /// temperature + static ld maximumTempchange(const ld tempCoEffOfResistivity, const ld maxChangePercent); + + /// + /// With a 1200-W toaster, how much electrical energy is needed to make a + /// slice of toast (cooking time = 1 minute)? At 9.0 cents/kW⋅h, how much does this cost?. + /// + /// The power inWatts. + /// The time in seconds. + /// The rate per KWH. + /// total cost to use electricity + static ld costOfElectricityUsed_kWh(const ld P, const ld t, const ld ratePerKwh); + + /// + /// An old light bulb draws only 50.0 W, rather than its original 60.0 W, + /// due to evaporative thinning of its filament. By what factor is its + /// diameter reduced, assuming uniform thinning along its length? Neglect + /// any effects caused by temperature differences. + /// + /// The starting wattage. + /// The final wattage. + /// factor which diameter decreases + static ld factorDiameterReduced(const ld Pi, const ld Pf); + + /// + /// Calculates the total time. + /// + /// The charge. + /// The power. + /// time + static ld timeTotal(const ld Q, const ld P); + + /// + /// Times the total. + /// + /// The charge . + /// The current. + /// The volts. + /// time + static ld timeTotal(const ld Q, const ld I, const ld V); + + /// + /// How much time is needed for a surgical cauterizer to raise the + /// temperature of m1 g of tissue from 37.0∘C to 100∘C and then boil + /// away 0.500 g of water, if it puts out 2.00 mA at 15.0 kV? Ignore heat + /// transfer to the surroundings. + /// + /// The mass of tissue. + /// The specific heat of water(sub new substance value). + /// The initial temperature. + /// The temperature to raise to. + /// The mass of water to boil. + /// The latent heat of vaporization . + /// The current. + /// The volts. + /// time in seconds + static ld timeToRaiseTemperature(const ld m1, const ld c, const ld Ti, const ld Tf, const ld m2, const ld Lv, const ld I, const ld V); + + /// + /// What is the cost of heating a hot tub containing 1500 kg of water from + /// 10.0∘C to 40.0∘C , assuming 75.0% efficiency to account for heat + /// transfer to the surroundings? The cost of electricity is 9 cents/kW ⋅h . + /// + /// The mass of the water. + /// The specific heat. + /// The initial temp. + /// The final temp. + /// The eff. + /// The rate. + /// cost in cents + static ld costToHeatHotTub(const ld m, const ld c, const ld Ti, const ld Tf, const ld eff, const ld rate); + + /// + /// RMSs the current. + /// + /// The peek current. + /// rms current + static ld rmsCurrent(const ld Io); + + /// + /// Peeks the current. + /// + /// The rms current. + /// + static ld peekCurrent(const ld Irms); + + /// + /// RMSs the voltage. + /// + /// The peek voltage. + /// voltage + static ld rmsVoltage(const ld Vo); + + /// + /// Peeks the voltage. + /// + /// The VRMS. + /// peek volage + static ld peekVoltage(const ld Vrms); + + /// + /// What is the peak power consumption of a Vrms AC microwave oven + /// that draws Irms A? + /// + /// The VRMS. + /// The irms. + /// + static ld peekPower(const ld Vrms, const ld Irms); + + /// + /// Voltages the ac. + /// + /// The peek voltage. + /// The frequency in hertz. + /// The time we are looking to find the voltage at. + /// voltage + static ld voltageAC(const ld Vo, const ld f, const ld t); + + /// + /// Currents the ac. + /// + /// The is the peek current (Io = Vo/R). + /// The frequency in hertz. + /// The time we are looking to find the current at. + /// amperes + static ld currentAC(const ld Io, const ld f, const ld t); + + /// + /// Temporaries the coeff of resistivity. + /// + /// The r. + /// The r o. + /// The t i. + /// The t f. + /// + static ld tempCoeffOfResistivity(const ld R, const ld R_o, const ld T_i, const ld T_f); + + void setElectricCurrentVal(ld val) { _electricCurrentVal = val; } + + ~ElectricCurrent() + { + delete _electricCurrentPtr; + } + +private: + ld _electricCurrentVal; + static void countIncrease() { electricCurrent_objectCount += 1; } + static void countDecrease() { electricCurrent_objectCount -= 1; } + +}; + +inline ld ElectricCurrent::area_r(const ld r) +{ + return _PI_ * (r*r);//m^2 +} + +inline ld ElectricCurrent::area_d(const ld d) +{ + return _PI_*((d*d)/4);//m^2 +} + +inline ld ElectricCurrent::electricCurrent(const ld Q, const ld t) +{ + return Q / t;//Amperes(I) +} + +inline ld ElectricCurrent::timeItTakesChargeToFlow(const ld Q, const ld I) +{ + return Q / I;//seconds(s) +} + +inline ld ElectricCurrent::electricCharge(const ld I, const ld t) +{ + return I * t;//Coulombs(C) +} + +inline ld ElectricCurrent::current_qnAx_t(const ld q, const ld n, const ld Ax, const ld t) +{ + return (q * n * Ax) / t;//Amperes or Coulombs/second +} + +inline ld ElectricCurrent::current_nqAvd(const ld n, const ld q, const ld A, const ld vd) +{ + return n * q * A * vd;//Amperes or C/s +} + +inline ld ElectricCurrent::current_ohms(const ld V, const ld R) +{ + return V / R;//Amperes(I) +} + +inline ld ElectricCurrent::current_fromPowerEq(const ld P, const ld R) +{ + return sqrt(P/R);//Amperes(I) +} + +inline ld ElectricCurrent::current_fromPowerAndVolts(const ld P, const ld V) +{ + return P/V;//Amperes +} + +inline ld ElectricCurrent::resistance_ohmic(const ld V, const ld I) +{ + return V / I;//Ohms +} + +inline ld ElectricCurrent::resistanceUsingResistivity(const ld p, const ld l, const ld A) +{ + return p*(l / A);//Ohms +} + + +inline ld ElectricCurrent::resistanceUsingResistivityWire(const ld p, const ld l, const ld d) +{ + return p * l * (4.0 / (_PI_ * (d * d)));//Ohms +} + +inline ld ElectricCurrent::areaOfResistor(const ld p, const ld R, const ld l) +{ + return p * (l / R);//m^2 +} + +inline ld ElectricCurrent::lengthOfResistor(const ld A, const ld R, const ld p) +{ + return (A * R) / p;//m +} + +inline ld ElectricCurrent::lengthOfFilament(const ld d, const ld R, const ld p) +{ + return (_PI_*(d*d)*R)/(4.0*p);//meters +} + +inline ld ElectricCurrent::lengthOfWireMade(const ld m, const ld R, const ld p, const ld pd) +{ + return sqrt((m*R)/(pd*p));//m +} + +inline ld ElectricCurrent::resistivityOfResistor(const ld R, const ld A, const ld l) +{ + return (A * R) / l;//Ohms/m +} + +inline ld ElectricCurrent::resistivity(const ld l, const ld d, const ld R) +{ + return (_PI_*(d*d)*R)/(4.0*l);//Ohms meters +} + +inline ld ElectricCurrent::voltageDropAcrossResistor(const ld I, const ld R) +{ + return I * R;//volts +} + +inline ld ElectricCurrent::driftVelocity_commonWire(const ld q, const ld diameter, const ld I, const ld p, const ld mass) +{ + const ld n = (AVOGADRO_ * 1000.0 * p) / (mass); + return I / (n * q * (_PI_*pow(diameter/2.0,2))); +} + +inline ld ElectricCurrent::driftVelocity_commonWire_n(const ld n, const ld q, const ld diameter, const ld I) +{ + return I / (n * q * (_PI_ * pow(diameter / 2, 2))); +} + +inline ld ElectricCurrent::crossSectionalArea(const ld p, const ld l, const ld R) +{ + return (p * l) / R; +} + +inline ld ElectricCurrent::resistanceChangeFromTemperature(const ld R0, const ld tCoR, const ld tempChange) +{ + return R0 * (1.0 + tCoR * tempChange); +} + +inline ld ElectricCurrent::electricalPowerAndEnergy_IV(const ld I, const ld V) +{ + return I * V;//Watts +} + +inline ld ElectricCurrent::electricalPowerAndEnergy_V2R(const ld V, const ld R) +{ + return (V * V) / R;//Watts +} + +inline ld ElectricCurrent::resistanceFromPowerAndVolts(const ld P, const ld V) +{ + return (V*V)/P;//Ohms +} + +inline ld ElectricCurrent::resistanceFromPowerAndCurrent(const ld P, const ld I) +{ + return P/(I*I);//Ohms +} + +inline ld ElectricCurrent::electricalPowerAndEnergy_I2R(const ld I, const ld R) +{ + return (I * I) * R;//Watts +} + +inline ld ElectricCurrent::powerOutputOverTime(const ld Q, const ld t, const ld V) +{ + return (Q/t)*V;//watts +} + +inline ld ElectricCurrent::electronsThatPassThroughACharge(const ld Q) +{ + return Q / _PROTON_CHARGE_; +} + +inline ld ElectricCurrent::nucleiPerSecond(const ld I, const ld freeProtons) +{ + return I / (freeProtons * _PROTON_CHARGE_); +} + +inline ld ElectricCurrent::ratioOfDiametersInWires(const ld p1, const ld p2) +{ + return sqrt(p1/p2); +} + +inline ld ElectricCurrent::currentFlowThroughOfMaterial(const ld V, const ld p, const ld d, const ld l) +{ + return (V*_PI_*(d*d))/(4.0*p*l);//Amperes(I) +} + +inline ld ElectricCurrent::maximumTempchange(const ld tempCoEffOfResistivity, const ld maxChangePercent) +{ + return (maxChangePercent/100)/tempCoEffOfResistivity; +} + +inline ld ElectricCurrent::costOfElectricityUsed_kWh(const ld P, const ld t, const ld ratePerKwh) +{ + const ld joules = P * t; + + return (joules * ratePerKwh)/(1000.0*3600); +} + +inline ld ElectricCurrent::factorDiameterReduced(const ld Pi, const ld Pf) +{ + return sqrt(Pf / Pi); +} + +inline ld ElectricCurrent::timeTotal(const ld Q, const ld P) +{ + return Q / P;//seconds +} + +inline ld ElectricCurrent::timeTotal(const ld Q, const ld I, const ld V) +{ + return Q/(I*V); +} + +inline ld ElectricCurrent::timeToRaiseTemperature(const ld m1, const ld c, const ld Ti, const ld Tf, const ld m2, const ld Lv, const ld I, const ld V) +{ + return (m1*c*(Tf-Ti)+ m2*Lv)/(I*V);//time(s) +} + +inline ld ElectricCurrent::costToHeatHotTub(const ld m, const ld c, const ld Ti, const ld Tf, const ld eff, const ld rate) +{ + return ((m*c*(Tf-Ti))/eff)*(rate/(1000.0*3600)); +} + +inline ld ElectricCurrent::rmsCurrent(const ld Io) +{ + return Io/sqrt(2); +} + +inline ld ElectricCurrent::peekCurrent(const ld Irms) +{ + return sqrt(2) * Irms; +} + +inline ld ElectricCurrent::rmsVoltage(const ld Vo) +{ + return Vo / sqrt(2); +} + +inline ld ElectricCurrent::peekVoltage(const ld Vrms) +{ + return sqrt(2)*Vrms; +} + +inline ld ElectricCurrent::peekPower(const ld Vrms, const ld Irms) +{ + return 2.0*(Vrms*Irms); +} + +inline ld ElectricCurrent::voltageAC(const ld Vo, const ld f, const ld t) +{ + return Vo * sin(2*_PI_)*f*t;// volts +} + +inline ld ElectricCurrent::currentAC(const ld Io, const ld f, const ld t) +{ + return Io * sin(2 * _PI_) * f * t;//amperes +} + +inline ld ElectricCurrent::tempCoeffOfResistivity(const ld R, const ld R_o, const ld T_i, const ld T_f) +{ + return ((R / R_o) - 1.0) / (T_f - T_i); +} + +#endif //PHYSICSFORMULA_ELECTRICCURRENT_H diff --git a/ElectricPotential.h b/ElectricPotential.h index 7500f38..01f8899 100644 --- a/ElectricPotential.h +++ b/ElectricPotential.h @@ -1,706 +1,706 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_ELECTRICPOTENTIAL_H -#define PHYSICSFORMULA_ELECTRICPOTENTIAL_H -/** - * @class ElectricPotential - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @dateBuilt 12/31/2020 - * @lastEdit 12/31/2020 - */ -//#include "ElectricCharge.h" -#include "Heat.h" -#include - - - - -static int electricalPotential_objectCount = 0; - -constexpr auto _eV_ = 1.602e-19; - -//constexpr auto _LIGHTSPEED_ = 2.99792458e8; -//multiply joules by this to convert to electron Volts -constexpr auto _JOULES2eV_ = 1.0 / _eV_; - -static struct DielectricConstants -{ - const ld vacuum = 1.00000; //1.00000 - const ld Air = 1.00059; //1.00059 - const ld Bakelite = 4.9; //4.9 - const ld fused_quartz = 3.78; //3.78 - const ld neoprene_rubber = 6.7; //6.7 - const ld nylon = 3.4; //3.4 - const ld paper = 3.7; //3.7 - const ld polystyrene = 2.56; //2.56 - const ld pyrex_glass = 55.6; //5.6 - const ld silicon_oil = 2.5; //2.5 - const ld strontium_titanate = 233; //233 - const ld teflon = 2.1; //2.1 - const ld water = 80; //80 - -}dielectric_constants; - -static struct DielectricStrength -{ - const ld Air = 3.0*pow(10,6); //3.0e6 - const ld Bakelite = 24*pow(10,6); //24e6 - const ld fused_quartz = 8*pow(10,6); //8e6 - const ld neoprene_rubber = 12*pow(10,6); //12e6 - const ld nylon = 14*pow(10,6); //14e6 - const ld paper = 16*pow(10,6); //16e6 - const ld polystyrene = 24*pow(10,6); //24e6 - const ld pyrex_glass = 14*pow(10,6); //14e6 - const ld silicon_oil = 15*pow(10,6); //15e6 - const ld strontium_titanate = 8*pow(10,6); //8e6 - const ld teflon = 60*pow(10,6); //60e6 - -}dielectric_strength; - - - - -class ElectricPotential -{ -public: - ElectricPotential* _electricalPotentialPtr; - - ElectricPotential() - { - _electricalPotentialPtr = nullptr; - _electricPotentialVal = 0.0; - countIncrease(); - } - - ElectricPotential(ld val) - { - _electricalPotentialPtr = nullptr; - _electricPotentialVal = 0.0; - countIncrease(); - } - - /** - * @brief copy constructor - */ - ElectricPotential(const ElectricPotential& t) - { - _electricalPotentialPtr = t._electricalPotentialPtr; - _electricPotentialVal = t._electricPotentialVal; - countIncrease(); - } - /** - * #brief move constructor - */ - ElectricPotential(ElectricPotential&& t) noexcept - { - _electricalPotentialPtr = t._electricalPotentialPtr; - _electricPotentialVal = t._electricPotentialVal; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - ElectricPotential& operator=(const ElectricPotential& t) - { - if (this != &t) - { - _electricalPotentialPtr = t._electricalPotentialPtr; - _electricPotentialVal = t._electricPotentialVal; - countIncrease(); - } - return *this; - } - - static void show_objectCount() { std::cout - << "\n electrical potential object count: " - << electricalPotential_objectCount << std::endl; } - static int get_objectCount() { return electricalPotential_objectCount; } - - /// - /// This is the electrical potential energy per unit change - /// - /// The potential energy. - /// The charge that can be moved. - /// the electrical potential, volts(V) - static ld electricalPotential_V(const ld PE, const ld q); - - /// - /// Potentials the difference. - /// - /// The charge. - /// The voltage. - /// the potential difference (PE) - static ld potentialDifference_PE(const ld q, const ld V); - - /// - /// calculates the total charge moved in Coulombs - /// - /// The Potential difference. - /// The electrical potential. - /// the charge(q) in Coulombs(C) moved - static ld chargeMoved_q(const ld PE, const ld V); - - /// - /// Calculates the numbers of electrons that pass through a charge per - /// second. - /// - /// The charge moved(q). - /// number of electrons(Ne) - static ld electronsPerSecond(const ld chargeMoved); - - /// - /// 1 eV = (1.60e-19 C)(1V)= (1.60e-19 C)(1 J/C)joule per Coulomb - /// - /// The Volts. - /// - static ld electronVolts_eV(const ld V); - - /// - /// Converts to electron volts from known joules - /// - /// The joules. - /// electron volts (eV) - static ld electronVoltsFromJoules(const ld joules); - - /// - /// Calculates the final speed of a particle with a mass of m, a charge - /// of q and a potential difference of V. - /// - /// The charge. - /// The electrical potential. - /// The mass. - /// velocity (m/s) - static ld velocityFinal(const ld q, const ld V, const ld m); - - /// - /// Calculates the final speed of a particle with a mass of m, a charge - /// of q and a potential difference of V. - /// - /// The Kinetic Energy (J). - /// The mass. - /// velocity (m/s) - static ld velocityFinal(const ld KE, const ld m); - - /// - /// Calculates the voltages between two points for a uniform electric field only - /// - /// The max electric field strength. - /// The distance of separation. - /// maximum voltage (V) - static ld voltageBetween2points_Vab(const ld E, const ld d); - - /// - /// Calculates the Electric field strength between two points/plates for - /// a uniform electric field only - /// - /// The potential difference or volts. - /// The distance between points. - /// magnitude of electric field(N/C)(V/m) - static ld electricFieldMagnitude(const ld V, const ld d); - - /// - /// Calculates the electric field. which ius said to be the gradient fo the - /// electric potential. - /// - /// The volts. - /// The distance the change in volts occurs. - /// electric field - static ld electricField(const ld V, const ld s); - - /// - /// Calculates the volts from electric field. - /// - /// The electric field strength. - /// The distance over which the change in potential takes - /// place. - /// - static ld voltsFromElectricFieldGradient(const ld E, const ld s); - - /// - /// Calculates the distances over which the change in volts occurs. - /// - /// The change in volts. - /// The Electric field strength. - /// distance(m) - static ld distanceOverChangeInVolts_s(const ld V, const ld E); - - /// - /// How far from a Q charged point charge will the potential be V volts? - /// - /// The charge (C). - /// The volts. - /// distance (meters) - static ld distancePointChargeToEqualVoltsOf(const ld Q, const ld V); - - /// - /// Electrics the potential point charge. - /// - /// The point charge. - /// The distance. - /// voltage - static ld electricPotential_pointCharge(const ld Q, const ld r); - - /// - /// calculates the excesses charge. - /// - /// The radius. - /// The voltage. - /// charge in Coulombs(C) - static ld excessCharge(const ld r, const ld V); - - /// - /// Calculates the voltage needed to obtain a certain energy. - /// - /// The m. - /// The v. - /// The q. - /// number of protons in atom of consideration - /// voltage (V) - static ld voltageNeededToObtainEnergy(const ld m, const ld v, const ld q, const ld numProtons); - - /// - /// ions with a charge iof q are accelerated from rest through a voltage - /// of V. At what temperature will the average kinetic energy of gas - /// molecules be the same as that given these ions? - /// - /// The charge. - /// The voltage. - /// temperature in Kelvin(k) - static ld temperatureAvgKineticEnergyGasMolecule(const ld V, const ld q); - - /// - /// The temperature of ion particles is T degrees Celsius. Through what voltage - /// must a charged ion be accelerated to have the same energy as the average - /// kinetic energy of ions at this temperature? - /// - /// The t. - /// The q. - /// voltage (V) - static ld voltageIonsMoveThroughToReachSameTemperature(const ld T, const ld q); - - //static ld massToRaisFromTemp1ToTemp2(const ld) - - - /// - /// Capacitance of a capacitor. units of C/V or A^2s^2/kg*m^2 - /// - /// The charge. - /// The volts. - /// the capacitance (C/V) - static ld capacitance(const ld Q, const ld V); - - /// - /// Calculates the charge stored in a capacitor. - /// - /// The Capacitance. - /// The volts. - /// the charge (Q) - static ld capacitanceCharge(const ld C, const ld V); - - /// - /// Calculates the voltage applied to a C (F) capacitor when it holds - /// Q (C) of charge. - /// - /// The charge. - /// The capacitance. - /// volts (V) - static ld capacitanceVolts(const ld Q, const ld C); - - /// - /// Calculates the capacitance of a parallel plate capacitor - /// - /// the area. - /// The distance between plates. - /// the capacitance C in farads - static ld capacitanceParallelPlate(const ld A, const ld d); - - /// - /// Calculates the capacitance of a parallel plate capacitor with a - /// dielectric - /// - /// The dielectric constant. - /// The area of the capacitor. - /// The distance between plates. - /// the capacitance C in farads - static ld capacitanceParallelPlateDielectric(const ld d_k, const ld A, const ld d); - - /// - /// the dielectric constant is generally defined to be the ratio of the - /// electric field in a vacuum to that in the dielectric material, and is - /// intimately related to the polarize-ability of the material. - /// - /// The electric field in a vacuum. - /// The electric field of the dielectric. - /// dielectric constant - static ld dielectricConstant(const ld E0, const ld E); - - /// - /// calculates the energy stored in a capacitor - /// Ecap = (Q*V)/2. - /// - /// The charge. - /// The volts. - /// Energy stored in capacitor - static ld capacitorEnergy_Ecap_QV(const ld Q, const ld V); - - /// - /// calculates the energy stored in a capacitor - /// Ecap = (C * V^2)/2.0. - /// - /// The capacitance. - /// The volts. - /// Energy stored in capacitor - static ld capacitorEnergy_Ecap_CV(const ld C, const ld V); - - /// - /// calculates the energy stored in a capacitor - /// Ecap = Q^2/2*C. - /// - /// The charge. - /// The capacitance. - /// Energy stored in capacitor - static ld capacitorEnergy_Ecap_QC(const ld Q, const ld C); - - /// - /// Potentials the across ecap ce. - /// - /// The c. - /// The ecap. - /// - static ld potentialAcross_Ecap_CE(const ld C, const ld Ecap); - - /// - /// Calculate the area the parallel plates of a capacitor of capacitance C - - /// must have if they are separated by a distance of d. - /// - /// The capacitance. - /// The distance. - /// the area of the parallel plates of a capacitor (m^2) - static ld capacitorPlateArea(const ld C, const ld d); - - /// - /// Calculate the area the parallel plates of a capacitor with a capacitance - /// of C must have if it is separated by d meters of a dielectric, which - /// has a dielectric constant of k. - /// - /// The capacitance. - /// The distance of separation . - /// The dielectric constant. - /// the area of the parallel plates of a capacitor (m^2) - static ld capacitorPlateAreaDielectric(const ld C, const ld d, const ld k); - - /// - /// vs the maximum on capacitor. - /// - /// The dielectric strength. - /// The distance between plates. - /// max voltage that can be applied - static ld vMaxOnCapacitor(const ld dStrength, const ld d); - - /// - /// Maximums the charge can be stored capacitor. - /// - /// The capacitance. - /// The max voltage. - /// max charge that can be stored in a capacitor (C) - static ld maxChargeCanBeStoredCapacitor(const ld C, const ld vMax); - - /// - /// Calculates the Volume the of dielectric material. - /// - /// area. - /// The distance. - /// - static ld volumeOfDielectricMaterial(const ld A, const ld d); - - /// - /// Electrics the field strength between2plates. - /// - /// The kinetic energy. - /// The charge. - /// The distance. - /// Electric field strength(V/m) - static ld electricFieldStrengthBetween2plates(const ld KE, const ld q, const ld d); - - /// - /// A plastic sphere of diameter d is used in a static electricity - /// demonstration, has a uniformly distributed charge of q on its - /// surface. What is the potential near its surface? - /// - /// The diameter of sphere. - /// The charge. - /// volts - static ld potentialNearSurfaceOfSphere(const ld d, const ld q); - - /// - /// An electrostatic paint sprayer has a metal sphere of diameter d and - /// a potential of V volts that repels paint droplets onto a grounded - /// object. What charge is on the sphere? - /// - /// The diameter. - /// The volts. - /// the charge (C) - static ld chargeOnSphere(const ld d, const ld V); - - /// - /// What charge must a 0.100-mg point with a potential of V have to arrive at an object - /// with a speed of v m/s? - /// - /// The mass in kg. - /// The velocity. - /// The voltage. - /// charge (C) - static ld chargeOnPointToArriveWithSpeed(const ld m, const ld v, const ld V); - - /// - /// A prankster applies a voltage of V to an capacitor of C farad and then tosses it - /// to an unsuspecting victim. The victim's finger is burned by the discharge - /// of the capacitor through m g of flesh. What is the temperature increase - /// of the flesh? Is it reasonable to assume no phase change? - /// - /// The voltage. - /// The capacitance. - /// The mass. - /// The specific heat. - /// - static ld temperatureChangeFromCapacitanceBurn(const ld V, const ld C, const ld m, const ld _c ); - - /// - /// Potential energy used to move positive charge. - /// - /// The positive charge. - /// The change in volts. - /// KE (J) - static ld kineticEnergyFinalToMovePositiveCharge(const ld q, const ld Vab); - - - - void setElectricPotentialVal(ld val) - { - _electricPotentialVal = val; - } - - ~ElectricPotential() - { - delete _electricalPotentialPtr; - } - -private: - static void countIncrease() { electricalPotential_objectCount += 1; } - static void countDecrease() { electricalPotential_objectCount -= 1; } - ld _electricPotentialVal; - -}; - -#endif //PHYSICSFORMULA_ELECTRICPOTENTIAL_H - - -inline ld ElectricPotential::electricalPotential_V(const ld PE, const ld q) -{ - return PE/q; -} - -inline ld ElectricPotential::potentialDifference_PE(const ld q, const ld V) -{ - return q*V; -} - -inline ld ElectricPotential::chargeMoved_q(const ld PE, const ld V) -{ - return PE / V; -} - -inline ld ElectricPotential::electronsPerSecond(const ld chargeMoved) -{ - return chargeMoved/_ELECTRON_CHARGE_; -} - -inline ld ElectricPotential::electronVolts_eV(const ld V) -{ - return _eV_ * V; -} - -inline ld ElectricPotential::electronVoltsFromJoules(const ld joules) -{ - return joules/_PROTON_CHARGE_; -} - -inline ld ElectricPotential::velocityFinal(const ld q, const ld V, const ld m) -{ - return sqrt((2.0 * q * V) / m); -} - -inline ld ElectricPotential::velocityFinal(const ld KE, const ld m) -{ - return sqrt((2.0 * KE) / m); -} - -inline ld ElectricPotential::voltageBetween2points_Vab(const ld E, const ld d) -{ - return E * d; -} - -inline ld ElectricPotential::electricFieldMagnitude(const ld V, const ld d) -{ - return V / d; -} - -inline ld ElectricPotential::electricField(const ld V, const ld s) -{ - return -(V / s); -} - -inline ld ElectricPotential::voltsFromElectricFieldGradient(const ld E, const ld s) -{ - return -E * s; -} - -inline ld ElectricPotential::distanceOverChangeInVolts_s(const ld V, const ld E) -{ - return V / E; -} - -inline ld ElectricPotential::distancePointChargeToEqualVoltsOf(const ld Q, const ld V) -{ - return (_k_*Q)/V; -} - -inline ld ElectricPotential::electricPotential_pointCharge(const ld Q, const ld r) -{ - return (_k_ * Q) / r; -} - -inline ld ElectricPotential::excessCharge(const ld r, const ld V) -{ - return (r * V) / _k_; -} - -inline ld ElectricPotential::voltageNeededToObtainEnergy(const ld m, const ld v, const ld q, const ld numProtons) -{ - return -(m * (v*v)) / (2.0 * (numProtons*q)); -} - -inline ld ElectricPotential::temperatureAvgKineticEnergyGasMolecule(const ld V, const ld q = _PROTON_CHARGE_) -{ - - return (2* q* V)/(3.0 * BOLTZMANN_K_); -} - -inline ld ElectricPotential::voltageIonsMoveThroughToReachSameTemperature(const ld T, const ld q = _PROTON_CHARGE_) -{ - return (3/2)*((BOLTZMANN_K_*T)/q); -} - - -inline ld ElectricPotential::capacitance(const ld Q, const ld V) -{ - return Q/V; -} - -inline ld ElectricPotential::capacitanceCharge(const ld C, const ld V) -{ - return C * V; -} - -inline ld ElectricPotential::capacitanceVolts(const ld Q, const ld C) -{ - return Q/C; -} - -inline ld ElectricPotential::capacitanceParallelPlate(const ld A, const ld d) -{ - return _e0_ * (A / d); -} - - -inline ld ElectricPotential::capacitanceParallelPlateDielectric(const ld d_k, const ld A, const ld d) -{ - return d_k * _e0_ * (A / d); -} - -inline ld ElectricPotential::dielectricConstant(const ld E0, const ld E) -{ - return E0/E; -} - -inline ld ElectricPotential::capacitorEnergy_Ecap_QV(const ld Q, const ld V) -{ - return (Q * V) / 2.0; -} - -inline ld ElectricPotential::capacitorEnergy_Ecap_CV(const ld C, const ld V) -{ - return (C*(V*V))/2.0; -} - -inline ld ElectricPotential::capacitorEnergy_Ecap_QC(const ld Q, const ld C) -{ - return (Q*Q)/(2.0*C); -} - -inline ld ElectricPotential::potentialAcross_Ecap_CE(const ld C, const ld Ecap) -{ - return sqrt((Ecap * 2.0) / C); -} - - -inline ld ElectricPotential::capacitorPlateArea(const ld C, const ld d) -{ - return C * d / (_e0_); -} - -inline ld ElectricPotential::capacitorPlateAreaDielectric(const ld C, const ld d, const ld k) -{ - return (d * C) / (k * _e0_); -} - -inline ld ElectricPotential::vMaxOnCapacitor(const ld dStrength, const ld d) -{ - return dStrength * d; -} - - -inline ld ElectricPotential::maxChargeCanBeStoredCapacitor(const ld C, const ld vMax) -{ - return C * vMax; -} - -inline ld ElectricPotential::volumeOfDielectricMaterial(const ld A, const ld d) -{ - return A * d; -} - -inline ld ElectricPotential::electricFieldStrengthBetween2plates(const ld KE, const ld q, const ld d) -{ - return KE/(q*d); -} - -inline ld ElectricPotential::potentialNearSurfaceOfSphere(const ld d, const ld q) -{ - return (2.0*_k_*q)/d; -} - -inline ld ElectricPotential::chargeOnSphere(const ld d, const ld V) -{ - return (d*V)/(2.0*_k_); -} - -inline ld ElectricPotential::chargeOnPointToArriveWithSpeed(const ld m, const ld v, const ld V) -{ - return (m*(v*v))/(2.0*V); -} - -inline ld ElectricPotential::temperatureChangeFromCapacitanceBurn(const ld V, const ld C, const ld m, const ld _c_ = _c.human_body_average_S[0]) -{ - return (C*(V*V))/(2.0*m*_c_); -} - -inline ld ElectricPotential::kineticEnergyFinalToMovePositiveCharge(const ld q, const ld Vab) -{ - return -q * Vab; -} - +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_ELECTRICPOTENTIAL_H +#define PHYSICSFORMULA_ELECTRICPOTENTIAL_H +/** + * @class ElectricPotential + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @dateBuilt 12/31/2020 + * @lastEdit 12/31/2020 + */ +//#include "ElectricCharge.h" +#include "Heat.h" +#include + + + + +static int electricalPotential_objectCount = 0; + +constexpr auto _eV_ = 1.602e-19; + +//constexpr auto _LIGHTSPEED_ = 2.99792458e8; +//multiply joules by this to convert to electron Volts +constexpr auto _JOULES2eV_ = 1.0 / _eV_; + +static struct DielectricConstants +{ + const ld vacuum = 1.00000; //1.00000 + const ld Air = 1.00059; //1.00059 + const ld Bakelite = 4.9; //4.9 + const ld fused_quartz = 3.78; //3.78 + const ld neoprene_rubber = 6.7; //6.7 + const ld nylon = 3.4; //3.4 + const ld paper = 3.7; //3.7 + const ld polystyrene = 2.56; //2.56 + const ld pyrex_glass = 55.6; //5.6 + const ld silicon_oil = 2.5; //2.5 + const ld strontium_titanate = 233; //233 + const ld teflon = 2.1; //2.1 + const ld water = 80; //80 + +}dielectric_constants; + +static struct DielectricStrength +{ + const ld Air = 3.0*pow(10,6); //3.0e6 + const ld Bakelite = 24*pow(10,6); //24e6 + const ld fused_quartz = 8*pow(10,6); //8e6 + const ld neoprene_rubber = 12*pow(10,6); //12e6 + const ld nylon = 14*pow(10,6); //14e6 + const ld paper = 16*pow(10,6); //16e6 + const ld polystyrene = 24*pow(10,6); //24e6 + const ld pyrex_glass = 14*pow(10,6); //14e6 + const ld silicon_oil = 15*pow(10,6); //15e6 + const ld strontium_titanate = 8*pow(10,6); //8e6 + const ld teflon = 60*pow(10,6); //60e6 + +}dielectric_strength; + + + + +class ElectricPotential +{ +public: + ElectricPotential* _electricalPotentialPtr; + + ElectricPotential() + { + _electricalPotentialPtr = nullptr; + _electricPotentialVal = 0.0; + countIncrease(); + } + + ElectricPotential(ld val) + { + _electricalPotentialPtr = nullptr; + _electricPotentialVal = 0.0; + countIncrease(); + } + + /** + * @brief copy constructor + */ + ElectricPotential(const ElectricPotential& t) + { + _electricalPotentialPtr = t._electricalPotentialPtr; + _electricPotentialVal = t._electricPotentialVal; + countIncrease(); + } + /** + * #brief move constructor + */ + ElectricPotential(ElectricPotential&& t) noexcept + { + _electricalPotentialPtr = t._electricalPotentialPtr; + _electricPotentialVal = t._electricPotentialVal; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + ElectricPotential& operator=(const ElectricPotential& t) + { + if (this != &t) + { + _electricalPotentialPtr = t._electricalPotentialPtr; + _electricPotentialVal = t._electricPotentialVal; + countIncrease(); + } + return *this; + } + + static void show_objectCount() { std::cout + << "\n electrical potential object count: " + << electricalPotential_objectCount << std::endl; } + static int get_objectCount() { return electricalPotential_objectCount; } + + /// + /// This is the electrical potential energy per unit change + /// + /// The potential energy. + /// The charge that can be moved. + /// the electrical potential, volts(V) + static ld electricalPotential_V(const ld PE, const ld q); + + /// + /// Potentials the difference. + /// + /// The charge. + /// The voltage. + /// the potential difference (PE) + static ld potentialDifference_PE(const ld q, const ld V); + + /// + /// calculates the total charge moved in Coulombs + /// + /// The Potential difference. + /// The electrical potential. + /// the charge(q) in Coulombs(C) moved + static ld chargeMoved_q(const ld PE, const ld V); + + /// + /// Calculates the numbers of electrons that pass through a charge per + /// second. + /// + /// The charge moved(q). + /// number of electrons(Ne) + static ld electronsPerSecond(const ld chargeMoved); + + /// + /// 1 eV = (1.60e-19 C)(1V)= (1.60e-19 C)(1 J/C)joule per Coulomb + /// + /// The Volts. + /// + static ld electronVolts_eV(const ld V); + + /// + /// Converts to electron volts from known joules + /// + /// The joules. + /// electron volts (eV) + static ld electronVoltsFromJoules(const ld joules); + + /// + /// Calculates the final speed of a particle with a mass of m, a charge + /// of q and a potential difference of V. + /// + /// The charge. + /// The electrical potential. + /// The mass. + /// velocity (m/s) + static ld velocityFinal(const ld q, const ld V, const ld m); + + /// + /// Calculates the final speed of a particle with a mass of m, a charge + /// of q and a potential difference of V. + /// + /// The Kinetic Energy (J). + /// The mass. + /// velocity (m/s) + static ld velocityFinal(const ld KE, const ld m); + + /// + /// Calculates the voltages between two points for a uniform electric field only + /// + /// The max electric field strength. + /// The distance of separation. + /// maximum voltage (V) + static ld voltageBetween2points_Vab(const ld E, const ld d); + + /// + /// Calculates the Electric field strength between two points/plates for + /// a uniform electric field only + /// + /// The potential difference or volts. + /// The distance between points. + /// magnitude of electric field(N/C)(V/m) + static ld electricFieldMagnitude(const ld V, const ld d); + + /// + /// Calculates the electric field. which ius said to be the gradient fo the + /// electric potential. + /// + /// The volts. + /// The distance the change in volts occurs. + /// electric field + static ld electricField(const ld V, const ld s); + + /// + /// Calculates the volts from electric field. + /// + /// The electric field strength. + /// The distance over which the change in potential takes + /// place. + /// + static ld voltsFromElectricFieldGradient(const ld E, const ld s); + + /// + /// Calculates the distances over which the change in volts occurs. + /// + /// The change in volts. + /// The Electric field strength. + /// distance(m) + static ld distanceOverChangeInVolts_s(const ld V, const ld E); + + /// + /// How far from a Q charged point charge will the potential be V volts? + /// + /// The charge (C). + /// The volts. + /// distance (meters) + static ld distancePointChargeToEqualVoltsOf(const ld Q, const ld V); + + /// + /// Electrics the potential point charge. + /// + /// The point charge. + /// The distance. + /// voltage + static ld electricPotential_pointCharge(const ld Q, const ld r); + + /// + /// calculates the excesses charge. + /// + /// The radius. + /// The voltage. + /// charge in Coulombs(C) + static ld excessCharge(const ld r, const ld V); + + /// + /// Calculates the voltage needed to obtain a certain energy. + /// + /// The m. + /// The v. + /// The q. + /// number of protons in atom of consideration + /// voltage (V) + static ld voltageNeededToObtainEnergy(const ld m, const ld v, const ld q, const ld numProtons); + + /// + /// ions with a charge iof q are accelerated from rest through a voltage + /// of V. At what temperature will the average kinetic energy of gas + /// molecules be the same as that given these ions? + /// + /// The charge. + /// The voltage. + /// temperature in Kelvin(k) + static ld temperatureAvgKineticEnergyGasMolecule(const ld V, const ld q); + + /// + /// The temperature of ion particles is T degrees Celsius. Through what voltage + /// must a charged ion be accelerated to have the same energy as the average + /// kinetic energy of ions at this temperature? + /// + /// The t. + /// The q. + /// voltage (V) + static ld voltageIonsMoveThroughToReachSameTemperature(const ld T, const ld q); + + //static ld massToRaisFromTemp1ToTemp2(const ld) + + + /// + /// Capacitance of a capacitor. units of C/V or A^2s^2/kg*m^2 + /// + /// The charge. + /// The volts. + /// the capacitance (C/V) + static ld capacitance(const ld Q, const ld V); + + /// + /// Calculates the charge stored in a capacitor. + /// + /// The Capacitance. + /// The volts. + /// the charge (Q) + static ld capacitanceCharge(const ld C, const ld V); + + /// + /// Calculates the voltage applied to a C (F) capacitor when it holds + /// Q (C) of charge. + /// + /// The charge. + /// The capacitance. + /// volts (V) + static ld capacitanceVolts(const ld Q, const ld C); + + /// + /// Calculates the capacitance of a parallel plate capacitor + /// + /// the area. + /// The distance between plates. + /// the capacitance C in farads + static ld capacitanceParallelPlate(const ld A, const ld d); + + /// + /// Calculates the capacitance of a parallel plate capacitor with a + /// dielectric + /// + /// The dielectric constant. + /// The area of the capacitor. + /// The distance between plates. + /// the capacitance C in farads + static ld capacitanceParallelPlateDielectric(const ld d_k, const ld A, const ld d); + + /// + /// the dielectric constant is generally defined to be the ratio of the + /// electric field in a vacuum to that in the dielectric material, and is + /// intimately related to the polarize-ability of the material. + /// + /// The electric field in a vacuum. + /// The electric field of the dielectric. + /// dielectric constant + static ld dielectricConstant(const ld E0, const ld E); + + /// + /// calculates the energy stored in a capacitor + /// Ecap = (Q*V)/2. + /// + /// The charge. + /// The volts. + /// Energy stored in capacitor + static ld capacitorEnergy_Ecap_QV(const ld Q, const ld V); + + /// + /// calculates the energy stored in a capacitor + /// Ecap = (C * V^2)/2.0. + /// + /// The capacitance. + /// The volts. + /// Energy stored in capacitor + static ld capacitorEnergy_Ecap_CV(const ld C, const ld V); + + /// + /// calculates the energy stored in a capacitor + /// Ecap = Q^2/2*C. + /// + /// The charge. + /// The capacitance. + /// Energy stored in capacitor + static ld capacitorEnergy_Ecap_QC(const ld Q, const ld C); + + /// + /// Potentials the across ecap ce. + /// + /// The c. + /// The ecap. + /// + static ld potentialAcross_Ecap_CE(const ld C, const ld Ecap); + + /// + /// Calculate the area the parallel plates of a capacitor of capacitance C + + /// must have if they are separated by a distance of d. + /// + /// The capacitance. + /// The distance. + /// the area of the parallel plates of a capacitor (m^2) + static ld capacitorPlateArea(const ld C, const ld d); + + /// + /// Calculate the area the parallel plates of a capacitor with a capacitance + /// of C must have if it is separated by d meters of a dielectric, which + /// has a dielectric constant of k. + /// + /// The capacitance. + /// The distance of separation . + /// The dielectric constant. + /// the area of the parallel plates of a capacitor (m^2) + static ld capacitorPlateAreaDielectric(const ld C, const ld d, const ld k); + + /// + /// vs the maximum on capacitor. + /// + /// The dielectric strength. + /// The distance between plates. + /// max voltage that can be applied + static ld vMaxOnCapacitor(const ld dStrength, const ld d); + + /// + /// Maximums the charge can be stored capacitor. + /// + /// The capacitance. + /// The max voltage. + /// max charge that can be stored in a capacitor (C) + static ld maxChargeCanBeStoredCapacitor(const ld C, const ld vMax); + + /// + /// Calculates the Volume the of dielectric material. + /// + /// area. + /// The distance. + /// + static ld volumeOfDielectricMaterial(const ld A, const ld d); + + /// + /// Electrics the field strength between2plates. + /// + /// The kinetic energy. + /// The charge. + /// The distance. + /// Electric field strength(V/m) + static ld electricFieldStrengthBetween2plates(const ld KE, const ld q, const ld d); + + /// + /// A plastic sphere of diameter d is used in a static electricity + /// demonstration, has a uniformly distributed charge of q on its + /// surface. What is the potential near its surface? + /// + /// The diameter of sphere. + /// The charge. + /// volts + static ld potentialNearSurfaceOfSphere(const ld d, const ld q); + + /// + /// An electrostatic paint sprayer has a metal sphere of diameter d and + /// a potential of V volts that repels paint droplets onto a grounded + /// object. What charge is on the sphere? + /// + /// The diameter. + /// The volts. + /// the charge (C) + static ld chargeOnSphere(const ld d, const ld V); + + /// + /// What charge must a 0.100-mg point with a potential of V have to arrive at an object + /// with a speed of v m/s? + /// + /// The mass in kg. + /// The velocity. + /// The voltage. + /// charge (C) + static ld chargeOnPointToArriveWithSpeed(const ld m, const ld v, const ld V); + + /// + /// A prankster applies a voltage of V to an capacitor of C farad and then tosses it + /// to an unsuspecting victim. The victim's finger is burned by the discharge + /// of the capacitor through m g of flesh. What is the temperature increase + /// of the flesh? Is it reasonable to assume no phase change? + /// + /// The voltage. + /// The capacitance. + /// The mass. + /// The specific heat. + /// + static ld temperatureChangeFromCapacitanceBurn(const ld V, const ld C, const ld m, const ld _c ); + + /// + /// Potential energy used to move positive charge. + /// + /// The positive charge. + /// The change in volts. + /// KE (J) + static ld kineticEnergyFinalToMovePositiveCharge(const ld q, const ld Vab); + + + + void setElectricPotentialVal(ld val) + { + _electricPotentialVal = val; + } + + ~ElectricPotential() + { + delete _electricalPotentialPtr; + } + +private: + static void countIncrease() { electricalPotential_objectCount += 1; } + static void countDecrease() { electricalPotential_objectCount -= 1; } + ld _electricPotentialVal; + +}; + +#endif //PHYSICSFORMULA_ELECTRICPOTENTIAL_H + + +inline ld ElectricPotential::electricalPotential_V(const ld PE, const ld q) +{ + return PE/q; +} + +inline ld ElectricPotential::potentialDifference_PE(const ld q, const ld V) +{ + return q*V; +} + +inline ld ElectricPotential::chargeMoved_q(const ld PE, const ld V) +{ + return PE / V; +} + +inline ld ElectricPotential::electronsPerSecond(const ld chargeMoved) +{ + return chargeMoved/_ELECTRON_CHARGE_; +} + +inline ld ElectricPotential::electronVolts_eV(const ld V) +{ + return _eV_ * V; +} + +inline ld ElectricPotential::electronVoltsFromJoules(const ld joules) +{ + return joules/_PROTON_CHARGE_; +} + +inline ld ElectricPotential::velocityFinal(const ld q, const ld V, const ld m) +{ + return sqrt((2.0 * q * V) / m); +} + +inline ld ElectricPotential::velocityFinal(const ld KE, const ld m) +{ + return sqrt((2.0 * KE) / m); +} + +inline ld ElectricPotential::voltageBetween2points_Vab(const ld E, const ld d) +{ + return E * d; +} + +inline ld ElectricPotential::electricFieldMagnitude(const ld V, const ld d) +{ + return V / d; +} + +inline ld ElectricPotential::electricField(const ld V, const ld s) +{ + return -(V / s); +} + +inline ld ElectricPotential::voltsFromElectricFieldGradient(const ld E, const ld s) +{ + return -E * s; +} + +inline ld ElectricPotential::distanceOverChangeInVolts_s(const ld V, const ld E) +{ + return V / E; +} + +inline ld ElectricPotential::distancePointChargeToEqualVoltsOf(const ld Q, const ld V) +{ + return (_k_*Q)/V; +} + +inline ld ElectricPotential::electricPotential_pointCharge(const ld Q, const ld r) +{ + return (_k_ * Q) / r; +} + +inline ld ElectricPotential::excessCharge(const ld r, const ld V) +{ + return (r * V) / _k_; +} + +inline ld ElectricPotential::voltageNeededToObtainEnergy(const ld m, const ld v, const ld q, const ld numProtons) +{ + return -(m * (v*v)) / (2.0 * (numProtons*q)); +} + +inline ld ElectricPotential::temperatureAvgKineticEnergyGasMolecule(const ld V, const ld q = _PROTON_CHARGE_) +{ + + return (2* q* V)/(3.0 * BOLTZMANN_K_); +} + +inline ld ElectricPotential::voltageIonsMoveThroughToReachSameTemperature(const ld T, const ld q = _PROTON_CHARGE_) +{ + return (3/2)*((BOLTZMANN_K_*T)/q); +} + + +inline ld ElectricPotential::capacitance(const ld Q, const ld V) +{ + return Q/V; +} + +inline ld ElectricPotential::capacitanceCharge(const ld C, const ld V) +{ + return C * V; +} + +inline ld ElectricPotential::capacitanceVolts(const ld Q, const ld C) +{ + return Q/C; +} + +inline ld ElectricPotential::capacitanceParallelPlate(const ld A, const ld d) +{ + return _e0_ * (A / d); +} + + +inline ld ElectricPotential::capacitanceParallelPlateDielectric(const ld d_k, const ld A, const ld d) +{ + return d_k * _e0_ * (A / d); +} + +inline ld ElectricPotential::dielectricConstant(const ld E0, const ld E) +{ + return E0/E; +} + +inline ld ElectricPotential::capacitorEnergy_Ecap_QV(const ld Q, const ld V) +{ + return (Q * V) / 2.0; +} + +inline ld ElectricPotential::capacitorEnergy_Ecap_CV(const ld C, const ld V) +{ + return (C*(V*V))/2.0; +} + +inline ld ElectricPotential::capacitorEnergy_Ecap_QC(const ld Q, const ld C) +{ + return (Q*Q)/(2.0*C); +} + +inline ld ElectricPotential::potentialAcross_Ecap_CE(const ld C, const ld Ecap) +{ + return sqrt((Ecap * 2.0) / C); +} + + +inline ld ElectricPotential::capacitorPlateArea(const ld C, const ld d) +{ + return C * d / (_e0_); +} + +inline ld ElectricPotential::capacitorPlateAreaDielectric(const ld C, const ld d, const ld k) +{ + return (d * C) / (k * _e0_); +} + +inline ld ElectricPotential::vMaxOnCapacitor(const ld dStrength, const ld d) +{ + return dStrength * d; +} + + +inline ld ElectricPotential::maxChargeCanBeStoredCapacitor(const ld C, const ld vMax) +{ + return C * vMax; +} + +inline ld ElectricPotential::volumeOfDielectricMaterial(const ld A, const ld d) +{ + return A * d; +} + +inline ld ElectricPotential::electricFieldStrengthBetween2plates(const ld KE, const ld q, const ld d) +{ + return KE/(q*d); +} + +inline ld ElectricPotential::potentialNearSurfaceOfSphere(const ld d, const ld q) +{ + return (2.0*_k_*q)/d; +} + +inline ld ElectricPotential::chargeOnSphere(const ld d, const ld V) +{ + return (d*V)/(2.0*_k_); +} + +inline ld ElectricPotential::chargeOnPointToArriveWithSpeed(const ld m, const ld v, const ld V) +{ + return (m*(v*v))/(2.0*V); +} + +inline ld ElectricPotential::temperatureChangeFromCapacitanceBurn(const ld V, const ld C, const ld m, const ld _c_ = _c.human_body_average_S[0]) +{ + return (C*(V*V))/(2.0*m*_c_); +} + +inline ld ElectricPotential::kineticEnergyFinalToMovePositiveCharge(const ld q, const ld Vab) +{ + return -q * Vab; +} + diff --git a/ElectroMagneticInduction.h b/ElectroMagneticInduction.h index 7efef74..e683b0e 100644 --- a/ElectroMagneticInduction.h +++ b/ElectroMagneticInduction.h @@ -1,1080 +1,1080 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_ELECTROMAGNETICINDUCTION_H -#define PHYSICSFORMULA_ELECTROMAGNETICINDUCTION_H -/** - * @class ElectroMagneticInduction - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @dateBuilt 3/21/2021 - * @lastEdit 3/21/2021 - */ -#include - -#include "Magnetism.h" -#include - - -static int emi_objectCount = 0; -typedef long double ld; - -class ElectroMagneticInduction : - public Magnetism -{ - -public: - ElectroMagneticInduction* _emiPtr; - - - ElectroMagneticInduction() - { - _emiPtr = nullptr; - _electroMagVar = 0.0; - countIncrease(); - } - - ElectroMagneticInduction(ld val) - { - _emiPtr = nullptr; - _electroMagVar = val; - countIncrease(); - } - - /** - * @brief copy constructor - */ - ElectroMagneticInduction(const ElectroMagneticInduction& t) - { - _emiPtr = t._emiPtr; - _electroMagVar = t._electroMagVar; - countIncrease(); - } - /** - * #brief move constructor - */ - ElectroMagneticInduction(ElectroMagneticInduction&& t) noexcept - { - _emiPtr = t._emiPtr; - _electroMagVar = t._electroMagVar; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - ElectroMagneticInduction& operator=(ElectroMagneticInduction&& t)noexcept - { - if (this != &t) - { - _emiPtr = t._emiPtr; - _electroMagVar = t._electroMagVar; - countIncrease(); - } - return *this; - } - void setElectroMagVar(ld var) { _electroMagVar = var; } - ld getElectroMagVar()const { return _electroMagVar; } - static void show_objectCount() { std::cout << "\n electromagnetic induction object count: " - << emi_objectCount << std::endl; } - static int get_objectCount() { return emi_objectCount; } - - - /// - /// Calculates the magnetic flux where B is the magnetic field strength(T) - /// over an area of A (m^2), at an angle theta with the perpendicular to - /// the area. Any change in the magnetic flux induces an emf. This process - /// is defined to be electromagnetic induction. - /// - /// The magnetic field strength(T). - /// The area(m^2). - /// The angle theta default is at 0 degrees which - /// is equal to 1 making the equation flux = B*A. - /// the magnetic flux (T*m^2) - static ld magneticFlux(const ld B, const ld A, const ld theta); - - /// - /// A generator coil is rotated through a revolution from 0 to theta degrees, - /// in t seconds. Having N turns the coil has a radius of r (m) and is in a - /// uniform magnetic field of B. Calculate the average emf induced. - /// - /// The number of turns in coil. - /// The radius of coil. - /// The magnetic uniform field. - /// The time it takes to rotate theta degrees. - /// The starting angle of rotation. - /// The finishing angle of rotation. - /// emf average (V) - static ld emfFaradyFullEquation(const ld N, const ld r, const ld B, const ld t, const ld thetaS, const ld thetaF); - - /// - /// Calculates the magnitude of an induced emf when a bar magnet is thrust - /// into a coil with N loops having a radius of r (m) and the average value of - /// B cos(theta) that is given due to complexity as increasing from B1 to B2 - /// over a period of t seconds. - /// - /// The number of loops. - /// The radius. - /// The starting magnetic field. - /// The ending magnetic field. - /// The time over which the increase of the - /// magnetic field takes place. - /// magnitude of emf (V) - static ld emfMagnitude_FaradayNoMinus(const ld N, const ld r, const ld B1, const ld B2, const ld t, const ld theta); - - /// - /// Calculates the change in flux. - /// - /// the area = pi*r^2. - /// The delta b = . - /// - static ld deltaFlux(const ld A, const ld deltaB); - - /// - /// EMFs the induced in generator coil. - /// - /// The number of loop in coil. - /// The length of the loop. - /// The width of coil loop. - /// a angular velocity. - /// The magnetic field strength. - /// The time for a rotation. - /// emf total from generator coil (V) - static ld emf_inducedInGeneratorCoil(const ld N, const ld l, const ld w, const ld aW, const ld B, const ld t); - - /// - /// Calculates the peek emf. - /// - /// The number of turns in a coil. - /// The area. - /// The magnetic field strength. - /// The angular velocity. - /// peek emf (V) - static ld emf_peek(const ld N, const ld A, const ld B, const ld aW); - - /// - /// Calculates the peek emf. - /// - /// The number of turns in a coil. - /// The radius of coil. - /// The magnetic field strength. - /// The angle of rotation in radians. - /// The time for a rotation. - /// peek emf (V) - static ld emf_peek(const ld N, const ld r, const ld B, const ld rad, const ld t); - - /// - /// A N turn, r(m) radius coil rotates at an angular velocity of - /// aW rad/s in a B(T) field, starting with the normal of the plane - /// of the coil perpendicular to the field. Assume that the positive max - /// emf is reached first. - /// - /// The number of turns in coil. - /// The radius or half of the diameter. - /// The magnetic field strength. - /// a angular velocity. - /// peek emf - static ld emfPeek_r(const ld N, const ld r, const ld B, const ld aW); - - /// - /// Calculate the peak voltage of a generator that rotates its N-turn, - /// d m diameter coil rotating at rpm rpms in a B T field. - /// - /// The number of loops in coil. - /// The diameter of coil. - /// The magnetic filed strength. - /// The RPMs. - /// peek emf voltage - static ld emf_peekFromDiameterAndRPMs(const ld N, const ld d, const ld B, const ld rpm); - - /// - /// Calculates the EMF induced by magnetic flux over t time having N turns - /// is considered Faraday's law of induction: Lenz's Law->(why there is a - /// minus sign. - /// - /// The amount of turns in coil. - /// The flux. - /// The time. - /// emf = volts(V) - static ld emf_inducedByMagneticFlux(const ld N, const ld f, const ld t); - - /// - /// An MRI technician moves his hand from a region of very low magnetic field - /// strength into an MRI scanner’s magnetic field of B(T) with his fingers - /// pointing in the direction of the field. Calculate the average emf induced in - /// his wedding ring, given its diameter is d(m) and assuming it takes time - /// t(s) to move it into the field. - /// - /// The magnetic filed. - /// The diameter. - /// The time in seconds. - /// average emf (V) - static ld emf_avgOnCoil(const ld B, const ld d, const ld t); - - /// - /// number of turns in a coil from EMF and time t over the flux; - /// - /// The time. - /// The EMF. - /// The flux. - /// turns in a coil - static ld n_turnsInCoilFromEMFEquation(const ld t, const ld emf, const ld f); - - /// - /// calculates the fluxes from EMF equation, with a time of t and N turns in - /// a coil - /// - /// The EMF. - /// The time. - /// The number of turns in a coil. - /// magnetic flux(T*m^2) - static ld flux_fromEMFEquation(const ld emf, const ld t, const ld N); - - /// - /// calculates the times from EMF equation with a flux and emf with N turns - /// of a coil. - /// - /// The number of turns of a coil - /// The flux. - /// The EMF. - /// time in seconds - static ld time_fromEMFEquation(const ld N, const ld f, const ld emf); - - /// - /// Calculates the motional EMF. - /// - /// The magnetic field. - /// The length of rod. - /// The distance the rod moves. - /// The time it moves over. - /// emf from motion (V) - static ld motionalEMF(const ld B, const ld l, const ld x, const ld t); - - /// - /// Calculates the motional EMF. - /// - /// The magnetic field. - /// The length of rod. - /// The velocity -> x/t . - /// emf from motion(V) - static ld motionalEMF(const ld B, const ld l, const ld v); - - /// - /// calculates the length a magnetic rod must be when producing an emf of V. - /// - /// The EMF voltage (V). - /// The magnetic field (B). - /// The velocity (v). - /// length of magnetic rod - static ld lengthOfRod_emfEq(const ld V, const ld B, const ld v); - - /// - /// Calculates the velocity of the motion of magnetic rod when a emf of V is - /// created with a magnetic field of B and having a rod of length l (m). - /// - /// The emf voltage (V). - /// The magnetic field (T). - /// The length of rod (m). - /// velocity (m/s) - static ld velocityOfMotion_emfEq(const ld V, const ld B, const ld l); - - /// - /// Calculates the magnetic field from when a rod of length l moves at a - /// velocity of v causing a magnetic field strength of B. - /// - /// The emf voltage. - /// The length of rod. - /// The velocity. - /// magnetic field strength (T) - static ld magneticFieldFrom_emfEq(const ld V, const ld l, const ld v); - - /// - /// Magnetics the field magnitude. - /// - /// The flux. - /// The Area, radius or diameter. - /// The theta, is at default value of 0. - /// The mode is used as a switch between what - /// information you use for the Ard argument: use 'r' for radius or 'd' - /// for diameter and if you are using the already calculated cross sectional - /// then leave out.. - /// magnetic field (T) - static ld magneticFieldMagnitude(const ld flux, const ld Ard, const ld theta, const ld mode); - - /// - /// Calculates the voltage or number of loops in a transformer. Use a 0 as - /// placeholder in the unknowns method argument. - /// - /// The volts secondary(output). - /// The volts primary(input). - /// The number of loops secondary(output). - /// The number of loops primary(input). - /// The mode used to specify what you want to solve for,\n - /// "Vs" = volts secondary,\n - /// "vp" = volts primary,\n - /// "Ns" = number of loops secondary,\n - /// "Np" = number of loops primary.\n - /// example: transformerEquation(2.5,3.4,5,10,"Ns");\n - /// this would solve for the number of loops in the secondary transformer - /// volts or loops depending on mode used - static ld transformerEquations_VN(const ld Vs, const ld Vp, const ld Ns, const ld Np, std::string mode); - - /// - /// Calculates the voltage or current in a transformer. use a 0 as a place - /// holder in the unknown variables method argument. - /// - /// The volts secondary(output). - /// The volts primary(input). - /// The current secondary(output). - /// The current primary(input). - /// The mode used to specify what you want to solve for,\n - /// "Vs" = volts secondary,\n - /// "vp" = volts primary,\n - /// "Is" = current secondary,\n - /// "Ip" = current primary.\n - /// example: transformerEquation(2.5,3.4,5,10,"Is");\n - /// this would solve for the current in the secondary transformer - /// volts or current depending on the mode picked - static ld transformerEquations_VI(const ld Vs, const ld Vp, const ld Is, const ld Ip, std::string mode); - - /// - /// Calculates the current or number of loops in a transformer. use a 0 as a place - /// holder in the unknown variables method argument. - /// - /// The current secondary(output). - /// The current primary(input). - /// The number of loops secondary(output). - /// The number of loops primary(input). - /// The mode used to specify what you want to solve for,\n - /// "Is" = current secondary,\n - /// "Ip" = current primary,\n - /// "Ns" = number of loops secondary,\n - /// "Np" = number of loops primary.\n - /// example: transformerEquation(2.5,3.4,5,10,"Is");\n - /// this would solve for the current in the secondary transformer - /// current or number of loops depending on the mode picked - static ld transformerEquations_IN(const ld Is, const ld Ip, const ld Ns, const ld Np, std::string mode); - - /// - /// Calculates the frequencies from a know angular velocity of aW. - /// - /// a angular velocity. - /// frequency (Hz - static ld frequency(const ld aW); - - /// - /// Calculates the period from the known frequency of f. - /// - /// The frequency. - /// - static ld period(const ld f); - - /// - /// Calculates the current in the coil. - /// - /// The EMF. - /// The resistance. - /// current (A) - static ld currentInCoil(const ld emf, const ld R); - - /// - /// Calculates the emf2 from the mutual inductance of M between two devices - /// where the current from device one is I and the time t over which the - /// current changes. - /// - /// The Mutual inductance. - /// The current. - /// The time. - /// emf voltage - static ld emf_byMutualInductance(const ld M, const ld I, const ld t); - - - /// - /// Calculates the mutual inductance. - /// - /// The EMF. - /// The current. - /// The time. - /// henry(H) - static ld mutualInductance(const ld emf, const ld I, const ld t); - - /// - /// calculates the EMF by self inductance. also the back emf calculated with - /// this methods equation - /// - /// The self inductance of the device. - /// The current. - /// The time. - /// emf voltage - static ld emf_bySelfInductance(const ld L, const ld I, const ld t); - - /// - /// calculates the self inductance. - /// - /// The EMF. - /// The current. - /// The time. - /// inductance of inductor(H) - static ld selfInductance(const ld emf, const ld I, const ld t); - - /// - /// calculates the self inductance. - /// - /// The number of loops. - /// The flux. - /// The current.s - /// inductance(H) - static ld selfInductance_N(const ld N, const ld B, const ld I); - - /// - /// Calculates the self the inductance using the time constant and resistance - /// - /// The time constant. - /// The resistance. - /// self inductance - static ld selfInductance_timeConstant(const ld toa, const ld R); - - /// - /// Calculates the inductance of a solenoid. - /// - /// The number of turns in coil. - /// the area, radius or diameter. - /// The length of solenoid. - /// put a 'r' if use a radius or a 'd' if using the - /// diameter in the Ard argument. - /// inductance(H) - static ld inductanceSolenoid_L(const ld N, const ld A, const ld l, char mode); - - /// - /// Calculates the inductance from total energy of E stored in inductor - /// having a current of I. - /// - /// The energy of inductor. - /// The current. - /// the inductance (H) - static ld inductanceFromEnergyStored(const ld E, const ld I); - - /// - /// Calculates the energy stored in an inductor. - /// - /// The inductance. - /// The current. - /// energy (J) - static ld energyStoredInInductor(const ld L, const ld I); - - /// - /// Camera flashes charge a capacitor to high voltage by switching the - /// current through an inductor on and off rapidly. Calculate what time must - /// the a current of I through a inductance of L be switched on or off to - /// induce a emf. - /// - /// The current. - /// The inductance. - /// The EMF. - /// time to switch on off current through an inductor - static ld timeOnOffToinduceCurrent(const ld I, const ld L, const ld emf); - - /// - /// Calculate the current of a system with duel rails, - /// under the following conditions. The resistance between the rails is R, - /// the rails and the moving rod are identical in cross section A and have - /// the same resistivity ρ . The distance between the rails is l, and the - /// rod moves at constant speed v perpendicular to the uniform field B. - /// At time zero, the moving rod is next to the resistance R. - /// - /// The magnetic field. - /// The length. - /// The velocity. - /// The area. - /// The resistivity. - /// The radius. - /// The time. - /// current - static ld currentSystemOnRails(const ld B, const ld l, const ld v, const ld A, const ld p, const ld R, const ld t); - - /// - /// Calculates the Characteristic time constant. (cTc) - /// - /// The inductance. - /// The resistance. - /// the time constant - static ld characteristicTimeConstant(const ld L, const ld R); - - /// - /// Inductances the reactance (XL) - /// - /// The frequency. - /// The inductance. - /// inductive reactance (H) - static ld inductance_reactance_XL(const ld f, const ld L); - - /// - /// calculates the Capacitive reactance (XC). - /// - /// The frequency. - /// The capacitance. - /// capacitive reactance (ohms) - static ld capacitive_reactance_XC(const ld f, const ld C); - - /// - /// Calculates the capacitance from reactance and frequency - /// - /// The frequency in Hz. - /// The capacitive reactance. - /// farads - static ld capacitanceFromReactance(const ld f, const ld _xc); - - /// - /// Calculates the current in an inductor of an RC circuit at specific moments - /// of time t with an initial current of Io and a characteristic time constant of cTc. - /// - /// The initial current in inductor. - /// The time in seconds. - /// The characteristic time constant. - /// current at specified time when switched on (A) - static ld current_RLCircuit_switchON(const ld Io, const ld t, const ld cTc); - - /// - /// Calculates the current of an inductor of an RC circuit switch off. - /// - /// The current initially. - /// The time in seconds. - /// The characteristic time constant. - /// current at specified time when switched off - static ld current_RICircuit_switchOFF(const ld Io, const ld t, const ld cTc); - - /// - /// Calculates the current through inductor. - /// - /// The rms Voltage. - /// The inductance reactance. - /// current - static ld currentRMS_throughInductor(const ld Vrms, const ld _xl); - - /// - /// Calculates the current through capacitor. - /// - /// The Voltage RMS. - /// The conductive reactance. - /// current - static ld currentRMS_throughCapacitor(const ld Vrms, const ld _xc); - - /// - /// Calculates the peeks the current in an AC circuit using the peek voltage - /// of Vo and its impedance of Z. - /// - /// The peek voltage in circuit. - /// The impedance. - /// The peek current -> Io = peek Amps - static ld peekCurrent_AC(const ld Vo, const ld Z); - - /// - /// Calculates the RMS(root mean square) or average current in an AC circuit - /// using the rms Voltage and the circuits impedance of Z. - /// - /// The rms Voltage, average voltage. - /// The impedance in circuit. - /// the average or rms current Irms -> (A) - static ld rmsCurrent_AC(const ld Vrms, const ld Z); - - /// - /// Calculates the RMS(root mean square current or average current in a AC - /// series circuit. - /// - /// The root mean square voltage or Vrms. - /// The resistance. - /// The inductive reactance. - /// The conductive reactance. - /// Irms or root mean square current, average current(A) - static ld rmsCurrent_AC(const ld Vrms, const ld R, const ld _xl, const ld _xc); - - /// - /// Calculates the RMS(root mean square current or average current in a AC - /// series circuit. - /// - /// The root mean square voltage or Vrms. - /// The resistance. - /// The inductance. - /// The capacitance. - /// The frequency. - /// Irms or root mean square current, average current(A) - static ld rmsCurrent_AC(const ld Vrms, const ld R, const ld L, const ld C, const ld f); - - /// - /// Calculates the Impedance in a RLC series AC circuit. For circuits without - /// a resistor take R=0, for those without and inductor take _xl = 0, for - /// those without a capacitor take _xc = 0. - /// - /// The resistance. - /// The inductive reactance. - /// The capacitive reactance. - /// the impedance on an AC circuit (Ohms) - static ld impedance(const ld R, const ld _xl, const ld _xc); - - /// - /// Calculates the impedance in a RLC series AS circuit. - /// - /// The resistance. - /// The inductance. - /// The capacitance. - /// The frequency. - /// the impedance on an AC circuit (Ohms) - static ld impedance(const ld R, const ld L, const ld C, const ld f); - - /// - /// Calculates the resonant frequency in an RLC series AC circuit - /// - /// The inductance. - /// The capacitance. - /// resonant frequency (Hz) - static ld resonantFrequency(const ld L, const ld C); - - /// - /// Calculates the power factor. cos(phi) = R/Z. - /// - /// The resistance. - /// The impedance. - /// power factor(unit-less) - static ld powerFactor(const ld R, const ld Z); - - /// - /// Phases the angle. - /// - /// The pf. - /// phase angle - static ld phaseAngle(const ld pf); - - /// - /// Phases the angle. - /// - /// The resistance. - /// The impedance. - /// phase angle - static ld phaseAngle(const ld R, const ld Z); - - /// - /// Powers the average RLC. - /// - /// The average current . - /// The average voltage. - /// The power factor. - /// power in an RLC series AC circuit - static ld powerAvgRLC(const ld Irms, const ld Vrms, const ld pf); - - /// - /// Calculates the peak emf generated by a r(m) radius, N-turn - /// coil that is rotated one-fourth of a revolution in t(s), originally - /// having its plane perpendicular to a uniform B(T) magnetic field? - /// (This is 58 rev/s.) - /// - /// The radius. - /// The number of turns in coil. - /// The time in seconds. - /// The magnetic field strength. - /// peek emf - static ld emfPeek(const ld r, const ld N, const ld t, const ld B); - - - ~ElectroMagneticInduction() - { - delete _emiPtr; - } - -private: - static void countIncrease() { emi_objectCount += 1; } - static void countDecrease() { emi_objectCount -= 1; } - ld _electroMagVar; - -}; -#endif //PHYSICSFORMULA_ELECTROMAGNETICINDUCTION_H - -//============================================================================= -//in-line class Implementation - -inline ld ElectroMagneticInduction::magneticFlux(const ld B, const ld A, const ld theta = 0) -{ - return B * A * cos(theta * RADIAN);//T*m^2 = Tesla meters squared -} - -inline ld ElectroMagneticInduction::emfFaradyFullEquation(const ld N, const ld r, const ld B, const ld t, const ld thetaS, const ld thetaF) -{ - const ld area = Pi_ * (r * r); - const ld deltaTheta = cos(thetaF * RADIAN) - cos(thetaS * RADIAN); - const ld flux = area * B * deltaTheta; - return -N * (flux / t); -} - -inline ld ElectroMagneticInduction::emfMagnitude_FaradayNoMinus(const ld N, const ld r, const ld B1, const ld B2, const ld t, const ld theta) -{ - const ld area = Pi_ * (r * r); - const ld deltaB = abs(B2 - B1); - const ld deltaFlux = area * deltaB * cos(theta*RADIAN); - - return N * (deltaFlux / t);//V -} - -inline ld ElectroMagneticInduction::deltaFlux(const ld A, const ld deltaB) -{ - - return A * deltaB; -} - -inline ld ElectroMagneticInduction::emf_inducedInGeneratorCoil(const ld N, const ld l, const ld w, const ld aW, const ld B, const ld t) -{ - const ld area = l * w; - - return N * area * B * aW * sin((aW * t) * RADIAN);//V -} - -inline ld ElectroMagneticInduction::emf_peek(const ld N, const ld A, const ld B, const ld aW) -{ - return N * A * B * aW;//V -} - -inline ld ElectroMagneticInduction::emf_peek(const ld N, const ld r, const ld B, const ld rad, const ld t) -{ - const ld area = Pi_ * (r * r); - const ld aW = rad / t; - return N * area * B * aW;//V -} - -inline ld ElectroMagneticInduction::emfPeek_r(const ld N, const ld r, const ld B, const ld aW) -{ - return N * Pi_ * (r * r) * B * aW; -} - -inline ld ElectroMagneticInduction::emf_peekFromDiameterAndRPMs(const ld N, const ld d, const ld B, const ld rpm) -{ - const ld aW = (rpm * 2.0 * Pi_) / 60.0;//angular velocity - const ld A = (Pi_ * (d * d)) / 4;//cross sectional - return N * A * B * aW;//V -} - -inline ld ElectroMagneticInduction::emf_inducedByMagneticFlux(const ld N, const ld f, const ld t) -{ - return -N * (f / t);//V -} - -inline ld ElectroMagneticInduction::emf_avgOnCoil(const ld B, const ld d, const ld t) -{ - return (Pi_ * B * (d * d)) / (4.0 * t);//V -} - -inline ld ElectroMagneticInduction::n_turnsInCoilFromEMFEquation(const ld t, const ld emf, const ld f) -{ - return (t / f) * emf;//turns in coil -} - -inline ld ElectroMagneticInduction::flux_fromEMFEquation(const ld emf, const ld t, const ld N) -{ - return -(t * emf) / N;//T*m^2 -} - -inline ld ElectroMagneticInduction::time_fromEMFEquation(const ld N, const ld f, const ld emf) -{ - return N * (f / emf);//seconds -} - -inline ld ElectroMagneticInduction::motionalEMF(const ld B, const ld l, const ld x, const ld t) -{ - return B * ((l * x) / t);//V -} - -inline ld ElectroMagneticInduction::motionalEMF(const ld B, const ld l, const ld v) -{ - return B * l * v;//V -} - -inline ld ElectroMagneticInduction::lengthOfRod_emfEq(const ld V, const ld B, const ld v) -{ - return V / (B * v);//m -} - -inline ld ElectroMagneticInduction::velocityOfMotion_emfEq(const ld V, const ld B, const ld l) -{ - return V / (B * l);// m/s -} - -inline ld ElectroMagneticInduction::magneticFieldFrom_emfEq(const ld V, const ld l, const ld v) -{ - return V / (l * v);//T -} - -inline ld ElectroMagneticInduction::magneticFieldMagnitude(const ld flux, const ld Ard, const ld theta = 0, const ld mode = 'A') -{ - ld area; - if (mode == 'a' || mode == 'A') - { - return flux/(Ard*cos(theta*RADIAN));//(T) - } - else if (mode == 'r' || mode == 'R') - { - area = Pi_ * (Ard * Ard); - return flux/(area*cos(theta*RADIAN));//(T) - } - else - { - area = Pi_ * ((Ard * Ard) / 4.0); - return flux/(area*cos(theta*RADIAN));//(T) - } -} - -inline ld ElectroMagneticInduction::transformerEquations_VN(const ld Vs, const ld Vp, const ld Ns, const ld Np, std::string mode) -{ - if (mode == "Vs" || mode == "vs" || mode == "VS" || mode == "vS") - { - return (Ns / Np) * Vp;//voltage secondary - } - else if (mode == "Vp" || mode == "vp" || mode == "VP" || mode == "vP") - { - return (Np / Ns) * Vs;//voltage primary - } - else if (mode == "Ns" || mode == "ns" || mode == "NS" || mode == "nS") - { - return (Vs / Vp) * Np;//number of loops secondary - } - else if (mode == "Np" || mode == "np" || mode == "NP" || mode == "nP") - { - return (Vp / Vs) * Ns;//number of loops primary - } - else - return -111111111111;//error - -} - -inline ld ElectroMagneticInduction::transformerEquations_VI(const ld Vs, const ld Vp, const ld Is, const ld Ip, std::string mode) -{ - if (mode == "Vs" || mode == "vs" || mode == "VS" || mode == "vS") - { - return (Ip / Is) * Vp;//voltage secondary - } - else if (mode == "Vp" || mode == "vp" || mode == "VP" || mode == "vP") - { - return (Is / Ip) * Vs;//voltage primary - } - else if (mode == "Is" || mode == "is" || mode == "IS" || mode == "iS") - { - return (Vp / Vs) * Ip;//current secondary - } - else if (mode == "Ip" || mode == "ip" || mode == "IP" || mode == "iP") - { - return (Vs / Vp) * Is;//current primary - } - else - return -111111111111;//error -} - -inline ld ElectroMagneticInduction::transformerEquations_IN(const ld Is, const ld Ip, const ld Ns, const ld Np, std::string mode) -{ - if (mode == "Is" || mode == "is" || mode == "IS" || mode == "iS") - { - return (Np / Ns) * Ip;//current secondary - } - else if (mode == "Ip" || mode == "ip" || mode == "IP" || mode == "iP") - { - return (Ns / Np) * Is;//current primary - } - else if (mode == "Ns" || mode == "ns" || mode == "NS" || mode == "nS") - { - return (Ip / Is) * Np;//number of loops secondary - } - else if (mode == "Np" || mode == "np" || mode == "NP" || mode == "nP") - { - return (Ns / Np) * Is;//number of loops primary - } - else - return -111111111111;//error -} - -inline ld ElectroMagneticInduction::frequency(const ld aW) -{ - return aW/(2.0 * Pi_);//Hz -} - -inline ld ElectroMagneticInduction::period(const ld f) -{ - return 1 / f;//s -} - -inline ld ElectroMagneticInduction::currentInCoil(const ld emf, const ld R) -{ - return emf/R;//A -} - -inline ld ElectroMagneticInduction::emf_byMutualInductance(const ld M, const ld I, const ld t) -{ - return -M * (I / t);//V -} - -inline ld ElectroMagneticInduction::mutualInductance(const ld emf, const ld I, const ld t) -{ - return -emf * (t / I);//henry(H) = (V*s)/A = Ohm*s -} - -inline ld ElectroMagneticInduction::emf_bySelfInductance(const ld L, const ld I, const ld t) -{ - return -L * (I / t);//V -} - -inline ld ElectroMagneticInduction::selfInductance(const ld emf, const ld I, const ld t) -{ - return -emf * (t / I);//henry(H)= (V*s)/A = Ohm*s -} - -inline ld ElectroMagneticInduction::selfInductance_N(const ld N, const ld B, const ld I) -{ - return N * (B / I);//(H) -} - -inline ld ElectroMagneticInduction::selfInductance_timeConstant(const ld toa, const ld R) -{ - return toa * R;//H -} - -inline ld ElectroMagneticInduction::inductanceSolenoid_L(const ld N, const ld Ard, const ld l, char mode = 'a') -{ - ld area; - if (mode == 'a' || mode == 'A') - { - return (_mu0_ * (N * N) * Ard) / l;//(H) - } - else if (mode == 'r' || mode == 'R') - { - area = Pi_ * (Ard * Ard); - return (_mu0_ * (N * N) * area) / l;//(H) - } - else - { - area = Pi_ * ((Ard * Ard) / 4.0); - return (_mu0_ * (N * N) * area) / l;//(H) - } -} - -inline ld ElectroMagneticInduction::inductanceFromEnergyStored(const ld E, const ld I) -{ - return (2.0 * E) / (I * I);//H = Ohm *s -} - -inline ld ElectroMagneticInduction::energyStoredInInductor(const ld L, const ld I) -{ - return (1.0 / 2.0) * L * (I * I);//J -} - -inline ld ElectroMagneticInduction::timeOnOffToinduceCurrent(const ld I, const ld L, const ld emf) -{ - return L * (I / emf);//seconds -} - -inline ld ElectroMagneticInduction::currentSystemOnRails(const ld B, const ld l, const ld v, const ld A, const ld p, const ld R, const ld t) -{ - return (B * l * v * A) / (p * (2.0 * v * t + l) + R*A);//A -} - -inline ld ElectroMagneticInduction::characteristicTimeConstant(const ld L, const ld R) -{ - return L/R;//s -} - -inline ld ElectroMagneticInduction::inductance_reactance_XL(const ld f, const ld L) -{ - return 2.0 * Pi_ * f * L; -} - -inline ld ElectroMagneticInduction::capacitive_reactance_XC(const ld f, const ld C) -{ - return 1.0 / (2.0 * Pi_ * f * C);//ohms -} - -inline ld ElectroMagneticInduction::capacitanceFromReactance(const ld f, const ld _xc) -{ - return 1.0 / (2.0 * Pi_ * f * _xc);//F -} - -inline ld ElectroMagneticInduction::current_RLCircuit_switchON(const ld Io, const ld t, const ld cTc) -{ - return Io * (1.0 - exp(-t / cTc));//A -} - -inline ld ElectroMagneticInduction::current_RICircuit_switchOFF(const ld Io, const ld t, const ld cTc) -{ - return Io * exp(-t / cTc);//A -} - -inline ld ElectroMagneticInduction::currentRMS_throughInductor(const ld Vrms, const ld _xl) -{ - return Vrms / _xl;//A -} - -inline ld ElectroMagneticInduction::currentRMS_throughCapacitor(const ld Vrms, const ld _xc) -{ - return Vrms / _xc;//A -} - -inline ld ElectroMagneticInduction::peekCurrent_AC(const ld Vo, const ld Z) -{ - return Vo / Z;//A -} - -inline ld ElectroMagneticInduction::rmsCurrent_AC(const ld Vrms, const ld Z) -{ - return Vrms / Z;//A -} - -inline ld ElectroMagneticInduction::rmsCurrent_AC(const ld Vrms, const ld R, const ld _xl, const ld _xc) -{ - const ld imp = impedance(R, _xl, _xc); - return Vrms/imp; -} - -inline ld ElectroMagneticInduction::rmsCurrent_AC(const ld Vrms, const ld R, const ld L, const ld C, const ld f) -{ - const ld XL = inductance_reactance_XL(f, L); - const ld XC = capacitive_reactance_XC(f, C); - const ld Z = sqrt((R * R) + pow((XL - XC), 2)); - return Vrms / Z; -} - -inline ld ElectroMagneticInduction::impedance(const ld R, const ld _xl, const ld _xc) -{ - return sqrt((R * R) + pow((_xl - _xc), 2));//Ohms -} - -inline ld ElectroMagneticInduction::impedance(const ld R, const ld L, const ld C, const ld f) -{ - const ld XL = inductance_reactance_XL(f, L); - const ld XC = capacitive_reactance_XC(f, C); - return sqrt((R * R) + pow((XL - XC), 2)); -} - -inline ld ElectroMagneticInduction::resonantFrequency(const ld L, const ld C) -{ - return 1.0 / (20 * Pi_ * sqrt(L * C));//Hz -} - -inline ld ElectroMagneticInduction::powerFactor(const ld R, const ld Z) -{ - return R / Z; -} - -inline ld ElectroMagneticInduction::phaseAngle(const ld pf) -{ - return acos(pf); -} - -inline ld ElectroMagneticInduction::phaseAngle(const ld R, const ld Z) -{ - const ld pf = powerFactor(R, Z); - return acos(pf); -} - -inline ld ElectroMagneticInduction::powerAvgRLC(const ld Irms, const ld Vrms, const ld pf) -{ - return Irms * Vrms * pf;//Watts -} - -inline ld ElectroMagneticInduction::emfPeek(const ld r, const ld N, const ld t, const ld B) -{ - return ((Pi_ * Pi_) * N * (r * r) * B) / (2.0 * t);//peek emf (Vo) -} - - +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_ELECTROMAGNETICINDUCTION_H +#define PHYSICSFORMULA_ELECTROMAGNETICINDUCTION_H +/** + * @class ElectroMagneticInduction + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @dateBuilt 3/21/2021 + * @lastEdit 3/21/2021 + */ +#include + +#include "Magnetism.h" +#include + + +static int emi_objectCount = 0; +typedef long double ld; + +class ElectroMagneticInduction : + public Magnetism +{ + +public: + ElectroMagneticInduction* _emiPtr; + + + ElectroMagneticInduction() + { + _emiPtr = nullptr; + _electroMagVar = 0.0; + countIncrease(); + } + + ElectroMagneticInduction(ld val) + { + _emiPtr = nullptr; + _electroMagVar = val; + countIncrease(); + } + + /** + * @brief copy constructor + */ + ElectroMagneticInduction(const ElectroMagneticInduction& t) + { + _emiPtr = t._emiPtr; + _electroMagVar = t._electroMagVar; + countIncrease(); + } + /** + * #brief move constructor + */ + ElectroMagneticInduction(ElectroMagneticInduction&& t) noexcept + { + _emiPtr = t._emiPtr; + _electroMagVar = t._electroMagVar; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + ElectroMagneticInduction& operator=(ElectroMagneticInduction&& t)noexcept + { + if (this != &t) + { + _emiPtr = t._emiPtr; + _electroMagVar = t._electroMagVar; + countIncrease(); + } + return *this; + } + void setElectroMagVar(ld var) { _electroMagVar = var; } + ld getElectroMagVar()const { return _electroMagVar; } + static void show_objectCount() { std::cout << "\n electromagnetic induction object count: " + << emi_objectCount << std::endl; } + static int get_objectCount() { return emi_objectCount; } + + + /// + /// Calculates the magnetic flux where B is the magnetic field strength(T) + /// over an area of A (m^2), at an angle theta with the perpendicular to + /// the area. Any change in the magnetic flux induces an emf. This process + /// is defined to be electromagnetic induction. + /// + /// The magnetic field strength(T). + /// The area(m^2). + /// The angle theta default is at 0 degrees which + /// is equal to 1 making the equation flux = B*A. + /// the magnetic flux (T*m^2) + static ld magneticFlux(const ld B, const ld A, const ld theta); + + /// + /// A generator coil is rotated through a revolution from 0 to theta degrees, + /// in t seconds. Having N turns the coil has a radius of r (m) and is in a + /// uniform magnetic field of B. Calculate the average emf induced. + /// + /// The number of turns in coil. + /// The radius of coil. + /// The magnetic uniform field. + /// The time it takes to rotate theta degrees. + /// The starting angle of rotation. + /// The finishing angle of rotation. + /// emf average (V) + static ld emfFaradyFullEquation(const ld N, const ld r, const ld B, const ld t, const ld thetaS, const ld thetaF); + + /// + /// Calculates the magnitude of an induced emf when a bar magnet is thrust + /// into a coil with N loops having a radius of r (m) and the average value of + /// B cos(theta) that is given due to complexity as increasing from B1 to B2 + /// over a period of t seconds. + /// + /// The number of loops. + /// The radius. + /// The starting magnetic field. + /// The ending magnetic field. + /// The time over which the increase of the + /// magnetic field takes place. + /// magnitude of emf (V) + static ld emfMagnitude_FaradayNoMinus(const ld N, const ld r, const ld B1, const ld B2, const ld t, const ld theta); + + /// + /// Calculates the change in flux. + /// + /// the area = pi*r^2. + /// The delta b = . + /// + static ld deltaFlux(const ld A, const ld deltaB); + + /// + /// EMFs the induced in generator coil. + /// + /// The number of loop in coil. + /// The length of the loop. + /// The width of coil loop. + /// a angular velocity. + /// The magnetic field strength. + /// The time for a rotation. + /// emf total from generator coil (V) + static ld emf_inducedInGeneratorCoil(const ld N, const ld l, const ld w, const ld aW, const ld B, const ld t); + + /// + /// Calculates the peek emf. + /// + /// The number of turns in a coil. + /// The area. + /// The magnetic field strength. + /// The angular velocity. + /// peek emf (V) + static ld emf_peek(const ld N, const ld A, const ld B, const ld aW); + + /// + /// Calculates the peek emf. + /// + /// The number of turns in a coil. + /// The radius of coil. + /// The magnetic field strength. + /// The angle of rotation in radians. + /// The time for a rotation. + /// peek emf (V) + static ld emf_peek(const ld N, const ld r, const ld B, const ld rad, const ld t); + + /// + /// A N turn, r(m) radius coil rotates at an angular velocity of + /// aW rad/s in a B(T) field, starting with the normal of the plane + /// of the coil perpendicular to the field. Assume that the positive max + /// emf is reached first. + /// + /// The number of turns in coil. + /// The radius or half of the diameter. + /// The magnetic field strength. + /// a angular velocity. + /// peek emf + static ld emfPeek_r(const ld N, const ld r, const ld B, const ld aW); + + /// + /// Calculate the peak voltage of a generator that rotates its N-turn, + /// d m diameter coil rotating at rpm rpms in a B T field. + /// + /// The number of loops in coil. + /// The diameter of coil. + /// The magnetic filed strength. + /// The RPMs. + /// peek emf voltage + static ld emf_peekFromDiameterAndRPMs(const ld N, const ld d, const ld B, const ld rpm); + + /// + /// Calculates the EMF induced by magnetic flux over t time having N turns + /// is considered Faraday's law of induction: Lenz's Law->(why there is a + /// minus sign. + /// + /// The amount of turns in coil. + /// The flux. + /// The time. + /// emf = volts(V) + static ld emf_inducedByMagneticFlux(const ld N, const ld f, const ld t); + + /// + /// An MRI technician moves his hand from a region of very low magnetic field + /// strength into an MRI scanner’s magnetic field of B(T) with his fingers + /// pointing in the direction of the field. Calculate the average emf induced in + /// his wedding ring, given its diameter is d(m) and assuming it takes time + /// t(s) to move it into the field. + /// + /// The magnetic filed. + /// The diameter. + /// The time in seconds. + /// average emf (V) + static ld emf_avgOnCoil(const ld B, const ld d, const ld t); + + /// + /// number of turns in a coil from EMF and time t over the flux; + /// + /// The time. + /// The EMF. + /// The flux. + /// turns in a coil + static ld n_turnsInCoilFromEMFEquation(const ld t, const ld emf, const ld f); + + /// + /// calculates the fluxes from EMF equation, with a time of t and N turns in + /// a coil + /// + /// The EMF. + /// The time. + /// The number of turns in a coil. + /// magnetic flux(T*m^2) + static ld flux_fromEMFEquation(const ld emf, const ld t, const ld N); + + /// + /// calculates the times from EMF equation with a flux and emf with N turns + /// of a coil. + /// + /// The number of turns of a coil + /// The flux. + /// The EMF. + /// time in seconds + static ld time_fromEMFEquation(const ld N, const ld f, const ld emf); + + /// + /// Calculates the motional EMF. + /// + /// The magnetic field. + /// The length of rod. + /// The distance the rod moves. + /// The time it moves over. + /// emf from motion (V) + static ld motionalEMF(const ld B, const ld l, const ld x, const ld t); + + /// + /// Calculates the motional EMF. + /// + /// The magnetic field. + /// The length of rod. + /// The velocity -> x/t . + /// emf from motion(V) + static ld motionalEMF(const ld B, const ld l, const ld v); + + /// + /// calculates the length a magnetic rod must be when producing an emf of V. + /// + /// The EMF voltage (V). + /// The magnetic field (B). + /// The velocity (v). + /// length of magnetic rod + static ld lengthOfRod_emfEq(const ld V, const ld B, const ld v); + + /// + /// Calculates the velocity of the motion of magnetic rod when a emf of V is + /// created with a magnetic field of B and having a rod of length l (m). + /// + /// The emf voltage (V). + /// The magnetic field (T). + /// The length of rod (m). + /// velocity (m/s) + static ld velocityOfMotion_emfEq(const ld V, const ld B, const ld l); + + /// + /// Calculates the magnetic field from when a rod of length l moves at a + /// velocity of v causing a magnetic field strength of B. + /// + /// The emf voltage. + /// The length of rod. + /// The velocity. + /// magnetic field strength (T) + static ld magneticFieldFrom_emfEq(const ld V, const ld l, const ld v); + + /// + /// Magnetics the field magnitude. + /// + /// The flux. + /// The Area, radius or diameter. + /// The theta, is at default value of 0. + /// The mode is used as a switch between what + /// information you use for the Ard argument: use 'r' for radius or 'd' + /// for diameter and if you are using the already calculated cross sectional + /// then leave out.. + /// magnetic field (T) + static ld magneticFieldMagnitude(const ld flux, const ld Ard, const ld theta, const ld mode); + + /// + /// Calculates the voltage or number of loops in a transformer. Use a 0 as + /// placeholder in the unknowns method argument. + /// + /// The volts secondary(output). + /// The volts primary(input). + /// The number of loops secondary(output). + /// The number of loops primary(input). + /// The mode used to specify what you want to solve for,\n + /// "Vs" = volts secondary,\n + /// "vp" = volts primary,\n + /// "Ns" = number of loops secondary,\n + /// "Np" = number of loops primary.\n + /// example: transformerEquation(2.5,3.4,5,10,"Ns");\n + /// this would solve for the number of loops in the secondary transformer + /// volts or loops depending on mode used + static ld transformerEquations_VN(const ld Vs, const ld Vp, const ld Ns, const ld Np, std::string mode); + + /// + /// Calculates the voltage or current in a transformer. use a 0 as a place + /// holder in the unknown variables method argument. + /// + /// The volts secondary(output). + /// The volts primary(input). + /// The current secondary(output). + /// The current primary(input). + /// The mode used to specify what you want to solve for,\n + /// "Vs" = volts secondary,\n + /// "vp" = volts primary,\n + /// "Is" = current secondary,\n + /// "Ip" = current primary.\n + /// example: transformerEquation(2.5,3.4,5,10,"Is");\n + /// this would solve for the current in the secondary transformer + /// volts or current depending on the mode picked + static ld transformerEquations_VI(const ld Vs, const ld Vp, const ld Is, const ld Ip, std::string mode); + + /// + /// Calculates the current or number of loops in a transformer. use a 0 as a place + /// holder in the unknown variables method argument. + /// + /// The current secondary(output). + /// The current primary(input). + /// The number of loops secondary(output). + /// The number of loops primary(input). + /// The mode used to specify what you want to solve for,\n + /// "Is" = current secondary,\n + /// "Ip" = current primary,\n + /// "Ns" = number of loops secondary,\n + /// "Np" = number of loops primary.\n + /// example: transformerEquation(2.5,3.4,5,10,"Is");\n + /// this would solve for the current in the secondary transformer + /// current or number of loops depending on the mode picked + static ld transformerEquations_IN(const ld Is, const ld Ip, const ld Ns, const ld Np, std::string mode); + + /// + /// Calculates the frequencies from a know angular velocity of aW. + /// + /// a angular velocity. + /// frequency (Hz + static ld frequency(const ld aW); + + /// + /// Calculates the period from the known frequency of f. + /// + /// The frequency. + /// + static ld period(const ld f); + + /// + /// Calculates the current in the coil. + /// + /// The EMF. + /// The resistance. + /// current (A) + static ld currentInCoil(const ld emf, const ld R); + + /// + /// Calculates the emf2 from the mutual inductance of M between two devices + /// where the current from device one is I and the time t over which the + /// current changes. + /// + /// The Mutual inductance. + /// The current. + /// The time. + /// emf voltage + static ld emf_byMutualInductance(const ld M, const ld I, const ld t); + + + /// + /// Calculates the mutual inductance. + /// + /// The EMF. + /// The current. + /// The time. + /// henry(H) + static ld mutualInductance(const ld emf, const ld I, const ld t); + + /// + /// calculates the EMF by self inductance. also the back emf calculated with + /// this methods equation + /// + /// The self inductance of the device. + /// The current. + /// The time. + /// emf voltage + static ld emf_bySelfInductance(const ld L, const ld I, const ld t); + + /// + /// calculates the self inductance. + /// + /// The EMF. + /// The current. + /// The time. + /// inductance of inductor(H) + static ld selfInductance(const ld emf, const ld I, const ld t); + + /// + /// calculates the self inductance. + /// + /// The number of loops. + /// The flux. + /// The current.s + /// inductance(H) + static ld selfInductance_N(const ld N, const ld B, const ld I); + + /// + /// Calculates the self the inductance using the time constant and resistance + /// + /// The time constant. + /// The resistance. + /// self inductance + static ld selfInductance_timeConstant(const ld toa, const ld R); + + /// + /// Calculates the inductance of a solenoid. + /// + /// The number of turns in coil. + /// the area, radius or diameter. + /// The length of solenoid. + /// put a 'r' if use a radius or a 'd' if using the + /// diameter in the Ard argument. + /// inductance(H) + static ld inductanceSolenoid_L(const ld N, const ld A, const ld l, char mode); + + /// + /// Calculates the inductance from total energy of E stored in inductor + /// having a current of I. + /// + /// The energy of inductor. + /// The current. + /// the inductance (H) + static ld inductanceFromEnergyStored(const ld E, const ld I); + + /// + /// Calculates the energy stored in an inductor. + /// + /// The inductance. + /// The current. + /// energy (J) + static ld energyStoredInInductor(const ld L, const ld I); + + /// + /// Camera flashes charge a capacitor to high voltage by switching the + /// current through an inductor on and off rapidly. Calculate what time must + /// the a current of I through a inductance of L be switched on or off to + /// induce a emf. + /// + /// The current. + /// The inductance. + /// The EMF. + /// time to switch on off current through an inductor + static ld timeOnOffToinduceCurrent(const ld I, const ld L, const ld emf); + + /// + /// Calculate the current of a system with duel rails, + /// under the following conditions. The resistance between the rails is R, + /// the rails and the moving rod are identical in cross section A and have + /// the same resistivity ρ . The distance between the rails is l, and the + /// rod moves at constant speed v perpendicular to the uniform field B. + /// At time zero, the moving rod is next to the resistance R. + /// + /// The magnetic field. + /// The length. + /// The velocity. + /// The area. + /// The resistivity. + /// The radius. + /// The time. + /// current + static ld currentSystemOnRails(const ld B, const ld l, const ld v, const ld A, const ld p, const ld R, const ld t); + + /// + /// Calculates the Characteristic time constant. (cTc) + /// + /// The inductance. + /// The resistance. + /// the time constant + static ld characteristicTimeConstant(const ld L, const ld R); + + /// + /// Inductances the reactance (XL) + /// + /// The frequency. + /// The inductance. + /// inductive reactance (H) + static ld inductance_reactance_XL(const ld f, const ld L); + + /// + /// calculates the Capacitive reactance (XC). + /// + /// The frequency. + /// The capacitance. + /// capacitive reactance (ohms) + static ld capacitive_reactance_XC(const ld f, const ld C); + + /// + /// Calculates the capacitance from reactance and frequency + /// + /// The frequency in Hz. + /// The capacitive reactance. + /// farads + static ld capacitanceFromReactance(const ld f, const ld _xc); + + /// + /// Calculates the current in an inductor of an RC circuit at specific moments + /// of time t with an initial current of Io and a characteristic time constant of cTc. + /// + /// The initial current in inductor. + /// The time in seconds. + /// The characteristic time constant. + /// current at specified time when switched on (A) + static ld current_RLCircuit_switchON(const ld Io, const ld t, const ld cTc); + + /// + /// Calculates the current of an inductor of an RC circuit switch off. + /// + /// The current initially. + /// The time in seconds. + /// The characteristic time constant. + /// current at specified time when switched off + static ld current_RICircuit_switchOFF(const ld Io, const ld t, const ld cTc); + + /// + /// Calculates the current through inductor. + /// + /// The rms Voltage. + /// The inductance reactance. + /// current + static ld currentRMS_throughInductor(const ld Vrms, const ld _xl); + + /// + /// Calculates the current through capacitor. + /// + /// The Voltage RMS. + /// The conductive reactance. + /// current + static ld currentRMS_throughCapacitor(const ld Vrms, const ld _xc); + + /// + /// Calculates the peeks the current in an AC circuit using the peek voltage + /// of Vo and its impedance of Z. + /// + /// The peek voltage in circuit. + /// The impedance. + /// The peek current -> Io = peek Amps + static ld peekCurrent_AC(const ld Vo, const ld Z); + + /// + /// Calculates the RMS(root mean square) or average current in an AC circuit + /// using the rms Voltage and the circuits impedance of Z. + /// + /// The rms Voltage, average voltage. + /// The impedance in circuit. + /// the average or rms current Irms -> (A) + static ld rmsCurrent_AC(const ld Vrms, const ld Z); + + /// + /// Calculates the RMS(root mean square current or average current in a AC + /// series circuit. + /// + /// The root mean square voltage or Vrms. + /// The resistance. + /// The inductive reactance. + /// The conductive reactance. + /// Irms or root mean square current, average current(A) + static ld rmsCurrent_AC(const ld Vrms, const ld R, const ld _xl, const ld _xc); + + /// + /// Calculates the RMS(root mean square current or average current in a AC + /// series circuit. + /// + /// The root mean square voltage or Vrms. + /// The resistance. + /// The inductance. + /// The capacitance. + /// The frequency. + /// Irms or root mean square current, average current(A) + static ld rmsCurrent_AC(const ld Vrms, const ld R, const ld L, const ld C, const ld f); + + /// + /// Calculates the Impedance in a RLC series AC circuit. For circuits without + /// a resistor take R=0, for those without and inductor take _xl = 0, for + /// those without a capacitor take _xc = 0. + /// + /// The resistance. + /// The inductive reactance. + /// The capacitive reactance. + /// the impedance on an AC circuit (Ohms) + static ld impedance(const ld R, const ld _xl, const ld _xc); + + /// + /// Calculates the impedance in a RLC series AS circuit. + /// + /// The resistance. + /// The inductance. + /// The capacitance. + /// The frequency. + /// the impedance on an AC circuit (Ohms) + static ld impedance(const ld R, const ld L, const ld C, const ld f); + + /// + /// Calculates the resonant frequency in an RLC series AC circuit + /// + /// The inductance. + /// The capacitance. + /// resonant frequency (Hz) + static ld resonantFrequency(const ld L, const ld C); + + /// + /// Calculates the power factor. cos(phi) = R/Z. + /// + /// The resistance. + /// The impedance. + /// power factor(unit-less) + static ld powerFactor(const ld R, const ld Z); + + /// + /// Phases the angle. + /// + /// The pf. + /// phase angle + static ld phaseAngle(const ld pf); + + /// + /// Phases the angle. + /// + /// The resistance. + /// The impedance. + /// phase angle + static ld phaseAngle(const ld R, const ld Z); + + /// + /// Powers the average RLC. + /// + /// The average current . + /// The average voltage. + /// The power factor. + /// power in an RLC series AC circuit + static ld powerAvgRLC(const ld Irms, const ld Vrms, const ld pf); + + /// + /// Calculates the peak emf generated by a r(m) radius, N-turn + /// coil that is rotated one-fourth of a revolution in t(s), originally + /// having its plane perpendicular to a uniform B(T) magnetic field? + /// (This is 58 rev/s.) + /// + /// The radius. + /// The number of turns in coil. + /// The time in seconds. + /// The magnetic field strength. + /// peek emf + static ld emfPeek(const ld r, const ld N, const ld t, const ld B); + + + ~ElectroMagneticInduction() + { + delete _emiPtr; + } + +private: + static void countIncrease() { emi_objectCount += 1; } + static void countDecrease() { emi_objectCount -= 1; } + ld _electroMagVar; + +}; +#endif //PHYSICSFORMULA_ELECTROMAGNETICINDUCTION_H + +//============================================================================= +//in-line class Implementation + +inline ld ElectroMagneticInduction::magneticFlux(const ld B, const ld A, const ld theta = 0) +{ + return B * A * cos(theta * RADIAN);//T*m^2 = Tesla meters squared +} + +inline ld ElectroMagneticInduction::emfFaradyFullEquation(const ld N, const ld r, const ld B, const ld t, const ld thetaS, const ld thetaF) +{ + const ld area = Pi_ * (r * r); + const ld deltaTheta = cos(thetaF * RADIAN) - cos(thetaS * RADIAN); + const ld flux = area * B * deltaTheta; + return -N * (flux / t); +} + +inline ld ElectroMagneticInduction::emfMagnitude_FaradayNoMinus(const ld N, const ld r, const ld B1, const ld B2, const ld t, const ld theta) +{ + const ld area = Pi_ * (r * r); + const ld deltaB = abs(B2 - B1); + const ld deltaFlux = area * deltaB * cos(theta*RADIAN); + + return N * (deltaFlux / t);//V +} + +inline ld ElectroMagneticInduction::deltaFlux(const ld A, const ld deltaB) +{ + + return A * deltaB; +} + +inline ld ElectroMagneticInduction::emf_inducedInGeneratorCoil(const ld N, const ld l, const ld w, const ld aW, const ld B, const ld t) +{ + const ld area = l * w; + + return N * area * B * aW * sin((aW * t) * RADIAN);//V +} + +inline ld ElectroMagneticInduction::emf_peek(const ld N, const ld A, const ld B, const ld aW) +{ + return N * A * B * aW;//V +} + +inline ld ElectroMagneticInduction::emf_peek(const ld N, const ld r, const ld B, const ld rad, const ld t) +{ + const ld area = Pi_ * (r * r); + const ld aW = rad / t; + return N * area * B * aW;//V +} + +inline ld ElectroMagneticInduction::emfPeek_r(const ld N, const ld r, const ld B, const ld aW) +{ + return N * Pi_ * (r * r) * B * aW; +} + +inline ld ElectroMagneticInduction::emf_peekFromDiameterAndRPMs(const ld N, const ld d, const ld B, const ld rpm) +{ + const ld aW = (rpm * 2.0 * Pi_) / 60.0;//angular velocity + const ld A = (Pi_ * (d * d)) / 4;//cross sectional + return N * A * B * aW;//V +} + +inline ld ElectroMagneticInduction::emf_inducedByMagneticFlux(const ld N, const ld f, const ld t) +{ + return -N * (f / t);//V +} + +inline ld ElectroMagneticInduction::emf_avgOnCoil(const ld B, const ld d, const ld t) +{ + return (Pi_ * B * (d * d)) / (4.0 * t);//V +} + +inline ld ElectroMagneticInduction::n_turnsInCoilFromEMFEquation(const ld t, const ld emf, const ld f) +{ + return (t / f) * emf;//turns in coil +} + +inline ld ElectroMagneticInduction::flux_fromEMFEquation(const ld emf, const ld t, const ld N) +{ + return -(t * emf) / N;//T*m^2 +} + +inline ld ElectroMagneticInduction::time_fromEMFEquation(const ld N, const ld f, const ld emf) +{ + return N * (f / emf);//seconds +} + +inline ld ElectroMagneticInduction::motionalEMF(const ld B, const ld l, const ld x, const ld t) +{ + return B * ((l * x) / t);//V +} + +inline ld ElectroMagneticInduction::motionalEMF(const ld B, const ld l, const ld v) +{ + return B * l * v;//V +} + +inline ld ElectroMagneticInduction::lengthOfRod_emfEq(const ld V, const ld B, const ld v) +{ + return V / (B * v);//m +} + +inline ld ElectroMagneticInduction::velocityOfMotion_emfEq(const ld V, const ld B, const ld l) +{ + return V / (B * l);// m/s +} + +inline ld ElectroMagneticInduction::magneticFieldFrom_emfEq(const ld V, const ld l, const ld v) +{ + return V / (l * v);//T +} + +inline ld ElectroMagneticInduction::magneticFieldMagnitude(const ld flux, const ld Ard, const ld theta = 0, const ld mode = 'A') +{ + ld area; + if (mode == 'a' || mode == 'A') + { + return flux/(Ard*cos(theta*RADIAN));//(T) + } + else if (mode == 'r' || mode == 'R') + { + area = Pi_ * (Ard * Ard); + return flux/(area*cos(theta*RADIAN));//(T) + } + else + { + area = Pi_ * ((Ard * Ard) / 4.0); + return flux/(area*cos(theta*RADIAN));//(T) + } +} + +inline ld ElectroMagneticInduction::transformerEquations_VN(const ld Vs, const ld Vp, const ld Ns, const ld Np, std::string mode) +{ + if (mode == "Vs" || mode == "vs" || mode == "VS" || mode == "vS") + { + return (Ns / Np) * Vp;//voltage secondary + } + else if (mode == "Vp" || mode == "vp" || mode == "VP" || mode == "vP") + { + return (Np / Ns) * Vs;//voltage primary + } + else if (mode == "Ns" || mode == "ns" || mode == "NS" || mode == "nS") + { + return (Vs / Vp) * Np;//number of loops secondary + } + else if (mode == "Np" || mode == "np" || mode == "NP" || mode == "nP") + { + return (Vp / Vs) * Ns;//number of loops primary + } + else + return -111111111111;//error + +} + +inline ld ElectroMagneticInduction::transformerEquations_VI(const ld Vs, const ld Vp, const ld Is, const ld Ip, std::string mode) +{ + if (mode == "Vs" || mode == "vs" || mode == "VS" || mode == "vS") + { + return (Ip / Is) * Vp;//voltage secondary + } + else if (mode == "Vp" || mode == "vp" || mode == "VP" || mode == "vP") + { + return (Is / Ip) * Vs;//voltage primary + } + else if (mode == "Is" || mode == "is" || mode == "IS" || mode == "iS") + { + return (Vp / Vs) * Ip;//current secondary + } + else if (mode == "Ip" || mode == "ip" || mode == "IP" || mode == "iP") + { + return (Vs / Vp) * Is;//current primary + } + else + return -111111111111;//error +} + +inline ld ElectroMagneticInduction::transformerEquations_IN(const ld Is, const ld Ip, const ld Ns, const ld Np, std::string mode) +{ + if (mode == "Is" || mode == "is" || mode == "IS" || mode == "iS") + { + return (Np / Ns) * Ip;//current secondary + } + else if (mode == "Ip" || mode == "ip" || mode == "IP" || mode == "iP") + { + return (Ns / Np) * Is;//current primary + } + else if (mode == "Ns" || mode == "ns" || mode == "NS" || mode == "nS") + { + return (Ip / Is) * Np;//number of loops secondary + } + else if (mode == "Np" || mode == "np" || mode == "NP" || mode == "nP") + { + return (Ns / Np) * Is;//number of loops primary + } + else + return -111111111111;//error +} + +inline ld ElectroMagneticInduction::frequency(const ld aW) +{ + return aW/(2.0 * Pi_);//Hz +} + +inline ld ElectroMagneticInduction::period(const ld f) +{ + return 1 / f;//s +} + +inline ld ElectroMagneticInduction::currentInCoil(const ld emf, const ld R) +{ + return emf/R;//A +} + +inline ld ElectroMagneticInduction::emf_byMutualInductance(const ld M, const ld I, const ld t) +{ + return -M * (I / t);//V +} + +inline ld ElectroMagneticInduction::mutualInductance(const ld emf, const ld I, const ld t) +{ + return -emf * (t / I);//henry(H) = (V*s)/A = Ohm*s +} + +inline ld ElectroMagneticInduction::emf_bySelfInductance(const ld L, const ld I, const ld t) +{ + return -L * (I / t);//V +} + +inline ld ElectroMagneticInduction::selfInductance(const ld emf, const ld I, const ld t) +{ + return -emf * (t / I);//henry(H)= (V*s)/A = Ohm*s +} + +inline ld ElectroMagneticInduction::selfInductance_N(const ld N, const ld B, const ld I) +{ + return N * (B / I);//(H) +} + +inline ld ElectroMagneticInduction::selfInductance_timeConstant(const ld toa, const ld R) +{ + return toa * R;//H +} + +inline ld ElectroMagneticInduction::inductanceSolenoid_L(const ld N, const ld Ard, const ld l, char mode = 'a') +{ + ld area; + if (mode == 'a' || mode == 'A') + { + return (_mu0_ * (N * N) * Ard) / l;//(H) + } + else if (mode == 'r' || mode == 'R') + { + area = Pi_ * (Ard * Ard); + return (_mu0_ * (N * N) * area) / l;//(H) + } + else + { + area = Pi_ * ((Ard * Ard) / 4.0); + return (_mu0_ * (N * N) * area) / l;//(H) + } +} + +inline ld ElectroMagneticInduction::inductanceFromEnergyStored(const ld E, const ld I) +{ + return (2.0 * E) / (I * I);//H = Ohm *s +} + +inline ld ElectroMagneticInduction::energyStoredInInductor(const ld L, const ld I) +{ + return (1.0 / 2.0) * L * (I * I);//J +} + +inline ld ElectroMagneticInduction::timeOnOffToinduceCurrent(const ld I, const ld L, const ld emf) +{ + return L * (I / emf);//seconds +} + +inline ld ElectroMagneticInduction::currentSystemOnRails(const ld B, const ld l, const ld v, const ld A, const ld p, const ld R, const ld t) +{ + return (B * l * v * A) / (p * (2.0 * v * t + l) + R*A);//A +} + +inline ld ElectroMagneticInduction::characteristicTimeConstant(const ld L, const ld R) +{ + return L/R;//s +} + +inline ld ElectroMagneticInduction::inductance_reactance_XL(const ld f, const ld L) +{ + return 2.0 * Pi_ * f * L; +} + +inline ld ElectroMagneticInduction::capacitive_reactance_XC(const ld f, const ld C) +{ + return 1.0 / (2.0 * Pi_ * f * C);//ohms +} + +inline ld ElectroMagneticInduction::capacitanceFromReactance(const ld f, const ld _xc) +{ + return 1.0 / (2.0 * Pi_ * f * _xc);//F +} + +inline ld ElectroMagneticInduction::current_RLCircuit_switchON(const ld Io, const ld t, const ld cTc) +{ + return Io * (1.0 - exp(-t / cTc));//A +} + +inline ld ElectroMagneticInduction::current_RICircuit_switchOFF(const ld Io, const ld t, const ld cTc) +{ + return Io * exp(-t / cTc);//A +} + +inline ld ElectroMagneticInduction::currentRMS_throughInductor(const ld Vrms, const ld _xl) +{ + return Vrms / _xl;//A +} + +inline ld ElectroMagneticInduction::currentRMS_throughCapacitor(const ld Vrms, const ld _xc) +{ + return Vrms / _xc;//A +} + +inline ld ElectroMagneticInduction::peekCurrent_AC(const ld Vo, const ld Z) +{ + return Vo / Z;//A +} + +inline ld ElectroMagneticInduction::rmsCurrent_AC(const ld Vrms, const ld Z) +{ + return Vrms / Z;//A +} + +inline ld ElectroMagneticInduction::rmsCurrent_AC(const ld Vrms, const ld R, const ld _xl, const ld _xc) +{ + const ld imp = impedance(R, _xl, _xc); + return Vrms/imp; +} + +inline ld ElectroMagneticInduction::rmsCurrent_AC(const ld Vrms, const ld R, const ld L, const ld C, const ld f) +{ + const ld XL = inductance_reactance_XL(f, L); + const ld XC = capacitive_reactance_XC(f, C); + const ld Z = sqrt((R * R) + pow((XL - XC), 2)); + return Vrms / Z; +} + +inline ld ElectroMagneticInduction::impedance(const ld R, const ld _xl, const ld _xc) +{ + return sqrt((R * R) + pow((_xl - _xc), 2));//Ohms +} + +inline ld ElectroMagneticInduction::impedance(const ld R, const ld L, const ld C, const ld f) +{ + const ld XL = inductance_reactance_XL(f, L); + const ld XC = capacitive_reactance_XC(f, C); + return sqrt((R * R) + pow((XL - XC), 2)); +} + +inline ld ElectroMagneticInduction::resonantFrequency(const ld L, const ld C) +{ + return 1.0 / (20 * Pi_ * sqrt(L * C));//Hz +} + +inline ld ElectroMagneticInduction::powerFactor(const ld R, const ld Z) +{ + return R / Z; +} + +inline ld ElectroMagneticInduction::phaseAngle(const ld pf) +{ + return acos(pf); +} + +inline ld ElectroMagneticInduction::phaseAngle(const ld R, const ld Z) +{ + const ld pf = powerFactor(R, Z); + return acos(pf); +} + +inline ld ElectroMagneticInduction::powerAvgRLC(const ld Irms, const ld Vrms, const ld pf) +{ + return Irms * Vrms * pf;//Watts +} + +inline ld ElectroMagneticInduction::emfPeek(const ld r, const ld N, const ld t, const ld B) +{ + return ((Pi_ * Pi_) * N * (r * r) * B) / (2.0 * t);//peek emf (Vo) +} + + diff --git a/ElectroMagneticWaves.h b/ElectroMagneticWaves.h index 6af5281..006e431 100644 --- a/ElectroMagneticWaves.h +++ b/ElectroMagneticWaves.h @@ -1,277 +1,277 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_ELECTROMAGNETICWAVES_H -#define PHYSICSFORMULA_ELECTROMAGNETICWAVES_H - -//#include "ElectroMagneticInduction.h" - -static int emWaves_objectCount = 0; - -// speed of light in a vacuum is 299792458 m/s -constexpr auto _C_ = 2.99792e8;//2.99*10^8 -constexpr auto C_ = 3.000e8;//3.00*10^8 - -class ElectromagneticWaves : - public ElectroMagneticInduction -{ - -public: - ElectromagneticWaves* _emWavesPtr; - - - ElectromagneticWaves() - { - _emWavesPtr = nullptr; - emWaveVar = 0.0; - countIncrease(); - } - - /** - * @brief copy constructor - */ - ElectromagneticWaves(const ElectromagneticWaves& t) - { - _emWavesPtr = t._emWavesPtr; - emWaveVar = t.getMagVar(); - countIncrease(); - } - /** - * #brief move constructor - */ - ElectromagneticWaves(ElectromagneticWaves&& t) noexcept - { - _emWavesPtr = t._emWavesPtr; - emWaveVar = t.getEmWaveVar(); - countIncrease(); - } - /** - * @brief copy assignment operator - */ - ElectromagneticWaves& operator=(const ElectromagneticWaves& t) - { - if (this != &t) - { - _emWavesPtr = t._emWavesPtr; - emWaveVar = getEmWaveVar(); - countIncrease(); - } - return *this; - } - - void setEmWaveVar(ld var) { emWaveVar = var; } - ld getEmWaveVar() const { return emWaveVar; } - - static void show_objectCount() { std::cout << "\n emWaves object count: " - << emWaves_objectCount << std::endl; } - static int get_objectCount() { return emWaves_objectCount; } - - static ld speedOfElectroMagneticWaves(); - - /// - /// B fields the strength electromagnetic wave - /// - /// The e field strength. - /// electromagnetic B field strength - static ld magneticFieldStrength_emWave(const ld E); - - /// - /// magnetic field strength of em wave. E field - /// - /// The B field strength of an emWave. - /// electromagnetic E field strength - static ld electricFieldStrength_emWave(const ld B); - - /// - /// The maximum magnetic field strength of an electromagnetic field is B - /// Calculate the maximum electric field strength if the wave is traveling - /// in a medium in which the speed of the wave is percentOfc of c - /// - /// The B field strength of an emWave. - /// The percent ofc. - /// - static ld electricFieldStrength_emWave(const ld B, const ld percentOfc); - - /// - /// Calculates the wave length of a em wave having a frequency of f. - /// - /// The frequency. - /// the wave length (m) - static ld waveLength_emWave(const ld f); - - /// - /// Calculates the frequency an em wave having a wave length of waveLen. - /// - /// Length of the wave. - /// frequency(Hz) - static ld frequency_emWave(const ld waveLen); - - /// - /// A radar used to detect the presence of aircraft receives a pulse that - /// has reflected off an object t(s) after it was transmitted. What is - /// the distance from the radar station to the reflecting object? - /// - /// The time in seconds. - /// distance from radar station (m) - static ld distanceFromRadarStation(const ld t); - - /// - /// Determine the amount of time it takes for X-rays to travel - /// a distance of d(m). - /// - /// The distance. - /// time is seconds - static ld timeFor_emWaveToTravelDistance(const ld d); - - /// - /// What is the echo time for a car d m from a Highway Police radar - /// unit? - /// - /// The distance. - /// time for radar echo to return - static ld echoTime(const ld d); - - /// - /// Find the intensity of an electromagnetic wave having a peak magnetic - /// field strength of B(T) - /// - /// The magnetic field strength. - /// Intensity ( W/m^2) - static ld intensityAvg_emWave_B(const ld B); - - /// - /// A university communications satellite dish receives - /// TV signals that have a maximum electric field strength - /// (for one channel) of E V/m . What is the intensity of this wave? - /// - /// The maximum electric field strength. - /// intensity W/m^2 - static ld intensityAvg_emWave_E(const ld E); - - /// - /// A d(m)-diameter university communications satellite dish receives - /// TV signals that have a intensity of I - /// (for one channel). What is the power received by the antenna? - /// - /// The d. - /// The I. - /// power in (W) - static ld powerReceivedByAntenna(const ld d, const ld I); - - /// - /// Astronomers determine that a particular star in our galaxy is moving - /// toward Earth at a speed of v m/s with respect to the Earth. - /// If Earth receives a wavelength 𝜆 = receivedWL m from this star, what - /// was the wavelength emitted by the star? - /// - /// The speed. - /// The received wavelength. - /// - static ld waveLength_dopplerEffect(const ld v, const ld receivedWL); - - /// - /// Calculates the inductance of a LC circuit containing a C-F capacitor - /// oscillates at such a frequency that it radiates at a theta-m wavelength. - /// - /// The theta. - /// The c. - /// inductance - static ld inductanceOfCircuitFromWavelength(const ld theta, const ld C); - - /// - /// Calculates the capacitance of a LC circuit containing a L-H inductor - /// oscillates at such a frequency that it radiates at a theta-m wavelength. - /// - /// The theta. - /// The l. - /// capacitance - static ld capacitanceOfCircuitFromWavelength(const ld theta, const ld L); - - ~ElectromagneticWaves() - { - delete _emWavesPtr; - } -private: - ld emWaveVar; - static void countIncrease() { emWaves_objectCount += 1; } - static void countDecrease() { emWaves_objectCount -= 1; } -}; - -#endif //PHYSICSFORMULA_ELECTROMAGNETICWAVES_H -//============================================================================= -//in-line class Implementation -inline ld ElectromagneticWaves::speedOfElectroMagneticWaves() -{ - return 1.0 / sqrt (_mu0_ * _e0_); -} - -inline ld ElectromagneticWaves::magneticFieldStrength_emWave(const ld E) -{ - return E / _C_; -} - -inline ld ElectromagneticWaves::electricFieldStrength_emWave(const ld B) -{ - return _C_ * B; -} - -inline ld ElectromagneticWaves::electricFieldStrength_emWave(const ld B, const ld percentOfc) -{ - return percentOfc * _C_ * B; -} - -inline ld ElectromagneticWaves::waveLength_emWave(const ld f) -{ - return _C_ / f; -} - -inline ld ElectromagneticWaves::frequency_emWave(const ld waveLen) -{ - return _C_ / waveLen; -} - -inline ld ElectromagneticWaves::distanceFromRadarStation(const ld t) -{ - return (_C_ * t) / 2.0; -} - -inline ld ElectromagneticWaves::timeFor_emWaveToTravelDistance(const ld d) -{ - return d / _C_; -} - -inline ld ElectromagneticWaves::echoTime(const ld d) -{ - return (2.0 * d) / _C_; -} - -inline ld ElectromagneticWaves::intensityAvg_emWave_E(const ld E) -{ - return (_C_ * _e0_ * (E * E)) / 2.0; -} - -inline ld ElectromagneticWaves::powerReceivedByAntenna(const ld d, const ld I) -{ - return (I * Pi_ * (d * d)) / 4.0; -} - -inline ld ElectromagneticWaves::waveLength_dopplerEffect(const ld v, const ld recievedWL) -{ - return recievedWL / (1.0 - (v / _C_)); -} - -inline ld ElectromagneticWaves::inductanceOfCircuitFromWavelength(const ld theta, const ld C) -{ - return (theta * theta) / (4.0 * (_pi_ * _pi_) * (_C_ * _C_) * C); -} - -inline ld ElectromagneticWaves::capacitanceOfCircuitFromWavelength(const ld theta, const ld L) -{ - return (theta * theta) / (4.0 * (_pi_ * _pi_) * L * (_C_ * _C_)); -} - -inline ld ElectromagneticWaves::intensityAvg_emWave_B(const ld B) -{ - return (_C_ * (B * B)) / (2.0 * _mu0_); -} +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_ELECTROMAGNETICWAVES_H +#define PHYSICSFORMULA_ELECTROMAGNETICWAVES_H + +//#include "ElectroMagneticInduction.h" + +static int emWaves_objectCount = 0; + +// speed of light in a vacuum is 299792458 m/s +constexpr auto _C_ = 2.99792e8;//2.99*10^8 +constexpr auto C_ = 3.000e8;//3.00*10^8 + +class ElectromagneticWaves : + public ElectroMagneticInduction +{ + +public: + ElectromagneticWaves* _emWavesPtr; + + + ElectromagneticWaves() + { + _emWavesPtr = nullptr; + emWaveVar = 0.0; + countIncrease(); + } + + /** + * @brief copy constructor + */ + ElectromagneticWaves(const ElectromagneticWaves& t) + { + _emWavesPtr = t._emWavesPtr; + emWaveVar = t.getMagVar(); + countIncrease(); + } + /** + * #brief move constructor + */ + ElectromagneticWaves(ElectromagneticWaves&& t) noexcept + { + _emWavesPtr = t._emWavesPtr; + emWaveVar = t.getEmWaveVar(); + countIncrease(); + } + /** + * @brief copy assignment operator + */ + ElectromagneticWaves& operator=(const ElectromagneticWaves& t) + { + if (this != &t) + { + _emWavesPtr = t._emWavesPtr; + emWaveVar = getEmWaveVar(); + countIncrease(); + } + return *this; + } + + void setEmWaveVar(ld var) { emWaveVar = var; } + ld getEmWaveVar() const { return emWaveVar; } + + static void show_objectCount() { std::cout << "\n emWaves object count: " + << emWaves_objectCount << std::endl; } + static int get_objectCount() { return emWaves_objectCount; } + + static ld speedOfElectroMagneticWaves(); + + /// + /// B fields the strength electromagnetic wave + /// + /// The e field strength. + /// electromagnetic B field strength + static ld magneticFieldStrength_emWave(const ld E); + + /// + /// magnetic field strength of em wave. E field + /// + /// The B field strength of an emWave. + /// electromagnetic E field strength + static ld electricFieldStrength_emWave(const ld B); + + /// + /// The maximum magnetic field strength of an electromagnetic field is B + /// Calculate the maximum electric field strength if the wave is traveling + /// in a medium in which the speed of the wave is percentOfc of c + /// + /// The B field strength of an emWave. + /// The percent ofc. + /// + static ld electricFieldStrength_emWave(const ld B, const ld percentOfc); + + /// + /// Calculates the wave length of a em wave having a frequency of f. + /// + /// The frequency. + /// the wave length (m) + static ld waveLength_emWave(const ld f); + + /// + /// Calculates the frequency an em wave having a wave length of waveLen. + /// + /// Length of the wave. + /// frequency(Hz) + static ld frequency_emWave(const ld waveLen); + + /// + /// A radar used to detect the presence of aircraft receives a pulse that + /// has reflected off an object t(s) after it was transmitted. What is + /// the distance from the radar station to the reflecting object? + /// + /// The time in seconds. + /// distance from radar station (m) + static ld distanceFromRadarStation(const ld t); + + /// + /// Determine the amount of time it takes for X-rays to travel + /// a distance of d(m). + /// + /// The distance. + /// time is seconds + static ld timeFor_emWaveToTravelDistance(const ld d); + + /// + /// What is the echo time for a car d m from a Highway Police radar + /// unit? + /// + /// The distance. + /// time for radar echo to return + static ld echoTime(const ld d); + + /// + /// Find the intensity of an electromagnetic wave having a peak magnetic + /// field strength of B(T) + /// + /// The magnetic field strength. + /// Intensity ( W/m^2) + static ld intensityAvg_emWave_B(const ld B); + + /// + /// A university communications satellite dish receives + /// TV signals that have a maximum electric field strength + /// (for one channel) of E V/m . What is the intensity of this wave? + /// + /// The maximum electric field strength. + /// intensity W/m^2 + static ld intensityAvg_emWave_E(const ld E); + + /// + /// A d(m)-diameter university communications satellite dish receives + /// TV signals that have a intensity of I + /// (for one channel). What is the power received by the antenna? + /// + /// The d. + /// The I. + /// power in (W) + static ld powerReceivedByAntenna(const ld d, const ld I); + + /// + /// Astronomers determine that a particular star in our galaxy is moving + /// toward Earth at a speed of v m/s with respect to the Earth. + /// If Earth receives a wavelength 𝜆 = receivedWL m from this star, what + /// was the wavelength emitted by the star? + /// + /// The speed. + /// The received wavelength. + /// + static ld waveLength_dopplerEffect(const ld v, const ld receivedWL); + + /// + /// Calculates the inductance of a LC circuit containing a C-F capacitor + /// oscillates at such a frequency that it radiates at a theta-m wavelength. + /// + /// The theta. + /// The c. + /// inductance + static ld inductanceOfCircuitFromWavelength(const ld theta, const ld C); + + /// + /// Calculates the capacitance of a LC circuit containing a L-H inductor + /// oscillates at such a frequency that it radiates at a theta-m wavelength. + /// + /// The theta. + /// The l. + /// capacitance + static ld capacitanceOfCircuitFromWavelength(const ld theta, const ld L); + + ~ElectromagneticWaves() + { + delete _emWavesPtr; + } +private: + ld emWaveVar; + static void countIncrease() { emWaves_objectCount += 1; } + static void countDecrease() { emWaves_objectCount -= 1; } +}; + +#endif //PHYSICSFORMULA_ELECTROMAGNETICWAVES_H +//============================================================================= +//in-line class Implementation +inline ld ElectromagneticWaves::speedOfElectroMagneticWaves() +{ + return 1.0 / sqrt (_mu0_ * _e0_); +} + +inline ld ElectromagneticWaves::magneticFieldStrength_emWave(const ld E) +{ + return E / _C_; +} + +inline ld ElectromagneticWaves::electricFieldStrength_emWave(const ld B) +{ + return _C_ * B; +} + +inline ld ElectromagneticWaves::electricFieldStrength_emWave(const ld B, const ld percentOfc) +{ + return percentOfc * _C_ * B; +} + +inline ld ElectromagneticWaves::waveLength_emWave(const ld f) +{ + return _C_ / f; +} + +inline ld ElectromagneticWaves::frequency_emWave(const ld waveLen) +{ + return _C_ / waveLen; +} + +inline ld ElectromagneticWaves::distanceFromRadarStation(const ld t) +{ + return (_C_ * t) / 2.0; +} + +inline ld ElectromagneticWaves::timeFor_emWaveToTravelDistance(const ld d) +{ + return d / _C_; +} + +inline ld ElectromagneticWaves::echoTime(const ld d) +{ + return (2.0 * d) / _C_; +} + +inline ld ElectromagneticWaves::intensityAvg_emWave_E(const ld E) +{ + return (_C_ * _e0_ * (E * E)) / 2.0; +} + +inline ld ElectromagneticWaves::powerReceivedByAntenna(const ld d, const ld I) +{ + return (I * Pi_ * (d * d)) / 4.0; +} + +inline ld ElectromagneticWaves::waveLength_dopplerEffect(const ld v, const ld recievedWL) +{ + return recievedWL / (1.0 - (v / _C_)); +} + +inline ld ElectromagneticWaves::inductanceOfCircuitFromWavelength(const ld theta, const ld C) +{ + return (theta * theta) / (4.0 * (_pi_ * _pi_) * (_C_ * _C_) * C); +} + +inline ld ElectromagneticWaves::capacitanceOfCircuitFromWavelength(const ld theta, const ld L) +{ + return (theta * theta) / (4.0 * (_pi_ * _pi_) * L * (_C_ * _C_)); +} + +inline ld ElectromagneticWaves::intensityAvg_emWave_B(const ld B) +{ + return (_C_ * (B * B)) / (2.0 * _mu0_); +} diff --git a/Energy.h b/Energy.h index e3b65e6..d10ba77 100644 --- a/Energy.h +++ b/Energy.h @@ -1,550 +1,660 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_ENERGY_H -#define PHYSICSFORMULA_ENERGY_H -/** - * @class Energy - * @details sub class contained within the Physics class and used for solving - * complex physics problems - * @author Ryan Zurrin - * @date 10/21/2020 - */ -#include -#include "Vector2D.h" -using namespace std; -#include -typedef long double ld; - -static int energy_objectCount = 0; - -class Energy -{ - -public: - - // Energy pointer - Energy* _energyPtr; - - - static void countShow() { std::cout << "energy object count: " << energy_objectCount << std::endl; } - - /** - * @brief a structure containing the energy in joules of some common phenomena - */ - struct EnergyOfEventsInJoules - { - const ld big_bang = pow(10, 68); - const ld super_nova = pow(10, 44); - const ld fusion_all_hydrogen_earths_oceans = pow(10, 34); - const ld annual_world_energy_use = 4 * pow(10, 20); - const ld large_fusion_bomb_9megaTon = 3.8 * pow(10, 16); - const ld hydrogen_1kg_fusion_to_helium = 6.4 * pow(10, 14); - const ld uranium_1kg_nuclear_fission = 8 * pow(10, 13); - const ld fission_bomb_10kiloton = 4.2 * pow(10, 13); - const ld barrel_crude_oil = 5.9 * pow(10, 9); - const ld tnt_1ton = 4.2 * pow(10, 9); - const ld gasoline_1gallon = 1.2 * pow(10, 8); - const ld electricity_use_daily_per_home = 7 * pow(10, 7); - const ld food_intake_adult_daily_recommended = 1.2 * pow(10, 7); - const ld car_1000kg_at_90kmh = 3.1 * pow(10, 5); - const ld fat_1g_or_9point3_kcal = 3.9 * pow(10, 4); - const ld carbohydrate_1g_or_4point1_kcal = 1.7 * pow(10, 4); - const ld protein_1g_or_4point1_kcal = 1.7 * pow(10, 4); - const ld tennis_ball_100kmh = 22; - const ld mosquito_point5ms = 1.3 * pow(10, -6); - const ld single_electron_in_tv_tube_beam = 4.0 * pow(10, -15); - const ld energy_to_break_dna_strand = pow(10, -19); - }joules; - /** - * @brief a structure containing the efficiency percent of common human - * body and mechanical devices - */ - struct Efficiency - { - const int cycling_and_climbing = 20; - const int swimming_surface = 2; - const int swimming_submerged = 4; - const int shoveling = 3; - const int weightlifting = 9; - const int steam_engine = 17; - const int gasoline_engine = 30; - const int diesel_engine = 35; - const int nuclear_power_plant = 35; - const int coal_power_plant = 42; - const int electric_motor = 98; - const int compact_fluorescent_light = 20; - const int gas_heater_residential = 90; - const int solar_cell = 10; - }eff; - /** - * @brief Power output or consumption in watts per hour of some common things - */ - struct Watts_Per_Hour - { - const ld supernova_peak = 5 * pow(10, 37); - const ld milky_way_galaxy = pow(10, 37); - const ld crab_nebula_pulsar = pow(10, 28); - const ld sun_ours = 4 * pow(10, 26); - const ld volcanic_eruption_maximum = 4 * pow(10, 15); - const ld lightning_bolt = 2 * pow(10, 12); - const ld nuclear_power_plant_total_electric_and_heat_transfer = 3 * pow(10, 9); - const ld aircraft_carrier_total_useful_and_heat_transfer = pow(10, 8); - const ld dragster_total_useful_and_heat_transfer = 2 * pow(10, 6); - const ld car_total_useful_and_heat_transfer = 8 * pow(10, 4); - const ld football_player_total_useful_and_heat_transfer = 5 * pow(10, 3); - const ld clothes_dryer = 4 * pow(10, 3); - const ld person_at_rest_all_heat_transfer = 100; - const ld typical_incandescent_light_buld_total_useful_and_heat_transfer = 60; - const ld heart_person_at_rest_total_useful_and_heat_transfer = 8; - const ld electric_clock = 3; - const ld pocket_calculator = pow(10, -3); - - }watts; - - //constructor - Energy() - { - _energyPtr = nullptr; - _energyVal = 0.0; - countIncrease(); - } - - Energy(ld val) - { - _energyPtr = nullptr; - _energyVal = 0.0; - countIncrease(); - } - - - /** - * @brief Returns the conversion from joules to kilo calories - * @param joules J - * @returns kilocalories kc - */ - static ld conversion_joules_to_kcal(const ld joules) - { - const int num = 4184; - return joules / num; - } - /** - * @brief Returns the work(W) done on a system by a constant force in the - * direction of motion times the distance through which the force acts - * @param force is the magnitude of the force on the system - * @param displacement_magnitude is the displacement of the system - * @param theta is the angle between the force vector and the displacement vector - * @returns the work done on a system - */ - static ld work(const ld force, const ld displacement_magnitude, const ld theta = 0) - { - return force * displacement_magnitude * cos(theta * RADIAN); - } - /** - * @brief Returns the work when the mass, final velocity, and height of y are known - * @param mass is the mass in kg - * @param vf is the final velocity - * @param h is the height of the y component - * @param g is the acceleration which is defaulted to 9.8 for gravity - * @returns the total work - */ - static ld work2(const ld mass, const ld vf, const ld h, const ld g = 9.8) - { - return (.5 * mass * (vf * vf) + (mass * g * h)); - } - /** - * @brief Returns the work going up stairs with constant acceleration - * F = mgh - * @param mass in kg - * @param height in m - * @returns total work - */ - static ld work3(const ld mass, const ld height) - { - return mass * _Ga_ * height; - } - /** - * @brief calculates the amount of useful power output by elevator motor - * P = (.5 * (balanceWeight * (velocityFinal * velocityFinal)) + ((9.8 * elevatorWeight * liftHeight) + 750 * (-35.0)))/(time) - * @param elevatorWeight in kg - * @param balanceWeight in kg - * @param liftHeight in m, specifies the height the elevator must travel up - * @param velocityFinal is the speed the elevator will achieve starting from a resting position, - * initial velocity is assumed 0 in this formula - * @param time in s the elevator travels up - * @returns power output for elevator motor - */ - static ld power_output_of_useful_energy_by_elevator_motor(const ld elevatorWeight, const ld balanceWeight, const ld liftHeight, const ld velocityFinal, const ld time) - { - const ld calculatedMass = balanceWeight - elevatorWeight; - const ld v2 = pow(velocityFinal, 2); - const ld m1 = _Ga_ * balanceWeight * liftHeight; - const ld m2 = _Ga_ * calculatedMass * -liftHeight; - const ld m3 = m1 + m2; - const ld m = (.5 * balanceWeight) * v2; - - return (m + m3)/time ; - } - /** - * @brief Returns the work down by friction lowering something down a slope - * @param coefficient is of friction - * @param mass in kg - * @param theta1 in angle of force - * @param distance is how far they travel over - * @param theta2 is defaulted to 180 degrees if you set your coordinate system perpendicular to the motion - * @returns the work done by friction - */ - static ld work_friction_down_slope(const ld coefficient, const ld mass, const ld theta1, const ld distance, const ld theta2 = 180) - { - return coefficient * mass * _Ga_ * cos(theta1 * RADIAN) * distance * cos(theta2); - } - /** - * @brief Returns the kinetic energy of an object - * fx = .5 * mass * (velocity * velocity) - * @param mass of object in kg - * @param velocity of object in m/s - * @returns KE (kinetic energy) - */ - static ld kinetic_energy_translational(const ld mass, const ld velocity) - { - return .5 * mass * (velocity * velocity); - } - /** - * @brief Returns the velocity(speed) solved by rearranging the work-energy theorem - * fx = sqrt((2 * netWork) / (mass)) - * @param netWork is the total energy in newtons - * @param mass in kg - * @returns the velocity - */ - static ld velocity_from_work_energy_theorem(const ld netWork, const ld mass) - { - return sqrt((2 * netWork) / (mass)); - } - /** - * @brief calculates the initial velocity of a falling mass when friction is negligible - * such as a roller coaster - * @param h height in m - * @param vi velocity initial - * @returns the final velocity - */ - static ld velocityFinal_fromHeight(const ld h, const ld vi = 0.0) - { - return sqrt((2 *_Ga_* abs(h) + (vi * vi))); - } - - /** - * @brief calculates the final velocity of a falling mass when friction is negligible - * such as a roller coaster - * @param h height in m - * @param vf velocity initial - * @returns the final velocity - */ - static ld velocityInitial_fromHeight(const ld h, const ld vf = 0.0) - { - return sqrt((vf*vf)-2*_Ga_*abs(h)); - } - - /** - * @brief Returns the speed calculated from something falling from a specified height - * @param height is the height of the object - * @param initialVelocity is the initial speed if not starting from a rest. - * Default is 0 assumed to be starting from rest - * @returns final speed - */ - static ld speed_from_height(const ld height, const ld initialVelocity = 0) - { - return sqrt(2 * _Ga_ * height ) + initialVelocity; - } - /** - * @brief Returns the distance traveld - * @param netWork is the total work from a system - * @param frictionForce is the force the friction is causing on the system - * @returns the distance - */ - static ld distance(const ld netWork, const ld frictionForce) - { - return abs(netWork / frictionForce); - } - /** - * @brief Returns the change in gravitational potential energy - * fx = mass * _G_ * height; - * @param mass is in kg - * @param height is the displacement in the y value - */ - static ld potential_energy_gravity_PEg(const ld mass, const ld height) - { - return mass * _Ga_ * height; - } - /** - * @brief Returns the potential energy of a conservative source, such as a spring - * @param forceConstant us unitless - * @param deformation is the amount of change in the system - */ - static ld potential_energy_conservative_PE(const ld forceConstant, const ld deformation) - { - return .5 * (forceConstant * (deformation * deformation)); - } - /** - * @brief Returns the force on impact - * @param mass in kg - * @param height from which the fall occurs - * @param compressionDistance is the distance of deformation on impact - * @returns the net force acting on the system - */ - static ld force_to_stop(const ld mass, const ld height, const ld compressionDistance) - { - return ((mass * _Ga_) * height)/ (compressionDistance); - } - /** - * @brief Returns the speed of object just after release using the equation - * for the conservation of mechanical energy solved for the final velocity just - * after toy car released by spring - * @param k is the force in Newtons/min - * @param m is the mass in kg of object - * @param x is the deformation of the spring used or object of PE - * @returns the speed m/s - */ - static ld conservation_equation_for_velocityFinal_bottom(const ld k, const ld m, const ld x) - { - return sqrt(k / m) * x; - } - /** - * @brief Returns the speed of an object after it reaches the top of a slope - * from being pushed by a spring - * @param k is the force in N/m - * @param m is the mass in kg - * @param x is the deformation of the spring - * @param y is the change in the y component value - * @returns the final speed - * - */ - static ld conservation_equation_for_velocityFinal_top(const ld k, const ld m, const ld x, const ld y) - { - return sqrt((k / m) * (x * x) - (2 * _Ga_ * y)); - } - /** - * @brief Returns the distance traveled sliding on level surface - * fx = m * (vi * vi) / (2 * ff) - * @param m is the mass in kg - * @param vi is the initial velocity - * @param ff is the frictional force - * @returns the distance traveled while sliding on level surface - */ - static ld distance_traveled_sliding_level(const ld m, const ld vi, const ld ff) - { - return (m * (vi * vi) / (2 * ff)); - } - /** - * @brief Returns the distance traveled sliding on an incline - * fx = (.5 * (m * (vi * vi)) / (ff + (m * _G_) * sin(theta * RADIAN))) - * @param m is the mass in kg - * @param vi is the initial velocity - * @param ff is the frictional force - * @param theta is the angle of the slope - * @returns the distance traveled while sliding on incline - */ - static ld distance_traveled_sliding_slope(const ld m, const ld vi, const ld ff, const ld theta) - { - return (.5 * (m * (vi * vi)) / (ff + (m * _Ga_) * sin(theta * RADIAN))); - } - /** - * @brief Returns the efficiency (Eff) of an energy conversion process - * fx = workEnergyOut / totalEnergyIn - * @param workEnergyOut is the total energy used - * @param totalEnergyIn is the total amount of energy being provided to a system for work - * @returns the efficiency - */ - static ld efficiency(const ld workEnergyOut, const ld totalEnergyIn) - { - return workEnergyOut / totalEnergyIn; - } - /** - * @brief Returns the power - */ - static ld power(const ld work, const ld time) - { - return work / time; - } - /** - * @brief Returns the power output of someone jumping - * @param mass in kg - * @param distanceBottom in meters is the height from ground to shoulder - * @param distanceTop in meters is the height from the ground to hight of jump - * @returns watts used to make the jump - */ - static ld power_to_jump(const ld mass, const ld distanceBottom, const ld distanceTop) - { - return mass * _Ga_ * distanceTop * sqrt((_Ga_ * ((distanceTop / distanceBottom) - 1) / (2 * distanceBottom))); - } - /** - * @brief calculates the time to do work based off of power output - * @param work is in joules. w = Fd = mgh - * @param power is in watts - * @returns the time to perform work - */ - static ld time_to_do_work(const ld work, const ld power) - { - return work / power; - } - - /** - * @brief Returns the power in watts required to accelerate an object from rest to a specific velocity - * over a period of time given the objects mass - * @param mass in kg - * @param velocity in m/s^2 - * @param time in s - * @returns power in watts - */ - static ld power_to_reach_velocity_from_rest_given_mass(const ld mass, const ld velocity, const ld time) - { - return (mass * (velocity * velocity) / (2 * _Ga_ * time)); - } - - /** - * @brief calculates the force needed to bring a car to rest given its mass, its speed and the distance - * it took to stop. This can be used to calculate the force from crashes and similar scenarios - * @param mass in gk - * @param velocity in m/s - * @param distance in m - * @returns the force exerted to make stop - */ - static ld force_needed_to_bring_car_to_rest(const ld mass, const ld velocity, const ld distance) - { - return (.5 * mass * (velocity * velocity)) / (distance); - } - /** - * @brief calculates the weight of a system from the loss in PE over a distance - * @param jouleLoss is the total loss in PE(potential energy) - * @param distance is the total distance that caused the energy loss - * @returns the weight of a system - */ - static ld weight_from_joule_loss_over_distance(const ld jouleLoss, const ld distance) - { - return jouleLoss / distance; - } - /** - * @brief Returns the calculation of the amount of compression on a spring with a given K constant - * and knowing the mass and velocity of the object that collides with it. - * x = sqrt((mass * (velocity * velocity)) / k) - * @param mass in kg - * @param velocity in m/s - * @param k is the spring constant - * @returns distance of compression in meters - */ - static ld compressionDistanceCollisionWithSpring(const ld mass, const ld velocity, const ld k) - { - return sqrt((mass * (velocity * velocity)) / k); - } - /** - * @brief calculates the spring constant when the mass, velocity, and total amount of compression on the spring is known - * @param mass in kg - * @param velocity in m/s - * @param totalCompression in m - * @returns the spring constant k - */ - static ld spring_constant(const ld mass, const ld velocity, const ld totalCompression) - { - return mass * (velocity * velocity) / (totalCompression * totalCompression); - } - /** - * @brief calculate the initial velocity needed to compress a spring a specified value - * @param mass in kg - * @param k is the spring constant - * @param x is the distance of compression - * @returns the initial speed needed to compress spring - */ - static ld initial_speed_to_compress_spring(const ld mass, const ld k, const ld x) - { - return sqrt((k * (x * x) / mass)); - } - /** - * @brief calculates the height of something from two velocities - * @param velocityStart is the initial velocity - * @param velocityEnd is the velocity at the height in question - * @returns height in meters - */ - static ld height_from_velocity(const ld velocityStart, const ld velocityEnd) - { - return ((velocityStart * velocityStart) - (velocityEnd * velocityEnd)) / (2 * _Ga_); - } - /** - * @brief calculates the kinetic energy in a falling mass. - * @param mass in kg - * @param finalDistance is the distance we are measureing the fall to ususally in a negitive - * @param initialDistance is the where it fell from if not using zero as a start - * @returns the kinetic energy - */ - static ld kinetic_energy_falling_mass(const ld mass, const ld finalDistance, const ld initialDistance = 0) - { - return -mass * _Ga_ * (finalDistance + initialDistance); - } - /** - * @brief Calculates the cost of an electrical unit based on the charge rate and power usage - * @param powerUsage in Watts - * @param cost per kw/h - * @returns cost per hour - */ - static ld cost_to_run_per_hour(const ld powerUsage, const ld cost) - { - return abs((powerUsage * cost) / 1000); - } - /** - * @brief Calculates the cost of an electrical unit based on the charge rate and power usage - * @param powerUsage in Watts - * @param cost per kw/h - * @returns cost per sec - */ - static ld cost_to_run_per_sec(const ld powerUsage, const ld cost) - { - return abs((powerUsage * cost) / 1000) * 12/3600 * 100; - } - /** - * @brief calculates and returns the tension force on a elevator cable - * @param mass in kg - * @param acceleration in m/s^2 - * @param friction frictional force - */ - static ld tension_elevator_cable(const ld mass, const ld acceleration, const ld friction) - { - return mass * (acceleration + _Ga_) + friction; - } - /** - * @brief Returns the final velocity - * vf = sqrt(2 * acceleration * distance) - * @param acceleration in m/s^2 - * @param distance in m - * @returns final velocity - */ - static ld final_velocity(const ld acceleration, const ld distance) - { - return sqrt(2 * acceleration * distance); - } - /** - * @brief calculates the force needed to jump between two points - * @param mass in kg - * @param distanceTop in m - * @param distanceBottom in m - * @returns force in N(newtons) - */ - static ld force_needed_to_jump_a_distance(const ld mass, const ld distanceTop, const ld distanceBottom) - { - return (mass * _Ga_ * distanceTop) / distanceBottom; - } - - void setEnergyVal(ld val) { _energyVal = val; } - - ~Energy() - { - delete _energyPtr; - countDecrease(); - } - -private: - static void countIncrease() { energy_objectCount += 1; } - static void countDecrease() { energy_objectCount -= 1; } - ld _energyVal; - - -}; +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_ENERGY_H +#define PHYSICSFORMULA_ENERGY_H +/** + * @class Energy + * @details sub class contained within the Physics class and used for solving + * complex physics problems + * @author Ryan Zurrin + * @date 10/21/2020 + */ +#include +#include "Vector2D.h" +using namespace std; +#include +typedef long double ld; + +static int energy_objectCount = 0; + +/** + * @brief a structure containing the energy in joules of some common phenomena + */ +static struct EnergyOfEventsInJoules +{ + const ld big_bang = pow(10, 68); + const ld super_nova = pow(10, 44); + const ld fusion_all_hydrogen_earths_oceans = pow(10, 34); + const ld annual_world_energy_use = 4 * pow(10, 20); + const ld large_fusion_bomb_9megaTon = 3.8 * pow(10, 16); + const ld hydrogen_1kg_fusion_to_helium = 6.4 * pow(10, 14); + const ld uranium_1kg_nuclear_fission = 8 * pow(10, 13); + const ld fission_bomb_10kiloton = 4.2 * pow(10, 13); + const ld barrel_crude_oil = 5.9 * pow(10, 9); + const ld tnt_1ton = 4.2 * pow(10, 9); + const ld gasoline_1gallon = 1.2 * pow(10, 8); + const ld electricity_use_daily_per_home = 7 * pow(10, 7); + const ld food_intake_adult_daily_recommended = 1.2 * pow(10, 7); + const ld car_1000kg_at_90kmh = 3.1 * pow(10, 5); + const ld fat_1g_or_9point3_kcal = 3.9 * pow(10, 4); + const ld carbohydrate_1g_or_4point1_kcal = 1.7 * pow(10, 4); + const ld protein_1g_or_4point1_kcal = 1.7 * pow(10, 4); + const ld tennis_ball_100kmh = 22; + const ld mosquito_point5ms = 1.3 * pow(10, -6); + const ld single_electron_in_tv_tube_beam = 4.0 * pow(10, -15); + const ld energy_to_break_dna_strand = pow(10, -19); +}joules; +/** + * @brief a structure containing the efficiency percent of common human + * body and mechanical devices + */ +static struct Efficiency +{ + const int cycling_and_climbing = 20; + const int swimming_surface = 2; + const int swimming_submerged = 4; + const int shoveling = 3; + const int weightlifting = 9; + const int steam_engine = 17; + const int gasoline_engine = 30; + const int diesel_engine = 35; + const int nuclear_power_plant = 35; + const int coal_power_plant = 42; + const int electric_motor = 98; + const int compact_fluorescent_light = 20; + const int gas_heater_residential = 90; + const int solar_cell = 10; +}eff; +/** + * @brief Power output or consumption in watts per hour of some common things + */ +static struct Watts_Per_Hour +{ + const ld supernova_peak = 5 * pow(10, 37); + const ld milky_way_galaxy = pow(10, 37); + const ld crab_nebula_pulsar = pow(10, 28); + const ld sun_ours = 4 * pow(10, 26); + const ld volcanic_eruption_maximum = 4 * pow(10, 15); + const ld lightning_bolt = 2 * pow(10, 12); + const ld nuclear_power_plant_total_electric_and_heat_transfer = 3 * pow(10, 9); + const ld aircraft_carrier_total_useful_and_heat_transfer = pow(10, 8); + const ld dragster_total_useful_and_heat_transfer = 2 * pow(10, 6); + const ld car_total_useful_and_heat_transfer = 8 * pow(10, 4); + const ld football_player_total_useful_and_heat_transfer = 5 * pow(10, 3); + const ld clothes_dryer = 4 * pow(10, 3); + const ld person_at_rest_all_heat_transfer = 100; + const ld typical_incandescent_light_buld_total_useful_and_heat_transfer = 60; + const ld heart_person_at_rest_total_useful_and_heat_transfer = 8; + const ld electric_clock = 3; + const ld pocket_calculator = pow(10, -3); + +}watts; + +class Energy +{ + +public: + static void countShow() { std::cout << "energy object count: " << energy_objectCount << std::endl; } + + //constructor + Energy() + { + _work = 0.0; + countIncrease(); + } + + Energy(ld val) + { + _work = 0.0; + countIncrease(); + } + + + /** + * @brief Returns the conversion from joules to kilo calories + * @param joules J + * @returns kilocalories kc + */ + static ld conversion_joules_to_kcal(const ld joules) + { + const int num = 4184; + return joules / num; + } + + static ld work(const ld v_0, const ld v_1, const ld mass, const bool print) + { + ld work = 0.0; + work = .5*mass*(v_1*v_1) - .5*mass*(v_0*v_0); + if (print) + { + std::cout << "work: " << work << std::endl; + } + return work; + } + + /** + * @brief Returns the work(W) done on a system by a constant force in the + * direction of motion times the distance through which the force acts + * @param force is the magnitude of the force on the system + * @param displacement_magnitude is the displacement of the system + * @param theta is the angle between the force vector and the displacement vector + * @returns the work done on a system + */ + static ld work(const ld force, const ld displacement_magnitude, const ld theta = 0) + { + return force * displacement_magnitude * cos(theta * RADIAN); + } + /** + * @brief Returns the work when the mass, final velocity, and height of y are known + * @param mass is the mass in kg + * @param vf is the final velocity + * @param h is the height of the y component + * @param g is the acceleration which is defaulted to 9.8 for gravity + * @returns the total work + */ + static ld work2(const ld mass, const ld vf, const ld h, const ld g = 9.8) + { + return (.5 * mass * (vf * vf) + (mass * g * h)); + } + /** + * @brief Returns the work going up stairs with constant acceleration + * F = mgh + * @param mass in kg + * @param height in m + * @returns total work + */ + static ld work3(const ld mass, const ld height) + { + return mass * _Ga_ * height; + } + /** + * @brief calculates the amount of useful power output by elevator motor + * P = (.5 * (balanceWeight * (velocityFinal * velocityFinal)) + ((9.8 * elevatorWeight * liftHeight) + 750 * (-35.0)))/(time) + * @param elevatorWeight in kg + * @param balanceWeight in kg + * @param liftHeight in m, specifies the height the elevator must travel up + * @param velocityFinal is the speed the elevator will achieve starting from a resting position, + * initial velocity is assumed 0 in this formula + * @param time in s the elevator travels up + * @returns power output for elevator motor + */ + static ld power_output_of_useful_energy_by_elevator_motor(const ld elevatorWeight, const ld balanceWeight, const ld liftHeight, const ld velocityFinal, const ld time) + { + const ld calculatedMass = balanceWeight - elevatorWeight; + const ld v2 = pow(velocityFinal, 2); + const ld m1 = _Ga_ * balanceWeight * liftHeight; + const ld m2 = _Ga_ * calculatedMass * -liftHeight; + const ld m3 = m1 + m2; + const ld m = (.5 * balanceWeight) * v2; + + return (m + m3)/time ; + } + /** + * @brief Returns the work down by friction lowering something down a slope + * @param coefficient is of friction + * @param mass in kg + * @param theta1 in angle of force + * @param distance is how far they travel over + * @param theta2 is defaulted to 180 degrees if you set your coordinate system perpendicular to the motion + * @returns the work done by friction + */ + static ld work_friction_down_slope(const ld coefficient, const ld mass, const ld theta1, const ld distance, const ld theta2 = 180) + { + return coefficient * mass * _Ga_ * cos(theta1 * RADIAN) * distance * cos(theta2); + } + /** + * @brief Returns the kinetic energy of an object + * fx = .5 * mass * (velocity * velocity) + * @param mass of object in kg + * @param velocity of object in m/s + * @returns KE (kinetic energy) + */ + static ld kinetic_energy(const ld mass, const ld velocity, const bool print = false) + { + const ld fx = .5 * mass * pow(velocity, 2); + if (print) + { + cout << "Kinetic Energy: " << fx << endl; + } + return fx; + } + /** + * @brief Returns the velocity(speed) solved by rearranging the work-energy theorem + * fx = sqrt((2 * netWork) / (mass)) + * @param netWork is the total energy in newtons + * @param mass in kg + * @returns the velocity + */ + static ld velocity(const ld KE, const ld mass, const bool print = false) + { + const ld fx = sqrt((2 * KE) / mass); + if (print) + { + cout << "Velocity: " << fx << endl; + } + return fx; + } + + static ld velocity(const ld m, const ld x, const ld F, const ld print = false) + { + const ld a = F / m; + const ld fx = sqrt(2.0 * a * x); + if (print) + { + cout << "Velocity: " << fx << endl; + } + return fx; + } + + /** + * @brief calculates the initial velocity of a falling mass when friction is negligible + * such as a roller coaster + * @param h height in m + * @param vi velocity initial + * @returns the final velocity + */ + static ld velocityFinal_fromHeight(const ld h, const ld vi = 0.0) + { + return sqrt((2 *_Ga_* abs(h) + (vi * vi))); + } + + /** + * @brief calculates the final velocity of a falling mass when friction is negligible + * such as a roller coaster + * @param h height in m + * @param vf velocity initial + * @returns the final velocity + */ + static ld velocityInitial_fromHeight(const ld h, const ld vf = 0.0) + { + return sqrt((vf*vf)-2*_Ga_*abs(h)); + } + + /** + * @brief Returns the speed calculated from something falling from a specified height + * @param height is the height of the object + * @param initialVelocity is the initial speed if not starting from a rest. + * Default is 0 assumed to be starting from rest + * @returns final speed + */ + static ld speed_from_height(const ld height, const ld initialVelocity = 0) + { + return sqrt(2 * _Ga_ * height ) + initialVelocity; + } + /** + * @brief Returns the distance traveld + * @param netWork is the total work from a system + * @param frictionForce is the force the friction is causing on the system + * @returns the distance + */ + static ld distance(const ld netWork, const ld frictionForce) + { + return abs(netWork / frictionForce); + } + + static ld distance(ld force, ld work, ld theta, bool print = false) { + auto distance = work/(force*cos(theta*RADIAN)); + if (print) { + std::cout << "Distance: " << distance << std::endl; + } + return distance; + } + + /** + * @brief Returns the change in gravitational potential energy + * fx = mass * _G_ * height; + * @param mass is in kg + * @param height is the displacement in the y value + */ + static ld potential_energy_gravity_PEg(const ld mass, const ld height) + { + return mass * _Ga_ * height; + } + /** + * @brief Returns the potential energy of a conservative source, such as a spring + * @param forceConstant us unitless + * @param deformation is the amount of change in the system + */ + static ld potential_energy_conservative_PE(const ld forceConstant, const ld deformation) + { + return .5 * (forceConstant * (deformation * deformation)); + } + /** + * @brief Returns the force on impact + * @param mass in kg + * @param height from which the fall occurs + * @param compressionDistance is the distance of deformation on impact + * @returns the net force acting on the system + */ + static ld force_to_stop(const ld mass, const ld height, const ld compressionDistance) + { + return ((mass * _Ga_) * height)/ (compressionDistance); + } + /** + * @brief Returns the speed of object just after release using the equation + * for the conservation of mechanical energy solved for the final velocity just + * after toy car released by spring + * @param k is the force in Newtons/min + * @param m is the mass in kg of object + * @param x is the deformation of the spring used or object of PE + * @returns the speed m/s + */ + static ld conservation_equation_for_velocityFinal_bottom(const ld k, const ld m, const ld x) + { + return sqrt(k / m) * x; + } + /** + * @brief Returns the speed of an object after it reaches the top of a slope + * from being pushed by a spring + * @param k is the force in N/m + * @param m is the mass in kg + * @param x is the deformation of the spring + * @param y is the change in the y component value + * @returns the final speed + * + */ + static ld conservation_equation_for_velocityFinal_top(const ld k, const ld m, const ld x, const ld y) + { + return sqrt((k / m) * (x * x) - (2 * _Ga_ * y)); + } + /** + * @brief Returns the distance traveled sliding on level surface + * fx = m * (vi * vi) / (2 * ff) + * @param m is the mass in kg + * @param vi is the initial velocity + * @param ff is the frictional force + * @returns the distance traveled while sliding on level surface + */ + static ld distance_traveled_sliding_level(const ld m, const ld vi, const ld ff) + { + return (m * (vi * vi) / (2 * ff)); + } + /** + * @brief Returns the distance traveled sliding on an incline + * fx = (.5 * (m * (vi * vi)) / (ff + (m * _G_) * sin(theta * RADIAN))) + * @param m is the mass in kg + * @param vi is the initial velocity + * @param ff is the frictional force + * @param theta is the angle of the slope + * @returns the distance traveled while sliding on incline + */ + static ld distance_traveled_sliding_slope(const ld m, const ld vi, const ld ff, const ld theta) + { + return (.5 * (m * (vi * vi)) / (ff + (m * _Ga_) * sin(theta * RADIAN))); + } + /** + * @brief Returns the efficiency (Eff) of an energy conversion process + * fx = workEnergyOut / totalEnergyIn + * @param workEnergyOut is the total energy used + * @param totalEnergyIn is the total amount of energy being provided to a system for work + * @returns the efficiency + */ + static ld efficiency(const ld workEnergyOut, const ld totalEnergyIn) + { + return workEnergyOut / totalEnergyIn; + } + /** + * @brief Returns the power + */ + static ld power(const ld work, const ld time, const bool print = false) + { + auto power = work / time; + if (print) + { + std::cout << "Power: " << power << std::endl; + } + return power; + } + /** + * @brief Returns the power output of someone jumping + * @param mass in kg + * @param distanceBottom in meters is the height from ground to shoulder + * @param distanceTop in meters is the height from the ground to hight of jump + * @returns watts used to make the jump + */ + static ld power_to_jump(const ld mass, const ld distanceBottom, const ld distanceTop) + { + return mass * _Ga_ * distanceTop * sqrt((_Ga_ * ((distanceTop / distanceBottom) - 1) / (2 * distanceBottom))); + } + /** + * @brief calculates the time to do work based off of power output + * @param work is in joules. w = Fd = mgh + * @param power is in watts + * @returns the time to perform work + */ + static ld time_to_do_work(const ld work, const ld power) + { + return work / power; + } + + /** + * @brief Returns the power in watts required to accelerate an object from rest to a specific velocity + * over a period of time given the objects mass + * @param mass in kg + * @param velocity in m/s^2 + * @param time in s + * @returns power in watts + */ + static ld power_to_reach_velocity_from_rest_given_mass(const ld mass, const ld velocity, const ld time) + { + return (mass * (velocity * velocity) / (2 * _Ga_ * time)); + } + + /** + * @brief calculates the force needed to bring a car to rest given its mass, its speed and the distance + * it took to stop. This can be used to calculate the force from crashes and similar scenarios + * @param mass in gk + * @param velocity in m/s + * @param distance in m + * @returns the force exerted to make stop + */ + static ld force_needed_to_bring_car_to_rest(const ld mass, const ld velocity, const ld distance) + { + return (.5 * mass * (velocity * velocity)) / (distance); + } + /** + * @brief calculates the weight of a system from the loss in PE over a distance + * @param jouleLoss is the total loss in PE(potential energy) + * @param distance is the total distance that caused the energy loss + * @returns the weight of a system + */ + static ld weight_from_joule_loss_over_distance(const ld jouleLoss, const ld distance) + { + return jouleLoss / distance; + } + /** + * @brief Returns the calculation of the amount of compression on a spring with a given K constant + * and knowing the mass and velocity of the object that collides with it. + * x = sqrt((mass * (velocity * velocity)) / k) + * @param mass in kg + * @param velocity in m/s + * @param k is the spring constant + * @returns distance of compression in meters + */ + static ld compressionDistanceCollisionWithSpring(const ld mass, const ld velocity, const ld k) + { + return sqrt((mass * (velocity * velocity)) / k); + } + /** + * @brief calculates the spring constant when the mass, velocity, and total amount of compression on the spring is known + * @param mass in kg + * @param velocity in m/s + * @param totalCompression in m + * @returns the spring constant k + */ + static ld spring_constant(const ld mass, const ld velocity, const ld totalCompression) + { + return mass * (velocity * velocity) / (totalCompression * totalCompression); + } + /** + * @brief calculate the initial velocity needed to compress a spring a specified value + * @param mass in kg + * @param k is the spring constant + * @param x is the distance of compression + * @returns the initial speed needed to compress spring + */ + static ld initial_speed_to_compress_spring(const ld mass, const ld k, const ld x) + { + return sqrt((k * (x * x) / mass)); + } + + static ld work_by_spring(const ld k, const ld x, const bool isCompressed = false, + const bool print = false) + { + auto work = 0.0; + if (isCompressed) + { + work = .5 * k * (x * x); + } + else + { + work = -.5 * k * (x * x); + } + if (print) + { + std::cout << "Work by spring: " << work << std::endl; + } + return work; + } + + static ld distance_spring_moved(const ld k, const ld work, + const bool isCompressed = false, + const bool print = false) + { + auto distance = 0.0; + if (isCompressed) { + distance = sqrt((2.0 * work) / k); + } else + distance = -sqrt((2.0 * work) / k); + if (print) + { + std::cout << "Distance spring moved: " << distance << std::endl; + } + return distance; + } + + /** + * @brief calculates the height of something from two velocities + * @param velocityStart is the initial velocity + * @param velocityEnd is the velocity at the height in question + * @returns height in meters + */ + static ld height_from_velocity(const ld velocityStart, const ld velocityEnd) + { + return ((velocityStart * velocityStart) - (velocityEnd * velocityEnd)) / (2 * _Ga_); + } + /** + * @brief calculates the kinetic energy in a falling mass. + * @param mass in kg + * @param finalDistance is the distance we are measureing the fall to ususally in a negitive + * @param initialDistance is the where it fell from if not using zero as a start + * @returns the kinetic energy + */ + static ld kinetic_energy_falling_mass(const ld mass, const ld finalDistance, const ld initialDistance = 0) + { + return -mass * _Ga_ * (finalDistance + initialDistance); + } + /** + * @brief Calculates the cost of an electrical unit based on the charge rate and power usage + * @param powerUsage in Watts + * @param cost per kw/h + * @returns cost per hour + */ + static ld cost_to_run_per_hour(const ld powerUsage, const ld cost) + { + return abs((powerUsage * cost) / 1000); + } + /** + * @brief Calculates the cost of an electrical unit based on the charge rate and power usage + * @param powerUsage in Watts + * @param cost per kw/h + * @returns cost per sec + */ + static ld cost_to_run_per_sec(const ld powerUsage, const ld cost) + { + return abs((powerUsage * cost) / 1000) * 12/3600 * 100; + } + /** + * @brief calculates and returns the tension force on a elevator cable + * @param mass in kg + * @param acceleration in m/s^2 + * @param friction frictional force + */ + static ld tension_elevator_cable(const ld mass, const ld acceleration, const ld friction) + { + return mass * (acceleration + _Ga_) + friction; + } + /** + * @brief Returns the final velocity + * vf = sqrt(2 * acceleration * distance) + * @param acceleration in m/s^2 + * @param distance in m + * @returns final velocity + */ + static ld final_velocity(const ld acceleration, const ld distance) + { + return sqrt(2 * acceleration * distance); + } + /** + * @brief calculates the force needed to jump between two points + * @param mass in kg + * @param distanceTop in m + * @param distanceBottom in m + * @returns force in N(newtons) + */ + static ld force_needed_to_jump_a_distance(const ld mass, const ld distanceTop, const ld distanceBottom) + { + return (mass * _Ga_ * distanceTop) / distanceBottom; + } + /** + * calculates the average force using F = w/(d * cos(theta)) + * @param work in J + * @param d distance in m + * @param theta angle in degrees of cosine + * @return average force in N + */ + static ld averageForce(ld work, ld d, ld theta, bool print = false) { + auto force = work / (d * cos(theta*RADIAN)); + if (print) { + std::cout << "Average Force: " << force << " N\n"; + } + return force; + } + + /** + * @brief A arrow of mass m is shot vertically from a bow whose effective + * spring constant is k. If the bow is drawn back a distance of x before + * shooting, to what height does the arrow rise? + * @param m mass in kg + * @param k spring constant in N/m + * @param x distance in m + * @param print print the answer + * @return height in m + */ + static ld vertical_height_arrow(const ld m, const ld k, const ld x, bool print = false) + { + auto height = (k * (x * x)) / (2 * m * _Ga_); + if (print) { + std::cout << "Vertical Height: " << height << " m\n"; + } + return height; + } + /** + * @brief sets the work variable + * @param val value to set + */ + void setWork(ld val) { _work = val; } + ~Energy() + { + countDecrease(); + } +private: + static void countIncrease() { energy_objectCount += 1; } + static void countDecrease() { energy_objectCount -= 1; } + ld _work; + + +}; #endif //PHYSICSFORMULA_ENERGY_H \ No newline at end of file diff --git a/FluidDynamics.h b/FluidDynamics.h index e1354cd..182e736 100644 --- a/FluidDynamics.h +++ b/FluidDynamics.h @@ -1,988 +1,988 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_FLUIDDYNAMICS_H -#define PHYSICSFORMULA_FLUIDDYNAMICS_H -/** - * @class FluidDynamics - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @date 12/17/2020 - */ -#include -#include -using namespace std; -typedef long double ld; -#define _Ga_ 9.81 // acceleration due to gravity -static int fluidDynamic_objectCount = 0; - -static struct FlowRateConversions -{ - static ld litersPerSecond_to_cubicMetersPerSecond(const ld lps) - { - return lps * .001; // m^3/sec - } - static ld litersPerSecond_to_cubicMetersPerMin(const ld lps) - { - return lps * .06; // m^3/min - } - - static ld literMin_to_cubicCentimeterSecond(const ld ltrMin) - { - return ltrMin * 16.6667; // cm^3/s - } - static ld cubicCentimeterSecond_to_literMin(const ld ccms) - { - return ccms / 16.6667; // L/min - } - static ld literMin_to_cubicMeterSecond(const ld ltrMin) - { - return ltrMin * 1.6667 * pow(10.0, -5.0); // m^3/s - } - static ld cubicMeterSecond_to_literMin(const ld cms) - { - return cms / 1.6667 * pow(10.0, -5.0); // L/min - } - - -}flow_rate_converter; - -static struct ViscosityCoefficients -{ - const ld air_0C = 0.0171; //mPa*s - const ld air_20C = 0.0181; //mPa*s - const ld air_40C = 0.0190; //mPa*s - const ld air_100C = 0.00974; //mPa*s - const ld ammonia_20C = 0.00974; // mPa*s - const ld carbonDioxide_20C = 0.0147; //mPa*s - const ld helium_20C = 0.0196; // mPa*s - const ld hydrogen_0C = .0090; // mPa*s - const ld mercury_20C = 0.0450; // mPa*s - const ld oxygen_20C = .0203; // mPa*s - const ld steam_100C = .0130; // mPa*s - const ld water_0C = 1.792; // mPa*s - const ld water_20C = 1.002; // mPa*s - const ld water_37C = 0.6947; // mPa*s - const ld water_40C = 0.653; // mPa*s - const ld water_100C = 0.282; // mPa*s - const ld wholeBlood_20C = 3.015; // mPa*s - const ld wholeBlood_37C = 2.084; // mPa*s - const ld bloodPlasma_20C = 1.810; // mPa*s - const ld bloodPlasma_37C = 1.257; // mPa*s - const ld ethylAlcohol_20C = 1.20; // mPa*s - const ld methanol_20C = 0.584; // mPa*s - const ld oil_heavyMachine_20C = 660.0; // mPa*s - const ld oil_motorSAE10_30C = 200.0; // mPa*s - const ld oil_olive_20C = 138.0; // mPa*s - const ld glycerin_20C = 1500; // mPa*s - ld honey_20C = 2000; // mPa*s - /// -/// Sets the honey_20C viscosity which can be between 2000 and 10000. -/// -/// The argument. - void setHoney(ld n) - { - if(n >=2000 && n <= 10000) - { - honey_20C = n; - } - else - honey_20C = 2000; - - } - ld mapleSyrup_20C = 2000; //mPa*s - /// - /// Sets the maple syrup between 2000 and 3000. - /// - /// The n. - void setMapleSyrup(ld n) - { - if (n >= 2000 && n <= 3000) - { - mapleSyrup_20C = n; - } - else - mapleSyrup_20C = 2000; - } - const ld milk_20C = 3.0; // //mPa*s - const ld oil_corn_20C = 65.0; //mPa*s -}viscosity_coefficients; - -static struct DiffusionConstants -{ - const ld HYDROGEN_AIR = 6.4 * pow(10.0, -5.0); // .000064 - const ld OXYGEN_AIR = 1.8 * pow(10.0, -5.0); //.000018 - const ld OXYGEN_WATER = 1.0 * pow(10.0, -9.0); // .000000001 - const ld GLUCOSE_WATER = 6.7 * pow(10.0, -10.0); // .00000000067 - const ld HEMOGLOBIN_WATER = 6.9 * pow(10.0, -11.0); //.000000000069 - const ld DNA_WATER = 1.3 * pow(10.0, -12.0); // .0000000000013 -}diffusion_constants; - -class FluidDynamics -{ -private: - static void countIncrease() { fluidDynamic_objectCount += 1; } - static void countDecrease() { fluidDynamic_objectCount -= 1; } -public: - FluidDynamics* _fluidDynamicPtr; - - FluidDynamics() - { - _fluidDynamicPtr = nullptr; - countIncrease(); - } - - /** - * @brief copy constructor - */ - FluidDynamics(const FluidDynamics& t) - { - _fluidDynamicPtr = t._fluidDynamicPtr; - countIncrease(); - } - /** - * #brief move constructor - */ - FluidDynamics(FluidDynamics&& t) noexcept - { - _fluidDynamicPtr = t._fluidDynamicPtr; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - FluidDynamics& operator=(FluidDynamics&& t) noexcept - { - if (this != &t) - { - _fluidDynamicPtr = t._fluidDynamicPtr; - countIncrease(); - } - return *this; - } - - static void show_objectCount() { std::cout << "\n fluid dynamic object count: " << fluidDynamic_objectCount << std::endl; } - static int get_objectCount() { return fluidDynamic_objectCount; } - - /// - /// calculates the volumes of a cylinder. - /// - /// The radius is used to find the cross sectional area of a cylinder. - /// The distance. - /// volume - static ld volumeCylinder(const ld radius, const ld distance) - { - return Pi_ * (radius * radius) * distance; - } - - /// - /// finds the flow rate of fluid in a cylinder. - /// - /// The radius. - /// The distance. - /// The time. - /// flow rate (Q) - static ld flowRateCylinder_radius(const ld radius, const ld distance, const ld time) - { - return Pi_ * (radius * radius) * distance * time; - } - - /// - /// calculates the flow rate of a cylinder using the diameter. - /// - /// The diameter. - /// The velocity. - /// - static ld flowRateCylinder_diameter(const ld diameter, const ld velocity) - { - return (Pi_ * (diameter * diameter) / 4.0) * velocity; - } - - /// - /// calculates the flow rate. - /// - /// The volume. - /// The time. - /// flow rate - static ld flowRate(const ld volume, const ld time) - { - return volume / time; - } - - /// - /// calculates the volume of flow rate. - /// - /// The cross sectional area. - /// The average velocity. - /// volume flow rate - static ld volumeFlowRate(const ld crossSectionalArea, const ld avgVelocity) - { - return crossSectionalArea * avgVelocity; - } - - /// - /// finds the average velocity. - /// - /// The volume flow rate. - /// The area. - /// average velocity - static ld averageVelocity(const ld volumeFlowRate, const ld area) - { - return volumeFlowRate / area; - } - - /// - /// average velocity in tube or aorta with given radius and flow. - /// - /// The volume flow rate. - /// The radius. - /// average velocity - static ld averageVelocity_tubeLike(const ld volumeFlowRate, const ld radius) - { - return volumeFlowRate / (Pi_ * (radius * radius)); - } - - /// - /// calculates the volume from flow rate and time - /// - /// The flow rate. - /// The time. - /// volume - static ld volume(const ld flowRate, const ld time) - { - return flowRate * time; - } - - /// - /// calculates the time - /// - /// The flow rate. - /// The volume. - /// time - static ld time(const ld flowRate, const ld volume) - { - return volume / flowRate; - } - - /// - /// finds the velocity using the equation of continuity solved for - /// velocity2. - /// - /// The velocity of flow through the area1. - /// The cross-sectional area1. - /// The cross-sectional area2. - /// velocity through area2 - static ld velocity2_eqOfContinuity(const ld velocity1, const ld area1, const ld area2) - { - return (area1 / area2) * velocity1; - } - - /// - /// Flows the rate tube like. - /// - /// The radius. - /// The average velocity. - /// - static ld flowRate_tubeLike(const ld radius, const ld avgVelocity) - { - return Pi_ * (radius * radius) * avgVelocity; - } - - /// - /// calculates the total volume to flow over a period of time. - /// - /// The radius. - /// The average velocity. - /// The time. - /// volume total - static ld volumeTotal(const ld radius, const ld avgVelocity, const ld time) - { - return Pi_ * (radius * radius) * avgVelocity * time; - } - - /// - /// finds the factor the velocity is reduced by branching. - /// - /// The main radius. - /// The branch radius. - /// The number of smaller branches. - /// factor of velocity reduction - static ld reducedVelocity_branchingArteries(const ld mainRadius, const ld branchRadius, const ld branches) - { - return (1.0 * mainRadius) / (branches * branchRadius); - } - - /// - /// Average velocity of blood flow through ad capillary. - /// - /// The flow rate. - /// The capillary vessels. - /// The diameter each. - /// average blood flow - static ld averageVelocityBloodFlowThroughCapillary_diameter(const ld flowRate, const ld capillaryVessels, const ld diameterEach) - { - return (4.0 * flowRate) / (capillaryVessels * Pi_ * (diameterEach * diameterEach)); - } - - /// - /// Averages the velocity blood flow through capillary with the radius. - /// - /// The flow rate. - /// The radius. - /// - static ld averageVelocityBloodFlowThroughCapillary_radius(const ld flowRate, const ld radius) - { - return flowRate / (Pi_ * (radius * radius)); - } - - /// - /// calculates the total number of capillaries. - /// - /// The area. - /// The diameter. - /// capillaries - static ld capillaryFlowTotal_diameter(const ld area, const ld diameter) - { - return (4.0 * area) / (Pi_ * (diameter * diameter)); - } - - /// - /// calculates the total number of Capillaries with the radius. - /// - /// The flow. - /// The radius. - /// - static ld capillaryFlowTotal_radius(const ld flow, const ld radius) - { - return flow / (Pi_ * (radius * radius)); - } - - /// - /// calculates the total flow rate - /// - /// The number of capillaries. - /// The cross sectional area. - /// The average velocity. - /// total flow rate - static ld totalFlowRate_capillary(const ld capillaries, const ld crossSectionalArea, const ld avgVelocity) - { - return capillaries * crossSectionalArea * avgVelocity; - } - - /// - /// Calculates the air flow through a circular duct into a rectangular room. - /// - /// The rooms volume = L * W * H. - /// The radius duct or r = diameter/2. - /// The time in seconds. - /// average speed of air flow out of duct - static ld airFlowThroughCircularDuctIntoRectangularRoom(const ld roomVolume, const ld radiusDuct, const ld time) - { - return roomVolume / (Pi_ * (radiusDuct * radiusDuct) * time); - } - - /// - /// calculates the inside diameters of a hose nozzle. - /// - /// The flow rate. - /// The velocity. - /// diameter - static ld diameterStream(const ld flowRate, const ld velocity) - { - return 2.0 * sqrt((flowRate) / (Pi_ * velocity)); - } - - /// - /// calculates the diameter that a pipe would need to be at minimum to - /// meet the requirements for the specified values - /// - /// The density fluid. - /// The flow rate fluid. - /// The viscosity fluid. - /// The Reynolds number. - /// - static ld diameterPipeForSpecifiedValues(const ld densityFluid, const ld flowRateFluid, const ld viscosityFluid, const ld reynoldsNumber) - { - return (4.0 * densityFluid * flowRateFluid) / (Pi_ * reynoldsNumber * viscosityFluid); - } - - /// - /// uses Bernoulli's equation to calculate the amount of work. - /// - /// The mass. - /// The velocity final. - /// The velocity initial. - /// work new - static ld workNet_BernoulliEquation(const ld mass, const ld velocityFinal, const ld velocityInitial = 0.0) - { - return (.5 * mass * (velocityFinal * velocityFinal)) - (.5 * mass * (velocityInitial * velocityInitial)); - } - - /// - /// calculates the final Velocity using the Bernoulli equation. - /// - /// The velocity initial. - /// Height of the change in. - /// final velocity - static ld velocityFinal_bernoulliEquation(const ld velocityInitial, const ld changeInHeight) - { - return sqrt(pow(velocityInitial, 2.0) + (2.0 * _Ga_ * changeInHeight)); - } - - /// - /// calculates the final pressure. - /// - /// The initial pressure. - /// The density. - /// The initial velocity - /// The final velocity final. - /// - static ld pressureFinal_bernoulliEquationConstantAltitude(const ld pressureInitial, const ld density, const ld velocityInitial, const ld velocityFinal) - { - return pressureInitial + .5 * density * ((velocityInitial * velocityInitial) - (velocityFinal * velocityFinal)); - } - - /// - /// Calculates the maximums height water from a hose can reach. - /// - /// The velocity. - /// height - static ld maxHeightWaterFromHose(const ld velocity) - { - return (velocity * velocity) / (2.0 * _Ga_); - } - - /// - /// Calculates the maximum height above a nozzle the water can rise? - /// (The actual height will be significantly smaller due to air resistance.) - /// - /// The volume rate of flow. - /// The nozzle diameter. - /// max height - static ld maxHeightAboveNozzleLiquidRise(const ld volumeROF, const ld nozzleDiameter) - { - return (8.0 * pow(volumeROF, 2.0)) / (pow(Pi_, 2.0) * _Ga_ * pow(nozzleDiameter, 4.0)); - } - - /// - /// Calculates approximately the force due to the Bernoulli effect on a roof - /// having a specified area. F = 1/2 * p * v^2 * A - /// - /// The density of the air. - /// The velocity of the wind. - /// The area of the roof. - /// Force on roof - static ld force_bernoulliEquationConstantAltitude(const ld density, const ld velocity, const ld area) - { - return .5 * density * (velocity * velocity) * area; - } - - /// - /// Calculate the approximate force on a area of sail, given the - /// horizontal velocityHigh of the wind is faster and parallel to its front surface - /// while a velocitySlow wind runs along its back surface. - /// - /// The density. - /// The velocity high. - /// The velocity low. - /// The area. - /// force of wind - static ld force_bernoulliEquationConstantAltitude(const ld density, const ld velocityHigh, const ld velocityLow, const ld area) - { - return .5 * density * ((velocityHigh * velocityHigh) - (velocityLow * velocityLow)) * area; - } - - /// - /// calculates the pressure drop due to the Bernoulli effect as water goes into a - /// smaller diameter nozzle from a larger diameter hose while carrying a - /// specified volumeFlowRate. - /// - /// The density. - /// The volume rate of flow. - /// The larger diameter. - /// The smaller diameter. - /// drop in pressure - static ld pressureDrop_bernoulliEquationConstantAlt(const ld density, const ld volumeRateOfFlow, const ld diameterLarge, const ld diameterSmall) - { - return (8.0 * density * (volumeRateOfFlow * volumeRateOfFlow) / (Pi_ * Pi_)) * (1.0 / pow(diameterSmall, 4.0) - 1.0 / pow(diameterLarge, 4)); - } - - /// - /// Fluids the speed pitot tube. - /// - /// The meter fluid density. - /// The height of fluid. - /// The air density. - /// - static ld fluidSpeed_pitotTube(const ld meterFluidDensity, const ld heightOfFluid, const ld airDensity) - { - return pow((2.0 * meterFluidDensity * _Ga_ * heightOfFluid) / airDensity, .5); - } - - /// - /// calculates the powers by multiplying Bernoulli's equation by the flow rate - /// - /// The density. - /// change in Height. - /// The flow rate. - /// Power in Watts - static ld power_bernoulliEquation(const ld density, const ld changeInHeight, const ld flowRate) - { - return density * _Ga_ * changeInHeight * flowRate; - } - - /// - /// The left ventricle of a resting adult's heart pumps blood at a fluidFlowRate of, - /// increasing its pressureToFluid by mm Hg, its speedChangeOfFluid in m/s, and its heightChangeOfFluid. - /// (All numbers are averaged over the entire heartbeat.) - /// Calculate the total power output of the left ventricle. Note that most of the power is used to increase blood pressure. - /// - /// The pressure to fluid. - /// The fluid density. - /// The speed change of fluid. - /// The height change of fluid. - /// The fluid flow rate. - /// power - static ld power_bernoulliEquation_ventricle(const ld pressureToFluid, const ld fluidDensity, const ld speedChangeOfFluid, const ld heightChangeOfFluid, const ld fluidFlowRate) - { - return (pressureToFluid + (.5 * (fluidDensity * pow(speedChangeOfFluid, 2))) + (fluidDensity *_Ga_ * heightChangeOfFluid)) * fluidFlowRate; - } - - /// - /// calculates the power of a force at a certain speed - /// - /// The force. - /// The velocity. - /// - static ld power(const ld force, const ld velocity) - { - return force * velocity; - } - - /// - /// calculates the power - /// - /// The flow rate. - /// The power. - /// power to provide flow - static ld powerQP(const ld flowRate, const ld power) - { - return flowRate * power; - } - - /// - /// A frequently quoted rule of thumb in aircraft design is that wings should - /// produce about 1000 N of lift per square meter of wing. (The fact that a - /// wing has a top and bottom surface does not double its area.) - /// At takeoff, an aircraft travels at 60.0 m/s, so that the air speed relative - /// to the bottom of the wing is 60.0 m/s. Given the sea level density of air to be - /// 1.29 kg/m3, how fast must it move over the upper surface to create the ideal lift? - /// - /// The density. - /// The force lift per square meter of wing. - /// The speed under wing. - /// wind speed over wing - static ld speedTopOfWing_bernoulliEquation(const ld density, const ld forceLiftPerSquareMeterOfWing, const ld speedUnderWing) - { - return sqrt(((2.0 * forceLiftPerSquareMeterOfWing) / (density)) + (speedUnderWing * speedUnderWing)); - } - - /// - /// calculates the pressure at a certain point along a sump pump. - /// - /// The pressure at pump level. - /// The density. - /// The height of point. - /// pressure - static ld sumpPumpPressureAtPoint(const ld outputPressure, const ld density, const ld HeightOfPoint) - { - return outputPressure + ((density * _Ga_) * (-HeightOfPoint)); - } - - /// - /// A pump hose goes over the foundation wall, it is a certain height from the pump and widens from diameter1 to diameter2. - /// It can pump water from a basement at a volumeFlowRate and starts at the pump with a outputPressure. this method will - /// calculate the pressure at the widened spot of the hose. - /// widened part of the hose? - /// - /// The output pressure where hose leaves pump. - /// The density of water on average is 1000kg/m^3. - /// The volume flow rate. - /// The diameter of the hose at start. - /// The diameter the hose changes to. - /// The height. - /// pressure in hose - static ld sumpPumpPressureChangeInPipeDiameter(const ld outputPressure, const ld density, const ld volumeFlowRate, const ld diameter1, const ld diameter2, const ld height) - { - return (outputPressure + ((8.0 * density * (volumeFlowRate * volumeFlowRate)) / (Pi_ * Pi_)) * ((1.0 / pow(diameter1, 4) - (1.0 / pow(diameter2, 4))))) + (density * _Ga_ * -height); - } - - /// - /// Calculates the retarding force due to the viscosity of the air layer between a cart and - /// a level air track given the following information - /// — air temperature, - /// — the carts velocity, - /// — its surface area, - /// — the thickness of the air layer - /// - /// The viscosity. - /// The velocity. - /// The cross sectional area. - /// The layer thickness. - /// retarding force - static ld retardingForce_airLayer(const ld viscosity, const ld velocity, const ld crossSectionalArea, const ld layerThickness) - { - return viscosity * (velocity * crossSectionalArea) / (layerThickness); - } - - /// - /// finds the coefficient of viscosity of a fluid. - /// - /// The force. - /// Length of the layer. - /// The velocity. - /// The cross sectional area. - /// viscosity coefficient - static ld viscosityCoefficient(const ld force, const ld layerLength, const ld velocity, const ld crossSectionalArea) - { - return (force * layerLength) / (velocity * crossSectionalArea); - } - - /// - /// calculates the viscosity of fluid in a pipe with laminar flow using - /// Perseus law for laminar flow solved for viscosity - /// - /// The radius of the pipe. - /// The resistance. - /// The length of pipe. - /// viscosity - static ld viscosity_laminarFlowPerseusLaw(const ld radiusPipe, const ld resistance, const ld lengthOfPipe) - { - return (Pi_ * pow(radiusPipe, 4.0) * resistance) / (8.0 * lengthOfPipe); - } - - /// - /// calculates the flow rate between two pressures - /// - /// The pressure1. - /// The pressure2. - /// The resistance. - /// flow rate - static ld pressureDifferentialFlowRate(const ld pressure1, const ld pressure2, const ld resistance) - { - return (pressure2 - pressure1) / resistance; - } - - /// - /// calculates the resistance using pressure change and flow rate - /// - /// The pressure start. - /// The pressure end. - /// The flow rate. - /// resistance - static ld resistance(const ld pressureStart, const ld pressureEnd, const ld flowRate) - { - return (pressureStart - pressureEnd) / flowRate; - } - - /// - /// calculates the resistances using Poiseuille's law. - /// - /// The viscosity coef. - /// The length of tube. - /// The radius of tube. - /// - static ld resistance_poiseuilleLawFor(const ld viscosityCoef, const ld lengthOfTube, const ld radiusOfTube) - { - return (8.0 * viscosityCoef * lengthOfTube) / (Pi_ * pow(radiusOfTube, 4.0)); - } - - /// - /// calculates the flow rate using Poiseuille's law for laminar flow - /// - /// pressure 1. - /// pressure 2. - /// The radius of tube. - /// The viscosity of the fluid in tube. - /// The length of tube. - /// flow rate - static ld laminarFlow_poiseuilleLawFor(const ld pressure1, const ld pressure2, const ld radiusOfTube, const ld viscosity, const ld lengthOfTube) - { - return ((pressure2 - pressure1) * Pi_ * pow(radiusOfTube, 4.0)) / (8.0 * viscosity * lengthOfTube); - } - - /// - /// calculates the pressures to produce a specified flow rate assuming laminar flow. - /// - /// The supply flow rate. - /// The length tube. - /// The radius tube. - /// The viscosity. - /// The gauge pressure point 1. - /// pressure point 2 - static ld pressureToProduceFlowRate_laminarFLow(const ld supplyFlowRate, const ld lengthTube, const ld radiusTube, const ld viscosity, const ld gaugePressurePoint1) - { - return ((8.0 * viscosity * lengthTube) / (Pi_ * pow(radiusTube, 4.0))) * supplyFlowRate + gaugePressurePoint1; - } - - /// - /// calculates the Reynolds Number(NR) for the flow in a tube.\n - /// if NR <= 2000 than flow is laminar.\n - /// if NR > 2000 && NR <= 3000 than flow is unstable.\n - /// if NR > 3000 flow is turbulent. - /// - /// The fluid density. - /// The fluid speed. - /// The viscosity. - /// The tube radius. - /// Reynolds Number, flow in a tube - static ld reynoldsNumber_flowInHorizontalTube(const ld fluidDensity, const ld fluidSpeed, const ld viscosity, const ld tubeRadius) - { - return (2.0 * fluidDensity * fluidSpeed * tubeRadius) / viscosity; - } - - /// - /// calculates the Reynolds number using flowrate solved for velocity subbed into the equation. - /// - /// The density. - /// The flow rate. - /// The radius. - /// The viscosity. - /// Reynolds number - static ld reynoldsNumber_usingFlowRate(const ld density, const ld flowRate, const ld radius, const ld viscosity) - { - return (2.0 * density * flowRate) / (Pi_ * radius * viscosity); - } - - /// - /// calculates the Reynolds Number(NR) for the flow in a vertical tube.\n - /// if NR <= 2000 than flow is laminar.\n - /// if NR > 2000 && NR <= 3000 than flow is unstable.\n - /// if NR > 3000 flow is turbulent. - /// - /// The fluid density. - /// The fluid height. - /// The viscosity. - /// The tube radius. - /// Reynolds Number, flow in a tube - static ld reynoldsNumber_flowInVerticalTube(const ld fluidDensity, const ld height, const ld viscosity, const ld tubeRadius) - { - return (2.0 * fluidDensity * (sqrt(2.0*_Ga_*height)) * tubeRadius) / viscosity; - } - - /// - /// calculates the Reynolds Number(NR) for a object in fluid - /// if NR <= 1 than flow around object can be laminar.\n - /// if NR > 1 && NR < 10 than flow is in transition to turbulent flow.\n - /// if NR > 10 && NR <= 10^6 than either laminar or turbulent or may oscillate between the two.\n - /// if NR > 10^6 than flow is entirely turbulent. - /// - /// The fluid density. - /// The viscosity of fluid. - /// The objects speed. - /// Length of the object; a spheres diameter for example. - /// Reynolds Number, object in fluid - static ld reynoldsNumber_objectInFluid(const ld fluidDensity, const ld viscosity, const ld objectSpeed, const ld objectLength) - { - return (fluidDensity * objectSpeed * objectLength) / viscosity; - } - - /// - /// calculates the viscous drag of a small sphere - /// - /// The radius. - /// The viscosity. - /// The velocity. - /// - static ld viscous_drag_sphereSM(const ld radius, const ld viscosity, const ld velocity) - { - return 6.0 * Pi_ * radius * viscosity * velocity; - } - - /// - /// calculates the net force from the change in pressure and the area of the cross sectional - /// - /// The pressure change. - /// The cross sectional area. - /// net force - static ld forceNetFromPressureDifference(const ld pressureChange, const ld crossSectionalArea) - { - return pressureChange * crossSectionalArea; - } - - /// - /// calculates the pressure change. - /// - /// The start pressure. - /// The end pressure. - /// difference in pressure - static ld pressureChange(const ld pressureStart, const ld pressureEnd) - { - return pressureEnd - pressureStart; - } - - /// - /// calculates the pressure being supplied with the change in flow rate - /// - /// The starting pressure. - /// The starting flow rate. - /// The changed flow rate. - /// the pressure related to the changed flow rate - static ld changedPressure_byFlowRateChange_withConstantResistance(const ld startingPressure, const ld startingFlowRate, const ld changedFlowRate) - { - return (startingPressure * changedFlowRate) / startingFlowRate; - } - - /// - /// Pressures the difference factor by decreased radius. - /// - /// The percent change. - /// - static ld pressureDifferenceFactor_byChangedRadius(const ld percentChange) - { - return 1.0 / (pow(percentChange / 100.0, 4.0)); - } - - /// - /// calculates the percent change in the radius when there is a certain percent - /// change in laminar flow in a tube. - /// - /// The percent change in laminar flow. - /// - static ld radiusChangePercent_byPercentChangeInLaminarFlowInTube(const ld percentChangeInLaminarFlow) - { - return (1.0 - pow(1.0 - (percentChangeInLaminarFlow / 100.0), 1.0/4.0)) * 100; - } - - /// - /// calculates the terminals velocity of a falling spherical particle in fluid. - /// - /// The radius. - /// The viscosity of fluid. - /// The density of the sphere. - /// The density of the fluid. - /// velocity at terminal speed - static ld terminalSpeed_sphericalParticleFallingInFluid(const ld radius, const ld viscosity, const ld densitySphere, const ld densityFluid) - { - return ((2.0 * pow(radius, 2.0) * _Ga_) / (9.0 * viscosity)) * (densitySphere - densityFluid); - } - - /// - /// Calculates the viscosity of a spherical particle falling in fluid. - /// - /// The radius. - /// The velocity. - /// The density sphere. - /// The density fluid. - /// viscosity - static ld viscosity_sphericalParticleFallingInFluid(const ld radius, const ld velocity, const ld densitySphere, const ld densityFluid) - { - return ((2.0 * pow(radius, 2.0) * _Ga_) / (9.0 * velocity)) * (densitySphere - densityFluid); - } - - /// - /// calculates the terminal velocity. - /// - /// The mass of falling object. - /// The cross sectional area facing the drag force. - /// The density of the fluid or air. - /// terminal velocity - static ld terminalVelocity(const ld mass, const ld crossSectionalArea, const ld density) - { - return sqrt((2.0 * mass * _Ga_) / (density * crossSectionalArea)); - } - - /// - /// calculates the gauge pressure at end to vertical pipe shooting fluid up in air. - /// - /// Height of the fluid. - /// The viscosity. - /// The length of pipe. - /// The pipe radius. - /// gauge pressure - static ld gaugePressure_atEntranceToVerticalPipeShootingFluid(const ld fluidHeight, const ld viscosity, const ld lengthOfPipe, const ld pipeRadius) - { - return (8.0 * sqrt((2.0 * _Ga_ * fluidHeight) * viscosity * lengthOfPipe)) / pipeRadius; - } - - /// - /// calculates the gauge pressure caused by gravity and fluid in a vertical pipe. 90 degrees up - /// - /// The viscosity. - /// The length of pipe. - /// - static ld gaugePressureByFluidInVerticalPipe(const ld viscosity, const ld lengthOfPipe) - { - return viscosity * _Ga_ * lengthOfPipe; - } - - /// - /// Calculates the critical flow rate - /// - /// The radius. - /// The viscosity. - /// The Reynolds number. - /// The density. - /// flow rate - static ld criticalFLowRate(const ld radius, const ld viscosity, const ld reynoldsNumber, const ld density) - { - return (Pi_ * radius * reynoldsNumber) / (2.0 * density); - } - - /// - /// calculates the Roots mean square distance. - /// - /// The diffusion constant. - /// The time. - /// root mean square - static ld rootMeanSquareDistance(const ld diffusionConstant, const ld time) - { - return sqrt(2.0 * diffusionConstant * time); - } - - /// - /// calculates the supply pressure of a hose laying horizontal - /// - /// The viscosity. - /// The length hose. - /// The volume flow rate. - /// The radius. - /// The pressure. - /// pressure supplied by faucet - static ld pressureHoseHorizontal_poiseuilleLlawWithFlowRate(const ld viscosity, const ld lengthHose, const ld volumeFlowRate, const ld radius, const ld pressureAir) - { - return ((8.0 * viscosity * lengthHose * volumeFlowRate) / (Pi_ * radius)) + pressureAir; - } - - /// - /// Calculates the average time using the root mean square and the diffusion constant - /// - /// The diffusion constant. - /// The average distance RMS. - /// time in seconds - static ld time_rms(const ld diffusionConstant, const ld averageDistanceRMS) - { - return pow(averageDistanceRMS, 2) / (2.0 * diffusionConstant); - } - - /// - /// calculates the time it takes a particle to diffuse through a certain volume and area - /// - /// The volume. - /// The area. - /// The diffusion constant. - /// time in seconds - static ld time_diffusion(const ld volume, const ld area, const ld diffusionConstant) - { - return (volume * volume) / (2.0 * diffusionConstant * (area * area)); - } - - - ~FluidDynamics() - { - delete _fluidDynamicPtr; - } - -}; -#endif //PHYSICSFORMULA_FLUIDDYNAMICS_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_FLUIDDYNAMICS_H +#define PHYSICSFORMULA_FLUIDDYNAMICS_H +/** + * @class FluidDynamics + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @date 12/17/2020 + */ +#include +#include +using namespace std; +typedef long double ld; +#define _Ga_ 9.81 // acceleration due to gravity +static int fluidDynamic_objectCount = 0; + +static struct FlowRateConversions +{ + static ld litersPerSecond_to_cubicMetersPerSecond(const ld lps) + { + return lps * .001; // m^3/sec + } + static ld litersPerSecond_to_cubicMetersPerMin(const ld lps) + { + return lps * .06; // m^3/min + } + + static ld literMin_to_cubicCentimeterSecond(const ld ltrMin) + { + return ltrMin * 16.6667; // cm^3/s + } + static ld cubicCentimeterSecond_to_literMin(const ld ccms) + { + return ccms / 16.6667; // L/min + } + static ld literMin_to_cubicMeterSecond(const ld ltrMin) + { + return ltrMin * 1.6667 * pow(10.0, -5.0); // m^3/s + } + static ld cubicMeterSecond_to_literMin(const ld cms) + { + return cms / 1.6667 * pow(10.0, -5.0); // L/min + } + + +}flow_rate_converter; + +static struct ViscosityCoefficients +{ + const ld air_0C = 0.0171; //mPa*s + const ld air_20C = 0.0181; //mPa*s + const ld air_40C = 0.0190; //mPa*s + const ld air_100C = 0.00974; //mPa*s + const ld ammonia_20C = 0.00974; // mPa*s + const ld carbonDioxide_20C = 0.0147; //mPa*s + const ld helium_20C = 0.0196; // mPa*s + const ld hydrogen_0C = .0090; // mPa*s + const ld mercury_20C = 0.0450; // mPa*s + const ld oxygen_20C = .0203; // mPa*s + const ld steam_100C = .0130; // mPa*s + const ld water_0C = 1.792; // mPa*s + const ld water_20C = 1.002; // mPa*s + const ld water_37C = 0.6947; // mPa*s + const ld water_40C = 0.653; // mPa*s + const ld water_100C = 0.282; // mPa*s + const ld wholeBlood_20C = 3.015; // mPa*s + const ld wholeBlood_37C = 2.084; // mPa*s + const ld bloodPlasma_20C = 1.810; // mPa*s + const ld bloodPlasma_37C = 1.257; // mPa*s + const ld ethylAlcohol_20C = 1.20; // mPa*s + const ld methanol_20C = 0.584; // mPa*s + const ld oil_heavyMachine_20C = 660.0; // mPa*s + const ld oil_motorSAE10_30C = 200.0; // mPa*s + const ld oil_olive_20C = 138.0; // mPa*s + const ld glycerin_20C = 1500; // mPa*s + ld honey_20C = 2000; // mPa*s + /// +/// Sets the honey_20C viscosity which can be between 2000 and 10000. +/// +/// The argument. + void setHoney(ld n) + { + if(n >=2000 && n <= 10000) + { + honey_20C = n; + } + else + honey_20C = 2000; + + } + ld mapleSyrup_20C = 2000; //mPa*s + /// + /// Sets the maple syrup between 2000 and 3000. + /// + /// The n. + void setMapleSyrup(ld n) + { + if (n >= 2000 && n <= 3000) + { + mapleSyrup_20C = n; + } + else + mapleSyrup_20C = 2000; + } + const ld milk_20C = 3.0; // //mPa*s + const ld oil_corn_20C = 65.0; //mPa*s +}viscosity_coefficients; + +static struct DiffusionConstants +{ + const ld HYDROGEN_AIR = 6.4 * pow(10.0, -5.0); // .000064 + const ld OXYGEN_AIR = 1.8 * pow(10.0, -5.0); //.000018 + const ld OXYGEN_WATER = 1.0 * pow(10.0, -9.0); // .000000001 + const ld GLUCOSE_WATER = 6.7 * pow(10.0, -10.0); // .00000000067 + const ld HEMOGLOBIN_WATER = 6.9 * pow(10.0, -11.0); //.000000000069 + const ld DNA_WATER = 1.3 * pow(10.0, -12.0); // .0000000000013 +}diffusion_constants; + +class FluidDynamics +{ +private: + static void countIncrease() { fluidDynamic_objectCount += 1; } + static void countDecrease() { fluidDynamic_objectCount -= 1; } +public: + FluidDynamics* _fluidDynamicPtr; + + FluidDynamics() + { + _fluidDynamicPtr = nullptr; + countIncrease(); + } + + /** + * @brief copy constructor + */ + FluidDynamics(const FluidDynamics& t) + { + _fluidDynamicPtr = t._fluidDynamicPtr; + countIncrease(); + } + /** + * #brief move constructor + */ + FluidDynamics(FluidDynamics&& t) noexcept + { + _fluidDynamicPtr = t._fluidDynamicPtr; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + FluidDynamics& operator=(FluidDynamics&& t) noexcept + { + if (this != &t) + { + _fluidDynamicPtr = t._fluidDynamicPtr; + countIncrease(); + } + return *this; + } + + static void show_objectCount() { std::cout << "\n fluid dynamic object count: " << fluidDynamic_objectCount << std::endl; } + static int get_objectCount() { return fluidDynamic_objectCount; } + + /// + /// calculates the volumes of a cylinder. + /// + /// The radius is used to find the cross sectional area of a cylinder. + /// The distance. + /// volume + static ld volumeCylinder(const ld radius, const ld distance) + { + return Pi_ * (radius * radius) * distance; + } + + /// + /// finds the flow rate of fluid in a cylinder. + /// + /// The radius. + /// The distance. + /// The time. + /// flow rate (Q) + static ld flowRateCylinder_radius(const ld radius, const ld distance, const ld time) + { + return Pi_ * (radius * radius) * distance * time; + } + + /// + /// calculates the flow rate of a cylinder using the diameter. + /// + /// The diameter. + /// The velocity. + /// + static ld flowRateCylinder_diameter(const ld diameter, const ld velocity) + { + return (Pi_ * (diameter * diameter) / 4.0) * velocity; + } + + /// + /// calculates the flow rate. + /// + /// The volume. + /// The time. + /// flow rate + static ld flowRate(const ld volume, const ld time) + { + return volume / time; + } + + /// + /// calculates the volume of flow rate. + /// + /// The cross sectional area. + /// The average velocity. + /// volume flow rate + static ld volumeFlowRate(const ld crossSectionalArea, const ld avgVelocity) + { + return crossSectionalArea * avgVelocity; + } + + /// + /// finds the average velocity. + /// + /// The volume flow rate. + /// The area. + /// average velocity + static ld averageVelocity(const ld volumeFlowRate, const ld area) + { + return volumeFlowRate / area; + } + + /// + /// average velocity in tube or aorta with given radius and flow. + /// + /// The volume flow rate. + /// The radius. + /// average velocity + static ld averageVelocity_tubeLike(const ld volumeFlowRate, const ld radius) + { + return volumeFlowRate / (Pi_ * (radius * radius)); + } + + /// + /// calculates the volume from flow rate and time + /// + /// The flow rate. + /// The time. + /// volume + static ld volume(const ld flowRate, const ld time) + { + return flowRate * time; + } + + /// + /// calculates the time + /// + /// The flow rate. + /// The volume. + /// time + static ld time(const ld flowRate, const ld volume) + { + return volume / flowRate; + } + + /// + /// finds the velocity using the equation of continuity solved for + /// velocity2. + /// + /// The velocity of flow through the area1. + /// The cross-sectional area1. + /// The cross-sectional area2. + /// velocity through area2 + static ld velocity2_eqOfContinuity(const ld velocity1, const ld area1, const ld area2) + { + return (area1 / area2) * velocity1; + } + + /// + /// Flows the rate tube like. + /// + /// The radius. + /// The average velocity. + /// + static ld flowRate_tubeLike(const ld radius, const ld avgVelocity) + { + return Pi_ * (radius * radius) * avgVelocity; + } + + /// + /// calculates the total volume to flow over a period of time. + /// + /// The radius. + /// The average velocity. + /// The time. + /// volume total + static ld volumeTotal(const ld radius, const ld avgVelocity, const ld time) + { + return Pi_ * (radius * radius) * avgVelocity * time; + } + + /// + /// finds the factor the velocity is reduced by branching. + /// + /// The main radius. + /// The branch radius. + /// The number of smaller branches. + /// factor of velocity reduction + static ld reducedVelocity_branchingArteries(const ld mainRadius, const ld branchRadius, const ld branches) + { + return (1.0 * mainRadius) / (branches * branchRadius); + } + + /// + /// Average velocity of blood flow through ad capillary. + /// + /// The flow rate. + /// The capillary vessels. + /// The diameter each. + /// average blood flow + static ld averageVelocityBloodFlowThroughCapillary_diameter(const ld flowRate, const ld capillaryVessels, const ld diameterEach) + { + return (4.0 * flowRate) / (capillaryVessels * Pi_ * (diameterEach * diameterEach)); + } + + /// + /// Averages the velocity blood flow through capillary with the radius. + /// + /// The flow rate. + /// The radius. + /// + static ld averageVelocityBloodFlowThroughCapillary_radius(const ld flowRate, const ld radius) + { + return flowRate / (Pi_ * (radius * radius)); + } + + /// + /// calculates the total number of capillaries. + /// + /// The area. + /// The diameter. + /// capillaries + static ld capillaryFlowTotal_diameter(const ld area, const ld diameter) + { + return (4.0 * area) / (Pi_ * (diameter * diameter)); + } + + /// + /// calculates the total number of Capillaries with the radius. + /// + /// The flow. + /// The radius. + /// + static ld capillaryFlowTotal_radius(const ld flow, const ld radius) + { + return flow / (Pi_ * (radius * radius)); + } + + /// + /// calculates the total flow rate + /// + /// The number of capillaries. + /// The cross sectional area. + /// The average velocity. + /// total flow rate + static ld totalFlowRate_capillary(const ld capillaries, const ld crossSectionalArea, const ld avgVelocity) + { + return capillaries * crossSectionalArea * avgVelocity; + } + + /// + /// Calculates the air flow through a circular duct into a rectangular room. + /// + /// The rooms volume = L * W * H. + /// The radius duct or r = diameter/2. + /// The time in seconds. + /// average speed of air flow out of duct + static ld airFlowThroughCircularDuctIntoRectangularRoom(const ld roomVolume, const ld radiusDuct, const ld time) + { + return roomVolume / (Pi_ * (radiusDuct * radiusDuct) * time); + } + + /// + /// calculates the inside diameters of a hose nozzle. + /// + /// The flow rate. + /// The velocity. + /// diameter + static ld diameterStream(const ld flowRate, const ld velocity) + { + return 2.0 * sqrt((flowRate) / (Pi_ * velocity)); + } + + /// + /// calculates the diameter that a pipe would need to be at minimum to + /// meet the requirements for the specified values + /// + /// The density fluid. + /// The flow rate fluid. + /// The viscosity fluid. + /// The Reynolds number. + /// + static ld diameterPipeForSpecifiedValues(const ld densityFluid, const ld flowRateFluid, const ld viscosityFluid, const ld reynoldsNumber) + { + return (4.0 * densityFluid * flowRateFluid) / (Pi_ * reynoldsNumber * viscosityFluid); + } + + /// + /// uses Bernoulli's equation to calculate the amount of work. + /// + /// The mass. + /// The velocity final. + /// The velocity initial. + /// work new + static ld workNet_BernoulliEquation(const ld mass, const ld velocityFinal, const ld velocityInitial = 0.0) + { + return (.5 * mass * (velocityFinal * velocityFinal)) - (.5 * mass * (velocityInitial * velocityInitial)); + } + + /// + /// calculates the final Velocity using the Bernoulli equation. + /// + /// The velocity initial. + /// Height of the change in. + /// final velocity + static ld velocityFinal_bernoulliEquation(const ld velocityInitial, const ld changeInHeight) + { + return sqrt(pow(velocityInitial, 2.0) + (2.0 * _Ga_ * changeInHeight)); + } + + /// + /// calculates the final pressure. + /// + /// The initial pressure. + /// The density. + /// The initial velocity + /// The final velocity final. + /// + static ld pressureFinal_bernoulliEquationConstantAltitude(const ld pressureInitial, const ld density, const ld velocityInitial, const ld velocityFinal) + { + return pressureInitial + .5 * density * ((velocityInitial * velocityInitial) - (velocityFinal * velocityFinal)); + } + + /// + /// Calculates the maximums height water from a hose can reach. + /// + /// The velocity. + /// height + static ld maxHeightWaterFromHose(const ld velocity) + { + return (velocity * velocity) / (2.0 * _Ga_); + } + + /// + /// Calculates the maximum height above a nozzle the water can rise? + /// (The actual height will be significantly smaller due to air resistance.) + /// + /// The volume rate of flow. + /// The nozzle diameter. + /// max height + static ld maxHeightAboveNozzleLiquidRise(const ld volumeROF, const ld nozzleDiameter) + { + return (8.0 * pow(volumeROF, 2.0)) / (pow(Pi_, 2.0) * _Ga_ * pow(nozzleDiameter, 4.0)); + } + + /// + /// Calculates approximately the force due to the Bernoulli effect on a roof + /// having a specified area. F = 1/2 * p * v^2 * A + /// + /// The density of the air. + /// The velocity of the wind. + /// The area of the roof. + /// Force on roof + static ld force_bernoulliEquationConstantAltitude(const ld density, const ld velocity, const ld area) + { + return .5 * density * (velocity * velocity) * area; + } + + /// + /// Calculate the approximate force on a area of sail, given the + /// horizontal velocityHigh of the wind is faster and parallel to its front surface + /// while a velocitySlow wind runs along its back surface. + /// + /// The density. + /// The velocity high. + /// The velocity low. + /// The area. + /// force of wind + static ld force_bernoulliEquationConstantAltitude(const ld density, const ld velocityHigh, const ld velocityLow, const ld area) + { + return .5 * density * ((velocityHigh * velocityHigh) - (velocityLow * velocityLow)) * area; + } + + /// + /// calculates the pressure drop due to the Bernoulli effect as water goes into a + /// smaller diameter nozzle from a larger diameter hose while carrying a + /// specified volumeFlowRate. + /// + /// The density. + /// The volume rate of flow. + /// The larger diameter. + /// The smaller diameter. + /// drop in pressure + static ld pressureDrop_bernoulliEquationConstantAlt(const ld density, const ld volumeRateOfFlow, const ld diameterLarge, const ld diameterSmall) + { + return (8.0 * density * (volumeRateOfFlow * volumeRateOfFlow) / (Pi_ * Pi_)) * (1.0 / pow(diameterSmall, 4.0) - 1.0 / pow(diameterLarge, 4)); + } + + /// + /// Fluids the speed pitot tube. + /// + /// The meter fluid density. + /// The height of fluid. + /// The air density. + /// + static ld fluidSpeed_pitotTube(const ld meterFluidDensity, const ld heightOfFluid, const ld airDensity) + { + return pow((2.0 * meterFluidDensity * _Ga_ * heightOfFluid) / airDensity, .5); + } + + /// + /// calculates the powers by multiplying Bernoulli's equation by the flow rate + /// + /// The density. + /// change in Height. + /// The flow rate. + /// Power in Watts + static ld power_bernoulliEquation(const ld density, const ld changeInHeight, const ld flowRate) + { + return density * _Ga_ * changeInHeight * flowRate; + } + + /// + /// The left ventricle of a resting adult's heart pumps blood at a fluidFlowRate of, + /// increasing its pressureToFluid by mm Hg, its speedChangeOfFluid in m/s, and its heightChangeOfFluid. + /// (All numbers are averaged over the entire heartbeat.) + /// Calculate the total power output of the left ventricle. Note that most of the power is used to increase blood pressure. + /// + /// The pressure to fluid. + /// The fluid density. + /// The speed change of fluid. + /// The height change of fluid. + /// The fluid flow rate. + /// power + static ld power_bernoulliEquation_ventricle(const ld pressureToFluid, const ld fluidDensity, const ld speedChangeOfFluid, const ld heightChangeOfFluid, const ld fluidFlowRate) + { + return (pressureToFluid + (.5 * (fluidDensity * pow(speedChangeOfFluid, 2))) + (fluidDensity *_Ga_ * heightChangeOfFluid)) * fluidFlowRate; + } + + /// + /// calculates the power of a force at a certain speed + /// + /// The force. + /// The velocity. + /// + static ld power(const ld force, const ld velocity) + { + return force * velocity; + } + + /// + /// calculates the power + /// + /// The flow rate. + /// The power. + /// power to provide flow + static ld powerQP(const ld flowRate, const ld power) + { + return flowRate * power; + } + + /// + /// A frequently quoted rule of thumb in aircraft design is that wings should + /// produce about 1000 N of lift per square meter of wing. (The fact that a + /// wing has a top and bottom surface does not double its area.) + /// At takeoff, an aircraft travels at 60.0 m/s, so that the air speed relative + /// to the bottom of the wing is 60.0 m/s. Given the sea level density of air to be + /// 1.29 kg/m3, how fast must it move over the upper surface to create the ideal lift? + /// + /// The density. + /// The force lift per square meter of wing. + /// The speed under wing. + /// wind speed over wing + static ld speedTopOfWing_bernoulliEquation(const ld density, const ld forceLiftPerSquareMeterOfWing, const ld speedUnderWing) + { + return sqrt(((2.0 * forceLiftPerSquareMeterOfWing) / (density)) + (speedUnderWing * speedUnderWing)); + } + + /// + /// calculates the pressure at a certain point along a sump pump. + /// + /// The pressure at pump level. + /// The density. + /// The height of point. + /// pressure + static ld sumpPumpPressureAtPoint(const ld outputPressure, const ld density, const ld HeightOfPoint) + { + return outputPressure + ((density * _Ga_) * (-HeightOfPoint)); + } + + /// + /// A pump hose goes over the foundation wall, it is a certain height from the pump and widens from diameter1 to diameter2. + /// It can pump water from a basement at a volumeFlowRate and starts at the pump with a outputPressure. this method will + /// calculate the pressure at the widened spot of the hose. + /// widened part of the hose? + /// + /// The output pressure where hose leaves pump. + /// The density of water on average is 1000kg/m^3. + /// The volume flow rate. + /// The diameter of the hose at start. + /// The diameter the hose changes to. + /// The height. + /// pressure in hose + static ld sumpPumpPressureChangeInPipeDiameter(const ld outputPressure, const ld density, const ld volumeFlowRate, const ld diameter1, const ld diameter2, const ld height) + { + return (outputPressure + ((8.0 * density * (volumeFlowRate * volumeFlowRate)) / (Pi_ * Pi_)) * ((1.0 / pow(diameter1, 4) - (1.0 / pow(diameter2, 4))))) + (density * _Ga_ * -height); + } + + /// + /// Calculates the retarding force due to the viscosity of the air layer between a cart and + /// a level air track given the following information + /// — air temperature, + /// — the carts velocity, + /// — its surface area, + /// — the thickness of the air layer + /// + /// The viscosity. + /// The velocity. + /// The cross sectional area. + /// The layer thickness. + /// retarding force + static ld retardingForce_airLayer(const ld viscosity, const ld velocity, const ld crossSectionalArea, const ld layerThickness) + { + return viscosity * (velocity * crossSectionalArea) / (layerThickness); + } + + /// + /// finds the coefficient of viscosity of a fluid. + /// + /// The force. + /// Length of the layer. + /// The velocity. + /// The cross sectional area. + /// viscosity coefficient + static ld viscosityCoefficient(const ld force, const ld layerLength, const ld velocity, const ld crossSectionalArea) + { + return (force * layerLength) / (velocity * crossSectionalArea); + } + + /// + /// calculates the viscosity of fluid in a pipe with laminar flow using + /// Perseus law for laminar flow solved for viscosity + /// + /// The radius of the pipe. + /// The resistance. + /// The length of pipe. + /// viscosity + static ld viscosity_laminarFlowPerseusLaw(const ld radiusPipe, const ld resistance, const ld lengthOfPipe) + { + return (Pi_ * pow(radiusPipe, 4.0) * resistance) / (8.0 * lengthOfPipe); + } + + /// + /// calculates the flow rate between two pressures + /// + /// The pressure1. + /// The pressure2. + /// The resistance. + /// flow rate + static ld pressureDifferentialFlowRate(const ld pressure1, const ld pressure2, const ld resistance) + { + return (pressure2 - pressure1) / resistance; + } + + /// + /// calculates the resistance using pressure change and flow rate + /// + /// The pressure start. + /// The pressure end. + /// The flow rate. + /// resistance + static ld resistance(const ld pressureStart, const ld pressureEnd, const ld flowRate) + { + return (pressureStart - pressureEnd) / flowRate; + } + + /// + /// calculates the resistances using Poiseuille's law. + /// + /// The viscosity coef. + /// The length of tube. + /// The radius of tube. + /// + static ld resistance_poiseuilleLawFor(const ld viscosityCoef, const ld lengthOfTube, const ld radiusOfTube) + { + return (8.0 * viscosityCoef * lengthOfTube) / (Pi_ * pow(radiusOfTube, 4.0)); + } + + /// + /// calculates the flow rate using Poiseuille's law for laminar flow + /// + /// pressure 1. + /// pressure 2. + /// The radius of tube. + /// The viscosity of the fluid in tube. + /// The length of tube. + /// flow rate + static ld laminarFlow_poiseuilleLawFor(const ld pressure1, const ld pressure2, const ld radiusOfTube, const ld viscosity, const ld lengthOfTube) + { + return ((pressure2 - pressure1) * Pi_ * pow(radiusOfTube, 4.0)) / (8.0 * viscosity * lengthOfTube); + } + + /// + /// calculates the pressures to produce a specified flow rate assuming laminar flow. + /// + /// The supply flow rate. + /// The length tube. + /// The radius tube. + /// The viscosity. + /// The gauge pressure point 1. + /// pressure point 2 + static ld pressureToProduceFlowRate_laminarFLow(const ld supplyFlowRate, const ld lengthTube, const ld radiusTube, const ld viscosity, const ld gaugePressurePoint1) + { + return ((8.0 * viscosity * lengthTube) / (Pi_ * pow(radiusTube, 4.0))) * supplyFlowRate + gaugePressurePoint1; + } + + /// + /// calculates the Reynolds Number(NR) for the flow in a tube.\n + /// if NR <= 2000 than flow is laminar.\n + /// if NR > 2000 && NR <= 3000 than flow is unstable.\n + /// if NR > 3000 flow is turbulent. + /// + /// The fluid density. + /// The fluid speed. + /// The viscosity. + /// The tube radius. + /// Reynolds Number, flow in a tube + static ld reynoldsNumber_flowInHorizontalTube(const ld fluidDensity, const ld fluidSpeed, const ld viscosity, const ld tubeRadius) + { + return (2.0 * fluidDensity * fluidSpeed * tubeRadius) / viscosity; + } + + /// + /// calculates the Reynolds number using flowrate solved for velocity subbed into the equation. + /// + /// The density. + /// The flow rate. + /// The radius. + /// The viscosity. + /// Reynolds number + static ld reynoldsNumber_usingFlowRate(const ld density, const ld flowRate, const ld radius, const ld viscosity) + { + return (2.0 * density * flowRate) / (Pi_ * radius * viscosity); + } + + /// + /// calculates the Reynolds Number(NR) for the flow in a vertical tube.\n + /// if NR <= 2000 than flow is laminar.\n + /// if NR > 2000 && NR <= 3000 than flow is unstable.\n + /// if NR > 3000 flow is turbulent. + /// + /// The fluid density. + /// The fluid height. + /// The viscosity. + /// The tube radius. + /// Reynolds Number, flow in a tube + static ld reynoldsNumber_flowInVerticalTube(const ld fluidDensity, const ld height, const ld viscosity, const ld tubeRadius) + { + return (2.0 * fluidDensity * (sqrt(2.0*_Ga_*height)) * tubeRadius) / viscosity; + } + + /// + /// calculates the Reynolds Number(NR) for a object in fluid + /// if NR <= 1 than flow around object can be laminar.\n + /// if NR > 1 && NR < 10 than flow is in transition to turbulent flow.\n + /// if NR > 10 && NR <= 10^6 than either laminar or turbulent or may oscillate between the two.\n + /// if NR > 10^6 than flow is entirely turbulent. + /// + /// The fluid density. + /// The viscosity of fluid. + /// The objects speed. + /// Length of the object; a spheres diameter for example. + /// Reynolds Number, object in fluid + static ld reynoldsNumber_objectInFluid(const ld fluidDensity, const ld viscosity, const ld objectSpeed, const ld objectLength) + { + return (fluidDensity * objectSpeed * objectLength) / viscosity; + } + + /// + /// calculates the viscous drag of a small sphere + /// + /// The radius. + /// The viscosity. + /// The velocity. + /// + static ld viscous_drag_sphereSM(const ld radius, const ld viscosity, const ld velocity) + { + return 6.0 * Pi_ * radius * viscosity * velocity; + } + + /// + /// calculates the net force from the change in pressure and the area of the cross sectional + /// + /// The pressure change. + /// The cross sectional area. + /// net force + static ld forceNetFromPressureDifference(const ld pressureChange, const ld crossSectionalArea) + { + return pressureChange * crossSectionalArea; + } + + /// + /// calculates the pressure change. + /// + /// The start pressure. + /// The end pressure. + /// difference in pressure + static ld pressureChange(const ld pressureStart, const ld pressureEnd) + { + return pressureEnd - pressureStart; + } + + /// + /// calculates the pressure being supplied with the change in flow rate + /// + /// The starting pressure. + /// The starting flow rate. + /// The changed flow rate. + /// the pressure related to the changed flow rate + static ld changedPressure_byFlowRateChange_withConstantResistance(const ld startingPressure, const ld startingFlowRate, const ld changedFlowRate) + { + return (startingPressure * changedFlowRate) / startingFlowRate; + } + + /// + /// Pressures the difference factor by decreased radius. + /// + /// The percent change. + /// + static ld pressureDifferenceFactor_byChangedRadius(const ld percentChange) + { + return 1.0 / (pow(percentChange / 100.0, 4.0)); + } + + /// + /// calculates the percent change in the radius when there is a certain percent + /// change in laminar flow in a tube. + /// + /// The percent change in laminar flow. + /// + static ld radiusChangePercent_byPercentChangeInLaminarFlowInTube(const ld percentChangeInLaminarFlow) + { + return (1.0 - pow(1.0 - (percentChangeInLaminarFlow / 100.0), 1.0/4.0)) * 100; + } + + /// + /// calculates the terminals velocity of a falling spherical particle in fluid. + /// + /// The radius. + /// The viscosity of fluid. + /// The density of the sphere. + /// The density of the fluid. + /// velocity at terminal speed + static ld terminalSpeed_sphericalParticleFallingInFluid(const ld radius, const ld viscosity, const ld densitySphere, const ld densityFluid) + { + return ((2.0 * pow(radius, 2.0) * _Ga_) / (9.0 * viscosity)) * (densitySphere - densityFluid); + } + + /// + /// Calculates the viscosity of a spherical particle falling in fluid. + /// + /// The radius. + /// The velocity. + /// The density sphere. + /// The density fluid. + /// viscosity + static ld viscosity_sphericalParticleFallingInFluid(const ld radius, const ld velocity, const ld densitySphere, const ld densityFluid) + { + return ((2.0 * pow(radius, 2.0) * _Ga_) / (9.0 * velocity)) * (densitySphere - densityFluid); + } + + /// + /// calculates the terminal velocity. + /// + /// The mass of falling object. + /// The cross sectional area facing the drag force. + /// The density of the fluid or air. + /// terminal velocity + static ld terminalVelocity(const ld mass, const ld crossSectionalArea, const ld density) + { + return sqrt((2.0 * mass * _Ga_) / (density * crossSectionalArea)); + } + + /// + /// calculates the gauge pressure at end to vertical pipe shooting fluid up in air. + /// + /// Height of the fluid. + /// The viscosity. + /// The length of pipe. + /// The pipe radius. + /// gauge pressure + static ld gaugePressure_atEntranceToVerticalPipeShootingFluid(const ld fluidHeight, const ld viscosity, const ld lengthOfPipe, const ld pipeRadius) + { + return (8.0 * sqrt((2.0 * _Ga_ * fluidHeight) * viscosity * lengthOfPipe)) / pipeRadius; + } + + /// + /// calculates the gauge pressure caused by gravity and fluid in a vertical pipe. 90 degrees up + /// + /// The viscosity. + /// The length of pipe. + /// + static ld gaugePressureByFluidInVerticalPipe(const ld viscosity, const ld lengthOfPipe) + { + return viscosity * _Ga_ * lengthOfPipe; + } + + /// + /// Calculates the critical flow rate + /// + /// The radius. + /// The viscosity. + /// The Reynolds number. + /// The density. + /// flow rate + static ld criticalFLowRate(const ld radius, const ld viscosity, const ld reynoldsNumber, const ld density) + { + return (Pi_ * radius * reynoldsNumber) / (2.0 * density); + } + + /// + /// calculates the Roots mean square distance. + /// + /// The diffusion constant. + /// The time. + /// root mean square + static ld rootMeanSquareDistance(const ld diffusionConstant, const ld time) + { + return sqrt(2.0 * diffusionConstant * time); + } + + /// + /// calculates the supply pressure of a hose laying horizontal + /// + /// The viscosity. + /// The length hose. + /// The volume flow rate. + /// The radius. + /// The pressure. + /// pressure supplied by faucet + static ld pressureHoseHorizontal_poiseuilleLlawWithFlowRate(const ld viscosity, const ld lengthHose, const ld volumeFlowRate, const ld radius, const ld pressureAir) + { + return ((8.0 * viscosity * lengthHose * volumeFlowRate) / (Pi_ * radius)) + pressureAir; + } + + /// + /// Calculates the average time using the root mean square and the diffusion constant + /// + /// The diffusion constant. + /// The average distance RMS. + /// time in seconds + static ld time_rms(const ld diffusionConstant, const ld averageDistanceRMS) + { + return pow(averageDistanceRMS, 2) / (2.0 * diffusionConstant); + } + + /// + /// calculates the time it takes a particle to diffuse through a certain volume and area + /// + /// The volume. + /// The area. + /// The diffusion constant. + /// time in seconds + static ld time_diffusion(const ld volume, const ld area, const ld diffusionConstant) + { + return (volume * volume) / (2.0 * diffusionConstant * (area * area)); + } + + + ~FluidDynamics() + { + delete _fluidDynamicPtr; + } + +}; +#endif //PHYSICSFORMULA_FLUIDDYNAMICS_H diff --git a/FluidStatics.h b/FluidStatics.h index 1da20da..92dc1b5 100644 --- a/FluidStatics.h +++ b/FluidStatics.h @@ -1,754 +1,754 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_FLUIDSTATICS_H -#define PHYSICSFORMULA_FLUIDSTATICS_H -/** - * @class FluidStatics - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @date 10/15/2020 - */ -#include - -#include "Friction.h" - -typedef long double ld; -static int fluidStatics_objectCount = 0; - -static struct VolumeCalculator -{ - /** - * @brief calculates the volume of a sphere - * @param r radius - */ - ld sphere(const ld r) const - { - return (4 / 3) * Pi_ * pow(r, 3.0); - } - /** - * @brief calculates the volume of a cone - * @param r radius - * @param h height - */ - ld cone(const ld r, const ld h)const - { - return (1 / 3) * Pi_ * pow(r, 2.0) * h; - } - /** - * @brief calculates the volume of a cube - * @param edgeL edge length - */ - ld cube(const ld edgeL)const - { - return pow(edgeL, 3); - } - /** - * @brief calculates the volume of a cylinder - * @param r radius - * @param h height - */ - ld cylinder(const ld r, const ld h)const - { - return Pi_ * r * 2 * h; - } - /** - * @brief calculates the volume of rectangular tank - * @param l length - * @param w width - * @param h height - */ - ld rectangularTank(const ld l, const ld w, const ld h)const - { - return l * w * h; - } - - /** - * @brief calculates the volume of capsule - * @param r radius - * @param h height - * returns volume m^3 - */ - ld capsule(const ld r, const ld h)const - { - return (Pi_ * pow(r, 2)) * ((4 / 3) * r + h); - } - - /** - * @brief calculates the volume of spherical cap (button-like) - * @param r radius - * @param h height - * returns volume m^3 - */ - ld sphericalCap(const ld r, const ld h)const - { - return ((1 / 3) * Pi_ * pow(h, 2.0)) * (3 * r - h); - } - -}v; - -static struct PressureConversions -{ - ld atm_to_Pa(const ld atm)const - { - return atm * 1.013 * pow(10, 5);// Pa = N/m^2 - } - - ld dynePer_cmSquared_to_Pa(const ld d)const - { - return d * .10;// Pa = N/m^2 - } - ld Pa_to_dynePer_cmSquared(const ld Pa)const - { - return Pa / .10;// dyne/cm^2 - } - ld kgPer_cmSquared_to_Pa(const ld kg)const - { - return kg * 9.8 * pow(10, 4);// N/m^2 - } - ld Pa_to_kgPer_cmSquared(const ld Pa)const - { - return Pa / 9.8 * pow(10, 4);// kg/cm^2 - } - ld lbPer_inSquared_to_Pa(const ld atm)const - { - return atm * 1.013 * pow(10, 5);// N/m^2 - } - ld Pa_to_lbPer_inSquared(const ld Pa)const - { - return Pa / 1.013 * pow(10, 5);// lb/in^2 - } - ld mmHg_to_Pa(const ld mm)const - { - return mm * 133.3224;// N/m^2 - } - ld Pa_to_mmHg(const ld Pa)const - { - return Pa / 133.3224;// mm Hg - } - ld cmHg_to_Pa(const ld cm)const - { - return cm * 1.33 * pow(10, 3);// N/m^2 - } - ld Pa_to_cmHg(const ld Pa)const - { - return Pa / 1.33 * pow(10, 3);// cm Hg - } - ld cmWater_to_Pa(const ld w)const - { - return w * 98.1;// N/m^2 - } - ld Pa_to_cmWater(const ld Pa)const - { - return Pa / 98.1;// cm water - } - ld bar_to_Pa(const ld bar)const - { - return bar * 1.000 * pow(10, 5);// N/m^2 - } - ld Pa_to_bar(const ld Pa)const - { - return Pa / 1.000 * pow(10, 5);// bar - } - ld millibar_to_Pa(const ld cm)const - { - return cm * 1.000 * pow(10, 2);// Pa = N/m^2 - } - ld Pa_to_millibar(const ld Pa)const - { - return Pa / 1.000 * pow(10, 2);// millibar - } - ld atm_to_dyneCmSquared(const ld atm)const - { - return atm * 1.013 * pow(10, 6);// dyne/cm^2 - } - ld dyneCmSquared_to_atm(const ld n)const - { - return n / 1.013 * pow(10, 6);// atm - } - ld atm_to_kgCmSquared(const ld atm)const - { - return atm * 1.013;// kg/cm^2 - } - ld kgCmSquared_to_atm(const ld n)const - { - return n / 1.013;// atm - } - ld atm_to_lbsPerInchSquared(const ld atm)const - { - return atm * 14.7;// lb/in^2 - } - ld lbsPerInchSquared_to_atm(const ld n)const - { - return n / 14.7;// atm - } - ld atm_to_mmHg(const ld atm)const - { - return atm * 760.0;// mm Hg - } - ld mmHg_to_atm(const ld n)const - { - return n / 760.0;// atm - } - ld atm_to_cmHg(const ld atm)const - { - return atm * 76.0;// cm Hg - } - ld cmHg_to_atm(const ld n)const - { - return n / 76.0;// atm - } - ld atm_to_cmWater(const ld atm)const - { - return atm * 1.03 * pow(10, 3);// cm water - } - ld cmWater_to_atm(const ld n)const - { - return n / 1.03 * pow(10, 3);// atm - } - ld atm_to_bar(const ld atm)const - { - return atm * 1.013;// bar - } - ld bar_to_atm(const ld n)const - { - return n / 1.013;// atm - } - ld atm_to_millibar(const ld atm)const - { - return atm * 1013;// millibar - } - ld millibar_to_atm(const ld n)const - { - return n / 1013;// atm - } -}pressure_converter; - -static struct SurfaceTensions -{ - const ld water_0C = 0.0756; // 0.0756 N/m - const ld water_20C = 0.0728; // 0.0728 N/m - const ld water_100C = 0.0589; // 0.0589 N/m - const ld soapyWater_typical = 0.0370; // 0.0370 N/m - const ld ethyl_alcohol = 0.0223; // 0.0223 N/m - const ld glycerin = 0.0631; // 0.0631 N/m - const ld mercury = 0.465; // 0.465 N/m - const ld olive_oil = 0.032; // 0.032 N/m - const ld tissueFluids_typical = 0.050; // 0.050 N/m - const ld blood_whole_at_37C = 0.058; // 0.058 N/m - const ld blood_plasma_at_37C = 0.073; // 0.073 N/m - const ld gold_at_1070C = 1.00; // 1.00 N/m - const ld oxygen_at_negative193C = 0.0157; // 0.0157 N/m - const ld helium_at_negative269C = 0.00012; // 0.00012 N/m - -}surface_tensions; - -static struct ContactAngles -{ - const ld mercury_glass = 140.0; // 140 degrees - const ld water_glass = 0.0; // 0.0 degrees - const ld water_paraffin = 107.0; // 107.0 degrees - const ld water_silver = 90.0; // 90.0 degrees - const ld organic_liquids_most_glass = 0.0; // 0.0 degrees - const ld ethyl_alcohol_glass = 0.0; // 0.0 degrees - const ld kerosene_glass = 26.0; // 26.0 degrees -}contact_angles; - - -/** -* @brief circumference to radius -*/ -static ld radiusFromCircumference(const ld c) -{ - return c / (2 * Pi_); -} -/** -* @brief diameter to radius -*/ -static ld radiusFromDiameter(const ld d){ - return d/2; -} - - -class FluidStatics -{ - -public: - FluidStatics* _fluidStaticPtr; - - - FluidStatics() - { - _fluidStaticPtr = nullptr; - countIncrease(); - } - - /** - * @brief copy constructor - */ - FluidStatics(const FluidStatics& t) - { - _fluidStaticPtr = t._fluidStaticPtr; - countIncrease(); - } - /** - * #brief move constructor - */ - FluidStatics(FluidStatics&& t) noexcept - { - _fluidStaticPtr = t._fluidStaticPtr; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - FluidStatics& operator=(const FluidStatics& t) - { - if (this != &t) - { - _fluidStaticPtr = t._fluidStaticPtr; - countIncrease(); - } - return *this; - } - - static void show_objectCount() { std::cout << "\nfluid statics object count: " << fluidStatics_objectCount << std::endl; } - static int get_objectCount() { return fluidStatics_objectCount; } - - - /// - /// calculates the density with know mass and volume. - /// - /// The mass. - /// The volume. - /// density - static ld density(const ld mass, const ld volume) { - return mass / volume; - } - - /// - /// calculates the density of a substance made of other substances by adding the total parts together. - /// example: 18.0-karat gold that is a mixture of 18 parts gold, 5 parts silver, and 1 part copper? - /// (These values are parts by mass, not volume.) - /// Assume that this is a simple mixture having an average density equal to the weighted densities - /// of its constituents - /// - /// The parts of substance A. - /// The density of substance A. - /// The parts of substance B. - /// The density of substance B. - /// The parts of substance dC - /// The density of substance C. - /// - static ld densityAvg_partsByMass(const ld partsA, const ld pA, const ld partsB = 0.0, const ld pB = 0.0, const ld partsC = 0.0, const ld pC = 0.0) - { - return (partsA + partsB + partsC) / ((partsA / pA) + (partsB / pB) + (partsC / pC)); - } - - - /// - /// calculates the average density using mass and density of . - /// - /// The mass a. - /// The p a. - /// The mass b. - /// The p b. - /// The mass c. - /// The p c. - /// - static ld densityAvg(const ld massA, const ld pA, const ld massB = 0.0, const ld pB = 0.0, const ld massC = 0.0, const ld pC = 0.0) - { - return (massA + massB + massB) / ((massA / pA) + (massB / pB) + (massC / pC)); - } - - /// - /// calculates the volume from the mass and density. - /// - /// The mass. - /// The density. - /// the volume - static ld volume(const ld mass, const ld density) { - return mass / density; - } - - /// - /// calculates the mass from the density and volume. - /// - /// The density. - /// The volume. - /// the mass - static ld mass(const ld density, const ld volume) { - return density * volume; - } - - /// - /// Calculates the mass of fluid displaced my weight of object. - /// - /// The mass of object out of fluid. - /// The mass of object in the fluid. - /// mass of displaced fluid - static ld massOfFluidDisplaced(const ld massOut, const ld massIn) - { - return massOut - massIn; - } - - /// - /// calculates the pressure form force and area. - /// - /// The force. - /// The area. - /// pressure - static ld pressure(const ld force, const ld area) { - return force / area; - } - - /** - * @brief calculates the pressure on bottom of tank - * using P = F / A, F = ma and A = l*w - * @param m the mass - * @param l the length - * @param w the width - * @returns the pressure on bottom of tank - */ - static ld pressure(const ld m, const ld l, const ld w) - { - return (m * _G_) / (l * w); - } - - /** - * @brief calculates the average pressure. - * @param p the density - * @param l the length - * @param h the height - * @return the average pressure - */ - static ld pressureAvg(const ld p, const ld l, const ld h) - { - return ((p * _G_ * h) / 2.0) * (l * h); - } - - /// - /// calculates the surface tension - /// - /// The force per unit length. - /// length exerted by a stretched liquid membrane. - /// surface tension - static ld surfaceTension(const ld force, const ld length) - { - return force / length; - } - - /// - /// calculates the pressure in a sphere. - /// - /// The surface tension. - /// The radius. - /// pressure inside a sphere - static ld pressureInSphericalObject(const ld surfaceTension, const ld radius) - { - return (4.0 * surfaceTension) / radius; - } - - /// - /// the surface tension of a spherical object. - /// - /// The pressure. - /// The radius. - /// surface tension - static ld surfaceTensionSphericalObject(const ld pressure, const ld radius) - { - return (pressure * radius) / 4.0; - } - - /// - /// Force caused by a pressure. - /// - /// the pressure - /// the area - /// force - static ld force(const ld pressure, const ld area) { - return pressure * area; - } - - /// - /// Force needed by the master hydraulic to support weight on the slave. - /// - /// The mass. - /// The diameter master. - /// The diameter slave s. - /// Force master cylinder - static ld forceMaster_hydraulicSystemPascal(const ld m, const ld dM, const ld dS) - { - return (m * _G_ * (dM * dM)) / (dS * dS); - } - - /// - /// Force2 using pascals principles. - /// - /// Force 1. - /// The area 1. - /// The area 2. - /// Force 2 in newtons - static ld force2pascalPrinciples(const ld F1, const ld a1, const ld a2) - { - return F1 * (a2 / a1); - } - - /// - /// Radius of a cylinder. - /// - /// The mass. - /// The height. - /// The density. - /// the radius - static ld radiusCylinder(const ld m, const ld h, const ld _p) - { - return sqrt((m * _p) / (Pi_ * h)); - } - - /// - /// Depth of a rectangular tank. - /// - /// The mass. - /// The density. - /// The length. - /// The width. - /// - static ld depthRectangularTank(const ld m, const ld _p, const ld l, const ld w) - { - return m / (_p * l * w); - } - - /// - /// Ratios the of density. - /// - /// The percent decrease. - /// - static ld ratioOfDensity(const ld percentDecrease) - { - return 1.0 / percentDecrease; - } - - /// - /// Radius of a sphere with a known mass and density - /// - /// The mass. - /// The density. - /// radius - static ld radiusOfSphere(const ld m, const ld p) - { - return pow((3.0 * m) / (4.0 * Pi_ * p), 1 / 3); - } - - /// - /// calculates the height of the fluid. - /// - /// The pressure. - /// The density. - /// height - static ld heightOfFluid(const ld pressure, const ld density) - { - return pressure / (density * _G_); - } - - /// - /// calculates the gauge-pressure from density and height of a fluid. - /// - /// The density. - /// The height. - /// - static ld gaugePressure(const ld density, const ld height) - { - return density * _G_ * height; - } - - /// - /// Area the in contact - /// - /// The force. - /// The pressure. - /// area in contact - static ld area(const ld F, const ld P) - { - return F / P; - } - - /// - /// Fraction of object submerged. - /// - /// The average density of the object. - /// The density of the fluid. - /// the fraction of the object that will be submerged - static ld fractionSubmerged(const ld avgDensityObject, const ld densityFluid) - { - return avgDensityObject / densityFluid; - } - - /// - /// calculates the relative density. if object floats will be less than 1.0 - /// if object sinks will be over 1, and if is 1 will remain suspended in the - /// fluid, either sinking or floating - /// - /// The density of the test substance. - /// The density of the reference substance. - /// the relative density - static ld relativeDensity(const ld densitySubstance, const ld densityReference) - { - return densitySubstance / densityReference; - } - - /// - /// Density of the fluid. - /// - /// The density of the object. - /// The percent of the object that is submerged. - /// the density of the fluid - static ld densityOfFluid(const ld densityObject, const ld percentSubmerged) - { - return densityObject / (percentSubmerged / 100.0); - } - - /// - /// Force required to stay submerged. think fish - /// - /// The mass object. - /// The density object. - /// The density fluid. - /// force - static ld forceToStaySubmerged(const ld massObj, const ld densityObj, const ld densityFluid) - { - return massObj * _G_ * ((densityFluid / densityObj) - 1.0); - } - - /// - /// Calculates the maximum weight supported my an air mattress - /// - /// The mass of the air mattress. - /// The length. - /// The width. - /// The height. - /// The fluids density. - /// max weight before sinking in fluid - static ld maxWeightSupportedByFloatingAirMattress(const ld massMattress, const ld length, const ld width, const ld height, const ld fluidDensity) - { - return _G_ * (fluidDensity * (length * width * height) - massMattress); - } - - /// - /// calculates the capacity of lungs. - /// - /// The mass. - /// The percent floating when lung empty. - /// The percent floating when lung full. - /// The density of the fluid. - /// capacity in m^3, multiply answer by 1000 to have in liters cubed - static ld lungCapacity(const ld mass, const ld percentFloatLungEmpty, const ld percentFloatLungFull, const ld densityFluid) - { - return (mass / densityFluid)* ((1.0 / (1.0 -(percentFloatLungFull / 100.0)) - (1.0 / (1.0 - (percentFloatLungEmpty / 100.0))))); - } - - /// - /// calculates the capillary tube height. - /// - /// The surface tension. - /// The contact angle. - /// The density. - /// The radius. - /// height the fluid will rise in a capillary tube - static ld capillaryTubeHeight(const ld surfaceTension, const ld contactAngle, const ld density, const ld radius) - { - return (2.0 * surfaceTension * cos(contactAngle)) / (density * _G_ * radius); - } - - /// - /// calculates the capillaries tube radius. - /// - /// The surface tension. - /// The contact angle. - /// The density. - /// The height. - /// the radius of a capillary tube - static ld capillaryTubeRadius(const ld surfaceTension, const ld contactAngle, const ld density, const ld height) - { - return (2.0 * surfaceTension * cos(contactAngle)) / (density * _G_ * height); - } - - /// - /// calculates the surfaces tension using a sliding wire device. - /// - /// The force. - /// The length of wire. - /// gamma(surface tension) - static ld surfaceTension_usingSlidingWireDevice(const ld force, const ld lengthOfWire) - { - return force / (2.0 * lengthOfWire); - } - - /// - /// Effective surface tension of a ballon. - /// - /// The density. - /// The height. - /// The radius. - /// surface tension - static ld effectiveSurfaceTensionBalloon(const ld density, const ld height, const ld radius) - { - return (density * _G_ * height * radius) / 4.0; - } - - /// - /// Hieghts the of capillary action by ratio of contact angles. - /// - /// The height1. - /// The contact angle1. - /// The contact angle2. - /// - static ld heightOfCapillaryActionByRatioOfContactAngles(const ld height1, const ld contactAngle1, const ld contactAngle2) - { - return height1 * (cos(contactAngle2*_RADIAN_) / cos(contactAngle1*_RADIAN_)); - } - - /// - /// calculates the contact angle theta. - /// - /// The density. - /// The height. - /// The radius. - /// The surface tension. - /// contact angle - static ld contactAngleTheta(const ld density, const ld height, const ld radius, const ld surfaceTension) - { - return acos((density * _G_ * height * radius) / (2.0 * surfaceTension))*_DEGREE_; - } - - /// - /// calculates the ratio of heights of capillary action. - /// - /// The surface tension 1. - /// The contact angle 1. - /// The density 1. - /// The surface tension 2. - /// The contact angle 2. - /// The density 2. - /// ration of heights - static ld ratioOfHeights_capillaryAction(const ld st1, const ld ca1, const ld density1, const ld st2, const ld ca2, const ld density2) - { - return (st1 * cos(ca1*_RADIAN_) * density2) / (st2 * cos(ca2*_RADIAN_) * density1); - } - - - /** - * @brief destructor - */ - ~FluidStatics() - { - delete _fluidStaticPtr; - countDecrease(); - } - -private: - static void countIncrease() { fluidStatics_objectCount += 1; } - static void countDecrease() { fluidStatics_objectCount -= 1; } -}; -#endif //PHYSICSFORMULA_FLUIDSTATICS_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_FLUIDSTATICS_H +#define PHYSICSFORMULA_FLUIDSTATICS_H +/** + * @class FluidStatics + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @date 10/15/2020 + */ +#include + +#include "Friction.h" + +typedef long double ld; +static int fluidStatics_objectCount = 0; + +static struct VolumeCalculator +{ + /** + * @brief calculates the volume of a sphere + * @param r radius + */ + ld sphere(const ld r) const + { + return (4 / 3) * Pi_ * pow(r, 3.0); + } + /** + * @brief calculates the volume of a cone + * @param r radius + * @param h height + */ + ld cone(const ld r, const ld h)const + { + return (1 / 3) * Pi_ * pow(r, 2.0) * h; + } + /** + * @brief calculates the volume of a cube + * @param edgeL edge length + */ + ld cube(const ld edgeL)const + { + return pow(edgeL, 3); + } + /** + * @brief calculates the volume of a cylinder + * @param r radius + * @param h height + */ + ld cylinder(const ld r, const ld h)const + { + return Pi_ * r * 2 * h; + } + /** + * @brief calculates the volume of rectangular tank + * @param l length + * @param w width + * @param h height + */ + ld rectangularTank(const ld l, const ld w, const ld h)const + { + return l * w * h; + } + + /** + * @brief calculates the volume of capsule + * @param r radius + * @param h height + * returns volume m^3 + */ + ld capsule(const ld r, const ld h)const + { + return (Pi_ * pow(r, 2)) * ((4 / 3) * r + h); + } + + /** + * @brief calculates the volume of spherical cap (button-like) + * @param r radius + * @param h height + * returns volume m^3 + */ + ld sphericalCap(const ld r, const ld h)const + { + return ((1 / 3) * Pi_ * pow(h, 2.0)) * (3 * r - h); + } + +}v; + +static struct PressureConversions +{ + ld atm_to_Pa(const ld atm)const + { + return atm * 1.013 * pow(10, 5);// Pa = N/m^2 + } + + ld dynePer_cmSquared_to_Pa(const ld d)const + { + return d * .10;// Pa = N/m^2 + } + ld Pa_to_dynePer_cmSquared(const ld Pa)const + { + return Pa / .10;// dyne/cm^2 + } + ld kgPer_cmSquared_to_Pa(const ld kg)const + { + return kg * 9.8 * pow(10, 4);// N/m^2 + } + ld Pa_to_kgPer_cmSquared(const ld Pa)const + { + return Pa / 9.8 * pow(10, 4);// kg/cm^2 + } + ld lbPer_inSquared_to_Pa(const ld atm)const + { + return atm * 1.013 * pow(10, 5);// N/m^2 + } + ld Pa_to_lbPer_inSquared(const ld Pa)const + { + return Pa / 1.013 * pow(10, 5);// lb/in^2 + } + ld mmHg_to_Pa(const ld mm)const + { + return mm * 133.3224;// N/m^2 + } + ld Pa_to_mmHg(const ld Pa)const + { + return Pa / 133.3224;// mm Hg + } + ld cmHg_to_Pa(const ld cm)const + { + return cm * 1.33 * pow(10, 3);// N/m^2 + } + ld Pa_to_cmHg(const ld Pa)const + { + return Pa / 1.33 * pow(10, 3);// cm Hg + } + ld cmWater_to_Pa(const ld w)const + { + return w * 98.1;// N/m^2 + } + ld Pa_to_cmWater(const ld Pa)const + { + return Pa / 98.1;// cm water + } + ld bar_to_Pa(const ld bar)const + { + return bar * 1.000 * pow(10, 5);// N/m^2 + } + ld Pa_to_bar(const ld Pa)const + { + return Pa / 1.000 * pow(10, 5);// bar + } + ld millibar_to_Pa(const ld cm)const + { + return cm * 1.000 * pow(10, 2);// Pa = N/m^2 + } + ld Pa_to_millibar(const ld Pa)const + { + return Pa / 1.000 * pow(10, 2);// millibar + } + ld atm_to_dyneCmSquared(const ld atm)const + { + return atm * 1.013 * pow(10, 6);// dyne/cm^2 + } + ld dyneCmSquared_to_atm(const ld n)const + { + return n / 1.013 * pow(10, 6);// atm + } + ld atm_to_kgCmSquared(const ld atm)const + { + return atm * 1.013;// kg/cm^2 + } + ld kgCmSquared_to_atm(const ld n)const + { + return n / 1.013;// atm + } + ld atm_to_lbsPerInchSquared(const ld atm)const + { + return atm * 14.7;// lb/in^2 + } + ld lbsPerInchSquared_to_atm(const ld n)const + { + return n / 14.7;// atm + } + ld atm_to_mmHg(const ld atm)const + { + return atm * 760.0;// mm Hg + } + ld mmHg_to_atm(const ld n)const + { + return n / 760.0;// atm + } + ld atm_to_cmHg(const ld atm)const + { + return atm * 76.0;// cm Hg + } + ld cmHg_to_atm(const ld n)const + { + return n / 76.0;// atm + } + ld atm_to_cmWater(const ld atm)const + { + return atm * 1.03 * pow(10, 3);// cm water + } + ld cmWater_to_atm(const ld n)const + { + return n / 1.03 * pow(10, 3);// atm + } + ld atm_to_bar(const ld atm)const + { + return atm * 1.013;// bar + } + ld bar_to_atm(const ld n)const + { + return n / 1.013;// atm + } + ld atm_to_millibar(const ld atm)const + { + return atm * 1013;// millibar + } + ld millibar_to_atm(const ld n)const + { + return n / 1013;// atm + } +}pressure_converter; + +static struct SurfaceTensions +{ + const ld water_0C = 0.0756; // 0.0756 N/m + const ld water_20C = 0.0728; // 0.0728 N/m + const ld water_100C = 0.0589; // 0.0589 N/m + const ld soapyWater_typical = 0.0370; // 0.0370 N/m + const ld ethyl_alcohol = 0.0223; // 0.0223 N/m + const ld glycerin = 0.0631; // 0.0631 N/m + const ld mercury = 0.465; // 0.465 N/m + const ld olive_oil = 0.032; // 0.032 N/m + const ld tissueFluids_typical = 0.050; // 0.050 N/m + const ld blood_whole_at_37C = 0.058; // 0.058 N/m + const ld blood_plasma_at_37C = 0.073; // 0.073 N/m + const ld gold_at_1070C = 1.00; // 1.00 N/m + const ld oxygen_at_negative193C = 0.0157; // 0.0157 N/m + const ld helium_at_negative269C = 0.00012; // 0.00012 N/m + +}surface_tensions; + +static struct ContactAngles +{ + const ld mercury_glass = 140.0; // 140 degrees + const ld water_glass = 0.0; // 0.0 degrees + const ld water_paraffin = 107.0; // 107.0 degrees + const ld water_silver = 90.0; // 90.0 degrees + const ld organic_liquids_most_glass = 0.0; // 0.0 degrees + const ld ethyl_alcohol_glass = 0.0; // 0.0 degrees + const ld kerosene_glass = 26.0; // 26.0 degrees +}contact_angles; + + +/** +* @brief circumference to radius +*/ +static ld radiusFromCircumference(const ld c) +{ + return c / (2 * Pi_); +} +/** +* @brief diameter to radius +*/ +static ld radiusFromDiameter(const ld d){ + return d/2; +} + + +class FluidStatics +{ + +public: + FluidStatics* _fluidStaticPtr; + + + FluidStatics() + { + _fluidStaticPtr = nullptr; + countIncrease(); + } + + /** + * @brief copy constructor + */ + FluidStatics(const FluidStatics& t) + { + _fluidStaticPtr = t._fluidStaticPtr; + countIncrease(); + } + /** + * #brief move constructor + */ + FluidStatics(FluidStatics&& t) noexcept + { + _fluidStaticPtr = t._fluidStaticPtr; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + FluidStatics& operator=(const FluidStatics& t) + { + if (this != &t) + { + _fluidStaticPtr = t._fluidStaticPtr; + countIncrease(); + } + return *this; + } + + static void show_objectCount() { std::cout << "\nfluid statics object count: " << fluidStatics_objectCount << std::endl; } + static int get_objectCount() { return fluidStatics_objectCount; } + + + /// + /// calculates the density with know mass and volume. + /// + /// The mass. + /// The volume. + /// density + static ld density(const ld mass, const ld volume) { + return mass / volume; + } + + /// + /// calculates the density of a substance made of other substances by adding the total parts together. + /// example: 18.0-karat gold that is a mixture of 18 parts gold, 5 parts silver, and 1 part copper? + /// (These values are parts by mass, not volume.) + /// Assume that this is a simple mixture having an average density equal to the weighted densities + /// of its constituents + /// + /// The parts of substance A. + /// The density of substance A. + /// The parts of substance B. + /// The density of substance B. + /// The parts of substance dC + /// The density of substance C. + /// + static ld densityAvg_partsByMass(const ld partsA, const ld pA, const ld partsB = 0.0, const ld pB = 0.0, const ld partsC = 0.0, const ld pC = 0.0) + { + return (partsA + partsB + partsC) / ((partsA / pA) + (partsB / pB) + (partsC / pC)); + } + + + /// + /// calculates the average density using mass and density of . + /// + /// The mass a. + /// The p a. + /// The mass b. + /// The p b. + /// The mass c. + /// The p c. + /// + static ld densityAvg(const ld massA, const ld pA, const ld massB = 0.0, const ld pB = 0.0, const ld massC = 0.0, const ld pC = 0.0) + { + return (massA + massB + massB) / ((massA / pA) + (massB / pB) + (massC / pC)); + } + + /// + /// calculates the volume from the mass and density. + /// + /// The mass. + /// The density. + /// the volume + static ld volume(const ld mass, const ld density) { + return mass / density; + } + + /// + /// calculates the mass from the density and volume. + /// + /// The density. + /// The volume. + /// the mass + static ld mass(const ld density, const ld volume) { + return density * volume; + } + + /// + /// Calculates the mass of fluid displaced my weight of object. + /// + /// The mass of object out of fluid. + /// The mass of object in the fluid. + /// mass of displaced fluid + static ld massOfFluidDisplaced(const ld massOut, const ld massIn) + { + return massOut - massIn; + } + + /// + /// calculates the pressure form force and area. + /// + /// The force. + /// The area. + /// pressure + static ld pressure(const ld force, const ld area) { + return force / area; + } + + /** + * @brief calculates the pressure on bottom of tank + * using P = F / A, F = ma and A = l*w + * @param m the mass + * @param l the length + * @param w the width + * @returns the pressure on bottom of tank + */ + static ld pressure(const ld m, const ld l, const ld w) + { + return (m * _G_) / (l * w); + } + + /** + * @brief calculates the average pressure. + * @param p the density + * @param l the length + * @param h the height + * @return the average pressure + */ + static ld pressureAvg(const ld p, const ld l, const ld h) + { + return ((p * _G_ * h) / 2.0) * (l * h); + } + + /// + /// calculates the surface tension + /// + /// The force per unit length. + /// length exerted by a stretched liquid membrane. + /// surface tension + static ld surfaceTension(const ld force, const ld length) + { + return force / length; + } + + /// + /// calculates the pressure in a sphere. + /// + /// The surface tension. + /// The radius. + /// pressure inside a sphere + static ld pressureInSphericalObject(const ld surfaceTension, const ld radius) + { + return (4.0 * surfaceTension) / radius; + } + + /// + /// the surface tension of a spherical object. + /// + /// The pressure. + /// The radius. + /// surface tension + static ld surfaceTensionSphericalObject(const ld pressure, const ld radius) + { + return (pressure * radius) / 4.0; + } + + /// + /// Force caused by a pressure. + /// + /// the pressure + /// the area + /// force + static ld force(const ld pressure, const ld area) { + return pressure * area; + } + + /// + /// Force needed by the master hydraulic to support weight on the slave. + /// + /// The mass. + /// The diameter master. + /// The diameter slave s. + /// Force master cylinder + static ld forceMaster_hydraulicSystemPascal(const ld m, const ld dM, const ld dS) + { + return (m * _G_ * (dM * dM)) / (dS * dS); + } + + /// + /// Force2 using pascals principles. + /// + /// Force 1. + /// The area 1. + /// The area 2. + /// Force 2 in newtons + static ld force2pascalPrinciples(const ld F1, const ld a1, const ld a2) + { + return F1 * (a2 / a1); + } + + /// + /// Radius of a cylinder. + /// + /// The mass. + /// The height. + /// The density. + /// the radius + static ld radiusCylinder(const ld m, const ld h, const ld _p) + { + return sqrt((m * _p) / (Pi_ * h)); + } + + /// + /// Depth of a rectangular tank. + /// + /// The mass. + /// The density. + /// The length. + /// The width. + /// + static ld depthRectangularTank(const ld m, const ld _p, const ld l, const ld w) + { + return m / (_p * l * w); + } + + /// + /// Ratios the of density. + /// + /// The percent decrease. + /// + static ld ratioOfDensity(const ld percentDecrease) + { + return 1.0 / percentDecrease; + } + + /// + /// Radius of a sphere with a known mass and density + /// + /// The mass. + /// The density. + /// radius + static ld radiusOfSphere(const ld m, const ld p) + { + return pow((3.0 * m) / (4.0 * Pi_ * p), 1 / 3); + } + + /// + /// calculates the height of the fluid. + /// + /// The pressure. + /// The density. + /// height + static ld heightOfFluid(const ld pressure, const ld density) + { + return pressure / (density * _G_); + } + + /// + /// calculates the gauge-pressure from density and height of a fluid. + /// + /// The density. + /// The height. + /// + static ld gaugePressure(const ld density, const ld height) + { + return density * _G_ * height; + } + + /// + /// Area the in contact + /// + /// The force. + /// The pressure. + /// area in contact + static ld area(const ld F, const ld P) + { + return F / P; + } + + /// + /// Fraction of object submerged. + /// + /// The average density of the object. + /// The density of the fluid. + /// the fraction of the object that will be submerged + static ld fractionSubmerged(const ld avgDensityObject, const ld densityFluid) + { + return avgDensityObject / densityFluid; + } + + /// + /// calculates the relative density. if object floats will be less than 1.0 + /// if object sinks will be over 1, and if is 1 will remain suspended in the + /// fluid, either sinking or floating + /// + /// The density of the test substance. + /// The density of the reference substance. + /// the relative density + static ld relativeDensity(const ld densitySubstance, const ld densityReference) + { + return densitySubstance / densityReference; + } + + /// + /// Density of the fluid. + /// + /// The density of the object. + /// The percent of the object that is submerged. + /// the density of the fluid + static ld densityOfFluid(const ld densityObject, const ld percentSubmerged) + { + return densityObject / (percentSubmerged / 100.0); + } + + /// + /// Force required to stay submerged. think fish + /// + /// The mass object. + /// The density object. + /// The density fluid. + /// force + static ld forceToStaySubmerged(const ld massObj, const ld densityObj, const ld densityFluid) + { + return massObj * _G_ * ((densityFluid / densityObj) - 1.0); + } + + /// + /// Calculates the maximum weight supported my an air mattress + /// + /// The mass of the air mattress. + /// The length. + /// The width. + /// The height. + /// The fluids density. + /// max weight before sinking in fluid + static ld maxWeightSupportedByFloatingAirMattress(const ld massMattress, const ld length, const ld width, const ld height, const ld fluidDensity) + { + return _G_ * (fluidDensity * (length * width * height) - massMattress); + } + + /// + /// calculates the capacity of lungs. + /// + /// The mass. + /// The percent floating when lung empty. + /// The percent floating when lung full. + /// The density of the fluid. + /// capacity in m^3, multiply answer by 1000 to have in liters cubed + static ld lungCapacity(const ld mass, const ld percentFloatLungEmpty, const ld percentFloatLungFull, const ld densityFluid) + { + return (mass / densityFluid)* ((1.0 / (1.0 -(percentFloatLungFull / 100.0)) - (1.0 / (1.0 - (percentFloatLungEmpty / 100.0))))); + } + + /// + /// calculates the capillary tube height. + /// + /// The surface tension. + /// The contact angle. + /// The density. + /// The radius. + /// height the fluid will rise in a capillary tube + static ld capillaryTubeHeight(const ld surfaceTension, const ld contactAngle, const ld density, const ld radius) + { + return (2.0 * surfaceTension * cos(contactAngle)) / (density * _G_ * radius); + } + + /// + /// calculates the capillaries tube radius. + /// + /// The surface tension. + /// The contact angle. + /// The density. + /// The height. + /// the radius of a capillary tube + static ld capillaryTubeRadius(const ld surfaceTension, const ld contactAngle, const ld density, const ld height) + { + return (2.0 * surfaceTension * cos(contactAngle)) / (density * _G_ * height); + } + + /// + /// calculates the surfaces tension using a sliding wire device. + /// + /// The force. + /// The length of wire. + /// gamma(surface tension) + static ld surfaceTension_usingSlidingWireDevice(const ld force, const ld lengthOfWire) + { + return force / (2.0 * lengthOfWire); + } + + /// + /// Effective surface tension of a ballon. + /// + /// The density. + /// The height. + /// The radius. + /// surface tension + static ld effectiveSurfaceTensionBalloon(const ld density, const ld height, const ld radius) + { + return (density * _G_ * height * radius) / 4.0; + } + + /// + /// Hieghts the of capillary action by ratio of contact angles. + /// + /// The height1. + /// The contact angle1. + /// The contact angle2. + /// + static ld heightOfCapillaryActionByRatioOfContactAngles(const ld height1, const ld contactAngle1, const ld contactAngle2) + { + return height1 * (cos(contactAngle2*_RADIAN_) / cos(contactAngle1*_RADIAN_)); + } + + /// + /// calculates the contact angle theta. + /// + /// The density. + /// The height. + /// The radius. + /// The surface tension. + /// contact angle + static ld contactAngleTheta(const ld density, const ld height, const ld radius, const ld surfaceTension) + { + return acos((density * _G_ * height * radius) / (2.0 * surfaceTension))*_DEGREE_; + } + + /// + /// calculates the ratio of heights of capillary action. + /// + /// The surface tension 1. + /// The contact angle 1. + /// The density 1. + /// The surface tension 2. + /// The contact angle 2. + /// The density 2. + /// ration of heights + static ld ratioOfHeights_capillaryAction(const ld st1, const ld ca1, const ld density1, const ld st2, const ld ca2, const ld density2) + { + return (st1 * cos(ca1*_RADIAN_) * density2) / (st2 * cos(ca2*_RADIAN_) * density1); + } + + + /** + * @brief destructor + */ + ~FluidStatics() + { + delete _fluidStaticPtr; + countDecrease(); + } + +private: + static void countIncrease() { fluidStatics_objectCount += 1; } + static void countDecrease() { fluidStatics_objectCount -= 1; } +}; +#endif //PHYSICSFORMULA_FLUIDSTATICS_H diff --git a/Forces.h b/Forces.h index 7388115..693c86c 100644 --- a/Forces.h +++ b/Forces.h @@ -1,545 +1,545 @@ -// -// Created by Ryan.Zurrin001 on 12/15/2021. -// - -#ifndef PHYSICSFORMULA_FORCES_H -#define PHYSICSFORMULA_FORCES_H -#pragma once -/** - * @class Forces - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @date 10/15/2020 - */ -#include -#include -#include "Vector2D.h" -constexpr auto GA = 9.81; - -static int forces_objectCount = 0; - - -class Forces -{ - -public: - - Forces() - { - _force = 0.0; - _mass = 0.0; - _acceleration = 0.0; - _angle = 0.0; - countIncrease(); - } - /** - * @brief constructor for Forces - * @param mass - * @param acceleration - */ - Forces(double mass_force, double acc_angle, const string& type = "force") - { - if (type == "force") - { - _force = mass_force; - _mass = 0.0; - _acceleration = 0.0; - _angle = acc_angle; - } - else - { - _mass = mass_force; - _force = mass_force * acc_angle; - _acceleration = acc_angle; - _angle = 0.0; - } - countIncrease(); - } - Forces(double mass, double acceleration, double angle) { - _mass = mass; - _acceleration = acceleration; - _force = _mass * _acceleration; - _angle = angle; - countIncrease(); - } - /** - * @brief copy constructor - */ - Forces(const Forces& t) - { - _force = t._force; - _mass = t._mass; - _acceleration = t._acceleration; - _angle = t._angle; - countIncrease(); - } - /** - * #brief move constructor - */ - Forces(Forces&& t) noexcept - { - _force = t._force; - _mass = t._mass; - _acceleration = t._acceleration; - _angle = t._angle; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Forces& operator=(const Forces& t) - { - if (this != &t) - { - _force = t._force; - _mass = t._mass; - _acceleration = t._acceleration; - _angle = t._angle; - countIncrease(); - } - return *this; - } - - static void show_forces_objectCount() { std::cout << "\ndynamics and forces object count: " - << forces_objectCount << std::endl; } - static int get_forces_objectCount() { return forces_objectCount; } - void setForce(long double val) { _force = val; } - [[nodiscard]] long double getForce() const { return _force; } - void setMass(long double val) { _mass = val; } - [[nodiscard]] long double getMass() const { return _mass; } - void setAcceleration(long double val) { _acceleration = val; } - [[nodiscard]] long double getAcceleration() const { return _acceleration; } - void setAngle(long double val) { _angle = val; } - [[nodiscard]] long double getAngle() const { return _angle; } - [[nodiscard]] string toString() const - { - stringstream ss; - ss << "Force: " << _force << " N\n" - << "Mass: " << _mass << " kg\n" - << "Acceleration: " << _acceleration << " m/s^2\n" - << "Angle: " << _angle*DEGREE << " degrees\n"; - return ss.str(); - } - - /** - * method: netForce(const long double totalForces, const long double totalFriction) - * arguments: 1)total forces 2)total friction - * purpose: calculates the forces total including frictions - * returns: long double net force - */ - static long double netForce(const long double totalForces, const long double totalFriction) - { - return totalForces - totalFriction; - } - - /** - * method: gravitational_force_on_mass(long double mass) const - * arguments: mass - * purpose: applies the force of gravity on a mass to give the weight - * returns: long double weight - */ - static long double weight(const long double mass) - { - return mass * GA; - } - - /** - * method: newtons_second_law_for_force(long double mass, long double acceleration) - * arguments: long double mass, long double acceleration - * purpose: uses Newtons second law of motion to calculate the force of a something - * returns: long double, force - */ - static long double force(const long double mass, const long double acceleration) - { - return mass * acceleration; - } - - /// - /// Calculates acceleration from force and mass. - /// - /// The force in Newtons. - /// The mass. - /// acceleration - template - static auto acceleration(const T F, const T m) - { - return F / m; - } - - /** - * method: newtons_second_law_for_mass(long double netForce, long double acceleration) const - * arguments: netForce, acceleration - * purpose:calculates the mass of an object from the force and acceleration - * returns: long double, mass - */ - static long double mass(long double netForce, long double acceleration) - { - return netForce / acceleration; - } - - /** - * method: drag_force(const long double appliedForce, const long double mass, const long double acceleration) - * arguments: 1)appliedForce 2)mass 3)acceleration - * purpose:calculates the drag or resistance - * returns: long double, drag - */ - static long double drag_force(const long double appliedForce, const long double mass, const long double acceleration) - { - return appliedForce - (mass * acceleration); - } - - /** - * method: normal_force(const long double mass, const long double acceleration = GA) - * arguments: 1)mass 2)acceleration - * purpose: calculates the normal force, weight - * returns: long double, normal force - */ - static long double normalForce(const long double mass, const long double acceleration = GA) - { - return mass * acceleration; - } - - /** - * method: normal_force - * _angle(const long double mass, const long double angleTheta) - * arguments: 1)mass 2)acceleration - * purpose: calculates the normal force on an angle - * returns: long double, normal force - */ - static long double normalForce_angleDOWN(const long double mass, const long double angleTheta) - { - return mass * GA * cos(angleTheta * RADIAN); - } - /** - * method: normal_force_angleUp(const long double mass, const long double angleTheta) - * arguments: 1)mass 2)acceleration - * purpose: calculates the normal force on an angle - * returns: long double, normal force - */ - static long double normalForce_angleUP(const long double mass, const long double angleTheta) - { - return mass * GA * sin(angleTheta * RADIAN); - } - - /** - * @brief calculates the normal force on an angle - * @param angleTheta angle in degrees - * @param kC kineticCoefficient - * @returns long double, normal force - */ - static long double acceleration_slope_simpleFriction(const long double angleTheta, const long double kC) - { - return GA * (sin(angleTheta * RADIAN) - (kC * cos(angleTheta * RADIAN))); - } - - /** - * @brief finds the ratio between two numbers - * @param top is the top part of the ratio - * @param bottom is the bottom part of the ratio - * @returns the ratio between two numbers - */ - static long double ratio(const long double top, const long double bottom) - { - return top / bottom; - } - - /** - * @brief calculates the tension on a horizontal rope as it gets hung from - * @param mass in kg of object causing tension - * @returns tension in Newtons - */ - static long double tensionOnSingleStrand(const long double mass) - { - return mass * GA; - } - - /** - * @brief calculates the tension on a horizontal rope as it gets hung from - * @param mass in kg of object causing tension - * @param a acceleration m/s - * @returns tension in Newtons - */ - static long double tensionOnSingleStrandWithAccelerationUpward(const long double mass, const long double a) - { - return (mass * GA) + (mass * a); - } - - /** - * @brief calculates the tension on a horizontal rope as it gets hung from - * @param mass in kg of object causing tension - * @param fCoeff kinetic frictional coefficient - * @param a acceleration m/s - * @returns tension in Newtons - */ - static long double tensionOnSingleStrandWithFrictionWhileAccelerating(const long double mass, const long double fCoeff, const long double a) - { - const long double Nf = mass * GA; - const long double friction_ = fCoeff * Nf; - const long double accF = mass * a; - return friction_ + accF; - } - - /** - * @brief calculates the tension on a horizontal rope as it gets hung from - * @param mass1 in kg of object1 - * @param mass2 in kg of object2 - * @returns tension in Newtons - */ - static long double tensionOnMultipleStrandsIdealPulley(const long double mass1, const long double mass2) - { - return ((2.0*GA)*(mass1*mass2))/(mass1 + mass2); - } - - - /** - * @brief calculates the tension on a horizontal rope as it gets hung from - * @param mass in kg of object1 - * @param theta1 angle side 1 in degrees - * @param theta2 angle side 2 in degrees - * @returns tension in Newtons - */ - static vector - tensionOnMultipleStrandsHangingObject(const long double mass, const long double theta1, - const long double theta2, bool print = false) - { - vector result = { 0.0, 0.0, 0.0 }; - auto mg = mass * GA; - auto T1x = cos(theta1 * RADIAN); - auto T1y = sin(theta1 * RADIAN); - auto T2x = cos(theta2 * RADIAN); - auto T2y = sin(theta2 * RADIAN); - auto T2 = T1x/T2x; - auto temp = T2y*T2+T1y; - auto T1_tot = mg/temp; - auto T2_tot = T1_tot*T2; - result[0] = T1_tot; - result[1] = T2_tot; - result[2] = T1_tot + T2_tot; - - if (print) - { - cout << "Tension on side 1: " << result[0] << endl; - cout << "Tension on side 2: " << result[1] << endl; - cout << "Tension on both sides: " << result[2] << endl; - } - return result; - } - /** - * @brief calculates the tension on a horizontal rope as it gets hung from - * @param mass1 in kg of object1 - * @param mass2 in kg of object2 - * @returns tension in Newtons - */ - static long double tensionOnCableMultipleStrandsMiddle(const long double mass, const long double theta) - { - return (mass * GA)/(2.0*sin(theta*RADIAN)); - } - - /** - * @brief In a front-end collision, a car of mass m with shock-absorbing bumpers can - * withstand a maximum force of f before damage occurs. If the maximum speed - * for a non-damaging collision is v by how much must the bumper be able to - * move relative to the car? - * @param m mass of car - * @param f maximum force of impact on car bumper - * @param v maximum speed of car - * @returns the maximum distance the bumper can move - */ - static long double maxCompression(const long double m, const long double f, const long double v) - { - return (v*v)/(2.0*(f/m)); - } - - /** - * Find an expression for the thrust (force) of a model rocket's engine required - * to accelerate a spacecraft of total mass m from rest on the ground to speed v - * while rising a vertical distance h. - * @param m total mass of spacecraft - * @param v speed of spacecraft - * @param h vertical distance of spacecraft - * @returns the thrust of the rocket's engine - */ - static long double rocketThrust(const long double m, const long double v, const long double h) - { - return m*(GA*((v*v)/(2.0*h))); - } - /** - * Two forces, both in the x-y plane, act on a object of mass m (M) that - * accelerates at acc (L/T^2) in a direction theta counterclockwise from - * the x-axis. One force has magnitude F_1 and points in the +x-direction. - * Find the other force F_2 magnitude and direction. - * @param m mass of object - * @param acc acceleration of object - * @param theta angle of object - * @param F1 magnitude of force 1 - * @returns a vector with the magnitude and direction of force 2 - */ - static vector - forceOnObject(const long double m, const long double acc, const long double theta, - const long double F1, bool print = false){ - vector result = { 0.0, 0.0}; - auto ax = (m*acc*cos(theta*RADIAN) - F1); - auto ay = (m*acc*sin(theta*RADIAN)); - auto F2 = sqrt(ax*ax + ay*ay); - auto theta2 = atan2(ay, ax)*DEGREE; - if(print){ - cout << "F2 = " << F2 << endl; - cout << "theta = " << theta2 << endl; - } - result[0] = F2; - result[1] = theta2; - return result; - } - - /** - * Two forces act on a object of mass m(M) that undergoes acceleration - * ai and aj. If one force is F1i and F1j what's the i and j components - * as well as the magnitude and direction of the other force? - */ - static vector - forceOnObject(const long double m, const long double ai, const long double aj, - const long double F1i, const long double F1j, bool print = false){ - vector result = { 0.0, 0.0, 0.0, 0.0}; - auto F2i = (m*ai) - F1i; - auto F2j = (m*aj) - F1j; - auto F2 = sqrt(F2i*F2i + F2j*F2j); - auto theta2 = atan2(F2j, F2i)*DEGREE; - if(print){ - cout << "F2 = " << F2 << endl; - cout << "theta = " << theta2 << endl; - cout << "F2i = " << F2i << endl; - cout << "F2j = " << F2j << endl; - } - result[0] = F2; - result[1] = theta2; - result[2] = F2i; - result[3] = F2j; - return result; - } - - /** - * At what angle should you tilt an air table (on Earth) to simulate free - * fall at the surface of some other planet, with an acceleration of g? - * @param g acceleration of gravity on other planet - * @return angle of tilt - */ - static long double tiltAngle(const long double g, bool print = false){ - auto theta = asin(g/GA)*DEGREE; - if(print){ - cout << "theta = " << theta << endl; - } - return theta; - } - - /** - * A skier starts from rest at the top of a slope at angel of theta and that - * is d long. Neglecting friction, how long does it take to reach the bottom? - */ - static long double skierTime(const long double theta, const long double d, bool print = false){ - auto a = GA*sin(theta*RADIAN); - auto t = sqrt(2.0*d/a); - if(print){ - cout << "t = " << t << endl; - } - return t; - } - - /** - * @brief Your baby sister of mass m_s(M) pulls on the bottom of the tablecloth with - * all her weight. On the table, distance d(L) from the edge, is a roast - * turkey of mass m_t(M). \n - * (a) What's the turkey's acceleration? - * (b) From the time your sister starts pulling, how long do you have to - * intervene before the turkey goes over the edge? Neglect friction. - */ - static vector tablecloth(const long double m_s, const long double m_t, const long double d, bool print = false){ - vector result = { 0.0, 0.0}; - auto a = (m_s*GA)/(m_s+m_t); - auto t = sqrt(2.0*d/a); - if(print){ - cout << "acceleration = " << a << endl; - cout << "time to save = " << t << endl; - } - result[0] = a; - result[1] = t; - return result; - } - - static long double - acceleration2masses(const long double m_1, const long double theta_1, - const long double m_2, const long double theta_2, - bool print = false){ - auto a = - ((m_1*GA*sin(theta_1*RADIAN)) + (m_2*GA*sin(theta_2*RADIAN))) - / (m_1+m_2); - if(print){ - cout << "acceleration = " << a << endl; - } - return a; - } - - static long double - forceToKeepMassInCircularPath(const long double m, const long double r, - const long double periodT, bool print = false){ - auto F = (4.0*(PI_*PI_)*m*r)/(periodT*periodT); - if(print){ - cout << "F = " << F << endl; - } - return F; - } - - - Forces operator+(const Forces& other) const - { - Forces result; - // add two forces using the triangular method a2 = b2 + c2 - 2*b*c*Cos (A) - auto ax = this->_force * cos(this->_angle*RADIAN); - auto ay = this->_force * sin(this->_angle*RADIAN); - auto bx = other._force * cos(other._angle*RADIAN); - auto by = other._force * sin(other._angle*RADIAN); - auto totX = ax + bx; - auto totY = ay + by; - result._force = sqrt(totX * totX + totY * totY); - result._angle = atan2(totY, totX); - return result; - } - // overload the - operator to subtract two Forces objects - Forces operator-(const Forces& other) const - { - Forces result; - // subtract two forces using the triangular method a2 = b2 + c2 - 2*b*c*Cos (A) - auto ax = this->_force * cos(this->_angle*RADIAN); - auto ay = this->_force * sin(this->_angle*RADIAN); - auto bx = other._force * cos(other._angle*RADIAN); - auto by = other._force * sin(other._angle*RADIAN); - auto totX = ax - bx; - auto totY = ay - by; - result._force = sqrt(totX * totX + totY * totY); - result._angle = atan2(totY, totX); - return result; - } - - - ~Forces() - { - countDecrease(); - } - // overload the << operator - friend ostream& operator<<(ostream& os, const Forces& f) { - os << "Forces: " << endl; - os << f.toString(); - return os; - } - - -private: - long double _force; - long double _acceleration; - long double _mass; - long double _angle; - static void countIncrease() { forces_objectCount += 1; } - static void countDecrease() { forces_objectCount -= 1; } - -}; - -#endif //PHYSICSFORMULA_FORCES_H +// +// Created by Ryan.Zurrin001 on 12/15/2021. +// + +#ifndef PHYSICSFORMULA_FORCES_H +#define PHYSICSFORMULA_FORCES_H +#pragma once +/** + * @class Forces + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @date 10/15/2020 + */ +#include +#include +#include "Vector2D.h" +constexpr auto GA = 9.81; + +static int forces_objectCount = 0; + + +class Forces +{ + +public: + + Forces() + { + _force = 0.0; + _mass = 0.0; + _acceleration = 0.0; + _angle = 0.0; + countIncrease(); + } + /** + * @brief constructor for Forces + * @param mass + * @param acceleration + */ + Forces(double mass_force, double acc_angle, const string& type = "force") + { + if (type == "force") + { + _force = mass_force; + _mass = 0.0; + _acceleration = 0.0; + _angle = acc_angle; + } + else + { + _mass = mass_force; + _force = mass_force * acc_angle; + _acceleration = acc_angle; + _angle = 0.0; + } + countIncrease(); + } + Forces(double mass, double acceleration, double angle) { + _mass = mass; + _acceleration = acceleration; + _force = _mass * _acceleration; + _angle = angle; + countIncrease(); + } + /** + * @brief copy constructor + */ + Forces(const Forces& t) + { + _force = t._force; + _mass = t._mass; + _acceleration = t._acceleration; + _angle = t._angle; + countIncrease(); + } + /** + * #brief move constructor + */ + Forces(Forces&& t) noexcept + { + _force = t._force; + _mass = t._mass; + _acceleration = t._acceleration; + _angle = t._angle; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Forces& operator=(const Forces& t) + { + if (this != &t) + { + _force = t._force; + _mass = t._mass; + _acceleration = t._acceleration; + _angle = t._angle; + countIncrease(); + } + return *this; + } + + static void show_forces_objectCount() { std::cout << "\ndynamics and forces object count: " + << forces_objectCount << std::endl; } + static int get_forces_objectCount() { return forces_objectCount; } + void setForce(long double val) { _force = val; } + [[nodiscard]] long double getForce() const { return _force; } + void setMass(long double val) { _mass = val; } + [[nodiscard]] long double getMass() const { return _mass; } + void setAcceleration(long double val) { _acceleration = val; } + [[nodiscard]] long double getAcceleration() const { return _acceleration; } + void setAngle(long double val) { _angle = val; } + [[nodiscard]] long double getAngle() const { return _angle; } + [[nodiscard]] string toString() const + { + stringstream ss; + ss << "Force: " << _force << " N\n" + << "Mass: " << _mass << " kg\n" + << "Acceleration: " << _acceleration << " m/s^2\n" + << "Angle: " << _angle*DEGREE << " degrees\n"; + return ss.str(); + } + + /** + * method: netForce(const long double totalForces, const long double totalFriction) + * arguments: 1)total forces 2)total friction + * purpose: calculates the forces total including frictions + * returns: long double net force + */ + static long double netForce(const long double totalForces, const long double totalFriction) + { + return totalForces - totalFriction; + } + + /** + * method: gravitational_force_on_mass(long double mass) const + * arguments: mass + * purpose: applies the force of gravity on a mass to give the weight + * returns: long double weight + */ + static long double weight(const long double mass) + { + return mass * GA; + } + + /** + * method: newtons_second_law_for_force(long double mass, long double acceleration) + * arguments: long double mass, long double acceleration + * purpose: uses Newtons second law of motion to calculate the force of a something + * returns: long double, force + */ + static long double force(const long double mass, const long double acceleration) + { + return mass * acceleration; + } + + /// + /// Calculates acceleration from force and mass. + /// + /// The force in Newtons. + /// The mass. + /// acceleration + template + static auto acceleration(const T F, const T m) + { + return F / m; + } + + /** + * method: newtons_second_law_for_mass(long double netForce, long double acceleration) const + * arguments: netForce, acceleration + * purpose:calculates the mass of an object from the force and acceleration + * returns: long double, mass + */ + static long double mass(long double netForce, long double acceleration) + { + return netForce / acceleration; + } + + /** + * method: drag_force(const long double appliedForce, const long double mass, const long double acceleration) + * arguments: 1)appliedForce 2)mass 3)acceleration + * purpose:calculates the drag or resistance + * returns: long double, drag + */ + static long double drag_force(const long double appliedForce, const long double mass, const long double acceleration) + { + return appliedForce - (mass * acceleration); + } + + /** + * method: normal_force(const long double mass, const long double acceleration = GA) + * arguments: 1)mass 2)acceleration + * purpose: calculates the normal force, weight + * returns: long double, normal force + */ + static long double normalForce(const long double mass, const long double acceleration = GA) + { + return mass * acceleration; + } + + /** + * method: normal_force + * _angle(const long double mass, const long double angleTheta) + * arguments: 1)mass 2)acceleration + * purpose: calculates the normal force on an angle + * returns: long double, normal force + */ + static long double normalForce_angleDOWN(const long double mass, const long double angleTheta) + { + return mass * GA * cos(angleTheta * RADIAN); + } + /** + * method: normal_force_angleUp(const long double mass, const long double angleTheta) + * arguments: 1)mass 2)acceleration + * purpose: calculates the normal force on an angle + * returns: long double, normal force + */ + static long double normalForce_angleUP(const long double mass, const long double angleTheta) + { + return mass * GA * sin(angleTheta * RADIAN); + } + + /** + * @brief calculates the normal force on an angle + * @param angleTheta angle in degrees + * @param kC kineticCoefficient + * @returns long double, normal force + */ + static long double acceleration_slope_simpleFriction(const long double angleTheta, const long double kC) + { + return GA * (sin(angleTheta * RADIAN) - (kC * cos(angleTheta * RADIAN))); + } + + /** + * @brief finds the ratio between two numbers + * @param top is the top part of the ratio + * @param bottom is the bottom part of the ratio + * @returns the ratio between two numbers + */ + static long double ratio(const long double top, const long double bottom) + { + return top / bottom; + } + + /** + * @brief calculates the tension on a horizontal rope as it gets hung from + * @param mass in kg of object causing tension + * @returns tension in Newtons + */ + static long double tensionOnSingleStrand(const long double mass) + { + return mass * GA; + } + + /** + * @brief calculates the tension on a horizontal rope as it gets hung from + * @param mass in kg of object causing tension + * @param a acceleration m/s + * @returns tension in Newtons + */ + static long double tensionOnSingleStrandWithAccelerationUpward(const long double mass, const long double a) + { + return (mass * GA) + (mass * a); + } + + /** + * @brief calculates the tension on a horizontal rope as it gets hung from + * @param mass in kg of object causing tension + * @param fCoeff kinetic frictional coefficient + * @param a acceleration m/s + * @returns tension in Newtons + */ + static long double tensionOnSingleStrandWithFrictionWhileAccelerating(const long double mass, const long double fCoeff, const long double a) + { + const long double Nf = mass * GA; + const long double friction_ = fCoeff * Nf; + const long double accF = mass * a; + return friction_ + accF; + } + + /** + * @brief calculates the tension on a horizontal rope as it gets hung from + * @param mass1 in kg of object1 + * @param mass2 in kg of object2 + * @returns tension in Newtons + */ + static long double tensionOnMultipleStrandsIdealPulley(const long double mass1, const long double mass2) + { + return ((2.0*GA)*(mass1*mass2))/(mass1 + mass2); + } + + + /** + * @brief calculates the tension on a horizontal rope as it gets hung from + * @param mass in kg of object1 + * @param theta1 angle side 1 in degrees + * @param theta2 angle side 2 in degrees + * @returns tension in Newtons + */ + static vector + tensionOnMultipleStrandsHangingObject(const long double mass, const long double theta1, + const long double theta2, bool print = false) + { + vector result = { 0.0, 0.0, 0.0 }; + auto mg = mass * GA; + auto T1x = cos(theta1 * RADIAN); + auto T1y = sin(theta1 * RADIAN); + auto T2x = cos(theta2 * RADIAN); + auto T2y = sin(theta2 * RADIAN); + auto T2 = T1x/T2x; + auto temp = T2y*T2+T1y; + auto T1_tot = mg/temp; + auto T2_tot = T1_tot*T2; + result[0] = T1_tot; + result[1] = T2_tot; + result[2] = T1_tot + T2_tot; + + if (print) + { + cout << "Tension on side 1: " << result[0] << endl; + cout << "Tension on side 2: " << result[1] << endl; + cout << "Tension on both sides: " << result[2] << endl; + } + return result; + } + /** + * @brief calculates the tension on a horizontal rope as it gets hung from + * @param mass1 in kg of object1 + * @param mass2 in kg of object2 + * @returns tension in Newtons + */ + static long double tensionOnCableMultipleStrandsMiddle(const long double mass, const long double theta) + { + return (mass * GA)/(2.0*sin(theta*RADIAN)); + } + + /** + * @brief In a front-end collision, a car of mass m with shock-absorbing bumpers can + * withstand a maximum force of f before damage occurs. If the maximum speed + * for a non-damaging collision is v by how much must the bumper be able to + * move relative to the car? + * @param m mass of car + * @param f maximum force of impact on car bumper + * @param v maximum speed of car + * @returns the maximum distance the bumper can move + */ + static long double maxCompression(const long double m, const long double f, const long double v) + { + return (v*v)/(2.0*(f/m)); + } + + /** + * Find an expression for the thrust (force) of a model rocket's engine required + * to accelerate a spacecraft of total mass m from rest on the ground to speed v + * while rising a vertical distance h. + * @param m total mass of spacecraft + * @param v speed of spacecraft + * @param h vertical distance of spacecraft + * @returns the thrust of the rocket's engine + */ + static long double rocketThrust(const long double m, const long double v, const long double h) + { + return m*(GA*((v*v)/(2.0*h))); + } + /** + * Two forces, both in the x-y plane, act on a object of mass m (M) that + * accelerates at acc (L/T^2) in a direction theta counterclockwise from + * the x-axis. One force has magnitude F_1 and points in the +x-direction. + * Find the other force F_2 magnitude and direction. + * @param m mass of object + * @param acc acceleration of object + * @param theta angle of object + * @param F1 magnitude of force 1 + * @returns a vector with the magnitude and direction of force 2 + */ + static vector + forceOnObject(const long double m, const long double acc, const long double theta, + const long double F1, bool print = false){ + vector result = { 0.0, 0.0}; + auto ax = (m*acc*cos(theta*RADIAN) - F1); + auto ay = (m*acc*sin(theta*RADIAN)); + auto F2 = sqrt(ax*ax + ay*ay); + auto theta2 = atan2(ay, ax)*DEGREE; + if(print){ + cout << "F2 = " << F2 << endl; + cout << "theta = " << theta2 << endl; + } + result[0] = F2; + result[1] = theta2; + return result; + } + + /** + * Two forces act on a object of mass m(M) that undergoes acceleration + * ai and aj. If one force is F1i and F1j what's the i and j components + * as well as the magnitude and direction of the other force? + */ + static vector + forceOnObject(const long double m, const long double ai, const long double aj, + const long double F1i, const long double F1j, bool print = false){ + vector result = { 0.0, 0.0, 0.0, 0.0}; + auto F2i = (m*ai) - F1i; + auto F2j = (m*aj) - F1j; + auto F2 = sqrt(F2i*F2i + F2j*F2j); + auto theta2 = atan2(F2j, F2i)*DEGREE; + if(print){ + cout << "F2 = " << F2 << endl; + cout << "theta = " << theta2 << endl; + cout << "F2i = " << F2i << endl; + cout << "F2j = " << F2j << endl; + } + result[0] = F2; + result[1] = theta2; + result[2] = F2i; + result[3] = F2j; + return result; + } + + /** + * At what angle should you tilt an air table (on Earth) to simulate free + * fall at the surface of some other planet, with an acceleration of g? + * @param g acceleration of gravity on other planet + * @return angle of tilt + */ + static long double tiltAngle(const long double g, bool print = false){ + auto theta = asin(g/GA)*DEGREE; + if(print){ + cout << "theta = " << theta << endl; + } + return theta; + } + + /** + * A skier starts from rest at the top of a slope at angel of theta and that + * is d long. Neglecting friction, how long does it take to reach the bottom? + */ + static long double skierTime(const long double theta, const long double d, bool print = false){ + auto a = GA*sin(theta*RADIAN); + auto t = sqrt(2.0*d/a); + if(print){ + cout << "t = " << t << endl; + } + return t; + } + + /** + * @brief Your baby sister of mass m_s(M) pulls on the bottom of the tablecloth with + * all her weight. On the table, distance d(L) from the edge, is a roast + * turkey of mass m_t(M). \n + * (a) What's the turkey's acceleration? + * (b) From the time your sister starts pulling, how long do you have to + * intervene before the turkey goes over the edge? Neglect friction. + */ + static vector tablecloth(const long double m_s, const long double m_t, const long double d, bool print = false){ + vector result = { 0.0, 0.0}; + auto a = (m_s*GA)/(m_s+m_t); + auto t = sqrt(2.0*d/a); + if(print){ + cout << "acceleration = " << a << endl; + cout << "time to save = " << t << endl; + } + result[0] = a; + result[1] = t; + return result; + } + + static long double + acceleration2masses(const long double m_1, const long double theta_1, + const long double m_2, const long double theta_2, + bool print = false){ + auto a = + ((m_1*GA*sin(theta_1*RADIAN)) + (m_2*GA*sin(theta_2*RADIAN))) + / (m_1+m_2); + if(print){ + cout << "acceleration = " << a << endl; + } + return a; + } + + static long double + forceToKeepMassInCircularPath(const long double m, const long double r, + const long double periodT, bool print = false){ + auto F = (4.0*(PI_*PI_)*m*r)/(periodT*periodT); + if(print){ + cout << "F = " << F << endl; + } + return F; + } + + + Forces operator+(const Forces& other) const + { + Forces result; + // add two forces using the triangular method a2 = b2 + c2 - 2*b*c*Cos (A) + auto ax = this->_force * cos(this->_angle*RADIAN); + auto ay = this->_force * sin(this->_angle*RADIAN); + auto bx = other._force * cos(other._angle*RADIAN); + auto by = other._force * sin(other._angle*RADIAN); + auto totX = ax + bx; + auto totY = ay + by; + result._force = sqrt(totX * totX + totY * totY); + result._angle = atan2(totY, totX); + return result; + } + // overload the - operator to subtract two Forces objects + Forces operator-(const Forces& other) const + { + Forces result; + // subtract two forces using the triangular method a2 = b2 + c2 - 2*b*c*Cos (A) + auto ax = this->_force * cos(this->_angle*RADIAN); + auto ay = this->_force * sin(this->_angle*RADIAN); + auto bx = other._force * cos(other._angle*RADIAN); + auto by = other._force * sin(other._angle*RADIAN); + auto totX = ax - bx; + auto totY = ay - by; + result._force = sqrt(totX * totX + totY * totY); + result._angle = atan2(totY, totX); + return result; + } + + + ~Forces() + { + countDecrease(); + } + // overload the << operator + friend ostream& operator<<(ostream& os, const Forces& f) { + os << "Forces: " << endl; + os << f.toString(); + return os; + } + + +private: + long double _force; + long double _acceleration; + long double _mass; + long double _angle; + static void countIncrease() { forces_objectCount += 1; } + static void countDecrease() { forces_objectCount -= 1; } + +}; + +#endif //PHYSICSFORMULA_FORCES_H diff --git a/Friction.h b/Friction.h index 67b8f72..6c61f5c 100644 --- a/Friction.h +++ b/Friction.h @@ -1,282 +1,282 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_FRICTION_H -#define PHYSICSFORMULA_FRICTION_H -#include -#include -// class for doing physics problems -// author: Ryan Zurrin -// last Modified: 10/11/2020 - -typedef long double ld; -//Gravitational Constant 6.67408(31) * 10^(-11) * N -constexpr auto _GRAV_CONSTANT_ = 6.67408e-11; //N m^2 kg^-2 -//Acceleration due to gravity = 9.81 -constexpr auto _G_ = 9.81; //m/s^2 -//pi = 3.14159265359 -constexpr auto _PI = 3.14159265359; //radians -// convert radian value to degrees -constexpr auto _DEGREE_ = 180 / _PI; //degrees -//convert degrees to radian value -constexpr auto _RADIAN_ = _PI / 180; //radians - -//static object counter for class -static int friction_objectCount = 0; - -// static friction coefficients -static struct FrictionCoefficient -{ - struct StaticCoefficient - { - const ld rubber_on_concrete_dry = 1.0;//returns 1.0 - const ld rubber_on_concrete_wet = .7; //returns 0.7 - const ld wood_on_wood = .5; //returns 0.5 - const ld waxedWood_on_wetSnow = .14; //returns 0.14 - const ld metal_on_wood = .5; //returns 0.5 - const ld steel_on_steel_dry = .6; //returns 0.6 - const ld steel_on_steel_oiled = .05; //returns 0.05 - const ld teflon_on_steel = .04; //returns 0.04 - const ld bone_on_lubricated_synovial_fluid = .016; //returns 0.016 - const ld shoes_on_wood = .9; //returns 0.9 - const ld shoes_on_ice = .1; //returns 0.1 - const ld ice_on_ice = .1; //returns 0.1 - const ld steel_on_ice = 0.4; // returns 0.4 - }staticFriction; - - // Kinetic friction coefficients - struct KineticCoefficient - { - const ld rubber_on_concrete_dry = .7; //returns 0.7 - const ld rubber_on_concrete_wet = .5; //returns 0.5 - const ld wood_on_wood = .3; //return 0.3 - const ld waxedWood_on_wetSnow = .1;//return 0.1 - const ld metal_on_wood = .3; //returns 0.3 - const ld steel_on_steel_dry = .3; //returns 0.3 - const ld steel_on_steel_oiled = .03; //return 0.03 - const ld teflon_on_steel = .4; //return 0.4 - const ld bone_on_lubricated_synovial_fluid = .015; //returns 0.015 - const ld shoes_on_wood = .5; //returns 0.5 - const ld shoes_on_ice = .5; //return 0.5 - const ld ice_on_ice = .03; //return 0.03 - const ld steel_on_ice = .04; // return .04 - }kineticFriction; - -}friction; - - - -class Friction -{ - -public: - static void countShow() { std::cout << "friction count: " - << friction_objectCount << std::endl; } - void displayFrictionalCoefficients()const { - cout << "static coefficient: " << _staticCoefficient_ << endl; - cout << "kinetic coefficient: " << _kineticCoefficient_ << endl; - } - - - // constructor - Friction() - { - _staticCoefficient_ = 0.0; - _kineticCoefficient_ = 0.0; - countIncrease(); - //countShow(); - } - - Friction(ld sc, ld kc) - { - _staticCoefficient_ = sc; - _kineticCoefficient_ = kc; - countIncrease(); - } - - // copy constructor - Friction(const Friction& f) - { - _staticCoefficient_ = f._staticCoefficient_; - _kineticCoefficient_ = f._kineticCoefficient_; - countIncrease(); - //countShow(); - } - - /** - * Returns the calculated force of friction, which is the same as the force - * @param mass - * @param coefficient of friction - * @returns frictional force - */ - static ld friction_force(const ld mass, const ld coefficient) - { - return coefficient * mass * _G_; - } - - /** - * Returns the friction coefficient using the Normal Force and the Friction Force as known data - * @param normalForce is the amount of normal force found by multiplying mass(kg) * 9.8 (m/s^2) - * @param frictionForce is the amount of force the friction is pushing back against something. - * @returns the frictional coefficient of objects in question - */ - static ld friction_coefficient(const ld normalForce, const ld frictionForce) - { - return (frictionForce) / (normalForce); - } - - /** - * Returns the acceleration of an object taking into account its mass and the frictional coefficient - * of the materials. - * @param mass in kg - * @param frictionCoefficient of the materials - * @returns magnitude of the acceleration of an object - */ - static ld acceleration_magnitude(const ld mass, const ld frictionCoefficient) - { - const ld normalForce = mass * _G_; - const ld frictionForce = normalForce * frictionCoefficient; - return frictionForce / mass; - } - - /** - * Returns the initial velocity when giving the amount of time it takes something - * to come to a stop - * @param mass of object in kg - * @param frictionCoefficient for the materials in consideration - * @param time in seconds it took to come to a stop - * @returns initial velocity - */ - static ld initial_velocity(const ld mass, const ld frictionCoefficient, const ld time) - { - const ld normalForce = mass * _G_; - const ld frictionForce = normalForce * frictionCoefficient; - const ld acceleration = frictionForce / mass; - return acceleration * time; - } - - /** - * method: acceleration_slope_friction(const ld angleTheta, const ld kineticCoefficient) - * arguments: 1)angleTheta 2)kineticCoefficient - * purpose: calculates the normal force on an angle - * returns: ld, normal force - */ - static ld acceleration_down_slope_friction(const ld angleTheta, const ld kineticCoefficient) - { - return _G_ * (sin(angleTheta * _RADIAN_) - (kineticCoefficient * cos(angleTheta * _RADIAN_))); - } - - /** - * method: acceleration_up_slope_friction(const ld angleTheta, const ld frictionalCoefficient) - * arguments: 1)angleTheta 2)frictionalCoefficient - * purpose: calculates the acceleration of an object going up a slope, like a 4 wheel drive car - * returns: ld, acceleration - */ - static ld acceleration_up_slope_friction(const ld angleTheta, const ld frictionalCoefficient) - { - return _G_ * ((frictionalCoefficient*cos(angleTheta * _RADIAN_) - sin(angleTheta*_RADIAN_))); - } - - /** - * method: car2wheel_acceleration_up_slope_friction(const ld angleTheta, const ld kineticCoefficient) - * arguments: 1)angleTheta 2)kineticCoefficient - * purpose: calculates the normal force on an angle - * returns: ld, normal force - */ - static ld car2wheel_acceleration_up_slope_friction(const ld angleTheta, const ld kineticCoefficient) - { - return _G_ * ((kineticCoefficient*cos(angleTheta*_RADIAN_)/2)-(sin(angleTheta * _RADIAN_))); - } - - /** - * method: tension_rope_rockClimber(const ld angleRope, const ld angleLegs, const ld mass) - * arguments: 1)angleRope 2)angleLegs 3)mass - * purpose: calculates the tension on a rope from a hanging rock climber or similar situation - * returns: ld, tension force - */ - static ld tension_rope_rockClimber(const ld angleRope, const ld angleLegs, const ld mass) - { - return (mass * _G_) / (cos(angleRope*_RADIAN_) + sin(angleRope*_RADIAN_) * tan(angleLegs*_RADIAN_)); - } - - /** - * method: tension_legs_rockClimber(const ld angleRope, const ld angleLegs, const ld mass) - * arguments: 1)angleRope 2)angleLegs 3)mass - * purpose: calculates the tension on a rope from a hanging rock climber or similar situation - * returns: ld, tension force on legs - */ - static ld tension_legs_rockClimber(const ld angleRope, const ld angleLegs, const ld mass) - { - return (tension_rope_rockClimber(angleRope, angleLegs, mass)*sin(angleRope*_RADIAN_)/cos(angleLegs*_RADIAN_)); - } - - /** - * method: minimum_force_start_move_push(const ld mass, const ld pushAngle, const ld frictionCoefficient) - * arguments: 1)mass 2)pushAngle 3)frictionCoefficient - * purpose: calculates the minimum force it takes to start moving an object pushing at a downward angle - * returns: ld, minimum force to start moving block - */ - static ld minimum_force_start_move_downPush(const ld mass, const ld pushAngle, const ld staticCoefficient) - { - return (staticCoefficient * mass*_G_) / (cos(pushAngle*_RADIAN_)- staticCoefficient * sin(pushAngle*_RADIAN_)); - } - - /** - * method: magnitude_acceleration_moving_object_downPush(const ld mass, const ld pushAngle, const ld frictionCoefficient) - * arguments: 1)mass 2)pushAngle 3)frictionCoefficient - * purpose: calculates the acceleration of the object once it starts moving if force is maintained - * returns: ld, acceleration - */ - static ld magnitude_acceleration_moving_object_downPush(const ld mass, const ld pushAngle, const ld kineticCoefficient, const ld staticCoefficient) - { - return ((minimum_force_start_move_downPush(mass, pushAngle, staticCoefficient) * cos(pushAngle*_RADIAN_) - kineticCoefficient *sin(pushAngle*_RADIAN_))-(kineticCoefficient)*mass*_G_)/(mass); - } - - /** - * method: minimum_force_start_move_upPull(const ld mass, const ld pullAngle, const static ldCoefficient) - * arguments: 1)mass 2)pushAngle 3)frictionCoefficient - * purpose: calculates the minimum force it takes to start moving an object pulling on it upward by a rope - * returns: ld, minimum force to start moving block fro pulling up - */ - static ld minimum_force_start_move_upPull(const ld mass, const ld pullAngle, const ld staticCoefficient) - { - return (staticCoefficient*mass*_G_)/(cos(pullAngle*_RADIAN_) + staticCoefficient*sin(pullAngle*_RADIAN_)); - } - - /** - * method: magnitude_acceleration_moving_object_pullingUp(const ld mass, const ld pullAngle, const ld kineticCoefficient) - * arguments: 1)mass 2)pushAngle 3)frictionCoefficient - * purpose: calculates the minimum force it takes to start moving an object pulling on it upward by a rope - * returns: ld, minimum force to start moving block fro pulling up - */ - static ld magnitude_acceleration_moving_object_pullingUp(const ld mass, const ld pullAngle, const ld kineticCoefficient, const ld maintainingForce) - { - ld a, b; - a = maintainingForce * cos(pullAngle * _RADIAN_); - b = kineticCoefficient * ((mass * _G_) - maintainingForce * sin(pullAngle * _RADIAN_)); - return (a-b)/(mass); - } - - void setKineticCoefficient(ld val) { _kineticCoefficient_ = val; } - void setStaticCoefficient(ld val) { _staticCoefficient_ = val; } - ld staticCoefficient() { return _staticCoefficient_; } - ld kineticCoefficient() { return _kineticCoefficient_; } - - // destructor - ~Friction() - { - countDecrease(); - //countShow(); - } - -private: - ld _kineticCoefficient_; - ld _staticCoefficient_; - map frictionCoeffMap; - static void countIncrease() { friction_objectCount += 1; } - static void countDecrease() { friction_objectCount -= 1; } - -}; - -#endif //PHYSICSFORMULA_FRICTION_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_FRICTION_H +#define PHYSICSFORMULA_FRICTION_H +#include +#include +// class for doing physics problems +// author: Ryan Zurrin +// last Modified: 10/11/2020 + +typedef long double ld; +//Gravitational Constant 6.67408(31) * 10^(-11) * N +constexpr auto _GRAV_CONSTANT_ = 6.67408e-11; //N m^2 kg^-2 +//Acceleration due to gravity = 9.81 +constexpr auto _G_ = 9.81; //m/s^2 +//pi = 3.14159265359 +constexpr auto _PI = 3.14159265359; //radians +// convert radian value to degrees +constexpr auto _DEGREE_ = 180 / _PI; //degrees +//convert degrees to radian value +constexpr auto _RADIAN_ = _PI / 180; //radians + +//static object counter for class +static int friction_objectCount = 0; + +// static friction coefficients +static struct FrictionCoefficient +{ + struct StaticCoefficient + { + const ld rubber_on_concrete_dry = 1.0;//returns 1.0 + const ld rubber_on_concrete_wet = .7; //returns 0.7 + const ld wood_on_wood = .5; //returns 0.5 + const ld waxedWood_on_wetSnow = .14; //returns 0.14 + const ld metal_on_wood = .5; //returns 0.5 + const ld steel_on_steel_dry = .6; //returns 0.6 + const ld steel_on_steel_oiled = .05; //returns 0.05 + const ld teflon_on_steel = .04; //returns 0.04 + const ld bone_on_lubricated_synovial_fluid = .016; //returns 0.016 + const ld shoes_on_wood = .9; //returns 0.9 + const ld shoes_on_ice = .1; //returns 0.1 + const ld ice_on_ice = .1; //returns 0.1 + const ld steel_on_ice = 0.4; // returns 0.4 + }staticFriction; + + // Kinetic friction coefficients + struct KineticCoefficient + { + const ld rubber_on_concrete_dry = .7; //returns 0.7 + const ld rubber_on_concrete_wet = .5; //returns 0.5 + const ld wood_on_wood = .3; //return 0.3 + const ld waxedWood_on_wetSnow = .1;//return 0.1 + const ld metal_on_wood = .3; //returns 0.3 + const ld steel_on_steel_dry = .3; //returns 0.3 + const ld steel_on_steel_oiled = .03; //return 0.03 + const ld teflon_on_steel = .4; //return 0.4 + const ld bone_on_lubricated_synovial_fluid = .015; //returns 0.015 + const ld shoes_on_wood = .5; //returns 0.5 + const ld shoes_on_ice = .5; //return 0.5 + const ld ice_on_ice = .03; //return 0.03 + const ld steel_on_ice = .04; // return .04 + }kineticFriction; + +}friction; + + + +class Friction +{ + +public: + static void countShow() { std::cout << "friction count: " + << friction_objectCount << std::endl; } + void displayFrictionalCoefficients()const { + cout << "static coefficient: " << _staticCoefficient_ << endl; + cout << "kinetic coefficient: " << _kineticCoefficient_ << endl; + } + + + // constructor + Friction() + { + _staticCoefficient_ = 0.0; + _kineticCoefficient_ = 0.0; + countIncrease(); + //countShow(); + } + + Friction(ld sc, ld kc) + { + _staticCoefficient_ = sc; + _kineticCoefficient_ = kc; + countIncrease(); + } + + // copy constructor + Friction(const Friction& f) + { + _staticCoefficient_ = f._staticCoefficient_; + _kineticCoefficient_ = f._kineticCoefficient_; + countIncrease(); + //countShow(); + } + + /** + * Returns the calculated force of friction, which is the same as the force + * @param mass + * @param coefficient of friction + * @returns frictional force + */ + static ld friction_force(const ld mass, const ld coefficient) + { + return coefficient * mass * _G_; + } + + /** + * Returns the friction coefficient using the Normal Force and the Friction Force as known data + * @param normalForce is the amount of normal force found by multiplying mass(kg) * 9.8 (m/s^2) + * @param frictionForce is the amount of force the friction is pushing back against something. + * @returns the frictional coefficient of objects in question + */ + static ld friction_coefficient(const ld normalForce, const ld frictionForce) + { + return (frictionForce) / (normalForce); + } + + /** + * Returns the acceleration of an object taking into account its mass and the frictional coefficient + * of the materials. + * @param mass in kg + * @param frictionCoefficient of the materials + * @returns magnitude of the acceleration of an object + */ + static ld acceleration_magnitude(const ld mass, const ld frictionCoefficient) + { + const ld normalForce = mass * _G_; + const ld frictionForce = normalForce * frictionCoefficient; + return frictionForce / mass; + } + + /** + * Returns the initial velocity when giving the amount of time it takes something + * to come to a stop + * @param mass of object in kg + * @param frictionCoefficient for the materials in consideration + * @param time in seconds it took to come to a stop + * @returns initial velocity + */ + static ld initial_velocity(const ld mass, const ld frictionCoefficient, const ld time) + { + const ld normalForce = mass * _G_; + const ld frictionForce = normalForce * frictionCoefficient; + const ld acceleration = frictionForce / mass; + return acceleration * time; + } + + /** + * method: acceleration_slope_friction(const ld angleTheta, const ld kineticCoefficient) + * arguments: 1)angleTheta 2)kineticCoefficient + * purpose: calculates the normal force on an angle + * returns: ld, normal force + */ + static ld acceleration_down_slope_friction(const ld angleTheta, const ld kineticCoefficient) + { + return _G_ * (sin(angleTheta * _RADIAN_) - (kineticCoefficient * cos(angleTheta * _RADIAN_))); + } + + /** + * method: acceleration_up_slope_friction(const ld angleTheta, const ld frictionalCoefficient) + * arguments: 1)angleTheta 2)frictionalCoefficient + * purpose: calculates the acceleration of an object going up a slope, like a 4 wheel drive car + * returns: ld, acceleration + */ + static ld acceleration_up_slope_friction(const ld angleTheta, const ld frictionalCoefficient) + { + return _G_ * ((frictionalCoefficient*cos(angleTheta * _RADIAN_) - sin(angleTheta*_RADIAN_))); + } + + /** + * method: car2wheel_acceleration_up_slope_friction(const ld angleTheta, const ld kineticCoefficient) + * arguments: 1)angleTheta 2)kineticCoefficient + * purpose: calculates the normal force on an angle + * returns: ld, normal force + */ + static ld car2wheel_acceleration_up_slope_friction(const ld angleTheta, const ld kineticCoefficient) + { + return _G_ * ((kineticCoefficient*cos(angleTheta*_RADIAN_)/2)-(sin(angleTheta * _RADIAN_))); + } + + /** + * method: tension_rope_rockClimber(const ld angleRope, const ld angleLegs, const ld mass) + * arguments: 1)angleRope 2)angleLegs 3)mass + * purpose: calculates the tension on a rope from a hanging rock climber or similar situation + * returns: ld, tension force + */ + static ld tension_rope_rockClimber(const ld angleRope, const ld angleLegs, const ld mass) + { + return (mass * _G_) / (cos(angleRope*_RADIAN_) + sin(angleRope*_RADIAN_) * tan(angleLegs*_RADIAN_)); + } + + /** + * method: tension_legs_rockClimber(const ld angleRope, const ld angleLegs, const ld mass) + * arguments: 1)angleRope 2)angleLegs 3)mass + * purpose: calculates the tension on a rope from a hanging rock climber or similar situation + * returns: ld, tension force on legs + */ + static ld tension_legs_rockClimber(const ld angleRope, const ld angleLegs, const ld mass) + { + return (tension_rope_rockClimber(angleRope, angleLegs, mass)*sin(angleRope*_RADIAN_)/cos(angleLegs*_RADIAN_)); + } + + /** + * method: minimum_force_start_move_push(const ld mass, const ld pushAngle, const ld frictionCoefficient) + * arguments: 1)mass 2)pushAngle 3)frictionCoefficient + * purpose: calculates the minimum force it takes to start moving an object pushing at a downward angle + * returns: ld, minimum force to start moving block + */ + static ld minimum_force_start_move_downPush(const ld mass, const ld pushAngle, const ld staticCoefficient) + { + return (staticCoefficient * mass*_G_) / (cos(pushAngle*_RADIAN_)- staticCoefficient * sin(pushAngle*_RADIAN_)); + } + + /** + * method: magnitude_acceleration_moving_object_downPush(const ld mass, const ld pushAngle, const ld frictionCoefficient) + * arguments: 1)mass 2)pushAngle 3)frictionCoefficient + * purpose: calculates the acceleration of the object once it starts moving if force is maintained + * returns: ld, acceleration + */ + static ld magnitude_acceleration_moving_object_downPush(const ld mass, const ld pushAngle, const ld kineticCoefficient, const ld staticCoefficient) + { + return ((minimum_force_start_move_downPush(mass, pushAngle, staticCoefficient) * cos(pushAngle*_RADIAN_) - kineticCoefficient *sin(pushAngle*_RADIAN_))-(kineticCoefficient)*mass*_G_)/(mass); + } + + /** + * method: minimum_force_start_move_upPull(const ld mass, const ld pullAngle, const static ldCoefficient) + * arguments: 1)mass 2)pushAngle 3)frictionCoefficient + * purpose: calculates the minimum force it takes to start moving an object pulling on it upward by a rope + * returns: ld, minimum force to start moving block fro pulling up + */ + static ld minimum_force_start_move_upPull(const ld mass, const ld pullAngle, const ld staticCoefficient) + { + return (staticCoefficient*mass*_G_)/(cos(pullAngle*_RADIAN_) + staticCoefficient*sin(pullAngle*_RADIAN_)); + } + + /** + * method: magnitude_acceleration_moving_object_pullingUp(const ld mass, const ld pullAngle, const ld kineticCoefficient) + * arguments: 1)mass 2)pushAngle 3)frictionCoefficient + * purpose: calculates the minimum force it takes to start moving an object pulling on it upward by a rope + * returns: ld, minimum force to start moving block fro pulling up + */ + static ld magnitude_acceleration_moving_object_pullingUp(const ld mass, const ld pullAngle, const ld kineticCoefficient, const ld maintainingForce) + { + ld a, b; + a = maintainingForce * cos(pullAngle * _RADIAN_); + b = kineticCoefficient * ((mass * _G_) - maintainingForce * sin(pullAngle * _RADIAN_)); + return (a-b)/(mass); + } + + void setKineticCoefficient(ld val) { _kineticCoefficient_ = val; } + void setStaticCoefficient(ld val) { _staticCoefficient_ = val; } + ld staticCoefficient() { return _staticCoefficient_; } + ld kineticCoefficient() { return _kineticCoefficient_; } + + // destructor + ~Friction() + { + countDecrease(); + //countShow(); + } + +private: + ld _kineticCoefficient_; + ld _staticCoefficient_; + map frictionCoeffMap; + static void countIncrease() { friction_objectCount += 1; } + static void countDecrease() { friction_objectCount -= 1; } + +}; + +#endif //PHYSICSFORMULA_FRICTION_H diff --git a/GeoUtils.cpp b/GeoUtils.cpp index 539a875..dc2160d 100644 --- a/GeoUtils.cpp +++ b/GeoUtils.cpp @@ -1,374 +1,374 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#include "GeoUtils.h" -#include -#include -#include -#include -#include - -#include "Intersection.h" - -// This can be only used in 2d XY plane. -// TODO has to modify to consider the 3D plane as well - -//template -//static int orientation( const rez::Vector&a, const rez::Vector& b, const rez::Vector& c) -//{ -// float area = areaTriangle2d(a, b, c); -// -// if (area > 0 && area < TOLERANCE) -// area = 0; -// -// if (area < 0 && area > TOLERANCE) -// area = 0; -// -// auto ab = b - a; -// auto ac = c - a; -// -// if (area > 0.0) -// return LEFT; -// if (area < 0.0) -// return RIGHT; -// if ((ab[X] * ac[X] < 0.0) || (ab[Y] * ac[Y] < 0.0)) -// return BEHIND; -// if (ab.magnitude() < ac.magnitude()) -// return BEYOND; -// if (a == c) -// return ORIGIN; -// if (b == c) -// return DESTINATION; -// return BETWEEN; -// -// return 0; -//} - - -int rez::orientation3d(const Point3d& a, const Point3d& b, const Point3d& c) -{ - float area = areaTriangle3d(a, b, c); - - if (area > 0 && area < TOLERANCE) - area = 0; - - if (area < 0 && area > TOLERANCE) - area = 0; - - Point3d p1 = b - a; - Point3d p2 = c - a; - - double p1x, p1y, p2x, p2y; - - p1x = p1[X]; - p1y = p1[Y]; - p2x = p2[X]; - p2y = p2[Y]; - - if (area > 0.0) - return LEFT; - if (area < 0.0) - return RIGHT; - if ((p1x * p2x < 0.0) || (p1y * p2y < 0.0)) - return BEHIND; - if (p1.magnitude() < p2.magnitude()) - return BEYOND; - if (a == c) - return ORIGIN; - if (b == c) - return DESTINATION; - return BETWEEN; - - return 0; -} - -//int rez::orientation3d(const Point3d& a, const Point3d& b, const Point3d& c) -//{ -// return orientation(a,b,c); -//} - -int rez::orientation2d(const Point2d& a, const Point2d& b, const Point2d& c) -{ - float area = areaTriangle2d(a, b, c); - - if (area > 0 && area < TOLERANCE) - area = 0; - - if (area < 0 && area > TOLERANCE) - area = 0; - - Vector2f ab = b - a; - Vector2f ac = c - a; - - if (area > 0.0) - return LEFT; - if (area < 0.0) - return RIGHT; - if ((ab[X] * ac[X] < 0.0) || (ab[Y] * ac[Y] < 0.0)) - return BEHIND; - if (ab.magnitude() < ac.magnitude()) - return BEYOND; - if (a == c) - return ORIGIN; - if (b == c) - return DESTINATION; - return BETWEEN; - - return 0; -} - -//int rez::orientation2d(const Point2d& a, const Point2d& b, const Point2d& c) -//{ -// return orientation(a, b, c); -//} - -bool rez::left(const Point3d& a, const Point3d& b, const Point3d& c) -{ - return orientation3d(a, b, c) == RELATIVE_POSITION::LEFT; -} - -bool rez::left(const Point2d& a, const Point2d& b, const Point2d& c) -{ - return orientation2d(a, b, c) == RELATIVE_POSITION::LEFT; -} - -bool rez::left(const Line2dStd& l, const Point2d& p) -{ - auto line_dir = l.getDir(); - Vector2f line_normal(-line_dir[Y], line_dir[X]); - auto value = dotProduct(line_normal, p); - return (dotProduct(line_normal, p) - l.getD()) < 0 ? false : true; -} - -bool rez::left(const Line2d& l, const Point2d& p) -{ - auto line_normal = l.normal(); - auto value = dotProduct(line_normal, p); - auto d = dotProduct(line_normal, l.point()); - return (dotProduct(line_normal, p) - d) < 0 ? false : true; -} - -bool rez::right(const Point3d& a, const Point3d& b, const Point3d& c) -{ - return orientation3d(a, b, c) == RELATIVE_POSITION::RIGHT; -} - -bool rez::leftOrBeyond(const Point2d& a, const Point2d& b, const Point2d& c) -{ - int position = orientation2d(a, b, c); - return (position == RELATIVE_POSITION::LEFT || position == RELATIVE_POSITION::BEYOND); -} - -bool rez::leftOrBeyond(const Point3d& a, const Point3d& b, const Point3d& c) -{ - int position = orientation3d(a, b, c); - return (position == RELATIVE_POSITION::LEFT || position == RELATIVE_POSITION::BEYOND); -} - -bool rez::leftOrBetween(const Point3d& a, const Point3d& b, const Point3d& c) -{ - int position = orientation3d(a, b, c); - return (position == RELATIVE_POSITION::LEFT || position == RELATIVE_POSITION::BETWEEN); -} - -static bool incone(const rez::Vertex2dSimple* v1, const rez::Vertex2dSimple* v2) -{ - if (rez::leftOrBeyond(v1->point, v1->next->point, v1->prev->point)) { - // v1 is convex vertex - return rez::left(v1->point, v2->point, v1->prev->point) - && rez::left(v2->point, v1->point, v1->next->point); - } - - // v1 is reflex vertex - return !(rez::leftOrBeyond(v1->point, v2->point, v1->next->point) - && rez::leftOrBeyond(v2->point, v1->point, v1->prev->point)); -} - -bool rez::isDiagonal(const Vertex2dSimple* v1, const Vertex2dSimple* v2, Polygon2dSimple* poly) -{ - bool prospect = true; - std::vector vertices; - if (poly) - vertices = poly->getVertcies(); - else { - auto vertex_ptr = v1->next; - vertices.push_back((Vertex2dSimple*)v1); - while (vertex_ptr != v1) { - vertices.push_back(vertex_ptr); - vertex_ptr = vertex_ptr->next; - } - } - - Vertex2dSimple* current, * next; - current = vertices[0]; - do { - next = current->next; - if (current != v1 && next != v1 && current != v2 && next != v2 - && rez::intersect(v1->point, v2->point, current->point, next->point)) { - prospect = false; - break; - } - current = next; - } while (current != vertices[0]); - - return prospect && incone(v1, v2) && incone(v2, v1); -} - -float rez::polarAngle(const Point2d& _other, const Point2d& _ref) -{ - // Consider the given points as 2D ones which are in XY plane - float _x = _other[X] - _ref[X]; - float _y = _other[Y] - _ref[Y]; - - if ((isEqualD(_x, 0.0)) && (isEqualD(_y, 0.0))) - return -1.0; - if (isEqualD(_x, 0.0)) - return ((_y > 0.0) ? 90 : 270); - - double theta = atan(_y / _x); - theta = RadianceToDegrees(theta); - //theta *= 360 / (2 * M_PI); - - if (_x > 0.0) - return ((_y >= 0.0) ? theta : 360 + theta); - else - return (180 + theta); -} - -double rez::areaTriangle2d(const Point3d& a, const Point3d& b, const Point3d& c) -{ - return 0.5 * ((b[X] - a[X]) * (c[Y] - a[Y]) - (c[X] - a[X]) * (b[Y] - a[Y])); -} - -double rez::areaTriangle2d(const Point2d& a, const Point2d& b, const Point2d& c) -{ - return 0.5 * ((b[X] - a[X]) * (c[Y] - a[Y]) - (c[X] - a[X]) * (b[Y] - a[Y])); -} - -double rez::areaTriangle3d(const Point3d& a, const Point3d& b, const Point3d& c) -{ - float x_, y_, z_; - - Vector3f AB = b - a; - Vector3f AC = c - a; - - x_ = AB[Y] * AC[Z] - AB[Z] * AC[Y]; - y_ = AB[X] * AC[Z] - AB[Z] * AC[X]; - z_ = AB[X] * AC[Y] - AB[Y] * AC[X]; - - float sum_of_powers = pow(x_, 2.0) + pow(y_, 2.0) + pow(z_, 2.0); - float root = sqrtf(sum_of_powers); - return root / 2; -} - -int rez::orientation(const Face& _f, const Vector3f& _p) -{ - // If the plane of the face is prependicular to XY plane - // In such case We cannot simply consider as z=0; But we can set either x= 0 or y = 0. - std::vector point_vec; - - for (size_t i = 0; i < _f.vertices.size(); i++) - { - point_vec.push_back(*_f.vertices[i]->point); - } - - Planef plane(point_vec[0], point_vec[1], point_vec[2]); - - /* - Taking the dot product of the normal with a vector from the given view point, V, - to one of the vertices will give you a value whose sign indicates which way the vertices - appear to wind when viewed from V: - */ - - Vector3f PA = point_vec[0] - _p; - float winding_constant = dotProduct(plane.getNormal(), PA); - - // If winding constant is negative, it means from the _p point of view, points in the plane is counter clockwise - if (winding_constant < ZERO) - return CCW; - - return CW; -} - -float rez::FaceVisibility(const Face& _f, const Point3d& _p) -{ - Point3d p1, p2, p3; - p1 = *_f.vertices[0]->point; - p2 = *_f.vertices[1]->point; - p3 = *_f.vertices[2]->point; - - auto a1 = p2 - p1; - auto b1 = p3 - p1; - auto c1 = _p - p1; - - double vol1 = rez::scalerTripleProduct(a1, b1, c1); - return vol1; -} - -float rez::angle(const Vector2f& _v1, const Vector2f& _v2) -{ - float dot = dotProduct(_v1, _v2); - float v1_mag = _v1.magnitude(); - float v2_mag = _v2.magnitude(); - auto deno = v1_mag * v2_mag; - if (isEqualDL(dot, deno)) - return 0; - - return acos(dot / (v1_mag * v2_mag)); -} - -bool rez::isInside(Point3d& _point, std::vector& _points) -{ - return true; -} - -bool rez::isInside(Point3d& _point, std::vector& _faces) -{ - // Before the check we have to confirm the orientaion of the points. (CW or CCW) - - - - return true; -} - -int rez::getClosestPointIndex(Point3d& _point, std::vector& _points) -{ - return 0; -} - -bool rez::collinear(const Point3d& a, const Point3d& b, const Point3d& c) -{ - Vector3f P = b - a; - Vector3f Q = c - a; - - return collinear(P, Q); -} - -bool rez::collinear(const Vector3f& a, const Vector3f& b) -{ - auto v1 = a[X] * b[Y] - a[Y] * b[X]; - auto v2 = a[Y] * b[Z] - a[Z] * b[Y]; - auto v3 = a[X] * b[Z] - a[Z] * b[X]; - - return isEqualD(v1, ZERO) && isEqualD(v2, ZERO) && isEqualD(v3, ZERO); -} - -bool rez::coplaner(const Point3d& a, const Point3d& b, const Point3d& c, const Point3d& d) -{ - Vector3f AB = b - a; - Vector3f AC = c - a; - Vector3f AD = d - a; - return coplaner(AB, AC, AD); -} - -bool rez::coplaner(const Vector3f& _v1, const Vector3f& _v2, const Vector3f& _v3) -{ - float value = scalerTripleProduct(_v1, _v2, _v3); - return isEqualD(value, ZERO); -} - -bool rez::segmentIsLeft(const Segment2d& base, const Segment2d& compare, const Point2d& _point) -{ - return base.get_x(_point[Y]) < compare.get_x(_point[Y]); -} +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#include "GeoUtils.h" +#include +#include +#include +#include +#include + +#include "Intersection.h" + +// This can be only used in 2d XY plane. +// TODO has to modify to consider the 3D plane as well + +//template +//static int orientation( const rez::Vector&a, const rez::Vector& b, const rez::Vector& c) +//{ +// float area = areaTriangle2d(a, b, c); +// +// if (area > 0 && area < TOLERANCE) +// area = 0; +// +// if (area < 0 && area > TOLERANCE) +// area = 0; +// +// auto ab = b - a; +// auto ac = c - a; +// +// if (area > 0.0) +// return LEFT; +// if (area < 0.0) +// return RIGHT; +// if ((ab[X] * ac[X] < 0.0) || (ab[Y] * ac[Y] < 0.0)) +// return BEHIND; +// if (ab.magnitude() < ac.magnitude()) +// return BEYOND; +// if (a == c) +// return ORIGIN; +// if (b == c) +// return DESTINATION; +// return BETWEEN; +// +// return 0; +//} + + +int rez::orientation3d(const Point3d& a, const Point3d& b, const Point3d& c) +{ + float area = areaTriangle3d(a, b, c); + + if (area > 0 && area < TOLERANCE) + area = 0; + + if (area < 0 && area > TOLERANCE) + area = 0; + + Point3d p1 = b - a; + Point3d p2 = c - a; + + double p1x, p1y, p2x, p2y; + + p1x = p1[X]; + p1y = p1[Y]; + p2x = p2[X]; + p2y = p2[Y]; + + if (area > 0.0) + return LEFT; + if (area < 0.0) + return RIGHT; + if ((p1x * p2x < 0.0) || (p1y * p2y < 0.0)) + return BEHIND; + if (p1.magnitude() < p2.magnitude()) + return BEYOND; + if (a == c) + return ORIGIN; + if (b == c) + return DESTINATION; + return BETWEEN; + + return 0; +} + +//int rez::orientation3d(const Point3d& a, const Point3d& b, const Point3d& c) +//{ +// return orientation(a,b,c); +//} + +int rez::orientation2d(const Point2d& a, const Point2d& b, const Point2d& c) +{ + float area = areaTriangle2d(a, b, c); + + if (area > 0 && area < TOLERANCE) + area = 0; + + if (area < 0 && area > TOLERANCE) + area = 0; + + Vector2f ab = b - a; + Vector2f ac = c - a; + + if (area > 0.0) + return LEFT; + if (area < 0.0) + return RIGHT; + if ((ab[X] * ac[X] < 0.0) || (ab[Y] * ac[Y] < 0.0)) + return BEHIND; + if (ab.magnitude() < ac.magnitude()) + return BEYOND; + if (a == c) + return ORIGIN; + if (b == c) + return DESTINATION; + return BETWEEN; + + return 0; +} + +//int rez::orientation2d(const Point2d& a, const Point2d& b, const Point2d& c) +//{ +// return orientation(a, b, c); +//} + +bool rez::left(const Point3d& a, const Point3d& b, const Point3d& c) +{ + return orientation3d(a, b, c) == RELATIVE_POSITION::LEFT; +} + +bool rez::left(const Point2d& a, const Point2d& b, const Point2d& c) +{ + return orientation2d(a, b, c) == RELATIVE_POSITION::LEFT; +} + +bool rez::left(const Line2dStd& l, const Point2d& p) +{ + auto line_dir = l.getDir(); + Vector2f line_normal(-line_dir[Y], line_dir[X]); + auto value = dotProduct(line_normal, p); + return (dotProduct(line_normal, p) - l.getD()) < 0 ? false : true; +} + +bool rez::left(const Line2d& l, const Point2d& p) +{ + auto line_normal = l.normal(); + auto value = dotProduct(line_normal, p); + auto d = dotProduct(line_normal, l.point()); + return (dotProduct(line_normal, p) - d) < 0 ? false : true; +} + +bool rez::right(const Point3d& a, const Point3d& b, const Point3d& c) +{ + return orientation3d(a, b, c) == RELATIVE_POSITION::RIGHT; +} + +bool rez::leftOrBeyond(const Point2d& a, const Point2d& b, const Point2d& c) +{ + int position = orientation2d(a, b, c); + return (position == RELATIVE_POSITION::LEFT || position == RELATIVE_POSITION::BEYOND); +} + +bool rez::leftOrBeyond(const Point3d& a, const Point3d& b, const Point3d& c) +{ + int position = orientation3d(a, b, c); + return (position == RELATIVE_POSITION::LEFT || position == RELATIVE_POSITION::BEYOND); +} + +bool rez::leftOrBetween(const Point3d& a, const Point3d& b, const Point3d& c) +{ + int position = orientation3d(a, b, c); + return (position == RELATIVE_POSITION::LEFT || position == RELATIVE_POSITION::BETWEEN); +} + +static bool incone(const rez::Vertex2dSimple* v1, const rez::Vertex2dSimple* v2) +{ + if (rez::leftOrBeyond(v1->point, v1->next->point, v1->prev->point)) { + // v1 is convex vertex + return rez::left(v1->point, v2->point, v1->prev->point) + && rez::left(v2->point, v1->point, v1->next->point); + } + + // v1 is reflex vertex + return !(rez::leftOrBeyond(v1->point, v2->point, v1->next->point) + && rez::leftOrBeyond(v2->point, v1->point, v1->prev->point)); +} + +bool rez::isDiagonal(const Vertex2dSimple* v1, const Vertex2dSimple* v2, Polygon2dSimple* poly) +{ + bool prospect = true; + std::vector vertices; + if (poly) + vertices = poly->getVertcies(); + else { + auto vertex_ptr = v1->next; + vertices.push_back((Vertex2dSimple*)v1); + while (vertex_ptr != v1) { + vertices.push_back(vertex_ptr); + vertex_ptr = vertex_ptr->next; + } + } + + Vertex2dSimple* current, * next; + current = vertices[0]; + do { + next = current->next; + if (current != v1 && next != v1 && current != v2 && next != v2 + && rez::intersect(v1->point, v2->point, current->point, next->point)) { + prospect = false; + break; + } + current = next; + } while (current != vertices[0]); + + return prospect && incone(v1, v2) && incone(v2, v1); +} + +float rez::polarAngle(const Point2d& _other, const Point2d& _ref) +{ + // Consider the given points as 2D ones which are in XY plane + float _x = _other[X] - _ref[X]; + float _y = _other[Y] - _ref[Y]; + + if ((isEqualD(_x, 0.0)) && (isEqualD(_y, 0.0))) + return -1.0; + if (isEqualD(_x, 0.0)) + return ((_y > 0.0) ? 90 : 270); + + double theta = atan(_y / _x); + theta = RadianceToDegrees(theta); + //theta *= 360 / (2 * M_PI); + + if (_x > 0.0) + return ((_y >= 0.0) ? theta : 360 + theta); + else + return (180 + theta); +} + +double rez::areaTriangle2d(const Point3d& a, const Point3d& b, const Point3d& c) +{ + return 0.5 * ((b[X] - a[X]) * (c[Y] - a[Y]) - (c[X] - a[X]) * (b[Y] - a[Y])); +} + +double rez::areaTriangle2d(const Point2d& a, const Point2d& b, const Point2d& c) +{ + return 0.5 * ((b[X] - a[X]) * (c[Y] - a[Y]) - (c[X] - a[X]) * (b[Y] - a[Y])); +} + +double rez::areaTriangle3d(const Point3d& a, const Point3d& b, const Point3d& c) +{ + float x_, y_, z_; + + Vector3f AB = b - a; + Vector3f AC = c - a; + + x_ = AB[Y] * AC[Z] - AB[Z] * AC[Y]; + y_ = AB[X] * AC[Z] - AB[Z] * AC[X]; + z_ = AB[X] * AC[Y] - AB[Y] * AC[X]; + + float sum_of_powers = pow(x_, 2.0) + pow(y_, 2.0) + pow(z_, 2.0); + float root = sqrtf(sum_of_powers); + return root / 2; +} + +int rez::orientation(const Face& _f, const Vector3f& _p) +{ + // If the plane of the face is prependicular to XY plane + // In such case We cannot simply consider as z=0; But we can set either x= 0 or y = 0. + std::vector point_vec; + + for (size_t i = 0; i < _f.vertices.size(); i++) + { + point_vec.push_back(*_f.vertices[i]->point); + } + + Planef plane(point_vec[0], point_vec[1], point_vec[2]); + + /* + Taking the dot product of the normal with a vector from the given view point, V, + to one of the vertices will give you a value whose sign indicates which way the vertices + appear to wind when viewed from V: + */ + + Vector3f PA = point_vec[0] - _p; + float winding_constant = dotProduct(plane.getNormal(), PA); + + // If winding constant is negative, it means from the _p point of view, points in the plane is counter clockwise + if (winding_constant < ZERO) + return CCW; + + return CW; +} + +float rez::FaceVisibility(const Face& _f, const Point3d& _p) +{ + Point3d p1, p2, p3; + p1 = *_f.vertices[0]->point; + p2 = *_f.vertices[1]->point; + p3 = *_f.vertices[2]->point; + + auto a1 = p2 - p1; + auto b1 = p3 - p1; + auto c1 = _p - p1; + + double vol1 = rez::scalerTripleProduct(a1, b1, c1); + return vol1; +} + +float rez::angle(const Vector2f& _v1, const Vector2f& _v2) +{ + float dot = dotProduct(_v1, _v2); + float v1_mag = _v1.magnitude(); + float v2_mag = _v2.magnitude(); + auto deno = v1_mag * v2_mag; + if (isEqualDL(dot, deno)) + return 0; + + return acos(dot / (v1_mag * v2_mag)); +} + +bool rez::isInside(Point3d& _point, std::vector& _points) +{ + return true; +} + +bool rez::isInside(Point3d& _point, std::vector& _faces) +{ + // Before the check we have to confirm the orientaion of the points. (CW or CCW) + + + + return true; +} + +int rez::getClosestPointIndex(Point3d& _point, std::vector& _points) +{ + return 0; +} + +bool rez::collinear(const Point3d& a, const Point3d& b, const Point3d& c) +{ + Vector3f P = b - a; + Vector3f Q = c - a; + + return collinear(P, Q); +} + +bool rez::collinear(const Vector3f& a, const Vector3f& b) +{ + auto v1 = a[X] * b[Y] - a[Y] * b[X]; + auto v2 = a[Y] * b[Z] - a[Z] * b[Y]; + auto v3 = a[X] * b[Z] - a[Z] * b[X]; + + return isEqualD(v1, ZERO) && isEqualD(v2, ZERO) && isEqualD(v3, ZERO); +} + +bool rez::coplaner(const Point3d& a, const Point3d& b, const Point3d& c, const Point3d& d) +{ + Vector3f AB = b - a; + Vector3f AC = c - a; + Vector3f AD = d - a; + return coplaner(AB, AC, AD); +} + +bool rez::coplaner(const Vector3f& _v1, const Vector3f& _v2, const Vector3f& _v3) +{ + float value = scalerTripleProduct(_v1, _v2, _v3); + return isEqualD(value, ZERO); +} + +bool rez::segmentIsLeft(const Segment2d& base, const Segment2d& compare, const Point2d& _point) +{ + return base.get_x(_point[Y]) < compare.get_x(_point[Y]); +} diff --git a/GeoUtils.h b/GeoUtils.h index 4a3e405..7eade52 100644 --- a/GeoUtils.h +++ b/GeoUtils.h @@ -1,109 +1,109 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_GEOUTILS_H -#define PHYSICSFORMULA_GEOUTILS_H - -#include -#include "Intersection.h" -#include "Point.h" -#include "Line.h" -#include "Plane.h" -#include "Segment.h" -#include "Polygon.h" -#include "Polyhedron.h" -#include "PolygonDCEL.h" - -namespace rez -{ - // Return integer indicating relative position of [Point c] related to segment [a b] - // This is only for 2D in XY plane. - int orientation3d(const Point3d& a, const Point3d& b, const Point3d& c); - - int orientation2d(const Point2d& a, const Point2d& b, const Point2d& c); - - // Predicate to determine whether the [Point c] is left to the segment [a b] - bool left(const Point3d& a, const Point3d& b, const Point3d& c); - - // Predicate to determine whether the [Point c] is left to the segment [a b] - bool left(const Point2d& a, const Point2d& b, const Point2d& c); - - bool left(const Line2dStd& l, const Point2d& p); - - bool left(const Line2d& l, const Point2d& p); - - // Predicate to determine whether the [Point c] is right to the segment [a b] - bool right(const Point3d& a, const Point3d& b, const Point3d& c); - - // Predicate to determine whether the[Point c] is left to the segment[a b] - bool leftOrBeyond(const Point2d& a, const Point2d& b, const Point2d& c); - - // Predicate to determine whether the [Point c] is left to the segment [a b] - bool leftOrBeyond(const Point3d& a, const Point3d& b, const Point3d& c); - - // Predicate to determine whether the [Point c] is left to or between the segment [a b] - bool leftOrBetween(const Point3d& a, const Point3d& b, const Point3d& c); - - // Return true if the v1-v2 is a diagonal. Use to poly to get the vertice list - bool isDiagonal(const Vertex2dSimple* v1, const Vertex2dSimple* v2, Polygon2dSimple* poly = nullptr); - - // Returns counter clockwise angle (0 - 360) measure from referece point to the give point - float polarAngle(const Point2d& _other, const Point2d& _ref); - - // Return the area of the triangle defined by given 3 points - // TODO change the parameter types form 3d to 2d - double areaTriangle2d(const Point3d& a, const Point3d& b, const Point3d& c); - - // Return the area of the triangle defined by given 3 points in XY 2D space - double areaTriangle2d(const Point2d& a, const Point2d& b, const Point2d& c); - - // Return the area of the triangle defined by given 3 points - double areaTriangle3d(const Point3d& a, const Point3d& b, const Point3d& c); - - float volume(const Point3d& a, const Face& f); - - // Return the orientation of the points in the Face f. CW or CCW - int orientation(const Face& f, const Vector3f& p); - - // Return the signed area of the tetrahedron. - // Assume the face vertices are in CCW order; - float FaceVisibility(const Face& _f, const Point3d& _p); - - // Return the angle between two vectors - float angle(const Vector2f& _v1, const Vector2f& _v2); - - // Return whether the [point] is inside the polygon represented by [_points]. - // Note that the check assume that [_points] are in counter clockwise order - // TODO : Better if we can check this on polygon - bool isInside(Point3d& _point, std::vector& _points); - - // Return whether the [point] is inside the polyhedron represented by [_faces] list - bool isInside(Point3d& _point, std::vector& _faces); - - // Return the index of the point closest to the [_point] from [_points] - // TODO : Better if we can check this on polygon - int getClosestPointIndex(Point3d& _point, std::vector& _points); - - // Check the collinearity of given three points in 3D. - bool collinear(const Point3d& a, const Point3d& b, const Point3d& c); - - // Check whether the given two vectors are collinear - bool collinear(const Vector3f& a, const Vector3f& b); - - // Check the coplaness of given four points in 3D. - // The three vectors are coplanar if their scalar triple product is zero. - bool coplaner(const Point3d& a, const Point3d& b, const Point3d& c, const Point3d& d); - - // Check whether the given 3 vectors are coplaner - // Vectors parallel to the same plane, or lie on the same plane are called coplanar - bool coplaner(const Vector3f& _v1, const Vector3f& _v2, const Vector3f& _v3); - - bool segmentIsLeft(const Segment2d& base, const Segment2d& compare, const Point2d& _point); - - Vector3f getFaceNormal(const Point3d& a, const Point3d& b, const Point3d& c); - - float volumTetrahedron(const Point3d& a, const Point3d& b, const Point3d& c, const Point3d& d); -} - -#endif //PHYSICSFORMULA_GEOUTILS_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_GEOUTILS_H +#define PHYSICSFORMULA_GEOUTILS_H + +#include +#include "Intersection.h" +#include "Point.h" +#include "Line.h" +#include "Plane.h" +#include "Segment.h" +#include "Polygon.h" +#include "Polyhedron.h" +#include "PolygonDCEL.h" + +namespace rez +{ + // Return integer indicating relative position of [Point c] related to segment [a b] + // This is only for 2D in XY plane. + int orientation3d(const Point3d& a, const Point3d& b, const Point3d& c); + + int orientation2d(const Point2d& a, const Point2d& b, const Point2d& c); + + // Predicate to determine whether the [Point c] is left to the segment [a b] + bool left(const Point3d& a, const Point3d& b, const Point3d& c); + + // Predicate to determine whether the [Point c] is left to the segment [a b] + bool left(const Point2d& a, const Point2d& b, const Point2d& c); + + bool left(const Line2dStd& l, const Point2d& p); + + bool left(const Line2d& l, const Point2d& p); + + // Predicate to determine whether the [Point c] is right to the segment [a b] + bool right(const Point3d& a, const Point3d& b, const Point3d& c); + + // Predicate to determine whether the[Point c] is left to the segment[a b] + bool leftOrBeyond(const Point2d& a, const Point2d& b, const Point2d& c); + + // Predicate to determine whether the [Point c] is left to the segment [a b] + bool leftOrBeyond(const Point3d& a, const Point3d& b, const Point3d& c); + + // Predicate to determine whether the [Point c] is left to or between the segment [a b] + bool leftOrBetween(const Point3d& a, const Point3d& b, const Point3d& c); + + // Return true if the v1-v2 is a diagonal. Use to poly to get the vertice list + bool isDiagonal(const Vertex2dSimple* v1, const Vertex2dSimple* v2, Polygon2dSimple* poly = nullptr); + + // Returns counter clockwise angle (0 - 360) measure from referece point to the give point + float polarAngle(const Point2d& _other, const Point2d& _ref); + + // Return the area of the triangle defined by given 3 points + // TODO change the parameter types form 3d to 2d + double areaTriangle2d(const Point3d& a, const Point3d& b, const Point3d& c); + + // Return the area of the triangle defined by given 3 points in XY 2D space + double areaTriangle2d(const Point2d& a, const Point2d& b, const Point2d& c); + + // Return the area of the triangle defined by given 3 points + double areaTriangle3d(const Point3d& a, const Point3d& b, const Point3d& c); + + float volume(const Point3d& a, const Face& f); + + // Return the orientation of the points in the Face f. CW or CCW + int orientation(const Face& f, const Vector3f& p); + + // Return the signed area of the tetrahedron. + // Assume the face vertices are in CCW order; + float FaceVisibility(const Face& _f, const Point3d& _p); + + // Return the angle between two vectors + float angle(const Vector2f& _v1, const Vector2f& _v2); + + // Return whether the [point] is inside the polygon represented by [_points]. + // Note that the check assume that [_points] are in counter clockwise order + // TODO : Better if we can check this on polygon + bool isInside(Point3d& _point, std::vector& _points); + + // Return whether the [point] is inside the polyhedron represented by [_faces] list + bool isInside(Point3d& _point, std::vector& _faces); + + // Return the index of the point closest to the [_point] from [_points] + // TODO : Better if we can check this on polygon + int getClosestPointIndex(Point3d& _point, std::vector& _points); + + // Check the collinearity of given three points in 3D. + bool collinear(const Point3d& a, const Point3d& b, const Point3d& c); + + // Check whether the given two vectors are collinear + bool collinear(const Vector3f& a, const Vector3f& b); + + // Check the coplaness of given four points in 3D. + // The three vectors are coplanar if their scalar triple product is zero. + bool coplaner(const Point3d& a, const Point3d& b, const Point3d& c, const Point3d& d); + + // Check whether the given 3 vectors are coplaner + // Vectors parallel to the same plane, or lie on the same plane are called coplanar + bool coplaner(const Vector3f& _v1, const Vector3f& _v2, const Vector3f& _v3); + + bool segmentIsLeft(const Segment2d& base, const Segment2d& compare, const Point2d& _point); + + Vector3f getFaceNormal(const Point3d& a, const Point3d& b, const Point3d& c); + + float volumTetrahedron(const Point3d& a, const Point3d& b, const Point3d& c, const Point3d& d); +} + +#endif //PHYSICSFORMULA_GEOUTILS_H diff --git a/GeometricOptics.h b/GeometricOptics.h index ab051df..3a27db8 100644 --- a/GeometricOptics.h +++ b/GeometricOptics.h @@ -1,706 +1,706 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_GEOMETRICOPTICS_H -#define PHYSICSFORMULA_GEOMETRICOPTICS_H -#include - -#include -using namespace std; - -static int geometricOptics_objectCount = 0; - -static struct RefractionIndexes -{ - //gases at 0 C, 1 atm - const ld AIR = 1.000293; - const ld CARBON_DIOXIDE = 1.00045; - const ld HYDROGEN = 1.000139; - const ld OXYGEN = 1.000271; - //Liquids at 20 C - const ld BENZENE = 1.501; - const ld CARBON_DISULFIDE = 1.628; - const ld CARBON_TETRACHLORIDE = 1.461; - const ld ETHANOL = 1.361; - const ld GLYCERINE = 1.473; - const ld WATER_FRESH = 1.333; - //Solids at 20 C - const ld DIAMOND = 2.419; - const ld FLUORITE = 1.434; - const ld GLASS_CROWN = 1.52; - const ld GLASS_FLINT = 1.66; - const ld ICE = 1.309; - const ld POLYSTYRENE = 1.49; - const ld PLEXIGLAS = 1.51; - const ld QUARTZ_CRYSTALLINE = 1.544; - const ld QUARTZ_FUSED = 1.458; - const ld SODIUM_CHLORIDE = 1.544; - const ld ZIRCON = 1.923; - -}refraction; - -static std::multimap refractions { - {"AIR", 1.0}, - {"AIR", 1.00}, - {"AIR", 1.000}, - {"AIR", 1.0003}, - {"AIR", 1.00029}, - {"AIR", 1.000293}, - {"CARBON_DIOXIDE~",1.0}, - {"CARBON_DIOXIDE",1.00}, - {"CARBON_DIOXIDE~",1.000}, - {"CARBON_DIOXIDE",1.0005}, - {"CARBON_DIOXIDE",1.00045}, - {"HYDROGEN",1.0}, - {"HYDROGEN",1.00}, - {"HYDROGEN",1.000}, - {"HYDROGEN",1.0001}, - {"HYDROGEN",1.00014}, - {"HYDROGEN",1.000139}, - {"OXYGEN",1.0}, - {"OXYGEN",1.00}, - {"OXYGEN",1.000}, - {"OXYGEN",1.000}, - {"OXYGEN",1.0003}, - {"OXYGEN",1.00027}, - {"BENZENE",1.5}, - {"BENZENE",1.50}, - {"BENZENE",1.501}, - {"BENZENE",1.502}, - {"CARBON_DISULFIDE",1.6}, - {"CARBON_DISULFIDE",1.63}, - {"CARBON_DISULFIDE",1.628}, - {"CARBON_DISULFIDE",1.6279}, - {"CARBON_TETRACHLORIDE",1.50}, - {"CARBON_TETRACHLORIDE",1.46}, - {"CARBON_TETRACHLORIDE",1.461}, - {"CARBON_TETRACHLORIDE",1.4614}, - {"ETHANOL",1.4}, - {"ETHANOL",1.36}, - {"ETHANOL",1.361}, - {"ETHANOL",1.3614}, - {"GLYCERINE",1.5}, - {"GLYCERINE",1.47}, - {"GLYCERINE",1.473}, - {"GLYCERINE",1.4734}, - {"WATER_FRESH",1.3}, - {"WATER_FRESH Red 660nm",1.331}, - {"WATER_FRESH Orange 610nm",1.332}, - {"WATER_FRESH Yellow 580nm",1.333}, - {"WATER_FRESH Green 550nm",1.335}, - {"WATER_FRESH",1.33}, - {"WATER_FRESH Blue 470nm",1.338}, - {"WATER_FRESH Violet 410nm",1.342}, - {"DIAMOND",2.4}, - {"DIAMOND Red 660nm",2.41}, - {"DIAMOND Orange 610nm",2.415}, - {"DIAMOND Yellow 580nm",2.417}, - {"DIAMOND",2.419}, - {"DIAMOND",2.42}, - {"DIAMOND Green 550nm",2.426}, - {"DIAMOND",2.3}, - {"DIAMOND",2.36}, - {"DIAMOND",2.38}, - {"DIAMOND",2.42}, - {"DIAMOND Blue 470nm",2.444}, - {"DIAMOND Violet 410nm",2.458}, - {"FLUORITE",1.4}, - {"FLUORITE",1.43}, - {"FLUORITE",1.434}, - {"FLUORITE",1.4345}, - {"GLASS_CROWN",1.5}, - {"GLASS_CROWN Red 660nm",1.512}, - {"GLASS_CROWN Orange 610nm",1.514}, - {"GLASS_CROWN Yellow 580nm",1.518}, - {"GLASS_CROWN Green 550nm",1.519}, - {"GLASS_CROWN",1.52}, - {"GLASS_CROWN Blue 470nm",1.524}, - {"GLASS_CROWN",1.529}, - {"GLASS_CROWN Violet 410nm",1.530}, - {"GLASS_FLINT",1.7}, - {"GLASS_FLINT",1.66}, - {"GLASS_FLINT",1.664}, - {"ICE",1.3}, - {"ICE",1.31}, - {"ICE",1.309}, - {"ICE",1.3091}, - {"POLYSTYRENE",1.5}, - {"POLYSTYRENE",1.49}, - {"POLYSTYRENE",1.491}, - {"POLYSTYRENE",1.495}, - {"PLEXIGLAS",1.5}, - {"PLEXIGLAS",1.51}, - {"PLEXIGLAS",1.512}, - {"PLEXIGLAS",1.513}, - {"QUARTZ_CRYSTALLINE",1.5}, - {"QUARTZ_CRYSTALLINE",1.54}, - {"QUARTZ_CRYSTALLINE",1.544}, - {"QUARTZ_CRYSTALLINE",1.5443}, - {"QUARTZ_FUSED",1.5}, - {"QUARTZ_FUSED",1.45}, - {"QUARTZ_FUSED",1.458}, - {"QUARTZ_FUSED",1.457}, - {"QUARTZ_FUSED",1.459}, - {"QUARTZ_FUSED",1.456}, - {"SODIUM_CHLORIDE",1.5}, - {"SODIUM_CHLORIDE",1.54}, - {"SODIUM_CHLORIDE",1.544}, - {"SODIUM_CHLORIDE",1.543}, - {"ZIRCON",1.9}, - {"ZIRCON",1.92}, - {"ZIRCON",1.923}, - {"ZIRCON",1.924} -}; -template -static void printVec(const T& t) { - std::copy(t.cbegin(), t.cend(), ostream_iterator(std::cout, ", ")); -}//end printVector - -template -static bool findMedium(std::vector & vec, std::multimap mapOfElemen, V value) -{ - bool bResult = false; - auto it = mapOfElemen.begin(); - while(it != mapOfElemen.end()) - { - if(it->second == value) - { - bResult = true; - vec.push_back(it->first); - } - it++; - } - return bResult; -}//end searchMapByValue -template -static void printMedium(std::multimap m, const V val) -{ - std::cout << "looking for value: "<< val< results; - bool tests = findMedium(results, m, val); - if(tests) - { - std::cout<<"Keys with value "<< val<< " are:"< - /// Calculates the index of refraction (n) where v is the observed speed of - /// light in the material. - /// - /// The observed speed of light in a material. - /// the index of refraction (n) is unit less - static ld indexOfRefraction(const ld v, int precision); - - /// - /// Calculates the speeds of the light from a know refraction index of n - /// - /// The refraction index. - /// the speed of the light through a substance or material - static ld speedOfLightFromRefractionIndex(const ld n); - - /// - /// calculates the index of refraction medium 2. - /// - /// The index of refraction from the incident ray. - /// The incident ray angle. - /// The angle of the refracted ray. - /// index of refraction for medium 2 - static ld indexOfRefractionMedium2(const ld n1, const ld incidentAng1, const ld angRefraction2, int precision); - - /// - /// calculates the index of refraction medium 1. - /// - /// The index of refraction of material 2. - /// The incident angle . - /// The angle of refraction. - /// The precision. - /// index of refraction for medium 1 - static ld indexOfRefractionMedium1(const ld n2, const ld incidentAng1, const ld angRefraction2, int precision); - - /// - /// Calculates the angle of refraction. - /// - /// The index of refraction from the incident ray. - /// The index of refraction from refracted ray. - /// The incident angle. - /// the angle of refraction - static ld angleOfRefraction(const ld n1, const ld n2, const ld incidentAng1); - - /// - /// Calculates the incident angle. - /// - /// The index of refraction from the incident ray. - /// The index of refraction from refracted ray. - /// The angle of refraction. - /// the incident angle - static ld incidentAngle(const ld n1, const ld n2, const ld angRefraction2); - - /// - /// Calculates the critical angle for conditions {n1 > n2} - /// - /// The n1. - /// The n2. - /// the critical angle - static ld criticalAngle(const ld n1, const ld n2); - - /// - /// Waves the length from index refraction. - /// - /// The wave l from source ray. - /// The n. - /// - static ld waveLength_fromIndexRefraction(const ld waveLFromSourceRay, const ld n); - - /// - /// Suppose a person stands in front of a mirror their eyes are floorToEyes(m) - /// above the floor, and the top of their head is eyesToTopHea m higher. - /// Find the height above the floor of the top and bottom of the smallest mirror - /// in which he can see both the top of his head and his feet. How is this - /// distance related to the man’s height? - /// - /// The floor to eyes. - /// The eyes to top head. - /// - static std::map heightOfMirror(const ld floorToEyes, const ld eyesToTopHead); - - /// - /// Components of some computers communicate with each other through optical - /// fibers having an index of refraction n=1.55 but this can be generalized - /// to any matter having a refraction index of n. What time in seconds - /// is required for a signal to travel d m through that material? - /// - /// The refraction index. - /// The distance. - /// time for signal to travel - static ld timeForSignalToTravel(const ld n, const ld d); - /// - /// Calculates the powers of the lens, which is the inverse of its focal - /// length f. The units of a lens power is in diopters(D) which is 1/m or - /// 1m^-1 - /// - /// The focal length. - /// diopters of lens - static ld powerOfLens(const ld f); - - /// - /// Calculates the focal length of a lens having a power of P diopters - /// - /// The power of the lens. - /// the focal length - static ld focalLength(const ld P); - - /// - /// Focals the length. - /// - /// The magnification. - /// The object distance. - /// focal length - static ld focalLength(const ld m, const ld d_o); - - /// - /// Angles the and distance of bounced laser to sensor. - /// - /// The dis from las2 mirror. - /// The dis south sensor. - /// The angle off by. - /// - static std::map angleAndDistanceOfBouncedLaserToSensor( - const ld disFromLas2Mirror, const ld disSouthSensor, const ld angleOffBy); - - /// - /// A scuba diver training in a pool looks at his instructor. What angle - /// does the ray from the instructor’s face make with the perpendicular to - /// the water at the point where the ray enters? The angle between the ray - /// in the water and the perpendicular to the water is angRefrac2∘. - /// - /// The n1. - /// The n2. - /// The refraction angle2. - /// - static ld incidentRayToMaterial(const ld n1, const ld n2, const ld angRefrac2); - - /// - /// Calculates the image distance with a known focal lenght of f and the - /// objects distance of dObj - /// - /// The objects distance. - /// The focal distance. - /// the image distance - static ld imageDistance_diRaytracing(const ld dObj, const ld f); - - /// - /// An object h_o units high is held d_o units from a person’s cornea, and - /// its reflected image is measured to be h_i units high. - /// calculate Where the image is. - /// - /// The object distance. - /// The image height. - /// The object height. - /// image distance, or position of image - static auto imageDistance_hihodo(const ld d_o, const ld h_i, const ld h_o); - - /// - /// Calculates the Magnification. - /// - /// The distance of image. - /// The distance of object. - /// - static ld magnification(const ld di, const ld dObj); - - /// - /// Calculates the index of refraction of a substance that has a critical - /// angle of cA° when submerged in a substance, which has an index of - /// refraction of n2? - /// - /// The known critical angle. - /// The index known index of refraction. - /// the unknown index of refraction of substance - static ld indexOfRefractionFromCriticalAngle(const ld cA, const ld n2); - - /// - /// If a converging lens forms a real, inverted image d_i units to the right - /// of the lens when the object is placed d_o units to the left of a lens, - /// determine the focal length of the lens. - /// - /// The distance image makes. - /// The distance object is placed. - /// the focal length - static ld focalLength_ConvergingLens_dido(const ld d_i, const ld d_o); - - /// - /// Calculates the focal length from the radius of curvature - /// - /// The r. - /// - static ld focalLength_R(const ld R); - - /// - /// Objects the distance. - /// - /// The f. - /// The d i. - /// - static ld objectDistance(const ld f, const ld d_i); - - /// - /// Calculates the radius of curvature. - /// - /// The focal length. - /// - static ld radiusOfCurvature(const ld f); - - /// - /// Calculate the intensity of IR radiation in W/m2 from a space heater - /// projected by a concave mirror on a person d_i units away. Assume that - /// the heating element radiates P Watts and has an area of A units^2, and - /// that half of the radiated power is reflected and focused by the mirror - /// - /// The image distance, how far a person is standing. - /// The object distance. - /// The power. - /// the area of mirror. - /// Intensity (W/m^2) - static ld intensityOfIR_radiation(const ld d_i, const ld d_o, const ld P, const ld A); - - - -private: - ld geometricOpticsVar; - static void countIncrease() { geometricOptics_objectCount += 1; } - static void countDecrease() { geometricOptics_objectCount -= 1; } - -}; - -#endif //PHYSICSFORMULA_GEOMETRICOPTICS_H -//============================================================================= -//in-line class Implementation - -inline ld GeometricOptics::indexOfRefraction(const ld v, int precision = 3) -{ - if (precision == 1) - { - ld scale = 0.1; - ld a = _C_ / v; - return floor(a/scale+.5)* scale; - } - if (precision == 2) - { - ld scale = 0.01; - ld a = _C_ / v; - return floor(a/scale+.5)* scale; - } - if (precision == 3) - { - ld scale = 0.001; - ld a = _C_ / v; - return floor(a/scale+.5)* scale; - } - if (precision == 4) - { - ld scale = 0.0001; - ld a = _C_ / v; - return floor(a/scale+.5)* scale; - } - else - return _C_ / v;; -} - -inline ld GeometricOptics::speedOfLightFromRefractionIndex(const ld n) -{ - return _C_ / n; -} - -inline ld GeometricOptics::indexOfRefractionMedium2(const ld n1, const ld incidentAng1, const ld angRefraction2, int precision = 3) -{ - if (precision == 1) - { - ld val = n1 * (sin(incidentAng1 * RADIAN) / sin(angRefraction2 * RADIAN)); - ld scale = .1; - ld v = floor(val / scale + .5) * scale; - return v; - } - if (precision == 2) - { - ld val = n1 * (sin(incidentAng1 * RADIAN) / sin(angRefraction2 * RADIAN)); - ld scale = .01; - return floor(val/scale+.5)*scale; - } - if (precision == 3) - { - ld val = n1 * (sin(incidentAng1 * RADIAN) / sin(angRefraction2 * RADIAN)); - ld scale = .001; - return floor(val/scale+.5)*scale; - } - if (precision == 4) - { - ld val = n1 * (sin(incidentAng1 * RADIAN) / sin(angRefraction2 * RADIAN)); - ld scale = .0001; - return floor(val / scale + .5) * scale; - } - else - return n1 * (sin(incidentAng1 * RADIAN) / sin(angRefraction2 * RADIAN)); - -} - -inline ld GeometricOptics::indexOfRefractionMedium1(const ld n2, const ld incidentAng1, const ld angRefraction2, int precision) -{ - if (precision == 1) - { - ld val = n2 * (sin(angRefraction2 * RADIAN) / sin(incidentAng1 * RADIAN)); - ld scale = .1; - ld v = floor(val / scale + .5) * scale; - return v; - } - if (precision == 2) - { - ld val = n2 * (sin(angRefraction2 * RADIAN) / sin(incidentAng1 * RADIAN));; - ld scale = .01; - return floor(val/scale+.5)*scale; - } - if (precision == 3) - { - ld val = n2 * (sin(angRefraction2 * RADIAN) / sin(incidentAng1 * RADIAN)); - ld scale = .001; - return floor(val/scale+.5)*scale; - } - if (precision == 4) - { - ld val = n2 * (sin(angRefraction2 * RADIAN) / sin(incidentAng1 * RADIAN)); - ld scale = .0001; - return floor(val / scale + .5) * scale; - } - else - return n2 * (sin(incidentAng1 * RADIAN) / sin(incidentAng1 * RADIAN)); -} - -inline ld GeometricOptics::angleOfRefraction(const ld n1, const ld n2, const ld incidentAng1) -{ - ld temp = (n1 / n2) * sin(incidentAng1*RADIAN); - return asin(temp)*DEGREE; -} - -inline ld GeometricOptics::incidentAngle(const ld n1, const ld n2, const ld angRefraction2) -{ - ld temp = (n2 / n1) * sin(angRefraction2 * RADIAN); - return asin(temp) * DEGREE; -} - -inline ld GeometricOptics::criticalAngle(const ld n1, const ld n2) -{ - return asin(n2/n1)*DEGREE; -} - -inline ld GeometricOptics::waveLength_fromIndexRefraction(const ld waveLFromSourceRay, const ld n) -{ - return waveLFromSourceRay / n; -} - -inline std::map GeometricOptics::heightOfMirror(const ld floorToEyes, const ld eyesToTopHead) -{ - map result; - result["floor to bottom of mirror"] = floorToEyes / 2.0;//height from floor to bottom of mirror - - result["1/2 from eyes to top of head"] = eyesToTopHead / 2.0; - - result["height of person"] = floorToEyes + eyesToTopHead; - - result["length of mirror"] = result.at("height of person") - - result.at("floor to bottom of mirror") - - result.at("1/2 from eyes to top of head"); - result["floor to top of mirror"] = result.at("floor to bottom of mirror") + - result.at("length of mirror"); - - return result; -} - -inline ld GeometricOptics::timeForSignalToTravel(const ld n, const ld d) -{ - return (d* n)/_C_;//s -} - -inline ld GeometricOptics::powerOfLens(const ld f) -{ - return 1 / f;//diopters = D -} - -inline ld GeometricOptics::focalLength(const ld P) -{ - return 1.0 / P; -} - -inline ld GeometricOptics::focalLength(const ld m, const ld d_o) -{ - return (1 / d_o) - (1 / (m * d_o)); -} - -inline std::map GeometricOptics::angleAndDistanceOfBouncedLaserToSensor(const ld disFromLas2Mirror, const ld disSouthSensor, const ld angleOffBy) -{ - std::map results; - ld angle = (atan(disSouthSensor / disFromLas2Mirror) * DEGREE) / 2.0; - results["angle with respect to due west"] = angle; - ld offBy = disFromLas2Mirror * tan((2.0 * (angle + angleOffBy))*RADIAN); - results["distance between laser and point south"] = offBy; - results["how far need to move the light sensor"] = offBy - disSouthSensor; - - return results; -} - -inline ld GeometricOptics::incidentRayToMaterial(const ld n1, const ld n2, const ld angRefrac2) -{ - return asin((n2 * sin(angRefrac2*RADIAN)) / n1) * DEGREE; -} - -inline ld GeometricOptics::imageDistance_diRaytracing(const ld dObj, const ld f) -{ - return (f * dObj) / (dObj - f); -} - -inline auto GeometricOptics::imageDistance_hihodo(const ld d_o, const ld h_i, const ld h_o) -{ - return -(d_o * h_i) / h_o; -} - -inline ld GeometricOptics::magnification(const ld di, const ld dObj) -{ - return -(di / dObj); -} - -inline ld GeometricOptics::indexOfRefractionFromCriticalAngle(const ld cA, const ld n2) -{ - return n2 / sin(cA * RADIAN); -} - -inline ld GeometricOptics::focalLength_ConvergingLens_dido(const ld d_i, const ld d_o) -{ - return (d_i * d_o) / (d_i + d_o); -} - -inline ld GeometricOptics::focalLength_R(const ld R) -{ - return R / 2.0; -} - -inline ld GeometricOptics::objectDistance(const ld f, const ld d_i) -{ - return 1.0 / ((1.0 / f) - (1.0 / d_i)); -} - -inline ld GeometricOptics::radiusOfCurvature(const ld f) -{ - return 2.0 * f; -} - -inline ld GeometricOptics::intensityOfIR_radiation(const ld d_i, const ld d_o, const ld P, const ld A) -{ - return P * pow(d_o, 2) / 2 / (A / 100) / pow(d_i, 2); +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_GEOMETRICOPTICS_H +#define PHYSICSFORMULA_GEOMETRICOPTICS_H +#include + +#include +using namespace std; + +static int geometricOptics_objectCount = 0; + +static struct RefractionIndexes +{ + //gases at 0 C, 1 atm + const ld AIR = 1.000293; + const ld CARBON_DIOXIDE = 1.00045; + const ld HYDROGEN = 1.000139; + const ld OXYGEN = 1.000271; + //Liquids at 20 C + const ld BENZENE = 1.501; + const ld CARBON_DISULFIDE = 1.628; + const ld CARBON_TETRACHLORIDE = 1.461; + const ld ETHANOL = 1.361; + const ld GLYCERINE = 1.473; + const ld WATER_FRESH = 1.333; + //Solids at 20 C + const ld DIAMOND = 2.419; + const ld FLUORITE = 1.434; + const ld GLASS_CROWN = 1.52; + const ld GLASS_FLINT = 1.66; + const ld ICE = 1.309; + const ld POLYSTYRENE = 1.49; + const ld PLEXIGLAS = 1.51; + const ld QUARTZ_CRYSTALLINE = 1.544; + const ld QUARTZ_FUSED = 1.458; + const ld SODIUM_CHLORIDE = 1.544; + const ld ZIRCON = 1.923; + +}refraction; + +static std::multimap refractions { + {"AIR", 1.0}, + {"AIR", 1.00}, + {"AIR", 1.000}, + {"AIR", 1.0003}, + {"AIR", 1.00029}, + {"AIR", 1.000293}, + {"CARBON_DIOXIDE~",1.0}, + {"CARBON_DIOXIDE",1.00}, + {"CARBON_DIOXIDE~",1.000}, + {"CARBON_DIOXIDE",1.0005}, + {"CARBON_DIOXIDE",1.00045}, + {"HYDROGEN",1.0}, + {"HYDROGEN",1.00}, + {"HYDROGEN",1.000}, + {"HYDROGEN",1.0001}, + {"HYDROGEN",1.00014}, + {"HYDROGEN",1.000139}, + {"OXYGEN",1.0}, + {"OXYGEN",1.00}, + {"OXYGEN",1.000}, + {"OXYGEN",1.000}, + {"OXYGEN",1.0003}, + {"OXYGEN",1.00027}, + {"BENZENE",1.5}, + {"BENZENE",1.50}, + {"BENZENE",1.501}, + {"BENZENE",1.502}, + {"CARBON_DISULFIDE",1.6}, + {"CARBON_DISULFIDE",1.63}, + {"CARBON_DISULFIDE",1.628}, + {"CARBON_DISULFIDE",1.6279}, + {"CARBON_TETRACHLORIDE",1.50}, + {"CARBON_TETRACHLORIDE",1.46}, + {"CARBON_TETRACHLORIDE",1.461}, + {"CARBON_TETRACHLORIDE",1.4614}, + {"ETHANOL",1.4}, + {"ETHANOL",1.36}, + {"ETHANOL",1.361}, + {"ETHANOL",1.3614}, + {"GLYCERINE",1.5}, + {"GLYCERINE",1.47}, + {"GLYCERINE",1.473}, + {"GLYCERINE",1.4734}, + {"WATER_FRESH",1.3}, + {"WATER_FRESH Red 660nm",1.331}, + {"WATER_FRESH Orange 610nm",1.332}, + {"WATER_FRESH Yellow 580nm",1.333}, + {"WATER_FRESH Green 550nm",1.335}, + {"WATER_FRESH",1.33}, + {"WATER_FRESH Blue 470nm",1.338}, + {"WATER_FRESH Violet 410nm",1.342}, + {"DIAMOND",2.4}, + {"DIAMOND Red 660nm",2.41}, + {"DIAMOND Orange 610nm",2.415}, + {"DIAMOND Yellow 580nm",2.417}, + {"DIAMOND",2.419}, + {"DIAMOND",2.42}, + {"DIAMOND Green 550nm",2.426}, + {"DIAMOND",2.3}, + {"DIAMOND",2.36}, + {"DIAMOND",2.38}, + {"DIAMOND",2.42}, + {"DIAMOND Blue 470nm",2.444}, + {"DIAMOND Violet 410nm",2.458}, + {"FLUORITE",1.4}, + {"FLUORITE",1.43}, + {"FLUORITE",1.434}, + {"FLUORITE",1.4345}, + {"GLASS_CROWN",1.5}, + {"GLASS_CROWN Red 660nm",1.512}, + {"GLASS_CROWN Orange 610nm",1.514}, + {"GLASS_CROWN Yellow 580nm",1.518}, + {"GLASS_CROWN Green 550nm",1.519}, + {"GLASS_CROWN",1.52}, + {"GLASS_CROWN Blue 470nm",1.524}, + {"GLASS_CROWN",1.529}, + {"GLASS_CROWN Violet 410nm",1.530}, + {"GLASS_FLINT",1.7}, + {"GLASS_FLINT",1.66}, + {"GLASS_FLINT",1.664}, + {"ICE",1.3}, + {"ICE",1.31}, + {"ICE",1.309}, + {"ICE",1.3091}, + {"POLYSTYRENE",1.5}, + {"POLYSTYRENE",1.49}, + {"POLYSTYRENE",1.491}, + {"POLYSTYRENE",1.495}, + {"PLEXIGLAS",1.5}, + {"PLEXIGLAS",1.51}, + {"PLEXIGLAS",1.512}, + {"PLEXIGLAS",1.513}, + {"QUARTZ_CRYSTALLINE",1.5}, + {"QUARTZ_CRYSTALLINE",1.54}, + {"QUARTZ_CRYSTALLINE",1.544}, + {"QUARTZ_CRYSTALLINE",1.5443}, + {"QUARTZ_FUSED",1.5}, + {"QUARTZ_FUSED",1.45}, + {"QUARTZ_FUSED",1.458}, + {"QUARTZ_FUSED",1.457}, + {"QUARTZ_FUSED",1.459}, + {"QUARTZ_FUSED",1.456}, + {"SODIUM_CHLORIDE",1.5}, + {"SODIUM_CHLORIDE",1.54}, + {"SODIUM_CHLORIDE",1.544}, + {"SODIUM_CHLORIDE",1.543}, + {"ZIRCON",1.9}, + {"ZIRCON",1.92}, + {"ZIRCON",1.923}, + {"ZIRCON",1.924} +}; +template +static void printVec(const T& t) { + std::copy(t.cbegin(), t.cend(), ostream_iterator(std::cout, ", ")); +}//end printVector + +template +static bool findMedium(std::vector & vec, std::multimap mapOfElemen, V value) +{ + bool bResult = false; + auto it = mapOfElemen.begin(); + while(it != mapOfElemen.end()) + { + if(it->second == value) + { + bResult = true; + vec.push_back(it->first); + } + it++; + } + return bResult; +}//end searchMapByValue +template +static void printMedium(std::multimap m, const V val) +{ + std::cout << "looking for value: "<< val< results; + bool tests = findMedium(results, m, val); + if(tests) + { + std::cout<<"Keys with value "<< val<< " are:"< + /// Calculates the index of refraction (n) where v is the observed speed of + /// light in the material. + /// + /// The observed speed of light in a material. + /// the index of refraction (n) is unit less + static ld indexOfRefraction(const ld v, int precision); + + /// + /// Calculates the speeds of the light from a know refraction index of n + /// + /// The refraction index. + /// the speed of the light through a substance or material + static ld speedOfLightFromRefractionIndex(const ld n); + + /// + /// calculates the index of refraction medium 2. + /// + /// The index of refraction from the incident ray. + /// The incident ray angle. + /// The angle of the refracted ray. + /// index of refraction for medium 2 + static ld indexOfRefractionMedium2(const ld n1, const ld incidentAng1, const ld angRefraction2, int precision); + + /// + /// calculates the index of refraction medium 1. + /// + /// The index of refraction of material 2. + /// The incident angle . + /// The angle of refraction. + /// The precision. + /// index of refraction for medium 1 + static ld indexOfRefractionMedium1(const ld n2, const ld incidentAng1, const ld angRefraction2, int precision); + + /// + /// Calculates the angle of refraction. + /// + /// The index of refraction from the incident ray. + /// The index of refraction from refracted ray. + /// The incident angle. + /// the angle of refraction + static ld angleOfRefraction(const ld n1, const ld n2, const ld incidentAng1); + + /// + /// Calculates the incident angle. + /// + /// The index of refraction from the incident ray. + /// The index of refraction from refracted ray. + /// The angle of refraction. + /// the incident angle + static ld incidentAngle(const ld n1, const ld n2, const ld angRefraction2); + + /// + /// Calculates the critical angle for conditions {n1 > n2} + /// + /// The n1. + /// The n2. + /// the critical angle + static ld criticalAngle(const ld n1, const ld n2); + + /// + /// Waves the length from index refraction. + /// + /// The wave l from source ray. + /// The n. + /// + static ld waveLength_fromIndexRefraction(const ld waveLFromSourceRay, const ld n); + + /// + /// Suppose a person stands in front of a mirror their eyes are floorToEyes(m) + /// above the floor, and the top of their head is eyesToTopHea m higher. + /// Find the height above the floor of the top and bottom of the smallest mirror + /// in which he can see both the top of his head and his feet. How is this + /// distance related to the man’s height? + /// + /// The floor to eyes. + /// The eyes to top head. + /// + static std::map heightOfMirror(const ld floorToEyes, const ld eyesToTopHead); + + /// + /// Components of some computers communicate with each other through optical + /// fibers having an index of refraction n=1.55 but this can be generalized + /// to any matter having a refraction index of n. What time in seconds + /// is required for a signal to travel d m through that material? + /// + /// The refraction index. + /// The distance. + /// time for signal to travel + static ld timeForSignalToTravel(const ld n, const ld d); + /// + /// Calculates the powers of the lens, which is the inverse of its focal + /// length f. The units of a lens power is in diopters(D) which is 1/m or + /// 1m^-1 + /// + /// The focal length. + /// diopters of lens + static ld powerOfLens(const ld f); + + /// + /// Calculates the focal length of a lens having a power of P diopters + /// + /// The power of the lens. + /// the focal length + static ld focalLength(const ld P); + + /// + /// Focals the length. + /// + /// The magnification. + /// The object distance. + /// focal length + static ld focalLength(const ld m, const ld d_o); + + /// + /// Angles the and distance of bounced laser to sensor. + /// + /// The dis from las2 mirror. + /// The dis south sensor. + /// The angle off by. + /// + static std::map angleAndDistanceOfBouncedLaserToSensor( + const ld disFromLas2Mirror, const ld disSouthSensor, const ld angleOffBy); + + /// + /// A scuba diver training in a pool looks at his instructor. What angle + /// does the ray from the instructor’s face make with the perpendicular to + /// the water at the point where the ray enters? The angle between the ray + /// in the water and the perpendicular to the water is angRefrac2∘. + /// + /// The n1. + /// The n2. + /// The refraction angle2. + /// + static ld incidentRayToMaterial(const ld n1, const ld n2, const ld angRefrac2); + + /// + /// Calculates the image distance with a known focal lenght of f and the + /// objects distance of dObj + /// + /// The objects distance. + /// The focal distance. + /// the image distance + static ld imageDistance_diRaytracing(const ld dObj, const ld f); + + /// + /// An object h_o units high is held d_o units from a person’s cornea, and + /// its reflected image is measured to be h_i units high. + /// calculate Where the image is. + /// + /// The object distance. + /// The image height. + /// The object height. + /// image distance, or position of image + static auto imageDistance_hihodo(const ld d_o, const ld h_i, const ld h_o); + + /// + /// Calculates the Magnification. + /// + /// The distance of image. + /// The distance of object. + /// + static ld magnification(const ld di, const ld dObj); + + /// + /// Calculates the index of refraction of a substance that has a critical + /// angle of cA° when submerged in a substance, which has an index of + /// refraction of n2? + /// + /// The known critical angle. + /// The index known index of refraction. + /// the unknown index of refraction of substance + static ld indexOfRefractionFromCriticalAngle(const ld cA, const ld n2); + + /// + /// If a converging lens forms a real, inverted image d_i units to the right + /// of the lens when the object is placed d_o units to the left of a lens, + /// determine the focal length of the lens. + /// + /// The distance image makes. + /// The distance object is placed. + /// the focal length + static ld focalLength_ConvergingLens_dido(const ld d_i, const ld d_o); + + /// + /// Calculates the focal length from the radius of curvature + /// + /// The r. + /// + static ld focalLength_R(const ld R); + + /// + /// Objects the distance. + /// + /// The f. + /// The d i. + /// + static ld objectDistance(const ld f, const ld d_i); + + /// + /// Calculates the radius of curvature. + /// + /// The focal length. + /// + static ld radiusOfCurvature(const ld f); + + /// + /// Calculate the intensity of IR radiation in W/m2 from a space heater + /// projected by a concave mirror on a person d_i units away. Assume that + /// the heating element radiates P Watts and has an area of A units^2, and + /// that half of the radiated power is reflected and focused by the mirror + /// + /// The image distance, how far a person is standing. + /// The object distance. + /// The power. + /// the area of mirror. + /// Intensity (W/m^2) + static ld intensityOfIR_radiation(const ld d_i, const ld d_o, const ld P, const ld A); + + + +private: + ld geometricOpticsVar; + static void countIncrease() { geometricOptics_objectCount += 1; } + static void countDecrease() { geometricOptics_objectCount -= 1; } + +}; + +#endif //PHYSICSFORMULA_GEOMETRICOPTICS_H +//============================================================================= +//in-line class Implementation + +inline ld GeometricOptics::indexOfRefraction(const ld v, int precision = 3) +{ + if (precision == 1) + { + ld scale = 0.1; + ld a = _C_ / v; + return floor(a/scale+.5)* scale; + } + if (precision == 2) + { + ld scale = 0.01; + ld a = _C_ / v; + return floor(a/scale+.5)* scale; + } + if (precision == 3) + { + ld scale = 0.001; + ld a = _C_ / v; + return floor(a/scale+.5)* scale; + } + if (precision == 4) + { + ld scale = 0.0001; + ld a = _C_ / v; + return floor(a/scale+.5)* scale; + } + else + return _C_ / v;; +} + +inline ld GeometricOptics::speedOfLightFromRefractionIndex(const ld n) +{ + return _C_ / n; +} + +inline ld GeometricOptics::indexOfRefractionMedium2(const ld n1, const ld incidentAng1, const ld angRefraction2, int precision = 3) +{ + if (precision == 1) + { + ld val = n1 * (sin(incidentAng1 * RADIAN) / sin(angRefraction2 * RADIAN)); + ld scale = .1; + ld v = floor(val / scale + .5) * scale; + return v; + } + if (precision == 2) + { + ld val = n1 * (sin(incidentAng1 * RADIAN) / sin(angRefraction2 * RADIAN)); + ld scale = .01; + return floor(val/scale+.5)*scale; + } + if (precision == 3) + { + ld val = n1 * (sin(incidentAng1 * RADIAN) / sin(angRefraction2 * RADIAN)); + ld scale = .001; + return floor(val/scale+.5)*scale; + } + if (precision == 4) + { + ld val = n1 * (sin(incidentAng1 * RADIAN) / sin(angRefraction2 * RADIAN)); + ld scale = .0001; + return floor(val / scale + .5) * scale; + } + else + return n1 * (sin(incidentAng1 * RADIAN) / sin(angRefraction2 * RADIAN)); + +} + +inline ld GeometricOptics::indexOfRefractionMedium1(const ld n2, const ld incidentAng1, const ld angRefraction2, int precision) +{ + if (precision == 1) + { + ld val = n2 * (sin(angRefraction2 * RADIAN) / sin(incidentAng1 * RADIAN)); + ld scale = .1; + ld v = floor(val / scale + .5) * scale; + return v; + } + if (precision == 2) + { + ld val = n2 * (sin(angRefraction2 * RADIAN) / sin(incidentAng1 * RADIAN));; + ld scale = .01; + return floor(val/scale+.5)*scale; + } + if (precision == 3) + { + ld val = n2 * (sin(angRefraction2 * RADIAN) / sin(incidentAng1 * RADIAN)); + ld scale = .001; + return floor(val/scale+.5)*scale; + } + if (precision == 4) + { + ld val = n2 * (sin(angRefraction2 * RADIAN) / sin(incidentAng1 * RADIAN)); + ld scale = .0001; + return floor(val / scale + .5) * scale; + } + else + return n2 * (sin(incidentAng1 * RADIAN) / sin(incidentAng1 * RADIAN)); +} + +inline ld GeometricOptics::angleOfRefraction(const ld n1, const ld n2, const ld incidentAng1) +{ + ld temp = (n1 / n2) * sin(incidentAng1*RADIAN); + return asin(temp)*DEGREE; +} + +inline ld GeometricOptics::incidentAngle(const ld n1, const ld n2, const ld angRefraction2) +{ + ld temp = (n2 / n1) * sin(angRefraction2 * RADIAN); + return asin(temp) * DEGREE; +} + +inline ld GeometricOptics::criticalAngle(const ld n1, const ld n2) +{ + return asin(n2/n1)*DEGREE; +} + +inline ld GeometricOptics::waveLength_fromIndexRefraction(const ld waveLFromSourceRay, const ld n) +{ + return waveLFromSourceRay / n; +} + +inline std::map GeometricOptics::heightOfMirror(const ld floorToEyes, const ld eyesToTopHead) +{ + map result; + result["floor to bottom of mirror"] = floorToEyes / 2.0;//height from floor to bottom of mirror + + result["1/2 from eyes to top of head"] = eyesToTopHead / 2.0; + + result["height of person"] = floorToEyes + eyesToTopHead; + + result["length of mirror"] = result.at("height of person") - + result.at("floor to bottom of mirror") - + result.at("1/2 from eyes to top of head"); + result["floor to top of mirror"] = result.at("floor to bottom of mirror") + + result.at("length of mirror"); + + return result; +} + +inline ld GeometricOptics::timeForSignalToTravel(const ld n, const ld d) +{ + return (d* n)/_C_;//s +} + +inline ld GeometricOptics::powerOfLens(const ld f) +{ + return 1 / f;//diopters = D +} + +inline ld GeometricOptics::focalLength(const ld P) +{ + return 1.0 / P; +} + +inline ld GeometricOptics::focalLength(const ld m, const ld d_o) +{ + return (1 / d_o) - (1 / (m * d_o)); +} + +inline std::map GeometricOptics::angleAndDistanceOfBouncedLaserToSensor(const ld disFromLas2Mirror, const ld disSouthSensor, const ld angleOffBy) +{ + std::map results; + ld angle = (atan(disSouthSensor / disFromLas2Mirror) * DEGREE) / 2.0; + results["angle with respect to due west"] = angle; + ld offBy = disFromLas2Mirror * tan((2.0 * (angle + angleOffBy))*RADIAN); + results["distance between laser and point south"] = offBy; + results["how far need to move the light sensor"] = offBy - disSouthSensor; + + return results; +} + +inline ld GeometricOptics::incidentRayToMaterial(const ld n1, const ld n2, const ld angRefrac2) +{ + return asin((n2 * sin(angRefrac2*RADIAN)) / n1) * DEGREE; +} + +inline ld GeometricOptics::imageDistance_diRaytracing(const ld dObj, const ld f) +{ + return (f * dObj) / (dObj - f); +} + +inline auto GeometricOptics::imageDistance_hihodo(const ld d_o, const ld h_i, const ld h_o) +{ + return -(d_o * h_i) / h_o; +} + +inline ld GeometricOptics::magnification(const ld di, const ld dObj) +{ + return -(di / dObj); +} + +inline ld GeometricOptics::indexOfRefractionFromCriticalAngle(const ld cA, const ld n2) +{ + return n2 / sin(cA * RADIAN); +} + +inline ld GeometricOptics::focalLength_ConvergingLens_dido(const ld d_i, const ld d_o) +{ + return (d_i * d_o) / (d_i + d_o); +} + +inline ld GeometricOptics::focalLength_R(const ld R) +{ + return R / 2.0; +} + +inline ld GeometricOptics::objectDistance(const ld f, const ld d_i) +{ + return 1.0 / ((1.0 / f) - (1.0 / d_i)); +} + +inline ld GeometricOptics::radiusOfCurvature(const ld f) +{ + return 2.0 * f; +} + +inline ld GeometricOptics::intensityOfIR_radiation(const ld d_i, const ld d_o, const ld P, const ld A) +{ + return P * pow(d_o, 2) / 2 / (A / 100) / pow(d_i, 2); } \ No newline at end of file diff --git a/Hearing.h b/Hearing.h index 2120352..6717586 100644 --- a/Hearing.h +++ b/Hearing.h @@ -1,475 +1,475 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_HEARING_H -#define PHYSICSFORMULA_HEARING_H -/** - * @class Hearing - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @date 12/31/2020 - */ -#include "Waves.h" - -#include - - -static int hearing_objectCount = 0; - -/// -/// The reference Intensity, is the lowest threshold intensity of sound a -/// person with normal hearing can perceive at a frequency of 1000Hz -/// -constexpr auto I_ref = 1.0e-12; - -static struct SoundSpeeds -{ - const ld air_0C = 331.0; // 331, gas 0C - const ld carbonDioxide = 259.0; // 259, gas 0C - const ld oxygen = 316.0; // 316, gas 0C - const ld helium = 965.0; // 965, gas 0C - const ld hydrogen = 1290.0; // 1290, gas 0C - const ld ethanol = 1160.0; // 1160, liquid 20C - const ld mercury = 1450.0; // 1450.0, liquid 20C - const ld water_fresh = 1480.0; // 1480.0, liquid 20C - const ld water_sea = 1540.0; // 1540.0, liquid 20C - const ld humanTissue = 1540.0; // 1540.0, liquid 20C - const ld vulcanized_rubber = 54.0; // 54.0, solid longitudinal or bulk - const ld polyethylene = 920.0; // 920.0, solid longitudinal or bulk - const ld marble = 3810.0; // 3810.0, solid longitudinal or bulk - const ld glass_pyrex = 5640.0; // 5640.0, solid longitudinal or bulk - const ld lead = 1960.0; // 1960.0, solid longitudinal or bulk - const ld aluminum = 5120.0; // 5120.0, solid longitudinal or bulk - const ld steel = 5960.0; // 5960.0, solid longitudinal or bulk - -}Vw; - - -class Hearing : - public Waves -{ -private: - static void countIncrease() { hearing_objectCount += 1; } - static void countDecrease() { hearing_objectCount -= 1; } -public: - Hearing* _hearingPtr; - Waves* _wavePtr; - - Hearing() - { - _hearingPtr = nullptr; - _wavePtr = nullptr; - countIncrease(); - } - - /** - * @brief copy constructor - */ - Hearing(const Hearing& t) - : Waves(t) - { - _hearingPtr = t._hearingPtr; - _wavePtr = t._wavePtr; - countIncrease(); - } - /** - * #brief move constructor - */ - Hearing(Hearing&& t) noexcept - { - _hearingPtr = t._hearingPtr; - _wavePtr = t._wavePtr; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Hearing& operator=(const Hearing& t) - { - if (this != &t) - { - _hearingPtr = t._hearingPtr; - _wavePtr = t._wavePtr; - countIncrease(); - } - return *this; - } - - static void show_objectCount() { std::cout << "\n hearing object count: " << hearing_objectCount << std::endl; } - static int get_objectCount() { return hearing_objectCount; } - inline auto static printArr = [](const T arr[], T n, string label = "array values") - { - - cout << "\n" + label + ": "; - for (size_t i = 0; i < n; i++) - { - cout << arr[i] << ' '; - } - cout << endl; - }; - /* - void static printArr(const double arr[], int n, string label = "array values") - { - - cout << "\n"+ label+": "; - for (size_t i = 0; i < n; i++) - { - cout << arr[i] << ' '; - } - cout << endl; - } - */ - /// - /// Calculates the speeds of sound when the temp of surrounding enviroment - /// is known and converted to kelvins in this formula. - /// Vw = (vw)*sqrt(temp / 273.0) - /// - /// The temperature in celsius. - /// The air speed at 0C is the default. - /// - static ld speedOfSound(const ld temp, const ld vw = Vw.air_0C) - { - return (vw)*sqrt( (temp+273.15) / 273.0); - } - - /// - /// calculates the speeds the sound with a wave length of wL and a - /// frequency of f. - /// - /// The frequency. - /// The wave length. - /// speed of sound (Vw) - static ld speedOfSound_fwL(const ld f, const ld wL) - { - return f * wL; - } - - /// - /// Calculates the doppler effect of a moving source heading away from - /// an observer. - /// - /// The frequency. - /// The speed of sound through material. - /// The speed of the moving source. - /// frequency of the sound waves - static ld dopplerEffect_movingSource_awayFromObserver(const ld f, const ld Vw, const ld Vs) - { - return f * (Vw / (Vw + Vs)); - } - - /// - /// calcualtes the doppler effect of a moving source heading towards - /// the observer. - /// - /// The frequency. - /// The speed of sound through material. - /// The speed of the moving source. - /// frequency of the sound waves - static ld dopplerEffect_movingSource_towardsObserver(const ld f, const ld Vw, const ld Vs) - { - return f * (Vw / (Vw - Vs)); - } - - /// - /// Calculates the doppler effect of a stationary source and observer - /// moving towards source. - /// - /// The frequency. - /// The speed of sound through material. - /// The speed of the observer. - /// frequency of sound waves - static ld dopplerEffect_stationarySource_towardsSource(const ld f, const ld Vw, const ld Vobs) - { - return f * ((Vw + Vobs)/Vw); - } - - /// - /// Calculates the dopple effect of a stationary source and observer - /// moving away from the source. - /// - /// The frequency. - /// The speed of sound through material. - /// The speed of the observer. - /// frequency of sound waves - static ld dopplerEffect_stationarySource_awayFromSource(const ld f, const ld Vw, const ld Vobs) - { - return f * ((Vw - Vobs)/Vw); - } - - /// - /// Two eagles fly directly toward one another, the first at v1 m/s and - /// the second at v2 m/s. Both screech, the first one emitting a frequency - /// of f1 Hz and the second one emitting a frequency of f2 Hz. - /// What frequencies do they receive if the speed of sound is vw m/s? - /// - /// The speed of object 1. - /// The speed of object 2. - /// The frequency of object 1. - /// The frequency of object 2. - /// The speed of sound. - /// vector with the frequency each object hears, - static vector dopplerEffect_2movingSources_towards - (const ld v1, const ld v2, const ld f1, const ld f2, const ld vw) - { - vector results = {0.0, 0.0}; - results[0] = f2 * ((vw + v1) / (vw - v2));//obj1 hears - results[1] = f1 * ((vw + v2) / (vw - v1));//obj2 hears - return results; - } - - - /// - /// calculates the intensity of a sound wave as it is related to its amplitude - /// squared by the following relationship - /// (p * p) / (2.0 * density * v) here the p is the pressure variation or pressure amplitude - /// - /// The pressure variation. - /// The density of material for which the sound wave travels. - /// The speed of the sound in the medium in units of m/s. - /// the sound intensity - static ld I(const ld p, const ld density, const ld v) - { - return (p * p) / (2.0 * density * v); - } - - /// - /// something produces a noise at a - /// level of dB decibels. What is this in watts per meter squared, also - /// known as intensity (I)? - /// - /// The decibel level. - /// the intensity in W/m^2 - static ld intensityFrom_dB(const ld dB) - { - return I_ref * pow(10, dB / 10); - } - - /// - /// Calculates the decibel level of a sound wave with the know intensity. - /// - /// The i. - /// - static ld soundIntensityLevel_dB(const ld I) - { - return static_cast(10.0) * static_cast(log10((I / I_ref))); - } - - /// - /// What is the intensity of a sound that has a level dB_dif lower than - /// a I1 intensity W/m2 sound? - /// - /// The The know sound Intensity. - /// The difference in decibels. - /// Intensity of the second sound - static ld soundIntensity(const ld I1, const ld dB_dif) - { - return I1 * pow(10, ((dB_dif / 10.0))); - } - - - /// - /// calculates the length of the of tube from frequency. - /// - /// The f. - /// The vw. - /// length of tube - static ld lengthOfTube(const ld f, const ld vw = Vw.air_0C) - { - return vw / (4.0 * f); - } - - /// - /// Fundamentals the frequency closed tube. - /// - /// The l. - /// The vw. - /// fundamental frequency - static ld fundamentalFrequency_closedTube(const ld L, const ld vw = Vw.air_0C) - { - return vw / (4.0 * L); - } - - static ld fundamentalFrequency_openTube(const ld vw, const ld L) - { - return vw / (2.0 * L); - } - - /// - /// calculates the overtones of sound wave with the first overtone being - /// n = 3, second overtone n = 5, third n = 7, forth n = 9, etc.. - /// - /// The length of a full wave. - /// The nth overtone value. - /// The speed pf sound through material, defaulted - /// to 0 celsius air. - /// overtone frequency - static ld overtoneCalculator_closedTube(const ld L, const ld n = 1, const ld vw = Vw.air_0C) - { - return (n * vw) / (4.0 * L); - } - - /// - /// Overtones the generator open tube. - /// - /// The speed of sound. - /// The length of tube. - /// The total overtones. - template - static auto overtoneGenerator_openTube_L(const T vw, const T L, const T totalOvertones) - { - const auto S = totalOvertones+1.0; - const auto result = new T[S]; - for (size_t i=1; i(i) * vw) / (2.0 * L);// Initialize all elements to zero. - } - printArr(result, totalOvertones, "openTube overtones"); - //delete[] result; - } - template - static auto overtoneGenerator_closedTube_L(const T vw, const T L, const T totalOvertones) - { - const auto S = totalOvertones+1.0; - const auto result = new T[S]; - for (size_t i=0, j = 3; i(j) * vw) / (4.0 * L); // Initialize all elements to zero. - } - - printArr(result, totalOvertones, "closedTube overtones"); - //delete[] result; - } - - template - static auto overtoneGenerator_openTube_f(const T funFreq, const T totalOvertones) - { - const auto S = totalOvertones+1.0; - const auto result = new T[S]; - for (size_t i=1; i(i) * funFreq;// Initialize all elements to zero. - } - printArr(result, totalOvertones, "openTube overtones"); - //delete[] result; - - } - - /// - /// Overtones the generator closed tube. - /// - /// The fun freq. - /// The total overtones. - template - static auto overtoneGenerator_closedTube_f(const T funFreq, const T totalOvertones) - { - const auto S = totalOvertones+1.0; - const auto result = new T[S]; - for (size_t i=1, j = 3; i(j); // Initialize all elements to zero. - } - - printArr(result, totalOvertones, "closedTube overtones"); - //delete[] result; - - } - - /// - /// What frequency sound has wvl wavelength when the speed of sound is vw - /// - /// The wavelength. - /// The speed of sound. - /// frequency of sound(Hz) - static ld frequency(const ld wvl, const ld vw) - { - return vw / wvl; - } - - /// - /// A sonar echo returns to a submarine t seconds after being emitted. - /// What is the distance to the object creating the echo? - /// (Assume that the submarine is in the ocean, not in fresh water.) - /// - /// The time is seconds. - /// The speed of sound. default is sea water. change if - /// need another value. values can be found in the Vw structure. - /// length between sonar source and object causing it to bounce - /// back - static ld distanceSonarEcho(const ld t, const ld vw = Vw.water_sea) - { - return (vw * t) / 2.0; - } - - /// - /// If a sound some distance away from you makes a noise of dB decibel, - /// what is the noise level if x number more of those are added at the same - /// distance, assuming interference has a negligible effect - /// - /// The dB. - /// The increase factor. - /// noise level in decibels (dB) - static ld noiseLevel(const ld dB, const ld x) - { - return dB + 10.0 * log(x); - } - - /// - /// calculates the pressure amplitude in terms of Intensity - /// - /// The pressure. - /// The velocity. - /// The intensity. - /// pressure amplitude, gauge pressure( - static ld pressureAmplitude_I(const ld p, const ld v, const ld I) - { - return sqrt(2.0 * p * v * I); - } - - /// - /// If a sound intensity level of dB1 corresponds to a maximum - /// gauge pressure (sound amplitude) of p1, what is the maximum gauge - /// pressure in a db2 decibel sound? - /// - /// The decibels of sound 1. - /// The gauge pressure of sound 1 . - /// The decibel level of the second sound. - /// p2, the pressure amplitude related to dB2 - static ld pressureAmplitude_p(const ld dB1, const ld p1, const ld dB2) - { - return p1*pow(10,(dB2 - dB1)/20); - } - - /// - /// A commuter train blows its horn at a frequency of fHorn as it approaches - /// a crossing. The speed of sound is vw. An observer waiting at the crossing - /// receives a frequency of fobs Hz. What is the speed of the train? - /// - /// The known frequency of train horn. - /// The observed frequency as train approaches. - /// The speed of sound. - /// speed of train - static ld speedOfApproachingTrain(const ld fHorn, const ld fobs, const ld vw) - { - return vw - vw * (fHorn / fobs); - } - - /// - /// calculates the beat frequency which is the absolute difference between - /// two frequencies. - /// - /// The first frequency. - /// The second frequency. - /// beat frequency - static ld beatFrequency(const ld f1, const ld f2) - { - return abs(f1 - f2); - } - - ~Hearing() - { - delete _hearingPtr; - } - -}; -#endif //PHYSICSFORMULA_HEARING_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_HEARING_H +#define PHYSICSFORMULA_HEARING_H +/** + * @class Hearing + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @date 12/31/2020 + */ +#include "Waves.h" + +#include + + +static int hearing_objectCount = 0; + +/// +/// The reference Intensity, is the lowest threshold intensity of sound a +/// person with normal hearing can perceive at a frequency of 1000Hz +/// +constexpr auto I_ref = 1.0e-12; + +static struct SoundSpeeds +{ + const ld air_0C = 331.0; // 331, gas 0C + const ld carbonDioxide = 259.0; // 259, gas 0C + const ld oxygen = 316.0; // 316, gas 0C + const ld helium = 965.0; // 965, gas 0C + const ld hydrogen = 1290.0; // 1290, gas 0C + const ld ethanol = 1160.0; // 1160, liquid 20C + const ld mercury = 1450.0; // 1450.0, liquid 20C + const ld water_fresh = 1480.0; // 1480.0, liquid 20C + const ld water_sea = 1540.0; // 1540.0, liquid 20C + const ld humanTissue = 1540.0; // 1540.0, liquid 20C + const ld vulcanized_rubber = 54.0; // 54.0, solid longitudinal or bulk + const ld polyethylene = 920.0; // 920.0, solid longitudinal or bulk + const ld marble = 3810.0; // 3810.0, solid longitudinal or bulk + const ld glass_pyrex = 5640.0; // 5640.0, solid longitudinal or bulk + const ld lead = 1960.0; // 1960.0, solid longitudinal or bulk + const ld aluminum = 5120.0; // 5120.0, solid longitudinal or bulk + const ld steel = 5960.0; // 5960.0, solid longitudinal or bulk + +}Vw; + + +class Hearing : + public Waves +{ +private: + static void countIncrease() { hearing_objectCount += 1; } + static void countDecrease() { hearing_objectCount -= 1; } +public: + Hearing* _hearingPtr; + Waves* _wavePtr; + + Hearing() + { + _hearingPtr = nullptr; + _wavePtr = nullptr; + countIncrease(); + } + + /** + * @brief copy constructor + */ + Hearing(const Hearing& t) + : Waves(t) + { + _hearingPtr = t._hearingPtr; + _wavePtr = t._wavePtr; + countIncrease(); + } + /** + * #brief move constructor + */ + Hearing(Hearing&& t) noexcept + { + _hearingPtr = t._hearingPtr; + _wavePtr = t._wavePtr; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Hearing& operator=(const Hearing& t) + { + if (this != &t) + { + _hearingPtr = t._hearingPtr; + _wavePtr = t._wavePtr; + countIncrease(); + } + return *this; + } + + static void show_objectCount() { std::cout << "\n hearing object count: " << hearing_objectCount << std::endl; } + static int get_objectCount() { return hearing_objectCount; } + inline auto static printArr = [](const T arr[], T n, string label = "array values") + { + + cout << "\n" + label + ": "; + for (size_t i = 0; i < n; i++) + { + cout << arr[i] << ' '; + } + cout << endl; + }; + /* + void static printArr(const double arr[], int n, string label = "array values") + { + + cout << "\n"+ label+": "; + for (size_t i = 0; i < n; i++) + { + cout << arr[i] << ' '; + } + cout << endl; + } + */ + /// + /// Calculates the speeds of sound when the temp of surrounding enviroment + /// is known and converted to kelvins in this formula. + /// Vw = (vw)*sqrt(temp / 273.0) + /// + /// The temperature in celsius. + /// The air speed at 0C is the default. + /// + static ld speedOfSound(const ld temp, const ld vw = Vw.air_0C) + { + return (vw)*sqrt( (temp+273.15) / 273.0); + } + + /// + /// calculates the speeds the sound with a wave length of wL and a + /// frequency of f. + /// + /// The frequency. + /// The wave length. + /// speed of sound (Vw) + static ld speedOfSound_fwL(const ld f, const ld wL) + { + return f * wL; + } + + /// + /// Calculates the doppler effect of a moving source heading away from + /// an observer. + /// + /// The frequency. + /// The speed of sound through material. + /// The speed of the moving source. + /// frequency of the sound waves + static ld dopplerEffect_movingSource_awayFromObserver(const ld f, const ld Vw, const ld Vs) + { + return f * (Vw / (Vw + Vs)); + } + + /// + /// calcualtes the doppler effect of a moving source heading towards + /// the observer. + /// + /// The frequency. + /// The speed of sound through material. + /// The speed of the moving source. + /// frequency of the sound waves + static ld dopplerEffect_movingSource_towardsObserver(const ld f, const ld Vw, const ld Vs) + { + return f * (Vw / (Vw - Vs)); + } + + /// + /// Calculates the doppler effect of a stationary source and observer + /// moving towards source. + /// + /// The frequency. + /// The speed of sound through material. + /// The speed of the observer. + /// frequency of sound waves + static ld dopplerEffect_stationarySource_towardsSource(const ld f, const ld Vw, const ld Vobs) + { + return f * ((Vw + Vobs)/Vw); + } + + /// + /// Calculates the dopple effect of a stationary source and observer + /// moving away from the source. + /// + /// The frequency. + /// The speed of sound through material. + /// The speed of the observer. + /// frequency of sound waves + static ld dopplerEffect_stationarySource_awayFromSource(const ld f, const ld Vw, const ld Vobs) + { + return f * ((Vw - Vobs)/Vw); + } + + /// + /// Two eagles fly directly toward one another, the first at v1 m/s and + /// the second at v2 m/s. Both screech, the first one emitting a frequency + /// of f1 Hz and the second one emitting a frequency of f2 Hz. + /// What frequencies do they receive if the speed of sound is vw m/s? + /// + /// The speed of object 1. + /// The speed of object 2. + /// The frequency of object 1. + /// The frequency of object 2. + /// The speed of sound. + /// vector with the frequency each object hears, + static vector dopplerEffect_2movingSources_towards + (const ld v1, const ld v2, const ld f1, const ld f2, const ld vw) + { + vector results = {0.0, 0.0}; + results[0] = f2 * ((vw + v1) / (vw - v2));//obj1 hears + results[1] = f1 * ((vw + v2) / (vw - v1));//obj2 hears + return results; + } + + + /// + /// calculates the intensity of a sound wave as it is related to its amplitude + /// squared by the following relationship + /// (p * p) / (2.0 * density * v) here the p is the pressure variation or pressure amplitude + /// + /// The pressure variation. + /// The density of material for which the sound wave travels. + /// The speed of the sound in the medium in units of m/s. + /// the sound intensity + static ld I(const ld p, const ld density, const ld v) + { + return (p * p) / (2.0 * density * v); + } + + /// + /// something produces a noise at a + /// level of dB decibels. What is this in watts per meter squared, also + /// known as intensity (I)? + /// + /// The decibel level. + /// the intensity in W/m^2 + static ld intensityFrom_dB(const ld dB) + { + return I_ref * pow(10, dB / 10); + } + + /// + /// Calculates the decibel level of a sound wave with the know intensity. + /// + /// The i. + /// + static ld soundIntensityLevel_dB(const ld I) + { + return static_cast(10.0) * static_cast(log10((I / I_ref))); + } + + /// + /// What is the intensity of a sound that has a level dB_dif lower than + /// a I1 intensity W/m2 sound? + /// + /// The The know sound Intensity. + /// The difference in decibels. + /// Intensity of the second sound + static ld soundIntensity(const ld I1, const ld dB_dif) + { + return I1 * pow(10, ((dB_dif / 10.0))); + } + + + /// + /// calculates the length of the of tube from frequency. + /// + /// The f. + /// The vw. + /// length of tube + static ld lengthOfTube(const ld f, const ld vw = Vw.air_0C) + { + return vw / (4.0 * f); + } + + /// + /// Fundamentals the frequency closed tube. + /// + /// The l. + /// The vw. + /// fundamental frequency + static ld fundamentalFrequency_closedTube(const ld L, const ld vw = Vw.air_0C) + { + return vw / (4.0 * L); + } + + static ld fundamentalFrequency_openTube(const ld vw, const ld L) + { + return vw / (2.0 * L); + } + + /// + /// calculates the overtones of sound wave with the first overtone being + /// n = 3, second overtone n = 5, third n = 7, forth n = 9, etc.. + /// + /// The length of a full wave. + /// The nth overtone value. + /// The speed pf sound through material, defaulted + /// to 0 celsius air. + /// overtone frequency + static ld overtoneCalculator_closedTube(const ld L, const ld n = 1, const ld vw = Vw.air_0C) + { + return (n * vw) / (4.0 * L); + } + + /// + /// Overtones the generator open tube. + /// + /// The speed of sound. + /// The length of tube. + /// The total overtones. + template + static auto overtoneGenerator_openTube_L(const T vw, const T L, const T totalOvertones) + { + const auto S = totalOvertones+1.0; + const auto result = new T[S]; + for (size_t i=1; i(i) * vw) / (2.0 * L);// Initialize all elements to zero. + } + printArr(result, totalOvertones, "openTube overtones"); + //delete[] result; + } + template + static auto overtoneGenerator_closedTube_L(const T vw, const T L, const T totalOvertones) + { + const auto S = totalOvertones+1.0; + const auto result = new T[S]; + for (size_t i=0, j = 3; i(j) * vw) / (4.0 * L); // Initialize all elements to zero. + } + + printArr(result, totalOvertones, "closedTube overtones"); + //delete[] result; + } + + template + static auto overtoneGenerator_openTube_f(const T funFreq, const T totalOvertones) + { + const auto S = totalOvertones+1.0; + const auto result = new T[S]; + for (size_t i=1; i(i) * funFreq;// Initialize all elements to zero. + } + printArr(result, totalOvertones, "openTube overtones"); + //delete[] result; + + } + + /// + /// Overtones the generator closed tube. + /// + /// The fun freq. + /// The total overtones. + template + static auto overtoneGenerator_closedTube_f(const T funFreq, const T totalOvertones) + { + const auto S = totalOvertones+1.0; + const auto result = new T[S]; + for (size_t i=1, j = 3; i(j); // Initialize all elements to zero. + } + + printArr(result, totalOvertones, "closedTube overtones"); + //delete[] result; + + } + + /// + /// What frequency sound has wvl wavelength when the speed of sound is vw + /// + /// The wavelength. + /// The speed of sound. + /// frequency of sound(Hz) + static ld frequency(const ld wvl, const ld vw) + { + return vw / wvl; + } + + /// + /// A sonar echo returns to a submarine t seconds after being emitted. + /// What is the distance to the object creating the echo? + /// (Assume that the submarine is in the ocean, not in fresh water.) + /// + /// The time is seconds. + /// The speed of sound. default is sea water. change if + /// need another value. values can be found in the Vw structure. + /// length between sonar source and object causing it to bounce + /// back + static ld distanceSonarEcho(const ld t, const ld vw = Vw.water_sea) + { + return (vw * t) / 2.0; + } + + /// + /// If a sound some distance away from you makes a noise of dB decibel, + /// what is the noise level if x number more of those are added at the same + /// distance, assuming interference has a negligible effect + /// + /// The dB. + /// The increase factor. + /// noise level in decibels (dB) + static ld noiseLevel(const ld dB, const ld x) + { + return dB + 10.0 * log(x); + } + + /// + /// calculates the pressure amplitude in terms of Intensity + /// + /// The pressure. + /// The velocity. + /// The intensity. + /// pressure amplitude, gauge pressure( + static ld pressureAmplitude_I(const ld p, const ld v, const ld I) + { + return sqrt(2.0 * p * v * I); + } + + /// + /// If a sound intensity level of dB1 corresponds to a maximum + /// gauge pressure (sound amplitude) of p1, what is the maximum gauge + /// pressure in a db2 decibel sound? + /// + /// The decibels of sound 1. + /// The gauge pressure of sound 1 . + /// The decibel level of the second sound. + /// p2, the pressure amplitude related to dB2 + static ld pressureAmplitude_p(const ld dB1, const ld p1, const ld dB2) + { + return p1*pow(10,(dB2 - dB1)/20); + } + + /// + /// A commuter train blows its horn at a frequency of fHorn as it approaches + /// a crossing. The speed of sound is vw. An observer waiting at the crossing + /// receives a frequency of fobs Hz. What is the speed of the train? + /// + /// The known frequency of train horn. + /// The observed frequency as train approaches. + /// The speed of sound. + /// speed of train + static ld speedOfApproachingTrain(const ld fHorn, const ld fobs, const ld vw) + { + return vw - vw * (fHorn / fobs); + } + + /// + /// calculates the beat frequency which is the absolute difference between + /// two frequencies. + /// + /// The first frequency. + /// The second frequency. + /// beat frequency + static ld beatFrequency(const ld f1, const ld f2) + { + return abs(f1 - f2); + } + + ~Hearing() + { + delete _hearingPtr; + } + +}; +#endif //PHYSICSFORMULA_HEARING_H diff --git a/Heat.h b/Heat.h index c0058d9..476ba6d 100644 --- a/Heat.h +++ b/Heat.h @@ -1,634 +1,634 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_HEAT_H -#define PHYSICSFORMULA_HEAT_H -/** - * @class Heat - * @details driver class for solving physics problems - * @author Ryan Zurrin testing a push to git hub with this line here - * @date 11/29/2020 - * @last_modified_on 12/14/2020 - */ -#include -#include -#include -#include -constexpr auto _ga_ = 9.81; -using namespace std; -static int heat_objectCount = 0; -/*** - * @ the Stefan Boltzmann constant is often represented as sigma in the - * Stefan Boltzmann->(σ) law of radiation equation - */ -constexpr auto _epsilon_ = 5.67e-8; -typedef long double ld; - -static struct HeatEnergyUnitConversion -{ - static ld kCal_to_calorie(const ld kCal) { return kCal * 1000.0; } //returns calories from kCal - static ld calorie_to_kCal(const ld C) { return C / 1000.0; } // returns kCal from calories - static ld kiloCalorie_to_joule(const ld kCal) { return kCal * 4186.0; } //returns Joules - static ld joule_to_kCal(const ld joule) { return joule / 4186.0; } // returns kCal - -}heConverter; - -/** - * @brief structure holding the heat values of different substances. this is the c value in the - * heat transfer equation, that we must use. Each value is a std::vector holding two different units - * of heat; J/kg*C` or kCal/kg*C`. So c.aluminum[0] would give the value of 900J/kg*C` and - * c.aluminum[1] holds the value of .215 kCal/kg*C` respectfully. - * @variable c stands for specific heat - */ -static struct SpecificHeatCapacity -{ - - const std::vector aluminum_S = { 900.0, .215 };//< 900J/kg*C`, .215kCal/kg*C` > - const std::vector asbestos_S = { 800.0, .19 };//< 800J/kg*C`, .19kCal/kg*C` > - const std::vector concrete_granite_average_S = { 840.0, .20 };//< 840J/kg*C`, .20kCal/kg*C` > - const std::vector copper_S = { 387.0, .0924 };//< 387J/kg*C`, .0924kCal/kg*C` > - const std::vector glass_S = { 840.0, .20 };//< 840.0J/kg*C`, .20kCal/kg*C` > - const std::vector sand_s = { 840.0, };//< 840.0J/kg*C`, .20kCal/kg*C` > - const std::vector gold_S = { 129.0, .0308 };//< 129.0J/kg*C`,.0308kCal/kg*C` > - const std::vector human_body_average_S = { 3474.38, .83 };//< 3500.0J/kg*C`, .83kCal/kg*C` > - const std::vector ice_average_S = { 2090.0, .50 };//< 2090.0J/kg*C`, .50kCal/kg*C` > - const std::vector iron_steel_S = { 452, .108 };//< 452J/kg*C`, .108kCal/kg*C` > - const std::vector lead_S = { 128.0, .0305 };//< 128.0J/kg*C`, .0305kCal/kg*C` > - const std::vector silver_S = { 235.0, .0562 };//< 235.0J/kg*C`, .0562kCal/kg*C` > - const std::vector wood_S = { 1700, .40 };//< 1700J/kg*C`, .40kCal/kg*C` > - const std::vector benzene_L = { 1740.0, .415 };//< 1740.0J/kg*C`, .415kCal/kg*C` > - const std::vector ethanol_L = { 2450, .586 };//< 2450J/kg*C`, .586kCal/kg*C` > - const std::vector glycerin_L = { 2410.0, .576 };//< 2410.0J/kg*C`, .576kCal/kg*C` > - const std::vector mercury_L = { 139, .0333 };//< 139J/kg*C`, .0333kCal/kg*C` > - const std::vector water_L = { 4186.0, 1.0 };//< 4186.0J/kg*C`, 1.0kCal/kg*C` > - const std::vector air_G = { 721.0, .172 };//< 721.0J/kg*C`, .172kCal/kg*C` > - const std::vector air_dry_G = { 1015.0, .242 };//< 1015.0J/kg*C`, .242kCal/kg*C` > - const std::vector ammonia_G = { 1670.0, .399 };//< 1670.0J/kg*C`, .399kCal/kg*C` > - const std::vector ammonia_dry_G = { 2190.0, .523 };//< 2190.0J/kg*C`, .523kCal/kg*C` > - const std::vector carbonDioxide_G = { 638.0, .152 };//< 638.0J/kg*C`, .152kCal/kg*C` > - const std::vector carbonDioxide_dry_G = { 833.0, .199 };//< 833.0J/kg*C`, .199kCal/kg*C` > - const std::vector nitrogen_G = { 739.0, .177 };//< 739.0J/kg*C`, .177kCal/kg*C` > - const std::vector nitrogen_dry_G = { 1040, .248 };//< 1040J/kg*C`,.248kCal/kg*C` > - const std::vector oxygen_G = { 651.0, .156 };//< 651.0J/kg*C`, .156kCal/kg*dC` > - const std::vector oxygen_dry_G = { 913.0, .218 };//< 913.0J/kg*C`, .218kCal/kg*dC` > - const std::vector steam_100C_G = { 1520.0, .363 };//< 1520.0J/kg*C`, .363kCal/kg*dC` > - const std::vector steam_dry_100C_G = { 2020.0, .482 };//< 2020.0J/kg*C`, .482kCal/kg*dC` > - -}_c; - -/** - * structure of latent heat coefficients for fusion (melting point) - */ -static struct LatentHeatFusion -{ - const std::vector helium = { -269.7, 5230.0, 1.25 };// - const std::vector hydrogen = { -259.3, 58600.0, 14.0 };// - const std::vector nitrogen = { -210.0, 25500.0, 6.09 };// - const std::vector oxygen = { -218.8, 13800.0, 3.3 };// - const std::vector ethanol = { -114.0, 104000.0, 24.9 };// - const std::vector ammonia = { -75.0, 0.00, 108.0 };// - const std::vector mercury = { -38.9, 11800.0, 2.82 };// - const std::vector water = { 0.0, 334000.0, 79.8 };// - const std::vector sulfur = { 119, 38100.0, 9.10 };// - const std::vector lead = { 327.0, 24500.0, 5.85 };// - const std::vector antimony = { 631.0, 165000.0, 39.4 };// - const std::vector aluminum = { 660.0, 380000.0, 90.0 };// - const std::vector silver = { 961.0, 88300.0, 21.1 };// - const std::vector gold = { 1063.0, 64500.0, 15.4 };// - const std::vector copper = { 1083.0, 134000.0, 32.0 };// - const std::vector uranium = { 1133.0, 84000.0, 20.0 };// - const std::vector tungsten = { 3410.0, 184000.0, 44.0 };// - -}_Lf; - -/** - * structure of latent heat coefficients for vaporization (boiling point) - */ -static struct LatentHeatVaporization -{ - const std::vector helium = { -268.9, 20900.0, 4.99 };// - const std::vector hydrogen = { -252.9, 452000.0, 108.0 };// - const std::vector nitrogen = { -195.8, 201000.0, 48.0 };// - const std::vector oxygen = { -183.0, 213000.0, 50.9 };// - const std::vector ethanol = { 78.3, 854000.0, 204.0 };// - const std::vector ammonia = { -33.4, 1370000.0, 327.0 };// - const std::vector mercury = { 357, 272000.0, 65.0 };// - const std::vector water = { 100.0, 2256000.0, 539.0 };// - const std::vector sulfur = { 444.6, 326000.0, 77.9 };// - const std::vector lead = { 1750.0, 871000.0, 208.0 };// - const std::vector antimony = { 1440.0, 561000.0, 134.0 };// - const std::vector aluminum = { 2450.0, 11400000.0, 2720.0 };// - const std::vector silver = { 2193.0, 2336000.0, 558.0 };// - const std::vector gold = { 2660.0, 1578000.0, 377.0 };// - const std::vector copper = { 2595.0, 5069000.0, 1211.0 };// - const std::vector uranium = { 3900.0, 1900000.0, 454.0 };// - const std::vector tungsten = { 5900.0, 4810000.0, 1150.0 };// -}_Lv; - -/** - * @brief structure of thermal conductivities of common substances - */ -static struct ThermalConductivity -{ - const ld silver = 420.0; - const ld copper = 390.0; - const ld gold = 318.0; - const ld aluminum = 220.0; - const ld steel_iron = 80.0; - const ld steel_stainless = 14.0; - const ld ice = 2.2; - const ld glass = .84; - const ld concrete_brick = .84; - const ld water = .6; - const ld fatty_tissue_no_blood = .2; - const ld asbestos = .16; - const ld plasterboard = .16; - const ld wood_soft = .08; - const ld wood_medium = .12; - const ld wood_hard = .16; - const ld snow_dry = .10; - const ld cork = .042; - const ld glass_wool = .042; - const ld downFeathers = .025; - const ld air = .023; - const ld styrofoam = .010; -}_k; - - - -/** - * @brief struct of Infrared Emissivity values which are a measure - * of the amount of heat radiation a surface can reflect back out and is a value - * from 0 (perfect thermal mirror) to a 1.0 (perfect black body) - */ -static struct InfraredEmissivityValues -{ - const ld aluminium_anodised = 0.77; - const ld aluminium_polished = 0.05; - const ld asbestos_board = 0.96; - const ld asbestos_fabric = 0.78; - const ld asbestos_paper = 0.93; - const ld asbestos_slate = 0.96; - const ld Brass_highlyPolished = 0.03; - const ld Brass_oxidized = 0.61; - const std::vector Brick_common = {.81, .82, .83, .84, .85, .86};// {.81, .82, .83, .84, .85, .86}; - const ld Brick_common_red = 0.93; - const ld Brick_facing_red = 0.92; - const ld Brick_fireClay = 0.75; - const ld Brick_masonry = 0.94; - const ld Brick_red = 0.90; - const ld Carbon_candle_soot = 0.95; - const ld Carbon_graphite_filed_surface = 0.98; - const ld Carbon_purified = 0.80; - const ld Cement_ = 0.54; - const ld Charcoal_powder = 0.96; - const ld Chipboard_untreated = 0.90; - const ld Chromium_polished = 0.10; - const ld Clay_fired = 0.91; - const ld Concrete = 0.92; - const ld Concrete_dry = 0.95; - const std::vector Concrete_rough = { 0.92, .93, .94, .95, .96, .97 };//{ .92, .93, .94, .95, .96, .97 } - const ld Copper_polished = 0.05; - const ld Copper_oxidized = 0.65; - const ld Enamel_lacquer = 0.90; - const ld Fabric_Hessian_green = 0.88; - const ld Fabric_Hessian_uncoloured = 0.87; - const ld Fibreglass = 0.75; - const ld Fibre_board_porous_untreated = 0.85; - const ld Fibre_board_hard_untreated = 0.85; - const ld Filler_white = 0.88; - const ld Firebrick = 0.68; - const ld Food_and_Organic_Materials = 0.96; - const ld Formica = 0.94; - const ld Galvanized_Pipe = 0.46; - const ld Glass = 0.92; - const ld Glass_chemical_ware_partly_transparent = 0.97; - const ld Glass_frosted_high = 0.96; - const ld Glass_frosted_low = 0.70; - const ld Glass_polished_plate = 0.94; - const ld Granite_natural_surface = 0.96; - const ld Graphite_powder = 0.97; - const ld Gravel = 0.28; - const ld Gypsum = 0.08; - const ld Hardwood_across_grain = 0.82; - const ld Hardwood_along_grain = 0.715; - const ld Ice = 0.97; - const ld Iron_heavily_rusted = 0.935; - const ld Lacquer_bakelite = 0.93; - const ld Lacquer_dull_black = 0.97; - const ld Lampblack = 0.96; - const ld Limestone_natural_surface = 0.96; - const ld Mortar = 0.87; - const ld Mortar_dry = 0.94; - const ld PVC = 0.92; - const ld Paint_3M_black_velvet_coating_9560_series_optical_black = 1.00; - const ld Paint_aluminium = 0.45; - const ld Paint_oil_average_of_16_colors = 0.94; - const ld Paint_oil_black_flat = 0.94; - /* - const ld Paint: oil, black, gloss 0.92; - const ld Paint: oil, grey, flat 0.97; - const ld Paint: oil, grey, gloss 0.94; - const ld Paint: oil, various colours 0.94; - const ld Paint: plastic, black 0.95; - const ld Paint: plastic, white 0.84; - const ld Paper: black 0.90; - const ld Paper: black, dull 0.94; - const ld Paper: black, shiny 0.90; - const ld Paper: cardboard box 0.81; - const ld Paper: green 0.85; - const ld Paper: red 0.76; - const ld Paper: white 0.68; - const ld Paper: white bond 0.93; - const ld Paper: yellow 0.72; - const ld Paper: tar 0.92; - const ld Pipes: glazed 0.83; - const ld Plaster 0.86 - 0.90; - const ld Plaster: rough coat 0.91; - const ld Plasterboard: untreated 0.90; - const ld Plastic: acrylic, clear 0.94; - const ld Plastic: black 0.95; - const ld Plastic: white 0.84; - const ld Plastic paper : red 0.94; - const ld Plastic paper : white 0.84; - const ld Plexiglass: Perpex 0.86; - const ld Plywood 0.83 - 0.98; - const ld Plywood: commercial, smooth finish, dry 0.82; - const ld Plywood: untreated 0.83; - const ld Polypropylene 0.97; - const ld Porcelain: glazed 0.92; - const ld Quartz 0.93; - const ld Redwood: wrought, untreated 0.83; - const ld Redwood: unwrought, untreated 0.84;; - const ld Rubber 0.95; - const ld Rubber: stopper, black 0.97; - const ld Sand 0.90; - const ld Skin, human 0.95 - 0.98; - const ld Snow 0.80; - const ld Soil: dry 0.92; - const ld Soil: frozen 0.93; - const ld Soil: saturated with water 0.95; - const ld Stainless Steel 0.59; - const ld Stainless Plate 0.34; - const ld Steel: galvanized 0.28; - const ld Steel: rolled freshly 0.24; - const ld Styrofoam: insulation 0.60; - const ld Tape: electrical, insulating, black 0.97; - const ld Tape: masking 0.92; - const ld Tile: floor, asbestos 0.94; - const ld Tile: glazed 0.94; - const ld Tin: burnished 0.05; - const ld Tin: commercial tin - plated sheet iron 0.06; - const ld Varnish: flat 0.93; - const ld Wallpaper: slight pattern, light grey 0.85; - const ld Wallpaper: slight pattern, red 0.90; - const ld Water: 0.95; - const ld Water: distilled 0.95; - const ld Water: ice, smooth 0.96; - const ld Water: frost crystals 0.98; - const ld Water: snow 0.85; - const ld Wood: planed 0.90; - const ld Wood: panelling, light finish; - const ld Wood: spruce, polished, dry 0.86; - */ - - -}emissivity; - -#include "Temperature.h" -class Heat : - public Temperature -{ -private: - static void countIncrease() { heat_objectCount += 1; } - static void countDecrease() { heat_objectCount -= 1; } -public: - //null pointer to class if ever needed - Heat* _heatPtr; - - /** - * @brief no argument constructor - */ - Heat() - { - _heatPtr = nullptr; - } - - /** - * @brief display method for outputting the count of Heat objects - */ - static void show_heat_objectCount() { std::cout << "\nheat object count: " << heat_objectCount << std::endl; } - /** - * @brief getter method returns the value of heat objects - */ - static int get_heat_objectCount() { return heat_objectCount; } - - /** - * @brief calculates the required heat to heat an object up - * @param mass is the mass of the object - * @param c is the specific heat which depends on object type - * @param deltaTemp is the change in temperature - * @returns the heat in Joules - */ - static ld heatTransfer_Q(const ld mass, const ld c, const ld deltaTemp) - { - return mass * c * deltaTemp; - } - - /** - * @brief calculates the temp from heat transferred - */ - static ld temperatureFromHeatTransferred(const ld Q, const ld mass, const ld c) - { - return Q / (mass * c); - } - - /** - * @brief calculates the final temperature between objects - * @param m1 is the mass of the first object - * @param c1 is the specific heat of object 1 - * @param t1 is the temperature object 1 - * @param m2 is the mass of the second object - * @param c2 is the specific heat of object 2 - * @param t2 is the temperature object 2 - * @returns thermal equilibrium {is when two objects come in contact and the hotter - * object transfers heat to the cooler object until a equal temp is reached between two objects} - */ - static ld finalTemp_ThermalEquilibrium2objects(const ld m1, const ld c1, const ld t1, const ld m2, const ld c2, const ld t2) - { - return ((m1 * c1 * t1) + (m2 * c2 * t2)) / ((m1 * c1) + (m2 * c2)); - } - - /** - * @brief calculates the phase change from melting/freezing - * @param mass is the mass in kg - * @param Lf is the latent heat coefficient for fusion - * @returns the energy to cause phase change - */ - static ld phaseChangeEnergy_Lf(const ld mass, const ld Lf) - { - return mass * Lf; - } - - /** - * @brief calculates the phase change from vaporization/condensation - * @param mass is the mass in kg - * @param Lv is the latent heat coefficient for vaporization - * @returns the energy to cause phase change - */ - static ld phaseChangeEnergy_Lv(const ld mass, const ld Lv) - { - return mass * Lv; - } - - /** - * @brief calculates the final temp after a phase change - * @param heatTransferTotal is the total calculated value from the heatTransfer_Q method - * @param phaseChangeTotal is the calculated value of the phase change in question - * @param totalMass of objects combined - * @param c is the specific heat of substance - * @returns the final temperature - */ - static ld finalTempFromPhaseChange(const ld heatTransferTotal, const ld phaseChangeTotal, const ld totalMass, const ld c) - { - return (heatTransferTotal - phaseChangeTotal) / (totalMass * c); - } - - /** - * @brief calculates the heat transfer through conduction - * @param k is the thermal conductivity - * @param A is total surface area - * @param deltaTemp is the change in temperature - * @param d the thickness of substance - * @returns the Q value or heat transfer total - */ - static ld heatTransferConduction_Q(const ld k, const ld A, const ld deltaTemp, const ld d) - { - return ((k * A * deltaTemp) / d); - } - - /** - * @brief calculates the total mass as a result of heat transfer though conduction - * @param htcQ is the result from the heatTransferConduction_Q method using those know variables - * @param Lf is the latent heat fusion coefficient for material - */ - static ld heatTransferConduction_mass(const ld htcQ, const ld Lf) - { - return htcQ / Lf; - } - - /** - * @breif temperatureDifferenceMaintainedByHeatTransfer - * @param QmLv is the result from method phaseChangeEnergy_vaporizationCondensation_Q using the known values in - * this method will provide the result for this method, unless the value is given directly of course - * @param d is the thickness of the material - * @param k is the thermal conductivity value - * @param A is the surface area - * @returns temperature difference maintained in heat transfer - */ - static ld temperatureDifferenceMaintainedByHeatTransfer(const ld QmLv, const ld d, const ld k, const ld A) - { - return QmLv * (d / (k * A)); - } - - /** - * @brief calculates mass flow during convection (sweat-heat transfer) - */ - static ld massFlowDuringConvection(const ld QmLv, const ld Lv) - { - return QmLv / Lv; - } - - /** - * @brief Stefan-Boltzmann law of radiation - * @param e emissivity - * @param A surface area of object - * @param T absolute temperature in Kelvin - * @returns heat transfer by emitted radiation - */ - static ld stefanBoltzmannLawOfRadiation(const ld e, const ld A, const ld T) - { - return _epsilon_ * e * A * pow(T, 4); - } - - - /** - * @brief Uses the Stefan-Boltzmann law of radiation equation - * @param e - */ - static ld netRateOfHeatTransferByRadiation(const ld e, const ld A, const ld T1, const ld T2) - { - return _epsilon_ * e * A * ((pow(T2, 4) - pow(T1, 4))); - } - - /** - * @brief calculates the initial temperature of falling water using conservation of mechanical energy - * @param h is the height of the fall of water or substance - * @param Tf is the final temp after the drop occurs - * @param _c is the specific heat of something(default is waters value of - */ - static ld initialTempFromFallingWater(const ld h, const ld Tf, const ld _c_ = _c.water_L[0]) - { - return Tf - (_ga_ * h) / _c_; - } - - /** - * @brief calculates the initial temperature of an object after being submerged into a - * liquid of a certain temperature, by using the final temp of both and the specific heats - * of both as well in the equation T1i = ((m2c2(T2f-T2i))/(m1c1))+T1f - * @param m1 mass of object 1 in kg - * @param c1 specific heat of object 1 - * @param m2 mass of object 2 in kg - * @param c2 specific heat of object 2 - * @param T2i initial temperature of object 2 - * @param finalTboth temperature of both objects after equilibrium - * @returns initial temperature of object 1 - */ - static ld initialTempFromEqualLibrium(const ld m1, const ld c1, const ld m2, const ld c2, const ld T2i, const ld finalTboth) - { - return ((m2 * c2 * (finalTboth - T2i)) / (m1 * c1)) + finalTboth; - } - - /** - * @brief calculates the initial temperature of a substance after equilibrium when in contact or mixed with same substance, - * which means the specific heats cancel so we are left with a simpler equation: T1i = ((m2(T2f-T2i))/(m1))+T1f - * @param m1 mass of object 1 in kg - * @param m2 mass of object 2 in kg - * @param T2i initial temperature of object 2 - * @param finalTboth temperature of both objects after equilibrium - * @returns initial temperature of object 1 - */ - static ld initialTempFromEqualLibrium(const ld m1, const ld m2, const ld T2i, const ld finalTboth) - { - return ((m2 * (finalTboth - T2i)) / (m1)) + finalTboth; - } - - /** - * @brief calculates the amount of a fluid added to another fluid in single container(think adding creamer to coffee) - * @param m1cup mass in kg - * @param c1cup specific heat - * @param T1cup initial temp in c - * @param m2cof mass 2 in kg - * @param c2cof specific heat 2 - * @param T2cof initial temp of m2 - * @param c3cr specific heat of m3(unknown being solved for) - * @param T3cr initial temp of m3 - * @param Tf equilibrium temp - * @param mode 'k' kilograms is default, use 'g' for answer in grams - * @returns the mass of m3cr in kg - */ - static ld massOfFluid2AddedToFluid1In1Container - (const ld m1cup, const ld c1cup, const ld T1cup, const ld m2cof, const ld c2cof, const ld T2cof, const ld c3cr, const ld T3cr, const ld Tf, char mode = 'k') - { - const ld heatGainedByCup = m1cup * c1cup * (Tf - T1cup); - cout << "heat gain by cup: " << heatGainedByCup << endl; - const ld heatLostByCoffee = m2cof * c2cof * (Tf - T2cof); - cout << "heat lost by coffee: " << heatLostByCoffee << endl; - const ld heatGainedByCream = c3cr * (Tf - T3cr); - cout << "heat gain by cream: " << heatGainedByCream << endl; - - if(mode == 'k') - { - return (abs(heatLostByCoffee) - heatGainedByCup) / (heatGainedByCream); - } - else - return (abs(heatLostByCoffee) - heatGainedByCup) / (heatGainedByCream) * 1000.0; - } - - /** - * @brief calculates the thickness of ice on a windshield - */ - static ld thicknessOfIceOnWindshield(const ld iceTemp, const ld surfaceArea, const ld energyToMelt, const ld _Lf_ = _Lf.water[1], const ld _c_ = _c.ice_average_S[0], const ld density = 917.0) - { - cout << "lf: " << _Lf_ << endl; - const double q1 = _c_ * -iceTemp; - cout << "q1: " << q1 << endl; - const double q2 = q1 + _Lf_; - cout << "q2: " << q2 << endl; - const double q3 = energyToMelt / q2; - cout << "q3: " << q3 << endl; - const double volumeIce = q3 / density; - cout << "v: " << volumeIce << endl; - cout << "thickness: : " << volumeIce / surfaceArea << endl; - return volumeIce / surfaceArea; - } - - - /** - * @calculaes tF of a ice cube placed in water - */ - static ld finalTemperatureMeltingIceInWater(const ld mI, const ld cI, const ld Ti, const ld mW, const ld cW, const ld Tw, const ld Lfw = _Lf.water[2] ) - { - const double q1 = mI * cI * -Ti; - const double q2 = mI * Lfw; - const double q3 = mI; - const double q4 = mW * cW * -Tw; - return (-q4 - (q1+q2))/(q3 + mW); - } - - /** - * @brief calculates the final temperature of a bowl of soup placed in a freezer when a - * specified amount of energy is transferred away from the objects by the freezer the final temp found - * @param m_b mass of bowl in Kg - * @param c_b specific heat of bowl(varies with what bowl is made from) - * @param m_s mass of soup in kg - * @param c_s specific heat of soup (similar to that of water in most cases) - * @param c_i specific heat of ice - * @param Ti initial temperature of the soup and bowl - * @param Lf latent heat of fusion - * @param Q total energy transferred from soup and bowl - */ - static ld finalTempBowlSoupInFreezer(const ld m_b, const ld c_b, const ld m_s, const ld c_s, const ld c_i, const ld Ti, const ld Lf, const ld Q) - { - return ((((m_b * c_b) * (Ti)) + ((m_s * c_s) * (Ti))) + (m_s * Lf) - Q) / ((m_b * c_b) + (m_s * c_i)); - } - - /** - * @brief calculates the specific heat of a substance - * @param m mass in kg - * @param Ti initial temp - * @param Tf final temp - * @param Q heat energy used - */ - static ld specificHeat(const ld m, const ld Ti, const ld Tf, const ld Q) - { - return Q / (m * (Tf - Ti)); - } - - /** - * @brief calculates the time to heat water - * @param Q heat energy - * @param P power in watts - * @returns time in seconds - */ - static ld timeToHeatWater(const ld Q, const ld P) - { - return Q / P; - } - - - /// - /// Times to heat object. - /// - /// The mass. - /// The specific heat. - /// The δ temperature. - /// The power output. - /// time to heat object by specified temperature - static ld timeToHeatObject(const ld m, const ld c_, const ld deltaTime, const ld P) - { - return (m * c_ * deltaTime) / P; - } - - - /** - *@brief destructor - */ - ~Heat() - { - delete _heatPtr; - } -}; - -#endif //PHYSICSFORMULA_HEAT_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_HEAT_H +#define PHYSICSFORMULA_HEAT_H +/** + * @class Heat + * @details driver class for solving physics problems + * @author Ryan Zurrin testing a push to git hub with this line here + * @date 11/29/2020 + * @last_modified_on 12/14/2020 + */ +#include +#include +#include +#include +constexpr auto _ga_ = 9.81; +using namespace std; +static int heat_objectCount = 0; +/*** + * @ the Stefan Boltzmann constant is often represented as sigma in the + * Stefan Boltzmann->(σ) law of radiation equation + */ +constexpr auto _epsilon_ = 5.67e-8; +typedef long double ld; + +static struct HeatEnergyUnitConversion +{ + static ld kCal_to_calorie(const ld kCal) { return kCal * 1000.0; } //returns calories from kCal + static ld calorie_to_kCal(const ld C) { return C / 1000.0; } // returns kCal from calories + static ld kiloCalorie_to_joule(const ld kCal) { return kCal * 4186.0; } //returns Joules + static ld joule_to_kCal(const ld joule) { return joule / 4186.0; } // returns kCal + +}heConverter; + +/** + * @brief structure holding the heat values of different substances. this is the c value in the + * heat transfer equation, that we must use. Each value is a std::vector holding two different units + * of heat; J/kg*C` or kCal/kg*C`. So c.aluminum[0] would give the value of 900J/kg*C` and + * c.aluminum[1] holds the value of .215 kCal/kg*C` respectfully. + * @variable c stands for specific heat + */ +static struct SpecificHeatCapacity +{ + + const std::vector aluminum_S = { 900.0, .215 };//< 900J/kg*C`, .215kCal/kg*C` > + const std::vector asbestos_S = { 800.0, .19 };//< 800J/kg*C`, .19kCal/kg*C` > + const std::vector concrete_granite_average_S = { 840.0, .20 };//< 840J/kg*C`, .20kCal/kg*C` > + const std::vector copper_S = { 387.0, .0924 };//< 387J/kg*C`, .0924kCal/kg*C` > + const std::vector glass_S = { 840.0, .20 };//< 840.0J/kg*C`, .20kCal/kg*C` > + const std::vector sand_s = { 840.0, };//< 840.0J/kg*C`, .20kCal/kg*C` > + const std::vector gold_S = { 129.0, .0308 };//< 129.0J/kg*C`,.0308kCal/kg*C` > + const std::vector human_body_average_S = { 3474.38, .83 };//< 3500.0J/kg*C`, .83kCal/kg*C` > + const std::vector ice_average_S = { 2090.0, .50 };//< 2090.0J/kg*C`, .50kCal/kg*C` > + const std::vector iron_steel_S = { 452, .108 };//< 452J/kg*C`, .108kCal/kg*C` > + const std::vector lead_S = { 128.0, .0305 };//< 128.0J/kg*C`, .0305kCal/kg*C` > + const std::vector silver_S = { 235.0, .0562 };//< 235.0J/kg*C`, .0562kCal/kg*C` > + const std::vector wood_S = { 1700, .40 };//< 1700J/kg*C`, .40kCal/kg*C` > + const std::vector benzene_L = { 1740.0, .415 };//< 1740.0J/kg*C`, .415kCal/kg*C` > + const std::vector ethanol_L = { 2450, .586 };//< 2450J/kg*C`, .586kCal/kg*C` > + const std::vector glycerin_L = { 2410.0, .576 };//< 2410.0J/kg*C`, .576kCal/kg*C` > + const std::vector mercury_L = { 139, .0333 };//< 139J/kg*C`, .0333kCal/kg*C` > + const std::vector water_L = { 4186.0, 1.0 };//< 4186.0J/kg*C`, 1.0kCal/kg*C` > + const std::vector air_G = { 721.0, .172 };//< 721.0J/kg*C`, .172kCal/kg*C` > + const std::vector air_dry_G = { 1015.0, .242 };//< 1015.0J/kg*C`, .242kCal/kg*C` > + const std::vector ammonia_G = { 1670.0, .399 };//< 1670.0J/kg*C`, .399kCal/kg*C` > + const std::vector ammonia_dry_G = { 2190.0, .523 };//< 2190.0J/kg*C`, .523kCal/kg*C` > + const std::vector carbonDioxide_G = { 638.0, .152 };//< 638.0J/kg*C`, .152kCal/kg*C` > + const std::vector carbonDioxide_dry_G = { 833.0, .199 };//< 833.0J/kg*C`, .199kCal/kg*C` > + const std::vector nitrogen_G = { 739.0, .177 };//< 739.0J/kg*C`, .177kCal/kg*C` > + const std::vector nitrogen_dry_G = { 1040, .248 };//< 1040J/kg*C`,.248kCal/kg*C` > + const std::vector oxygen_G = { 651.0, .156 };//< 651.0J/kg*C`, .156kCal/kg*dC` > + const std::vector oxygen_dry_G = { 913.0, .218 };//< 913.0J/kg*C`, .218kCal/kg*dC` > + const std::vector steam_100C_G = { 1520.0, .363 };//< 1520.0J/kg*C`, .363kCal/kg*dC` > + const std::vector steam_dry_100C_G = { 2020.0, .482 };//< 2020.0J/kg*C`, .482kCal/kg*dC` > + +}_c; + +/** + * structure of latent heat coefficients for fusion (melting point) + */ +static struct LatentHeatFusion +{ + const std::vector helium = { -269.7, 5230.0, 1.25 };// + const std::vector hydrogen = { -259.3, 58600.0, 14.0 };// + const std::vector nitrogen = { -210.0, 25500.0, 6.09 };// + const std::vector oxygen = { -218.8, 13800.0, 3.3 };// + const std::vector ethanol = { -114.0, 104000.0, 24.9 };// + const std::vector ammonia = { -75.0, 0.00, 108.0 };// + const std::vector mercury = { -38.9, 11800.0, 2.82 };// + const std::vector water = { 0.0, 334000.0, 79.8 };// + const std::vector sulfur = { 119, 38100.0, 9.10 };// + const std::vector lead = { 327.0, 24500.0, 5.85 };// + const std::vector antimony = { 631.0, 165000.0, 39.4 };// + const std::vector aluminum = { 660.0, 380000.0, 90.0 };// + const std::vector silver = { 961.0, 88300.0, 21.1 };// + const std::vector gold = { 1063.0, 64500.0, 15.4 };// + const std::vector copper = { 1083.0, 134000.0, 32.0 };// + const std::vector uranium = { 1133.0, 84000.0, 20.0 };// + const std::vector tungsten = { 3410.0, 184000.0, 44.0 };// + +}_Lf; + +/** + * structure of latent heat coefficients for vaporization (boiling point) + */ +static struct LatentHeatVaporization +{ + const std::vector helium = { -268.9, 20900.0, 4.99 };// + const std::vector hydrogen = { -252.9, 452000.0, 108.0 };// + const std::vector nitrogen = { -195.8, 201000.0, 48.0 };// + const std::vector oxygen = { -183.0, 213000.0, 50.9 };// + const std::vector ethanol = { 78.3, 854000.0, 204.0 };// + const std::vector ammonia = { -33.4, 1370000.0, 327.0 };// + const std::vector mercury = { 357, 272000.0, 65.0 };// + const std::vector water = { 100.0, 2256000.0, 539.0 };// + const std::vector sulfur = { 444.6, 326000.0, 77.9 };// + const std::vector lead = { 1750.0, 871000.0, 208.0 };// + const std::vector antimony = { 1440.0, 561000.0, 134.0 };// + const std::vector aluminum = { 2450.0, 11400000.0, 2720.0 };// + const std::vector silver = { 2193.0, 2336000.0, 558.0 };// + const std::vector gold = { 2660.0, 1578000.0, 377.0 };// + const std::vector copper = { 2595.0, 5069000.0, 1211.0 };// + const std::vector uranium = { 3900.0, 1900000.0, 454.0 };// + const std::vector tungsten = { 5900.0, 4810000.0, 1150.0 };// +}_Lv; + +/** + * @brief structure of thermal conductivities of common substances + */ +static struct ThermalConductivity +{ + const ld silver = 420.0; + const ld copper = 390.0; + const ld gold = 318.0; + const ld aluminum = 220.0; + const ld steel_iron = 80.0; + const ld steel_stainless = 14.0; + const ld ice = 2.2; + const ld glass = .84; + const ld concrete_brick = .84; + const ld water = .6; + const ld fatty_tissue_no_blood = .2; + const ld asbestos = .16; + const ld plasterboard = .16; + const ld wood_soft = .08; + const ld wood_medium = .12; + const ld wood_hard = .16; + const ld snow_dry = .10; + const ld cork = .042; + const ld glass_wool = .042; + const ld downFeathers = .025; + const ld air = .023; + const ld styrofoam = .010; +}_k; + + + +/** + * @brief struct of Infrared Emissivity values which are a measure + * of the amount of heat radiation a surface can reflect back out and is a value + * from 0 (perfect thermal mirror) to a 1.0 (perfect black body) + */ +static struct InfraredEmissivityValues +{ + const ld aluminium_anodised = 0.77; + const ld aluminium_polished = 0.05; + const ld asbestos_board = 0.96; + const ld asbestos_fabric = 0.78; + const ld asbestos_paper = 0.93; + const ld asbestos_slate = 0.96; + const ld Brass_highlyPolished = 0.03; + const ld Brass_oxidized = 0.61; + const std::vector Brick_common = {.81, .82, .83, .84, .85, .86};// {.81, .82, .83, .84, .85, .86}; + const ld Brick_common_red = 0.93; + const ld Brick_facing_red = 0.92; + const ld Brick_fireClay = 0.75; + const ld Brick_masonry = 0.94; + const ld Brick_red = 0.90; + const ld Carbon_candle_soot = 0.95; + const ld Carbon_graphite_filed_surface = 0.98; + const ld Carbon_purified = 0.80; + const ld Cement_ = 0.54; + const ld Charcoal_powder = 0.96; + const ld Chipboard_untreated = 0.90; + const ld Chromium_polished = 0.10; + const ld Clay_fired = 0.91; + const ld Concrete = 0.92; + const ld Concrete_dry = 0.95; + const std::vector Concrete_rough = { 0.92, .93, .94, .95, .96, .97 };//{ .92, .93, .94, .95, .96, .97 } + const ld Copper_polished = 0.05; + const ld Copper_oxidized = 0.65; + const ld Enamel_lacquer = 0.90; + const ld Fabric_Hessian_green = 0.88; + const ld Fabric_Hessian_uncoloured = 0.87; + const ld Fibreglass = 0.75; + const ld Fibre_board_porous_untreated = 0.85; + const ld Fibre_board_hard_untreated = 0.85; + const ld Filler_white = 0.88; + const ld Firebrick = 0.68; + const ld Food_and_Organic_Materials = 0.96; + const ld Formica = 0.94; + const ld Galvanized_Pipe = 0.46; + const ld Glass = 0.92; + const ld Glass_chemical_ware_partly_transparent = 0.97; + const ld Glass_frosted_high = 0.96; + const ld Glass_frosted_low = 0.70; + const ld Glass_polished_plate = 0.94; + const ld Granite_natural_surface = 0.96; + const ld Graphite_powder = 0.97; + const ld Gravel = 0.28; + const ld Gypsum = 0.08; + const ld Hardwood_across_grain = 0.82; + const ld Hardwood_along_grain = 0.715; + const ld Ice = 0.97; + const ld Iron_heavily_rusted = 0.935; + const ld Lacquer_bakelite = 0.93; + const ld Lacquer_dull_black = 0.97; + const ld Lampblack = 0.96; + const ld Limestone_natural_surface = 0.96; + const ld Mortar = 0.87; + const ld Mortar_dry = 0.94; + const ld PVC = 0.92; + const ld Paint_3M_black_velvet_coating_9560_series_optical_black = 1.00; + const ld Paint_aluminium = 0.45; + const ld Paint_oil_average_of_16_colors = 0.94; + const ld Paint_oil_black_flat = 0.94; + /* + const ld Paint: oil, black, gloss 0.92; + const ld Paint: oil, grey, flat 0.97; + const ld Paint: oil, grey, gloss 0.94; + const ld Paint: oil, various colours 0.94; + const ld Paint: plastic, black 0.95; + const ld Paint: plastic, white 0.84; + const ld Paper: black 0.90; + const ld Paper: black, dull 0.94; + const ld Paper: black, shiny 0.90; + const ld Paper: cardboard box 0.81; + const ld Paper: green 0.85; + const ld Paper: red 0.76; + const ld Paper: white 0.68; + const ld Paper: white bond 0.93; + const ld Paper: yellow 0.72; + const ld Paper: tar 0.92; + const ld Pipes: glazed 0.83; + const ld Plaster 0.86 - 0.90; + const ld Plaster: rough coat 0.91; + const ld Plasterboard: untreated 0.90; + const ld Plastic: acrylic, clear 0.94; + const ld Plastic: black 0.95; + const ld Plastic: white 0.84; + const ld Plastic paper : red 0.94; + const ld Plastic paper : white 0.84; + const ld Plexiglass: Perpex 0.86; + const ld Plywood 0.83 - 0.98; + const ld Plywood: commercial, smooth finish, dry 0.82; + const ld Plywood: untreated 0.83; + const ld Polypropylene 0.97; + const ld Porcelain: glazed 0.92; + const ld Quartz 0.93; + const ld Redwood: wrought, untreated 0.83; + const ld Redwood: unwrought, untreated 0.84;; + const ld Rubber 0.95; + const ld Rubber: stopper, black 0.97; + const ld Sand 0.90; + const ld Skin, human 0.95 - 0.98; + const ld Snow 0.80; + const ld Soil: dry 0.92; + const ld Soil: frozen 0.93; + const ld Soil: saturated with water 0.95; + const ld Stainless Steel 0.59; + const ld Stainless Plate 0.34; + const ld Steel: galvanized 0.28; + const ld Steel: rolled freshly 0.24; + const ld Styrofoam: insulation 0.60; + const ld Tape: electrical, insulating, black 0.97; + const ld Tape: masking 0.92; + const ld Tile: floor, asbestos 0.94; + const ld Tile: glazed 0.94; + const ld Tin: burnished 0.05; + const ld Tin: commercial tin - plated sheet iron 0.06; + const ld Varnish: flat 0.93; + const ld Wallpaper: slight pattern, light grey 0.85; + const ld Wallpaper: slight pattern, red 0.90; + const ld Water: 0.95; + const ld Water: distilled 0.95; + const ld Water: ice, smooth 0.96; + const ld Water: frost crystals 0.98; + const ld Water: snow 0.85; + const ld Wood: planed 0.90; + const ld Wood: panelling, light finish; + const ld Wood: spruce, polished, dry 0.86; + */ + + +}emissivity; + +#include "Temperature.h" +class Heat : + public Temperature +{ +private: + static void countIncrease() { heat_objectCount += 1; } + static void countDecrease() { heat_objectCount -= 1; } +public: + //null pointer to class if ever needed + Heat* _heatPtr; + + /** + * @brief no argument constructor + */ + Heat() + { + _heatPtr = nullptr; + } + + /** + * @brief display method for outputting the count of Heat objects + */ + static void show_heat_objectCount() { std::cout << "\nheat object count: " << heat_objectCount << std::endl; } + /** + * @brief getter method returns the value of heat objects + */ + static int get_heat_objectCount() { return heat_objectCount; } + + /** + * @brief calculates the required heat to heat an object up + * @param mass is the mass of the object + * @param c is the specific heat which depends on object type + * @param deltaTemp is the change in temperature + * @returns the heat in Joules + */ + static ld heatTransfer_Q(const ld mass, const ld c, const ld deltaTemp) + { + return mass * c * deltaTemp; + } + + /** + * @brief calculates the temp from heat transferred + */ + static ld temperatureFromHeatTransferred(const ld Q, const ld mass, const ld c) + { + return Q / (mass * c); + } + + /** + * @brief calculates the final temperature between objects + * @param m1 is the mass of the first object + * @param c1 is the specific heat of object 1 + * @param t1 is the temperature object 1 + * @param m2 is the mass of the second object + * @param c2 is the specific heat of object 2 + * @param t2 is the temperature object 2 + * @returns thermal equilibrium {is when two objects come in contact and the hotter + * object transfers heat to the cooler object until a equal temp is reached between two objects} + */ + static ld finalTemp_ThermalEquilibrium2objects(const ld m1, const ld c1, const ld t1, const ld m2, const ld c2, const ld t2) + { + return ((m1 * c1 * t1) + (m2 * c2 * t2)) / ((m1 * c1) + (m2 * c2)); + } + + /** + * @brief calculates the phase change from melting/freezing + * @param mass is the mass in kg + * @param Lf is the latent heat coefficient for fusion + * @returns the energy to cause phase change + */ + static ld phaseChangeEnergy_Lf(const ld mass, const ld Lf) + { + return mass * Lf; + } + + /** + * @brief calculates the phase change from vaporization/condensation + * @param mass is the mass in kg + * @param Lv is the latent heat coefficient for vaporization + * @returns the energy to cause phase change + */ + static ld phaseChangeEnergy_Lv(const ld mass, const ld Lv) + { + return mass * Lv; + } + + /** + * @brief calculates the final temp after a phase change + * @param heatTransferTotal is the total calculated value from the heatTransfer_Q method + * @param phaseChangeTotal is the calculated value of the phase change in question + * @param totalMass of objects combined + * @param c is the specific heat of substance + * @returns the final temperature + */ + static ld finalTempFromPhaseChange(const ld heatTransferTotal, const ld phaseChangeTotal, const ld totalMass, const ld c) + { + return (heatTransferTotal - phaseChangeTotal) / (totalMass * c); + } + + /** + * @brief calculates the heat transfer through conduction + * @param k is the thermal conductivity + * @param A is total surface area + * @param deltaTemp is the change in temperature + * @param d the thickness of substance + * @returns the Q value or heat transfer total + */ + static ld heatTransferConduction_Q(const ld k, const ld A, const ld deltaTemp, const ld d) + { + return ((k * A * deltaTemp) / d); + } + + /** + * @brief calculates the total mass as a result of heat transfer though conduction + * @param htcQ is the result from the heatTransferConduction_Q method using those know variables + * @param Lf is the latent heat fusion coefficient for material + */ + static ld heatTransferConduction_mass(const ld htcQ, const ld Lf) + { + return htcQ / Lf; + } + + /** + * @breif temperatureDifferenceMaintainedByHeatTransfer + * @param QmLv is the result from method phaseChangeEnergy_vaporizationCondensation_Q using the known values in + * this method will provide the result for this method, unless the value is given directly of course + * @param d is the thickness of the material + * @param k is the thermal conductivity value + * @param A is the surface area + * @returns temperature difference maintained in heat transfer + */ + static ld temperatureDifferenceMaintainedByHeatTransfer(const ld QmLv, const ld d, const ld k, const ld A) + { + return QmLv * (d / (k * A)); + } + + /** + * @brief calculates mass flow during convection (sweat-heat transfer) + */ + static ld massFlowDuringConvection(const ld QmLv, const ld Lv) + { + return QmLv / Lv; + } + + /** + * @brief Stefan-Boltzmann law of radiation + * @param e emissivity + * @param A surface area of object + * @param T absolute temperature in Kelvin + * @returns heat transfer by emitted radiation + */ + static ld stefanBoltzmannLawOfRadiation(const ld e, const ld A, const ld T) + { + return _epsilon_ * e * A * pow(T, 4); + } + + + /** + * @brief Uses the Stefan-Boltzmann law of radiation equation + * @param e + */ + static ld netRateOfHeatTransferByRadiation(const ld e, const ld A, const ld T1, const ld T2) + { + return _epsilon_ * e * A * ((pow(T2, 4) - pow(T1, 4))); + } + + /** + * @brief calculates the initial temperature of falling water using conservation of mechanical energy + * @param h is the height of the fall of water or substance + * @param Tf is the final temp after the drop occurs + * @param _c is the specific heat of something(default is waters value of + */ + static ld initialTempFromFallingWater(const ld h, const ld Tf, const ld _c_ = _c.water_L[0]) + { + return Tf - (_ga_ * h) / _c_; + } + + /** + * @brief calculates the initial temperature of an object after being submerged into a + * liquid of a certain temperature, by using the final temp of both and the specific heats + * of both as well in the equation T1i = ((m2c2(T2f-T2i))/(m1c1))+T1f + * @param m1 mass of object 1 in kg + * @param c1 specific heat of object 1 + * @param m2 mass of object 2 in kg + * @param c2 specific heat of object 2 + * @param T2i initial temperature of object 2 + * @param finalTboth temperature of both objects after equilibrium + * @returns initial temperature of object 1 + */ + static ld initialTempFromEqualLibrium(const ld m1, const ld c1, const ld m2, const ld c2, const ld T2i, const ld finalTboth) + { + return ((m2 * c2 * (finalTboth - T2i)) / (m1 * c1)) + finalTboth; + } + + /** + * @brief calculates the initial temperature of a substance after equilibrium when in contact or mixed with same substance, + * which means the specific heats cancel so we are left with a simpler equation: T1i = ((m2(T2f-T2i))/(m1))+T1f + * @param m1 mass of object 1 in kg + * @param m2 mass of object 2 in kg + * @param T2i initial temperature of object 2 + * @param finalTboth temperature of both objects after equilibrium + * @returns initial temperature of object 1 + */ + static ld initialTempFromEqualLibrium(const ld m1, const ld m2, const ld T2i, const ld finalTboth) + { + return ((m2 * (finalTboth - T2i)) / (m1)) + finalTboth; + } + + /** + * @brief calculates the amount of a fluid added to another fluid in single container(think adding creamer to coffee) + * @param m1cup mass in kg + * @param c1cup specific heat + * @param T1cup initial temp in c + * @param m2cof mass 2 in kg + * @param c2cof specific heat 2 + * @param T2cof initial temp of m2 + * @param c3cr specific heat of m3(unknown being solved for) + * @param T3cr initial temp of m3 + * @param Tf equilibrium temp + * @param mode 'k' kilograms is default, use 'g' for answer in grams + * @returns the mass of m3cr in kg + */ + static ld massOfFluid2AddedToFluid1In1Container + (const ld m1cup, const ld c1cup, const ld T1cup, const ld m2cof, const ld c2cof, const ld T2cof, const ld c3cr, const ld T3cr, const ld Tf, char mode = 'k') + { + const ld heatGainedByCup = m1cup * c1cup * (Tf - T1cup); + cout << "heat gain by cup: " << heatGainedByCup << endl; + const ld heatLostByCoffee = m2cof * c2cof * (Tf - T2cof); + cout << "heat lost by coffee: " << heatLostByCoffee << endl; + const ld heatGainedByCream = c3cr * (Tf - T3cr); + cout << "heat gain by cream: " << heatGainedByCream << endl; + + if(mode == 'k') + { + return (abs(heatLostByCoffee) - heatGainedByCup) / (heatGainedByCream); + } + else + return (abs(heatLostByCoffee) - heatGainedByCup) / (heatGainedByCream) * 1000.0; + } + + /** + * @brief calculates the thickness of ice on a windshield + */ + static ld thicknessOfIceOnWindshield(const ld iceTemp, const ld surfaceArea, const ld energyToMelt, const ld _Lf_ = _Lf.water[1], const ld _c_ = _c.ice_average_S[0], const ld density = 917.0) + { + cout << "lf: " << _Lf_ << endl; + const double q1 = _c_ * -iceTemp; + cout << "q1: " << q1 << endl; + const double q2 = q1 + _Lf_; + cout << "q2: " << q2 << endl; + const double q3 = energyToMelt / q2; + cout << "q3: " << q3 << endl; + const double volumeIce = q3 / density; + cout << "v: " << volumeIce << endl; + cout << "thickness: : " << volumeIce / surfaceArea << endl; + return volumeIce / surfaceArea; + } + + + /** + * @calculaes tF of a ice cube placed in water + */ + static ld finalTemperatureMeltingIceInWater(const ld mI, const ld cI, const ld Ti, const ld mW, const ld cW, const ld Tw, const ld Lfw = _Lf.water[2] ) + { + const double q1 = mI * cI * -Ti; + const double q2 = mI * Lfw; + const double q3 = mI; + const double q4 = mW * cW * -Tw; + return (-q4 - (q1+q2))/(q3 + mW); + } + + /** + * @brief calculates the final temperature of a bowl of soup placed in a freezer when a + * specified amount of energy is transferred away from the objects by the freezer the final temp found + * @param m_b mass of bowl in Kg + * @param c_b specific heat of bowl(varies with what bowl is made from) + * @param m_s mass of soup in kg + * @param c_s specific heat of soup (similar to that of water in most cases) + * @param c_i specific heat of ice + * @param Ti initial temperature of the soup and bowl + * @param Lf latent heat of fusion + * @param Q total energy transferred from soup and bowl + */ + static ld finalTempBowlSoupInFreezer(const ld m_b, const ld c_b, const ld m_s, const ld c_s, const ld c_i, const ld Ti, const ld Lf, const ld Q) + { + return ((((m_b * c_b) * (Ti)) + ((m_s * c_s) * (Ti))) + (m_s * Lf) - Q) / ((m_b * c_b) + (m_s * c_i)); + } + + /** + * @brief calculates the specific heat of a substance + * @param m mass in kg + * @param Ti initial temp + * @param Tf final temp + * @param Q heat energy used + */ + static ld specificHeat(const ld m, const ld Ti, const ld Tf, const ld Q) + { + return Q / (m * (Tf - Ti)); + } + + /** + * @brief calculates the time to heat water + * @param Q heat energy + * @param P power in watts + * @returns time in seconds + */ + static ld timeToHeatWater(const ld Q, const ld P) + { + return Q / P; + } + + + /// + /// Times to heat object. + /// + /// The mass. + /// The specific heat. + /// The δ temperature. + /// The power output. + /// time to heat object by specified temperature + static ld timeToHeatObject(const ld m, const ld c_, const ld deltaTime, const ld P) + { + return (m * c_ * deltaTime) / P; + } + + + /** + *@brief destructor + */ + ~Heat() + { + delete _heatPtr; + } +}; + +#endif //PHYSICSFORMULA_HEAT_H diff --git a/Inclusion.cpp b/Inclusion.cpp index 1c86b16..1a07b10 100644 --- a/Inclusion.cpp +++ b/Inclusion.cpp @@ -1,9 +1,9 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// -#include "Inclusion.h" - -bool rez::isInside(Point3d& a, Point3d& b, Point3d& c, Point3d& d) -{ - return false; -} +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// +#include "Inclusion.h" + +bool rez::isInside(Point3d& a, Point3d& b, Point3d& c, Point3d& d) +{ + return false; +} diff --git a/Inclusion.h b/Inclusion.h index f411dd7..9a27d1c 100644 --- a/Inclusion.h +++ b/Inclusion.h @@ -1,15 +1,15 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_INCLUSION_H -#define PHYSICSFORMULA_INCLUSION_H -#include "Point.h" - -namespace rez { - - // Return true if point [d] is inside the boundary of triangle defined by the points a, b, c - bool isInside(Point3d& a, Point3d& b, Point3d& c, Point3d& d); - -} -#endif //PHYSICSFORMULA_INCLUSION_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_INCLUSION_H +#define PHYSICSFORMULA_INCLUSION_H +#include "Point.h" + +namespace rez { + + // Return true if point [d] is inside the boundary of triangle defined by the points a, b, c + bool isInside(Point3d& a, Point3d& b, Point3d& c, Point3d& d); + +} +#endif //PHYSICSFORMULA_INCLUSION_H diff --git a/Intersection.cpp b/Intersection.cpp index b534fbf..9eedb8d 100644 --- a/Intersection.cpp +++ b/Intersection.cpp @@ -1,166 +1,166 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// -#include "Core.h" -#include "Intersection.h" -#include "GeoUtils.h" - -using namespace rez; - -bool rez::intersect(rez::Line2d& l1, rez::Line2d& l2, rez::Point2d& pi) { - Vector2f l1p = l1.point(); - Vector2f l2p = l2.point(); - Vector2f l1d = l1.direction(); - Vector2f l2d = l2.direction(); - - float a, b, c, d, e, f; - - a = l1d[X]; - b = -l2d[X]; - c = l2p[X] - l1p[X]; - d = l1d[Y]; - e = -l2d[Y]; - f = l2p[Y] - l1p[Y]; - - Vector2f diff = l2p - l1p; - auto prep_l2d = prependicluar(l2d); - float dot_d0_prepd1 = dotProduct(l1d, prep_l2d); - - if (!isEqualD(dot_d0_prepd1, ZERO)) - { - float denominator = a * e - b * d; - float t_numerator = c * e - b * f; - float s_numerator = a * f - c * a; - - float t = t_numerator / denominator; - - float x = l1p[X] + t * l1d[X]; - float y = l1p[Y] + t * l1d[Y]; - - if ((x - l1p[X]) / l1d[X] < 0) return false; - if ((y - l1p[Y]) / l1d[Y] < 0) return false; - - if ((x - l2p[X]) / l2d[X] < 0) return false; - if ((y - l2p[Y]) / l2d[Y] < 0) return false; - - pi.assign(X, x); - pi.assign(Y, y); - return true; - } - else - { - //Lines are parallel - return false; - } -} - -bool rez::intersect(const rez::Point2d& a, const rez::Point2d& b, const rez::Point2d& c, const rez::Point2d& d) { - - // if one of the end points of a segment is in between other segment endpoints we consider it as intersection. - if (rez::orientation2d(a, b, c) == rez::BETWEEN - || rez::orientation2d(a, b, d) == rez::BETWEEN - || rez::orientation2d(c, d, a) == rez::BETWEEN - || rez::orientation2d(c, d, b) == rez::BETWEEN) - { - return true; - } - - return rez::_xor(rez::left(a, b, c), rez::left(a, b, d)) && rez::_xor(rez::left(c, d, a), rez::left(c, d, b)); -} - -bool rez::intersect(rez::Point2d& a, rez::Point2d& b, rez::Point2d& c, rez::Point2d& d, rez::Point2d& interseciton) -{ - Vector2f AB = b - a; - Vector2f CD = d - c; - - //Normal vector to CD - Vector2f n(CD[Y], -CD[X]); - - //Denominator = n.(b-a) - auto deno = dotProduct(n, AB); - - if (!isEqualD(deno, ZERO)) - { - auto AC = c - a; - auto nume = dotProduct(n, AC); - auto t = nume / deno; - - auto x = a[X] + t * AB[X]; - auto y = a[Y] + t * AB[Y]; - - interseciton.assign(X, x); - interseciton.assign(Y, y); - return true; - } - else - { - // Lines are parallel or colinear - return false; - } -} - -bool rez::intersect(rez::Planef& plane, rez::Line& line, rez::Point3d& point) { - - auto n = plane.getNormal(); - auto D = plane.getD(); - auto d = line.direction(); - auto p = line.point(); - - auto denominator = dotProduct(n, d); - - if (!isEqualD(denominator, ZERO)) { - auto t = (-1 * dotProduct(n, p) + D) / denominator; - point.assign(X, p[X] + t * d[X]); - point.assign(Y, p[Y] + t * d[Y]); - point.assign(Z, p[Z] + t * d[Z]); - return true; - } - else { - return false; - } -} - -bool rez::intersect(rez::Planef& p1, rez::Planef& p2, rez::Line& l) { - - auto n1 = p1.getNormal(); - auto n2 = p2.getNormal(); - auto d1 = p1.getD(); - auto d2 = p2.getD(); - - auto direction = crossProduct3d(n1, n2); - direction.normalize(); - - // Check if the planes are parallel. - if (isEqualD(direction.magnitude(), ZERO)) - return false; - - auto n1n2 = dotProduct(n1, n2); - auto n1n2_2 = n1n2 * n1n2; - - auto a = (d2 * n1n2 - d1) / (n1n2_2 - 1); - auto b = (d1 * n1n2 - d2) / (n1n2_2 - 1); - - auto point = n1 * a + n2 * b; - - l.setPoint(point); - l.setDirection(direction); - - return true; -} - -bool rez::intersect(rez::Line2d& line, rez::Segment2d& seg) { - - // TODO : This can be done efficiently by checking the end points orientation - // compared to the line. - Vector2f dir = seg.p2 - seg.p1; - Point2d point = seg.p1; - rez::Line2d seg_line(point, dir); - return intersect(line, seg_line, point); -} - -bool rez::intersect(rez::Line2d& line, rez::Segment2d& seg, rez::Point2d& pi) { - Vector2f dir = seg.p2 - seg.p1; - Point2d point = seg.p1; - rez::Line2d seg_line(point, dir); - return intersect(line, seg_line, pi); -} +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// +#include "Core.h" +#include "Intersection.h" +#include "GeoUtils.h" + +using namespace rez; + +bool rez::intersect(rez::Line2d& l1, rez::Line2d& l2, rez::Point2d& pi) { + Vector2f l1p = l1.point(); + Vector2f l2p = l2.point(); + Vector2f l1d = l1.direction(); + Vector2f l2d = l2.direction(); + + float a, b, c, d, e, f; + + a = l1d[X]; + b = -l2d[X]; + c = l2p[X] - l1p[X]; + d = l1d[Y]; + e = -l2d[Y]; + f = l2p[Y] - l1p[Y]; + + Vector2f diff = l2p - l1p; + auto prep_l2d = prependicluar(l2d); + float dot_d0_prepd1 = dotProduct(l1d, prep_l2d); + + if (!isEqualD(dot_d0_prepd1, ZERO)) + { + float denominator = a * e - b * d; + float t_numerator = c * e - b * f; + float s_numerator = a * f - c * a; + + float t = t_numerator / denominator; + + float x = l1p[X] + t * l1d[X]; + float y = l1p[Y] + t * l1d[Y]; + + if ((x - l1p[X]) / l1d[X] < 0) return false; + if ((y - l1p[Y]) / l1d[Y] < 0) return false; + + if ((x - l2p[X]) / l2d[X] < 0) return false; + if ((y - l2p[Y]) / l2d[Y] < 0) return false; + + pi.assign(X, x); + pi.assign(Y, y); + return true; + } + else + { + //Lines are parallel + return false; + } +} + +bool rez::intersect(const rez::Point2d& a, const rez::Point2d& b, const rez::Point2d& c, const rez::Point2d& d) { + + // if one of the end points of a segment is in between other segment endpoints we consider it as intersection. + if (rez::orientation2d(a, b, c) == rez::BETWEEN + || rez::orientation2d(a, b, d) == rez::BETWEEN + || rez::orientation2d(c, d, a) == rez::BETWEEN + || rez::orientation2d(c, d, b) == rez::BETWEEN) + { + return true; + } + + return rez::_xor(rez::left(a, b, c), rez::left(a, b, d)) && rez::_xor(rez::left(c, d, a), rez::left(c, d, b)); +} + +bool rez::intersect(rez::Point2d& a, rez::Point2d& b, rez::Point2d& c, rez::Point2d& d, rez::Point2d& interseciton) +{ + Vector2f AB = b - a; + Vector2f CD = d - c; + + //Normal vector to CD + Vector2f n(CD[Y], -CD[X]); + + //Denominator = n.(b-a) + auto deno = dotProduct(n, AB); + + if (!isEqualD(deno, ZERO)) + { + auto AC = c - a; + auto nume = dotProduct(n, AC); + auto t = nume / deno; + + auto x = a[X] + t * AB[X]; + auto y = a[Y] + t * AB[Y]; + + interseciton.assign(X, x); + interseciton.assign(Y, y); + return true; + } + else + { + // Lines are parallel or colinear + return false; + } +} + +bool rez::intersect(rez::Planef& plane, rez::Line& line, rez::Point3d& point) { + + auto n = plane.getNormal(); + auto D = plane.getD(); + auto d = line.direction(); + auto p = line.point(); + + auto denominator = dotProduct(n, d); + + if (!isEqualD(denominator, ZERO)) { + auto t = (-1 * dotProduct(n, p) + D) / denominator; + point.assign(X, p[X] + t * d[X]); + point.assign(Y, p[Y] + t * d[Y]); + point.assign(Z, p[Z] + t * d[Z]); + return true; + } + else { + return false; + } +} + +bool rez::intersect(rez::Planef& p1, rez::Planef& p2, rez::Line& l) { + + auto n1 = p1.getNormal(); + auto n2 = p2.getNormal(); + auto d1 = p1.getD(); + auto d2 = p2.getD(); + + auto direction = crossProduct3d(n1, n2); + direction.normalize(); + + // Check if the planes are parallel. + if (isEqualD(direction.magnitude(), ZERO)) + return false; + + auto n1n2 = dotProduct(n1, n2); + auto n1n2_2 = n1n2 * n1n2; + + auto a = (d2 * n1n2 - d1) / (n1n2_2 - 1); + auto b = (d1 * n1n2 - d2) / (n1n2_2 - 1); + + auto point = n1 * a + n2 * b; + + l.setPoint(point); + l.setDirection(direction); + + return true; +} + +bool rez::intersect(rez::Line2d& line, rez::Segment2d& seg) { + + // TODO : This can be done efficiently by checking the end points orientation + // compared to the line. + Vector2f dir = seg.p2 - seg.p1; + Point2d point = seg.p1; + rez::Line2d seg_line(point, dir); + return intersect(line, seg_line, point); +} + +bool rez::intersect(rez::Line2d& line, rez::Segment2d& seg, rez::Point2d& pi) { + Vector2f dir = seg.p2 - seg.p1; + Point2d point = seg.p1; + rez::Line2d seg_line(point, dir); + return intersect(line, seg_line, pi); +} diff --git a/Intersection.h b/Intersection.h index dfdf99d..9e44ca6 100644 --- a/Intersection.h +++ b/Intersection.h @@ -1,52 +1,52 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_INTERSECTION_H -#define PHYSICSFORMULA_INTERSECTION_H -#pragma once -// Include functions to calculate intersection between different geometric promitives -#include "Point.h" -#include "Line.h" -#include "Plane.h" -#include "Segment.h" -#include "Polygon.h" -#include "Polyhedron.h" - -namespace rez { - - bool intersect(rez::Line&, rez::Line&, rez::Point3d&); - - // Return true if two 2d lines are intersecting and store the intersection point in final argument - // 1 - First line - // 2 - Second line - bool intersect(rez::Line2d&, rez::Line2d&, rez::Point2d&); - - bool intersect(rez::Line2d&, rez::Segment2d&); - - bool intersect(rez::Line2d&, rez::Segment2d&, rez::Point2d&); - - //bool intersect(rez::Segment2d&, rez::Segment2d&, rez::Point2d&); - - // Return true if 2d segments represeted by points are intersecting - // 1 - start point of first segment - // 2 - end point of first segmenet - // 3 - start point of second segment - // 4 - end point of second segment - bool intersect(const rez::Point2d&, const rez::Point2d&, const rez::Point2d&, const rez::Point2d&); - - //// Return true if 2d segments represeted by points are intersecting. Store the intersecting point in final argument - //// 1 - start point of first segment - //// 2 - end point of first segmenet - //// 3 - start point of second segment - //// 4 - end point of second segment - //// 5 - intersection point - bool intersect(rez::Point2d&, rez::Point2d&, rez::Point2d&, rez::Point2d&, rez::Point2d&); - - // Return true if Plane and Line are intersecting. Intersection point will be stored point pass as 3rd argument - bool intersect(rez::Planef&, rez::Line&, rez::Point3d&); - - // Return true if the given two planes are intersecting. Store the line of intersect in the line pass as 3rd argument - bool intersect(rez::Planef&, rez::Planef&, rez::Line&); -} -#endif //PHYSICSFORMULA_INTERSECTION_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_INTERSECTION_H +#define PHYSICSFORMULA_INTERSECTION_H +#pragma once +// Include functions to calculate intersection between different geometric promitives +#include "Point.h" +#include "Line.h" +#include "Plane.h" +#include "Segment.h" +#include "Polygon.h" +#include "Polyhedron.h" + +namespace rez { + + bool intersect(rez::Line&, rez::Line&, rez::Point3d&); + + // Return true if two 2d lines are intersecting and store the intersection point in final argument + // 1 - First line + // 2 - Second line + bool intersect(rez::Line2d&, rez::Line2d&, rez::Point2d&); + + bool intersect(rez::Line2d&, rez::Segment2d&); + + bool intersect(rez::Line2d&, rez::Segment2d&, rez::Point2d&); + + //bool intersect(rez::Segment2d&, rez::Segment2d&, rez::Point2d&); + + // Return true if 2d segments represeted by points are intersecting + // 1 - start point of first segment + // 2 - end point of first segmenet + // 3 - start point of second segment + // 4 - end point of second segment + bool intersect(const rez::Point2d&, const rez::Point2d&, const rez::Point2d&, const rez::Point2d&); + + //// Return true if 2d segments represeted by points are intersecting. Store the intersecting point in final argument + //// 1 - start point of first segment + //// 2 - end point of first segmenet + //// 3 - start point of second segment + //// 4 - end point of second segment + //// 5 - intersection point + bool intersect(rez::Point2d&, rez::Point2d&, rez::Point2d&, rez::Point2d&, rez::Point2d&); + + // Return true if Plane and Line are intersecting. Intersection point will be stored point pass as 3rd argument + bool intersect(rez::Planef&, rez::Line&, rez::Point3d&); + + // Return true if the given two planes are intersecting. Store the line of intersect in the line pass as 3rd argument + bool intersect(rez::Planef&, rez::Planef&, rez::Line&); +} +#endif //PHYSICSFORMULA_INTERSECTION_H diff --git a/KDTree.cpp b/KDTree.cpp index 4c285a4..412e09e 100644 --- a/KDTree.cpp +++ b/KDTree.cpp @@ -1,193 +1,193 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// -#include "KDTree.h" - -using namespace rez; - -void KDTree::traverse(KDNode* _node, std::list& _list) { - if (!_node) - return; - traverse(_node->left, _list); - if (isALeaf(_node)) - _list.push_back(_node->data); - traverse(_node->right, _list); -} - -bool KDTree::isALeaf(KDNode* _node) { - if (!_node->left && !_node->right) - return true; - return false; -} - -bool KDTree::isIntersect(const KDRange& r1, const KDRange& r2) { - if (r1.x_max < r2.x_min || r1.x_min > r2.x_max) - return false; - if (r1.y_max < r2.y_min || r1.y_min > r2.y_max) - return false; - return true; -} - -bool KDTree::isContained(const KDRange& r1, const KDRange& r2) { - if (r1.x_min >= r2.x_min && r1.x_max <= r2.x_max && r1.y_min >= r2.y_min && r1.y_max <= r2.y_max) - return true; - return false; -} - -bool KDTree::isInRange(const Vector2f& p, const KDRange& r) { - if (p[X] >= r.x_min && p[X] <= r.x_max && p[Y] >= r.y_min && p[Y] <= r.y_max) - return true; - return false; -} - -static float sqrd_distance(const Vector2f& v1, const Vector2f& v2) { - return (v1[X] - v2[X]) * (v1[X] - v2[X]) + (v1[Y] - v2[Y]) * (v1[Y] - v2[Y]); -} - -KDTree::KDRange KDTree::intersection(const KDRange& r1, const KDRange& r2) { - if (!isIntersect(r1, r2)) - return INVALID_RANGE; - if (isContained(r1, r2)) - return r1; - if (isContained(r2, r1)) - return r2; - - auto max_x_min = r1.x_min > r2.x_min ? r1.x_min : r2.x_min; - auto min_x_max = r1.x_max < r2.x_max ? r1.x_max : r2.x_max; - auto max_y_min = r1.y_min > r2.y_min ? r1.y_min : r2.y_min; - auto min_y_max = r1.x_max < r2.x_max ? r1.x_max : r2.x_max; - - return KDRange{ max_x_min, min_x_max, max_y_min, min_y_max }; -} - -KDTree::KDNode* rez::KDTree::constructKDTree(std::list& _data, uint32_t _depth) -{ - auto size = _data.size(); - if (size == 1) - return new KDNode(_data.front()); - if (_depth % 2 == 0) - _data.sort([](Vector2f a, Vector2f b) { return (a[X] < b[X]); }); - else { - _data.sort([](Vector2f a, Vector2f b) { return (a[Y] < b[Y]); }); - } - - auto mid = size / 2; - auto mid_ptr = _data.begin(); - std::advance(mid_ptr, mid); - auto left_list = std::list(_data.begin(), mid_ptr); - auto right_list = std::list(mid_ptr, _data.end()); - - auto left_child = constructKDTree(left_list, _depth + 1); - auto right_child = constructKDTree(right_list, _depth + 1); - return new KDNode((*mid_ptr)[_depth % 2], left_child, right_child); -} - -void KDTree::searchKDTree(KDNode* _node, KDRange _range, std::list& _list) { - if (isALeaf(_node)) { - if (isInRange(_node->data, _range)) - _list.push_back(_node->data); - } - else { - if (isContained(_node->left->boundary, _range)) { - traverse(_node->left, _list); - } - else if (isIntersect(_node->left->boundary, _range)) { - searchKDTree(_node->left, _range, _list); - } - - if (isContained(_node->right->boundary, _range)) { - traverse(_node->right, _list); - } - else if (isIntersect(_node->right->boundary, _range)) { - searchKDTree(_node->right, _range, _list); - } - } -} - -void KDTree::preprocessBoundaries(KDNode* _node, bool _isEvenDepth) { - if (!_node || isALeaf(_node)) - return; - - if (_isEvenDepth) { - if (_node->left) { - _node->left->boundary = _node->boundary; - _node->left->boundary.x_max = _node->value; - preprocessBoundaries(_node->left, !_isEvenDepth); - } - - if (_node->right) { - _node->right->boundary = _node->boundary; - _node->right->boundary.x_min = _node->value; - preprocessBoundaries(_node->right, !_isEvenDepth); - } - } - else { - if (_node->left) { - _node->left->boundary = _node->boundary; - _node->left->boundary.y_max = _node->value; - preprocessBoundaries(_node->left, !_isEvenDepth); - } - - if (_node->right) { - _node->right->boundary = _node->boundary; - _node->right->boundary.y_min = _node->value; - preprocessBoundaries(_node->right, !_isEvenDepth); - } - } -} - -void rez::KDTree::nearestNeighbour(KDNode* _node, const Vector2f& _value, float& _current_distance - , bool _even_depth, Vector2f& _current_nn) { - if (isALeaf(_node)) { - auto distance = sqrd_distance(_value, _node->data); - if (distance < _current_distance) { - _current_distance = distance; - _current_nn = _node->data; - } - } - else { - auto index = _even_depth ? X : Y; - if (_value[index] < _node->value) { - nearestNeighbour(_node->left, _value, _current_distance, !_even_depth, _current_nn); - if (fabs(_value[index] - _node->value) < _current_distance) - nearestNeighbour(_node->right, _value, _current_distance, !_even_depth, _current_nn); - } - else { - nearestNeighbour(_node->right, _value, _current_distance, !_even_depth, _current_nn); - if (fabs(_value[index] - _node->value) < _current_distance) - nearestNeighbour(_node->left, _value, _current_distance, !_even_depth, _current_nn); - } - } -} - -void KDTree::Search(const float x_min, const float x_max, const float y_min, - const float y_max, std::list& _list) { - KDRange range{ x_min, x_max, y_min, y_max }; - searchKDTree(root, range, _list); -} - -void KDTree::Traverse(std::list& _list) { - traverse(root, _list); -} - -void KDTree::getSplitLineData(KDNode* _node, std::list& _data, bool _isEvenDepth) { - if (!_node) - return; - - if (_isEvenDepth) { - _data.push_back(Vector2f(_node->value, root->boundary.y_min)); - _data.push_back(Vector2f(_node->value, root->boundary.y_max)); - } - else { - _data.push_back(Vector2f(_node->boundary.x_min, _node->value)); - _data.push_back(Vector2f(_node->boundary.y_max, _node->value)); - } - - getSplitLineData(_node->left, _data, !_isEvenDepth); - getSplitLineData(_node->right, _data, !_isEvenDepth); -} - -void KDTree::NearestNeighbour(const Vector2f& _search_node, Vector2f& _ref_node) { - float current_val = FLT_MAX; - nearestNeighbour(root, _search_node, current_val, true, _ref_node); -} +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// +#include "KDTree.h" + +using namespace rez; + +void KDTree::traverse(KDNode* _node, std::list& _list) { + if (!_node) + return; + traverse(_node->left, _list); + if (isALeaf(_node)) + _list.push_back(_node->data); + traverse(_node->right, _list); +} + +bool KDTree::isALeaf(KDNode* _node) { + if (!_node->left && !_node->right) + return true; + return false; +} + +bool KDTree::isIntersect(const KDRange& r1, const KDRange& r2) { + if (r1.x_max < r2.x_min || r1.x_min > r2.x_max) + return false; + if (r1.y_max < r2.y_min || r1.y_min > r2.y_max) + return false; + return true; +} + +bool KDTree::isContained(const KDRange& r1, const KDRange& r2) { + if (r1.x_min >= r2.x_min && r1.x_max <= r2.x_max && r1.y_min >= r2.y_min && r1.y_max <= r2.y_max) + return true; + return false; +} + +bool KDTree::isInRange(const Vector2f& p, const KDRange& r) { + if (p[X] >= r.x_min && p[X] <= r.x_max && p[Y] >= r.y_min && p[Y] <= r.y_max) + return true; + return false; +} + +static float sqrd_distance(const Vector2f& v1, const Vector2f& v2) { + return (v1[X] - v2[X]) * (v1[X] - v2[X]) + (v1[Y] - v2[Y]) * (v1[Y] - v2[Y]); +} + +KDTree::KDRange KDTree::intersection(const KDRange& r1, const KDRange& r2) { + if (!isIntersect(r1, r2)) + return INVALID_RANGE; + if (isContained(r1, r2)) + return r1; + if (isContained(r2, r1)) + return r2; + + auto max_x_min = r1.x_min > r2.x_min ? r1.x_min : r2.x_min; + auto min_x_max = r1.x_max < r2.x_max ? r1.x_max : r2.x_max; + auto max_y_min = r1.y_min > r2.y_min ? r1.y_min : r2.y_min; + auto min_y_max = r1.x_max < r2.x_max ? r1.x_max : r2.x_max; + + return KDRange{ max_x_min, min_x_max, max_y_min, min_y_max }; +} + +KDTree::KDNode* rez::KDTree::constructKDTree(std::list& _data, uint32_t _depth) +{ + auto size = _data.size(); + if (size == 1) + return new KDNode(_data.front()); + if (_depth % 2 == 0) + _data.sort([](Vector2f a, Vector2f b) { return (a[X] < b[X]); }); + else { + _data.sort([](Vector2f a, Vector2f b) { return (a[Y] < b[Y]); }); + } + + auto mid = size / 2; + auto mid_ptr = _data.begin(); + std::advance(mid_ptr, mid); + auto left_list = std::list(_data.begin(), mid_ptr); + auto right_list = std::list(mid_ptr, _data.end()); + + auto left_child = constructKDTree(left_list, _depth + 1); + auto right_child = constructKDTree(right_list, _depth + 1); + return new KDNode((*mid_ptr)[_depth % 2], left_child, right_child); +} + +void KDTree::searchKDTree(KDNode* _node, KDRange _range, std::list& _list) { + if (isALeaf(_node)) { + if (isInRange(_node->data, _range)) + _list.push_back(_node->data); + } + else { + if (isContained(_node->left->boundary, _range)) { + traverse(_node->left, _list); + } + else if (isIntersect(_node->left->boundary, _range)) { + searchKDTree(_node->left, _range, _list); + } + + if (isContained(_node->right->boundary, _range)) { + traverse(_node->right, _list); + } + else if (isIntersect(_node->right->boundary, _range)) { + searchKDTree(_node->right, _range, _list); + } + } +} + +void KDTree::preprocessBoundaries(KDNode* _node, bool _isEvenDepth) { + if (!_node || isALeaf(_node)) + return; + + if (_isEvenDepth) { + if (_node->left) { + _node->left->boundary = _node->boundary; + _node->left->boundary.x_max = _node->value; + preprocessBoundaries(_node->left, !_isEvenDepth); + } + + if (_node->right) { + _node->right->boundary = _node->boundary; + _node->right->boundary.x_min = _node->value; + preprocessBoundaries(_node->right, !_isEvenDepth); + } + } + else { + if (_node->left) { + _node->left->boundary = _node->boundary; + _node->left->boundary.y_max = _node->value; + preprocessBoundaries(_node->left, !_isEvenDepth); + } + + if (_node->right) { + _node->right->boundary = _node->boundary; + _node->right->boundary.y_min = _node->value; + preprocessBoundaries(_node->right, !_isEvenDepth); + } + } +} + +void rez::KDTree::nearestNeighbour(KDNode* _node, const Vector2f& _value, float& _current_distance + , bool _even_depth, Vector2f& _current_nn) { + if (isALeaf(_node)) { + auto distance = sqrd_distance(_value, _node->data); + if (distance < _current_distance) { + _current_distance = distance; + _current_nn = _node->data; + } + } + else { + auto index = _even_depth ? X : Y; + if (_value[index] < _node->value) { + nearestNeighbour(_node->left, _value, _current_distance, !_even_depth, _current_nn); + if (fabs(_value[index] - _node->value) < _current_distance) + nearestNeighbour(_node->right, _value, _current_distance, !_even_depth, _current_nn); + } + else { + nearestNeighbour(_node->right, _value, _current_distance, !_even_depth, _current_nn); + if (fabs(_value[index] - _node->value) < _current_distance) + nearestNeighbour(_node->left, _value, _current_distance, !_even_depth, _current_nn); + } + } +} + +void KDTree::Search(const float x_min, const float x_max, const float y_min, + const float y_max, std::list& _list) { + KDRange range{ x_min, x_max, y_min, y_max }; + searchKDTree(root, range, _list); +} + +void KDTree::Traverse(std::list& _list) { + traverse(root, _list); +} + +void KDTree::getSplitLineData(KDNode* _node, std::list& _data, bool _isEvenDepth) { + if (!_node) + return; + + if (_isEvenDepth) { + _data.push_back(Vector2f(_node->value, root->boundary.y_min)); + _data.push_back(Vector2f(_node->value, root->boundary.y_max)); + } + else { + _data.push_back(Vector2f(_node->boundary.x_min, _node->value)); + _data.push_back(Vector2f(_node->boundary.y_max, _node->value)); + } + + getSplitLineData(_node->left, _data, !_isEvenDepth); + getSplitLineData(_node->right, _data, !_isEvenDepth); +} + +void KDTree::NearestNeighbour(const Vector2f& _search_node, Vector2f& _ref_node) { + float current_val = FLT_MAX; + nearestNeighbour(root, _search_node, current_val, true, _ref_node); +} diff --git a/KDTree.h b/KDTree.h index 5609dad..bd9de7f 100644 --- a/KDTree.h +++ b/KDTree.h @@ -1,88 +1,88 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_KDTREE_H -#define PHYSICSFORMULA_KDTREE_H -#pragma once -#include "Core.h" -#include "Vector.h" -#include "Point.h" - -#include -#include -#include - -namespace rez { - class KDTree { - - struct KDRange { - float x_min, x_max, y_min, y_max; - }; - - struct KDNode { - KDNode* left; - KDNode* right; - rez::Vector2f data; - float value = FLT_MIN; - KDRange boundary{ -10, 10, -10, 10 }; - - KDNode(float _value, KDNode* _left = nullptr, KDNode* _right = nullptr) - :value(_value), left(_left), right(_right) {} - - KDNode(Vector2f _data, KDNode* _left = nullptr, KDNode* _right = nullptr) - :data(_data), left(_left), right(_right) {} - }; - - KDNode* root = nullptr; - KDRange default_bound{ -10, 10, -10, 10 }; - KDRange INVALID_RANGE{ 0, 0, 0, 0 }; - - void traverse(KDNode* _node, std::list& _list); - - bool isALeaf(KDNode* _node); - bool isIntersect(const KDRange&, const KDRange&); - - // Check if r1 reside completely with in r2 - bool isContained(const KDRange& r1, const KDRange& r2); - - // Cehck if p is inside the r - bool isInRange(const Vector2f& p, const KDRange& r); - - // Return the common region if r1 amd r2 intersect. If not return INVALID_RANGE - KDRange intersection(const KDRange& r1, const KDRange& r2); - - KDNode* constructKDTree(std::list& _data, uint32_t _depth); - void searchKDTree(KDNode*, KDRange, std::list&); - - // Calculate bounded rectangle for non leaf nodes in the KDTree - void preprocessBoundaries(KDNode* _node, bool _isEvenDepth); - - void getSplitLineData(KDNode* _node, std::list& _data, bool _isEvenDepth); - - void nearestNeighbour(KDNode* _node, const Vector2f& _value, float& current_distance, bool _even_depth, Vector2f& _current_nn); - - public: - KDTree() {} - - KDTree(std::list _data) { - root = constructKDTree(_data, 0); - root->boundary = default_bound; - preprocessBoundaries(root, true); - } - - void Search(const float x_min, const float x_max, - const float y_min, const float y_max, std::list&); - - void Traverse(std::list&); - - void getSplitLineData(std::list& _data) { - if (root) { - getSplitLineData(root, _data, true); - } - } - - void NearestNeighbour(const Vector2f&, Vector2f&); - }; -}; -#endif //PHYSICSFORMULA_KDTREE_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_KDTREE_H +#define PHYSICSFORMULA_KDTREE_H +#pragma once +#include "Core.h" +#include "Vector.h" +#include "Point.h" + +#include +#include +#include + +namespace rez { + class KDTree { + + struct KDRange { + float x_min, x_max, y_min, y_max; + }; + + struct KDNode { + KDNode* left; + KDNode* right; + rez::Vector2f data; + float value = FLT_MIN; + KDRange boundary{ -10, 10, -10, 10 }; + + KDNode(float _value, KDNode* _left = nullptr, KDNode* _right = nullptr) + :value(_value), left(_left), right(_right) {} + + KDNode(Vector2f _data, KDNode* _left = nullptr, KDNode* _right = nullptr) + :data(_data), left(_left), right(_right) {} + }; + + KDNode* root = nullptr; + KDRange default_bound{ -10, 10, -10, 10 }; + KDRange INVALID_RANGE{ 0, 0, 0, 0 }; + + void traverse(KDNode* _node, std::list& _list); + + bool isALeaf(KDNode* _node); + bool isIntersect(const KDRange&, const KDRange&); + + // Check if r1 reside completely with in r2 + bool isContained(const KDRange& r1, const KDRange& r2); + + // Cehck if p is inside the r + bool isInRange(const Vector2f& p, const KDRange& r); + + // Return the common region if r1 amd r2 intersect. If not return INVALID_RANGE + KDRange intersection(const KDRange& r1, const KDRange& r2); + + KDNode* constructKDTree(std::list& _data, uint32_t _depth); + void searchKDTree(KDNode*, KDRange, std::list&); + + // Calculate bounded rectangle for non leaf nodes in the KDTree + void preprocessBoundaries(KDNode* _node, bool _isEvenDepth); + + void getSplitLineData(KDNode* _node, std::list& _data, bool _isEvenDepth); + + void nearestNeighbour(KDNode* _node, const Vector2f& _value, float& current_distance, bool _even_depth, Vector2f& _current_nn); + + public: + KDTree() {} + + KDTree(std::list _data) { + root = constructKDTree(_data, 0); + root->boundary = default_bound; + preprocessBoundaries(root, true); + } + + void Search(const float x_min, const float x_max, + const float y_min, const float y_max, std::list&); + + void Traverse(std::list&); + + void getSplitLineData(std::list& _data) { + if (root) { + getSplitLineData(root, _data, true); + } + } + + void NearestNeighbour(const Vector2f&, Vector2f&); + }; +}; +#endif //PHYSICSFORMULA_KDTREE_H diff --git a/Kinematics.h b/Kinematics.h index 5440463..e70effd 100644 --- a/Kinematics.h +++ b/Kinematics.h @@ -1,772 +1,772 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_KINEMATICS_H -#define PHYSICSFORMULA_KINEMATICS_H -/** - * @class Kinematics - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @dateBuilt 1/1/2021 - * @lastEdit 1/1/2021 - */ -#include "VectorND.h" -#include -#include -#include - -using namespace std; -typedef long double ld; - -static int kinematics_objectCount = 0; - - -/// -/// The vector values is for storing answers when there requires multiple -/// answers -/// -static std::vector vector_values = { 0.0,0.0,0.0,0.0 }; -/// -/// Sets the vector. -/// -/// The vector to add too. -/// value to add -/// position to add to -template -static auto setVector(vector& v, T val, int index) -{ - if (index < v.size()) - { - v[index] = val; - return true; - } - return false; -} - -/// -/// Returns the vector. -/// -/// The v. -/// -static vector return_vector(vector& v) { return v; } -/// -/// Shows the vector. -/// -static void showVector() -{ - for (auto it : vector_values) - { - std::cout << it << ", "; - } - std::cout << std::endl; -} - -class Kinematics -{ -public: - Kinematics* _kinematicPtr; - - Kinematics() - { - _kinematicPtr = nullptr; - countIncrease(); - } - - /** - * @brief copy constructor - */ - Kinematics(const Kinematics& t) - { - _kinematicPtr = t._kinematicPtr; - countIncrease(); - } - /** - * #brief move constructor - */ - Kinematics(Kinematics&& t) noexcept - { - _kinematicPtr = t._kinematicPtr; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Kinematics& operator=(const Kinematics& t) - { - if (this != &t) - { - _kinematicPtr = t._kinematicPtr; - countIncrease(); - } - return *this; - } - - static void show_objectCount() { std::cout << "\n kinematics object count: " - << kinematics_objectCount << std::endl; } - static int get_objectCount() { return kinematics_objectCount; } - - - //========================================================================= - //chapter 2 formulas - - /** - * @brief Returns the displacement between two positions - * @param startPos starting position - * @param endPos ending position - * @returns displacement. - */ - static ld displacement(const ld startPos,const ld endPos) - { return endPos - startPos; } - - /** - * @brief Returns the displacement from knowing the velocity and time. - * @param velocity in m/s - * @param time in seconds - * @returns displacement. - */ - static ld displacement_VxT(const ld velocity, const ld time) - { return velocity * time; } - - /** - * method: displacement_accelerating_object(ld acceleration, ld time) - * arguments: acceleration m/s , time in s - * purpose: find the displacement of an accelerating object - * returns: ld, displacement - */ - static ld displacement_accelerating_object(const ld acceleration, const ld time) - { return ((acceleration) * (time * time)) / 2; } - - /** - * method: displacement_accelerating_object_PV(ld acceleration, ld time) - * arguments: velocity, acceleration m/s , position = 0m default, time in s - * purpose: find the displacement of an accelerating object with a starting - * position and an initial velocity along with acceleration and a time - * returns: ld, displacement - */ - static ld displacement_accelerating_object_PV(const ld velocity, - const ld acceleration, - const ld time, - const ld pos = 0) - { return pos + (velocity * time) + (acceleration * (time * time)) / 2; } - - /** - * @brief calculates the displacement using the kinematic formula - * X = Vi*t+ 1/2*a*t^2 - * @param velocity in m/s - * @param acceleration in m/s^2 - * @param time in s - */ - static ld displacement_using_kinematic(const ld velocity, - const ld acceleration, - const ld time) - { - return (velocity * time) + (acceleration * (time * time)) / 2; - } - - - /// - /// calculate displacement for the distance to stop from moving object - /// - /// The velocity start. - /// The velocity final. - /// The acceleration. - /// The starting position, default is 0. - /// final displacement - static ld distance(const ld velocityStart, const ld velocityFinal, const ld acceleration, const ld pos = 0.0) - { return abs(((velocityFinal * velocityFinal) - (velocityStart * velocityStart)) / (2.0 * acceleration)) + pos; } - - /** - * method: velocity_vStart_plus_vEndD2(const ld velocityStart, const ld velocityEnd) - * arguments: vStart = starting velocity m/s, vEnd = ending velocity m/s - * purpose: find the displacement when start and end velocity is know - * returns: ld, displacement - */ - static ld velocity_vStart_plus_vEndD2(const ld velocityStart, const ld velocityEnd) - { return (velocityStart + velocityEnd) / 2; } - - - static ld velocity_final_from_kinematic_time(const ld initialVelocity, const ld acceleration, const ld time) - { return initialVelocity + acceleration * time; } - - /** - *@brief calculates the final velocity using the kinematic formula vf^2 = vi^2 + 2*a*d - *@param initialVelocity m/s - *@param acceleration m/s^2 - *@param displacement m - *@returns the final velocity - */ - static ld velocity_final_kinematic_no_time(const ld initialVelocity, const ld acceleration , const ld displacement) - { return sqrt(initialVelocity * initialVelocity + (2 * (acceleration * displacement))); } - - /** - * @brief calculates the average velocity - * @param d the displacement - * @param t the time - * @return the average velocity - */ - static ld average_velocity(const ld d, const ld t) - { return d / t; } - - - /** - * @brief v^2 = vi^2 + 2*a*(x0 - xf) == v = sqrt(vi^2 + 2*a*(x0 - xf)) - * @param x0 the initial position - * @param xf the final position - * @param v0 the initial velocity - * @param a the acceleration - * @return final velocity - */ - static ld final_velocity(const ld x0, const ld xf, const ld v0, const ld a) - { return sqrt((v0 * v0) + (2 * (a * (xf - x0)))); } - - /** - * @brief v = vi + a*t - * @param vi the initial velocity - * @param a the acceleration - * @param t the time - * @return final velocity - */ - static ld final_velocity(const ld vi,const ld a, const ld t) - { - return vi + a*t; - } - - /** - * @brief calculates the initial velocity given the final velocity, distance s - * and time t - * @param v_f final velocity - * @param s distance - * @param t time - * @return the initial velocity - */ - static auto initial_velocity(const ld v_f, const ld s, const ld t) { - return (2.0 * s - t * v_f) / t; - } - - - /// - /// Constant Acceleration average using final velocity, starting velocity and time. - /// - /// The final velocity. - /// The initial velocity. - /// The time taken. - /// average acceleration - static ld acceleration_avg(const ld u_, const ld v_, const ld t) - { return (u_ - v_) / t; } - - /// - /// Constant Acceleration average using change in velocity and time. - /// - /// The change in velocity. - /// The time. - /// average acceleration - template - static auto acceleration_avg(const T deltaV, const T t) - { return deltaV / t; } - - - /// - /// Calculates the constant accelerations from distance, speed, and time. - /// - /// The initial speed. - /// The distance. - /// The time. - /// acceleration - template - static auto acceleration_from_distance_speed_time(const T u, const T s, const T t) - { return (2 * (s - (u * t)) / (t * t)); } - - - /// - /// Calculates the constant accelerations from initialize velocity, final velocity - /// and the displacement. - /// - /// The initial velocity. - /// The final velocity. - /// The distance. - /// acceleration - template - static auto acceleration_from_initV_finV_displacement(const T u, const T v, const T s) - { return (v * v - u * u) / (2.0 * s); } - - /** - * @brief calulates the average speed - * @param s the distance - * @param t the time - * @return the average speed - */ - static ld average_speed(const ld s, const ld t) - { return abs(s / t); } - - /** - * method: time_by_avgVdA(ld acceleration, ld velocityStart, ld velocityEnd) - * arguments: a = acceleration, sV = start velocity(default 0), fV = final velocity - * purpose: calculate time with know acceleration and final velocity end point - * returns: ld, time - */ - static ld time_by_velocity_acceleration(const ld acceleration, const ld velocityStart, const ld velocityEnd) - { return (velocityEnd - velocityStart) / acceleration; } - - /** - * method: time_by_DisTdV(ld distance, ld velocity) - * arguments: distance , average velocity - * purpose: find the velocity of a falling object thrown downwards - * returns: ld, velocity - */ - static ld time_by_distance_velocity(const ld distance, const ld velocity) - { return distance / velocity; } - - /** - * method: time_finalPos_acceleration(ld displacement, ld acceleration) - * arguments: displacement of object, acceleration of object - * purpose: find how long it takes an object with a known acceleration to travel a know distance - * returns: ld, time to accelerate a distance - */ - static ld time_by_finalPos_acceleration(const ld displacement, const ld acceleration) - { return sqrt((2 * displacement) / acceleration); } - - /** - * method: time(ld startTime, ld endTime) - * arguments: y = startTime = beginning time in seconds, endTime = endTime in seconds - * purpose: find the amount of time between two periods - * returns: ld, difference in two times - */ - static ld time_difference(const ld startTime, const ld endTime) - { return endTime - startTime; } - - /** - * method: time_kinematic_rearranged(ld velocity, ld y0, ld acceleration) const - * arguments: velocity, y0 = position from 0, acceleration - * purpose: find the amount of time between two periods - * returns: ld, difference in two times - */ - static ld time_kinematic_rearranged(const ld velocity, const ld displacement, const ld acceleration) - { return (-(velocity)-sqrt((velocity * velocity) - 2 * (acceleration) * (displacement))) / (acceleration); } - - /** - * method: slope_formula(ld y1, ld y0, ld x1, ld x0) - * arguments: y1 , y0, x1, x0 - * purpose: the general slope equation of (y1 - y0)/(x1 - x0) - * to find the slope of a line between two points - * returns: ld, slope of line between two points - */ - static ld slope_formula(const ld y1, const ld y0, const ld x1, const ld x0) - { return (y1 - y0) / (x1 - x0); } - - /** - * method: rotation_speed_2PIxRdT(ld radius, ld rotations, ld time) - * arguments: radius = length in m from center of rotation - * rotations = how many rotations in a time period - * time = time units - * purpose: find the speed of a spinning object, such as fan blade - * returns: average speed of spinning object - */ - static ld rotation_speed_2PIxRdT(const ld radius, const ld rotations, const ld time) - { return (2.0 * _PI_ * radius) / (time / rotations); } - - /** - * method: rotation_avgVelocity_2PIxRdT_in_1_rotation(ld radius, ld time) - * arguments: radius , time = time for one rotation - * purpose: find average velocity of a spinning object - * returns: ld, average velocity - */ - static ld rotation_avgVelocity_2PIxRdT_in_1_rotation(const ld radius, const ld time) - { return (2.0 * _PI_ * radius) / time; } - - /** - * @brief Returns the conversion of given value divided by the acceleration of gravity on earth, 9.80 m/s^2 - * @param value the value to find the multiples of gravity of - * returns: g's - */ - static ld conversion_multiple_of_gravity(const ld value) - { return value / _Ga_; } - - /** - * method: time_using_quadratic(ld a, ld b, ld c) - * arguments: a1 = default to 1, b_velocity = constant velocity, c_displacement = total distance to travel - * purpose: calculate the time of a merging object when velocity and displacement is know - * returns: ld, total time - */ - static std::vector time_using_quadratic(ld a1, ld b_velocity, ld c_displacement) - { - vector_values[0] = (-b_velocity + sqrt((b_velocity * b_velocity) - 4 * a1 * c_displacement)) / (2 * a1); - vector_values[1] = (-b_velocity - sqrt((b_velocity * b_velocity) - 4 * a1 * c_displacement)) / (2 * a1); - - return vector_values; - } - - /** - * method: pos_vel_falling_object_upDown(double p, double v_, double a, double t) - * arguments: p = position (0), v_ = velocity, a = acceleration, t = time is s - * purpose: this method will fill a vector with four pieces of data in order from the right to left it - * is: time, position, velocity, acceleration. use the print_vector_values() to see contents. - * returns: ld, vector of the time, position, velocity, acceleration. - */ - static std::vector pos_vel_falling_object_upDown(ld v_, ld a, ld t, ld p = 0.0) - { - ld temp; - vector_values[0] = t; - vector_values[1] = Kinematics::displacement_accelerating_object_PV(v_, a, t, p); - //Solution for Velocity: - temp = Kinematics::velocity_final_from_kinematic_time(v_, a, t); - vector_values[2] = temp; - vector_values[3] = a; - //this->show_vector_values(); - return vector_values; - } - - static std::vector> - time_and_velocity_falling_obj_to_P_Q(ld seperationPQ, ld timeBetweenPQ) { - vector> timeAndVelocity; - timeAndVelocity.emplace_back("time to P", 0.0); - timeAndVelocity.emplace_back("time to Q", 0.0); - timeAndVelocity.emplace_back("velocity at P", 0.0); - timeAndVelocity.emplace_back("velocity at Q", 0.0); - auto timeToP = - (seperationPQ - ((1.0/2.0)*_ga_*(timeBetweenPQ*timeBetweenPQ))) / - (timeBetweenPQ*_ga_); - auto timeToQ = timeToP + timeBetweenPQ; - auto velAtP = timeToP * _ga_; - auto velAtQ = timeToQ * _ga_; - timeAndVelocity[0].second = timeToP; - timeAndVelocity[1].second = timeToQ; - timeAndVelocity[2].second = velAtP; - timeAndVelocity[3].second = velAtQ; - return timeAndVelocity; - } - - /// - /// Calculates the horizontal range of a projectile. - /// - /// The velocity. - /// The angle theta. - /// range of projectile - template - static auto horizontal_range_projectile(const T v, const T theta) - { return ((v * v) * sin(2 * theta * RADIAN) / (_Ga_)); } - - /// - /// calculates the angle theta of a projectile - /// - /// The distance. - /// The velocity. - /// theta - static ld projectile_theta(const ld distance, const ld velocity) - { - return (asinh(distance * _Ga_) / (velocity * velocity)) / 2; - } - - /// - /// Calculates the trajectories equation for a projectile - /// - /// The initial velocity. - /// The angle theta of projectiles launch. - /// The height initially started from. - /// a string with the trajectory equation of projectile's parabola - template - static auto trajectory_equation(T v, T theta, T h_0) - { - auto prt1 = tan(theta * RADIAN); - auto prt2 = _Ga_ / (2.0 * (v * v) * pow(cos(theta * RADIAN), 2)); - string results ="y = -" + to_string(prt2) + "x^2" + " + " + to_string(prt1) +"x + "+ to_string(h_0) ; - return results; - } - - /// - /// calculates the time a projectile with an initial velocity and angle - /// take to reach the same level from which it was launched, forms a parabolic curve - /// (2* launchVelocity*sin(angleTheta))/(-GA); - /// - /// The launch velocity. - /// The angle theta. - /// air time - static ld time_for_projectile_to_reach_level(ld launchVelocity, ld angleTheta) - { - return (2 * launchVelocity * sin(angleTheta)) / (_Ga_); - } - - /// - /// Time of projectile in flight. - /// - /// The angle. - /// The initial height. - /// The velocity. - /// time in seconds projectile was in flight - static ld time_of_projectiles_flight(ld angle, ld initialHeight, ld velocity) - { - ld vy = velocity * sin(angle * RADIAN); - cout << "vy = " << vy << endl; - cout <<"initialHeight = " << initialHeight << endl; - return (vy + (sqrt((vy * vy) + 2.0 * _Ga_ * initialHeight))) / _Ga_; - } - - /// - /// calculates the range of a projectiles flight. - /// - /// The angle. - /// The initial height. - /// The velocity. - /// - static ld range_of_projectile_flight(ld angle, ld initialHeight, ld velocity) - { - return velocity * cos(angle * RADIAN) * time_of_projectiles_flight(angle, initialHeight, velocity); - } - - /** - * Derive a general formula for the horizontal distance covered by a - * projectile launched horizontally at speed from height . - */ - static ld horizontal_distance_covered_by_projectile(ld speed, ld height, bool print = false) - { - auto time = sqrt(2.0 * height / _Ga_); - auto horizDis = speed * sqrt((2.0*height) / _Ga_); - if (print) - { - cout << "time = " << time << endl; - cout << "range = " << horizDis << endl; - - } - return horizDis; - } - - /// - /// calculates the maximum height of a projectile. - /// - /// The angle. - /// The initial height. - /// The velocity. - /// - static ld maximum_height_of_projectile(ld angle, ld initialHeight, ld velocity, bool print = false) - { - - ld vy = velocity * sin(angle * RADIAN); - auto maxH = initialHeight + ((vy * vy) / (2.0 * _Ga_)); - if (print) - { - cout << "vy = " << vy << endl; - cout << "max height = " << maxH << endl; - } - return maxH; - } - - /// - /// calculates the air time from an initial velocity of 0 - /// - /// The total displacement. - /// time is seconds in air - static ld air_time_initial_velocity0_y0(ld displacement, bool print = false) - { - auto air_time = sqrt((-2*(displacement))/_Ga_); - if (print) - { - cout << "air time = " << air_time << endl; - } - return air_time; - } - - - /// - /// calculates the initial velocity of the horizontal component - /// - /// The initial starting height. - /// The displacement. - /// - static ld velocity_initial_horizontal_component(ld y0, ld displacement) - { - return sqrt((-_Ga_/(-2 * y0)))* displacement; - } - - /** - * method: velocity_final_vertical_component(ld y0, ld yf = 0) const - * arguments: y0 = starting height, yf = final vertical component default = 0 - * purpose: calculates the final vertical component - * returns: ld, final vertical velocity - */ - static ld velocity_vertical_component(ld y0, ld yf) - { - return -sqrt(2 * (-_Ga_) * (yf - y0)); - } - - - /** - * method: velocity_final_vertical_component(ld y0, ld yf = 0) const - * arguments: y0 = starting height, yf = final vertical component default = 0 - * purpose: calculates the final vertical component - * returns: ld, final vertical velocity - */ - static vector final_projectile_velocity_vector(ld velocityY, ld velocityX) - { - vector_values[0] = sqrt(velocityY * velocityY + velocityX * velocityX); - vector_values[1] = atan(velocityY / velocityX)*DEGREE; - return vector_values; - } - - /**NOT WORKING RIGHT - * method: velocity_soccer_kick(ld toGoal, ld height_at_goal, ld angle) const - * arguments: distance to goal, height ball is at goal, and initial angle of kick - * purpose: calculates the final velocity of both component vectors - * returns: ld, magnitude of final velocity vector - */ - static ld velocity_soccer_kick(ld toGoal, ld height_at_goal, ld angle) - { - return sqrt(pow(horizontal_velocity_using_distance_angle_height(toGoal, height_at_goal, angle), 2) + - pow(vertical_velocity_by_Xvelocity_with_angle(horizontal_velocity_using_distance_angle_height(toGoal, height_at_goal, angle), angle), 2)); - } - - /** - * method: horizontal_velocity_using_distance_angle_height(ld targetDistance, ld targetHeight, ld angle, ld acceleration) - * arguments: distance, height, angle, acceleration = default is -9.8 - * purpose: finds x component velocity - * returns: ld, velocity of X component - */ - static ld horizontal_velocity_using_distance_angle_height(ld targetDistance, ld targetHeight, ld angle, ld acceleration = _Ga_) - { - return targetDistance * sqrt(-acceleration/((2 * (targetDistance * tan(angle*RADIAN) - targetHeight)))); - } - /** - * @brief - * @param xVelocity - * @param angle - * @return - */ - static ld vertical_velocity_by_Xvelocity_with_angle(ld xVelocity, ld angle) - { - return xVelocity * tan(angle*RADIAN); - } - - static ld horizontal_velocity_of_projectile_at_max_altitude(ld angle, ld velocity) - { - return velocity * cos(angle * RADIAN); - } - static ld vertical_velocity_of_projectile_at_max_altitude(ld angle, ld velocity) - { - return velocity * sin(angle * RADIAN); - } - - - /// - /// uses quadratic formula to return two angles in a vector, the larger angle - /// is the best angle to use - /// - /// The launch velocity. - /// Height of the ball at its release. - /// The hoop distance from shot. - /// angle to shoot - template - static vector basketball_angles(T launchVelocity, T releaseHeight, T hoopDistance, ld hoopHeight = 3.048) - { - vector angles; - ld a = (((_Ga_) * (hoopDistance * hoopDistance)) / (2 * (launchVelocity * launchVelocity))); - ld b = -hoopDistance; - ld c = ((hoopHeight - releaseHeight) + a); - angles.push_back(atan(-((b)+sqrt((b * b) - 4 * a * c)) / (2 * a))*DEGREE); - angles.push_back(atan(-((b)-sqrt((b * b) - 4 * a * c)) / (2 * a))*DEGREE); - - return angles; - } - - static ld starting_height_of_projectile(ld angle, ld velocity) - { - return (velocity * sin(angle * RADIAN)) / (-_Ga_); - } - static ld height(ld time, ld a = _Ga_) - { - return (a * time * time) / 2; - } - static ld height(ld x, ld v, ld a) - { - auto t = x / v; - return (a * t * t) / 2; - } - /** - * @brief You're windsurfing at v0 (L/T) when a gust hits, accelerating your sailboard - * at acc (L/T^2) at degrees theta to your original direction. If the gust lasts - * t (T), what's the magnitude of the board's displacement during this time? - * @param v0 The initial velocity of the board (L/T) - * @param acc The acceleration of the board (L/T^2) - * @param theta The angle of the gust (degrees) - * @param t The duration of the gust (T) - * @return The magnitude of the board's displacement during this time - */ - static ld displacement_2d(ld v0, ld acc, ld theta, ld t) { - auto x_a = acc * cos(theta*RADIAN); - auto y_a = acc * sin(theta*RADIAN); - auto x_d = v0*t + (1.0/2.0)*x_a*t*t; - auto y_d = (1.0/2.0)*y_a*t*t; - return sqrt(pow(x_d, 2) + pow(y_d, 2)); - } - - /** - * @brief You're windsurfing at v0 (L/T) when a gust hits, accelerating your sailboard - * at theta (degrees) to your original direction. The gust lasts t (T), and - * the board's displacement during this time is d (L). Find the magnitude of - * the board's acceleration during the gust. - * @param v0 The initial velocity of the board (L/T) - * @param theta The angle of the gust (degrees) - * @param t The duration of the gust (T) - * @param d The magnitude of the board's displacement during this time (L) - * @return The magnitude of the board's acceleration during the gust - */ - static ld acceleration_2d(ld v0, ld theta, ld t, ld d) { - auto x_d = d*cos(theta*RADIAN); - auto y_d = d*sin(theta*RADIAN); - auto x_a = (2*x_d - v0*t)/(t*t); - auto y_a = (2*y_d)/(t*t); - return sqrt(pow(x_a, 2) + pow(y_a, 2)); - } - - /** - * @brief A delivery drone approaches a customer's porch, flying h (L) above the porch - * at v0 (L/T). (a) At what horizontal distance from the desired landing spot - * should it release a package? (b) At what speed will the package hit the porch? - */ - static vector delivery_drone_package_drop_data(ld h, ld v0) { - vector results; - auto time_y = sqrt(2*h/(_Ga_)); - results.push_back(v0*time_y); - auto vy = GA*time_y; - results.push_back(sqrt(vy*vy + v0*v0)); - return results; - } - - /** - * A projectile has horizontal range R (L) on level ground and reaches maximum - * height h (L). Find its initial speed. - */ - static ld projectile_initial_speed(ld R, ld h) { - return sqrt(2*h*_Ga_ + (((R*R) * _Ga_)/(8.0 * h))); - } - - /** - You and your roommate plot to drop water balloons from your window on - students entering your dorm. You plan to place an X on the sidewalk to - mark the spot a student must be when you drop the balloon. You note that - most students approach the dorm at about v0 (L/T). If you place the X at a - distance of d (L) from the impact point, what is the height of your - window from ground level? - */ - static ld height_from_free_fall(ld vx0, ld d, ld vy0 = 0) { - auto t = d / vx0; - // calculate the final fall speed - //auto vy = vy0 + GA*t; - // find the free fall distance - auto d_free = vy0*t + (1.0/2.0)*GA*t*t; - return d_free; - } - - - - - ~Kinematics() - { - delete _kinematicPtr; - } - -private: - static void countIncrease() { kinematics_objectCount += 1; } - static void countDecrease() { kinematics_objectCount -= 1; } -}; - - -#endif //PHYSICSFORMULA_KINEMATICS_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_KINEMATICS_H +#define PHYSICSFORMULA_KINEMATICS_H +/** + * @class Kinematics + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @dateBuilt 1/1/2021 + * @lastEdit 1/1/2021 + */ +#include "VectorND.h" +#include +#include +#include + +using namespace std; +typedef long double ld; + +static int kinematics_objectCount = 0; + + +/// +/// The vector values is for storing answers when there requires multiple +/// answers +/// +static std::vector vector_values = { 0.0,0.0,0.0,0.0 }; +/// +/// Sets the vector. +/// +/// The vector to add too. +/// value to add +/// position to add to +template +static auto setVector(vector& v, T val, int index) +{ + if (index < v.size()) + { + v[index] = val; + return true; + } + return false; +} + +/// +/// Returns the vector. +/// +/// The v. +/// +static vector return_vector(vector& v) { return v; } +/// +/// Shows the vector. +/// +static void showVector() +{ + for (auto it : vector_values) + { + std::cout << it << ", "; + } + std::cout << std::endl; +} + +class Kinematics +{ +public: + Kinematics* _kinematicPtr; + + Kinematics() + { + _kinematicPtr = nullptr; + countIncrease(); + } + + /** + * @brief copy constructor + */ + Kinematics(const Kinematics& t) + { + _kinematicPtr = t._kinematicPtr; + countIncrease(); + } + /** + * #brief move constructor + */ + Kinematics(Kinematics&& t) noexcept + { + _kinematicPtr = t._kinematicPtr; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Kinematics& operator=(const Kinematics& t) + { + if (this != &t) + { + _kinematicPtr = t._kinematicPtr; + countIncrease(); + } + return *this; + } + + static void show_objectCount() { std::cout << "\n kinematics object count: " + << kinematics_objectCount << std::endl; } + static int get_objectCount() { return kinematics_objectCount; } + + + //========================================================================= + //chapter 2 formulas + + /** + * @brief Returns the displacement between two positions + * @param startPos starting position + * @param endPos ending position + * @returns displacement. + */ + static ld displacement(const ld startPos,const ld endPos) + { return endPos - startPos; } + + /** + * @brief Returns the displacement from knowing the velocity and time. + * @param velocity in m/s + * @param time in seconds + * @returns displacement. + */ + static ld displacement_VxT(const ld velocity, const ld time) + { return velocity * time; } + + /** + * method: displacement_accelerating_object(ld acceleration, ld time) + * arguments: acceleration m/s , time in s + * purpose: find the displacement of an accelerating object + * returns: ld, displacement + */ + static ld displacement_accelerating_object(const ld acceleration, const ld time) + { return ((acceleration) * (time * time)) / 2; } + + /** + * method: displacement_accelerating_object_PV(ld acceleration, ld time) + * arguments: velocity, acceleration m/s , position = 0m default, time in s + * purpose: find the displacement of an accelerating object with a starting + * position and an initial velocity along with acceleration and a time + * returns: ld, displacement + */ + static ld displacement_accelerating_object_PV(const ld velocity, + const ld acceleration, + const ld time, + const ld pos = 0) + { return pos + (velocity * time) + (acceleration * (time * time)) / 2; } + + /** + * @brief calculates the displacement using the kinematic formula + * X = Vi*t+ 1/2*a*t^2 + * @param velocity in m/s + * @param acceleration in m/s^2 + * @param time in s + */ + static ld displacement_using_kinematic(const ld velocity, + const ld acceleration, + const ld time) + { + return (velocity * time) + (acceleration * (time * time)) / 2; + } + + + /// + /// calculate displacement for the distance to stop from moving object + /// + /// The velocity start. + /// The velocity final. + /// The acceleration. + /// The starting position, default is 0. + /// final displacement + static ld distance(const ld velocityStart, const ld velocityFinal, const ld acceleration, const ld pos = 0.0) + { return abs(((velocityFinal * velocityFinal) - (velocityStart * velocityStart)) / (2.0 * acceleration)) + pos; } + + /** + * method: velocity_vStart_plus_vEndD2(const ld velocityStart, const ld velocityEnd) + * arguments: vStart = starting velocity m/s, vEnd = ending velocity m/s + * purpose: find the displacement when start and end velocity is know + * returns: ld, displacement + */ + static ld velocity_vStart_plus_vEndD2(const ld velocityStart, const ld velocityEnd) + { return (velocityStart + velocityEnd) / 2; } + + + static ld velocity_final_from_kinematic_time(const ld initialVelocity, const ld acceleration, const ld time) + { return initialVelocity + acceleration * time; } + + /** + *@brief calculates the final velocity using the kinematic formula vf^2 = vi^2 + 2*a*d + *@param initialVelocity m/s + *@param acceleration m/s^2 + *@param displacement m + *@returns the final velocity + */ + static ld velocity_final_kinematic_no_time(const ld initialVelocity, const ld acceleration , const ld displacement) + { return sqrt(initialVelocity * initialVelocity + (2 * (acceleration * displacement))); } + + /** + * @brief calculates the average velocity + * @param d the displacement + * @param t the time + * @return the average velocity + */ + static ld average_velocity(const ld d, const ld t) + { return d / t; } + + + /** + * @brief v^2 = vi^2 + 2*a*(x0 - xf) == v = sqrt(vi^2 + 2*a*(x0 - xf)) + * @param x0 the initial position + * @param xf the final position + * @param v0 the initial velocity + * @param a the acceleration + * @return final velocity + */ + static ld final_velocity(const ld x0, const ld xf, const ld v0, const ld a) + { return sqrt((v0 * v0) + (2 * (a * (xf - x0)))); } + + /** + * @brief v = vi + a*t + * @param vi the initial velocity + * @param a the acceleration + * @param t the time + * @return final velocity + */ + static ld final_velocity(const ld vi,const ld a, const ld t) + { + return vi + a*t; + } + + /** + * @brief calculates the initial velocity given the final velocity, distance s + * and time t + * @param v_f final velocity + * @param s distance + * @param t time + * @return the initial velocity + */ + static auto initial_velocity(const ld v_f, const ld s, const ld t) { + return (2.0 * s - t * v_f) / t; + } + + + /// + /// Constant Acceleration average using final velocity, starting velocity and time. + /// + /// The final velocity. + /// The initial velocity. + /// The time taken. + /// average acceleration + static ld acceleration_avg(const ld u_, const ld v_, const ld t) + { return (u_ - v_) / t; } + + /// + /// Constant Acceleration average using change in velocity and time. + /// + /// The change in velocity. + /// The time. + /// average acceleration + template + static auto acceleration_avg(const T deltaV, const T t) + { return deltaV / t; } + + + /// + /// Calculates the constant accelerations from distance, speed, and time. + /// + /// The initial speed. + /// The distance. + /// The time. + /// acceleration + template + static auto acceleration_from_distance_speed_time(const T u, const T s, const T t) + { return (2 * (s - (u * t)) / (t * t)); } + + + /// + /// Calculates the constant accelerations from initialize velocity, final velocity + /// and the displacement. + /// + /// The initial velocity. + /// The final velocity. + /// The distance. + /// acceleration + template + static auto acceleration_from_initV_finV_displacement(const T u, const T v, const T s) + { return (v * v - u * u) / (2.0 * s); } + + /** + * @brief calulates the average speed + * @param s the distance + * @param t the time + * @return the average speed + */ + static ld average_speed(const ld s, const ld t) + { return abs(s / t); } + + /** + * method: time_by_avgVdA(ld acceleration, ld velocityStart, ld velocityEnd) + * arguments: a = acceleration, sV = start velocity(default 0), fV = final velocity + * purpose: calculate time with know acceleration and final velocity end point + * returns: ld, time + */ + static ld time_by_velocity_acceleration(const ld acceleration, const ld velocityStart, const ld velocityEnd) + { return (velocityEnd - velocityStart) / acceleration; } + + /** + * method: time_by_DisTdV(ld distance, ld velocity) + * arguments: distance , average velocity + * purpose: find the velocity of a falling object thrown downwards + * returns: ld, velocity + */ + static ld time_by_distance_velocity(const ld distance, const ld velocity) + { return distance / velocity; } + + /** + * method: time_finalPos_acceleration(ld displacement, ld acceleration) + * arguments: displacement of object, acceleration of object + * purpose: find how long it takes an object with a known acceleration to travel a know distance + * returns: ld, time to accelerate a distance + */ + static ld time_by_finalPos_acceleration(const ld displacement, const ld acceleration) + { return sqrt((2 * displacement) / acceleration); } + + /** + * method: time(ld startTime, ld endTime) + * arguments: y = startTime = beginning time in seconds, endTime = endTime in seconds + * purpose: find the amount of time between two periods + * returns: ld, difference in two times + */ + static ld time_difference(const ld startTime, const ld endTime) + { return endTime - startTime; } + + /** + * method: time_kinematic_rearranged(ld velocity, ld y0, ld acceleration) const + * arguments: velocity, y0 = position from 0, acceleration + * purpose: find the amount of time between two periods + * returns: ld, difference in two times + */ + static ld time_kinematic_rearranged(const ld velocity, const ld displacement, const ld acceleration) + { return (-(velocity)-sqrt((velocity * velocity) - 2 * (acceleration) * (displacement))) / (acceleration); } + + /** + * method: slope_formula(ld y1, ld y0, ld x1, ld x0) + * arguments: y1 , y0, x1, x0 + * purpose: the general slope equation of (y1 - y0)/(x1 - x0) + * to find the slope of a line between two points + * returns: ld, slope of line between two points + */ + static ld slope_formula(const ld y1, const ld y0, const ld x1, const ld x0) + { return (y1 - y0) / (x1 - x0); } + + /** + * method: rotation_speed_2PIxRdT(ld radius, ld rotations, ld time) + * arguments: radius = length in m from center of rotation + * rotations = how many rotations in a time period + * time = time units + * purpose: find the speed of a spinning object, such as fan blade + * returns: average speed of spinning object + */ + static ld rotation_speed_2PIxRdT(const ld radius, const ld rotations, const ld time) + { return (2.0 * _PI_ * radius) / (time / rotations); } + + /** + * method: rotation_avgVelocity_2PIxRdT_in_1_rotation(ld radius, ld time) + * arguments: radius , time = time for one rotation + * purpose: find average velocity of a spinning object + * returns: ld, average velocity + */ + static ld rotation_avgVelocity_2PIxRdT_in_1_rotation(const ld radius, const ld time) + { return (2.0 * _PI_ * radius) / time; } + + /** + * @brief Returns the conversion of given value divided by the acceleration of gravity on earth, 9.80 m/s^2 + * @param value the value to find the multiples of gravity of + * returns: g's + */ + static ld conversion_multiple_of_gravity(const ld value) + { return value / _Ga_; } + + /** + * method: time_using_quadratic(ld a, ld b, ld c) + * arguments: a1 = default to 1, b_velocity = constant velocity, c_displacement = total distance to travel + * purpose: calculate the time of a merging object when velocity and displacement is know + * returns: ld, total time + */ + static std::vector time_using_quadratic(ld a1, ld b_velocity, ld c_displacement) + { + vector_values[0] = (-b_velocity + sqrt((b_velocity * b_velocity) - 4 * a1 * c_displacement)) / (2 * a1); + vector_values[1] = (-b_velocity - sqrt((b_velocity * b_velocity) - 4 * a1 * c_displacement)) / (2 * a1); + + return vector_values; + } + + /** + * method: pos_vel_falling_object_upDown(double p, double v_, double a, double t) + * arguments: p = position (0), v_ = velocity, a = acceleration, t = time is s + * purpose: this method will fill a vector with four pieces of data in order from the right to left it + * is: time, position, velocity, acceleration. use the print_vector_values() to see contents. + * returns: ld, vector of the time, position, velocity, acceleration. + */ + static std::vector pos_vel_falling_object_upDown(ld v_, ld a, ld t, ld p = 0.0) + { + ld temp; + vector_values[0] = t; + vector_values[1] = Kinematics::displacement_accelerating_object_PV(v_, a, t, p); + //Solution for Velocity: + temp = Kinematics::velocity_final_from_kinematic_time(v_, a, t); + vector_values[2] = temp; + vector_values[3] = a; + //this->show_vector_values(); + return vector_values; + } + + static std::vector> + time_and_velocity_falling_obj_to_P_Q(ld seperationPQ, ld timeBetweenPQ) { + vector> timeAndVelocity; + timeAndVelocity.emplace_back("time to P", 0.0); + timeAndVelocity.emplace_back("time to Q", 0.0); + timeAndVelocity.emplace_back("velocity at P", 0.0); + timeAndVelocity.emplace_back("velocity at Q", 0.0); + auto timeToP = + (seperationPQ - ((1.0/2.0)*_ga_*(timeBetweenPQ*timeBetweenPQ))) / + (timeBetweenPQ*_ga_); + auto timeToQ = timeToP + timeBetweenPQ; + auto velAtP = timeToP * _ga_; + auto velAtQ = timeToQ * _ga_; + timeAndVelocity[0].second = timeToP; + timeAndVelocity[1].second = timeToQ; + timeAndVelocity[2].second = velAtP; + timeAndVelocity[3].second = velAtQ; + return timeAndVelocity; + } + + /// + /// Calculates the horizontal range of a projectile. + /// + /// The velocity. + /// The angle theta. + /// range of projectile + template + static auto horizontal_range_projectile(const T v, const T theta) + { return ((v * v) * sin(2 * theta * RADIAN) / (_Ga_)); } + + /// + /// calculates the angle theta of a projectile + /// + /// The distance. + /// The velocity. + /// theta + static ld projectile_theta(const ld distance, const ld velocity) + { + return (asinh(distance * _Ga_) / (velocity * velocity)) / 2; + } + + /// + /// Calculates the trajectories equation for a projectile + /// + /// The initial velocity. + /// The angle theta of projectiles launch. + /// The height initially started from. + /// a string with the trajectory equation of projectile's parabola + template + static auto trajectory_equation(T v, T theta, T h_0) + { + auto prt1 = tan(theta * RADIAN); + auto prt2 = _Ga_ / (2.0 * (v * v) * pow(cos(theta * RADIAN), 2)); + string results ="y = -" + to_string(prt2) + "x^2" + " + " + to_string(prt1) +"x + "+ to_string(h_0) ; + return results; + } + + /// + /// calculates the time a projectile with an initial velocity and angle + /// take to reach the same level from which it was launched, forms a parabolic curve + /// (2* launchVelocity*sin(angleTheta))/(-GA); + /// + /// The launch velocity. + /// The angle theta. + /// air time + static ld time_for_projectile_to_reach_level(ld launchVelocity, ld angleTheta) + { + return (2 * launchVelocity * sin(angleTheta)) / (_Ga_); + } + + /// + /// Time of projectile in flight. + /// + /// The angle. + /// The initial height. + /// The velocity. + /// time in seconds projectile was in flight + static ld time_of_projectiles_flight(ld angle, ld initialHeight, ld velocity) + { + ld vy = velocity * sin(angle * RADIAN); + cout << "vy = " << vy << endl; + cout <<"initialHeight = " << initialHeight << endl; + return (vy + (sqrt((vy * vy) + 2.0 * _Ga_ * initialHeight))) / _Ga_; + } + + /// + /// calculates the range of a projectiles flight. + /// + /// The angle. + /// The initial height. + /// The velocity. + /// + static ld range_of_projectile_flight(ld angle, ld initialHeight, ld velocity) + { + return velocity * cos(angle * RADIAN) * time_of_projectiles_flight(angle, initialHeight, velocity); + } + + /** + * Derive a general formula for the horizontal distance covered by a + * projectile launched horizontally at speed from height . + */ + static ld horizontal_distance_covered_by_projectile(ld speed, ld height, bool print = false) + { + auto time = sqrt(2.0 * height / _Ga_); + auto horizDis = speed * sqrt((2.0*height) / _Ga_); + if (print) + { + cout << "time = " << time << endl; + cout << "range = " << horizDis << endl; + + } + return horizDis; + } + + /// + /// calculates the maximum height of a projectile. + /// + /// The angle. + /// The initial height. + /// The velocity. + /// + static ld maximum_height_of_projectile(ld angle, ld initialHeight, ld velocity, bool print = false) + { + + ld vy = velocity * sin(angle * RADIAN); + auto maxH = initialHeight + ((vy * vy) / (2.0 * _Ga_)); + if (print) + { + cout << "vy = " << vy << endl; + cout << "max height = " << maxH << endl; + } + return maxH; + } + + /// + /// calculates the air time from an initial velocity of 0 + /// + /// The total displacement. + /// time is seconds in air + static ld air_time_initial_velocity0_y0(ld displacement, bool print = false) + { + auto air_time = sqrt((-2*(displacement))/_Ga_); + if (print) + { + cout << "air time = " << air_time << endl; + } + return air_time; + } + + + /// + /// calculates the initial velocity of the horizontal component + /// + /// The initial starting height. + /// The displacement. + /// + static ld velocity_initial_horizontal_component(ld y0, ld displacement) + { + return sqrt((-_Ga_/(-2 * y0)))* displacement; + } + + /** + * method: velocity_final_vertical_component(ld y0, ld yf = 0) const + * arguments: y0 = starting height, yf = final vertical component default = 0 + * purpose: calculates the final vertical component + * returns: ld, final vertical velocity + */ + static ld velocity_vertical_component(ld y0, ld yf) + { + return -sqrt(2 * (-_Ga_) * (yf - y0)); + } + + + /** + * method: velocity_final_vertical_component(ld y0, ld yf = 0) const + * arguments: y0 = starting height, yf = final vertical component default = 0 + * purpose: calculates the final vertical component + * returns: ld, final vertical velocity + */ + static vector final_projectile_velocity_vector(ld velocityY, ld velocityX) + { + vector_values[0] = sqrt(velocityY * velocityY + velocityX * velocityX); + vector_values[1] = atan(velocityY / velocityX)*DEGREE; + return vector_values; + } + + /**NOT WORKING RIGHT + * method: velocity_soccer_kick(ld toGoal, ld height_at_goal, ld angle) const + * arguments: distance to goal, height ball is at goal, and initial angle of kick + * purpose: calculates the final velocity of both component vectors + * returns: ld, magnitude of final velocity vector + */ + static ld velocity_soccer_kick(ld toGoal, ld height_at_goal, ld angle) + { + return sqrt(pow(horizontal_velocity_using_distance_angle_height(toGoal, height_at_goal, angle), 2) + + pow(vertical_velocity_by_Xvelocity_with_angle(horizontal_velocity_using_distance_angle_height(toGoal, height_at_goal, angle), angle), 2)); + } + + /** + * method: horizontal_velocity_using_distance_angle_height(ld targetDistance, ld targetHeight, ld angle, ld acceleration) + * arguments: distance, height, angle, acceleration = default is -9.8 + * purpose: finds x component velocity + * returns: ld, velocity of X component + */ + static ld horizontal_velocity_using_distance_angle_height(ld targetDistance, ld targetHeight, ld angle, ld acceleration = _Ga_) + { + return targetDistance * sqrt(-acceleration/((2 * (targetDistance * tan(angle*RADIAN) - targetHeight)))); + } + /** + * @brief + * @param xVelocity + * @param angle + * @return + */ + static ld vertical_velocity_by_Xvelocity_with_angle(ld xVelocity, ld angle) + { + return xVelocity * tan(angle*RADIAN); + } + + static ld horizontal_velocity_of_projectile_at_max_altitude(ld angle, ld velocity) + { + return velocity * cos(angle * RADIAN); + } + static ld vertical_velocity_of_projectile_at_max_altitude(ld angle, ld velocity) + { + return velocity * sin(angle * RADIAN); + } + + + /// + /// uses quadratic formula to return two angles in a vector, the larger angle + /// is the best angle to use + /// + /// The launch velocity. + /// Height of the ball at its release. + /// The hoop distance from shot. + /// angle to shoot + template + static vector basketball_angles(T launchVelocity, T releaseHeight, T hoopDistance, ld hoopHeight = 3.048) + { + vector angles; + ld a = (((_Ga_) * (hoopDistance * hoopDistance)) / (2 * (launchVelocity * launchVelocity))); + ld b = -hoopDistance; + ld c = ((hoopHeight - releaseHeight) + a); + angles.push_back(atan(-((b)+sqrt((b * b) - 4 * a * c)) / (2 * a))*DEGREE); + angles.push_back(atan(-((b)-sqrt((b * b) - 4 * a * c)) / (2 * a))*DEGREE); + + return angles; + } + + static ld starting_height_of_projectile(ld angle, ld velocity) + { + return (velocity * sin(angle * RADIAN)) / (-_Ga_); + } + static ld height(ld time, ld a = _Ga_) + { + return (a * time * time) / 2; + } + static ld height(ld x, ld v, ld a) + { + auto t = x / v; + return (a * t * t) / 2; + } + /** + * @brief You're windsurfing at v0 (L/T) when a gust hits, accelerating your sailboard + * at acc (L/T^2) at degrees theta to your original direction. If the gust lasts + * t (T), what's the magnitude of the board's displacement during this time? + * @param v0 The initial velocity of the board (L/T) + * @param acc The acceleration of the board (L/T^2) + * @param theta The angle of the gust (degrees) + * @param t The duration of the gust (T) + * @return The magnitude of the board's displacement during this time + */ + static ld displacement_2d(ld v0, ld acc, ld theta, ld t) { + auto x_a = acc * cos(theta*RADIAN); + auto y_a = acc * sin(theta*RADIAN); + auto x_d = v0*t + (1.0/2.0)*x_a*t*t; + auto y_d = (1.0/2.0)*y_a*t*t; + return sqrt(pow(x_d, 2) + pow(y_d, 2)); + } + + /** + * @brief You're windsurfing at v0 (L/T) when a gust hits, accelerating your sailboard + * at theta (degrees) to your original direction. The gust lasts t (T), and + * the board's displacement during this time is d (L). Find the magnitude of + * the board's acceleration during the gust. + * @param v0 The initial velocity of the board (L/T) + * @param theta The angle of the gust (degrees) + * @param t The duration of the gust (T) + * @param d The magnitude of the board's displacement during this time (L) + * @return The magnitude of the board's acceleration during the gust + */ + static ld acceleration_2d(ld v0, ld theta, ld t, ld d) { + auto x_d = d*cos(theta*RADIAN); + auto y_d = d*sin(theta*RADIAN); + auto x_a = (2*x_d - v0*t)/(t*t); + auto y_a = (2*y_d)/(t*t); + return sqrt(pow(x_a, 2) + pow(y_a, 2)); + } + + /** + * @brief A delivery drone approaches a customer's porch, flying h (L) above the porch + * at v0 (L/T). (a) At what horizontal distance from the desired landing spot + * should it release a package? (b) At what speed will the package hit the porch? + */ + static vector delivery_drone_package_drop_data(ld h, ld v0) { + vector results; + auto time_y = sqrt(2*h/(_Ga_)); + results.push_back(v0*time_y); + auto vy = GA*time_y; + results.push_back(sqrt(vy*vy + v0*v0)); + return results; + } + + /** + * A projectile has horizontal range R (L) on level ground and reaches maximum + * height h (L). Find its initial speed. + */ + static ld projectile_initial_speed(ld R, ld h) { + return sqrt(2*h*_Ga_ + (((R*R) * _Ga_)/(8.0 * h))); + } + + /** + You and your roommate plot to drop water balloons from your window on + students entering your dorm. You plan to place an X on the sidewalk to + mark the spot a student must be when you drop the balloon. You note that + most students approach the dorm at about v0 (L/T). If you place the X at a + distance of d (L) from the impact point, what is the height of your + window from ground level? + */ + static ld height_from_free_fall(ld vx0, ld d, ld vy0 = 0) { + auto t = d / vx0; + // calculate the final fall speed + //auto vy = vy0 + GA*t; + // find the free fall distance + auto d_free = vy0*t + (1.0/2.0)*GA*t*t; + return d_free; + } + + + + + ~Kinematics() + { + delete _kinematicPtr; + } + +private: + static void countIncrease() { kinematics_objectCount += 1; } + static void countDecrease() { kinematics_objectCount -= 1; } +}; + + +#endif //PHYSICSFORMULA_KINEMATICS_H diff --git a/Line.cpp b/Line.cpp index fd8af57..192383a 100644 --- a/Line.cpp +++ b/Line.cpp @@ -1,44 +1,44 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#include "Line.h" - -void rez::Line::setDirection(Vector3f& _dir) -{ - dir.assign(X, _dir[X]); - dir.assign(Y, _dir[Y]); - dir.assign(Z, _dir[Z]); -} - -void rez::Line::setPoint(Point3d& _point) -{ - point_in_line.assign(X, _point[X]); - point_in_line.assign(Y, _point[Y]); - point_in_line.assign(Z, _point[Z]); -} - -rez::Vector3f rez::Line::direction() const -{ - return dir; -} - -rez::Point3d rez::Line::point() const -{ - return point_in_line; -} - -rez::Vector2f rez::Line2d::direction() const -{ - return dir; -} - -rez::Point2d rez::Line2d::point() const -{ - return point_in_line; -} - -rez::Vector2f rez::Line2d::normal() const -{ - return normal_vec; +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#include "Line.h" + +void rez::Line::setDirection(Vector3f& _dir) +{ + dir.assign(X, _dir[X]); + dir.assign(Y, _dir[Y]); + dir.assign(Z, _dir[Z]); +} + +void rez::Line::setPoint(Point3d& _point) +{ + point_in_line.assign(X, _point[X]); + point_in_line.assign(Y, _point[Y]); + point_in_line.assign(Z, _point[Z]); +} + +rez::Vector3f rez::Line::direction() const +{ + return dir; +} + +rez::Point3d rez::Line::point() const +{ + return point_in_line; +} + +rez::Vector2f rez::Line2d::direction() const +{ + return dir; +} + +rez::Point2d rez::Line2d::point() const +{ + return point_in_line; +} + +rez::Vector2f rez::Line2d::normal() const +{ + return normal_vec; } \ No newline at end of file diff --git a/Line.h b/Line.h index 2b44c66..08f177d 100644 --- a/Line.h +++ b/Line.h @@ -1,143 +1,143 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_LINE_H -#define PHYSICSFORMULA_LINE_H -#include "Vector.h" -#include "Point.h" - -namespace rez { - class Line { - Vector3f dir; // Normalized direction vector. - Point3d point_in_line; - - public: - - Line() {} - - Line(Point3d& p1, Point3d& p2) - { - point_in_line = p1; - dir = p2 - p1; - dir.normalize(); - } - - void setDirection(Vector3f&); - - void setPoint(Point3d&); - - Vector3f direction() const; - - Point3d point() const; - }; - - class Line2d { - Vector2f dir; - Point2d point_in_line; - Vector2f normal_vec; - - public: - - Line2d() {} - - Line2d(Point2d& p1, Vector2f& _dir) - { - point_in_line = p1; - dir = _dir; - dir.normalize(); - normal_vec.assign(X, -dir[Y]); - normal_vec.assign(Y, dir[X]); - } - - Vector2f direction() const; - - Point2d point() const; - - Vector2f normal() const; - }; - - template - class LineStd { - Vector point; - Vector dir; - Vector second; - float d; - - public: - LineStd() {} - - LineStd(Vector& p1, Vector& p2, bool points = false) { - if (points) { - dir = p2 - p1; - second = p2; - } - else - dir = p2; - - dir.normalize(); - point = p1; - } - - Vector getPoint() const; - - Vector getSecondPoint() const; - - Vector getDir() const; - - float getD() const; - - void setDirection(Vector& _dir); - - void setPoint(Vector& _point); - - void setD(float value); - - }; - - template - inline Vector LineStd::getPoint()const - { - return point; - } - - template - inline Vector LineStd::getSecondPoint() const - { - return second; - } - - template - inline Vector LineStd::getDir() const - { - return dir; - } - - template - inline float LineStd::getD() const - { - return d; - } - - template - inline void LineStd::setDirection(Vector& _dir) - { - dir = _dir; - } - - template - inline void LineStd::setPoint(Vector& _point) - { - point = _point; - } - - template - inline void LineStd::setD(float value) - { - d = value; - } - - typedef LineStd Line2dStd; - typedef LineStd Line3dStd; -} -#endif //PHYSICSFORMULA_LINE_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_LINE_H +#define PHYSICSFORMULA_LINE_H +#include "Vector.h" +#include "Point.h" + +namespace rez { + class Line { + Vector3f dir; // Normalized direction vector. + Point3d point_in_line; + + public: + + Line() {} + + Line(Point3d& p1, Point3d& p2) + { + point_in_line = p1; + dir = p2 - p1; + dir.normalize(); + } + + void setDirection(Vector3f&); + + void setPoint(Point3d&); + + Vector3f direction() const; + + Point3d point() const; + }; + + class Line2d { + Vector2f dir; + Point2d point_in_line; + Vector2f normal_vec; + + public: + + Line2d() {} + + Line2d(Point2d& p1, Vector2f& _dir) + { + point_in_line = p1; + dir = _dir; + dir.normalize(); + normal_vec.assign(X, -dir[Y]); + normal_vec.assign(Y, dir[X]); + } + + Vector2f direction() const; + + Point2d point() const; + + Vector2f normal() const; + }; + + template + class LineStd { + Vector point; + Vector dir; + Vector second; + float d; + + public: + LineStd() {} + + LineStd(Vector& p1, Vector& p2, bool points = false) { + if (points) { + dir = p2 - p1; + second = p2; + } + else + dir = p2; + + dir.normalize(); + point = p1; + } + + Vector getPoint() const; + + Vector getSecondPoint() const; + + Vector getDir() const; + + float getD() const; + + void setDirection(Vector& _dir); + + void setPoint(Vector& _point); + + void setD(float value); + + }; + + template + inline Vector LineStd::getPoint()const + { + return point; + } + + template + inline Vector LineStd::getSecondPoint() const + { + return second; + } + + template + inline Vector LineStd::getDir() const + { + return dir; + } + + template + inline float LineStd::getD() const + { + return d; + } + + template + inline void LineStd::setDirection(Vector& _dir) + { + dir = _dir; + } + + template + inline void LineStd::setPoint(Vector& _point) + { + point = _point; + } + + template + inline void LineStd::setD(float value) + { + d = value; + } + + typedef LineStd Line2dStd; + typedef LineStd Line3dStd; +} +#endif //PHYSICSFORMULA_LINE_H diff --git a/LinearAlgebra.h b/LinearAlgebra.h index f34ad02..837ceb2 100644 --- a/LinearAlgebra.h +++ b/LinearAlgebra.h @@ -1,18 +1,18 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_LINEARALGEBRA_H -#define PHYSICSFORMULA_LINEARALGEBRA_H -template -auto dot_product(VECTOR& v, VECTOR& u) -{ - return v.dot_product(u); -} - -template -VECTOR cross_product(VECTOR& v, VECTOR& u) -{ - return v.cross_product(u); -} -#endif //PHYSICSFORMULA_LINEARALGEBRA_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_LINEARALGEBRA_H +#define PHYSICSFORMULA_LINEARALGEBRA_H +template +auto dot_product(VECTOR& v, VECTOR& u) +{ + return v.dot_product(u); +} + +template +VECTOR cross_product(VECTOR& v, VECTOR& u) +{ + return v.cross_product(u); +} +#endif //PHYSICSFORMULA_LINEARALGEBRA_H diff --git a/LinearRegression.h b/LinearRegression.h index d758137..1c911ac 100644 --- a/LinearRegression.h +++ b/LinearRegression.h @@ -1,88 +1,88 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_LINEARREGRESSION_H -#define PHYSICSFORMULA_LINEARREGRESSION_H -//α=224,ß=225,π=227,Σ=228,σ=229,µ=230,τ=231,Φ=232,Θ=233 -//Ω=234,δ=235,∞=236,φ=237,ε=238,∩=239,≡=240,Γ=226,γ, σ, ϑ, Å, Ώ, λ, γ -#include -#include "ETL.h" -/** - * @class LinearRegression - * @details - * dateBuilt 5/26/2021 - * lastEdit 5/26/2021 - */ - template -class LinearRegression -{ - -public: - LinearRegression() - {} - - /// - /// Ordinary least squares (OLS) used to find the slope m of a data set - /// - /// The x. - /// The y. - /// The theta. - /// - float OLS_Cost(MatrixND X, MatrixND y, MatrixND theta)const; - std::tuple,std::vector> - GradientDescent(MatrixND X, MatrixND y, - VectorND theta, float alpha, int iters)const; - float RSquared(MatrixND y, MatrixND y_hat)const; -}; - -#endif //LinearRegression_h -template -inline float LinearRegression::OLS_Cost(MatrixND X, MatrixND y, MatrixND theta)const -{ - - MatrixND inner = pow(((X*theta)-y).array(),2); - - return static_cast( inner.sum()/(2*X.rows())); -} -template -inline std::tuple,std::vector> -LinearRegression::GradientDescent(MatrixND X, MatrixND y, - VectorND theta, float alpha, int iters)const -{ - - MatrixND temp = theta; - - const int parameters = static_cast( theta.rows()); - - std::vector cost; - cost.push_back(OLS_Cost(X,y,theta)); - - for(int i=0; i error = X*theta - y; - for(int j=0; j X_i = X.col(j); - MatrixND term = error.cwiseProduct(X_i); - temp(j,0) = theta(j,0) - ((alpha/X.rows())*term.sum()); - } - theta = temp; - cost.push_back(OLS_Cost(X,y,theta)); - } - - return std::make_tuple(theta,cost); -} -template -inline float LinearRegression::RSquared(MatrixND y, MatrixND y_hat)const -{ - std::cout << "in Rsq - y:" << y << std::endl; - std::cout << "in Rsq - yhat: " << y_hat << std::endl; - auto num = pow((y-y_hat).array(),2).sum(); - std::cout << "in Rsq num: " << num << std::endl; - auto den = pow(y.array()-y.mean(),2).sum(); - std::cout << "in Rsq den: " << den << std::endl; - return static_cast( 1 - num/den); -} - - - - +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_LINEARREGRESSION_H +#define PHYSICSFORMULA_LINEARREGRESSION_H +//α=224,ß=225,π=227,Σ=228,σ=229,µ=230,τ=231,Φ=232,Θ=233 +//Ω=234,δ=235,∞=236,φ=237,ε=238,∩=239,≡=240,Γ=226,γ, σ, ϑ, Å, Ώ, λ, γ +#include +#include "ETL.h" +/** + * @class LinearRegression + * @details + * dateBuilt 5/26/2021 + * lastEdit 5/26/2021 + */ + template +class LinearRegression +{ + +public: + LinearRegression() + {} + + /// + /// Ordinary least squares (OLS) used to find the slope m of a data set + /// + /// The x. + /// The y. + /// The theta. + /// + float OLS_Cost(MatrixND X, MatrixND y, MatrixND theta)const; + std::tuple,std::vector> + GradientDescent(MatrixND X, MatrixND y, + VectorND theta, float alpha, int iters)const; + float RSquared(MatrixND y, MatrixND y_hat)const; +}; + +#endif //LinearRegression_h +template +inline float LinearRegression::OLS_Cost(MatrixND X, MatrixND y, MatrixND theta)const +{ + + MatrixND inner = pow(((X*theta)-y).array(),2); + + return static_cast( inner.sum()/(2*X.rows())); +} +template +inline std::tuple,std::vector> +LinearRegression::GradientDescent(MatrixND X, MatrixND y, + VectorND theta, float alpha, int iters)const +{ + + MatrixND temp = theta; + + const int parameters = static_cast( theta.rows()); + + std::vector cost; + cost.push_back(OLS_Cost(X,y,theta)); + + for(int i=0; i error = X*theta - y; + for(int j=0; j X_i = X.col(j); + MatrixND term = error.cwiseProduct(X_i); + temp(j,0) = theta(j,0) - ((alpha/X.rows())*term.sum()); + } + theta = temp; + cost.push_back(OLS_Cost(X,y,theta)); + } + + return std::make_tuple(theta,cost); +} +template +inline float LinearRegression::RSquared(MatrixND y, MatrixND y_hat)const +{ + std::cout << "in Rsq - y:" << y << std::endl; + std::cout << "in Rsq - yhat: " << y_hat << std::endl; + auto num = pow((y-y_hat).array(),2).sum(); + std::cout << "in Rsq num: " << num << std::endl; + auto den = pow(y.array()-y.mean(),2).sum(); + std::cout << "in Rsq den: " << den << std::endl; + return static_cast( 1 - num/den); +} + + + + diff --git a/LogisticRegression.h b/LogisticRegression.h index d5d0abd..6e16539 100644 --- a/LogisticRegression.h +++ b/LogisticRegression.h @@ -1,119 +1,119 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_LOGISTICREGRESSION_H -#define PHYSICSFORMULA_LOGISTICREGRESSION_H - -#include "LinearRegression.h" -#include -#include - template - class LogisticRegression { - public: - LogisticRegression() {} - - static MatrixND Sigmoid(MatrixND Z); - - static std::tuple, double, double> - Propagate(MatrixND W, double b, MatrixND X, - MatrixND y, double lambda); - - static std::tuple, double, MatrixND, double, std::list> - Optimize(MatrixND W, double b, MatrixND X, - MatrixND y, int num_iter, double learning_rate, - double lambda, bool log_cost); - - MatrixND - Predict(MatrixND W, double b, MatrixND X) const; - }; - -#endif //PHYSICSFORMULA_LOGISTICREGRESSION_H - template - inline MatrixND LogisticRegression::Sigmoid(MatrixND Z) { - return 1 / (1 + (-Z.array()).exp()); - } - template - inline std::tuple, double, double> - LogisticRegression::Propagate(MatrixND W, double b, - MatrixND X, - MatrixND y, double lambda) { - const int m = static_cast( y.rows()); - - - MatrixND Z = (W.transpose() * X.transpose()).array() + b; - MatrixND A = 1 / (1 + (-Z.array()).exp());//Sigmoid(Z); - auto ce_var1 = - y.transpose() * (MatrixND) A.array().log().transpose(); - auto ce_var2 = ((MatrixND)(1 - y.array())).transpose(); - auto ce_var3 = (MatrixND)(1 - A.array()).log().transpose(); - - auto cross_entropy = - -(ce_var1 + ce_var2 * ce_var3) / m; - double l2_reg_cost = W.array().pow(2).sum() * (lambda / (2.0 * m)); - std::cout << "in Propagate(l2 reg cost) = W.array.pow.sum*lamda/2*m: " - << l2_reg_cost << endl; - - double cost = static_cast((cross_entropy.array()[0])) + - l2_reg_cost; - std::cout << "in Propagate(cost) = cross_entrtopy.array[0]+l2regCost: " - << cost << endl; - MatrixND dw = - (MatrixND)( - ((MatrixND)(A - y.transpose()) * X) / m) + - ((MatrixND)(lambda / m * W)).transpose(); - double db = (A - y.transpose()).array().sum() / m; - return std::make_tuple(dw, db, cost); - } - template - inline std::tuple, double, MatrixND, double, std::list> - LogisticRegression::Optimize(MatrixND W, double b, - MatrixND X, MatrixND y, - int num_iter, - double learning_rate, double lambda, - bool log_cost) { - std::list costsList; - MatrixND dw; - double db = 0.0, cost = 0.0; - - for (int i = 0; i < num_iter; i++) { - std::cout << "in Optimize(for prop loop, lambda): " << lambda - << endl; - std::tuple, double, double> propagate = - Propagate(W, b, X, y, lambda); - std::tie(dw, db, cost) = propagate; - - W = W - (learning_rate * dw).transpose(); - b = b - (learning_rate * db); - if (i % 100 == 0) { - costsList.push_back(cost); - } - - if (log_cost && i % 100 == 0) { - std::cout << "Cost after iteration " << i << ": " << cost - << std::endl; - } - } - - return std::make_tuple(W, b, dw, db, costsList); - } - template - inline MatrixND - LogisticRegression::Predict(MatrixND W, double b, - MatrixND X) const { - const int m = static_cast( X.rows()); - MatrixND y_pred = MatrixND::Zero(m).transpose(); - - MatrixND Z = (W.transpose() * X.transpose()).array() + b; - MatrixND A = 1 / (1 + (-Z.array()).exp());//Sigmoid(Z); - - for (int i = 0; i < A.cols(); i++) { - if (A(0, i) <= 0.5) { - y_pred(0, i) = 0; - } else { - y_pred(0, i) = 1; - } - } - return y_pred.transpose(); - } - +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_LOGISTICREGRESSION_H +#define PHYSICSFORMULA_LOGISTICREGRESSION_H + +#include "LinearRegression.h" +#include +#include + template + class LogisticRegression { + public: + LogisticRegression() {} + + static MatrixND Sigmoid(MatrixND Z); + + static std::tuple, double, double> + Propagate(MatrixND W, double b, MatrixND X, + MatrixND y, double lambda); + + static std::tuple, double, MatrixND, double, std::list> + Optimize(MatrixND W, double b, MatrixND X, + MatrixND y, int num_iter, double learning_rate, + double lambda, bool log_cost); + + MatrixND + Predict(MatrixND W, double b, MatrixND X) const; + }; + +#endif //PHYSICSFORMULA_LOGISTICREGRESSION_H + template + inline MatrixND LogisticRegression::Sigmoid(MatrixND Z) { + return 1 / (1 + (-Z.array()).exp()); + } + template + inline std::tuple, double, double> + LogisticRegression::Propagate(MatrixND W, double b, + MatrixND X, + MatrixND y, double lambda) { + const int m = static_cast( y.rows()); + + + MatrixND Z = (W.transpose() * X.transpose()).array() + b; + MatrixND A = 1 / (1 + (-Z.array()).exp());//Sigmoid(Z); + auto ce_var1 = + y.transpose() * (MatrixND) A.array().log().transpose(); + auto ce_var2 = ((MatrixND)(1 - y.array())).transpose(); + auto ce_var3 = (MatrixND)(1 - A.array()).log().transpose(); + + auto cross_entropy = + -(ce_var1 + ce_var2 * ce_var3) / m; + double l2_reg_cost = W.array().pow(2).sum() * (lambda / (2.0 * m)); + std::cout << "in Propagate(l2 reg cost) = W.array.pow.sum*lamda/2*m: " + << l2_reg_cost << endl; + + double cost = static_cast((cross_entropy.array()[0])) + + l2_reg_cost; + std::cout << "in Propagate(cost) = cross_entrtopy.array[0]+l2regCost: " + << cost << endl; + MatrixND dw = + (MatrixND)( + ((MatrixND)(A - y.transpose()) * X) / m) + + ((MatrixND)(lambda / m * W)).transpose(); + double db = (A - y.transpose()).array().sum() / m; + return std::make_tuple(dw, db, cost); + } + template + inline std::tuple, double, MatrixND, double, std::list> + LogisticRegression::Optimize(MatrixND W, double b, + MatrixND X, MatrixND y, + int num_iter, + double learning_rate, double lambda, + bool log_cost) { + std::list costsList; + MatrixND dw; + double db = 0.0, cost = 0.0; + + for (int i = 0; i < num_iter; i++) { + std::cout << "in Optimize(for prop loop, lambda): " << lambda + << endl; + std::tuple, double, double> propagate = + Propagate(W, b, X, y, lambda); + std::tie(dw, db, cost) = propagate; + + W = W - (learning_rate * dw).transpose(); + b = b - (learning_rate * db); + if (i % 100 == 0) { + costsList.push_back(cost); + } + + if (log_cost && i % 100 == 0) { + std::cout << "Cost after iteration " << i << ": " << cost + << std::endl; + } + } + + return std::make_tuple(W, b, dw, db, costsList); + } + template + inline MatrixND + LogisticRegression::Predict(MatrixND W, double b, + MatrixND X) const { + const int m = static_cast( X.rows()); + MatrixND y_pred = MatrixND::Zero(m).transpose(); + + MatrixND Z = (W.transpose() * X.transpose()).array() + b; + MatrixND A = 1 / (1 + (-Z.array()).exp());//Sigmoid(Z); + + for (int i = 0; i < A.cols(); i++) { + if (A(0, i) <= 0.5) { + y_pred(0, i) = 0; + } else { + y_pred(0, i) = 1; + } + } + return y_pred.transpose(); + } + diff --git a/Magnetism.h b/Magnetism.h index 97d2a28..4fb24ce 100644 --- a/Magnetism.h +++ b/Magnetism.h @@ -1,597 +1,597 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_MAGNETISM_H -#define PHYSICSFORMULA_MAGNETISM_H -/** - * @class Magnetism - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @dateBuilt 3/18/2021 - * @lastEdit 3/21/2021 - */ -#include "ElectricCurrent.h" -#define Pi_ 3.14159265358979323846 -static int magnetism_objectCount = 0; -constexpr auto _GAUSS_ = 1.0e-4; //Tesla's -constexpr auto _mu0_ = 4.0 * _pi_ * 1.0e-7;//permeability of free space - - -class Magnetism : - public ElectricCurrent, public ElectricCharge -{ -public: - Magnetism* _magnetismPtr; - - Magnetism() - { - _magnetismPtr= nullptr; - _magnetismVar = 0.0; - countIncrease(); - } - - Magnetism(ld var) - { - _magnetismPtr= nullptr; - _magnetismVar = 0.0; - countIncrease(); - } - - - /** - * @brief copy constructor - */ - Magnetism(const Magnetism& t) - { - _magnetismPtr = t._magnetismPtr; - _magnetismVar = t._magnetismVar; - countIncrease(); - } - - /** - * #brief move constructor - */ - Magnetism(Magnetism&& t) noexcept - { - _magnetismPtr = t._magnetismPtr; - _magnetismVar = t._magnetismVar; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Magnetism& operator=(const Magnetism& t) - { - if (this != &t) - { - _magnetismPtr = t._magnetismPtr; - _magnetismVar = t._magnetismVar; - countIncrease(); - } - return *this; - } - void setMagnetismVar(ld var) { _magnetismVar = var; } - ld getMagVar() const { return _magnetismVar; } - static void show_objectCount() { std::cout << "\n magnetism object count: " - << magnetism_objectCount << std::endl; } - static int get_objectCount() { return magnetism_objectCount; } - - /// - /// Calculates the magnetic force (Lorentz force) on a charge q moving at - /// a speed v in a magnetic field of strength B where theta is the angle - /// between the directions of v and B. - /// - /// The charge in Coulombs. - /// The speed in m/s. - /// The magnetic field strength. - /// The angle theta between the directions - /// of v and B. - /// the magnetic force in newtons - static ld magneticForce(const ld q, const ld v, const ld B, const ld theta); - - /// - /// Calculates the magnetic force at a maximum angle of sin(90) which is 1. - /// - /// The q. - /// The b. - /// The v. - /// magnetic force (N) - static ld magneticForceMax(const ld q, const ld B, const ld v); - - /// - /// Calculates the charge of a particle moving at right angles to the - /// magnetic field of B Tesla's with a speed of v m/s while experiencing a - /// magnetic force of F newtons. - /// force of F Newtons. - /// - /// The force. - /// The velocity. - /// The magnetic field strength. - /// charge (C) - static ld chargeOfParticle(const ld F, const ld v, const ld B); - - /// - /// A charged particle moving through a magnetic field at an angles theta1 to - /// the field with a speed of v1 m/s experiences a magnetic force of - /// F1 N. Determine the magnetic force on an identical particle when - /// it travels through the same magnetic field with a speed of v2 m/s at - /// an angle of theta2 relative to the magnetic field. - /// - /// The velocity of particle 1. - /// The velocity of particle 2. - /// The force on particle 1. - /// The angle theta of particle 1. - /// The angle theta of particle 2. - /// force on particle 2 - static ld magneticForceOnIdenticalParticle(const ld v1, const ld v2, const ld F1, const ld theta1, const ld theta2); - - /// - /// calculates the magnetic the field strength.\n - /// B = F/(q*v*sin(theta*RADIAN)) - /// - /// The magnetic force (N). - /// The charge (C). - /// The speed (m/s). - /// The angle theta. - /// Tesla(T) - static ld magneticFieldStrength(const ld F, const ld q, const ld v, const ld theta); - - /// - /// Calculates the magnetic field strength from the centripetal motion of a - /// particle moving on a curvature of radius of r with a of mass m at a speed - /// of v with a charge of q . - /// - /// The mass. - /// The speed. - /// The charge. - /// The radius. - /// Tesla's (T) - static ld magneticFieldStrength_Fc(const ld m, const ld v, const ld q, const ld r); - - /// - /// Calculates the Magnetic field strength of a straight current carrying wire. - /// - /// The current. - /// The shortest distance to the wire. - /// magnitude of magnetic field strength - static ld magneticFieldStrength_straightCurrentCarryingWire(const ld I, const ld r); - - /// - /// Calculates the magnetic field strength center circular loop(s). - /// - /// The current. - /// The radius of loop. - /// The number of loops, default is 1. - /// magnetic field strength (T) - static ld magneticFieldStrengthCenterCircularLoop(const ld I, const ld R, const ld N); - - /// - /// Calculates the magnetic field strength inside solenoid. - /// - /// The number of loops per unit length n = N/l. - /// The current. - /// magnetic field strength inside a solenoid - static ld magneticFieldStrengthInsideSolenoid(const ld n, const ld I); - - /// - /// Calculates the magnetic field strength inside solenoid. - /// - /// The Number of loops. - /// The length. - /// The current. - /// magnetic field strength (T) - static ld magneticFieldStrengthInsideSolenoid(const ld N, const ld l, const ld I); - - /// - /// Frustrated by the small Hall voltage obtained in blood flow measurements, - /// a medical physicist decides to increase the applied magnetic field strength - /// to get a E(hall voltage) output for blood moving at v m/s in a d m-diameter - /// vessel. Calculate the magnetic field strength needed. - /// - /// The hall voltage. - /// The diameter of vessel. - /// The speed. - /// the magnetic field strength - static ld magneticFieldStrengthHallVoltage(const ld E, const ld d, const ld v); - - /// - /// Loops per unit length. - /// - /// The number of loops. - /// The length. - /// - static ld loopsPerUnitLength(const ld N, const ld l); - - /// - /// calculates the centripetal force. - /// - /// The mass. - /// The velocity. - /// The radius. - /// centripetal force - static ld centripetalForce(const ld m, const ld v, const ld r); - - /// - /// calculates the radius of the curvature of the path of a charged particle - /// with a charge of q and a mass of m moving at a speed of v perpendicular - /// to a magnetic field of strength B - /// - /// The mass. - /// The velocity. - /// The charge. - /// The magnetic field strength. - /// The angle theta, defaulted at 90. - /// radius in meters - static ld radiusCurvatureOfPath(const ld m, const ld v, const ld q, const ld B, const ld theta); - - /// - /// If a single circular loop of wire carries a current of I A and produces - /// a magnetic field at its center with a magnitude of B T, determine - /// the radius of the loop. - /// - /// The current. - /// The magnetic field strength. - /// radius of loop (m) - static ld radiusLoopOfCurrentCarryingWire(const ld I, const ld B); - - /// - /// The wire carrying I1 A to the motor of a commuter train feels an - /// attractive force per unit length of Fl N/m due to a parallel - /// wire carrying I2 A to a headlight. Calculate how far apart the two wires - /// are. - /// - /// The current first wire. - /// The current second wire. - /// The force per unit length. - /// distance between wires (m) - static ld distanceBetween2wires(const ld I1, const ld I2, const ld Fl); - - /// - /// Two power lines run parallel for a distance of l m and are separated - /// by a distance of r m. If the current in each of the two lines is I1 A and - /// I2 A and if they run in opposite directions, determine the magnitude - /// of the force each wire exerts on the other. - /// - /// The current wire 1. - /// The current wire 2. - /// The length of wires. - /// The distance between the wires. - /// magnitude of force - static ld forceMagnitude2wires(const ld I1, const ld I2, const ld l, const ld r); - - /// - /// Calculates the mass of a charged particle of charge q moving in a - /// curvature of radius r at a speed of v in a magnetic field strength of B - /// - /// The radius. - /// The charge. - /// The magnetic field strength. - /// The velocity. - /// mass of particle in kg - static ld massOfChargedParticle(const ld r, const ld q, const ld B, const ld v); - - /// - /// Calculates the velocity of a charged particle moving on a curvature of - /// radius r with a charge of q in a magnetic field strength of B having a - /// mass of m. - /// - /// The radius. - /// The charge. - /// The magnetic field strength. - /// The mass. - /// the speed of particle (m/s) - static ld velocityOfChargedParticle(const ld r, const ld q, const ld B, const ld m); - - /// - /// Calculates the Hall effect voltage (where B,v, and l are mutually - /// perpendicular) across a conductor of width l, through which charges move - /// at a speed of v through a uniform electric field. - /// - /// The electric field strength. - /// The width. - /// The speed. - /// the hall emf (V) - static ld hallEMF(const ld B, const ld l, const ld v); - - /// - /// Calculates the force on wire. - /// - /// The number of charge carriers. - /// The charge of each carrier. - /// the cross sectional area. - /// The drift velocity. - /// The length of wire. - /// The uniform magnetic field strength. - /// The angle theta between vD and B. - /// force in newtons - static ld forceOnWire(const ld n, const ld q, const ld A, const ld vD, const ld l, const ld B, const ld theta); - - /// - /// Calculates the force on a wire. - /// - /// The current(nqAvD). - /// The length of wire. - /// The magnetic field strength. - /// The angle theta. - /// force in newtons - static ld forceOnWire(const ld I, const ld l, const ld B, const ld theta); - - /// - /// Calculates the force per unit length between two parallel wires. - /// - /// The current 1. - /// The current 2. - /// The distance of separation. - /// N/m - static ld forcePerUnitLengthBetween2ParallelWires(const ld I1, const ld I2, const ld r); - - /// - /// Two long straight current-carrying wires run parallel to each other. - /// The current in one of the wires is I1 A, their separation is r (m) - /// and they repel each other with a force per unit length of Fl N/m. - /// - /// The known current. - /// The distance between wires. - /// The force per unit length. - /// unknown current in wire 2 (A) - static ld currentFromWire2ParallelRunning(const ld I1, const ld r, const ld Fl); - - /// - /// Calculates the torque on a current carrying loop of uniform magnetic - /// field. Valid for a loop of any shape. The loop carries a current of I, - /// and has N turns each of area A, and the perpendicular to the loop makes - /// an angle theta with the magnetic field B. - /// - /// The number of loops. - /// The current (A). - /// The area (m^2). - /// The magnetic field strength (T). - /// The angle between the loop and the magnetic - /// field. - /// torque (N*m) - static ld torqueOnCurrentCarryingLoop_umf(const ld N, const ld I, const ld A, const ld B, const ld theta); - - /// - /// Calculates the maximum torque on a current carrying loop of uniform magnetic - /// field. Valid for a loop of any shape. The loop carries a current of I, - /// and has N turns each of area A, with a uniform magnetic field B. The - /// angle of sin at max torque is 90 degrees which sin(90) = 1 so sin is removed - /// from this equation. - /// - /// The number of loops. - /// The current (A). - /// The area (m^2). - /// The uniform magnetic field strength (T). - /// torque (N*m) - static ld torqueMaxOnCurrentCarryingLoop_umf(const ld N, const ld I, const ld A, const ld B); - - /// - /// Calculates the current in a current carrying loop using known torque when - /// at maximum with a N number of loops each with an area of A and a uniform - /// magnetic field strength of B. - /// - /// The torque maximum. - /// The number of loops. - /// The area. - /// The magnetic filed strength. - /// current in loops (A) - static ld currentFromTorqueMax(const ld tMax, const ld N, const ld A, const ld B); - - /// - /// Calculates the current in a long straight wire that would produce a - /// magnetic field of B at a distance of r (m) from the wire - /// - /// The shortest distance to the wire. - /// The magnetic field strength. - /// current (A) - static ld currentInLongStraightWire(const ld r, const ld B); - - /// - /// You have designed and constructed a solenoid to produce a magnetic field - /// equal in magnitude to B. If your solenoid - /// has n turns and is l cm long, determine the current you must use in - /// order to obtain a magnetic field of the desired magnitude. - /// - /// The desired magnetic field strength. - /// The number of turns on the solenoid. - /// The length of the solenoid. - /// the current needed (I) - static ld currentSolenoid(const ld B, const ld n, const ld l); - - /// - /// Calculate the angle the velocity of the electron - /// makes with the magnetic field if an electron moving at v m/s - /// in a B (T) magnetic field experiences a magnetic force of F N. - /// - /// The velocity. - /// The electric field strength. - /// The force. - /// The charge, default is elementary charge of electron. - /// angle theta - static ld angleThetaOfElectronToMagneticField(const ld v, const ld B, const ld F, const ld q); - - /// - /// A velocity selector in a mass spectrometer uses a B(T) magnetic field. - /// Calculate what electric field strength is needed to select a - /// speed of v m/s. - /// - /// The velocity selected on the spectrometer. - /// The magnetic field strength. - /// The angle theta, default at sin(90) = 1. - /// electric field strength newton/coulombs (N/C) - static ld electricFieldStrength_vB(const ld v, const ld B, const ld theta); - - - - - - ~Magnetism() - { - delete _magnetismPtr; - } - - -private: - static void countIncrease() { magnetism_objectCount += 1; } - static void countDecrease() { magnetism_objectCount -= 1; } - ld _magnetismVar; - - -}; -#endif //PHYSICSFORMULA_MAGNETISM_H - -inline ld Magnetism::magneticForce(const ld q, const ld v, const ld B, const ld theta) -{ - return q*v*B*sin(theta*RADIAN);//Newtons -} - -inline ld Magnetism::magneticForceMax(const ld q, const ld B, const ld v) -{ - return q * v * B;//N -} - -inline ld Magnetism::chargeOfParticle(const ld F, const ld v, const ld B) -{ - return F / (v * B);//(C) -} - -inline ld Magnetism::magneticForceOnIdenticalParticle(const ld v1, const ld v2, const ld F1, const ld theta1, const ld theta2) -{ - return (F1 * v2 * sin(theta2 * RADIAN)) / (v1 * sin(theta1 * RADIAN));//F2 (N) -} - -inline ld Magnetism::magneticFieldStrength(const ld F, const ld q, const ld v, const ld theta) -{ - return F/(q*v*sin(theta*RADIAN));//Tesla(T) = 1N/C*m/s = 1N/A*m a newton amp meter -} - -inline ld Magnetism::magneticFieldStrength_Fc(const ld m, const ld v, const ld q, const ld r) -{ - return (m * v) / (q * r);//(T) -} - -inline ld Magnetism::magneticFieldStrength_straightCurrentCarryingWire(const ld I, const ld r) -{ - return (_mu0_ * I) / (2.0 * Pi_ * r);//(T) -} - -inline ld Magnetism::magneticFieldStrengthCenterCircularLoop(const ld I, const ld R, const ld N = 1.0) -{ - return (N * _mu0_ * I) / (2.0 * R);//(T) -} - -inline ld Magnetism::magneticFieldStrengthInsideSolenoid(const ld n, const ld I) -{ - return _mu0_ * n * I;//(T) -} - -inline ld Magnetism::magneticFieldStrengthInsideSolenoid(const ld N, const ld l, const ld I) -{ - return _mu0_ * (N / l) * I;//T -} - -inline ld Magnetism::magneticFieldStrengthHallVoltage(const ld E, const ld d, const ld v) -{ - return E / (d * v);//T -} - -inline ld Magnetism::loopsPerUnitLength(const ld N, const ld l) -{ - return N / l; -} - -inline ld Magnetism::centripetalForce(const ld m, const ld v, const ld r) -{ - return (m * (v * v)) / r; -} - -inline ld Magnetism::radiusCurvatureOfPath(const ld m, const ld v, const ld q, const ld B, const ld theta = 90) -{ - return (m * v) / (q * B * sin(theta*RADIAN));//meters -} - -inline ld Magnetism::radiusLoopOfCurrentCarryingWire(const ld I, const ld B) -{ - return (_mu0_ * I) / (2.0 * B);//m -} - -inline ld Magnetism::distanceBetween2wires(const ld I1, const ld I2, const ld Fl) -{ - return (_mu0_ * I1 * I2) / (2.0 * Pi_ * Fl);//m -} - -inline ld Magnetism::forceMagnitude2wires(const ld I1, const ld I2, const ld l, const ld r) -{ - return (_mu0_ * I1 * I2 * l) / (2.0 * Pi_ * r);//N -} - -inline ld Magnetism::massOfChargedParticle(const ld r, const ld q, const ld B, const ld v) -{ - return (r * q * B) / v;//kg -} - -inline ld Magnetism::velocityOfChargedParticle(const ld r, const ld q, const ld B, const ld m) -{ - return (r * q * B) / m; //m/s -} - -inline ld Magnetism::hallEMF(const ld B, const ld l, const ld v) -{ - return B * l * v;//(V) -} - -inline ld Magnetism::forceOnWire(const ld n, const ld q, const ld A, const ld vD, const ld l, const ld B, const ld theta) -{ - return (n*q*A*vD)*l*B*sin(theta*RADIAN);//n -} - -inline ld Magnetism::forceOnWire(const ld I, const ld l, const ld B, const ld theta) -{ - return I * l * B * sin(theta * RADIAN);//N -} - -inline ld Magnetism::forcePerUnitLengthBetween2ParallelWires(const ld I1, const ld I2, const ld r) -{ - return (_mu0_ * I1 * I2) / (2.0 * Pi_ * r); -} - -inline ld Magnetism::currentFromWire2ParallelRunning(const ld I1, const ld r, const ld Fl) -{ - return ((2.0 * Pi_ * r) / (_mu0_ * I1)) * Fl;//A -} - -inline ld Magnetism::torqueOnCurrentCarryingLoop_umf(const ld N, const ld I, const ld A, const ld B, const ld theta) -{ - return N*I*A*B*sin(theta*RADIAN);//N*m = newton meters -} - -inline ld Magnetism::torqueMaxOnCurrentCarryingLoop_umf(const ld N, const ld I, const ld A, const ld B) -{ - return N*I*(A*A)*B;//N*m = newton meter -} - -inline ld Magnetism::currentFromTorqueMax(const ld tMax, const ld N, const ld A, const ld B) -{ - return tMax / (N * A * B);//(A) -} - -inline ld Magnetism::currentInLongStraightWire(const ld r, const ld B) -{ - return (2.0 * Pi_ * r * B) / _mu0_;//(A) -} - -inline ld Magnetism::currentSolenoid(const ld B, const ld n, const ld l) -{ - return B / (_mu0_ * (n / l));// A -} - -inline ld Magnetism::angleThetaOfElectronToMagneticField(const ld v, const ld B, const ld F, const ld q = _ELECTRON_CHARGE_) -{ - return asin(F / (-q * v * B))*DEGREE;//angle theta -} - -inline ld Magnetism::electricFieldStrength_vB(const ld v, const ld B, const ld theta = 90) -{ - return v * B * sin(theta*RADIAN);//N/C -} +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_MAGNETISM_H +#define PHYSICSFORMULA_MAGNETISM_H +/** + * @class Magnetism + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @dateBuilt 3/18/2021 + * @lastEdit 3/21/2021 + */ +#include "ElectricCurrent.h" +#define Pi_ 3.14159265358979323846 +static int magnetism_objectCount = 0; +constexpr auto _GAUSS_ = 1.0e-4; //Tesla's +constexpr auto _mu0_ = 4.0 * _pi_ * 1.0e-7;//permeability of free space + + +class Magnetism : + public ElectricCurrent, public ElectricCharge +{ +public: + Magnetism* _magnetismPtr; + + Magnetism() + { + _magnetismPtr= nullptr; + _magnetismVar = 0.0; + countIncrease(); + } + + Magnetism(ld var) + { + _magnetismPtr= nullptr; + _magnetismVar = 0.0; + countIncrease(); + } + + + /** + * @brief copy constructor + */ + Magnetism(const Magnetism& t) + { + _magnetismPtr = t._magnetismPtr; + _magnetismVar = t._magnetismVar; + countIncrease(); + } + + /** + * #brief move constructor + */ + Magnetism(Magnetism&& t) noexcept + { + _magnetismPtr = t._magnetismPtr; + _magnetismVar = t._magnetismVar; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Magnetism& operator=(const Magnetism& t) + { + if (this != &t) + { + _magnetismPtr = t._magnetismPtr; + _magnetismVar = t._magnetismVar; + countIncrease(); + } + return *this; + } + void setMagnetismVar(ld var) { _magnetismVar = var; } + ld getMagVar() const { return _magnetismVar; } + static void show_objectCount() { std::cout << "\n magnetism object count: " + << magnetism_objectCount << std::endl; } + static int get_objectCount() { return magnetism_objectCount; } + + /// + /// Calculates the magnetic force (Lorentz force) on a charge q moving at + /// a speed v in a magnetic field of strength B where theta is the angle + /// between the directions of v and B. + /// + /// The charge in Coulombs. + /// The speed in m/s. + /// The magnetic field strength. + /// The angle theta between the directions + /// of v and B. + /// the magnetic force in newtons + static ld magneticForce(const ld q, const ld v, const ld B, const ld theta); + + /// + /// Calculates the magnetic force at a maximum angle of sin(90) which is 1. + /// + /// The q. + /// The b. + /// The v. + /// magnetic force (N) + static ld magneticForceMax(const ld q, const ld B, const ld v); + + /// + /// Calculates the charge of a particle moving at right angles to the + /// magnetic field of B Tesla's with a speed of v m/s while experiencing a + /// magnetic force of F newtons. + /// force of F Newtons. + /// + /// The force. + /// The velocity. + /// The magnetic field strength. + /// charge (C) + static ld chargeOfParticle(const ld F, const ld v, const ld B); + + /// + /// A charged particle moving through a magnetic field at an angles theta1 to + /// the field with a speed of v1 m/s experiences a magnetic force of + /// F1 N. Determine the magnetic force on an identical particle when + /// it travels through the same magnetic field with a speed of v2 m/s at + /// an angle of theta2 relative to the magnetic field. + /// + /// The velocity of particle 1. + /// The velocity of particle 2. + /// The force on particle 1. + /// The angle theta of particle 1. + /// The angle theta of particle 2. + /// force on particle 2 + static ld magneticForceOnIdenticalParticle(const ld v1, const ld v2, const ld F1, const ld theta1, const ld theta2); + + /// + /// calculates the magnetic the field strength.\n + /// B = F/(q*v*sin(theta*RADIAN)) + /// + /// The magnetic force (N). + /// The charge (C). + /// The speed (m/s). + /// The angle theta. + /// Tesla(T) + static ld magneticFieldStrength(const ld F, const ld q, const ld v, const ld theta); + + /// + /// Calculates the magnetic field strength from the centripetal motion of a + /// particle moving on a curvature of radius of r with a of mass m at a speed + /// of v with a charge of q . + /// + /// The mass. + /// The speed. + /// The charge. + /// The radius. + /// Tesla's (T) + static ld magneticFieldStrength_Fc(const ld m, const ld v, const ld q, const ld r); + + /// + /// Calculates the Magnetic field strength of a straight current carrying wire. + /// + /// The current. + /// The shortest distance to the wire. + /// magnitude of magnetic field strength + static ld magneticFieldStrength_straightCurrentCarryingWire(const ld I, const ld r); + + /// + /// Calculates the magnetic field strength center circular loop(s). + /// + /// The current. + /// The radius of loop. + /// The number of loops, default is 1. + /// magnetic field strength (T) + static ld magneticFieldStrengthCenterCircularLoop(const ld I, const ld R, const ld N); + + /// + /// Calculates the magnetic field strength inside solenoid. + /// + /// The number of loops per unit length n = N/l. + /// The current. + /// magnetic field strength inside a solenoid + static ld magneticFieldStrengthInsideSolenoid(const ld n, const ld I); + + /// + /// Calculates the magnetic field strength inside solenoid. + /// + /// The Number of loops. + /// The length. + /// The current. + /// magnetic field strength (T) + static ld magneticFieldStrengthInsideSolenoid(const ld N, const ld l, const ld I); + + /// + /// Frustrated by the small Hall voltage obtained in blood flow measurements, + /// a medical physicist decides to increase the applied magnetic field strength + /// to get a E(hall voltage) output for blood moving at v m/s in a d m-diameter + /// vessel. Calculate the magnetic field strength needed. + /// + /// The hall voltage. + /// The diameter of vessel. + /// The speed. + /// the magnetic field strength + static ld magneticFieldStrengthHallVoltage(const ld E, const ld d, const ld v); + + /// + /// Loops per unit length. + /// + /// The number of loops. + /// The length. + /// + static ld loopsPerUnitLength(const ld N, const ld l); + + /// + /// calculates the centripetal force. + /// + /// The mass. + /// The velocity. + /// The radius. + /// centripetal force + static ld centripetalForce(const ld m, const ld v, const ld r); + + /// + /// calculates the radius of the curvature of the path of a charged particle + /// with a charge of q and a mass of m moving at a speed of v perpendicular + /// to a magnetic field of strength B + /// + /// The mass. + /// The velocity. + /// The charge. + /// The magnetic field strength. + /// The angle theta, defaulted at 90. + /// radius in meters + static ld radiusCurvatureOfPath(const ld m, const ld v, const ld q, const ld B, const ld theta); + + /// + /// If a single circular loop of wire carries a current of I A and produces + /// a magnetic field at its center with a magnitude of B T, determine + /// the radius of the loop. + /// + /// The current. + /// The magnetic field strength. + /// radius of loop (m) + static ld radiusLoopOfCurrentCarryingWire(const ld I, const ld B); + + /// + /// The wire carrying I1 A to the motor of a commuter train feels an + /// attractive force per unit length of Fl N/m due to a parallel + /// wire carrying I2 A to a headlight. Calculate how far apart the two wires + /// are. + /// + /// The current first wire. + /// The current second wire. + /// The force per unit length. + /// distance between wires (m) + static ld distanceBetween2wires(const ld I1, const ld I2, const ld Fl); + + /// + /// Two power lines run parallel for a distance of l m and are separated + /// by a distance of r m. If the current in each of the two lines is I1 A and + /// I2 A and if they run in opposite directions, determine the magnitude + /// of the force each wire exerts on the other. + /// + /// The current wire 1. + /// The current wire 2. + /// The length of wires. + /// The distance between the wires. + /// magnitude of force + static ld forceMagnitude2wires(const ld I1, const ld I2, const ld l, const ld r); + + /// + /// Calculates the mass of a charged particle of charge q moving in a + /// curvature of radius r at a speed of v in a magnetic field strength of B + /// + /// The radius. + /// The charge. + /// The magnetic field strength. + /// The velocity. + /// mass of particle in kg + static ld massOfChargedParticle(const ld r, const ld q, const ld B, const ld v); + + /// + /// Calculates the velocity of a charged particle moving on a curvature of + /// radius r with a charge of q in a magnetic field strength of B having a + /// mass of m. + /// + /// The radius. + /// The charge. + /// The magnetic field strength. + /// The mass. + /// the speed of particle (m/s) + static ld velocityOfChargedParticle(const ld r, const ld q, const ld B, const ld m); + + /// + /// Calculates the Hall effect voltage (where B,v, and l are mutually + /// perpendicular) across a conductor of width l, through which charges move + /// at a speed of v through a uniform electric field. + /// + /// The electric field strength. + /// The width. + /// The speed. + /// the hall emf (V) + static ld hallEMF(const ld B, const ld l, const ld v); + + /// + /// Calculates the force on wire. + /// + /// The number of charge carriers. + /// The charge of each carrier. + /// the cross sectional area. + /// The drift velocity. + /// The length of wire. + /// The uniform magnetic field strength. + /// The angle theta between vD and B. + /// force in newtons + static ld forceOnWire(const ld n, const ld q, const ld A, const ld vD, const ld l, const ld B, const ld theta); + + /// + /// Calculates the force on a wire. + /// + /// The current(nqAvD). + /// The length of wire. + /// The magnetic field strength. + /// The angle theta. + /// force in newtons + static ld forceOnWire(const ld I, const ld l, const ld B, const ld theta); + + /// + /// Calculates the force per unit length between two parallel wires. + /// + /// The current 1. + /// The current 2. + /// The distance of separation. + /// N/m + static ld forcePerUnitLengthBetween2ParallelWires(const ld I1, const ld I2, const ld r); + + /// + /// Two long straight current-carrying wires run parallel to each other. + /// The current in one of the wires is I1 A, their separation is r (m) + /// and they repel each other with a force per unit length of Fl N/m. + /// + /// The known current. + /// The distance between wires. + /// The force per unit length. + /// unknown current in wire 2 (A) + static ld currentFromWire2ParallelRunning(const ld I1, const ld r, const ld Fl); + + /// + /// Calculates the torque on a current carrying loop of uniform magnetic + /// field. Valid for a loop of any shape. The loop carries a current of I, + /// and has N turns each of area A, and the perpendicular to the loop makes + /// an angle theta with the magnetic field B. + /// + /// The number of loops. + /// The current (A). + /// The area (m^2). + /// The magnetic field strength (T). + /// The angle between the loop and the magnetic + /// field. + /// torque (N*m) + static ld torqueOnCurrentCarryingLoop_umf(const ld N, const ld I, const ld A, const ld B, const ld theta); + + /// + /// Calculates the maximum torque on a current carrying loop of uniform magnetic + /// field. Valid for a loop of any shape. The loop carries a current of I, + /// and has N turns each of area A, with a uniform magnetic field B. The + /// angle of sin at max torque is 90 degrees which sin(90) = 1 so sin is removed + /// from this equation. + /// + /// The number of loops. + /// The current (A). + /// The area (m^2). + /// The uniform magnetic field strength (T). + /// torque (N*m) + static ld torqueMaxOnCurrentCarryingLoop_umf(const ld N, const ld I, const ld A, const ld B); + + /// + /// Calculates the current in a current carrying loop using known torque when + /// at maximum with a N number of loops each with an area of A and a uniform + /// magnetic field strength of B. + /// + /// The torque maximum. + /// The number of loops. + /// The area. + /// The magnetic filed strength. + /// current in loops (A) + static ld currentFromTorqueMax(const ld tMax, const ld N, const ld A, const ld B); + + /// + /// Calculates the current in a long straight wire that would produce a + /// magnetic field of B at a distance of r (m) from the wire + /// + /// The shortest distance to the wire. + /// The magnetic field strength. + /// current (A) + static ld currentInLongStraightWire(const ld r, const ld B); + + /// + /// You have designed and constructed a solenoid to produce a magnetic field + /// equal in magnitude to B. If your solenoid + /// has n turns and is l cm long, determine the current you must use in + /// order to obtain a magnetic field of the desired magnitude. + /// + /// The desired magnetic field strength. + /// The number of turns on the solenoid. + /// The length of the solenoid. + /// the current needed (I) + static ld currentSolenoid(const ld B, const ld n, const ld l); + + /// + /// Calculate the angle the velocity of the electron + /// makes with the magnetic field if an electron moving at v m/s + /// in a B (T) magnetic field experiences a magnetic force of F N. + /// + /// The velocity. + /// The electric field strength. + /// The force. + /// The charge, default is elementary charge of electron. + /// angle theta + static ld angleThetaOfElectronToMagneticField(const ld v, const ld B, const ld F, const ld q); + + /// + /// A velocity selector in a mass spectrometer uses a B(T) magnetic field. + /// Calculate what electric field strength is needed to select a + /// speed of v m/s. + /// + /// The velocity selected on the spectrometer. + /// The magnetic field strength. + /// The angle theta, default at sin(90) = 1. + /// electric field strength newton/coulombs (N/C) + static ld electricFieldStrength_vB(const ld v, const ld B, const ld theta); + + + + + + ~Magnetism() + { + delete _magnetismPtr; + } + + +private: + static void countIncrease() { magnetism_objectCount += 1; } + static void countDecrease() { magnetism_objectCount -= 1; } + ld _magnetismVar; + + +}; +#endif //PHYSICSFORMULA_MAGNETISM_H + +inline ld Magnetism::magneticForce(const ld q, const ld v, const ld B, const ld theta) +{ + return q*v*B*sin(theta*RADIAN);//Newtons +} + +inline ld Magnetism::magneticForceMax(const ld q, const ld B, const ld v) +{ + return q * v * B;//N +} + +inline ld Magnetism::chargeOfParticle(const ld F, const ld v, const ld B) +{ + return F / (v * B);//(C) +} + +inline ld Magnetism::magneticForceOnIdenticalParticle(const ld v1, const ld v2, const ld F1, const ld theta1, const ld theta2) +{ + return (F1 * v2 * sin(theta2 * RADIAN)) / (v1 * sin(theta1 * RADIAN));//F2 (N) +} + +inline ld Magnetism::magneticFieldStrength(const ld F, const ld q, const ld v, const ld theta) +{ + return F/(q*v*sin(theta*RADIAN));//Tesla(T) = 1N/C*m/s = 1N/A*m a newton amp meter +} + +inline ld Magnetism::magneticFieldStrength_Fc(const ld m, const ld v, const ld q, const ld r) +{ + return (m * v) / (q * r);//(T) +} + +inline ld Magnetism::magneticFieldStrength_straightCurrentCarryingWire(const ld I, const ld r) +{ + return (_mu0_ * I) / (2.0 * Pi_ * r);//(T) +} + +inline ld Magnetism::magneticFieldStrengthCenterCircularLoop(const ld I, const ld R, const ld N = 1.0) +{ + return (N * _mu0_ * I) / (2.0 * R);//(T) +} + +inline ld Magnetism::magneticFieldStrengthInsideSolenoid(const ld n, const ld I) +{ + return _mu0_ * n * I;//(T) +} + +inline ld Magnetism::magneticFieldStrengthInsideSolenoid(const ld N, const ld l, const ld I) +{ + return _mu0_ * (N / l) * I;//T +} + +inline ld Magnetism::magneticFieldStrengthHallVoltage(const ld E, const ld d, const ld v) +{ + return E / (d * v);//T +} + +inline ld Magnetism::loopsPerUnitLength(const ld N, const ld l) +{ + return N / l; +} + +inline ld Magnetism::centripetalForce(const ld m, const ld v, const ld r) +{ + return (m * (v * v)) / r; +} + +inline ld Magnetism::radiusCurvatureOfPath(const ld m, const ld v, const ld q, const ld B, const ld theta = 90) +{ + return (m * v) / (q * B * sin(theta*RADIAN));//meters +} + +inline ld Magnetism::radiusLoopOfCurrentCarryingWire(const ld I, const ld B) +{ + return (_mu0_ * I) / (2.0 * B);//m +} + +inline ld Magnetism::distanceBetween2wires(const ld I1, const ld I2, const ld Fl) +{ + return (_mu0_ * I1 * I2) / (2.0 * Pi_ * Fl);//m +} + +inline ld Magnetism::forceMagnitude2wires(const ld I1, const ld I2, const ld l, const ld r) +{ + return (_mu0_ * I1 * I2 * l) / (2.0 * Pi_ * r);//N +} + +inline ld Magnetism::massOfChargedParticle(const ld r, const ld q, const ld B, const ld v) +{ + return (r * q * B) / v;//kg +} + +inline ld Magnetism::velocityOfChargedParticle(const ld r, const ld q, const ld B, const ld m) +{ + return (r * q * B) / m; //m/s +} + +inline ld Magnetism::hallEMF(const ld B, const ld l, const ld v) +{ + return B * l * v;//(V) +} + +inline ld Magnetism::forceOnWire(const ld n, const ld q, const ld A, const ld vD, const ld l, const ld B, const ld theta) +{ + return (n*q*A*vD)*l*B*sin(theta*RADIAN);//n +} + +inline ld Magnetism::forceOnWire(const ld I, const ld l, const ld B, const ld theta) +{ + return I * l * B * sin(theta * RADIAN);//N +} + +inline ld Magnetism::forcePerUnitLengthBetween2ParallelWires(const ld I1, const ld I2, const ld r) +{ + return (_mu0_ * I1 * I2) / (2.0 * Pi_ * r); +} + +inline ld Magnetism::currentFromWire2ParallelRunning(const ld I1, const ld r, const ld Fl) +{ + return ((2.0 * Pi_ * r) / (_mu0_ * I1)) * Fl;//A +} + +inline ld Magnetism::torqueOnCurrentCarryingLoop_umf(const ld N, const ld I, const ld A, const ld B, const ld theta) +{ + return N*I*A*B*sin(theta*RADIAN);//N*m = newton meters +} + +inline ld Magnetism::torqueMaxOnCurrentCarryingLoop_umf(const ld N, const ld I, const ld A, const ld B) +{ + return N*I*(A*A)*B;//N*m = newton meter +} + +inline ld Magnetism::currentFromTorqueMax(const ld tMax, const ld N, const ld A, const ld B) +{ + return tMax / (N * A * B);//(A) +} + +inline ld Magnetism::currentInLongStraightWire(const ld r, const ld B) +{ + return (2.0 * Pi_ * r * B) / _mu0_;//(A) +} + +inline ld Magnetism::currentSolenoid(const ld B, const ld n, const ld l) +{ + return B / (_mu0_ * (n / l));// A +} + +inline ld Magnetism::angleThetaOfElectronToMagneticField(const ld v, const ld B, const ld F, const ld q = _ELECTRON_CHARGE_) +{ + return asin(F / (-q * v * B))*DEGREE;//angle theta +} + +inline ld Magnetism::electricFieldStrength_vB(const ld v, const ld B, const ld theta = 90) +{ + return v * B * sin(theta*RADIAN);//N/C +} diff --git a/MathFx.h b/MathFx.h index 1a03821..8c7d8cd 100644 --- a/MathFx.h +++ b/MathFx.h @@ -1,67 +1,67 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_MATHFX_H -#define PHYSICSFORMULA_MATHFX_H -typedef unsigned long long int uli; -#include -namespace rez -{ - - /// - /// Calculates the factorial of number n - /// - /// The factorial number to calculate. - /// the factorial of n - inline uli factorial(size_t n) { - if (n == 0) { - return 1; - } - uli results = 1; - for (size_t i = 2; i <= n; i++) { - results *= i; - } - return results; - } - - - /// - /// In mathematics, a combination is a selection of items from a set that has distinct members, - /// such that the order of selection does not matter - /// - /// total number of objects in the set. - /// number of choosing objects from the set. - /// number of combinations - inline uli nCr(size_t n, size_t r) { - return factorial(n) / (factorial(r) * factorial(n - r)); - } - - /// - /// In mathematics, a permutation of a set is, loosely speaking, an arrangement of its - /// members into a sequence or linear order, or if the set is already ordered, a - /// rearrangement of its elements. The word "permutation" also refers to the act or - /// process of changing the linear order of an ordered set - /// - /// total number of objects in the set. - /// subset of n or sample set - /// permutations - inline uli nPr(size_t n, size_t r) { - return factorial(n) / factorial(n - r); - } - - /// - /// Expoes the sum. - /// - /// The x. - /// - inline double expoSum(double x) { - double ans = 0; - for (int i = 0;pow(x, i) / factorial(i) > 0.001; i++) { - ans += pow(x, i) / factorial(i); - } - return ans; - } - -} -#endif //PHYSICSFORMULA_MATHFX_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_MATHFX_H +#define PHYSICSFORMULA_MATHFX_H +typedef unsigned long long int uli; +#include +namespace rez +{ + + /// + /// Calculates the factorial of number n + /// + /// The factorial number to calculate. + /// the factorial of n + inline uli factorial(size_t n) { + if (n == 0) { + return 1; + } + uli results = 1; + for (size_t i = 2; i <= n; i++) { + results *= i; + } + return results; + } + + + /// + /// In mathematics, a combination is a selection of items from a set that has distinct members, + /// such that the order of selection does not matter + /// + /// total number of objects in the set. + /// number of choosing objects from the set. + /// number of combinations + inline uli nCr(size_t n, size_t r) { + return factorial(n) / (factorial(r) * factorial(n - r)); + } + + /// + /// In mathematics, a permutation of a set is, loosely speaking, an arrangement of its + /// members into a sequence or linear order, or if the set is already ordered, a + /// rearrangement of its elements. The word "permutation" also refers to the act or + /// process of changing the linear order of an ordered set + /// + /// total number of objects in the set. + /// subset of n or sample set + /// permutations + inline uli nPr(size_t n, size_t r) { + return factorial(n) / factorial(n - r); + } + + /// + /// Expoes the sum. + /// + /// The x. + /// + inline double expoSum(double x) { + double ans = 0; + for (int i = 0;pow(x, i) / factorial(i) > 0.001; i++) { + ans += pow(x, i) / factorial(i); + } + return ans; + } + +} +#endif //PHYSICSFORMULA_MATHFX_H diff --git a/MatrixND.h b/MatrixND.h index 5ac1163..65f9760 100644 --- a/MatrixND.h +++ b/MatrixND.h @@ -1,2206 +1,2206 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_MATRIXND_H -#define PHYSICSFORMULA_MATRIXND_H -#include // for std::swap -#include -#include -#include -#include -#include -#include -#include -#include -#include "VectorND.h" -#define THRESHOLD 1e-10 -// enum class for different random_device types -enum class RandomGenerator { - MERSENNE_TWISTER, - LINEAR_CONGRUENTIAL -}; - - -using namespace std; -namespace rez { -// Matrix traits: This describes how a matrix is accessed. By -// externalizing this information into a traits class, the same code -// can be used both with native arrays and matrix classes. To use the -// default implementation of the traits class, a matrix type has to -// provide the following definitions as members: -// -// * typedef ... index_type; -// - The type used for indexing (e.g. size_t) -// * typedef ... value_type; -// - The element type of the matrix (e.g. double) -// * index_type min_row() const; -// - returns the minimal allowed row index -// * index_type max_row() const; -// - returns the maximal allowed row index -// * index_type min_column() const; -// - returns the minimal allowed column index -// * index_type max_column() const; -// - returns the maximal allowed column index -// * value_type& operator()(index_type i, index_type k) -// - returns a reference to the element i,k, where -// min_row() <= i <= max_row() -// min_column() <= k <= max_column() -// * value_type operator()(index_type i, index_type k) const -// - returns the value of element i,k -// -// Note that the functions are all inline and simple, so the compiler -// should completely optimize them away. - template - struct matrix_traits { - typedef typename MatrixType::index_type index_type; - typedef typename MatrixType::value_type value_type; - static index_type min_row(MatrixType const &A) { return A.min_row(); } - static index_type max_row(MatrixType const &A) { return A.max_row(); } - static index_type - min_column(MatrixType const &A) { return A.min_column(); } - static index_type - max_column(MatrixType const &A) { return A.max_column(); } - static value_type & - element(MatrixType &A, index_type i, index_type k) { return A(i, k); } - [[maybe_unused]] static value_type - element(MatrixType const &A, index_type i, index_type k) { - return A(i, k); - } - }; - -// specialization of the matrix traits for built-in two-dimensional -// arrays - template - struct matrix_traits { - typedef std::size_t index_type; - typedef T value_type; - static index_type min_row(T const (&)[rows][columns]) { return 0; } - static index_type max_row(T const (&)[rows][columns]) { - return rows - 1; - } - static index_type min_column(T const (&)[rows][columns]) { return 0; } - static index_type max_column(T const (&)[rows][columns]) { - return columns - 1; - } - [[maybe_unused]] static value_type &element(T (&A)[rows][columns], - index_type i, - index_type k) { return A[i][k]; } - [[maybe_unused]] static value_type element(T const (&A)[rows][columns], - index_type i, - index_type k) { return A[i][k]; } - }; - -// Swap rows i and k of a matrix A -// Note that due to the reference, both dimensions are preserved for -// built-in arrays - template - void swap_rows(MatrixType &A, - typename matrix_traits::index_type i, - typename matrix_traits::index_type k) { - matrix_traits mt; - typedef typename matrix_traits::index_type index_type; - - // check indices - assert(mt.min_row(A) <= i); - assert(i <= mt.max_row(A)); - assert(mt.min_row(A) <= k); - assert(k <= mt.max_row(A)); - for (index_type col = mt.min_column(A); col <= mt.max_column(A); ++col) - std::swap(mt.element(A, i, col), mt.element(A, k, col)); - } - -// divide row i of matrix A by v - template - void divide_row(MatrixType &A, - typename matrix_traits::index_type i, - typename matrix_traits::value_type v) { - matrix_traits mt; - typedef typename matrix_traits::index_type index_type; - assert(mt.min_row(A) <= i); - assert(i <= mt.max_row(A)); - assert(v != 0); - for (index_type col = mt.min_column(A); col <= mt.max_column(A); ++col) - mt.element(A, i, col) /= v; - } - -// in matrix A, add v times row k to row i - template - void add_multiple_row(MatrixType &A, - typename matrix_traits::index_type i, - typename matrix_traits::index_type k, - typename matrix_traits::value_type v) { - matrix_traits mt; - typedef typename matrix_traits::index_type index_type; - - assert(mt.min_row(A) <= i); - assert(i <= mt.max_row(A)); - assert(mt.min_row(A) <= k); - assert(k <= mt.max_row(A)); - for (index_type col = mt.min_column(A); col <= mt.max_column(A); ++col) - mt.element(A, i, col) += v * mt.element(A, k, col); - } - -// convert A to reduced row echelon form - template - [[maybe_unused]] void to_reduced_row_echelon_form(MatrixType &A) { - matrix_traits mt; - typedef typename matrix_traits::index_type index_type; - - index_type lead = mt.min_row(A); - - for (index_type row = mt.min_row(A); row <= mt.max_row(A); ++row) { - if (lead > mt.max_column(A)) - return; - index_type i = row; - while (mt.element(A, i, lead) == 0) { - ++i; - if (i > mt.max_row(A)) { - i = row; - ++lead; - if (lead > mt.max_column(A)) - return; - } - } - swap_rows(A, i, row); - divide_row(A, row, mt.element(A, row, lead)); - for (i = mt.min_row(A); i <= mt.max_row(A); ++i) { - if (i != row) - add_multiple_row(A, i, row, -mt.element(A, i, lead)); - } - } - } - - template - void print_matrix(MatrixType m, int rows, int cols) { - std::cout << right << setprecision(4) << std::endl; - for (size_t r = 0; r < rows; r++) { - for (size_t c = 0; c < cols; c++) { - std::cout << setw(7) << right << m[r][c] << '\t'; - } - std::cout << "\n"; - } - std::cout << std::endl; - } -} // namespace rez -//***************************************************************************** -//***************************************************************************** -template -class MatrixND -{ // turns a single index into a row and column and returns the value at that index - T getAt(int index); - // sets the value at the given index - void setAt(int index, int value); - -public: - int rows{}; // number of rows - int cols{}; // number of columns - std::vector data; // the data - - MatrixND(); // default constructor - template // constructor with arguments - explicit MatrixND(const int& r_, const int& c_, const T& first, const Args&... args); - MatrixND(int r, int c); // constructor with dimensions - MatrixND(int r, int c, int min, int max, RandomGenerator generator); // constructor with dimensions and random values - MatrixND(std::vector, int rows, int cols); // constructor with data and dimensions - MatrixND(T* data, int rows, int cols); // constructor with data and dimensions - MatrixND(T** data, int rows, int cols); // constructor with data and dimensions - MatrixND(const MatrixND& other); // copy constructor - MatrixND(MatrixND&& other) noexcept; // move constructor - MatrixND& operator=(const MatrixND& other); // copy assignment - MatrixND& operator=(MatrixND&& other) noexcept ; // move assignment - // set data and dimensions using a vector - void set(std::vector, int rows, int cols); - // set data and dimensions using a pointer - template - void set(const T& first, const Args&... args); - // set data at a specific index with a value - void setAt(int row, int col, T value); - // method to swap rows - [[maybe_unused]] void swapRows(int row1, int row2); - // method to swap columns - [[maybe_unused]] void swapCols(int col1, int col2); - // static function to generate and return a random matrix of the given size - // with values between 0 and 1 - [[maybe_unused]] static MatrixND random(int rows, int cols); - // static function to generate and return a random matrix of the given size - // with values in the given range - [[maybe_unused]] static MatrixND - random(int rows, int cols, T min, T max, bool continuous = true); - // method to test if matrix is square - [[nodiscard]] bool isSquare() const; // returns true if matrix is square - [[nodiscard]] bool isZero() const; // returns true if matrix is zero - // returns true if matrix is identity - [[maybe_unused]] [[nodiscard]] bool isIdentity() const; - // returns true if matrix is diagonal - [[maybe_unused]] [[nodiscard]] bool isDiagonal() const; - // returns true if matrix is symmetric - [[maybe_unused]] [[nodiscard]] bool isSymmetric() const; - // returns true if matrix is skew symmetric - [[maybe_unused]] [[nodiscard]] bool isSkewSymmetric() const; - // returns true if matrix is upper triangular - [[maybe_unused]] [[nodiscard]] bool isUpperTriangular() const; - // returns true if matrix is lower triangular - [[maybe_unused]] [[nodiscard]] bool isLowerTriangular() const; - // returns true if matrix is tridiagonal - [[maybe_unused]] [[nodiscard]] bool isTridiagonal() const; - //checks if the f1 - f2 close to 0 - bool closeEnough(T f1, T f2); - // prints the matrix - void print(); - // returns the transpose of the matrix - MatrixND transpose(); - // returns the inverse of the matrix - MatrixND inverse(); - // returns the determinant of the matrix - float determinant(); - // function to return the characteristic polynomial of the matrix - std::vector characteristicPolynomial(); - // method to create an identity matrix of a square matrix - [[nodiscard]] MatrixND identity(); - // method to create a identity matrix of a specified size - [[nodiscard]] static MatrixND identity(int size); - // method to create a zero matrix of a square matrix - MatrixND zero(); - static MatrixND zero(int rows, int cols); - // method to calculate the rank of a matrix - int rank(); - // method to put matrix into reduced row echelon form - MatrixND rref(); - // method to determine if matrix is in reduced row echelon form - bool isRowEchelon(); - [[nodiscard]] MatrixND dot(const MatrixND &); - MatrixND cross(const MatrixND&); - MatrixND add(const MatrixND &); - MatrixND sub(const MatrixND &); - MatrixND mult(const MatrixND &); - MatrixND mult(const T &); - // Function to add a multiple of row j to row i (in place). - void addMultiple(int i, int j, T multiple); - bool isEqual(const MatrixND &); - // method to calculate the adjoint of a matrix - MatrixND adjoint(); - [[nodiscard]] MatrixND concat(const MatrixND &); // concatenate two matrices - [[nodiscard]] MatrixND stack(const MatrixND &); // stack vertically - [[nodiscard]] MatrixND kronecker(const MatrixND &); // kronecker product - // method to vind the eignenvectors of the matrix - MatrixND eigenvectors(); // not implemented - // method to return a vector of eigenvalues of the matrix - std::vector eigenvalues(); // not implemented - // method to take the mean of the matrix - double mean(); - // method to take the standard deviation of the matrix - double std(); - // method to take the covariance of the matrix - double cov(); - // method to take the correlation of the matrix - double corr(); - // method to take the sum of the matrix elements - double sum(); - // enode from row and column to index - int index(int row, int col)const; - - int getRows()const; // returns the number of rows - int getCols()const; // returns the number of columns - // find the sub matrix of the given row and column - MatrixND subMatrix(int row, int col); - // method to return the top number of specified rows of the matrix - MatrixND topRows(int rows); - // method to return the bottom number of specified rows of the matrix - MatrixND bottomRows(int rows); - // method to return the left number of specified columns of the matrix - MatrixND leftCols(int cols); - // method to return the right number of specified columns of the matrix - MatrixND rightCols(int cols); - // method to return the top left number of specified rows and columns of the matrix - MatrixND topLeft(int rows, int cols); - // method to return the top right number of specified rows and columns of the matrix - MatrixND topRight(int rows, int cols); - // method to return the bottom left number of specified rows and columns of the matrix - MatrixND bottomLeft(int rows, int cols); - // method to return the bottom right number of specified rows and columns of the matrix - MatrixND bottomRight(int rows, int cols); - // method to return the cofactor of the matrix at the specified row and column - T cofactor(int row, int col); - // method to ruturn the colwise mean of the matrix - double colwiseMean(int col); - // method to ruturn the rowwise mean of the matrix - double rowwiseMean(int row); - // method to ruturn the colwise standard deviation of the matrix - double colwiseStd(int col); - // method to ruturn the rowwise standard deviation of the matrix - double rowwiseStd(int row); - // method to ruturn the colwise covariance of the matrix - double colwiseCov(int col); - // method to ruturn the rowwise covariance of the matrix - double rowwiseCov(int row); - // method to ruturn the colwise correlation of the matrix - double colwiseCorr(int col); - // method to ruturn the rowwise correlation of the matrix - double rowwiseCorr(int row); - // method to ruturn the colwise sum of the matrix - double colwiseSum(int col); - // method to ruturn the rowwise sum of the matrix - double rowwiseSum(int row); - // method to ruturn the colwise top number of specified rows of the matrix - MatrixND colwiseTopRows(int rows); - // method to ruturn the rowwise top number of specified rows of the matrix - MatrixND rowwiseTopRows(int rows); - // method to ruturn the colwise bottom number of specified rows of the matrix - MatrixND colwiseBottomRows(int rows); - // method to ruturn the rowwise bottom number of specified rows of the matrix - MatrixND rowwiseBottomRows(int rows); - // colwise to return a colwise vector of the matrix - std::vector colwise(int col); - // look at the data in a colwise fashion - MatrixND colwise(); - // rowwise to return a rowwise vector of the matrix - std::vector rowwise(int row); - // look at the data in a rowwise fashion - MatrixND rowwise(); - // Function to the find the row with the maximum element at the column given. - // Returns the row index. - int findRowWithMaxElement(int col, int row); - // method to return the max coefficient of the matrix - T max(); - // find row with max element - int maxRow(); - // find column with max element - int maxCol(); - // method to return the min coefficient of the matrix - T min(); - // find row with min element - int minRow(); - // find column with min element - int minCol(); - // method to return the max coefficient of a specified row of the matrix - T maxRow(int row); - // method to return the min coefficient of a specified row of the matrix - T minRow(int row); - // method to return the max coefficient of a specified column of the matrix - T maxCol(int col); - // method to return the min coefficient of a specified column of the matrix - T minCol(int col); - - - [[nodiscard]] T get(int row, int col)const; - // overload the parenthesis operator to get the value at a given row and column - T& operator()(int row, int col); - // overload the parenthesis operator to set the value at a given row and column - void operator()(int row, int col, T value); - // method to flatten the matrix into a vector - std::vector flatten(); - // method to reshape the matrix into a new matrix - MatrixND reshape(int rows, int cols); - // method to return the diagonal elements of the matrix - MatrixND diag(); - // method to return the trace of the matrix - T trace(); - // method to return the sum of the absolute values of the matrix - T sumAbs(); - // method to turn the matrix into an array - T* array(); - - - MatrixND operator+(const MatrixND &); - VectorND operator+(const VectorND &); - MatrixND operator-(const MatrixND &); - VectorND operator-(const VectorND &); - MatrixND operator*(const MatrixND &); - VectorND operator*(const VectorND &); - MatrixND operator*(const T &); - bool operator==(const MatrixND &); - -// template friend MatrixND operator+ (const MatrixND& lhs, MatrixND& rhs); -// template friend MatrixND operator+ (const U& lhs, MatrixND& rhs); -// template friend MatrixND operator+ (const MatrixND& lhs, U& rhs); -// -// template friend MatrixND operator- (const MatrixND& lhs, MatrixND& rhs); -// template friend MatrixND operator- (const U& lhs, MatrixND& rhs); -// template friend MatrixND operator- (const MatrixND& lhs, U& rhs); -// -// template friend MatrixND operator* (const MatrixND& lhs, MatrixND& rhs); -// template friend MatrixND operator* (const U& lhs, MatrixND& rhs); -// template friend MatrixND operator* (const MatrixND& lhs, const U& rhs); - - template - friend istream& operator>>(istream& is, MatrixND& m); - - template - friend ostream& operator<<(ostream& os, const MatrixND& rhs); - - ~MatrixND() = default; - -}; - - - -#endif //PHYSICSFORMULA_MATRIXND_H -/** Default Constructor - - creates an empty matrix - -*/ - -template -MatrixND::MatrixND() -{ - data.clear(); - rows = 0; - cols = 0; -} - - -template -template -MatrixND::MatrixND(const int& r_, const int& c_, const T& first, const Args & ...args) -{ - data = {first, args...}; - rows = r_; - cols = c_; - auto total = rows * cols; - -} - -template -template -inline void MatrixND::set(const T& first, const Args & ...args) -{ - data.clear(); - auto total = rows * cols; - data.push_back(first); - int dummy[] = { 0, (data.push_back(args), 0)... }; - (void)dummy; - for (const auto& i : data) - { - if (i <= total) - { - data.push_back(i); - } - } -} -template -void MatrixND::setAt(int row, int col, T value) { - if (row < rows && col < cols) { - data[row * cols + col] = value; - } -} - -template -[[maybe_unused]] void MatrixND::swapRows(int row1, int row2) { - if (row1 < rows && row2 < rows) { - for (int i = 0; i < cols; i++) { - std::swap(data[row1 * cols + i], data[row2 * cols + i]); - } - } -} -template -[[maybe_unused]] void MatrixND::swapCols(int col1, int col2) { - if (col1 < cols && col2 < cols) { - for (int i = 0; i < rows; i++) { - std::swap(data[i * cols + col1], data[i * cols + col2]); - } - } -} -template -MatrixND MatrixND::random(int rows, int cols) { - MatrixND m(rows, cols); - // seed a random number generator - std::random_device rd; - std::mt19937 gen(rd()); - std::uniform_real_distribution<> dis(0, 1); - for (int i = 0; i < rows; i++) { - for (int j = 0; j < cols; j++) { - m.setAt(i, j, dis(gen)); - } - } - return m; -} -template -MatrixND MatrixND::random(int rows, int cols, T min, T max, bool continuous) { - MatrixND m(rows, cols); - // seed a random number generator - std::random_device rd; - std::mt19937 gen(rd()); - std::uniform_real_distribution<> dis(min, max); - if (continuous) { - for (int i = 0; i < rows; i++) { - for (int j = 0; j < cols; j++) { - m.setAt(i, j, dis(gen)); - } - } - } - else { - for (int i = 0; i < rows; i++) { - for (int j = 0; j < cols; j++) { - m.setAt(i, j, round(dis(gen))); - } - } - } - return m; -} - -template -bool MatrixND::isSquare() const { - return rows == cols; -} -template -bool MatrixND::isZero() const { - for (const auto& i : data) - { - if (i != 0) - { - return false; - } - } - return true; -} - -template -[[maybe_unused]] bool MatrixND::isIdentity() const { - if (!isSquare()) - return false; - for (int i = 0; i < rows; i++) - for (int j = 0; j < cols; j++) - if (i == j && data[i * cols + j] != 1) - return false; - else if (i != j && data[i * cols + j] != 0) - return false; - return true; -} -template -bool MatrixND::isDiagonal() const { - if (!isSquare()) - return false; - for (int i = 0; i < rows; i++) - for (int j = 0; j < cols; j++) - if (i != j && data[i * cols + j] != 0) - return false; - return true; -} -template -bool MatrixND::isSymmetric() const { - if (!isSquare()) - return false; - for (int i = 0; i < rows; i++) - for (int j = 0; j < cols; j++) - if (i != j && data[i * cols + j] != data[j * cols + i]) - return false; - return true; -} -template -bool MatrixND::isSkewSymmetric() const { - if (!isSquare()) - return false; - for (int i = 0; i < rows; i++) - for (int j = 0; j < cols; j++) - if (i != j && data[i * cols + j] != -data[j * cols + i]) - return false; - return true; -} -template -bool MatrixND::isUpperTriangular() const { - if (!isSquare()) - return false; - for (int i = 0; i < rows; i++) - for (int j = 0; j < cols; j++) - if (i > j && data[i * cols + j] != 0) - return false; - return true; -} -template -bool MatrixND::isLowerTriangular() const { - if (!isSquare()) - return false; - for (int i = 0; i < rows; i++) - for (int j = 0; j < cols; j++) - if (i < j && data[i * cols + j] != 0) - return false; - return true; -} -template -bool MatrixND::isTridiagonal() const { - if (!isSquare()) - return false; - for (int i = 0; i < rows; i++) - for (int j = 0; j < cols; j++) - if (i == j && data[i * cols + j] != 0) - continue; - else if (i != j && i + 1 == j && data[i * cols + j] != 0) - continue; - else if (i != j && i - 1 == j && data[i * cols + j] != 0) - continue; - else - return false; - return true; -} - -template -bool MatrixND::closeEnough(T f1, T f2) { - return fabs(f1-f2) < 1e-9; -} - -template -inline MatrixND::MatrixND(int r, int c) -{ - rows = r; - cols = c; - data = vector(r * c); -} - -template -MatrixND::MatrixND(int r, int c, int min, int max, - RandomGenerator generator) { - rows = r; - cols = c; - data = vector(r * c); - // seed a random number generator depending on the generator - std::random_device rd; - if (generator == RandomGenerator::MERSENNE_TWISTER) { - std::mt19937 gen(rd()); - std::uniform_real_distribution<> dis(min, max); - for (int i = 0; i < rows; i++) { - for (int j = 0; j < cols; j++) { - data[i * cols + j] = dis(gen); - } - } - } - else if (generator == RandomGenerator::LINEAR_CONGRUENTIAL) { - std::minstd_rand gen(rd()); - std::uniform_real_distribution<> dis(min, max); - for (int i = 0; i < rows; i++) { - for (int j = 0; j < cols; j++) { - data[i * cols + j] = dis(gen); - } - } - } else { - // defalut to srand with time - srand(time(NULL)); - for (int i = 0; i < rows; i++) { - for (int j = 0; j < cols; j++) { - data[i * cols + j] = (T)rand() / RAND_MAX * (max - min) + min; - } - } - } -} - -/** Constructor - creates the matrix as the following: - @params elements the elements of the matrix in Row-major form - numRows the number of rows in the matrix - numCols the number of columns in the matrix -*/ -template -MatrixND::MatrixND(std::vector elm, int numRows, int numCols) -{ - rows = numRows; - cols = numCols; - data.clear(); - for(unsigned int i = 0; i < elm.size(); i++) { - data.push_back(elm[i]); - } -} - -template -MatrixND::MatrixND(T *data, int rows, int cols) -{ - this->rows = rows; - this->cols = cols; - this->data = vector(data, data + rows * cols); -} - -template -MatrixND::MatrixND(T **data, int rows, int cols) { - //use data from the 2d array - this->rows = rows; - this->cols = cols; - this->data = vector(rows * cols); - for (int i = 0; i < rows; i++) - { - for (int j = 0; j < cols; j++) - { - this->data[i * cols + j] = data[i][j]; - } - } -} - -/** set - - resets the matrix to the input - - @params elements, - the elements of the matrix in Row-major form - numRows, - the number of rows in the matrix - numCols; - the number of coumns in the matrix - @return void; nothing to return - -*/ - -template -void MatrixND::set(std::vector elements, int numRows, int numCols) -{ - rows = numRows; - cols = numCols; - data.clear(); - for(unsigned int i = 0; i < elements.size(); i++) { - data.push_back(elements[i]); - } -} - - -/** operator+ (add) - lhs + rhs; - elementwise adition of rhs to lhs - - @params rhs; the matrix to add - @return matrix; the sum - -*/ - -template -MatrixND MatrixND::operator+(const MatrixND & rhs) -{ - return this->add(rhs); -} -template -VectorND MatrixND::operator+(const VectorND & rhs) { - assert(this->cols == rhs.size() && this->rows == 1); - VectorND result(this->cols); - for (int i = 0; i < this->cols; i++) { - result.setAt(i, this->data[i] + rhs.getAt(i)); - } - return result; -} - -/** operator- (subtract) - lhs - rhs; - elementwise subtraction of rhs from lhs - - @params rhs; the matrix to subtract - @return matrix; the difference - -*/ - -template -MatrixND MatrixND::operator-(const MatrixND & rhs) -{ - return this->sub(rhs); -} -template -VectorND MatrixND::operator-(const VectorND & rhs) { - assert(this->cols == rhs.size() && this->rows == 1); - VectorND result(this->cols); - for (int i = 0; i < this->cols; i++) { - result.setAt(i, this->data[i] - rhs.getAt(i)); - } - return result; -} - -/** operator(*) Matrix multiplication - lhs * rhs; - calculate A * x = B - @params rhs; the second matrix - @return matrix; the transformed product matrix -*/ -template -MatrixND MatrixND::operator*(const MatrixND & rhs) -{ - return this->mult(rhs); -} - -/** operator* (scalar multiplication) - M * T; - calculate scalar product of a matrix - - @params rhs; the scalar; - @return matrix; the transformed product matrix - -*/ -template -MatrixND MatrixND::operator*(const T & t) -{ - return this->mult(t); -} -//template -//MatrixND operator+(const MatrixND &lhs, MatrixND &rhs) { -// int numRows = lhs.getRows(); -// int numCols = lhs.getCols(); -// int numElements = numRows * numCols; -// U *tempResult = new U[numElements]; -// for (int i=0; i result(numRows, numCols, tempResult); -// delete[] tempResult; -// return result; -//} -//template -//MatrixND operator+(const U &lhs, MatrixND &rhs) { -// int numRows = rhs.getRows(); -// int numCols = rhs.getCols(); -// int numElements = numRows * numCols; -// U *tempResult = new U[numElements]; -// for (int i=0; i result(numRows, numCols, tempResult); -// delete[] tempResult; -// return result; -//} -//template -//MatrixND operator+(const MatrixND &lhs, U &rhs) { -// int numRows = lhs.getRows(); -// int numCols = lhs.getCols(); -// int numElements = numRows * numCols; -// U *tempResult = new U[numElements]; -// for (int i=0; i result(numRows, numCols, tempResult); -// delete[] tempResult; -// return result; -//} -//template -//MatrixND operator-(const MatrixND &lhs, MatrixND &rhs) { -// int numRows = lhs.getRows(); -// int numCols = lhs.getCols(); -// int numElements = numRows * numCols; -// U *tempResult = new U[numElements]; -// for (int i=0; i result(numRows, numCols, tempResult); -// delete[] tempResult; -// return result; -//} // -//template -//MatrixND operator-(const U& lhs, MatrixND& rhs) { -// int numRows = rhs.getRows(); -// int numCols = rhs.getCols(); -// int numElements = numRows * numCols; -// U *tempResult = new U[numElements]; -// for (int i=0; i result(numRows, numCols, tempResult); -// delete[] tempResult; -// return result; -//} -//template -//MatrixND operator-(const MatrixND& lhs, U& rhs) { -// int numRows = lhs.getRows(); -// int numCols = lhs.getCols(); -// int numElements = numRows * numCols; -// U *tempResult = new U[numElements]; -// for (int i=0; i result(numRows, numCols, tempResult); -// delete[] tempResult; -// return result; -//} -//template -//MatrixND operator*(const MatrixND &lhs, MatrixND &rhs) { -// // Verify the dimensions of the inputs. -// if (lhs.getCols() != rhs.getRows()) -// throw std::invalid_argument("Number of columns in matrix must equal number of rows in vector."); -// -// // Setup the vector for the output. -// MatrixND result(lhs.getRows()); -// -// // Loop over rows and columns and perform the multiplication operation element-by-element. -// for (int row=0; row(0.0); -// for (int col=0; col -//MatrixND operator*(const U &lhs, MatrixND &rhs) { -// int numRows = rhs.getRows(); -// int numCols = rhs.getCols(); -// int numElements = numRows * numCols; -// U *tempResult = new U[numElements]; -// for (int i = 0; i < numElements; ++i) { -// tempResult[i] = lhs * rhs.getAt(i); -// } -// -// MatrixND result(tempResult, numRows, numCols); -// delete[] tempResult; -// return result; -//} -//template -//MatrixND operator*(const MatrixND &lhs, U &rhs) { -// int numRows = lhs.getRows(); -// int numCols = lhs.getCols(); -// int numElements = numRows * numCols; -// U *tempResult = new U[numElements]; -// for (int i=0; i result(tempResult, numRows, numCols); -// delete[] tempResult; -// return result; -//} -/** operator == - - elemetnwise comparison of two matrices of equal size - - @params rhs; the second matrix - @return bool; true if same size and elements all equal - -*/ -template -bool MatrixND::operator==(const MatrixND & rhs) -{ - return this->isEqual(rhs); -} - -template -inline istream& operator>>(istream& is, MatrixND& m) -{ - auto length = m.rows * m.cols; - std::cout << "enter values of the " << m.rows << " x " << m.cols << " matrix\n>>"; - for (int i = 0; i < length; i++) - { - is >> m.data[i]; - } - return is; -} - -template -std::ostream& operator<<(std::ostream& os, const MatrixND& rhs) -{ - auto total = rhs.rows * rhs.cols; - std::cout << std::setprecision(4); - for (size_t i = 0; i < total; i++) { - os << setw(6) << left << rhs.data[i] << " "; - if ((i + 1) % rhs.cols == 0) - os << std::endl; - } - return os; -} -/** - *isEqual - * - * element wise comparison of two matrices of equal size - * - *@params rhs; the second matrix - *@return bool; true if same size and elements all equal -*/ -template -bool MatrixND::isEqual(const MatrixND & rhs) -{ - if(rows != rhs.rows || cols != rhs.cols) { - return false; - } - for(unsigned int i = 0; i < data.size(); i++) { - if(data[i] != rhs.data[i]) - return false; - } - return true; -} -template -MatrixND MatrixND::adjoint() { - MatrixND result(rows, cols); - for (int i = 0; i < rows; i++) { - for (int j = 0; j < cols; j++) { - result.setAt(i, j, cofactor(i, j)); - } - } - // finding any -0 and replacing it with 0 - for (int i = 0; i < result.rows; i++) { - for (int j = 0; j < result.cols; j++) { - if (result.get(i, j) == -0) { - result.setAt(i, j, 0); - } - } - } - return result.transpose(); -} -/** add - elementwise adition of rhs to lhs - @params rhs; the matrix to add - @return matrix; the sum -*/ -template -MatrixND MatrixND::add(const MatrixND & rhs) -{ - if(rows != rhs.rows || cols != rhs.cols) { - MatrixND matrix; - return matrix; - } - std::vector vec; - for(unsigned int i = 0; i < data.size(); i++) { - vec.push_back(data[i] + rhs.data[i]); - } - return MatrixND(vec,rows,cols); -} - -template -MatrixND MatrixND::dot(const MatrixND & rhs) -{ - if(rows != rhs.rows && cols != rhs.cols) { - std::cout << "Error! Can not resolve dot product on these matrices!" - << std::endl; - return *this; - } - - std::vector vec(this->cols); - MatrixND result(vec, 1, rhs.cols); - T sum = 0; - for(int i = 0; i < rows; i++) { - for(int j = 0; j < rhs.cols; j++) { - sum += data[j * this->cols + i] * rhs.data[j * this->cols + i]; - } - result.data[i] = sum; - sum = 0; - } - - return result; -} - -template -MatrixND MatrixND::cross(const MatrixND& rhs) -{ - assert(this->rows == 3 && this->cols == 3 && rhs.rows == 3 && rhs.cols == 3); - T a, b, c, d, e, f, g, h, i; - a = b = c = d = e = f = g = h = i = 0.0; - a = this->data[3] * rhs.data[6] - this->data[6] * rhs.data[3]; - b = this->data[4] * rhs.data[7] - this->data[7] * rhs.data[4]; - c = this->data[5] * rhs.data[8] - this->data[8] * rhs.data[5]; - d = this->data[6] * rhs.data[0] - this->data[0] * rhs.data[6]; - e = this->data[7] * rhs.data[1] - this->data[1] * rhs.data[7]; - f = this->data[8] * rhs.data[2] - this->data[2] * rhs.data[8]; - g = this->data[0] * rhs.data[3] - this->data[3] * rhs.data[0]; - h = this->data[1] * rhs.data[4] - this->data[4] * rhs.data[1]; - i = this->data[2] * rhs.data[5] - this->data[5] * rhs.data[2]; - MatrixND result(3, 3, a, b, c, d, e, f, g, h, i); - return result; -} - -template -MatrixND MatrixND::mult(const MatrixND & rhs) -{ - assert(this->cols == rhs.rows); - std::vector d(this->rows*rhs.cols); - MatrixND result(d, this->rows, rhs.cols); - for (int i = 0; i < this->rows; i++) { - for (int j = 0; j < rhs.cols; j++) { - T sum = 0; - for (int k = 0; k < rhs.rows; k++) { - sum += data[i * this->cols + k] * rhs.data[k * rhs.cols + j]; - result.data[i * this->rows + j] = sum; - } - } - } - return result; -} - -/** multiplication (scalar) - - calculate scalar product of a matrix - - @params rhs; the scalar; - @return matrix; the transformed product matrix - -*/ -template -MatrixND MatrixND::mult(const T & scalar) -{ - std::vector vec; - for(unsigned int i = 0; i < data.size(); i++) { - vec.push_back(data[i] * scalar); - } - return MatrixND(vec,rows,cols); -} - -template -void MatrixND::addMultiple(int i, int j, T multiple) { - for (int k=0; k -MatrixND MatrixND::sub(const MatrixND & rhs) -{ - if(rows != rhs.rows || cols != rhs.cols) { - MatrixND matrix; - return matrix; - } - - std::vector vec; - for(unsigned int i = 0; i < data.size(); i++) { - vec.push_back(data[i] - rhs.data[i]); - } - - return MatrixND(vec,rows,cols); -} - -template -void MatrixND::print() -{ - // print out in a nice format using setw and setprecision - std::cout << std::endl << std::setprecision(4); - for(unsigned int i = 0; i < data.size(); i++) { - std::cout << std::setw(6) << left << data[i] << " "; - if(i % cols == cols - 1) { - std::cout << std::endl; - } - } -} - - -/** transpose - - Calculate transpose of matrix - - @return matrix; the transpose of this matrix - -*/ - -template -MatrixND MatrixND::transpose() -{ - std::vector vec; - for(int i = 0; i < cols; i++) { - for(int j = 0; j < rows; j++) { - vec.push_back(data[j * cols + i]); - } - } - - return MatrixND(vec,cols,rows); -} - -/** Inverse - * calculate the inverse of a matrix - * @return matrix; the inverse of this matrix - */ - template - MatrixND MatrixND::inverse() - { - if (rows != cols) { - MatrixND matrix; - return matrix; - } - MatrixND result(rows, cols); - T det = this->determinant(); - if(det == 0) { - std::cout << "Matrix is not invertible" << std::endl; - return result; - } - // calculate the adjoint matrix - MatrixND inv(rows, cols); - MatrixND adj = this->adjoint(); - // finding the inverse by dividing the adjoint matrix by the determinant - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - inv.data[i * cols + j] = adj.data[i * cols + j] / det; - } - } - return inv; - } - - /** determinant - * calculate the determinant of a matrix - * @ return T; the determinant of this matrix * - */ - template - float MatrixND::determinant() - { -// Check if the matrix is square. - if (!isSquare()) { - return -999999; - } - - // If the matrix is 2x2, we can just compute the determinant directly. - T determinant; - if (rows == 2) - { - determinant = (data[0] * data[3]) - (data[1] * data[2]); - } - else - { - /* Otherwise we extract the sub-matrices and then recursively call this function - until we get to 2x2 matrices. */ - - // We will find the sub-matrices for row 0. - // So, loop over each column. - T cumulativeSum = 0.0; - T sign = 1.0; - for (int j = 0; j < cols; ++j) - { - // And find the sub-matrix for each element. - MatrixND subMatrix = this->subMatrix(0, j); - - /* Cumulatively multiply the determinant of the sub-matrix by the - current element of this matrix and the sign variable (note the - recursive calling of the Determinant() method). */ - cumulativeSum += this->get(0, j) * subMatrix.determinant() * sign; - sign = -sign; - } - determinant = cumulativeSum; - } - - return determinant; - } -// NOT WORKING NEEDS TO BE FIXED -template -std::vector MatrixND::characteristicPolynomial() { - std::vector poly; - MatrixND adj = this->adjoint(); - MatrixND inv = this->inverse(); - MatrixND adjInv = adj * inv; - for (int i = 0; i < rows; i++) { - for (int j = 0; j < cols; j++) { - poly.push_back(adjInv.data[i * cols + j]); - } - } - return poly; -} - -template -MatrixND MatrixND::identity() { - if (rows != cols) { - MatrixND matrix; - return matrix; - } - std::vector vec(rows*cols); - MatrixND results(vec, rows, cols); - for (int i = 0; i < rows; i++) { - results.data[i * cols + i] = 1; - } - return results; -} - -template -MatrixND MatrixND::identity(int size) { - std::vector vec(size*size); - MatrixND results(vec, size, size); - for (int i = 0; i < size; i++) { - results.data[i * size + i] = 1; - } - return results; -} - -template -MatrixND MatrixND::zero() { - __assert(isSquare(), "Matrix is not square!"); - std::vector vec(rows*cols); - MatrixND results(vec, rows, cols); - return results; -} -template -MatrixND MatrixND::zero(int rows, int cols) { - std::vector vec(rows*cols); - MatrixND results(vec, rows, cols); - return results; -} - -template -int MatrixND::rank() { - // Convert the matrix to row-echelon form. - MatrixND matrixCopy = this->rref(); - - /* If this didn't work, then we compute the rank by finding - the largest non-zero sub-matrix with a non-zero determinant. - - Note that this method is slower for large matrices and therefore - it is better to use the RowEchelon method if possible. */ - int numNonZeroRows = 0; - if (!matrixCopy.isRowEchelon()) - { - // Setup a std::vector to store the sub-matrices as we go. - std::vector> subMatrixVector; - - // Store the current matrix into the array first. - subMatrixVector.push_back(*this); - - /* Loop through the subMatrixVector until either we have tested every - sub-matrix or the completeFlag is set. */ - bool completeFlag = false; - int subMatrixCount = 0; - while ((subMatrixCount < subMatrixVector.size()) && (!completeFlag)) - { - // Extract the currentMatrix to work with. - MatrixND currentMatrix = subMatrixVector[subMatrixCount]; - subMatrixCount++; - - // Test if this matrix is non-zero. - if (!currentMatrix.isZero()) - { - // If the determinant is non-zero, then we have our result. - T currentMatrixDet = currentMatrix.determinant(); - if (!closeEnough(currentMatrixDet, 0.0)) - { - completeFlag = true; - numNonZeroRows = currentMatrix.getRows(); - } - else - { - // Extract and store each sub-matrix (if larger than 2x2). - if ((currentMatrix.getRows() > 2) && (currentMatrix.getCols() > 2)) - { - for (int i=0; i 0) - numNonZeroRows++; - } - - } - // The rank of the matrix is simply the number of non-zero rows. - return numNonZeroRows; -} - -template -MatrixND MatrixND::rref() { - // Convert the matrix to row-echelon form. - MatrixND matrixCopy = *this; - int nRows = matrixCopy.getRows(); - int nCols = matrixCopy.getCols(); - T A[nRows][nCols]; - for (int r = 0; r < nRows; r++) - for (int c = 0; c < nCols; c++) - A[r][c] = matrixCopy.get(r,c); - - // Loop over each row and test whether it has at least one non-zero element. - for (int i=0; i result(nRows, nCols); - for (int i = 0; i < rows; ++i) { - for (int j = 0; j < cols; ++j) { - // fill the result matrix - // check if the element is within the tolerance - if (closeEnough(A[i][j], 0.0)) - result(i,j) = 0.0; - else - result(i,j) = A[i][j]; - - } - } - return result; -} - -template -bool MatrixND::isRowEchelon() { - MatrixND rref = this->rref(); - for (int i = 0; i < rows; i++) { - for (int j = 0; j < cols; j++) { - if (i > j && rref.data[i * cols + j] != 0) { - return false; - } - } - } - return true; -} -/** Concat - append two matrices of equal row count - @params rhs; the matrix to concatanate - @return matrix; the contanated matrix - -*/ -template -MatrixND MatrixND::concat(const MatrixND & rhs) -{ - - if(rows != rhs.rows) - return MatrixND(*this); - - std::vector vec; - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - vec.push_back(data[i*cols + j]); - } - for(int j = 0; j < rhs.cols; j++) { - vec.push_back(rhs.data[i*rhs.cols + j]); - } - } - - return MatrixND(vec,rows,cols+rhs.cols); -} - -/** stack - append two matrices of equal column count - @params rhs; the matrix to stack below - @return matrix; the lhs stacked ontop of rhs matrix -*/ - -template -MatrixND MatrixND::stack(const MatrixND & rhs) -{ - if(cols != rhs.cols) - return MatrixND(*this); - - std::vector vec; - - for(unsigned int i = 0; i < data.size(); i++) { - vec.push_back(data[i]); - } - for(unsigned int i = 0; i < rhs.data.size(); i++) { - vec.push_back(rhs.data[i]); - } - - return MatrixND(vec,rows+rhs.rows,cols); -} - -/** Kronecker - https://en.wikipedia.org/wiki/Kronecker_product - calculate kroncker product of two matrices - - @params rhs; the matrix operand - @return matrix; the Kronecker product matrix - -*/ -template -MatrixND MatrixND::kronecker(const MatrixND & rhs) -{ - std::vector vec; - - for(int i = 0; i < (rows*cols*rhs.rows*rhs.cols); i++) { - int j = (i/rhs.cols)%cols + (i/(cols*rhs.rows*rhs.cols))*cols; //iterate lhs in proper order - int k = (i%rhs.cols) + ((i / (cols * rhs.cols))%rhs.rows)*rhs.cols; //iterate rhs in proper order - //can use scalar multiplactions, matrix concat and stacking, but this is a single iteration through the vector. - //Kronecker iterates both matrices in a pattern relative to the large product matrix. - //std::cout << i << " : " << j << " : " << k << std::endl; - //std::cout << i << " : " << j << " : " << k << " : " << l << std::endl; - vec.push_back(data[j]*rhs.data[k]); - } - - return MatrixND(vec,rows*rhs.rows,cols*rhs.cols); -} -template -MatrixND MatrixND::eigenvectors() { - -} -template -std::vector MatrixND::eigenvalues() { - if(rows != cols) - return std::vector(); - MatrixND A = *this; - std::vector eigenvalues; - for(int i = 0; i < rows; i++) { - eigenvalues.push_back(A.data[i*cols + i]); - } - return eigenvalues; -} - -/** - * get the number of rows in the matrix - * @tparam T - * @return - */ -template -int MatrixND::getRows()const -{ - return rows; -} -/** - * get the number of columns in the matrix - * @tparam T - * @return - */ -template -int MatrixND::getCols()const -{ - return cols; -} - -template -MatrixND MatrixND::subMatrix(int row, int col) { - // Create a new matrix to store the sub-matrix. - // Note that this is one row and one column smaller than the original. - MatrixND subMatrix(rows-1, cols-1); - - // Loop over the elements of the existing matrix and copy to sub-matrix as appropriate. - int count = 0; - for (int i=0; i -T MatrixND::getAt(int index) { - if (index < 0 || index >= data.size()) { - return 0; - } - return data[index]; -} -template -void MatrixND::setAt(int index, int value) { - data[index] = value; -} - -/** - * get the element at the specified row and column - * @param row - * @param col - * @return T : the element at the specified row and column - */ -template -T MatrixND::get(int row, int col)const -{ - return data[row*cols + col]; -} -/** - * multiply the matrix by the vector - * @tparam T - * @return VectorND : the vector multiplied by the matrix - */ -template -VectorND MatrixND::operator*(const VectorND & v) { - assert(this->cols == v.getSize()); - std::vector vec; - for(int i = 0; i < rows; i++) { - T sum = 0; - for(int j = 0; j < cols; j++) { - sum += data[i*cols + j] * v.get(j); - } - vec.push_back(sum); - } - return VectorND(vec,rows); -} - -template -MatrixND::MatrixND(MatrixND &&other) noexcept { - data = std::move(other.data); - rows = other.rows; - cols = other.cols; -} - -template -MatrixND::MatrixND(const MatrixND &other) { - data = other.data; - rows = other.rows; - cols = other.cols; -} - -template -MatrixND &MatrixND::operator=(const MatrixND &other) { - data = other.data; - rows = other.rows; - cols = other.cols; - return *this; -} - -template -MatrixND &MatrixND::operator=(MatrixND &&other) noexcept { - data = std::move(other.data); - rows = other.rows; - cols = other.cols; - return *this; -} - -template -T &MatrixND::operator()(int row, int col) { - return data[row*cols + col]; -} - -template -void MatrixND::operator()(int row, int col, T value) { - data[row*cols + col] = value; -} - -template -MatrixND MatrixND::topRows(int rows) { - MatrixND m(rows,cols); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - m(i,j) = this->operator()(i,j); - } - } - return m; -} - -template -MatrixND MatrixND::bottomRows(int rows) { - MatrixND m(rows,cols); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - m(i,j) = this->operator()(rows-i-1,j); - } - } - return m; -} - -template -MatrixND MatrixND::leftCols(int cols) { - MatrixND m(rows,cols); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - m(i,j) = this->operator()(i,j); - } - } - return m; -} - -template -MatrixND MatrixND::rightCols(int cols) { - MatrixND m(rows,cols); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - m(i,j) = this->operator()(i,cols-j-1); - } - } - return m; -} - -template -double MatrixND::mean() { - double sum = 0; - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - sum += data[i*cols + j]; - } - } - return sum/(rows*cols); -} - -template -double MatrixND::std() { - double mean = this->mean(); - double sum = 0; - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - sum += pow(data[i*cols + j] - mean,2); - } - } - return sqrt(sum/(rows*cols)); -} - -template -double MatrixND::cov() { - double mean = this->mean(); - double sum = 0; - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - sum += (data[i*cols + j] - mean)*(data[i*cols + j] - mean); - } - } - return sum/(rows*cols); -} - -template -double MatrixND::corr() { - double cov = this->cov(); - double std = this->std(); - return cov/(std*std); -} - -template -double MatrixND::sum() { - double sum = 0; - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - sum += data[i*cols + j]; - } - } - return sum; -} - -template -int MatrixND::index(int row, int col) const { - if (row < 0 || row >= rows || col < 0 || col >= cols) { - return -1; - } - return row*cols + col; -} -template -vector MatrixND::flatten() { - vector vec; - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - vec.push_back(data[i*cols + j]); - } - } - return vec; -} - -template -MatrixND MatrixND::reshape(int rows, int cols) { - MatrixND m(rows,cols); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - m(i,j) = this->operator()(i,j); - } - } - return m; -} - -template -MatrixND MatrixND::diag() { - MatrixND m(rows,cols); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - if(i == j) { - m(i,j) = this->operator()(i,j); - } - } - } - return m; -} - -template -T MatrixND::trace() { - T sum = 0; - for(int i = 0; i < rows; i++) { - sum += this->operator()(i,i); - } - return sum; -} - -template -T MatrixND::sumAbs() { - T sum = 0; - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - sum += abs(data[i*cols + j]); - } - } - return sum; -} - -template -T *MatrixND::array() { - return data.data(); -} - -template -MatrixND MatrixND::topLeft(int rows, int cols) { - MatrixND m(rows,cols); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - m(i,j) = this->operator()(i,j); - } - } - return m; -} - -template -MatrixND MatrixND::topRight(int rows, int cols) { - MatrixND m(rows,cols); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - m(i,j) = this->operator()(i,cols-j-1); - } - } - return m; -} - -template -MatrixND MatrixND::bottomLeft(int rows, int cols) { - MatrixND m(rows,cols); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - m(i,j) = this->operator()(rows-i-1,j); - } - } - return m; -} - -template -MatrixND MatrixND::bottomRight(int rows, int cols) { - MatrixND m(rows,cols); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - m(i,j) = this->operator()(rows-i-1,cols-j-1); - } - } - return m; -} -template -T MatrixND::cofactor(int row, int col) { - MatrixND m(rows-1,cols-1); - for(int i = 0; i < rows-1; i++) { - for(int j = 0; j < cols-1; j++) { - if(i < row && j < col) { - m(i,j) = this->operator()(i,j); - } - else if(i < row && j >= col) { - m(i,j) = this->operator()(i,j+1); - } - else if(i >= row && j < col) { - m(i,j) = this->operator()(i+1,j); - } - else { - m(i,j) = this->operator()(i+1,j+1); - } - } - } - return m.determinant()*pow(-1,row+col); -} -template -double MatrixND::colwiseMean(int col) { - double sum = 0; - for(int i = 0; i < rows; i++) { - sum += data[i*cols + col]; - } - return sum/(rows); -} - -template -double MatrixND::rowwiseMean(int row) { - double sum = 0; - for(int i = 0; i < cols; i++) { - sum += data[row*cols + i]; - } - return sum/(cols); -} - -template -double MatrixND::colwiseStd(int col) { - double mean = this->colwiseMean(col); - double sum = 0; - for(int i = 0; i < rows; i++) { - sum += pow(data[i*cols + col] - mean,2); - } - return sqrt(sum/(rows)); -} - -template -double MatrixND::rowwiseStd(int row) { - double mean = this->rowwiseMean(row); - double sum = 0; - for(int i = 0; i < cols; i++) { - sum += pow(data[row*cols + i] - mean,2); - } - return sqrt(sum/(cols)); -} - - -template -double MatrixND::colwiseCov(int col) { - double mean = this->colwiseMean(col); - double sum = 0; - for(int i = 0; i < rows; i++) { - sum += (data[i*cols + col] - mean)*(data[i*cols + col] - mean); - } - return sum/(rows); -} - -template -double MatrixND::rowwiseCov(int row) { - double mean = this->rowwiseMean(row); - double sum = 0; - for(int i = 0; i < cols; i++) { - sum += (data[row*cols + i] - mean)*(data[row*cols + i] - mean); - } - return sum/(cols); -} - -template -double MatrixND::colwiseCorr(int col) { - double cov = this->colwiseCov(col); - double std = this->colwiseStd(col); - return cov/(std*std); -} - -template -double MatrixND::rowwiseCorr(int row) { - double cov = this->rowwiseCov(row); - double std = this->rowwiseStd(row); - return cov/(std*std); -} - -template -double MatrixND::colwiseSum(int col) { - double sum = 0; - for(int i = 0; i < rows; i++) { - sum += data[i*cols + col]; - } - return sum; -} - -template -double MatrixND::rowwiseSum(int row) { - double sum = 0; - for(int i = 0; i < cols; i++) { - sum += data[row*cols + i]; - } - return sum; -} - -template -MatrixND MatrixND::rowwiseTopRows(int rows) { - MatrixND m(rows,cols); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - m(i,j) = this->operator()(i,j); - } - } - return m; -} - -template -MatrixND MatrixND::colwiseTopRows(int rows) { - MatrixND m(rows,cols); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - m(i,j) = this->operator()(j,i); - } - } - return m; -} - -template -MatrixND MatrixND::colwiseBottomRows(int rows) { - MatrixND m(rows,cols); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - m(i,j) = this->operator()(cols-j-1,i); - } - } - return m; -} - -template -MatrixND MatrixND::rowwiseBottomRows(int rows) { - MatrixND m(rows,cols); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - m(i,j) = this->operator()(rows-i-1,j); - } - } - return m; -} - -template -vector MatrixND::colwise(int col) { - vector v(rows); - for(int i = 0; i < rows; i++) { - v[i] = data[i*cols + col]; - } - return v; -} - -template -vector MatrixND::rowwise(int row) { - vector v(cols); - for(int i = 0; i < cols; i++) { - v[i] = data[row*cols + i]; - } - return v; -} -template -int MatrixND::findRowWithMaxElement(int col, int row) { - T tempValue = data[get(row, col)]; - int rowIndex = row; - for (int k=row+1; k fabs(tempValue)) - { - rowIndex = k; - tempValue = data[get(k, col)]; - } - } - return rowIndex; -} - -template -T MatrixND::max() { - T max = data[0]; - for(int i = 0; i < rows*cols; i++) { - if(data[i] > max) { - max = data[i]; - } - } - return max; -} -template -int MatrixND::maxRow() { - T max = data[0]; - int row = 0; - for(int i = 0; i < rows*cols; i++) { - if(data[i] > max) { - max = data[i]; - row = i/cols; - } - } - return row; -} -template -int MatrixND::maxCol() { - T max = data[0]; - int col = 0; - for(int i = 0; i < rows*cols; i++) { - if(data[i] > max) { - max = data[i]; - col = i%cols; - } - } - return col; -} -template -T MatrixND::min() { - T min = data[0]; - for(int i = 0; i < rows*cols; i++) { - if(data[i] < min) { - min = data[i]; - } - } - return min; -} -template -int MatrixND::minRow() { - T min = data[0]; - int row = 0; - for(int i = 0; i < rows*cols; i++) { - if(data[i] < min) { - min = data[i]; - row = i/cols; - } - } - return row; -} -template -int MatrixND::minCol() { - T min = data[0]; - int col = 0; - for(int i = 0; i < rows*cols; i++) { - if(data[i] < min) { - min = data[i]; - col = i%cols; - } - } - return col; -} - -template -T MatrixND::maxRow(int row) { - T max = data[row*cols]; - for(int i = 0; i < cols; i++) { - if(data[row*cols + i] > max) { - max = data[row*cols + i]; - } - } - return max; -} - -template -T MatrixND::minRow(int row) { - T min = data[row*cols]; - for(int i = 0; i < cols; i++) { - if(data[row*cols + i] < min) { - min = data[row*cols + i]; - } - } - return min; -} - -template -T MatrixND::maxCol(int col) { - T max = data[col]; - for(int i = 0; i < rows; i++) { - if(data[i*cols + col] > max) { - max = data[i*cols + col]; - } - } - return max; -} - -template -T MatrixND::minCol(int col) { - T min = data[col]; - for(int i = 0; i < rows; i++) { - if(data[i*cols + col] < min) { - min = data[i*cols + col]; - } - } - return min; -} -template -MatrixND MatrixND::rowwise() { - MatrixND m(rows,cols); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - m(i,j) = this->operator()(i,j); - } - } - return m; -} - -template -MatrixND MatrixND::colwise() { - MatrixND m(rows,1); - for(int i = 0; i < rows; i++) { - for(int j = 0; j < cols; j++) { - m(i,0) = data[i*cols + j]; - } - } - return m; -} - +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_MATRIXND_H +#define PHYSICSFORMULA_MATRIXND_H +#include // for std::swap +#include +#include +#include +#include +#include +#include +#include +#include +#include "VectorND.h" +#define THRESHOLD 1e-10 +// enum class for different random_device types +enum class RandomGenerator { + MERSENNE_TWISTER, + LINEAR_CONGRUENTIAL +}; + + +using namespace std; +namespace rez { +// Matrix traits: This describes how a matrix is accessed. By +// externalizing this information into a traits class, the same code +// can be used both with native arrays and matrix classes. To use the +// default implementation of the traits class, a matrix type has to +// provide the following definitions as members: +// +// * typedef ... index_type; +// - The type used for indexing (e.g. size_t) +// * typedef ... value_type; +// - The element type of the matrix (e.g. double) +// * index_type min_row() const; +// - returns the minimal allowed row index +// * index_type max_row() const; +// - returns the maximal allowed row index +// * index_type min_column() const; +// - returns the minimal allowed column index +// * index_type max_column() const; +// - returns the maximal allowed column index +// * value_type& operator()(index_type i, index_type k) +// - returns a reference to the element i,k, where +// min_row() <= i <= max_row() +// min_column() <= k <= max_column() +// * value_type operator()(index_type i, index_type k) const +// - returns the value of element i,k +// +// Note that the functions are all inline and simple, so the compiler +// should completely optimize them away. + template + struct matrix_traits { + typedef typename MatrixType::index_type index_type; + typedef typename MatrixType::value_type value_type; + static index_type min_row(MatrixType const &A) { return A.min_row(); } + static index_type max_row(MatrixType const &A) { return A.max_row(); } + static index_type + min_column(MatrixType const &A) { return A.min_column(); } + static index_type + max_column(MatrixType const &A) { return A.max_column(); } + static value_type & + element(MatrixType &A, index_type i, index_type k) { return A(i, k); } + [[maybe_unused]] static value_type + element(MatrixType const &A, index_type i, index_type k) { + return A(i, k); + } + }; + +// specialization of the matrix traits for built-in two-dimensional +// arrays + template + struct matrix_traits { + typedef std::size_t index_type; + typedef T value_type; + static index_type min_row(T const (&)[rows][columns]) { return 0; } + static index_type max_row(T const (&)[rows][columns]) { + return rows - 1; + } + static index_type min_column(T const (&)[rows][columns]) { return 0; } + static index_type max_column(T const (&)[rows][columns]) { + return columns - 1; + } + [[maybe_unused]] static value_type &element(T (&A)[rows][columns], + index_type i, + index_type k) { return A[i][k]; } + [[maybe_unused]] static value_type element(T const (&A)[rows][columns], + index_type i, + index_type k) { return A[i][k]; } + }; + +// Swap rows i and k of a matrix A +// Note that due to the reference, both dimensions are preserved for +// built-in arrays + template + void swap_rows(MatrixType &A, + typename matrix_traits::index_type i, + typename matrix_traits::index_type k) { + matrix_traits mt; + typedef typename matrix_traits::index_type index_type; + + // check indices + assert(mt.min_row(A) <= i); + assert(i <= mt.max_row(A)); + assert(mt.min_row(A) <= k); + assert(k <= mt.max_row(A)); + for (index_type col = mt.min_column(A); col <= mt.max_column(A); ++col) + std::swap(mt.element(A, i, col), mt.element(A, k, col)); + } + +// divide row i of matrix A by v + template + void divide_row(MatrixType &A, + typename matrix_traits::index_type i, + typename matrix_traits::value_type v) { + matrix_traits mt; + typedef typename matrix_traits::index_type index_type; + assert(mt.min_row(A) <= i); + assert(i <= mt.max_row(A)); + assert(v != 0); + for (index_type col = mt.min_column(A); col <= mt.max_column(A); ++col) + mt.element(A, i, col) /= v; + } + +// in matrix A, add v times row k to row i + template + void add_multiple_row(MatrixType &A, + typename matrix_traits::index_type i, + typename matrix_traits::index_type k, + typename matrix_traits::value_type v) { + matrix_traits mt; + typedef typename matrix_traits::index_type index_type; + + assert(mt.min_row(A) <= i); + assert(i <= mt.max_row(A)); + assert(mt.min_row(A) <= k); + assert(k <= mt.max_row(A)); + for (index_type col = mt.min_column(A); col <= mt.max_column(A); ++col) + mt.element(A, i, col) += v * mt.element(A, k, col); + } + +// convert A to reduced row echelon form + template + [[maybe_unused]] void to_reduced_row_echelon_form(MatrixType &A) { + matrix_traits mt; + typedef typename matrix_traits::index_type index_type; + + index_type lead = mt.min_row(A); + + for (index_type row = mt.min_row(A); row <= mt.max_row(A); ++row) { + if (lead > mt.max_column(A)) + return; + index_type i = row; + while (mt.element(A, i, lead) == 0) { + ++i; + if (i > mt.max_row(A)) { + i = row; + ++lead; + if (lead > mt.max_column(A)) + return; + } + } + swap_rows(A, i, row); + divide_row(A, row, mt.element(A, row, lead)); + for (i = mt.min_row(A); i <= mt.max_row(A); ++i) { + if (i != row) + add_multiple_row(A, i, row, -mt.element(A, i, lead)); + } + } + } + + template + void print_matrix(MatrixType m, int rows, int cols) { + std::cout << right << setprecision(4) << std::endl; + for (size_t r = 0; r < rows; r++) { + for (size_t c = 0; c < cols; c++) { + std::cout << setw(7) << right << m[r][c] << '\t'; + } + std::cout << "\n"; + } + std::cout << std::endl; + } +} // namespace rez +//***************************************************************************** +//***************************************************************************** +template +class MatrixND +{ // turns a single index into a row and column and returns the value at that index + T getAt(int index); + // sets the value at the given index + void setAt(int index, int value); + +public: + int rows{}; // number of rows + int cols{}; // number of columns + std::vector data; // the data + + MatrixND(); // default constructor + template // constructor with arguments + explicit MatrixND(const int& r_, const int& c_, const T& first, const Args&... args); + MatrixND(int r, int c); // constructor with dimensions + MatrixND(int r, int c, int min, int max, RandomGenerator generator); // constructor with dimensions and random values + MatrixND(std::vector, int rows, int cols); // constructor with data and dimensions + MatrixND(T* data, int rows, int cols); // constructor with data and dimensions + MatrixND(T** data, int rows, int cols); // constructor with data and dimensions + MatrixND(const MatrixND& other); // copy constructor + MatrixND(MatrixND&& other) noexcept; // move constructor + MatrixND& operator=(const MatrixND& other); // copy assignment + MatrixND& operator=(MatrixND&& other) noexcept ; // move assignment + // set data and dimensions using a vector + void set(std::vector, int rows, int cols); + // set data and dimensions using a pointer + template + void set(const T& first, const Args&... args); + // set data at a specific index with a value + void setAt(int row, int col, T value); + // method to swap rows + [[maybe_unused]] void swapRows(int row1, int row2); + // method to swap columns + [[maybe_unused]] void swapCols(int col1, int col2); + // static function to generate and return a random matrix of the given size + // with values between 0 and 1 + [[maybe_unused]] static MatrixND random(int rows, int cols); + // static function to generate and return a random matrix of the given size + // with values in the given range + [[maybe_unused]] static MatrixND + random(int rows, int cols, T min, T max, bool continuous = true); + // method to test if matrix is square + [[nodiscard]] bool isSquare() const; // returns true if matrix is square + [[nodiscard]] bool isZero() const; // returns true if matrix is zero + // returns true if matrix is identity + [[maybe_unused]] [[nodiscard]] bool isIdentity() const; + // returns true if matrix is diagonal + [[maybe_unused]] [[nodiscard]] bool isDiagonal() const; + // returns true if matrix is symmetric + [[maybe_unused]] [[nodiscard]] bool isSymmetric() const; + // returns true if matrix is skew symmetric + [[maybe_unused]] [[nodiscard]] bool isSkewSymmetric() const; + // returns true if matrix is upper triangular + [[maybe_unused]] [[nodiscard]] bool isUpperTriangular() const; + // returns true if matrix is lower triangular + [[maybe_unused]] [[nodiscard]] bool isLowerTriangular() const; + // returns true if matrix is tridiagonal + [[maybe_unused]] [[nodiscard]] bool isTridiagonal() const; + //checks if the f1 - f2 close to 0 + bool closeEnough(T f1, T f2); + // prints the matrix + void print(); + // returns the transpose of the matrix + MatrixND transpose(); + // returns the inverse of the matrix + MatrixND inverse(); + // returns the determinant of the matrix + float determinant(); + // function to return the characteristic polynomial of the matrix + std::vector characteristicPolynomial(); + // method to create an identity matrix of a square matrix + [[nodiscard]] MatrixND identity(); + // method to create a identity matrix of a specified size + [[nodiscard]] static MatrixND identity(int size); + // method to create a zero matrix of a square matrix + MatrixND zero(); + static MatrixND zero(int rows, int cols); + // method to calculate the rank of a matrix + int rank(); + // method to put matrix into reduced row echelon form + MatrixND rref(); + // method to determine if matrix is in reduced row echelon form + bool isRowEchelon(); + [[nodiscard]] MatrixND dot(const MatrixND &); + MatrixND cross(const MatrixND&); + MatrixND add(const MatrixND &); + MatrixND sub(const MatrixND &); + MatrixND mult(const MatrixND &); + MatrixND mult(const T &); + // Function to add a multiple of row j to row i (in place). + void addMultiple(int i, int j, T multiple); + bool isEqual(const MatrixND &); + // method to calculate the adjoint of a matrix + MatrixND adjoint(); + [[nodiscard]] MatrixND concat(const MatrixND &); // concatenate two matrices + [[nodiscard]] MatrixND stack(const MatrixND &); // stack vertically + [[nodiscard]] MatrixND kronecker(const MatrixND &); // kronecker product + // method to vind the eignenvectors of the matrix + MatrixND eigenvectors(); // not implemented + // method to return a vector of eigenvalues of the matrix + std::vector eigenvalues(); // not implemented + // method to take the mean of the matrix + double mean(); + // method to take the standard deviation of the matrix + double std(); + // method to take the covariance of the matrix + double cov(); + // method to take the correlation of the matrix + double corr(); + // method to take the sum of the matrix elements + double sum(); + // enode from row and column to index + int index(int row, int col)const; + + int getRows()const; // returns the number of rows + int getCols()const; // returns the number of columns + // find the sub matrix of the given row and column + MatrixND subMatrix(int row, int col); + // method to return the top number of specified rows of the matrix + MatrixND topRows(int rows); + // method to return the bottom number of specified rows of the matrix + MatrixND bottomRows(int rows); + // method to return the left number of specified columns of the matrix + MatrixND leftCols(int cols); + // method to return the right number of specified columns of the matrix + MatrixND rightCols(int cols); + // method to return the top left number of specified rows and columns of the matrix + MatrixND topLeft(int rows, int cols); + // method to return the top right number of specified rows and columns of the matrix + MatrixND topRight(int rows, int cols); + // method to return the bottom left number of specified rows and columns of the matrix + MatrixND bottomLeft(int rows, int cols); + // method to return the bottom right number of specified rows and columns of the matrix + MatrixND bottomRight(int rows, int cols); + // method to return the cofactor of the matrix at the specified row and column + T cofactor(int row, int col); + // method to ruturn the colwise mean of the matrix + double colwiseMean(int col); + // method to ruturn the rowwise mean of the matrix + double rowwiseMean(int row); + // method to ruturn the colwise standard deviation of the matrix + double colwiseStd(int col); + // method to ruturn the rowwise standard deviation of the matrix + double rowwiseStd(int row); + // method to ruturn the colwise covariance of the matrix + double colwiseCov(int col); + // method to ruturn the rowwise covariance of the matrix + double rowwiseCov(int row); + // method to ruturn the colwise correlation of the matrix + double colwiseCorr(int col); + // method to ruturn the rowwise correlation of the matrix + double rowwiseCorr(int row); + // method to ruturn the colwise sum of the matrix + double colwiseSum(int col); + // method to ruturn the rowwise sum of the matrix + double rowwiseSum(int row); + // method to ruturn the colwise top number of specified rows of the matrix + MatrixND colwiseTopRows(int rows); + // method to ruturn the rowwise top number of specified rows of the matrix + MatrixND rowwiseTopRows(int rows); + // method to ruturn the colwise bottom number of specified rows of the matrix + MatrixND colwiseBottomRows(int rows); + // method to ruturn the rowwise bottom number of specified rows of the matrix + MatrixND rowwiseBottomRows(int rows); + // colwise to return a colwise vector of the matrix + std::vector colwise(int col); + // look at the data in a colwise fashion + MatrixND colwise(); + // rowwise to return a rowwise vector of the matrix + std::vector rowwise(int row); + // look at the data in a rowwise fashion + MatrixND rowwise(); + // Function to the find the row with the maximum element at the column given. + // Returns the row index. + int findRowWithMaxElement(int col, int row); + // method to return the max coefficient of the matrix + T max(); + // find row with max element + int maxRow(); + // find column with max element + int maxCol(); + // method to return the min coefficient of the matrix + T min(); + // find row with min element + int minRow(); + // find column with min element + int minCol(); + // method to return the max coefficient of a specified row of the matrix + T maxRow(int row); + // method to return the min coefficient of a specified row of the matrix + T minRow(int row); + // method to return the max coefficient of a specified column of the matrix + T maxCol(int col); + // method to return the min coefficient of a specified column of the matrix + T minCol(int col); + + + [[nodiscard]] T get(int row, int col)const; + // overload the parenthesis operator to get the value at a given row and column + T& operator()(int row, int col); + // overload the parenthesis operator to set the value at a given row and column + void operator()(int row, int col, T value); + // method to flatten the matrix into a vector + std::vector flatten(); + // method to reshape the matrix into a new matrix + MatrixND reshape(int rows, int cols); + // method to return the diagonal elements of the matrix + MatrixND diag(); + // method to return the trace of the matrix + T trace(); + // method to return the sum of the absolute values of the matrix + T sumAbs(); + // method to turn the matrix into an array + T* array(); + + + MatrixND operator+(const MatrixND &); + VectorND operator+(const VectorND &); + MatrixND operator-(const MatrixND &); + VectorND operator-(const VectorND &); + MatrixND operator*(const MatrixND &); + VectorND operator*(const VectorND &); + MatrixND operator*(const T &); + bool operator==(const MatrixND &); + +// template friend MatrixND operator+ (const MatrixND& lhs, MatrixND& rhs); +// template friend MatrixND operator+ (const U& lhs, MatrixND& rhs); +// template friend MatrixND operator+ (const MatrixND& lhs, U& rhs); +// +// template friend MatrixND operator- (const MatrixND& lhs, MatrixND& rhs); +// template friend MatrixND operator- (const U& lhs, MatrixND& rhs); +// template friend MatrixND operator- (const MatrixND& lhs, U& rhs); +// +// template friend MatrixND operator* (const MatrixND& lhs, MatrixND& rhs); +// template friend MatrixND operator* (const U& lhs, MatrixND& rhs); +// template friend MatrixND operator* (const MatrixND& lhs, const U& rhs); + + template + friend istream& operator>>(istream& is, MatrixND& m); + + template + friend ostream& operator<<(ostream& os, const MatrixND& rhs); + + ~MatrixND() = default; + +}; + + + +#endif //PHYSICSFORMULA_MATRIXND_H +/** Default Constructor + + creates an empty matrix + +*/ + +template +MatrixND::MatrixND() +{ + data.clear(); + rows = 0; + cols = 0; +} + + +template +template +MatrixND::MatrixND(const int& r_, const int& c_, const T& first, const Args & ...args) +{ + data = {first, args...}; + rows = r_; + cols = c_; + auto total = rows * cols; + +} + +template +template +inline void MatrixND::set(const T& first, const Args & ...args) +{ + data.clear(); + auto total = rows * cols; + data.push_back(first); + int dummy[] = { 0, (data.push_back(args), 0)... }; + (void)dummy; + for (const auto& i : data) + { + if (i <= total) + { + data.push_back(i); + } + } +} +template +void MatrixND::setAt(int row, int col, T value) { + if (row < rows && col < cols) { + data[row * cols + col] = value; + } +} + +template +[[maybe_unused]] void MatrixND::swapRows(int row1, int row2) { + if (row1 < rows && row2 < rows) { + for (int i = 0; i < cols; i++) { + std::swap(data[row1 * cols + i], data[row2 * cols + i]); + } + } +} +template +[[maybe_unused]] void MatrixND::swapCols(int col1, int col2) { + if (col1 < cols && col2 < cols) { + for (int i = 0; i < rows; i++) { + std::swap(data[i * cols + col1], data[i * cols + col2]); + } + } +} +template +MatrixND MatrixND::random(int rows, int cols) { + MatrixND m(rows, cols); + // seed a random number generator + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_real_distribution<> dis(0, 1); + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + m.setAt(i, j, dis(gen)); + } + } + return m; +} +template +MatrixND MatrixND::random(int rows, int cols, T min, T max, bool continuous) { + MatrixND m(rows, cols); + // seed a random number generator + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_real_distribution<> dis(min, max); + if (continuous) { + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + m.setAt(i, j, dis(gen)); + } + } + } + else { + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + m.setAt(i, j, round(dis(gen))); + } + } + } + return m; +} + +template +bool MatrixND::isSquare() const { + return rows == cols; +} +template +bool MatrixND::isZero() const { + for (const auto& i : data) + { + if (i != 0) + { + return false; + } + } + return true; +} + +template +[[maybe_unused]] bool MatrixND::isIdentity() const { + if (!isSquare()) + return false; + for (int i = 0; i < rows; i++) + for (int j = 0; j < cols; j++) + if (i == j && data[i * cols + j] != 1) + return false; + else if (i != j && data[i * cols + j] != 0) + return false; + return true; +} +template +bool MatrixND::isDiagonal() const { + if (!isSquare()) + return false; + for (int i = 0; i < rows; i++) + for (int j = 0; j < cols; j++) + if (i != j && data[i * cols + j] != 0) + return false; + return true; +} +template +bool MatrixND::isSymmetric() const { + if (!isSquare()) + return false; + for (int i = 0; i < rows; i++) + for (int j = 0; j < cols; j++) + if (i != j && data[i * cols + j] != data[j * cols + i]) + return false; + return true; +} +template +bool MatrixND::isSkewSymmetric() const { + if (!isSquare()) + return false; + for (int i = 0; i < rows; i++) + for (int j = 0; j < cols; j++) + if (i != j && data[i * cols + j] != -data[j * cols + i]) + return false; + return true; +} +template +bool MatrixND::isUpperTriangular() const { + if (!isSquare()) + return false; + for (int i = 0; i < rows; i++) + for (int j = 0; j < cols; j++) + if (i > j && data[i * cols + j] != 0) + return false; + return true; +} +template +bool MatrixND::isLowerTriangular() const { + if (!isSquare()) + return false; + for (int i = 0; i < rows; i++) + for (int j = 0; j < cols; j++) + if (i < j && data[i * cols + j] != 0) + return false; + return true; +} +template +bool MatrixND::isTridiagonal() const { + if (!isSquare()) + return false; + for (int i = 0; i < rows; i++) + for (int j = 0; j < cols; j++) + if (i == j && data[i * cols + j] != 0) + continue; + else if (i != j && i + 1 == j && data[i * cols + j] != 0) + continue; + else if (i != j && i - 1 == j && data[i * cols + j] != 0) + continue; + else + return false; + return true; +} + +template +bool MatrixND::closeEnough(T f1, T f2) { + return fabs(f1-f2) < 1e-9; +} + +template +inline MatrixND::MatrixND(int r, int c) +{ + rows = r; + cols = c; + data = vector(r * c); +} + +template +MatrixND::MatrixND(int r, int c, int min, int max, + RandomGenerator generator) { + rows = r; + cols = c; + data = vector(r * c); + // seed a random number generator depending on the generator + std::random_device rd; + if (generator == RandomGenerator::MERSENNE_TWISTER) { + std::mt19937 gen(rd()); + std::uniform_real_distribution<> dis(min, max); + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + data[i * cols + j] = dis(gen); + } + } + } + else if (generator == RandomGenerator::LINEAR_CONGRUENTIAL) { + std::minstd_rand gen(rd()); + std::uniform_real_distribution<> dis(min, max); + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + data[i * cols + j] = dis(gen); + } + } + } else { + // defalut to srand with time + srand(time(NULL)); + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + data[i * cols + j] = (T)rand() / RAND_MAX * (max - min) + min; + } + } + } +} + +/** Constructor + creates the matrix as the following: + @params elements the elements of the matrix in Row-major form + numRows the number of rows in the matrix + numCols the number of columns in the matrix +*/ +template +MatrixND::MatrixND(std::vector elm, int numRows, int numCols) +{ + rows = numRows; + cols = numCols; + data.clear(); + for(unsigned int i = 0; i < elm.size(); i++) { + data.push_back(elm[i]); + } +} + +template +MatrixND::MatrixND(T *data, int rows, int cols) +{ + this->rows = rows; + this->cols = cols; + this->data = vector(data, data + rows * cols); +} + +template +MatrixND::MatrixND(T **data, int rows, int cols) { + //use data from the 2d array + this->rows = rows; + this->cols = cols; + this->data = vector(rows * cols); + for (int i = 0; i < rows; i++) + { + for (int j = 0; j < cols; j++) + { + this->data[i * cols + j] = data[i][j]; + } + } +} + +/** set + + resets the matrix to the input + + @params elements, - the elements of the matrix in Row-major form + numRows, - the number of rows in the matrix + numCols; - the number of coumns in the matrix + @return void; nothing to return + +*/ + +template +void MatrixND::set(std::vector elements, int numRows, int numCols) +{ + rows = numRows; + cols = numCols; + data.clear(); + for(unsigned int i = 0; i < elements.size(); i++) { + data.push_back(elements[i]); + } +} + + +/** operator+ (add) + lhs + rhs; + elementwise adition of rhs to lhs + + @params rhs; the matrix to add + @return matrix; the sum + +*/ + +template +MatrixND MatrixND::operator+(const MatrixND & rhs) +{ + return this->add(rhs); +} +template +VectorND MatrixND::operator+(const VectorND & rhs) { + assert(this->cols == rhs.size() && this->rows == 1); + VectorND result(this->cols); + for (int i = 0; i < this->cols; i++) { + result.setAt(i, this->data[i] + rhs.getAt(i)); + } + return result; +} + +/** operator- (subtract) + lhs - rhs; + elementwise subtraction of rhs from lhs + + @params rhs; the matrix to subtract + @return matrix; the difference + +*/ + +template +MatrixND MatrixND::operator-(const MatrixND & rhs) +{ + return this->sub(rhs); +} +template +VectorND MatrixND::operator-(const VectorND & rhs) { + assert(this->cols == rhs.size() && this->rows == 1); + VectorND result(this->cols); + for (int i = 0; i < this->cols; i++) { + result.setAt(i, this->data[i] - rhs.getAt(i)); + } + return result; +} + +/** operator(*) Matrix multiplication + lhs * rhs; + calculate A * x = B + @params rhs; the second matrix + @return matrix; the transformed product matrix +*/ +template +MatrixND MatrixND::operator*(const MatrixND & rhs) +{ + return this->mult(rhs); +} + +/** operator* (scalar multiplication) + M * T; + calculate scalar product of a matrix + + @params rhs; the scalar; + @return matrix; the transformed product matrix + +*/ +template +MatrixND MatrixND::operator*(const T & t) +{ + return this->mult(t); +} +//template +//MatrixND operator+(const MatrixND &lhs, MatrixND &rhs) { +// int numRows = lhs.getRows(); +// int numCols = lhs.getCols(); +// int numElements = numRows * numCols; +// U *tempResult = new U[numElements]; +// for (int i=0; i result(numRows, numCols, tempResult); +// delete[] tempResult; +// return result; +//} +//template +//MatrixND operator+(const U &lhs, MatrixND &rhs) { +// int numRows = rhs.getRows(); +// int numCols = rhs.getCols(); +// int numElements = numRows * numCols; +// U *tempResult = new U[numElements]; +// for (int i=0; i result(numRows, numCols, tempResult); +// delete[] tempResult; +// return result; +//} +//template +//MatrixND operator+(const MatrixND &lhs, U &rhs) { +// int numRows = lhs.getRows(); +// int numCols = lhs.getCols(); +// int numElements = numRows * numCols; +// U *tempResult = new U[numElements]; +// for (int i=0; i result(numRows, numCols, tempResult); +// delete[] tempResult; +// return result; +//} +//template +//MatrixND operator-(const MatrixND &lhs, MatrixND &rhs) { +// int numRows = lhs.getRows(); +// int numCols = lhs.getCols(); +// int numElements = numRows * numCols; +// U *tempResult = new U[numElements]; +// for (int i=0; i result(numRows, numCols, tempResult); +// delete[] tempResult; +// return result; +//} // +//template +//MatrixND operator-(const U& lhs, MatrixND& rhs) { +// int numRows = rhs.getRows(); +// int numCols = rhs.getCols(); +// int numElements = numRows * numCols; +// U *tempResult = new U[numElements]; +// for (int i=0; i result(numRows, numCols, tempResult); +// delete[] tempResult; +// return result; +//} +//template +//MatrixND operator-(const MatrixND& lhs, U& rhs) { +// int numRows = lhs.getRows(); +// int numCols = lhs.getCols(); +// int numElements = numRows * numCols; +// U *tempResult = new U[numElements]; +// for (int i=0; i result(numRows, numCols, tempResult); +// delete[] tempResult; +// return result; +//} +//template +//MatrixND operator*(const MatrixND &lhs, MatrixND &rhs) { +// // Verify the dimensions of the inputs. +// if (lhs.getCols() != rhs.getRows()) +// throw std::invalid_argument("Number of columns in matrix must equal number of rows in vector."); +// +// // Setup the vector for the output. +// MatrixND result(lhs.getRows()); +// +// // Loop over rows and columns and perform the multiplication operation element-by-element. +// for (int row=0; row(0.0); +// for (int col=0; col +//MatrixND operator*(const U &lhs, MatrixND &rhs) { +// int numRows = rhs.getRows(); +// int numCols = rhs.getCols(); +// int numElements = numRows * numCols; +// U *tempResult = new U[numElements]; +// for (int i = 0; i < numElements; ++i) { +// tempResult[i] = lhs * rhs.getAt(i); +// } +// +// MatrixND result(tempResult, numRows, numCols); +// delete[] tempResult; +// return result; +//} +//template +//MatrixND operator*(const MatrixND &lhs, U &rhs) { +// int numRows = lhs.getRows(); +// int numCols = lhs.getCols(); +// int numElements = numRows * numCols; +// U *tempResult = new U[numElements]; +// for (int i=0; i result(tempResult, numRows, numCols); +// delete[] tempResult; +// return result; +//} +/** operator == + + elemetnwise comparison of two matrices of equal size + + @params rhs; the second matrix + @return bool; true if same size and elements all equal + +*/ +template +bool MatrixND::operator==(const MatrixND & rhs) +{ + return this->isEqual(rhs); +} + +template +inline istream& operator>>(istream& is, MatrixND& m) +{ + auto length = m.rows * m.cols; + std::cout << "enter values of the " << m.rows << " x " << m.cols << " matrix\n>>"; + for (int i = 0; i < length; i++) + { + is >> m.data[i]; + } + return is; +} + +template +std::ostream& operator<<(std::ostream& os, const MatrixND& rhs) +{ + auto total = rhs.rows * rhs.cols; + std::cout << std::setprecision(4); + for (size_t i = 0; i < total; i++) { + os << setw(6) << left << rhs.data[i] << " "; + if ((i + 1) % rhs.cols == 0) + os << std::endl; + } + return os; +} +/** + *isEqual + * + * element wise comparison of two matrices of equal size + * + *@params rhs; the second matrix + *@return bool; true if same size and elements all equal +*/ +template +bool MatrixND::isEqual(const MatrixND & rhs) +{ + if(rows != rhs.rows || cols != rhs.cols) { + return false; + } + for(unsigned int i = 0; i < data.size(); i++) { + if(data[i] != rhs.data[i]) + return false; + } + return true; +} +template +MatrixND MatrixND::adjoint() { + MatrixND result(rows, cols); + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + result.setAt(i, j, cofactor(i, j)); + } + } + // finding any -0 and replacing it with 0 + for (int i = 0; i < result.rows; i++) { + for (int j = 0; j < result.cols; j++) { + if (result.get(i, j) == -0) { + result.setAt(i, j, 0); + } + } + } + return result.transpose(); +} +/** add + elementwise adition of rhs to lhs + @params rhs; the matrix to add + @return matrix; the sum +*/ +template +MatrixND MatrixND::add(const MatrixND & rhs) +{ + if(rows != rhs.rows || cols != rhs.cols) { + MatrixND matrix; + return matrix; + } + std::vector vec; + for(unsigned int i = 0; i < data.size(); i++) { + vec.push_back(data[i] + rhs.data[i]); + } + return MatrixND(vec,rows,cols); +} + +template +MatrixND MatrixND::dot(const MatrixND & rhs) +{ + if(rows != rhs.rows && cols != rhs.cols) { + std::cout << "Error! Can not resolve dot product on these matrices!" + << std::endl; + return *this; + } + + std::vector vec(this->cols); + MatrixND result(vec, 1, rhs.cols); + T sum = 0; + for(int i = 0; i < rows; i++) { + for(int j = 0; j < rhs.cols; j++) { + sum += data[j * this->cols + i] * rhs.data[j * this->cols + i]; + } + result.data[i] = sum; + sum = 0; + } + + return result; +} + +template +MatrixND MatrixND::cross(const MatrixND& rhs) +{ + assert(this->rows == 3 && this->cols == 3 && rhs.rows == 3 && rhs.cols == 3); + T a, b, c, d, e, f, g, h, i; + a = b = c = d = e = f = g = h = i = 0.0; + a = this->data[3] * rhs.data[6] - this->data[6] * rhs.data[3]; + b = this->data[4] * rhs.data[7] - this->data[7] * rhs.data[4]; + c = this->data[5] * rhs.data[8] - this->data[8] * rhs.data[5]; + d = this->data[6] * rhs.data[0] - this->data[0] * rhs.data[6]; + e = this->data[7] * rhs.data[1] - this->data[1] * rhs.data[7]; + f = this->data[8] * rhs.data[2] - this->data[2] * rhs.data[8]; + g = this->data[0] * rhs.data[3] - this->data[3] * rhs.data[0]; + h = this->data[1] * rhs.data[4] - this->data[4] * rhs.data[1]; + i = this->data[2] * rhs.data[5] - this->data[5] * rhs.data[2]; + MatrixND result(3, 3, a, b, c, d, e, f, g, h, i); + return result; +} + +template +MatrixND MatrixND::mult(const MatrixND & rhs) +{ + assert(this->cols == rhs.rows); + std::vector d(this->rows*rhs.cols); + MatrixND result(d, this->rows, rhs.cols); + for (int i = 0; i < this->rows; i++) { + for (int j = 0; j < rhs.cols; j++) { + T sum = 0; + for (int k = 0; k < rhs.rows; k++) { + sum += data[i * this->cols + k] * rhs.data[k * rhs.cols + j]; + result.data[i * this->rows + j] = sum; + } + } + } + return result; +} + +/** multiplication (scalar) + + calculate scalar product of a matrix + + @params rhs; the scalar; + @return matrix; the transformed product matrix + +*/ +template +MatrixND MatrixND::mult(const T & scalar) +{ + std::vector vec; + for(unsigned int i = 0; i < data.size(); i++) { + vec.push_back(data[i] * scalar); + } + return MatrixND(vec,rows,cols); +} + +template +void MatrixND::addMultiple(int i, int j, T multiple) { + for (int k=0; k +MatrixND MatrixND::sub(const MatrixND & rhs) +{ + if(rows != rhs.rows || cols != rhs.cols) { + MatrixND matrix; + return matrix; + } + + std::vector vec; + for(unsigned int i = 0; i < data.size(); i++) { + vec.push_back(data[i] - rhs.data[i]); + } + + return MatrixND(vec,rows,cols); +} + +template +void MatrixND::print() +{ + // print out in a nice format using setw and setprecision + std::cout << std::endl << std::setprecision(4); + for(unsigned int i = 0; i < data.size(); i++) { + std::cout << std::setw(6) << left << data[i] << " "; + if(i % cols == cols - 1) { + std::cout << std::endl; + } + } +} + + +/** transpose + + Calculate transpose of matrix + + @return matrix; the transpose of this matrix + +*/ + +template +MatrixND MatrixND::transpose() +{ + std::vector vec; + for(int i = 0; i < cols; i++) { + for(int j = 0; j < rows; j++) { + vec.push_back(data[j * cols + i]); + } + } + + return MatrixND(vec,cols,rows); +} + +/** Inverse + * calculate the inverse of a matrix + * @return matrix; the inverse of this matrix + */ + template + MatrixND MatrixND::inverse() + { + if (rows != cols) { + MatrixND matrix; + return matrix; + } + MatrixND result(rows, cols); + T det = this->determinant(); + if(det == 0) { + std::cout << "Matrix is not invertible" << std::endl; + return result; + } + // calculate the adjoint matrix + MatrixND inv(rows, cols); + MatrixND adj = this->adjoint(); + // finding the inverse by dividing the adjoint matrix by the determinant + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + inv.data[i * cols + j] = adj.data[i * cols + j] / det; + } + } + return inv; + } + + /** determinant + * calculate the determinant of a matrix + * @ return T; the determinant of this matrix * + */ + template + float MatrixND::determinant() + { +// Check if the matrix is square. + if (!isSquare()) { + return -999999; + } + + // If the matrix is 2x2, we can just compute the determinant directly. + T determinant; + if (rows == 2) + { + determinant = (data[0] * data[3]) - (data[1] * data[2]); + } + else + { + /* Otherwise we extract the sub-matrices and then recursively call this function + until we get to 2x2 matrices. */ + + // We will find the sub-matrices for row 0. + // So, loop over each column. + T cumulativeSum = 0.0; + T sign = 1.0; + for (int j = 0; j < cols; ++j) + { + // And find the sub-matrix for each element. + MatrixND subMatrix = this->subMatrix(0, j); + + /* Cumulatively multiply the determinant of the sub-matrix by the + current element of this matrix and the sign variable (note the + recursive calling of the Determinant() method). */ + cumulativeSum += this->get(0, j) * subMatrix.determinant() * sign; + sign = -sign; + } + determinant = cumulativeSum; + } + + return determinant; + } +// NOT WORKING NEEDS TO BE FIXED +template +std::vector MatrixND::characteristicPolynomial() { + std::vector poly; + MatrixND adj = this->adjoint(); + MatrixND inv = this->inverse(); + MatrixND adjInv = adj * inv; + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + poly.push_back(adjInv.data[i * cols + j]); + } + } + return poly; +} + +template +MatrixND MatrixND::identity() { + if (rows != cols) { + MatrixND matrix; + return matrix; + } + std::vector vec(rows*cols); + MatrixND results(vec, rows, cols); + for (int i = 0; i < rows; i++) { + results.data[i * cols + i] = 1; + } + return results; +} + +template +MatrixND MatrixND::identity(int size) { + std::vector vec(size*size); + MatrixND results(vec, size, size); + for (int i = 0; i < size; i++) { + results.data[i * size + i] = 1; + } + return results; +} + +template +MatrixND MatrixND::zero() { + __assert(isSquare(), "Matrix is not square!"); + std::vector vec(rows*cols); + MatrixND results(vec, rows, cols); + return results; +} +template +MatrixND MatrixND::zero(int rows, int cols) { + std::vector vec(rows*cols); + MatrixND results(vec, rows, cols); + return results; +} + +template +int MatrixND::rank() { + // Convert the matrix to row-echelon form. + MatrixND matrixCopy = this->rref(); + + /* If this didn't work, then we compute the rank by finding + the largest non-zero sub-matrix with a non-zero determinant. + + Note that this method is slower for large matrices and therefore + it is better to use the RowEchelon method if possible. */ + int numNonZeroRows = 0; + if (!matrixCopy.isRowEchelon()) + { + // Setup a std::vector to store the sub-matrices as we go. + std::vector> subMatrixVector; + + // Store the current matrix into the array first. + subMatrixVector.push_back(*this); + + /* Loop through the subMatrixVector until either we have tested every + sub-matrix or the completeFlag is set. */ + bool completeFlag = false; + int subMatrixCount = 0; + while ((subMatrixCount < subMatrixVector.size()) && (!completeFlag)) + { + // Extract the currentMatrix to work with. + MatrixND currentMatrix = subMatrixVector[subMatrixCount]; + subMatrixCount++; + + // Test if this matrix is non-zero. + if (!currentMatrix.isZero()) + { + // If the determinant is non-zero, then we have our result. + T currentMatrixDet = currentMatrix.determinant(); + if (!closeEnough(currentMatrixDet, 0.0)) + { + completeFlag = true; + numNonZeroRows = currentMatrix.getRows(); + } + else + { + // Extract and store each sub-matrix (if larger than 2x2). + if ((currentMatrix.getRows() > 2) && (currentMatrix.getCols() > 2)) + { + for (int i=0; i 0) + numNonZeroRows++; + } + + } + // The rank of the matrix is simply the number of non-zero rows. + return numNonZeroRows; +} + +template +MatrixND MatrixND::rref() { + // Convert the matrix to row-echelon form. + MatrixND matrixCopy = *this; + int nRows = matrixCopy.getRows(); + int nCols = matrixCopy.getCols(); + T A[nRows][nCols]; + for (int r = 0; r < nRows; r++) + for (int c = 0; c < nCols; c++) + A[r][c] = matrixCopy.get(r,c); + + // Loop over each row and test whether it has at least one non-zero element. + for (int i=0; i result(nRows, nCols); + for (int i = 0; i < rows; ++i) { + for (int j = 0; j < cols; ++j) { + // fill the result matrix + // check if the element is within the tolerance + if (closeEnough(A[i][j], 0.0)) + result(i,j) = 0.0; + else + result(i,j) = A[i][j]; + + } + } + return result; +} + +template +bool MatrixND::isRowEchelon() { + MatrixND rref = this->rref(); + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + if (i > j && rref.data[i * cols + j] != 0) { + return false; + } + } + } + return true; +} +/** Concat + append two matrices of equal row count + @params rhs; the matrix to concatanate + @return matrix; the contanated matrix + +*/ +template +MatrixND MatrixND::concat(const MatrixND & rhs) +{ + + if(rows != rhs.rows) + return MatrixND(*this); + + std::vector vec; + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + vec.push_back(data[i*cols + j]); + } + for(int j = 0; j < rhs.cols; j++) { + vec.push_back(rhs.data[i*rhs.cols + j]); + } + } + + return MatrixND(vec,rows,cols+rhs.cols); +} + +/** stack + append two matrices of equal column count + @params rhs; the matrix to stack below + @return matrix; the lhs stacked ontop of rhs matrix +*/ + +template +MatrixND MatrixND::stack(const MatrixND & rhs) +{ + if(cols != rhs.cols) + return MatrixND(*this); + + std::vector vec; + + for(unsigned int i = 0; i < data.size(); i++) { + vec.push_back(data[i]); + } + for(unsigned int i = 0; i < rhs.data.size(); i++) { + vec.push_back(rhs.data[i]); + } + + return MatrixND(vec,rows+rhs.rows,cols); +} + +/** Kronecker + https://en.wikipedia.org/wiki/Kronecker_product + calculate kroncker product of two matrices + + @params rhs; the matrix operand + @return matrix; the Kronecker product matrix + +*/ +template +MatrixND MatrixND::kronecker(const MatrixND & rhs) +{ + std::vector vec; + + for(int i = 0; i < (rows*cols*rhs.rows*rhs.cols); i++) { + int j = (i/rhs.cols)%cols + (i/(cols*rhs.rows*rhs.cols))*cols; //iterate lhs in proper order + int k = (i%rhs.cols) + ((i / (cols * rhs.cols))%rhs.rows)*rhs.cols; //iterate rhs in proper order + //can use scalar multiplactions, matrix concat and stacking, but this is a single iteration through the vector. + //Kronecker iterates both matrices in a pattern relative to the large product matrix. + //std::cout << i << " : " << j << " : " << k << std::endl; + //std::cout << i << " : " << j << " : " << k << " : " << l << std::endl; + vec.push_back(data[j]*rhs.data[k]); + } + + return MatrixND(vec,rows*rhs.rows,cols*rhs.cols); +} +template +MatrixND MatrixND::eigenvectors() { + +} +template +std::vector MatrixND::eigenvalues() { + if(rows != cols) + return std::vector(); + MatrixND A = *this; + std::vector eigenvalues; + for(int i = 0; i < rows; i++) { + eigenvalues.push_back(A.data[i*cols + i]); + } + return eigenvalues; +} + +/** + * get the number of rows in the matrix + * @tparam T + * @return + */ +template +int MatrixND::getRows()const +{ + return rows; +} +/** + * get the number of columns in the matrix + * @tparam T + * @return + */ +template +int MatrixND::getCols()const +{ + return cols; +} + +template +MatrixND MatrixND::subMatrix(int row, int col) { + // Create a new matrix to store the sub-matrix. + // Note that this is one row and one column smaller than the original. + MatrixND subMatrix(rows-1, cols-1); + + // Loop over the elements of the existing matrix and copy to sub-matrix as appropriate. + int count = 0; + for (int i=0; i +T MatrixND::getAt(int index) { + if (index < 0 || index >= data.size()) { + return 0; + } + return data[index]; +} +template +void MatrixND::setAt(int index, int value) { + data[index] = value; +} + +/** + * get the element at the specified row and column + * @param row + * @param col + * @return T : the element at the specified row and column + */ +template +T MatrixND::get(int row, int col)const +{ + return data[row*cols + col]; +} +/** + * multiply the matrix by the vector + * @tparam T + * @return VectorND : the vector multiplied by the matrix + */ +template +VectorND MatrixND::operator*(const VectorND & v) { + assert(this->cols == v.getSize()); + std::vector vec; + for(int i = 0; i < rows; i++) { + T sum = 0; + for(int j = 0; j < cols; j++) { + sum += data[i*cols + j] * v.get(j); + } + vec.push_back(sum); + } + return VectorND(vec,rows); +} + +template +MatrixND::MatrixND(MatrixND &&other) noexcept { + data = std::move(other.data); + rows = other.rows; + cols = other.cols; +} + +template +MatrixND::MatrixND(const MatrixND &other) { + data = other.data; + rows = other.rows; + cols = other.cols; +} + +template +MatrixND &MatrixND::operator=(const MatrixND &other) { + data = other.data; + rows = other.rows; + cols = other.cols; + return *this; +} + +template +MatrixND &MatrixND::operator=(MatrixND &&other) noexcept { + data = std::move(other.data); + rows = other.rows; + cols = other.cols; + return *this; +} + +template +T &MatrixND::operator()(int row, int col) { + return data[row*cols + col]; +} + +template +void MatrixND::operator()(int row, int col, T value) { + data[row*cols + col] = value; +} + +template +MatrixND MatrixND::topRows(int rows) { + MatrixND m(rows,cols); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + m(i,j) = this->operator()(i,j); + } + } + return m; +} + +template +MatrixND MatrixND::bottomRows(int rows) { + MatrixND m(rows,cols); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + m(i,j) = this->operator()(rows-i-1,j); + } + } + return m; +} + +template +MatrixND MatrixND::leftCols(int cols) { + MatrixND m(rows,cols); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + m(i,j) = this->operator()(i,j); + } + } + return m; +} + +template +MatrixND MatrixND::rightCols(int cols) { + MatrixND m(rows,cols); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + m(i,j) = this->operator()(i,cols-j-1); + } + } + return m; +} + +template +double MatrixND::mean() { + double sum = 0; + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + sum += data[i*cols + j]; + } + } + return sum/(rows*cols); +} + +template +double MatrixND::std() { + double mean = this->mean(); + double sum = 0; + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + sum += pow(data[i*cols + j] - mean,2); + } + } + return sqrt(sum/(rows*cols)); +} + +template +double MatrixND::cov() { + double mean = this->mean(); + double sum = 0; + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + sum += (data[i*cols + j] - mean)*(data[i*cols + j] - mean); + } + } + return sum/(rows*cols); +} + +template +double MatrixND::corr() { + double cov = this->cov(); + double std = this->std(); + return cov/(std*std); +} + +template +double MatrixND::sum() { + double sum = 0; + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + sum += data[i*cols + j]; + } + } + return sum; +} + +template +int MatrixND::index(int row, int col) const { + if (row < 0 || row >= rows || col < 0 || col >= cols) { + return -1; + } + return row*cols + col; +} +template +vector MatrixND::flatten() { + vector vec; + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + vec.push_back(data[i*cols + j]); + } + } + return vec; +} + +template +MatrixND MatrixND::reshape(int rows, int cols) { + MatrixND m(rows,cols); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + m(i,j) = this->operator()(i,j); + } + } + return m; +} + +template +MatrixND MatrixND::diag() { + MatrixND m(rows,cols); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + if(i == j) { + m(i,j) = this->operator()(i,j); + } + } + } + return m; +} + +template +T MatrixND::trace() { + T sum = 0; + for(int i = 0; i < rows; i++) { + sum += this->operator()(i,i); + } + return sum; +} + +template +T MatrixND::sumAbs() { + T sum = 0; + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + sum += abs(data[i*cols + j]); + } + } + return sum; +} + +template +T *MatrixND::array() { + return data.data(); +} + +template +MatrixND MatrixND::topLeft(int rows, int cols) { + MatrixND m(rows,cols); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + m(i,j) = this->operator()(i,j); + } + } + return m; +} + +template +MatrixND MatrixND::topRight(int rows, int cols) { + MatrixND m(rows,cols); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + m(i,j) = this->operator()(i,cols-j-1); + } + } + return m; +} + +template +MatrixND MatrixND::bottomLeft(int rows, int cols) { + MatrixND m(rows,cols); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + m(i,j) = this->operator()(rows-i-1,j); + } + } + return m; +} + +template +MatrixND MatrixND::bottomRight(int rows, int cols) { + MatrixND m(rows,cols); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + m(i,j) = this->operator()(rows-i-1,cols-j-1); + } + } + return m; +} +template +T MatrixND::cofactor(int row, int col) { + MatrixND m(rows-1,cols-1); + for(int i = 0; i < rows-1; i++) { + for(int j = 0; j < cols-1; j++) { + if(i < row && j < col) { + m(i,j) = this->operator()(i,j); + } + else if(i < row && j >= col) { + m(i,j) = this->operator()(i,j+1); + } + else if(i >= row && j < col) { + m(i,j) = this->operator()(i+1,j); + } + else { + m(i,j) = this->operator()(i+1,j+1); + } + } + } + return m.determinant()*pow(-1,row+col); +} +template +double MatrixND::colwiseMean(int col) { + double sum = 0; + for(int i = 0; i < rows; i++) { + sum += data[i*cols + col]; + } + return sum/(rows); +} + +template +double MatrixND::rowwiseMean(int row) { + double sum = 0; + for(int i = 0; i < cols; i++) { + sum += data[row*cols + i]; + } + return sum/(cols); +} + +template +double MatrixND::colwiseStd(int col) { + double mean = this->colwiseMean(col); + double sum = 0; + for(int i = 0; i < rows; i++) { + sum += pow(data[i*cols + col] - mean,2); + } + return sqrt(sum/(rows)); +} + +template +double MatrixND::rowwiseStd(int row) { + double mean = this->rowwiseMean(row); + double sum = 0; + for(int i = 0; i < cols; i++) { + sum += pow(data[row*cols + i] - mean,2); + } + return sqrt(sum/(cols)); +} + + +template +double MatrixND::colwiseCov(int col) { + double mean = this->colwiseMean(col); + double sum = 0; + for(int i = 0; i < rows; i++) { + sum += (data[i*cols + col] - mean)*(data[i*cols + col] - mean); + } + return sum/(rows); +} + +template +double MatrixND::rowwiseCov(int row) { + double mean = this->rowwiseMean(row); + double sum = 0; + for(int i = 0; i < cols; i++) { + sum += (data[row*cols + i] - mean)*(data[row*cols + i] - mean); + } + return sum/(cols); +} + +template +double MatrixND::colwiseCorr(int col) { + double cov = this->colwiseCov(col); + double std = this->colwiseStd(col); + return cov/(std*std); +} + +template +double MatrixND::rowwiseCorr(int row) { + double cov = this->rowwiseCov(row); + double std = this->rowwiseStd(row); + return cov/(std*std); +} + +template +double MatrixND::colwiseSum(int col) { + double sum = 0; + for(int i = 0; i < rows; i++) { + sum += data[i*cols + col]; + } + return sum; +} + +template +double MatrixND::rowwiseSum(int row) { + double sum = 0; + for(int i = 0; i < cols; i++) { + sum += data[row*cols + i]; + } + return sum; +} + +template +MatrixND MatrixND::rowwiseTopRows(int rows) { + MatrixND m(rows,cols); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + m(i,j) = this->operator()(i,j); + } + } + return m; +} + +template +MatrixND MatrixND::colwiseTopRows(int rows) { + MatrixND m(rows,cols); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + m(i,j) = this->operator()(j,i); + } + } + return m; +} + +template +MatrixND MatrixND::colwiseBottomRows(int rows) { + MatrixND m(rows,cols); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + m(i,j) = this->operator()(cols-j-1,i); + } + } + return m; +} + +template +MatrixND MatrixND::rowwiseBottomRows(int rows) { + MatrixND m(rows,cols); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + m(i,j) = this->operator()(rows-i-1,j); + } + } + return m; +} + +template +vector MatrixND::colwise(int col) { + vector v(rows); + for(int i = 0; i < rows; i++) { + v[i] = data[i*cols + col]; + } + return v; +} + +template +vector MatrixND::rowwise(int row) { + vector v(cols); + for(int i = 0; i < cols; i++) { + v[i] = data[row*cols + i]; + } + return v; +} +template +int MatrixND::findRowWithMaxElement(int col, int row) { + T tempValue = data[get(row, col)]; + int rowIndex = row; + for (int k=row+1; k fabs(tempValue)) + { + rowIndex = k; + tempValue = data[get(k, col)]; + } + } + return rowIndex; +} + +template +T MatrixND::max() { + T max = data[0]; + for(int i = 0; i < rows*cols; i++) { + if(data[i] > max) { + max = data[i]; + } + } + return max; +} +template +int MatrixND::maxRow() { + T max = data[0]; + int row = 0; + for(int i = 0; i < rows*cols; i++) { + if(data[i] > max) { + max = data[i]; + row = i/cols; + } + } + return row; +} +template +int MatrixND::maxCol() { + T max = data[0]; + int col = 0; + for(int i = 0; i < rows*cols; i++) { + if(data[i] > max) { + max = data[i]; + col = i%cols; + } + } + return col; +} +template +T MatrixND::min() { + T min = data[0]; + for(int i = 0; i < rows*cols; i++) { + if(data[i] < min) { + min = data[i]; + } + } + return min; +} +template +int MatrixND::minRow() { + T min = data[0]; + int row = 0; + for(int i = 0; i < rows*cols; i++) { + if(data[i] < min) { + min = data[i]; + row = i/cols; + } + } + return row; +} +template +int MatrixND::minCol() { + T min = data[0]; + int col = 0; + for(int i = 0; i < rows*cols; i++) { + if(data[i] < min) { + min = data[i]; + col = i%cols; + } + } + return col; +} + +template +T MatrixND::maxRow(int row) { + T max = data[row*cols]; + for(int i = 0; i < cols; i++) { + if(data[row*cols + i] > max) { + max = data[row*cols + i]; + } + } + return max; +} + +template +T MatrixND::minRow(int row) { + T min = data[row*cols]; + for(int i = 0; i < cols; i++) { + if(data[row*cols + i] < min) { + min = data[row*cols + i]; + } + } + return min; +} + +template +T MatrixND::maxCol(int col) { + T max = data[col]; + for(int i = 0; i < rows; i++) { + if(data[i*cols + col] > max) { + max = data[i*cols + col]; + } + } + return max; +} + +template +T MatrixND::minCol(int col) { + T min = data[col]; + for(int i = 0; i < rows; i++) { + if(data[i*cols + col] < min) { + min = data[i*cols + col]; + } + } + return min; +} +template +MatrixND MatrixND::rowwise() { + MatrixND m(rows,cols); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + m(i,j) = this->operator()(i,j); + } + } + return m; +} + +template +MatrixND MatrixND::colwise() { + MatrixND m(rows,1); + for(int i = 0; i < rows; i++) { + for(int j = 0; j < cols; j++) { + m(i,0) = data[i*cols + j]; + } + } + return m; +} + diff --git a/Momentum.h b/Momentum.h index 778b809..67a417b 100644 --- a/Momentum.h +++ b/Momentum.h @@ -1,452 +1,452 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_MOMENTUM_H -#define PHYSICSFORMULA_MOMENTUM_H -#include -#include -#include -#include "VectorND.h" -using namespace std; -typedef long double ld; - -/** - * @class Momentum - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @date 10/26/2020 - */ -static int momentum_objectCount = 0; -class Momentum -{ -public: - static void show_rotationalMotion_objectCount() { std::cout << "\nrotational motion Count: " << momentum_objectCount << endl; } - static int get_rotationalMotion_objectCount() { return momentum_objectCount; } - Momentum* _momentumPtr; - Momentum() - { - _momentumPtr = nullptr; - countIncrease(); - } - - /** - * @brief calculates the momentum of a system from mass and velocity (p = mv) - * @param mass should be in kg - * @param velocity as m/s - * @returns the momentum of a system - */ - ld static momentum(const ld mass, const ld velocity) - { - return mass * velocity; - } - - /** - * @brief calculates the linear momentum - * p = (mass * distance) / time - * @param mass in kg - * @param distance in meters - * @param time is seconds - * @returns linear momentum kgm/s - */ - ld static momentumLinear(const ld mass, const ld distance, const ld time) - { - return (mass * distance) / time; - } - - /** - * @brief calculates the change in momentum (impulse) - * @param avgNetForce is the average net external force - * @param changeInTime is the time the force acts - * @returns impulse (change in momentum) - */ - ld static impulse(const ld avgNetForce, const ld changeInTime) - { - return avgNetForce * changeInTime; - } - - /** - * @brief computes the average net force exerted on a system - * Fn = (mass * velocity) / time - * @param mass in kg - * @param velocity in m/s - * @param time in seconds - * @returns the net force in N (newtons) - */ - ld static newtons2ndLawAsMomentum(const ld mass, const ld velocity, const ld time) - { - return (mass * velocity) / time; - } - - /** - * @brief computes the net force using mass, velocity and the distance the force is applied - * Fn = mass * (velocity * velocity) / (2 * distance) - * @param mass in kg - * @param velocity in m/s - * @param distance in meters - * @returns the net force in N (newtons) - */ - ld static forceNetUsingDistance(const ld mass, const ld velocity, const ld distance) - { - return (mass * (velocity * velocity) / (2 * distance)); - } - - /** - * @brief calculates the ratio of two numbers - * @param ratioOf is the ratio of something to - * @param to is the something the ratio is of - * @returns the ratio of something to something else - */ - ld static ratio(const ld ratioOf, const ld to) - { - return ratioOf / to; - } - - /** - * @brief computes the mass of a system - * m = momentum/velocity - * @param momentum - * @param velocity - * @returns mass - */ - ld static mass(const ld momentum, const ld velocity) - { - return momentum / velocity; - } - - /** - * @brief calculates the mass of an object when the final velocity, the force and the time - * m =(force * time) / velocity - * @param force in N (newtons) - * @param time is seconds - * @param velocity in m/s - * @returns the mass in kg - */ - ld static mass(const ld force, const ld time, const ld velocity) - { - return (force * time) / velocity; - } - - /** - * @brief calculates the mass of a still object that is pushing off another object on a frictionless - * surface, such as two ice skaters pushing off each other - * - */ - ld static mass2FromMass1(const ld knownMass, const ld velocityForKnowMass, const ld velocityUnkownMass) - { - return (knownMass * velocityForKnowMass) / velocityUnkownMass; - } - - /** - * @brief computes the velocity of a system - * @param momentum the momentum - * @param mass the mass - * @returns velocity - */ - ld static velocity(const ld momentum, const ld mass) - { - return momentum / mass; - } - - /** - * @brief calculates the final velocity of a system - * Vf = (impulse + mass * velocityInitial) / mass - * @param impulse in kgm/s - * @param mass in kg - * @param velocityInitial in m/s - * @returns the final velocity in m/s - */ - ld static velocityFinal(const ld impulse, const ld mass, const ld velocityInitial = 0) - { - return (impulse + mass * velocityInitial) / mass; - } - - /** - * @brief calculates the velocity of a mass in a two mass system where one velocity and masses are known - * Vb = (mass_a * velocity_a) / mass_b - * @param mass_a in kg - * @param mass_b in kg is the mass of the unknown velocity - * @param velocity_a in m/s - * @returns the velocity of the second mass - */ - ld static velocityBFinalMass(const ld mass_a, const ld mass_b, const ld velocity_a) - { - return (mass_a * velocity_a) / mass_b; - } - - /** - * @brief calculates the velocity of a mass in a two mass system where one velocity and masses are known - * Vf = ((force_b*time) + (mass_a*velocity_a))/(mass_a); - * @param mass_a in kg - * @param velocity_a in N (newtons) - * @param force_b in m/s - * @param time in seconds - * @returns the velocity - * - */ - ld static velocityBfinalForce(const ld mass_a, const ld velocity_a, const ld force_b, const ld time ) - { - return ((force_b * time) + (mass_a * velocity_a)) / (mass_a); - } - - /** - * @brief calculates the time it takes to impact a system a certain distance given a starting - * velocity and assuming the final velocity is 0 - * t = (2 * distance) / (velocity_i + velocity_f) - * @param velocity_i is the initial velocity of the object - * @param distance is the amount of distance something is being impacted such as a nail being - * driven into wood - * @param velocity_f is the final velocity and it is 0 by default - * @returns the time it takes to impact the system a given distance - */ - ld static timeImpactDuration(const ld velocity_i, const ld distance, const ld velocity_f = 0) - { - return (2 * distance) / (velocity_i + velocity_f); - } - - /** - * @brief computes the time for an object to stop given its mass, velocity, and stopping force - * t = (mass * velocity) / stoppingForce - * @param mass in kg - * @param velocity in m/s - * @param stoppingForce in N (newtons) - * @returns the time to stop in seconds - */ - ld static timeToBringToRest(const ld mass, const ld velocity, const ld stoppingForce) - { - return (mass * velocity) / stoppingForce; - } - - /** - * @brief calculates the y component of and angled velocity vector - * @param v is the magnitude of the velocity vector - * @param theta is the angle opposite of the y component in question - * @param y_vector90 is any additional 90 degree magnitude that may need to be added. - * defaulted to 0 - * @returns the magnitude of the y component of a vector - */ - ld static velocityVectorY(const ld v, const ld theta, const ld y_vector90 = 0) - { - return v * sin(theta * RADIAN) + y_vector90; - } - - /** - * @brief calculates the x component of and angled velocity vector - * @param v is the magnitude of the velocity vector - * @param theta is the angle opposite of the x component in question - * @param x_vector180 is any additional 180 degree magnitude that may need to be added. - * defaulted to 0 - * @returns the magnitude of the x component of a vector - */ - ld static velocityVectorX(const ld v, const ld theta, const ld x_vector180 = 0) - { - return v * cos(theta * RADIAN) + x_vector180; - } - - /** - * @brief calculates the final velocity of two masses colliding and forming one moving mass of debris - * @param mass_a in kg - * @param v_a velocity of mass a in m/s - * @param mass_b in kg - * @param v_b velocity of mass_b in m/s - * @returns the velocity of the colliding masses - */ - ld static collisioninPerfectlyInelasticFinalVelocity2movingMasses(const ld mass_a, const ld v_a, const ld mass_b, const ld v_b) - { - return ((mass_a * v_a) + (mass_b * v_b)) / (mass_a + mass_b); - } - - /** - * @brief Returns the velocities following an elastic collision with one still mass - * @param movingMass1 in kg - * @param stillMass in kg - * @param v1 in m/s is the velocity of mass1 - * @returns vector - */ - std::vector static collisionElasticVector(const ld movingMass1, const ld stillMass, const ld v1) - { - vector velocities = { 0.0, 0.0 }; - velocities[0] = (v1 * (movingMass1 - stillMass)) / (movingMass1 + stillMass); - velocities[1] = v1 - abs(velocities[0]); - return velocities; - } - - /** - * @brief Returns the final velocity of a elastic collision between two masses one being still - * @param mm1 is the moving objects mass in kg - * @param v is the moving masses velocity m/s - * @param sm is the still mass that gets collided into - * @returns final velocity - */ - ld static collisionElasticFinalVelocity(const ld mm1, const ld v, const ld sm) - { - return collisionElasticVector(mm1, sm, v)[1] / 2; - } - - /** - * @brief calculates the final velocities of an approximately elastic collision where one mass is still but in - * a neutral state that is movable and the impact causes two seperate final velocities - */ - std::vector static collisionApproximatelyElastic(const ld m1, const ld m2, const ld v1) - { - vector velocityResults = {0.0, 0.0}; // - velocityResults[0] = ((2 * m1 * v1) / (m1 + m2)); - velocityResults[1] = (v1 * (m1 - m2)) / (m1 + m2); - return velocityResults; - } - - /** - * @brief Returns the starting velocity of a mass involved in a totally inelastic collision with another mass, - * coming from perpendicular directions and then forming one mass with one velocity facing a known angle theta - * @param m1 is the mass of object 1 in kg - * @param v1 is the starting velocity of m1 in m/s - * @param m2 is the mass of the second object in kg - * @param theta is the angle of the new direction the masses are going after the collision - * @return the initial velocity of m2 - * - */ - ld static collisionTotallyInelasticPerpendicular_V2initial(const ld m1, const ld v1, const ld m2, const ld theta) - { - return ((m1 * v1 * tan(theta * RADIAN))) / (m2); - } - - /** - * @brief Returns the final velocity of two masses involved in a totally inelastic collision coming from perpendicular - * directions and forming an angle theta which is known. - * @param m1 is the mass of object 1 in kg - * @param v1 is the starting velocity of m1 in m/s - * @param m2 is the mass of the second object in kg - * @param theta is the angle of the new direction the masses are going after the collision - * @return the final velocity of the collision - */ - ld static collisionTotallyInelasticPerpendicular_Vfinal(const ld m1, const ld v1, const ld m2, const ld theta) - { - return (m1 * v1) / ((cos(theta * RADIAN) * m1) + (cos(theta * RADIAN) * m2)); - } - - /** - * @brief calculates the starting velocity of mass2 in a totally inelastic collision going in the same direction when the momentum start and final of - * mass 1 is known - * @param mass1 in kg is the mass with the known momentum - * @param mass2 in kg is the mass object with unknowns - * @param m1StartingMomentum - * @param m1EndingMomentum - * @return the starting velocity of mass2 - */ - ld static collisionTotallyInelasticSameDirection_V2initial(const ld mass1, const ld mass2, const ld m1StartingMomentum, const ld m1EndingMomentum) - { - const ld m1vs = m1StartingMomentum/mass1; - const ld m1vf = m1EndingMomentum / mass1; - - - return ((mass1 * m1vf) + (mass2 * m1vf) - (mass1 * m1vs)) / (mass2); - - } - - /** - * @brief Returns a vector with the values of recoil velocity, internal kinetic energy of system, - * kinetic energy of system after system, and the total change of energy in system - * @param movingMass1 in kg - * @param stillMass in kg - * @param v1 is the velocity of the movingMass1 - * @returns vector - */ - std::vector static collisionInelastic(const ld movingMass1, const ld stillMass, const ld v1) - { - const ld recoilVelocity = (movingMass1) / (movingMass1 + stillMass) * v1; - const ld internalKineticEnergySystem = .5 * (movingMass1) * (v1 * v1); - const ld afterCollisionKEofSystem = .5 * (movingMass1 + stillMass) * (recoilVelocity * recoilVelocity); - const ld totalChangeInSystem = afterCollisionKEofSystem - internalKineticEnergySystem; - vector results = { recoilVelocity, internalKineticEnergySystem, afterCollisionKEofSystem, totalChangeInSystem }; - - return results; - } - - /** - * @brief Returns the velocity of a rocket launch when lift mass, ehaust velocity and fuel burn rate is known - * @param liftMass in kg - * @param exhaustVelocity in m/s - * @param fuelBurnRate in kg/s - * @returns acceleration of rocket - */ - ld static rocketLaunchAcceleration(const ld liftMass, const ld exhaustVelocity, const ld fuelBurnRate) - { - return ((exhaustVelocity / liftMass) * (fuelBurnRate)) - _Ga_; - } - - /** - * @brief Returns the impact force experienced by a crash test dummy by the seat belt - * @param mass in kg - * @param v in m/s is the velocity of the moving object before coming to rest v=0 - * @param time in seconds - * @returns Force in newtons of the impact - */ - ld static forceImpact(const ld mass, const ld v, const ld time) - { - return (-(mass)*v) / (time); - } - - /** - * @brief Returns the initial speed of a projectile as it launches from ground level at a particular angle - * and returns to ground level a certain distance away - * Vi = sqrt((distance * _Ga_) / (2 * cos(angle * RADIAN) * sin(angle * RADIAN))) - * @param distance - * @param angle - * @returns the initial launch speed - */ - ld static projectileLaunchSpeed(const ld distance, const ld angle) - { - return sqrt((distance * _Ga_) / (2 * cos(angle * RADIAN) * sin(angle * RADIAN))); - } - - /** - * @brief Returns the total amount of fuel mass loss a projectile would need to achieve the specified - * launch speed %loss = 1 - exp(-projectileLaunchSpeed / fuelEjectionSpeed) - * @param projectileLaunchSpeed in m/s - * @param fuelEjectionSpeed in m/s - * @returns mass loss % - */ - ld static massLossOfProjectile(const ld projectileLaunchSpeed, const ld fuelEjectionSpeed) - { - return 1 - exp(-projectileLaunchSpeed / fuelEjectionSpeed); - } - - /** - * @brief Returns the Range based off of velocity, angle and total time in seconds - * @param v in m/s is the velocity or initial launch speed - * @param angle is the angle of launch - * @param time in seconds is the time in flight - * @returns range in meters - */ - ld static rangeOfProjectile(const ld v, const ld angle, const ld time) - { - return v * cos(angle * RADIAN) * time; - } - - /** - * @brief Returns the amount a spring gets compressed when on a frictionless surface and a moving mass collides with it - * @param sringAttachedMass is the mass of the objects that the spring is attached to - * @param springConstant is the compression force of the spring and is usually a given value to plug it but can be found when the - * spring force is known and over some distance in which that force is acting. k = F/(change in distance) - * @param actingMass in kg is the mass of the object colliding with the spring mass - * @param actingVelocity is the velocity of the actingMass in m/s - */ - ld static springCompressionAmount(const ld sringAttachedMass,const ld springConstant, const ld actingMass, const ld actingVelocity) - { - return ((actingMass * actingVelocity) / sqrt((springConstant * (actingMass + sringAttachedMass)))); - } - - - - ~Momentum() - { - delete _momentumPtr; - } - -private: - - static void countIncrease() { momentum_objectCount += 1; } - static void countDecrease() { momentum_objectCount -= 1; } - -}; -#endif //PHYSICSFORMULA_MOMENTUM_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_MOMENTUM_H +#define PHYSICSFORMULA_MOMENTUM_H +#include +#include +#include +#include "VectorND.h" +using namespace std; +typedef long double ld; + +/** + * @class Momentum + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @date 10/26/2020 + */ +static int momentum_objectCount = 0; +class Momentum +{ +public: + static void show_rotationalMotion_objectCount() { std::cout << "\nrotational motion Count: " << momentum_objectCount << endl; } + static int get_rotationalMotion_objectCount() { return momentum_objectCount; } + Momentum* _momentumPtr; + Momentum() + { + _momentumPtr = nullptr; + countIncrease(); + } + + /** + * @brief calculates the momentum of a system from mass and velocity (p = mv) + * @param mass should be in kg + * @param velocity as m/s + * @returns the momentum of a system + */ + ld static momentum(const ld mass, const ld velocity) + { + return mass * velocity; + } + + /** + * @brief calculates the linear momentum + * p = (mass * distance) / time + * @param mass in kg + * @param distance in meters + * @param time is seconds + * @returns linear momentum kgm/s + */ + ld static momentumLinear(const ld mass, const ld distance, const ld time) + { + return (mass * distance) / time; + } + + /** + * @brief calculates the change in momentum (impulse) + * @param avgNetForce is the average net external force + * @param changeInTime is the time the force acts + * @returns impulse (change in momentum) + */ + ld static impulse(const ld avgNetForce, const ld changeInTime) + { + return avgNetForce * changeInTime; + } + + /** + * @brief computes the average net force exerted on a system + * Fn = (mass * velocity) / time + * @param mass in kg + * @param velocity in m/s + * @param time in seconds + * @returns the net force in N (newtons) + */ + ld static newtons2ndLawAsMomentum(const ld mass, const ld velocity, const ld time) + { + return (mass * velocity) / time; + } + + /** + * @brief computes the net force using mass, velocity and the distance the force is applied + * Fn = mass * (velocity * velocity) / (2 * distance) + * @param mass in kg + * @param velocity in m/s + * @param distance in meters + * @returns the net force in N (newtons) + */ + ld static forceNetUsingDistance(const ld mass, const ld velocity, const ld distance) + { + return (mass * (velocity * velocity) / (2 * distance)); + } + + /** + * @brief calculates the ratio of two numbers + * @param ratioOf is the ratio of something to + * @param to is the something the ratio is of + * @returns the ratio of something to something else + */ + ld static ratio(const ld ratioOf, const ld to) + { + return ratioOf / to; + } + + /** + * @brief computes the mass of a system + * m = momentum/velocity + * @param momentum + * @param velocity + * @returns mass + */ + ld static mass(const ld momentum, const ld velocity) + { + return momentum / velocity; + } + + /** + * @brief calculates the mass of an object when the final velocity, the force and the time + * m =(force * time) / velocity + * @param force in N (newtons) + * @param time is seconds + * @param velocity in m/s + * @returns the mass in kg + */ + ld static mass(const ld force, const ld time, const ld velocity) + { + return (force * time) / velocity; + } + + /** + * @brief calculates the mass of a still object that is pushing off another object on a frictionless + * surface, such as two ice skaters pushing off each other + * + */ + ld static mass2FromMass1(const ld knownMass, const ld velocityForKnowMass, const ld velocityUnkownMass) + { + return (knownMass * velocityForKnowMass) / velocityUnkownMass; + } + + /** + * @brief computes the velocity of a system + * @param momentum the momentum + * @param mass the mass + * @returns velocity + */ + ld static velocity(const ld momentum, const ld mass) + { + return momentum / mass; + } + + /** + * @brief calculates the final velocity of a system + * Vf = (impulse + mass * velocityInitial) / mass + * @param impulse in kgm/s + * @param mass in kg + * @param velocityInitial in m/s + * @returns the final velocity in m/s + */ + ld static velocityFinal(const ld impulse, const ld mass, const ld velocityInitial = 0) + { + return (impulse + mass * velocityInitial) / mass; + } + + /** + * @brief calculates the velocity of a mass in a two mass system where one velocity and masses are known + * Vb = (mass_a * velocity_a) / mass_b + * @param mass_a in kg + * @param mass_b in kg is the mass of the unknown velocity + * @param velocity_a in m/s + * @returns the velocity of the second mass + */ + ld static velocityBFinalMass(const ld mass_a, const ld mass_b, const ld velocity_a) + { + return (mass_a * velocity_a) / mass_b; + } + + /** + * @brief calculates the velocity of a mass in a two mass system where one velocity and masses are known + * Vf = ((force_b*time) + (mass_a*velocity_a))/(mass_a); + * @param mass_a in kg + * @param velocity_a in N (newtons) + * @param force_b in m/s + * @param time in seconds + * @returns the velocity + * + */ + ld static velocityBfinalForce(const ld mass_a, const ld velocity_a, const ld force_b, const ld time ) + { + return ((force_b * time) + (mass_a * velocity_a)) / (mass_a); + } + + /** + * @brief calculates the time it takes to impact a system a certain distance given a starting + * velocity and assuming the final velocity is 0 + * t = (2 * distance) / (velocity_i + velocity_f) + * @param velocity_i is the initial velocity of the object + * @param distance is the amount of distance something is being impacted such as a nail being + * driven into wood + * @param velocity_f is the final velocity and it is 0 by default + * @returns the time it takes to impact the system a given distance + */ + ld static timeImpactDuration(const ld velocity_i, const ld distance, const ld velocity_f = 0) + { + return (2 * distance) / (velocity_i + velocity_f); + } + + /** + * @brief computes the time for an object to stop given its mass, velocity, and stopping force + * t = (mass * velocity) / stoppingForce + * @param mass in kg + * @param velocity in m/s + * @param stoppingForce in N (newtons) + * @returns the time to stop in seconds + */ + ld static timeToBringToRest(const ld mass, const ld velocity, const ld stoppingForce) + { + return (mass * velocity) / stoppingForce; + } + + /** + * @brief calculates the y component of and angled velocity vector + * @param v is the magnitude of the velocity vector + * @param theta is the angle opposite of the y component in question + * @param y_vector90 is any additional 90 degree magnitude that may need to be added. + * defaulted to 0 + * @returns the magnitude of the y component of a vector + */ + ld static velocityVectorY(const ld v, const ld theta, const ld y_vector90 = 0) + { + return v * sin(theta * RADIAN) + y_vector90; + } + + /** + * @brief calculates the x component of and angled velocity vector + * @param v is the magnitude of the velocity vector + * @param theta is the angle opposite of the x component in question + * @param x_vector180 is any additional 180 degree magnitude that may need to be added. + * defaulted to 0 + * @returns the magnitude of the x component of a vector + */ + ld static velocityVectorX(const ld v, const ld theta, const ld x_vector180 = 0) + { + return v * cos(theta * RADIAN) + x_vector180; + } + + /** + * @brief calculates the final velocity of two masses colliding and forming one moving mass of debris + * @param mass_a in kg + * @param v_a velocity of mass a in m/s + * @param mass_b in kg + * @param v_b velocity of mass_b in m/s + * @returns the velocity of the colliding masses + */ + ld static collisioninPerfectlyInelasticFinalVelocity2movingMasses(const ld mass_a, const ld v_a, const ld mass_b, const ld v_b) + { + return ((mass_a * v_a) + (mass_b * v_b)) / (mass_a + mass_b); + } + + /** + * @brief Returns the velocities following an elastic collision with one still mass + * @param movingMass1 in kg + * @param stillMass in kg + * @param v1 in m/s is the velocity of mass1 + * @returns vector + */ + std::vector static collisionElasticVector(const ld movingMass1, const ld stillMass, const ld v1) + { + vector velocities = { 0.0, 0.0 }; + velocities[0] = (v1 * (movingMass1 - stillMass)) / (movingMass1 + stillMass); + velocities[1] = v1 - abs(velocities[0]); + return velocities; + } + + /** + * @brief Returns the final velocity of a elastic collision between two masses one being still + * @param mm1 is the moving objects mass in kg + * @param v is the moving masses velocity m/s + * @param sm is the still mass that gets collided into + * @returns final velocity + */ + ld static collisionElasticFinalVelocity(const ld mm1, const ld v, const ld sm) + { + return collisionElasticVector(mm1, sm, v)[1] / 2; + } + + /** + * @brief calculates the final velocities of an approximately elastic collision where one mass is still but in + * a neutral state that is movable and the impact causes two seperate final velocities + */ + std::vector static collisionApproximatelyElastic(const ld m1, const ld m2, const ld v1) + { + vector velocityResults = {0.0, 0.0}; // + velocityResults[0] = ((2 * m1 * v1) / (m1 + m2)); + velocityResults[1] = (v1 * (m1 - m2)) / (m1 + m2); + return velocityResults; + } + + /** + * @brief Returns the starting velocity of a mass involved in a totally inelastic collision with another mass, + * coming from perpendicular directions and then forming one mass with one velocity facing a known angle theta + * @param m1 is the mass of object 1 in kg + * @param v1 is the starting velocity of m1 in m/s + * @param m2 is the mass of the second object in kg + * @param theta is the angle of the new direction the masses are going after the collision + * @return the initial velocity of m2 + * + */ + ld static collisionTotallyInelasticPerpendicular_V2initial(const ld m1, const ld v1, const ld m2, const ld theta) + { + return ((m1 * v1 * tan(theta * RADIAN))) / (m2); + } + + /** + * @brief Returns the final velocity of two masses involved in a totally inelastic collision coming from perpendicular + * directions and forming an angle theta which is known. + * @param m1 is the mass of object 1 in kg + * @param v1 is the starting velocity of m1 in m/s + * @param m2 is the mass of the second object in kg + * @param theta is the angle of the new direction the masses are going after the collision + * @return the final velocity of the collision + */ + ld static collisionTotallyInelasticPerpendicular_Vfinal(const ld m1, const ld v1, const ld m2, const ld theta) + { + return (m1 * v1) / ((cos(theta * RADIAN) * m1) + (cos(theta * RADIAN) * m2)); + } + + /** + * @brief calculates the starting velocity of mass2 in a totally inelastic collision going in the same direction when the momentum start and final of + * mass 1 is known + * @param mass1 in kg is the mass with the known momentum + * @param mass2 in kg is the mass object with unknowns + * @param m1StartingMomentum + * @param m1EndingMomentum + * @return the starting velocity of mass2 + */ + ld static collisionTotallyInelasticSameDirection_V2initial(const ld mass1, const ld mass2, const ld m1StartingMomentum, const ld m1EndingMomentum) + { + const ld m1vs = m1StartingMomentum/mass1; + const ld m1vf = m1EndingMomentum / mass1; + + + return ((mass1 * m1vf) + (mass2 * m1vf) - (mass1 * m1vs)) / (mass2); + + } + + /** + * @brief Returns a vector with the values of recoil velocity, internal kinetic energy of system, + * kinetic energy of system after system, and the total change of energy in system + * @param movingMass1 in kg + * @param stillMass in kg + * @param v1 is the velocity of the movingMass1 + * @returns vector + */ + std::vector static collisionInelastic(const ld movingMass1, const ld stillMass, const ld v1) + { + const ld recoilVelocity = (movingMass1) / (movingMass1 + stillMass) * v1; + const ld internalKineticEnergySystem = .5 * (movingMass1) * (v1 * v1); + const ld afterCollisionKEofSystem = .5 * (movingMass1 + stillMass) * (recoilVelocity * recoilVelocity); + const ld totalChangeInSystem = afterCollisionKEofSystem - internalKineticEnergySystem; + vector results = { recoilVelocity, internalKineticEnergySystem, afterCollisionKEofSystem, totalChangeInSystem }; + + return results; + } + + /** + * @brief Returns the velocity of a rocket launch when lift mass, ehaust velocity and fuel burn rate is known + * @param liftMass in kg + * @param exhaustVelocity in m/s + * @param fuelBurnRate in kg/s + * @returns acceleration of rocket + */ + ld static rocketLaunchAcceleration(const ld liftMass, const ld exhaustVelocity, const ld fuelBurnRate) + { + return ((exhaustVelocity / liftMass) * (fuelBurnRate)) - _Ga_; + } + + /** + * @brief Returns the impact force experienced by a crash test dummy by the seat belt + * @param mass in kg + * @param v in m/s is the velocity of the moving object before coming to rest v=0 + * @param time in seconds + * @returns Force in newtons of the impact + */ + ld static forceImpact(const ld mass, const ld v, const ld time) + { + return (-(mass)*v) / (time); + } + + /** + * @brief Returns the initial speed of a projectile as it launches from ground level at a particular angle + * and returns to ground level a certain distance away + * Vi = sqrt((distance * _Ga_) / (2 * cos(angle * RADIAN) * sin(angle * RADIAN))) + * @param distance + * @param angle + * @returns the initial launch speed + */ + ld static projectileLaunchSpeed(const ld distance, const ld angle) + { + return sqrt((distance * _Ga_) / (2 * cos(angle * RADIAN) * sin(angle * RADIAN))); + } + + /** + * @brief Returns the total amount of fuel mass loss a projectile would need to achieve the specified + * launch speed %loss = 1 - exp(-projectileLaunchSpeed / fuelEjectionSpeed) + * @param projectileLaunchSpeed in m/s + * @param fuelEjectionSpeed in m/s + * @returns mass loss % + */ + ld static massLossOfProjectile(const ld projectileLaunchSpeed, const ld fuelEjectionSpeed) + { + return 1 - exp(-projectileLaunchSpeed / fuelEjectionSpeed); + } + + /** + * @brief Returns the Range based off of velocity, angle and total time in seconds + * @param v in m/s is the velocity or initial launch speed + * @param angle is the angle of launch + * @param time in seconds is the time in flight + * @returns range in meters + */ + ld static rangeOfProjectile(const ld v, const ld angle, const ld time) + { + return v * cos(angle * RADIAN) * time; + } + + /** + * @brief Returns the amount a spring gets compressed when on a frictionless surface and a moving mass collides with it + * @param sringAttachedMass is the mass of the objects that the spring is attached to + * @param springConstant is the compression force of the spring and is usually a given value to plug it but can be found when the + * spring force is known and over some distance in which that force is acting. k = F/(change in distance) + * @param actingMass in kg is the mass of the object colliding with the spring mass + * @param actingVelocity is the velocity of the actingMass in m/s + */ + ld static springCompressionAmount(const ld sringAttachedMass,const ld springConstant, const ld actingMass, const ld actingVelocity) + { + return ((actingMass * actingVelocity) / sqrt((springConstant * (actingMass + sringAttachedMass)))); + } + + + + ~Momentum() + { + delete _momentumPtr; + } + +private: + + static void countIncrease() { momentum_objectCount += 1; } + static void countDecrease() { momentum_objectCount -= 1; } + +}; +#endif //PHYSICSFORMULA_MOMENTUM_H diff --git a/MonotonePartition.cpp b/MonotonePartition.cpp index ac92ad1..d5b7167 100644 --- a/MonotonePartition.cpp +++ b/MonotonePartition.cpp @@ -1,300 +1,300 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// -#include "MonotonePartition.h" - -#include -#include -#include - -using namespace rez; - -enum class VERTEX_CATEGORY { - START, - END, - REGULAR, - SPLIT, - MERGE, - INVALID -}; - -VERTEX_CATEGORY categorize_vertex(Vertex2dDCEL* vertex) -{ - Vertex2dDCEL* v_prev = vertex->incident_edge->prev->origin; - Vertex2dDCEL* v_next = vertex->incident_edge->next->origin; - - // Need vertex beside the given one to get the dicission. Return INVALID if one is missing - if (!v_prev || !v_next) - return VERTEX_CATEGORY::INVALID; - - Point2d p_prev = v_prev->point; - Point2d p = vertex->point; - Point2d p_next = v_next->point; - - bool is_left = left(p_prev, p, p_next); - - if (p[Y] > p_prev[Y] && p[Y] > p_next[Y]) - { - if (is_left) - return VERTEX_CATEGORY::START; - else - return VERTEX_CATEGORY::SPLIT; - } - else if (p[Y] < p_prev[Y] && p[Y] < p_next[Y]) - { - if (is_left) - return VERTEX_CATEGORY::END; - else - return VERTEX_CATEGORY::MERGE; - } - else - { - return VERTEX_CATEGORY::REGULAR; - } -} - -struct Vertex2dDCELWrapper { - Vertex2dDCEL* vert; - VERTEX_CATEGORY category; -}; - -struct Edge2dDCELWrapper { - Edge2dDCEL* edge; - Vertex2dDCELWrapper helper; - - Edge2dDCELWrapper(Edge2dDCEL* _edge, Vertex2dDCELWrapper& _helper) { - edge = _edge; - helper = _helper; - orgin = edge->origin->point; - dest = edge->twin->origin->point; - } - - const float computeX(const Point2d& point) const { - float _deno = (dest[Y] - orgin[Y]); - float _x = point[X]; - if (_deno != 0) { - _x = (point[Y] - orgin[Y]) * (dest[X] - orgin[X]) / _deno + orgin[X]; - } - return _x; - } - -private: - Point2d orgin, dest; -}; - -struct Vertex2DWrapperSort { - bool operator()(Vertex2dDCELWrapper& current, Vertex2dDCELWrapper& ref) { - auto cur_pnt = current.vert->point; - auto ref_pnt = ref.vert->point; - if ((cur_pnt[Y] > ref_pnt[Y]) - || (cur_pnt[Y] == ref_pnt[Y]) && (cur_pnt[X] < ref_pnt[X])) - { - return true; - } - return false; - } -}; - -struct SweepLineComparator { - Point2d* point; - SweepLineComparator(Point2d* _point) { - point = _point; - } - - bool operator()(const Edge2dDCELWrapper* _ref1, const Edge2dDCELWrapper* _ref2) const { - return _ref1->computeX(*point) < _ref2->computeX(*point); - } -}; - -// TODO : Check the posibility of Refactoring the code to remove duplicate lines - -static void handle_start_vertices(Vertex2dDCELWrapper& vertex - , std::set& sweep_line - , std::map& edge_mapper, Polygon2d* poly) -{ - Edge2dDCELWrapper* edge = new Edge2dDCELWrapper(vertex.vert->incident_edge, vertex); - sweep_line.insert(edge); - edge_mapper.insert(std::pair(vertex.vert->incident_edge, edge)); -} - -static void handle_end_vertices(Vertex2dDCELWrapper& vertex - , std::set& sweep_line - , std::map& edge_mapper, Polygon2d* poly) -{ - auto edge_wrapper = edge_mapper[vertex.vert->incident_edge->prev]; - auto found = sweep_line.find(edge_wrapper); - auto helper = (*found)->helper; - if (helper.category == VERTEX_CATEGORY::MERGE) - poly->split(vertex.vert, helper.vert); - sweep_line.erase(found); -} - -static void handle_split_vertices(Vertex2dDCELWrapper& vertex - , std::set& sweep_line - , std::map& edge_mapper, Polygon2d* poly) -{ - Edge2dDCELWrapper* edge = new Edge2dDCELWrapper(vertex.vert->incident_edge, vertex); - auto found = sweep_line.lower_bound(edge); - Edge2dDCELWrapper* ej; - if (found == sweep_line.end()) { - if (sweep_line.size() > 0) { - ej = *(--found); - poly->split(vertex.vert, ej->helper.vert); - ej->helper = vertex; - } - } - else if (found != sweep_line.begin()) - { - ej = *(--found); - poly->split(vertex.vert, ej->helper.vert); - ej->helper = vertex; - } - sweep_line.insert(edge); - edge_mapper.insert(std::pair(vertex.vert->incident_edge, edge)); -} - -static void handle_merge_vertices(Vertex2dDCELWrapper& vertex - , std::set& sweep_line - , std::map& edge_mapper, Polygon2d* poly) -{ - auto edge_wrapper = edge_mapper[vertex.vert->incident_edge->prev]; - if (edge_wrapper->helper.category == VERTEX_CATEGORY::MERGE) { - poly->split(vertex.vert, edge_wrapper->helper.vert); - } - - auto found = sweep_line.find(edge_wrapper); - if (found != sweep_line.end()) - sweep_line.erase(found); - - Edge2dDCELWrapper* edge = new Edge2dDCELWrapper(vertex.vert->incident_edge, vertex); - found = sweep_line.lower_bound(edge); - Edge2dDCELWrapper* ej; - if (found == sweep_line.end()) { - if (sweep_line.size() > 0) { - ej = *(--found); - if (ej->helper.category == VERTEX_CATEGORY::MERGE) - poly->split(vertex.vert, ej->helper.vert); - ej->helper = vertex; - } - } - else if (found != sweep_line.begin()) - { - ej = *(--found); - if (ej->helper.category == VERTEX_CATEGORY::MERGE) - poly->split(vertex.vert, ej->helper.vert); - ej->helper = vertex; - } -} - -static void handle_regular_vertices(Vertex2dDCELWrapper& vertex - , std::set& sweep_line - , std::map& edge_mapper, Polygon2d* poly) -{ - // Check whether the interior of the polygon lies right to vertex point - auto prev_y = vertex.vert->incident_edge->prev->origin->point[Y]; - auto current_y = vertex.vert->point[Y]; - auto next_y = vertex.vert->incident_edge->next->origin->point[Y]; - - Edge2dDCELWrapper* edge = new Edge2dDCELWrapper(vertex.vert->incident_edge, vertex); - - if (prev_y >= current_y && current_y >= next_y) { - auto edge_wrapper = edge_mapper[vertex.vert->incident_edge->prev]; - if (edge_wrapper->helper.category == VERTEX_CATEGORY::MERGE) { - poly->split(vertex.vert, edge_wrapper->helper.vert); - } - - auto found = sweep_line.find(edge_wrapper); - if (found != sweep_line.end()) - sweep_line.erase(found); - - sweep_line.insert(edge); - edge_mapper.insert(std::pair(vertex.vert->incident_edge, - edge)); - } - else { - auto found = sweep_line.lower_bound(edge); - Edge2dDCELWrapper* ej; - if (found == sweep_line.end()) { - if (sweep_line.size() > 0) { - ej = *(--found); - if (ej->helper.category == VERTEX_CATEGORY::MERGE) - poly->split(vertex.vert, ej->helper.vert); - ej->helper = vertex; - } - } - else if (found != sweep_line.begin()) - { - ej = *(found--); - if (ej->helper.category == VERTEX_CATEGORY::MERGE) - poly->split(vertex.vert, ej->helper.vert); - ej->helper = vertex; - } - } -} - - -void rez::get_monotone_polygons(Polygon2d* poly, std::vector& mono_polies) -{ - std::vector vertices; - for (auto vertex : poly->getVertexList()) { - vertices.push_back(Vertex2dDCELWrapper{ vertex,categorize_vertex(vertex) }); - } - - std::sort(vertices.begin(), vertices.end(), Vertex2DWrapperSort()); - - Point2d* sweep_point = new Point2d(); - sweep_point->assign(X, vertices[0].vert->point[X]); - sweep_point->assign(Y, vertices[0].vert->point[Y]); - - SweepLineComparator comp(sweep_point); - std::set sweep_line(comp); - std::map edge_mapping; - - for (auto vertex : vertices) - { - sweep_point->assign(X, vertex.vert->point[X]); - sweep_point->assign(Y, vertex.vert->point[Y]); - - switch (vertex.category) - { - case VERTEX_CATEGORY::START: - handle_start_vertices(vertex, sweep_line, edge_mapping, poly); - break; - case VERTEX_CATEGORY::END: - handle_end_vertices(vertex, sweep_line, edge_mapping, poly); - break; - case VERTEX_CATEGORY::REGULAR: - handle_regular_vertices(vertex, sweep_line, edge_mapping, poly); - break; - case VERTEX_CATEGORY::SPLIT: - handle_split_vertices(vertex, sweep_line, edge_mapping, poly); - break; - case VERTEX_CATEGORY::MERGE: - handle_merge_vertices(vertex, sweep_line, edge_mapping, poly); - break; - case VERTEX_CATEGORY::INVALID: - break; - } - } - - std::vector> polygon_pieces_vertices; - - for (auto face_ptr : poly->getFaceList()) { - auto first_edge_ptr = face_ptr->outer; - if (first_edge_ptr) { - std::vector vertices; - vertices.push_back(first_edge_ptr->origin->point); - - auto next_edge_ptr = first_edge_ptr->next; - while (next_edge_ptr != first_edge_ptr) { - vertices.push_back(next_edge_ptr->origin->point); - next_edge_ptr = next_edge_ptr->next; - } - - polygon_pieces_vertices.push_back(vertices); - } - } - - for (auto vertices : polygon_pieces_vertices) - mono_polies.push_back(new Polygon2d(vertices)); +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// +#include "MonotonePartition.h" + +#include +#include +#include + +using namespace rez; + +enum class VERTEX_CATEGORY { + START, + END, + REGULAR, + SPLIT, + MERGE, + INVALID +}; + +VERTEX_CATEGORY categorize_vertex(Vertex2dDCEL* vertex) +{ + Vertex2dDCEL* v_prev = vertex->incident_edge->prev->origin; + Vertex2dDCEL* v_next = vertex->incident_edge->next->origin; + + // Need vertex beside the given one to get the dicission. Return INVALID if one is missing + if (!v_prev || !v_next) + return VERTEX_CATEGORY::INVALID; + + Point2d p_prev = v_prev->point; + Point2d p = vertex->point; + Point2d p_next = v_next->point; + + bool is_left = left(p_prev, p, p_next); + + if (p[Y] > p_prev[Y] && p[Y] > p_next[Y]) + { + if (is_left) + return VERTEX_CATEGORY::START; + else + return VERTEX_CATEGORY::SPLIT; + } + else if (p[Y] < p_prev[Y] && p[Y] < p_next[Y]) + { + if (is_left) + return VERTEX_CATEGORY::END; + else + return VERTEX_CATEGORY::MERGE; + } + else + { + return VERTEX_CATEGORY::REGULAR; + } +} + +struct Vertex2dDCELWrapper { + Vertex2dDCEL* vert; + VERTEX_CATEGORY category; +}; + +struct Edge2dDCELWrapper { + Edge2dDCEL* edge; + Vertex2dDCELWrapper helper; + + Edge2dDCELWrapper(Edge2dDCEL* _edge, Vertex2dDCELWrapper& _helper) { + edge = _edge; + helper = _helper; + orgin = edge->origin->point; + dest = edge->twin->origin->point; + } + + const float computeX(const Point2d& point) const { + float _deno = (dest[Y] - orgin[Y]); + float _x = point[X]; + if (_deno != 0) { + _x = (point[Y] - orgin[Y]) * (dest[X] - orgin[X]) / _deno + orgin[X]; + } + return _x; + } + +private: + Point2d orgin, dest; +}; + +struct Vertex2DWrapperSort { + bool operator()(Vertex2dDCELWrapper& current, Vertex2dDCELWrapper& ref) { + auto cur_pnt = current.vert->point; + auto ref_pnt = ref.vert->point; + if ((cur_pnt[Y] > ref_pnt[Y]) + || (cur_pnt[Y] == ref_pnt[Y]) && (cur_pnt[X] < ref_pnt[X])) + { + return true; + } + return false; + } +}; + +struct SweepLineComparator { + Point2d* point; + SweepLineComparator(Point2d* _point) { + point = _point; + } + + bool operator()(const Edge2dDCELWrapper* _ref1, const Edge2dDCELWrapper* _ref2) const { + return _ref1->computeX(*point) < _ref2->computeX(*point); + } +}; + +// TODO : Check the posibility of Refactoring the code to remove duplicate lines + +static void handle_start_vertices(Vertex2dDCELWrapper& vertex + , std::set& sweep_line + , std::map& edge_mapper, Polygon2d* poly) +{ + Edge2dDCELWrapper* edge = new Edge2dDCELWrapper(vertex.vert->incident_edge, vertex); + sweep_line.insert(edge); + edge_mapper.insert(std::pair(vertex.vert->incident_edge, edge)); +} + +static void handle_end_vertices(Vertex2dDCELWrapper& vertex + , std::set& sweep_line + , std::map& edge_mapper, Polygon2d* poly) +{ + auto edge_wrapper = edge_mapper[vertex.vert->incident_edge->prev]; + auto found = sweep_line.find(edge_wrapper); + auto helper = (*found)->helper; + if (helper.category == VERTEX_CATEGORY::MERGE) + poly->split(vertex.vert, helper.vert); + sweep_line.erase(found); +} + +static void handle_split_vertices(Vertex2dDCELWrapper& vertex + , std::set& sweep_line + , std::map& edge_mapper, Polygon2d* poly) +{ + Edge2dDCELWrapper* edge = new Edge2dDCELWrapper(vertex.vert->incident_edge, vertex); + auto found = sweep_line.lower_bound(edge); + Edge2dDCELWrapper* ej; + if (found == sweep_line.end()) { + if (sweep_line.size() > 0) { + ej = *(--found); + poly->split(vertex.vert, ej->helper.vert); + ej->helper = vertex; + } + } + else if (found != sweep_line.begin()) + { + ej = *(--found); + poly->split(vertex.vert, ej->helper.vert); + ej->helper = vertex; + } + sweep_line.insert(edge); + edge_mapper.insert(std::pair(vertex.vert->incident_edge, edge)); +} + +static void handle_merge_vertices(Vertex2dDCELWrapper& vertex + , std::set& sweep_line + , std::map& edge_mapper, Polygon2d* poly) +{ + auto edge_wrapper = edge_mapper[vertex.vert->incident_edge->prev]; + if (edge_wrapper->helper.category == VERTEX_CATEGORY::MERGE) { + poly->split(vertex.vert, edge_wrapper->helper.vert); + } + + auto found = sweep_line.find(edge_wrapper); + if (found != sweep_line.end()) + sweep_line.erase(found); + + Edge2dDCELWrapper* edge = new Edge2dDCELWrapper(vertex.vert->incident_edge, vertex); + found = sweep_line.lower_bound(edge); + Edge2dDCELWrapper* ej; + if (found == sweep_line.end()) { + if (sweep_line.size() > 0) { + ej = *(--found); + if (ej->helper.category == VERTEX_CATEGORY::MERGE) + poly->split(vertex.vert, ej->helper.vert); + ej->helper = vertex; + } + } + else if (found != sweep_line.begin()) + { + ej = *(--found); + if (ej->helper.category == VERTEX_CATEGORY::MERGE) + poly->split(vertex.vert, ej->helper.vert); + ej->helper = vertex; + } +} + +static void handle_regular_vertices(Vertex2dDCELWrapper& vertex + , std::set& sweep_line + , std::map& edge_mapper, Polygon2d* poly) +{ + // Check whether the interior of the polygon lies right to vertex point + auto prev_y = vertex.vert->incident_edge->prev->origin->point[Y]; + auto current_y = vertex.vert->point[Y]; + auto next_y = vertex.vert->incident_edge->next->origin->point[Y]; + + Edge2dDCELWrapper* edge = new Edge2dDCELWrapper(vertex.vert->incident_edge, vertex); + + if (prev_y >= current_y && current_y >= next_y) { + auto edge_wrapper = edge_mapper[vertex.vert->incident_edge->prev]; + if (edge_wrapper->helper.category == VERTEX_CATEGORY::MERGE) { + poly->split(vertex.vert, edge_wrapper->helper.vert); + } + + auto found = sweep_line.find(edge_wrapper); + if (found != sweep_line.end()) + sweep_line.erase(found); + + sweep_line.insert(edge); + edge_mapper.insert(std::pair(vertex.vert->incident_edge, + edge)); + } + else { + auto found = sweep_line.lower_bound(edge); + Edge2dDCELWrapper* ej; + if (found == sweep_line.end()) { + if (sweep_line.size() > 0) { + ej = *(--found); + if (ej->helper.category == VERTEX_CATEGORY::MERGE) + poly->split(vertex.vert, ej->helper.vert); + ej->helper = vertex; + } + } + else if (found != sweep_line.begin()) + { + ej = *(found--); + if (ej->helper.category == VERTEX_CATEGORY::MERGE) + poly->split(vertex.vert, ej->helper.vert); + ej->helper = vertex; + } + } +} + + +void rez::get_monotone_polygons(Polygon2d* poly, std::vector& mono_polies) +{ + std::vector vertices; + for (auto vertex : poly->getVertexList()) { + vertices.push_back(Vertex2dDCELWrapper{ vertex,categorize_vertex(vertex) }); + } + + std::sort(vertices.begin(), vertices.end(), Vertex2DWrapperSort()); + + Point2d* sweep_point = new Point2d(); + sweep_point->assign(X, vertices[0].vert->point[X]); + sweep_point->assign(Y, vertices[0].vert->point[Y]); + + SweepLineComparator comp(sweep_point); + std::set sweep_line(comp); + std::map edge_mapping; + + for (auto vertex : vertices) + { + sweep_point->assign(X, vertex.vert->point[X]); + sweep_point->assign(Y, vertex.vert->point[Y]); + + switch (vertex.category) + { + case VERTEX_CATEGORY::START: + handle_start_vertices(vertex, sweep_line, edge_mapping, poly); + break; + case VERTEX_CATEGORY::END: + handle_end_vertices(vertex, sweep_line, edge_mapping, poly); + break; + case VERTEX_CATEGORY::REGULAR: + handle_regular_vertices(vertex, sweep_line, edge_mapping, poly); + break; + case VERTEX_CATEGORY::SPLIT: + handle_split_vertices(vertex, sweep_line, edge_mapping, poly); + break; + case VERTEX_CATEGORY::MERGE: + handle_merge_vertices(vertex, sweep_line, edge_mapping, poly); + break; + case VERTEX_CATEGORY::INVALID: + break; + } + } + + std::vector> polygon_pieces_vertices; + + for (auto face_ptr : poly->getFaceList()) { + auto first_edge_ptr = face_ptr->outer; + if (first_edge_ptr) { + std::vector vertices; + vertices.push_back(first_edge_ptr->origin->point); + + auto next_edge_ptr = first_edge_ptr->next; + while (next_edge_ptr != first_edge_ptr) { + vertices.push_back(next_edge_ptr->origin->point); + next_edge_ptr = next_edge_ptr->next; + } + + polygon_pieces_vertices.push_back(vertices); + } + } + + for (auto vertices : polygon_pieces_vertices) + mono_polies.push_back(new Polygon2d(vertices)); } \ No newline at end of file diff --git a/MonotonePartition.h b/MonotonePartition.h index 2d74cf4..f386298 100644 --- a/MonotonePartition.h +++ b/MonotonePartition.h @@ -1,15 +1,15 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_MONOTONEPARTITION_H -#define PHYSICSFORMULA_MONOTONEPARTITION_H -#include -#include "Vector.h" -#include "PolygonDCEL.h" -#include "GeoUtils.h" - -namespace rez { - void get_monotone_polygons(Polygon2d* poly, std::vector& mono_polies); -} -#endif //PHYSICSFORMULA_MONOTONEPARTITION_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_MONOTONEPARTITION_H +#define PHYSICSFORMULA_MONOTONEPARTITION_H +#include +#include "Vector.h" +#include "PolygonDCEL.h" +#include "GeoUtils.h" + +namespace rez { + void get_monotone_polygons(Polygon2d* poly, std::vector& mono_polies); +} +#endif //PHYSICSFORMULA_MONOTONEPARTITION_H diff --git a/Parallelogram.h b/Parallelogram.h index f037b5b..f223cf9 100644 --- a/Parallelogram.h +++ b/Parallelogram.h @@ -1,219 +1,219 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_PARALLELOGRAM_H -#define PHYSICSFORMULA_PARALLELOGRAM_H -/** - * @class Parallelogram - * @details class that represents a Parallelogram object - * @author Ryan Zurrin - * @dateBuilt 11/4/2021 - * @lastEdit 11/4/2021 - */ -#define _USE_MATH_DEFINES -#include -#include -#include - -static int parallelogramObjectCount = 0; -typedef long double ld; - -class Parallelogram -{ - ld base; - ld side_a; - ld height; - ld perimeter; - ld area; - ld angle_A; - ld angle_B; - static auto countIncrease() { parallelogramObjectCount += 1; } - static auto countDecrease() { parallelogramObjectCount -= 1; } - ld calculateBase()const; - ld calculateSideA()const; - ld calculateHeight()const; - ld calculatePerimeter()const; - ld calculateArea()const; - ld calculateAngleA()const; - ld calculateAngleB()const; - -public: - - Parallelogram() - { - base = 0.0; - side_a = 0.0; - height = 0.0; - perimeter = 0.0; - area = 0.0; - angle_A = 0.0; - angle_B = 0.0; - countIncrease(); - } - - Parallelogram(ld base, ld side, ld height) - { - assert(height <= side); - this->base = base; - this->side_a = side; - this->height = height; - this->perimeter = calculatePerimeter(); - this->area = calculateArea(); - this->angle_A = calculateAngleA(); - this->angle_B = calculateAngleB(); - countIncrease(); - } - - /** - * @brief copy constructor - */ - Parallelogram(const Parallelogram& s) - { - base = s.base; - side_a = s.side_a; - height = s.height; - perimeter = s.perimeter; - area = s.area; - angle_A = s.angle_A; - angle_B = s.angle_B; - countIncrease(); - } - /** - * #brief move constructor - */ - Parallelogram(Parallelogram&& s) noexcept - { - base = s.base; - side_a = s.side_a; - height = s.height; - perimeter = s.perimeter; - area = s.area; - angle_A = s.angle_A; - angle_B = s.angle_B; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Parallelogram& operator=(Parallelogram&& s) noexcept - { - if (this != &s) - { - base = s.base; - side_a = s.side_a; - height = s.height; - perimeter = s.perimeter; - area = s.area; - angle_A = s.angle_A; - angle_B = s.angle_B; - countIncrease(); - } - return *this; - } - - Parallelogram& operator=(Parallelogram other) - { - std::swap(base, other.base); - std::swap(side_a, other.side_a); - std::swap(height, other.height); - std::swap(perimeter, other.perimeter); - std::swap(area, other.area); - std::swap(angle_A, other.angle_A); - std::swap(angle_B, other.angle_B); - return *this; - } - - static void show_objectCount() { - std::cout << "\n parallelogram object count: " - << parallelogramObjectCount << std::endl; - } - static int get_objectCount() { return parallelogramObjectCount; } - - - ~Parallelogram() = default; - - auto setBase(ld b); - auto setSide(ld s); - auto setHeight(ld h); - - [[nodiscard]] auto getBase() const { return base; } - [[nodiscard]] auto getSide() const { return side_a; } - [[nodiscard]] auto getHeight() const { return height; } - [[nodiscard]] auto getPerimeter() const { return perimeter; } - [[nodiscard]] auto getArea() const { return area; } - [[nodiscard]] auto getAngleA() const { return angle_A; } - [[nodiscard]] auto getAngleB() const { return angle_B; } - - void printParallelogramInfo()const; -}; - -#endif //PHYSICSFORMULA_PARALLELOGRAM_H - -inline ld Parallelogram::calculateBase() const -{ - return ld(); -} - -inline ld Parallelogram::calculateSideA() const -{ - return ld(); -} - -inline ld Parallelogram::calculateHeight() const -{ - return ld(); -} - -inline ld Parallelogram::calculatePerimeter() const -{ - return 2.0*(base + side_a); -} - -inline ld Parallelogram::calculateArea() const -{ - return base * height; -} - -inline ld Parallelogram::calculateAngleA() const -{ - return asin(height/side_a) * 180.0 / M_PI; -} - -inline ld Parallelogram::calculateAngleB() const -{ - return 180.0 - angle_A; -} - -inline auto Parallelogram::setBase(ld b) -{ - base = b; - area = calculateArea(); - perimeter = calculatePerimeter(); -} - -inline auto Parallelogram::setSide(ld s) -{ - assert(s > height); - side_a = s; - area = calculateArea(); - perimeter = calculatePerimeter(); -} - -inline auto Parallelogram::setHeight(ld h) -{ - assert(h <= side_a); - height = h; - area = calculateArea(); -} - -inline void Parallelogram::printParallelogramInfo() const -{ - std::cout << "base: " << base << std::endl; - std::cout << "side: " << side_a << std::endl; - std::cout << "height: " << height << std::endl; - std::cout << "perimeter: " << perimeter << std::endl; - std::cout << "area: " << area << std::endl; - std::cout << "angle A: " << angle_A << std::endl; - std::cout << "angle B: " << angle_B << std::endl; -} +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_PARALLELOGRAM_H +#define PHYSICSFORMULA_PARALLELOGRAM_H +/** + * @class Parallelogram + * @details class that represents a Parallelogram object + * @author Ryan Zurrin + * @dateBuilt 11/4/2021 + * @lastEdit 11/4/2021 + */ +#define _USE_MATH_DEFINES +#include +#include +#include + +static int parallelogramObjectCount = 0; +typedef long double ld; + +class Parallelogram +{ + ld base; + ld side_a; + ld height; + ld perimeter; + ld area; + ld angle_A; + ld angle_B; + static auto countIncrease() { parallelogramObjectCount += 1; } + static auto countDecrease() { parallelogramObjectCount -= 1; } + ld calculateBase()const; + ld calculateSideA()const; + ld calculateHeight()const; + ld calculatePerimeter()const; + ld calculateArea()const; + ld calculateAngleA()const; + ld calculateAngleB()const; + +public: + + Parallelogram() + { + base = 0.0; + side_a = 0.0; + height = 0.0; + perimeter = 0.0; + area = 0.0; + angle_A = 0.0; + angle_B = 0.0; + countIncrease(); + } + + Parallelogram(ld base, ld side, ld height) + { + assert(height <= side); + this->base = base; + this->side_a = side; + this->height = height; + this->perimeter = calculatePerimeter(); + this->area = calculateArea(); + this->angle_A = calculateAngleA(); + this->angle_B = calculateAngleB(); + countIncrease(); + } + + /** + * @brief copy constructor + */ + Parallelogram(const Parallelogram& s) + { + base = s.base; + side_a = s.side_a; + height = s.height; + perimeter = s.perimeter; + area = s.area; + angle_A = s.angle_A; + angle_B = s.angle_B; + countIncrease(); + } + /** + * #brief move constructor + */ + Parallelogram(Parallelogram&& s) noexcept + { + base = s.base; + side_a = s.side_a; + height = s.height; + perimeter = s.perimeter; + area = s.area; + angle_A = s.angle_A; + angle_B = s.angle_B; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Parallelogram& operator=(Parallelogram&& s) noexcept + { + if (this != &s) + { + base = s.base; + side_a = s.side_a; + height = s.height; + perimeter = s.perimeter; + area = s.area; + angle_A = s.angle_A; + angle_B = s.angle_B; + countIncrease(); + } + return *this; + } + + Parallelogram& operator=(Parallelogram other) + { + std::swap(base, other.base); + std::swap(side_a, other.side_a); + std::swap(height, other.height); + std::swap(perimeter, other.perimeter); + std::swap(area, other.area); + std::swap(angle_A, other.angle_A); + std::swap(angle_B, other.angle_B); + return *this; + } + + static void show_objectCount() { + std::cout << "\n parallelogram object count: " + << parallelogramObjectCount << std::endl; + } + static int get_objectCount() { return parallelogramObjectCount; } + + + ~Parallelogram() = default; + + auto setBase(ld b); + auto setSide(ld s); + auto setHeight(ld h); + + [[nodiscard]] auto getBase() const { return base; } + [[nodiscard]] auto getSide() const { return side_a; } + [[nodiscard]] auto getHeight() const { return height; } + [[nodiscard]] auto getPerimeter() const { return perimeter; } + [[nodiscard]] auto getArea() const { return area; } + [[nodiscard]] auto getAngleA() const { return angle_A; } + [[nodiscard]] auto getAngleB() const { return angle_B; } + + void printParallelogramInfo()const; +}; + +#endif //PHYSICSFORMULA_PARALLELOGRAM_H + +inline ld Parallelogram::calculateBase() const +{ + return ld(); +} + +inline ld Parallelogram::calculateSideA() const +{ + return ld(); +} + +inline ld Parallelogram::calculateHeight() const +{ + return ld(); +} + +inline ld Parallelogram::calculatePerimeter() const +{ + return 2.0*(base + side_a); +} + +inline ld Parallelogram::calculateArea() const +{ + return base * height; +} + +inline ld Parallelogram::calculateAngleA() const +{ + return asin(height/side_a) * 180.0 / M_PI; +} + +inline ld Parallelogram::calculateAngleB() const +{ + return 180.0 - angle_A; +} + +inline auto Parallelogram::setBase(ld b) +{ + base = b; + area = calculateArea(); + perimeter = calculatePerimeter(); +} + +inline auto Parallelogram::setSide(ld s) +{ + assert(s > height); + side_a = s; + area = calculateArea(); + perimeter = calculatePerimeter(); +} + +inline auto Parallelogram::setHeight(ld h) +{ + assert(h <= side_a); + height = h; + area = calculateArea(); +} + +inline void Parallelogram::printParallelogramInfo() const +{ + std::cout << "base: " << base << std::endl; + std::cout << "side: " << side_a << std::endl; + std::cout << "height: " << height << std::endl; + std::cout << "perimeter: " << perimeter << std::endl; + std::cout << "area: " << area << std::endl; + std::cout << "angle A: " << angle_A << std::endl; + std::cout << "angle B: " << angle_B << std::endl; +} diff --git a/PeriodicElements.h b/PeriodicElements.h index 5426807..5c1ec5c 100644 --- a/PeriodicElements.h +++ b/PeriodicElements.h @@ -1,3343 +1,3343 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_PERIODICELEMENTS_H -#define PHYSICSFORMULA_PERIODICELEMENTS_H -#pragma once - -/** - * @struct Elements - * @details structure holong doubleing data on all the periodic elements - * @author Ryan Zurrin - * @date 1/1/2021 - */ -//#include -//#include -#include - -//const int screenSize_X = 640; -//const int screenSize_Y = 480; - -static struct UnifiedAtomicMass -{ - const long double kg = 1.66053906660 * 50 * pow(10, -27); - const long double Mu = 1.0; - const long double Me = 1822.888486209 * 53; -} u; - - -/// -/// The periodic table, also known as the periodic table of elements, is a -/// tabular display of the chemical elements, which are arranged by atomic -/// number, electron configuration, and recurring chemical properties. -/// The structure of the table shows periodic trends.\n\n -/// atomic_weight: The atomic mass is the mass of an atom. Although the SI unit -/// of mass is kilogram, the atomic mass is often expressed in the non-SI unit -/// dalton where 1 dalton is defined as 1⁄12 of the mass of a single -/// carbon-12 atom, at rest.\n\n -/// atomic_number: The atomic number or proton number (symbol Z) of a chemical -/// element is the number of protons found in the nucleus of every atom of -/// that element. The atomic number uniquely identifies a chemical element. -/// It is identical to the charge number of the nucleus. In an uncharged atom, -/// the atomic number is also equal to the number of electrons.\n\n -/// density_STP: Density is a measure of an element's mass per unit volume.\n\n -/// melting_point: Melting point, temperature at which the solid and liquid forms -/// of a pure substance can exist in equilibrium. ... As heat is applied to a -/// solid, its temperature will increase until the melting point is reached. -/// More heat then will convert the solid into a liquid with no temperature change.\n\n -/// boiling_point: The boiling point of a substance is the temperature at which -/// the vapor pressure of a liquid equals the pressure surrounding the liquid -/// and the liquid changes into a vapor. ... The standard boiling point has -/// been defined by IUPAC since 1982 as the temperature at which boiling -/// occurs under a pressure of one bar.\n\n -/// thermal_conductivity: The heat transfer characteristics of a solid material -/// are measured by a property called the thermal conductivity, k (or λ), -/// measured in W/m.K. It is a measure of a substance's ability to transfer -/// heat through a material by conduction.\n\n -/// electric_conductivity: in metals is a result of the movement of electrically -/// charged particles. The atoms of metal elements are characterized by the -/// presence of valence electrons, which are electrons in the outer shell of -/// an atom that are free to move about.\n\n -/// resistivity: (also called specific electrical resistance or volume resistivity) -/// is a fundamental property of a material that measures how strongly it resists -/// electric current. Its inverse, called electrical conductivity, quantifies -/// how well a material conducts electricity.\n\n -/// heat_specific: the quantity of heat required to raise the temperature of one -/// gram of a substance by one Celsius degree. The units of specific heat are -/// usually calories or joules per gram per Celsius degree.\n\n -/// heat_vaporization: The enthalpy of vaporization, also known as the heat of -/// vaporization or heat of evaporation, is the amount of energy that must -/// be added to a liquid substance to transform a quantity of that substance -/// into a gas. The enthalpy of vaporization is a function of the pressure at -/// which that transformation takes place.\n\n -/// heat_fusion: The enthalpy of fusion of a substance, also known as heat of -/// fusion is the change in its enthalpy resulting from providing energy, typically -/// heat, to a specific quantity of the substance to change its state from a -/// solid to a liquid, at constant pressure.\n\n -/// ionization_1st: Ionization energy is the minimum amount of energy required -/// to remove the most loosely bound electron of a neutral atom. -/// -static struct Elements -{ - Elements() { //cout << "testing Element" << endl; - }; - - /// - /// - /// - const struct NEUTRON - { - const long double atomic_weight = 1.008665; - const long double halfLife = 622.2; - const int atomic_number = 0; - } n; - - /// - /// Hydrogen is the chemical element with the symbol H and atomic number 1. - /// With a standard atomic weight of 1.008, hydrogen is the lightest element - /// in the periodic table. Hydrogen is the most abundant chemical substance - /// in the universe, constituting roughly 75% of all baryonic mass - /// - const struct HYDROGEN - { - const long double atomic_weight = 1.007825; // 1.007825 u - const int atomic_number = 1; // Z = 1 - const long double density_STP = .0899; // .0899 kg/m^3 - const long double melting_point = -259.1; // -259.1 C - const long double boiling_point = -252.9; // -252.9 C - const long double thermal_conductivity = .18; // .18 W/mK - const long double electric_conductivity = FP_NAN; // FP_NAN - const long double resistivity = FP_NAN; //FP_NAN - const long double heat_specific = 14300.0; // 14300.0 J/kgK - const long double heat_vaporization = .452; // 452 kJ/mol - const long double heat_fusion = .558; // .558 kJ/mol - const long double ionization_1st = 13.598; - static void display() - { - displayElementImg(getFileName(1)); } - - } H; - - /// - /// Helium is a chemical element with the symbol He and atomic number 2. - /// It is a colorless, odorless, tasteless, non-toxic, inert, monatomic gas, - /// the first in the noble gas group in the periodic table. Its boiling point - /// is the lowest among all the elements - /// - const struct HELIUM - { - const long double atomic_weight = 4.002602; // 4.002602 u - const int atomic_number = 2; // Z = 2 - const long double density_STP = 0.1785; // 0.1785 kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = -269; // -269 C - const long double thermal_conductivity = 0.1513; // 0.1513 W/mK - const long double electric_conductivity = FP_NAN; // FP_NAN - const long double resistivity = FP_NAN; // FP_NAN - const long double heat_specific = 5193.1; // 5193.1 J/kgK - const long double heat_vaporization = .083; // .083 kJ/mol - const long double heat_fusion = .02; // .02 kJ/mol - const long double ionization_1st = 24.587; // eV - static void display() - { - displayElementImg(getFileName(2)); - } - } He; - - /// - /// Lithium is a chemical element with the symbol Li and atomic number 3. - /// It is a soft, silvery-white alkali metal. Under standard conditions, - /// it is the lightest metal and the lightest solid element. - /// - const struct LITHIUM - { - const long double atomic_weight = 6.941; // 6.94 u - const int atomic_number = 3; // Z = 3 - const long double density_STP = 535.0; // 535.0 kg/m^3 - const long double melting_point = 180.54; // 180.54 C - const long double boiling_point = 1342.0; // 1342.0 C - const long double thermal_conductivity = 85.0; // 85.0 W/mK - const long double electric_conductivity = 11.0; // 11.0 MS/m - const long double resistivity = 9.40 * pow(10, -8); // 9.4e-8 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 3570.0; // 3570.0 J/kgK - const long double heat_vaporization = 147.0; // 147.0 kJ/mol - const long double heat_fusion = 3.0; // 3.0 kJ/mol - const long double ionization_1st = 5.391; // eV - static void display() - { - displayElementImg(getFileName(3)); - } - } Li; - - /// - /// Beryllium is a chemical element with the symbol Be and atomic number 4. - /// It is a relatively rare element in the universe, usually occurring as a - /// product of the spallation of larger atomic nuclei that have collided - /// with cosmic rays. Within the cores of stars, beryllium is depleted as - /// it is fused into heavier elements. - /// - const struct BERYLLIUM - { - const long double atomic_weight = 9.0121831; // 9.0121831 u - const int atomic_number = 4; //4 - const long double density_STP = 1848.0; // 1848.0 kg/m^3 - const long double melting_point = 1287; // 1287 C - const long double boiling_point = 2470; // 2470 C - const long double thermal_conductivity = 190; // 190 W/mK - const long double electric_conductivity = 25; // 25 MS/m - const long double resistivity = 3.999999999998 * pow(10, -8); // 4e-8 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 1820.0; // 1820.0 J/kgK - const long double heat_vaporization = 297.0; // 297.0 kJ/mol - const long double heat_fusion = 7.95; // 7.95 kJ/mol - const long double ionization_1st = 9.323; // eV - static void display() - { - displayElementImg(getFileName(4)); - } - } Be; - - /// - /// Boron is a chemical element with the symbol B and atomic number 5. - /// Produced entirely by cosmic ray spallation and supernovae and not by - /// stellar nucleosynthesis, it is a low-abundance element in the Solar - /// System and in the Earth's crust. It constitutes about 0.001 percent - /// by weight of Earth's crust. - /// - const struct BORON - { - const long double atomic_weight = 10.81; // 10.81 u - const int atomic_number = 5; // 5 - const long double density_STP = 2460.0; // 2460.0 kg/m^3 - const long double melting_point = 2075; // 2075 C - const long double boiling_point = 4000; // 4000 C - const long double thermal_conductivity = 27.0; // 27.0W/mK - const long double electric_conductivity = 1; // MS/m - const long double resistivity = 10000.0; // 10000 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 1030.0; // J/kgK - const long double heat_vaporization = 507.0; // kJ/mol - const long double heat_fusion = 50.0; // kJ/mol - const long double ionization_1st = 8.298; // eV - static void display() - { - displayElementImg(getFileName(5)); - } - } B; - - /// - /// Carbon is a chemical element with the symbol C and atomic number 6. - /// It is nonmetallic and tetravalent—making four electrons available to - /// form covalent chemical bonds. It belongs to group 14 of the periodic - /// table. Carbon makes up only about 0.025 percent of Earth's crust. - /// - const struct CARBON - { - const long double atomic_weight = 12.011; // u - const int atomic_number = 6; - const long double density_STP = 2260.0; // kg/m^3 - const long double melting_point = 3550; // C - const long double boiling_point = 4027; // C - const long double thermal_conductivity = 140.0; // W/mK - const long double electric_conductivity = .10; // MS/m - const long double resistivity = 0.00001; // 0.00001 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 710.0; // J/kgK - const long double heat_vaporization = 715.0; // kJ/mol - const long double heat_fusion = 105; // kJ/mol - const long double ionization_1st = 11.261; // eV - static void display() - { - displayElementImg(getFileName(6)); - } - } C; - - /// - /// Nitrogen is the chemical element with the symbol N and atomic number 7. - /// It was first discovered and isolated by Scottish physician Daniel - /// Rutherford in 1772. - /// - const struct NITROGEN - { - const long double atomic_weight = 14.007; // u - const int atomic_number = 7; - const long double density_STP = 1.251; // kg/m^3 - const long double melting_point = -210.1; // C - const long double boiling_point = -195.8; // C - const long double thermal_conductivity = .025; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; //FP_NAN - const long double heat_specific = 1040; // J/kgK - const long double heat_vaporization = 2.79; // kJ/mol - const long double heat_fusion = .36; // kJ/mol - const long double ionization_1st = 14.534; // eV - static void display() - { - displayElementImg(getFileName(7)); - } - } N; - - /// - /// Oxygen is the chemical element with the symbol O and atomic number 8. - /// It is a member of the chalcogen group in the periodic table, a highly - /// reactive nonmetal, and an oxidizing agent that readily forms oxides with - /// most elements as well as with other compounds. - /// - const struct OXYGEN - { - const long double atomic_weight = 15.999; // u - const int atomic_number = 8; - const long double density_STP = 1.251; // kg/m^3 - const long double melting_point = -218.0; // C - const long double boiling_point = -183.0; // C - const long double thermal_conductivity = 0.02658; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // FP_NAN - const long double heat_specific = 919; // J/kgK - const long double heat_vaporization = 3.41; // kJ/mol - const long double heat_fusion = .222; // kJ/mol - const long double ionization_1st = 13.681; // eV - static void display() - { - displayElementImg(getFileName(8)); - } - } O; - - /// - /// Fluorine is a chemical element with the symbol F and atomic number 9. - /// It is the lightest halogen and exists at standard conditions as a highly - /// toxic, pale yellow diatomic gas. As the most electronegative element, - /// it is extremely reactive, as it reacts with all other elements, except - /// for argon, neon, and helium. - /// - const struct FLUORINE - { - const long double atomic_weight = 18.998403163; // u - const int atomic_number = 9; - const long double density_STP = 1.696; // kg/m^3 - const long double melting_point = -220.0; // C - const long double boiling_point = -188.1; // C - const long double thermal_conductivity = .0277; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // FP_NAN - const long double heat_specific = 824; // J/kgK - const long double heat_vaporization = 3.27; // kJ/mol - const long double heat_fusion = .26; // kJ/mol - const long double ionization_1st = 17.422; // eV - static void display() - { - displayElementImg(getFileName(9)); - } - } F; - - /// - /// Neon is a chemical element with the symbol Ne and atomic number 10. - /// It is a noble gas. Neon is a colorless, odorless, inert monatomic gas - /// under standard conditions, with about two-thirds the density of air. - /// - const struct NEON - { - const long double atomic_weight = 20.1797; // u - const int atomic_number = 10; - const long double density_STP = .900; // kg/m^3 - const long double melting_point = -248.6; // C - const long double boiling_point = -246.1; // C - const long double thermal_conductivity = .0491; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // FP_NAN - const long double heat_specific = 1030; // J/kgK - const long double heat_vaporization = 1.75; // kJ/mol - const long double heat_fusion = 0.34; // kJ/mol - const long double ionization_1st = 21.565; // eV - static void display() - { - displayElementImg(getFileName(10)); - } - } Ne; - - /// - /// Sodium is a chemical element with the symbol Na and atomic number 11. - /// It is a soft, silvery-white, highly reactive metal. Sodium is an - /// alkali metal, being in group 1 of the periodic table. Its only stable - /// isotope is ²³Na. The free metal does not occur in nature, and must be - /// prepared from compounds. - /// - const struct SODIUM - { - const long double atomic_weight = 22.98976928; // u - const int atomic_number = 11; - const long double density_STP = 968; // kg/m^3 - const long double melting_point = 97.720; // C - const long double boiling_point = 882.9; // C - const long double thermal_conductivity = 140.0; // W/mK - const long double electric_conductivity = 21.0; // MS/m - const long double resistivity = 4.69999999e-8; // 4.7e-8 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 1230; // J/kgK - const long double heat_vaporization = 97.7; // kJ/mol - const long double heat_fusion = 2.60; // kJ/mol - const long double ionization_1st = 5.139; // eV - static void display() - { - displayElementImg(getFileName(11)); - } - } Na; - - /// - /// Magnesium is a chemical element with the symbol Mg and atomic number 12. - /// It is a shiny gray solid which bears a close physical resemblance to - /// the other five elements in the second column of the periodic - /// - const struct MAGNESIUM - { - const long double atomic_weight = 24.305; // u - const int atomic_number = 12; - const long double density_STP = 1738.0; // kg/m^3 - const long double melting_point = 650; // C - const long double boiling_point = 1090; // C - const long double thermal_conductivity = 160.0; // W/mK - const long double electric_conductivity = 23.0; // MS/m - const long double resistivity = 4.39999999e-8; // 4.4e-8 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 1020; // J/kgK - const long double heat_vaporization = 128; // kJ/mol - const long double heat_fusion = 8.7; // kJ/mol - const long double ionization_1st = 7.646; // eV - static void display() - { - displayElementImg(getFileName(12)); - } - } Mg; - - /// - /// Aluminium is a chemical element with the symbol Al and atomic number 13. - /// Aluminium has a density lower than those of other common metals, at - /// approximately one third that of steel. It has a great affinity towards - /// oxygen, and forms a protective layer of oxide on the surface when - /// exposed to air. - /// - const struct ALUMINIUM - { - const long double atomic_weight = 26.9815385; // 26.9815385 u - const int atomic_number = 13; // 13 - const long double density_STP = 2700; // 2700 kg/m^3 - const long double melting_point = 660.32; // 660.32 C - const long double boiling_point = 2519.0; // 2519C - const long double thermal_conductivity = 235; // 235 W/mK - const long double electric_conductivity = 38.0; // 38 MS/m - const long double resistivity = 2.6e-8; // 2.6e-8 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 904.0; // 904 J/kgK - const long double heat_vaporization = 293.0; // 293 kJ/mol - const long double heat_fusion = 10.7; // 10.7 kJ/mol - const long double ionization_1st = 5.985; // eV - static void display() - { - displayElementImg(getFileName(13)); - } - } Al; - - /// - /// Silicon is a chemical element with the symbol Si and atomic number 14. - /// It is a hard, brittle crystalline solid with a blue-grey metallic lustre, - /// and is a tetravalent metalloid and semiconductor. It is a member of group - /// 14 in the periodic table: carbon is above it; and germanium, tin, lead - /// and flerovium, are below it - /// - const struct SILICON - { - const long double atomic_weight = 28.085; // 28.085 u - const int atomic_number = 14; //14 - const long double density_STP = 2330.0; // 2330 kg/m^3 - const long double melting_point = 1414.0; // 1414 C - const long double boiling_point = 2900.0; // 2000 C - const long double thermal_conductivity = 150.0; // 150 W/mK - const long double electric_conductivity = .0010; // .0010 MS/m - const long double resistivity = .001; // .001 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 710.0; // 710 J/kgK - const long double heat_vaporization = 359.0; // 359 kJ/mol - const long double heat_fusion = 50.2; // 50.2 kJ/mol - const long double ionization_1st = 8.151; // eV - static void display() - { - displayElementImg(getFileName(14)); - } - } Si; - - /// - /// Phosphorus is a chemical element with the symbol P and atomic number 15. - /// Elemental phosphorus exists in two major forms, white phosphorus and - /// red phosphorus, but because it is highly reactive, phosphorus is never - /// found as a free element on Earth. - /// - const struct PHOSPHORUS - { - const long double atomic_weight = 30.973761998; // 30.973761998 u - const int atomic_number = 15; //15 - const long double density_STP = 1823.0; // 1823 kg/m^3 - const long double melting_point = 44.15; // 44.15 C - const long double boiling_point = 280.5; // 280.5 C - const long double thermal_conductivity = .236; // .236 W/mK - const long double electric_conductivity = 10.0; // 10 MS/m - const long double resistivity = 1e-7; // 1e-7 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 769.7; // 769.7 J/kgK - const long double heat_vaporization = 12.4; // 12.4 kJ/mol - const long double heat_fusion = .64; // .64 kJ/mol - const long double ionization_1st = 10.487; // eV - static void display() - { - displayElementImg(getFileName(15)); - } - } P; - - /// - /// Sulfur is a chemical element with the symbol S and atomic number 16. - /// It is abundant, multivalent and nonmetallic. Under normal conditions, - /// sulfur atoms form cyclic octatomic molecules with a chemical formula S₈. - /// Elemental sulfur is a bright yellow, crystalline solid at room temperature - /// - const struct SULFUR - { - const long double atomic_weight = 32.06; // 32.06 u - const int atomic_number = 16; // 16 - const long double density_STP = 1960.0; // 1960.0 kg/m^3 - const long double melting_point = 115.21; // 115.21 C - const long double boiling_point = 444.72; // 444.72 C - const long double thermal_conductivity = .205; // .205 W/mK - const long double electric_conductivity = pow(1.0, -21); // 1e-21 MS/m - const long double resistivity = 1e15; // 1e15 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 705.0; // 705 J/kgK - const long double heat_vaporization = 9.8; // 9.8 kJ/mol - const long double heat_fusion = 1.73; // 1.73 kJ/mol - const long double ionization_1st = 10.36; // eV - static void display() - { - displayElementImg(getFileName(16)); - } - } S; - - /// - /// Chlorine is a chemical element with the symbol Cl and atomic number 17. - /// The second-lightest of the halogens, it appears between fluorine and - /// bromine in the periodic table and its properties are mostly intermediate - /// between them. Chlorine is a yellow-green gas at room temperature. - /// - const struct CHLORINE - { - const long double atomic_weight = 35.45; // 35.45 u - const int atomic_number = 17; //17 - const long double density_STP = 3.214; // 3.214 kg/m^3 - const long double melting_point = -101.5; // -101.5 C - const long double boiling_point = -34.040; // -34.040 C - const long double thermal_conductivity = .0089; // .0089 W/mK - const long double electric_conductivity = pow(1.0, -8.0); // 1e-8 MS/m - const long double resistivity = 100; // 100 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 478.2; // 478.2 J/kgK - const long double heat_vaporization = 10.2; // 10.2 kJ/mol - const long double heat_fusion = 3.2; // 3.2 kJ/mol - const long double ionization_1st = 12.968; // eV - static void display() - { - displayElementImg(getFileName(17)); - } - } Cl; - - /// - /// Argon is a chemical element with the symbol Ar and atomic number 18. - /// It is in group 18 of the periodic table and is a noble gas. Argon is - /// the third-most abundant gas in the Earth's atmosphere, at 0.934% - /// - const struct ARGON - { - const long double atomic_weight = 39.948; // 39.948 u - const int atomic_number = 18; //18 - const long double density_STP = 1784.0; // 1784 kg/m^3 - const long double melting_point = -189; // -189 C - const long double boiling_point = -186; // -186 C - const long double thermal_conductivity = .01772; // .01772 W/mK - const long double electric_conductivity = FP_NAN; // FP_NAN - const long double resistivity = FP_NAN; // FP_NAN - const long double heat_specific = 520.33; // 520.33 J/kgK - const long double heat_vaporization = 6.5; // 6.5 kJ/mol - const long double heat_fusion = 1.18; // 1.18 kJ/mol - const long double ionization_1st = 15.760; // eV - static void display() - { - displayElementImg(getFileName(18)); - } - } Ar; - - /// - /// Potassium is a chemical element with the symbol K and atomic number 19. - /// Potassium is a silvery-white metal that is soft enough to be cut with a - /// knife with little force. Potassium metal reacts rapidly with atmospheric - /// oxygen to form flaky white potassium peroxide in only seconds of exposure. - /// - const struct POTASSIUM - { - const long double atomic_weight = 39.0983; // 39.0983 u - const int atomic_number = 19; // 19 - const long double density_STP = 856; // 856 kg/m^3 - const long double melting_point = 63.380; // 63.38C - const long double boiling_point = 758.9; // 758.9C - const long double thermal_conductivity = 100.0; // 100 W/mK - const long double electric_conductivity = 14.0; // 14 MS/m - const long double resistivity = 7.000000000002e-8; // 7.0e-8 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 757; // 757 J/kgK - const long double heat_vaporization = 76.9; // 76.9 kJ/mol - const long double heat_fusion = 2.33; // 2.33kJ/mol - const long double ionization_1st = 4.341; // eV - static void display() - { - displayElementImg(getFileName(19)); - } - } K; - - /// - /// Calcium is a chemical element with the symbol Ca and atomic number 20. - /// As an alkaline earth metal, calcium is a reactive metal that forms a - /// dark oxide-nitride layer when exposed to air. ... It is the fifth most - /// abundant element in Earth's crust, and the third most abundant metal, - /// after iron and aluminium - /// - const struct CALCIUM - { - const long double atomic_weight = 40.078; // 40.078 u - const int atomic_number = 20; // 20 - const long double density_STP = 1550.0; // 1550kg/m^3 - const long double melting_point = 841.9; // 841.9C - const long double boiling_point = 1484; // 1484 C - const long double thermal_conductivity = 200.0; //200 W/mK - const long double electric_conductivity = 29; // 29 MS/m - const long double resistivity = 3.39999999e-8; // 3.4e-8 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 631; // 631 J/kgK - const long double heat_vaporization = 155.0; // 155 kJ/mol - const long double heat_fusion = 8.54; // 8.54 kJ/mol - const long double ionization_1st = 6.113; // eV - static void display() - { - displayElementImg(getFileName(20)); - } - } Ca; - - /// - /// Scandium is a chemical element with the symbol Sc and atomic number 21. - /// A silvery-white metallic d-block element, it has historically been - /// classified as a rare-earth element, together with yttrium and the - /// lanthanide. - /// - const struct SCANDIUM - { - const long double atomic_weight = 44.955908; // 44.955908 u - const int atomic_number = 21; // 21 - const long double density_STP = 2985.0; // 2985 kg/m^3 - const long double melting_point = 1541.0; // 1541 C - const long double boiling_point = 2830.0; // 2830 C - const long double thermal_conductivity = 16; // 16W/mK - const long double electric_conductivity = 1.8; // 1.8 MS/m - const long double resistivity = 5.5e-7; // 5.5e-7 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 567.0; // 567 J/kgK - const long double heat_vaporization = 318.0; // 318 kJ/mol - const long double heat_fusion = 16.0; // 16 kJ/mol - const long double ionization_1st = 6.562; // eV - static void display() - { - displayElementImg(getFileName(21)); - } - } Sc; - - /// - /// Titanium is a chemical element with the symbol Ti and atomic number 22. - /// Its atomic weight is 47.867 measured in daltons. It is a lustrous - /// transition metal with a silver color, low density, and high strength. - /// Titanium is resistant to corrosion in sea water, aqua regia, and chlorine. - /// - const struct TITANIUM - { - const long double atomic_weight = 47.867; // 47.867 u - const int atomic_number = 22; //22 - const long double density_STP = 4507.0; // 4507 kg/m^3 - const long double melting_point = 1668.0; // 1668 C - const long double boiling_point = 3287.0; // 3287 C - const long double thermal_conductivity = 22.0; // 22.0 W/mK - const long double electric_conductivity = 2.5; // 2.5 MS/m - const long double resistivity = 4e-7; // 4e-7 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 520.0; // 525 J/kgK - const long double heat_vaporization = 425.0; // 425 kJ/mol - const long double heat_fusion = 18.7; // 18.7 kJ/mol - const long double ionization_1st = 6.828; // eV - static void display() - { - displayElementImg(getFileName(22)); - } - } Ti; - - /// - /// Vanadium is a chemical element with the symbol V and atomic number 23. - /// It is a hard, silvery-grey, malleable transition metal. The elemental - /// metal is rarely found in nature, but once isolated artificially, the - /// formation of an oxide layer somewhat stabilizes the free metal against - /// further oxidation. - /// - const struct VANADIUM - { - const long double atomic_weight = 50.9415; // 50.9415 u - const int atomic_number = 23; // 19 - const long double density_STP = 6110; // kg/m^3 - const long double melting_point = 1910; // 1910 C - const long double boiling_point = 3407; // 3407 C - const long double thermal_conductivity = 31; // 31 W/mK - const long double electric_conductivity = 5; // MS/m - const long double resistivity = 2e-7; // 2e-7 m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 489; // J/kgK - const long double heat_vaporization = 453; // kJ/mol - const long double heat_fusion = 22.8; // kJ/mol - const long double ionization_1st = 6.746; // eV - static void display() - { - displayElementImg(getFileName(23)); - } - } V; - - /// - /// Chromium is a chemical element with the symbol Cr and atomic number 24. - /// It is the first element in group 6. It is a steely-grey, lustrous, hard, - /// and brittle transition metal. Chromium is the main additive in stainless - /// steel, to which it adds anti-corrosive properties. - /// - const struct CHROMIUM - { - const long double atomic_weight = 51.996; // u - const int atomic_number = 24; - const long double density_STP = 7190; // kg/m^3 - const long double melting_point = 1907; // C - const long double boiling_point = 2671; // C - const long double thermal_conductivity = 94; // W/mK - const long double electric_conductivity = 7.9; // MS/m - const long double resistivity = 1.3e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 448; // J/kgK - const long double heat_vaporization = 339; // kJ/mol - const long double heat_fusion = 20.5; // kJ/mol - const long double ionization_1st = 6.767; // eV - static void display() - { - displayElementImg(getFileName(24)); - } - } Cr; - - /// - /// Manganese is a chemical element with the symbol Mn and atomic number 25. - /// It is not found as a free element in nature; it is often found in minerals - /// in combination with iron. Manganese is a transition metal with a - /// multifaceted array of industrial alloy uses, particularly in - /// stainless steels. - /// - const struct MANGANESE - { - const long double atomic_weight = 54.938; // u - const int atomic_number = 25; - const long double density_STP = 7470; // kg/m^3 - const long double melting_point = 1246; // C - const long double boiling_point = 2061; // C - const long double thermal_conductivity = 7.8; // W/mK - const long double electric_conductivity = .62; // MS/m - const long double resistivity = 1.6e-6; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 479; // J/kgK - const long double heat_vaporization = 220; // kJ/mol - const long double heat_fusion = 13.2; // kJ/mol - const long double ionization_1st = 7.434; // eV - static void display() - { - displayElementImg(getFileName(25)); - } - } Mn; - - /// - /// Iron is a chemical element with symbol Fe and atomic number 26. - /// It is a metal that belongs to the first transition series and group - /// 8 of the periodic table. It is, by mass, the most common element on - /// Earth, right in front of oxygen, forming much of Earth's outer and - /// inner core. - /// - const struct IRON - { - const long double atomic_weight = 55.845; // u - const int atomic_number = 26; - const long double density_STP = 7874; // kg/m^3 - const long double melting_point = 1538; // C - const long double boiling_point = 2861; // C - const long double thermal_conductivity = 80; // W/mK - const long double electric_conductivity = 10; // MS/m - const long double resistivity = 9.7e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 449; // J/kgK - const long double heat_vaporization = 347; // kJ/mol - const long double heat_fusion = 13.8; // kJ/mol - const long double ionization_1st = 7.903; // eV - static void display() - { - displayElementImg(getFileName(26)); - } - } Fe; - - /// - /// Cobalt is a chemical element with the symbol Co and atomic number 27. - /// Like nickel, cobalt is found in the Earth's crust only in a chemically - /// combined form, save for small deposits found in alloys of natural meteoric - /// iron. The free element, produced by reductive smelting, is a hard, - /// lustrous, silver-gray metal. - /// - const struct COBALT - { - const long double atomic_weight = 58.933; // u - const int atomic_number = 27; - const long double density_STP = 8900; // kg/m^3 - const long double melting_point = 1495; // C - const long double boiling_point = 2900; // C - const long double thermal_conductivity = 100; // W/mK - const long double electric_conductivity = 17; // MS/m - const long double resistivity = 6e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 421; // J/kgK - const long double heat_vaporization = 375; // kJ/mol - const long double heat_fusion = 16.2; // kJ/mol - const long double ionization_1st = 7.881; // eV - static void display() - { - displayElementImg(getFileName(27)); - } - } Co; - - /// - /// Nickel is a chemical element with the symbol Ni and atomic number 28. - /// It is a silvery-white lustrous metal with a slight golden tinge. - /// Nickel belongs to the transition metals and is hard and ductile. - /// - const struct NICKEL - { - const long double atomic_weight = 58.693; // u - const int atomic_number = 28; - const long double density_STP = 8908.0; // kg/m^3 - const long double melting_point = 1455; // C - const long double boiling_point = 2913; // C - const long double thermal_conductivity = 91; // W/mK - const long double electric_conductivity = 14; // MS/m - const long double resistivity = 7e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 445; // J/kgK - const long double heat_vaporization = 378; // kJ/mol - const long double heat_fusion = 17.2; // kJ/mol - const long double ionization_1st = 7.641; // eV - static void display() - { - displayElementImg(getFileName(28)); - } - } Ni; - - /// - /// Copper is a chemical element with the symbol Cu and atomic number 29. - /// It is a soft, malleable, and ductile metal with very high thermal and - /// electrical conductivity. A freshly exposed surface of pure copper has - /// a pinkish-orange color. - /// - const struct COPPER - { - const long double atomic_weight = 63.546; // u - const int atomic_number = 29; - const long double density_STP = 8940.0; // kg/m^3 - const long double melting_point = 1084; // C - const long double boiling_point = 2562; // C - const long double thermal_conductivity = 400; // W/mK - const long double electric_conductivity = 59; // MS/m - const long double resistivity = 1.7e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 384.4; // J/kgK - const long double heat_vaporization = 300; // kJ/mol - const long double heat_fusion = 13.1; // kJ/mol - const long double ionization_1st = 7.727; // eV - static void display() - { - displayElementImg(getFileName(29)); - } - } Cu; - - /// - /// Zinc is a chemical element with the symbol Zn and atomic number 30. - /// Zinc is a slightly brittle metal at room temperature and has a - /// silvery-grayish appearance when oxidation is removed. It is the first - /// element in group 12 of the periodic table. - /// - const struct ZINC - { - const long double atomic_weight = 65.38; // u - const int atomic_number = 30; - const long double density_STP = 7140; // kg/m^3 - const long double melting_point = 419.53; // C - const long double boiling_point = 906.9; // C - const long double thermal_conductivity = 120; // W/mK - const long double electric_conductivity = 17; // MS/m - const long double resistivity = 5.9e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 388; // J/kgK - const long double heat_vaporization = 119; // kJ/mol - const long double heat_fusion = 7.35; // kJ/mol - const long double ionization_1st = 9.394; // eV - static void display() - { - displayElementImg(getFileName(30)); - } - } Zn; - - /// - /// Gallium is a chemical element with the symbol Ga and atomic number 31. - /// Elemental gallium is a soft, silvery metal at standard temperature and - /// pressure; however in its liquid state it becomes silvery white. If too - /// much force is applied, the gallium may fracture conchoidally. - /// - const struct GALLIUM - { - const long double atomic_weight = 69.723; // u - const int atomic_number = 31; - const long double density_STP = 5904.0; // kg/m^3 - const long double melting_point = 29.760; // C - const long double boiling_point = 2204.0; // C - const long double thermal_conductivity = 29.0; // W/mK - const long double electric_conductivity = 7.1; // MS/m - const long double resistivity = 1.4e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 371.0; // J/kgK - const long double heat_vaporization = 256.0; // kJ/mol - const long double heat_fusion = 5.59; // kJ/mol - const long double ionization_1st = 5.999; // eV - static void display() - { - displayElementImg(getFileName(31)); - } - } Ga; - - /// - /// Germanium is a chemical element with the symbol Ge and atomic number 32. - /// It is a lustrous, hard-brittle, grayish-white metalloid in the carbon - /// group, chemically similar to its group neighbors silicon and tin. - /// Pure germanium is a semiconductor with an appearance similar to - /// elemental silicon. - /// - const struct GERMANIUM - { - const long double atomic_weight = 72.630; // u - const int atomic_number = 32; - const long double density_STP = 5323; // kg/m^3 - const long double melting_point = 938.25; // C - const long double boiling_point = 2820; // C - const long double thermal_conductivity = 60.0; // W/mK - const long double electric_conductivity = .0020; // MS/m - const long double resistivity = .0005; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 321.4; // J/kgK - const long double heat_vaporization = 334.0; // kJ/mol - const long double heat_fusion = 31.8; // kJ/mol - const long double ionization_1st = 7.90; // eV - static void display() - { - displayElementImg(getFileName(32)); - } - } Ge; - - /// - /// Arsenic is a chemical element with the symbol As and atomic number 33. - /// Arsenic occurs in many minerals, usually in combination with sulfur and - /// metals, but also as a pure elemental crystal. Arsenic is a metalloid. - /// - const struct ARSENIC - { - const long double atomic_weight = 74.922; // u - const int atomic_number = 33; - const long double density_STP = 5727; // kg/m^3 - const long double melting_point = 816.9; // C - const long double boiling_point = 614; // C - const long double thermal_conductivity = 50.0; // W/mK - const long double electric_conductivity = 3.3; // MS/m - const long double resistivity = 3e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 328.0; // J/kgK - const long double heat_vaporization = 32.4; // kJ/mol - const long double heat_fusion = 27.7; // kJ/mol - const long double ionization_1st = 9.815; // eV - static void display() - { - displayElementImg(getFileName(33)); - } - } As; - - /// - /// Selenium is a chemical element with the symbol Se and atomic number 34. - /// It is a nonmetal with properties that are intermediate between the - /// elements above and below in the periodic table, sulfur and tellurium, - /// and also has similarities to arsenic - /// - const struct SELENIUM - { - const long double atomic_weight = 78.971; // u - const int atomic_number = 34; - const long double density_STP = 4819; // kg/m^3 - const long double melting_point = 221; // C - const long double boiling_point = 685; // C - const long double thermal_conductivity = 0; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 321.2; // J/kgK - const long double heat_vaporization = 26.0; // kJ/mol - const long double heat_fusion = 5.4; // kJ/mol - const long double ionization_1st = 9.753; // eV - static void display() - { - displayElementImg(getFileName(34)); - } - } Se; - - /// - /// Bromine is a chemical element with the symbol Br and atomic number 35. - /// It is the third-lightest halogen, and is a fuming red-brown liquid at - /// room temperature that evaporates readily to form a similarly coloured - /// vapour. Its properties are intermediate between those of chlorine - /// and iodine. - /// - const struct BROMINE - { - const long double atomic_weight = 79.904; // u - const int atomic_number = 35; - const long double density_STP = 3120; // kg/m^3 - const long double melting_point = -7.350; // C - const long double boiling_point = 58.9; // C - const long double thermal_conductivity = 0.12; // W/mK - const long double electric_conductivity = 1.0e-16; // MS/m - const long double resistivity = 1.0e10; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 947.3; // J/kgK - const long double heat_vaporization = 14.8; // kJ/mol - const long double heat_fusion = 5.8; // kJ/mol - const long double ionization_1st = 11.814; // eV - static void display() - { - displayElementImg(getFileName(35)); - } - } Br; - - /// - /// Krypton is a chemical element with the symbol Kr and atomic number 36. - /// It is a colorless, odorless, tasteless noble gas that occurs in trace - /// amounts in the atmosphere and is often used with other rare gases in - /// fluorescent lamps. With rare exceptions, krypton is chemically inert - /// - const struct KRYPTON - { - const long double atomic_weight = 83.798; // u - const int atomic_number = 36; - const long double density_STP = 3.75; // kg/m^3 - const long double melting_point = -157.36; // C - const long double boiling_point = -153.22; // C - const long double thermal_conductivity = 0.00943; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 248.05; // J/kgK - const long double heat_vaporization = 9.02; // kJ/mol - const long double heat_fusion = 1.64; // kJ/mol - const long double ionization_1st = 14.000; // eV - static void display() - { - displayElementImg(getFileName(36)); - } - } Kr; - - /// - /// Rubidium is the chemical element with the symbol Rb and atomic number 37. - /// Rubidium is a very soft, silvery-white metal in the alkali metal group. - /// Rubidium metal shares similarities to potassium metal and caesium metal - /// in physical appearance, softness and conductivity. - /// - const struct RUBIDIUM - { - const long double atomic_weight = 85.468; // u - const int atomic_number = 37; - const long double density_STP = 1532; // kg/m^3 - const long double melting_point = 39.310; // C - const long double boiling_point = 688.0; // C - const long double thermal_conductivity = 58.0; // W/mK - const long double electric_conductivity = 8.30; // MS/m - const long double resistivity = 1.2e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 364; // J/kgK - const long double heat_vaporization = 72.0; // kJ/mol - const long double heat_fusion = 2.19; // kJ/mol - const long double ionization_1st = 4.177; // eV - static void display() - { - displayElementImg(getFileName(37)); - } - } Rb; - - /// - /// Strontium is the chemical element with the symbol Sr and atomic number 38. - /// An alkaline earth metal, strontium is a soft silver-white yellowish metallic - /// element that is highly chemically reactive. The metal forms a dark oxide - /// layer when it is exposed to air. - /// - const struct STRONTIUM - { - const long double atomic_weight = 87.62; // u - const int atomic_number = 38; - const long double density_STP = 2630; // kg/m^3 - const long double melting_point = 776.9; // C - const long double boiling_point = 1382.0; // C - const long double thermal_conductivity = 35; // W/mK - const long double electric_conductivity = 7.7; // MS/m - const long double resistivity = 1.3e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 300.0; // J/kgK - const long double heat_vaporization = 137.0; // kJ/mol - const long double heat_fusion = 8.0; // kJ/mol - const long double ionization_1st = 5.695; // eV - static void display() - { - displayElementImg(getFileName(38)); - } - } Sr; - - /// - /// Yttrium is a chemical element with the symbol Y and atomic number 39. - /// It is a silvery-metallic transition metal chemically similar to the - /// lanthanides and has often been classified as a "rare-earth element" - /// - const struct YTTRIUM - { - const long double atomic_weight = 88.906; // u - const int atomic_number = 39; - const long double density_STP = 4472; // kg/m^3 - const long double melting_point = 1526.0; // C - const long double boiling_point = 3345.0; // C - const long double thermal_conductivity = 17; // W/mK - const long double electric_conductivity = 1.80; // MS/m - const long double resistivity = 5.6e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 298.0; // J/kgK - const long double heat_vaporization = 380.0; // kJ/mol - const long double heat_fusion = 11.4; // kJ/mol - const long double ionization_1st = 6.22; // eV - static void display() - { - displayElementImg(getFileName(39)); - } - } Y; - - /// - /// Zirconium is a chemical element with the symbol Zr and atomic number 40. - /// The name zirconium is taken from the name of the mineral zircon, the - /// most important source of zirconium. It is a lustrous, grey-white, strong - /// transition metal that closely resembles hafnium and, to a lesser - /// extent, titanium. - /// - const struct ZIRCONIUM - { - const long double atomic_weight = 91.224; // u - const int atomic_number = 40; - const long double density_STP = 6511; // kg/m^3 - const long double melting_point = 1855.0; // C - const long double boiling_point = 4409.0; // C - const long double thermal_conductivity = 23; // W/mK - const long double electric_conductivity = 2.4; // MS/m - const long double resistivity = 4.2e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 278.0; // J/kgK - const long double heat_vaporization = 580.0; // kJ/mol - const long double heat_fusion = 21.0; // kJ/mol - const long double ionization_1st = 6.634; // eV - static void display() - { - displayElementImg(getFileName(40)); - } - } Zr; - - /// - /// Niobium, also known as columbium, - /// is a chemical element with the symbol Nb and atomic number 41. - /// Niobium is a light grey, crystalline, and ductile transition metal. - /// Pure niobium has a Mohs hardness rating similar to that of pure titanium, - /// and it has similar ductility to iron. - /// - const struct NIOBIUM - { - const long double atomic_weight = 92.906; // u - const int atomic_number = 41; - const long double density_STP = 8570; // kg/m^3 - const long double melting_point = 2477.0; // C - const long double boiling_point = 4744.0; // C - const long double thermal_conductivity = 54; // W/mK - const long double electric_conductivity = 6.7; // MS/m - const long double resistivity = 1.5e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 265.0; // J/kgK - const long double heat_vaporization = 690.0; // kJ/mol - const long double heat_fusion = 26.8; // kJ/mol - const long double ionization_1st = 6.759; // eV - static void display() - { - displayElementImg(getFileName(41)); - } - } Nb; - - /// - /// Molybdenum is a chemical element with the symbol Mo and atomic number 42. - /// The name is from Neo-Latin molybdaenum, which is based on Ancient Greek - /// Μόλυβδος molybdos, meaning lead, since its ores were confused with lead ores. - /// - const struct MOLYBDENUM - { - const long double atomic_weight = 95.95; // u - const int atomic_number = 42; - const long double density_STP = 10280; // kg/m^3 - const long double melting_point = 2623.0; // C - const long double boiling_point = 4639.0; // C - const long double thermal_conductivity = 139.0; // W/mK - const long double electric_conductivity = 20.0; // MS/m - const long double resistivity = 5.0e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 251.0; // J/kgK - const long double heat_vaporization = 600.0; // kJ/mol - const long double heat_fusion = 36.0; // kJ/mol - const long double ionization_1st = 7.092; // eV - static void display() - { - displayElementImg(getFileName(42)); - } - } Mo; - - /// - /// Technetium is a chemical element with the symbol Tc and atomic number 43. - /// It is the lightest element whose isotopes are all radioactive, none of - /// which is stable other than the fully ionized state of ⁹⁷Tc. Nearly all - /// available technetium is produced as a synthetic element. - /// - const struct TECHNETIUM - { - const long double atomic_weight = (98); // u - const int atomic_number = 43; - const long double density_STP = 11500; // kg/m^3 - const long double melting_point = 2157.0; // C - const long double boiling_point = 4265.0; // C - const long double thermal_conductivity = 51.0; // W/mK - const long double electric_conductivity = 5.0; // MS/m - const long double resistivity = 2.0e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 63.0; // J/kgK - const long double heat_vaporization = 550.0; // kJ/mol - const long double heat_fusion = 23.0; // kJ/mol - const long double ionization_1st = 7.28; // eV - static void display() - { - displayElementImg(getFileName(43)); - } - } Tc; - - /// - /// Ruthenium is a chemical element with the symbol Ru and atomic number 44. - /// It is a rare transition metal belonging to the platinum group of the - /// periodic table. Like the other metals of the platinum group, ruthenium - /// is inert to most other chemicals. - /// - const struct RUTHENIUM - { - const long double atomic_weight = 101.07; // u - const int atomic_number = 44; - const long double density_STP = 12370; // kg/m^3 - const long double melting_point = 2334.0; // C - const long double boiling_point = 4150.0; // C - const long double thermal_conductivity = 120.0; // W/mK - const long double electric_conductivity = 14.0; // MS/m - const long double resistivity = 7.1e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 238.0; // J/kgK - const long double heat_vaporization = 580.0; // kJ/mol - const long double heat_fusion = 25.7; // kJ/mol - const long double ionization_1st = 7.361; // eV - static void display() - { - displayElementImg(getFileName(44)); - } - } Ru; - - /// - /// Rhodium is a chemical element with the symbol Rh and atomic number 45. - /// It is an extraordinarily rare, silvery-white, hard, corrosion-resistant, - /// and chemically inert transition metal. It is a noble metal and a member - /// of the platinum group. It has only one naturally occurring isotope, ¹⁰³Rh - /// - const struct RHODIUM - { - const long double atomic_weight = 102.91; // u - const int atomic_number = 45; - const long double density_STP = 12450; // kg/m^3 - const long double melting_point = 1964.0; // C - const long double boiling_point = 3695.0; // C - const long double thermal_conductivity = 150.0; // W/mK - const long double electric_conductivity = 23.0; // MS/m - const long double resistivity = 4.3e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 240.0; // J/kgK - const long double heat_vaporization = 495.0; // kJ/mol - const long double heat_fusion = 21.7; // kJ/mol - const long double ionization_1st = 7.459; // eV - static void display() - { - displayElementImg(getFileName(45)); - } - } Rh; - - /// - /// Palladium is a chemical element with the symbol Pd and atomic number 46. - /// It is a rare and lustrous silvery-white metal discovered in 1803 by the - /// English chemist William Hyde Wollaston. - /// - const struct PALLADIUM - { - const long double atomic_weight = 106.42; // u - const int atomic_number = 46; - const long double density_STP = 12023; // kg/m^3 - const long double melting_point = 1554.90; // C - const long double boiling_point = 2963.0; // C - const long double thermal_conductivity = 72.0; // W/mK - const long double electric_conductivity = 10.0; // MS/m - const long double resistivity = 1.0e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 240.0; // J/kgK - const long double heat_vaporization = 380.0; // kJ/mol - const long double heat_fusion = 16.7; // kJ/mol - const long double ionization_1st = 8.337; // eV - static void display() - { - displayElementImg(getFileName(46)); - } - } Pd; - - /// - /// Silver is a chemical element with the symbol Ag and atomic number 47. - /// A soft, white, lustrous transition metal, it exhibits the highest - /// electrical conductivity, thermal conductivity, and reflectivity of - /// any metal. - /// - const struct SILVER - { - const long double atomic_weight = 107.87; // u - const int atomic_number = 47; - const long double density_STP = 10490; // kg/m^3 - const long double melting_point = 961.780; // C - const long double boiling_point = 2162.0; // C - const long double thermal_conductivity = 430.0; // W/mK - const long double electric_conductivity = 62.0; // MS/m - const long double resistivity = 1.6e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 235.0; // J/kgK - const long double heat_vaporization = 255.0; // kJ/mol - const long double heat_fusion = 11.3; // kJ/mol - const long double ionization_1st = 7.576; // eV - static void display() - { - displayElementImg(getFileName(47)); - } - } Ag; - - /// - /// Cadmium is a chemical element with the symbol Cd and atomic number 48. - /// This soft, silvery-white metal is chemically similar to the two other - /// stable metals in group 12, zinc and mercury. - /// - const struct CADMIUM - { - const long double atomic_weight = 112.41; // u - const int atomic_number = 48; - const long double density_STP = 8650; // kg/m^3 - const long double melting_point = 321.07; // C - const long double boiling_point = 766.9; // C - const long double thermal_conductivity = 97.0; // W/mK - const long double electric_conductivity = 14.0; // MS/m - const long double resistivity = 7.0e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 230.0; // J/kgK - const long double heat_vaporization = 100.0; // kJ/mol - const long double heat_fusion = 6.3; // kJ/mol - const long double ionization_1st = 8.994; // eV - static void display() - { - displayElementImg(getFileName(48)); - } - } Cd; - - /// - /// Indium is a chemical element with the symbol In and atomic number 49. - /// Indium is the softest metal that is not an alkali metal. It is a - /// silvery-white metal that resembles tin in appearance. It is a - /// post-transition metal that makes up 0.21 parts per million of the - /// Earth's crust - /// - const struct INDIUM - { - const long double atomic_weight = 114.82; // u - const int atomic_number = 49; - const long double density_STP = 7310; // kg/m^3 - const long double melting_point = 156.60; // C - const long double boiling_point = 2072.0; // C - const long double thermal_conductivity = 82.0; // W/mK - const long double electric_conductivity = 12.0; // MS/m - const long double resistivity = 8.0e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 233.0; // J/kgK - const long double heat_vaporization = 230.0; // kJ/mol - const long double heat_fusion = 3.26; // kJ/mol - const long double ionization_1st = 5.786; // eV - static void display() - { - displayElementImg(getFileName(49)); - } - } In; - - /// - /// Tin is a chemical element with the symbol Sn and atomic number 50. - /// Tin is a silvery metal that characteristically has a faint yellow hue. - /// Tin, like indium, is soft enough to be cut without much force. - /// - const struct TIN - { - const long double atomic_weight = 118.71; // u - const int atomic_number = 50; - const long double density_STP = 7310; // kg/m^3 - const long double melting_point = 231.93; // C - const long double boiling_point = 2602.0; // C - const long double thermal_conductivity = 67.0; // W/mK - const long double electric_conductivity = 9.1; // MS/m - const long double resistivity = 1.1e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 217.0; // J/kgK - const long double heat_vaporization = 290.0; // kJ/mol - const long double heat_fusion = 7.0; // kJ/mol - const long double ionization_1st = 7.344; // eV - static void display() - { - displayElementImg(getFileName(50)); - } - } Sn; - - /// - /// Antimony is a chemical element with the symbol Sb and atomic number 51. - /// A lustrous gray metalloid, it is found in nature mainly as the sulfide - /// mineral stibnite. Antimony compounds have been known since ancient times - /// and were powdered for use as medicine and cosmetics, often known by the - /// Arabic name kohl. - /// - const struct ANTIMONY - { - const long double atomic_weight = 121.76; // u - const int atomic_number = 51; - const long double density_STP = 6697; // kg/m^3 - const long double melting_point = 630.63; // C - const long double boiling_point = 1587.0; // C - const long double thermal_conductivity = 24.0; // W/mK - const long double electric_conductivity = 2.5; // MS/m - const long double resistivity = 4.0e-7; //m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 207.0; // J/kgK - const long double heat_vaporization = 68.0; // kJ/mol - const long double heat_fusion = 19.7; // kJ/mol - const long double ionization_1st = 8.64; // eV - static void display() - { - displayElementImg(getFileName(51)); - } - } Sb; - - /// - /// Tellurium is a chemical element with the symbol Te and atomic number 52. - /// It is a brittle, mildly toxic, rare, silver-white metalloid. Tellurium - /// is chemically related to selenium and sulfur, all three of which are - /// chalcogens. It is occasionally found in native form as elemental crystals - /// - const struct TELLURIUM - { - const long double atomic_weight = 127.60; // u - const int atomic_number = 52; - const long double density_STP = 62420; // kg/m^3 - const long double melting_point = 449.51; // C - const long double boiling_point = 987.9; // C - const long double thermal_conductivity = 3.0; // W/mK - const long double electric_conductivity = 0.010; // MS/m - const long double resistivity = .0001; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 201.0; // J/kgK - const long double heat_vaporization = 48.0; // kJ/mol - const long double heat_fusion = 17.5; // kJ/mol - const long double ionization_1st = 9.010; // eV - static void display() - { - displayElementImg(getFileName(52)); - } - } Te; - - /// - /// Iodine is a chemical element with the symbol I and atomic number 53. - /// The heaviest of the stable halogens, it exists as a semi-lustrous, - /// non-metallic solid at standard conditions that melts to form a deep - /// violet liquid at 114 degrees Celsius, and boils to a violet gas at - /// 184 degrees Celsius. - /// - const struct IODINE - { - const long double atomic_weight = 126.90; // u - const int atomic_number = 53; - const long double density_STP = 4940; // kg/m^3 - const long double melting_point = 113.7; // C - const long double boiling_point = 184.3; // C - const long double thermal_conductivity = 0.449; // W/mK - const long double electric_conductivity = 1.0e-13; // MS/m - const long double resistivity = 1.0e7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 429.0; // J/kgK - const long double heat_vaporization = 20.9; // kJ/mol - const long double heat_fusion = 7.76; // kJ/mol - const long double ionization_1st = 10.451; // eV - static void display() - { - displayElementImg(getFileName(53)); - } - } I; - - /// - /// Xenon is a chemical element with the symbol Xe and atomic number 54. - /// It is a colorless, dense, odorless noble gas found in Earth's atmosphere - /// in trace amounts. - /// - const struct XENON - { - const long double atomic_weight = 131.29; // u - const int atomic_number = 54; - const long double density_STP = 5.9; // kg/m^3 - const long double melting_point = -111.8; // C - const long double boiling_point = -108.0; // C - const long double thermal_conductivity = .00565; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 158.32; // J/kgK - const long double heat_vaporization = 12.64; // kJ/mol - const long double heat_fusion = 2.30; // kJ/mol - const long double ionization_1st = 12.130; // eV - static void display() - { - displayElementImg(getFileName(54)); - } - } XE; - - /// - /// Caesium is a chemical element with the symbol Cs and atomic number 55. - /// It is a soft, silvery-golden alkali metal with a melting point of 28.5 °C, - /// which makes it one of only five elemental metals that are liquid at or - /// near room temperature - /// - const struct CAESIUM - { - const long double atomic_weight = 132.91; // u - const int atomic_number = 55; - const long double density_STP = 1879; // kg/m^3 - const long double melting_point = 28.440; // C - const long double boiling_point = 671.0; // C - const long double thermal_conductivity = 36.0; // W/mK - const long double electric_conductivity = 5.0; // MS/m - const long double resistivity = 2.0e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 242.0; // J/kgK - const long double heat_vaporization = 65.0; // kJ/mol - const long double heat_fusion = 2.09; // kJ/mol - const long double ionization_1st = 3.894; // eV - static void display() - { - displayElementImg(getFileName(55)); - } - } Cs; - - /// - /// Barium is a chemical element with the symbol Ba and atomic number 56. - /// It is the fifth element in group 2 and is a soft, silvery alkaline earth - /// metal. Because of its high chemical reactivity, barium is never found in - /// nature as a free element. - /// - const struct BARIUM - { - const long double atomic_weight = 137.33; // u - const int atomic_number = 56; - const long double density_STP = 3510; // kg/m^3 - const long double melting_point = 730.0; // C - const long double boiling_point = 1870.0; // C - const long double thermal_conductivity = 18.0; // W/mK - const long double electric_conductivity = 2.9; // MS/m - const long double resistivity = 3.5e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 205.0; // J/kgK - const long double heat_vaporization = 140.0; // kJ/mol - const long double heat_fusion = 8.0; // kJ/mol - const long double ionization_1st = 5.212; // eV - static void display() - { - displayElementImg(getFileName(56)); - } - } Ba; - - - /// - /// Lanthanum is a chemical element with the symbol La and atomic number 57. - /// It is a soft, ductile, silvery-white metal that tarnishes slowly when - /// exposed to air. - /// - const struct LANTHANUM - { - const long double atomic_weight = 138.91; // u - const int atomic_number = 57; - const long double density_STP = 6146; // kg/m^3 - const long double melting_point = 919.9; // C - const long double boiling_point = 3463.0; // C - const long double thermal_conductivity = 13.0; // W/mK - const long double electric_conductivity = 1.6; // MS/m - const long double resistivity = 6.1e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 195.0; // J/kgK - const long double heat_vaporization = 400.0; // kJ/mol - const long double heat_fusion = 6.2; // kJ/mol - const long double ionization_1st = 5.577; // eV - static void display() - { - displayElementImg(getFileName(57)); - } - } La; - - /// - /// Cerium is a chemical element with the symbol Ce and atomic number 58. - /// Cerium is a soft, ductile, and silvery-white metal that tarnishes when - /// exposed to air, and it is soft enough to be cut with a steel kitchen knife. - /// - const struct CERIUM - { - const long double atomic_weight = 140.12; // u - const int atomic_number = 58; - const long double density_STP = 6689; // kg/m^3 - const long double melting_point = 797.9; // C - const long double boiling_point = 3360.0; // C - const long double thermal_conductivity = 11.0; // W/mK - const long double electric_conductivity = 1.4; // MS/m - const long double resistivity = 7.4e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 192.0; // J/kgK - const long double heat_vaporization = 350.0; // kJ/mol - const long double heat_fusion = 5.5; // kJ/mol - const long double ionization_1st = 5.539; // eV - static void display() - { - displayElementImg(getFileName(58)); - } - } Ce; - - /// - /// Praseodymium is a chemical element with the symbol Pr and atomic number 59. - /// It is the third member of the lanthanide series and is traditionally - /// considered to be one of the rare-earth metals. - /// - const struct PRASEODYMIUM - { - const long double atomic_weight = 140.91; // u - const int atomic_number = 59; - const long double density_STP = 6640; // kg/m^3 - const long double melting_point = 930.9; // C - const long double boiling_point = 3290.0; // C - const long double thermal_conductivity = 13.0; // W/mK - const long double electric_conductivity = 1.4; // MS/m - const long double resistivity = 7.0e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 193.0; // J/kgK - const long double heat_vaporization = 330.0; // kJ/mol - const long double heat_fusion = 6.9; // kJ/mol - const long double ionization_1st = 5.46; // eV - static void display() - { - displayElementImg(getFileName(59)); - } - }Pr; - - /// - /// Neodymium is a chemical element with the symbol Nd and atomic number 60. - /// Neodymium belongs to the lanthanide series and is a rare-earth element. - /// It is a hard, slightly malleable silvery metal that quickly tarnishes - /// in air and moisture - /// - const struct NEODYMIUM - { - const long double atomic_weight = 144.24; // u - const int atomic_number = 60; - const long double density_STP = 7010; // kg/m^3 - const long double melting_point = 1021.0; // C - const long double boiling_point = 3100.0; // C - const long double thermal_conductivity = 17.0; // W/mK - const long double electric_conductivity = 1.6; // MS/m - const long double resistivity = 6.4e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 190.0; // J/kgK - const long double heat_vaporization = 285.0; // kJ/mol - const long double heat_fusion = 7.1; // kJ/mol - const long double ionization_1st = 5.525; // eV - static void display() - { - displayElementImg(getFileName(60)); - } - } Nd; - - /// - /// Promethium is a chemical element with the symbol Pm and atomic number 61. - /// All of its isotopes are radioactive; it is extremely rare, with only - /// about 500–600 grams naturally occurring in Earth's crust at any - /// given time. - /// - const struct PROMETHIUM - { - const long double atomic_weight = (145); // u - const int atomic_number = 61; - const long double density_STP = 7264; // kg/m^3 - const long double melting_point = 1100.0; // C - const long double boiling_point = 3000.0; // C - const long double thermal_conductivity = 15.0; // W/mK - const long double electric_conductivity = 1.3; // MS/m - const long double resistivity = 7.5e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = 290.0; // kJ/mol - const long double heat_fusion = 7.7; // kJ/mol - const long double ionization_1st = 5.6; // eV - static void display() - { - displayElementImg(getFileName(61)); - } - } Pm; - - /// - /// Samarium is a chemical element with the symbol Sm and atomic number 62. - /// It is a moderately hard silvery metal that slowly oxidizes in air. - /// Being a typical member of the lanthanide series, samarium usually assumes - /// the oxidation state +3. - /// - const struct SAMARIUM - { - const long double atomic_weight = 150.36; // u - const int atomic_number = 62; - const long double density_STP = 7353; // kg/m^3 - const long double melting_point = 1072.0; // C - const long double boiling_point = 1803.0; // C - const long double thermal_conductivity = 13.0; // W/mK - const long double electric_conductivity = 1.1; // MS/m - const long double resistivity = 9.4e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 196.0; // J/kgK - const long double heat_vaporization = 175.0; // kJ/mol - const long double heat_fusion = 8.6; // kJ/mol - const long double ionization_1st = 5.643; // eV - static void display() - { - displayElementImg(getFileName(62)); - } - } Sm; - - /// - /// Europium is a chemical element with the symbol Eu and atomic number 63. - /// Europium is the most reactive lanthanide by far, having to be stored - /// under an inert fluid to protect it from atmospheric oxygen or moisture. - /// - const struct EUROPIUM - { - const long double atomic_weight = 151.96; // u - const int atomic_number = 63; - const long double density_STP = 5244; // kg/m^3 - const long double melting_point = 821.9; // C - const long double boiling_point = 1500.0; // C - const long double thermal_conductivity = 14.0; // W/mK - const long double electric_conductivity = 1.1; // MS/m - const long double resistivity = 9.0e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 182.0; // J/kgK - const long double heat_vaporization = 175.0; // kJ/mol - const long double heat_fusion = 9.2; // kJ/mol - const long double ionization_1st = 5.670; // eV - static void display() - { - displayElementImg(getFileName(63)); - } - } Eu; - - /// - /// Gadolinium is a chemical element with the symbol Gd and atomic number 64. - /// Gadolinium is a silvery-white metal when oxidation is removed. It is - /// only slightly malleable and is a ductile rare-earth element. Gadolinium - /// reacts with atmospheric oxygen or moisture slowly to form a black coating. - /// - const struct GADOLINIUM - { - const long double atomic_weight = 157.25; // u - const int atomic_number = 64; - const long double density_STP = 7901; // kg/m^3 - const long double melting_point = 1313.0; // C - const long double boiling_point = 3250.0; // C - const long double thermal_conductivity = 11.0; // W/mK - const long double electric_conductivity = .77; // MS/m - const long double resistivity = 1.3e-6; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 240.0; // J/kgK - const long double heat_vaporization = 305.0; // kJ/mol - const long double heat_fusion = 10.0; // kJ/mol - const long double ionization_1st = 6.150; // eV - static void display() - { - displayElementImg(getFileName(64)); - } - } Gd; - - /// - /// Terbium is a chemical element with the symbol Tb and atomic number 65. - /// It is a silvery-white, rare earth metal that is malleable, ductile, - /// and soft enough to be cut with a knife. The ninth member of the - /// lanthanide series, terbium is a fairly electro-positive metal that reacts - /// with water, evolving hydrogen gas. - /// - const struct TERBIUM - { - const long double atomic_weight = 158.93; // u - const int atomic_number = 65; - const long double density_STP = 8219; // kg/m^3 - const long double melting_point = 1356.0; // C - const long double boiling_point = 3230.0; // C - const long double thermal_conductivity = 11.0; // W/mK - const long double electric_conductivity = .83; // MS/m - const long double resistivity = 1.2e-6; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 182.0; // J/kgK - const long double heat_vaporization = 295.0; // kJ/mol - const long double heat_fusion = 10.8; // kJ/mol - const long double ionization_1st = 5.864; // eV - static void display() - { - displayElementImg(getFileName(65)); - } - } Tb; - - /// - /// Dysprosium is the chemical element with the symbol Dy and atomic number 66. - /// It is a rare-earth element with a metallic silver luster. Dysprosium is - /// never found in nature as a free element, though it is found in various - /// minerals, such as xenotime. - /// - const struct DYSPROSIUM - { - const long double atomic_weight = 162.50; // u - const int atomic_number = 66; - const long double density_STP = 8551; // kg/m^3 - const long double melting_point = 1412.0; // C - const long double boiling_point = 2567.0; // C - const long double thermal_conductivity = 11.0; // W/mK - const long double electric_conductivity = 1.1; // MS/m - const long double resistivity = 9.1e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 167.0; // J/kgK - const long double heat_vaporization = 280.0; // kJ/mol - const long double heat_fusion = 11.1; // kJ/mol - const long double ionization_1st = 5.934; // eV - static void display() - { - displayElementImg(getFileName(66)); - } - } Dy; - - /// - /// Holmium is a chemical element with the symbol Ho and atomic number 67. - /// Part of the lanthanide series, holmium is a rare-earth element. Holmium - /// was discovered through isolation by Swedish chemist Per Theodor Cleve - /// and independently by Jacques-Louis Soret and Marc Delafontaine who - /// observed it spectroscopically in 1878. - /// - const struct HOLMIUM - { - const long double atomic_weight = 164.93; // u - const int atomic_number = 67; - const long double density_STP = 8795; // kg/m^3 - const long double melting_point = 1474.0; // C - const long double boiling_point = 2700.0; // C - const long double thermal_conductivity = 16.0; // W/mK - const long double electric_conductivity = 1.1; // MS/m - const long double resistivity = 9.4e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 165.0; // J/kgK - const long double heat_vaporization = 265.0; // kJ/mol - const long double heat_fusion = 17.0; // kJ/mol - const long double ionization_1st = 6.022; // eV - static void display() - { - displayElementImg(getFileName(67)); - } - } Ho; - - /// - /// Erbium is a chemical element with the symbol Er and atomic number 68. - /// A silvery-white solid metal when artificially isolated, natural erbium - /// is always found in chemical combination with other elements. - /// - const struct ERBIUM - { - const long double atomic_weight = 167.26; // u - const int atomic_number = 68; - const long double density_STP = 9066; // kg/m^3 - const long double melting_point = 1497.0; // C - const long double boiling_point = 2868.0; // C - const long double thermal_conductivity = 15.0; // W/mK - const long double electric_conductivity = 1.2; // MS/m - const long double resistivity = 8.6e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 168.0; // J/kgK - const long double heat_vaporization = 285.0; // kJ/mol - const long double heat_fusion = 19.9; // kJ/mol - const long double ionization_1st = 6.108; // eV - static void display() - { - displayElementImg(getFileName(68)); - } - } Er; - - /// - /// Thulium is a chemical element with the symbol Tm and atomic number 69. - /// It is the thirteenth and third-last element in the lanthanide series. - /// - const struct THULIUM - { - const long double atomic_weight = 168.93; // u - const int atomic_number = 69; - const long double density_STP = 9320; // kg/m^3 - const long double melting_point = 1545.0; // C - const long double boiling_point = 1950.0; // C - const long double thermal_conductivity = 17.0; // W/mK - const long double electric_conductivity = 1.4; // MS/m - const long double resistivity = 7.0e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 160.0; // J/kgK - const long double heat_vaporization = 250.0; // kJ/mol - const long double heat_fusion = 16.8; // kJ/mol - const long double ionization_1st = 6.184; // eV - static void display() - { - displayElementImg(getFileName(69)); - } - } Tm; - - /// - /// Ytterbium is a chemical element with the symbol Yb and atomic number 70. - /// It is the fourteenth and penultimate element in the lanthanide series, - /// which is the basis of the relative stability of its +2 oxidation state. - /// - const struct YTTERBIUM - { - const long double atomic_weight = 173.05; // u - const int atomic_number = 70; - const long double density_STP = 6570; // kg/m^3 - const long double melting_point = 818.9; // C - const long double boiling_point = 1196.0; // C - const long double thermal_conductivity = 39.0; // W/mK - const long double electric_conductivity = 3.6; // MS/m - const long double resistivity = 2.8e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 154.0; // J/kgK - const long double heat_vaporization = 160.0; // kJ/mol - const long double heat_fusion = 7.7; // kJ/mol - const long double ionization_1st = 6.254; // eV - static void display() - { - displayElementImg(getFileName(70)); - } - } Yb; - - /// - /// Lutetium is a chemical element with the symbol Lu and atomic number 71. - /// It is a silvery white metal, which resists corrosion in dry air, - /// but not in moist air. Lutetium is the last element in the lanthanide series, - /// and it is traditionally counted among the rare earths. - /// - const struct LUTERTIUM - { - const long double atomic_weight = 174.97; // u - const int atomic_number = 71; - const long double density_STP = 9841; // kg/m^3 - const long double melting_point = 1663.0; // C - const long double boiling_point = 3402.0; // C - const long double thermal_conductivity = 16.0; // W/mK - const long double electric_conductivity = 1.8; // MS/m - const long double resistivity = 5.6e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 154.0; // J/kgK - const long double heat_vaporization = 415.0; // kJ/mol - const long double heat_fusion = 22.0; // kJ/mol - const long double ionization_1st = 5.426; // eV - static void display() - { - displayElementImg(getFileName(71)); - } - } Lu; - - - /// - /// Hafnium is a chemical element with the symbol Hf and atomic number 72. - /// A lustrous, silvery gray, tetravalent transition metal, hafnium chemically - /// resembles zirconium and is found in many zirconium minerals. - /// - const struct HAFNIUM - { - const long double atomic_weight = 178.49; // u - const int atomic_number = 72; - const long double density_STP = 13310; // kg/m^3 - const long double melting_point = 2233.0; // C - const long double boiling_point = 4603.0; // C - const long double thermal_conductivity = 23.0; // W/mK - const long double electric_conductivity = 3.3; // MS/m - const long double resistivity = 3.0e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 144.0; // J/kgK - const long double heat_vaporization = 630.0; // kJ/mol - const long double heat_fusion = 25.5; // kJ/mol - const long double ionization_1st = 6.825; // eV - static void display() - { - displayElementImg(getFileName(72)); - } - } Hf; - - - /// - /// Tantalum is a chemical element with the symbol Ta and atomic number 73. - /// Previously known as tantalium, it is named after Tantalus, a villain - /// from Greek mythology. Tantalum is a rare, hard, blue-gray, lustrous - /// transition metal that is highly corrosion-resistant. - /// - const struct TANTALUM - { - const long double atomic_weight = 180.95; // u - const int atomic_number = 73; - const long double density_STP = 16650; // kg/m^3 - const long double melting_point = 3017.0; // C - const long double boiling_point = 5458.0; // C - const long double thermal_conductivity = 57.0; // W/mK - const long double electric_conductivity = 7.7; // MS/m - const long double resistivity = 1.3e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 140.0; // J/kgK - const long double heat_vaporization = 735.0; // kJ/mol - const long double heat_fusion = 36.0; // kJ/mol - const long double ionization_1st = 7.89; // eV - static void display() - { - displayElementImg(getFileName(73)); - } - } Ta; - /// - /// Tungsten, or wolfram, is a chemical element with the symbol W and atomic number 74. - /// Tungsten is a rare metal found naturally on Earth almost exclusively as - /// compounds with other elements. It was identified as a new element in 1781 - /// and first isolated as a metal in 1783. - /// - const struct TUNGSTEN - { - const long double atomic_weight = 183.84; // u - const int atomic_number = 74; - const long double density_STP = 19250; // kg/m^3 - const long double melting_point = 3422.0; // C - const long double boiling_point = 5555.0; // C - const long double thermal_conductivity = 170.0; // W/mK - const long double electric_conductivity = 20.0; // MS/m - const long double resistivity = 5.0e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 132.0; // J/kgK - const long double heat_vaporization = 800.0; // kJ/mol - const long double heat_fusion = 35.0; // kJ/mol - const long double ionization_1st = 7.98; // eV - static void display() - { - displayElementImg(getFileName(74)); - } - } W; - - /// - /// Rhenium is a chemical element with the symbol Re and atomic number 75. - /// It is a silvery-gray, heavy, third-row transition metal in group 7 of - /// the periodic table. With an estimated average concentration of 1 part - /// per billion, rhenium is one of the rarest elements in the Earth's crust. - /// - const struct RHENIUM - { - const long double atomic_weight = 186.21; // u - const int atomic_number = 75; - const long double density_STP = 21020; // kg/m^3 - const long double melting_point = 3186.0; // C - const long double boiling_point = 5596.0; // C - const long double thermal_conductivity = 48.0; // W/mK - const long double electric_conductivity = 5.6; // MS/m - const long double resistivity = 1.8e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 137.0; // J/kgK - const long double heat_vaporization = 705.0; // kJ/mol - const long double heat_fusion = 33.0; // kJ/mol - const long double ionization_1st = 7.88; // eV - static void display() - { - displayElementImg(getFileName(75)); - } - } Re; - - /// - /// Osmium is a chemical element with the symbol Os and atomic number 76. - /// It is a hard, brittle, bluish-white transition metal in the platinum - /// group that is found as a trace element in alloys, mostly in platinum ores. - /// - const struct OSMIUM - { - const long double atomic_weight = 190.23; // u - const int atomic_number = 76; - const long double density_STP = 22590; // kg/m^3 - const long double melting_point = 3033.0; // C - const long double boiling_point = 5012.0; // C - const long double thermal_conductivity = 88.0; // W/mK - const long double electric_conductivity = 12.0; // MS/m - const long double resistivity = 8.1e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 130.0; // J/kgK - const long double heat_vaporization = 630.0; // kJ/mol - const long double heat_fusion = 31.0; // kJ/mol - const long double ionization_1st = 8.71; // eV - static void display() - { - displayElementImg(getFileName(76)); - } - } Os; - - /// - /// Iridium is a chemical element with the symbol Ir and atomic number 77. - /// A very hard, brittle, silvery-white transition metal of the platinum group, - /// iridium is considered to be the second-densest metal with a density of - /// 22.56 g/cm³ as defined by experimental X-ray crystallography. - /// - const struct IRIDIUM - { - const long double atomic_weight = 192.22; // u - const int atomic_number = 77; - const long double density_STP = 22560; // kg/m^3 - const long double melting_point = 2466.0; // C - const long double boiling_point = 4428.0; // C - const long double thermal_conductivity = 150.0; // W/mK - const long double electric_conductivity = 21.0; // MS/m - const long double resistivity = 4.7e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 131.0; // J/kgK - const long double heat_vaporization = 560.0; // kJ/mol - const long double heat_fusion = 26.0; // kJ/mol - const long double ionization_1st = 9.12; // eV - static void display() - { - displayElementImg(getFileName(77)); - } - } Ir; - - /// - /// Platinum is a chemical element with the symbol Pt and atomic number 78. - /// It is a dense, malleable, ductile, highly nonreactive, precious, - /// silverish-white transition metal. Its name is derived from the Spanish - /// term platino, meaning "little silver". - /// - const struct PLATINUM - { - const long double atomic_weight = 195.08; // u - const int atomic_number = 78;//Z - const long double density_STP = 21450; // kg/m^3 - const long double melting_point = 1768.3; // C - const long double boiling_point = 3825.0; // C - const long double thermal_conductivity = 72.0; // W/mK - const long double electric_conductivity = 9.4; // MS/m - const long double resistivity = 1.1e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 133.0; // J/kgK - const long double heat_vaporization = 490.0; // kJ/mol - const long double heat_fusion = 20.0; // kJ/mol - const long double ionization_1st = 9.02; // eV - static void display() - { - displayElementImg(getFileName(78)); - } - } Pt; - - /// - /// Gold is a chemical element with the symbol Au and atomic number 79, - /// making it one of the higher atomic number elements that occur naturally. - /// In a pure form, it is a bright, slightly reddish yellow, dense, soft, - /// malleable, and ductile metal. Chemically, gold is a transition metal - /// and a group 11 element. - /// - const struct GOLD - { - const long double atomic_weight = 196.97; // u - const int atomic_number = 79; - const long double density_STP = 19300; // kg/m^3 - const long double melting_point = 1064.18; // C - const long double boiling_point = 2856; // C - const long double thermal_conductivity = 320.0; // W/mK - const long double electric_conductivity = 45.0; // MS/m - const long double resistivity = 2.2e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 129.1; // J/kgK - const long double heat_vaporization = 330.0; // kJ/mol - const long double heat_fusion = 12.5; // kJ/mol - const long double ionization_1st = 9.225; // eV - static void display() - { - displayElementImg(getFileName(79)); - } - } Au; - - /// - /// Mercury is a chemical element with the symbol Hg and atomic number 80. - /// It is commonly known as quicksilver and was formerly named hydrargyrum. - /// - const struct MERCURY - { - const long double atomic_weight = 200.59; // u - const int atomic_number = 80; - const long double density_STP = 13534; // kg/m^3 - const long double melting_point = -38.830; // C - const long double boiling_point = 356.73; // C - const long double thermal_conductivity = 8.3; // W/mK - const long double electric_conductivity = 1.0; // MS/m - const long double resistivity = 9.6e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 139.5; // J/kgK - const long double heat_vaporization = 59.2; // kJ/mol - const long double heat_fusion = 2.29; // kJ/mol - const long double ionization_1st = 10.438; // eV - static void display() - { - displayElementImg(getFileName(80)); - } - } Hg; - - /// - /// Thallium is a chemical element with the symbol Tl and atomic number 81. - /// It is a gray post-transition metal that is not found free in nature. - /// When isolated, thallium resembles tin, but discolors when exposed to air. - /// - const struct THALLIUM - { - const long double atomic_weight = 204.38; // u - const int atomic_number = 81; - const long double density_STP = 11850; // kg/m^3 - const long double melting_point = 304.0; // C - const long double boiling_point = 1473.0; // C - const long double thermal_conductivity = 46.0; // W/mK - const long double electric_conductivity = 6.7; // MS/m - const long double resistivity = 1.5e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 129.0; // J/kg - const long double heat_vaporization = 165.0; // kJ/mol - const long double heat_fusion = 4.2; // kJ/mol - const long double ionization_1st = 6.109; // eV - static void display() - { - displayElementImg(getFileName(81)); - } - } Tl; - - /// - /// Lead is a chemical element with the symbol Pb and atomic number 82. - /// It is a heavy metal that is denser than most common materials. Lead is - /// soft and malleable, and also has a relatively low melting point. When - /// freshly cut, lead is silvery with a hint of blue; it tarnishes to a dull - /// gray color when exposed to air. - /// - const struct LEAD - { - const long double atomic_weight = 207.2; // u - const int atomic_number = 82; - const long double density_STP = 11340; // kg/m^3 - const long double melting_point = 327.46; // C - const long double boiling_point = 1749.0; // C - const long double thermal_conductivity = 35.0; // W/mK - const long double electric_conductivity = 4.8; // MS/m - const long double resistivity = 2.1e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 127.0; // J/kgK - const long double heat_vaporization = 178.0; // kJ/mol - const long double heat_fusion = 4.77; // kJ/mol - const long double ionization_1st = 7.417; // eV - static void display() - { - displayElementImg(getFileName(82)); - } - } Pb; - - /// - /// Bismuth is a chemical element with the symbol Bi and atomic number 83. - /// It is a pentavalent post-transition metal and one of the pnictogens with - /// chemical properties resembling its lighter group 15 siblings arsenic - /// and antimony. - /// - const struct BISMUTH - { - const long double atomic_weight = 208.98; // u - const int atomic_number = 83; - const long double density_STP = 9780; // kg/m^3 - const long double melting_point = 271.3; // C - const long double boiling_point = 1564.0; // C - const long double thermal_conductivity = 8.0; // W/mK - const long double electric_conductivity = .77; // MS/m - const long double resistivity = 1.3e-6; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 122.0; // J/kgK - const long double heat_vaporization = 160.0; // kJ/mol - const long double heat_fusion = 10.9; // kJ/mol - const long double ionization_1st = 7.29; // eV - static void display() - { - displayElementImg(getFileName(83)); - } - } Bi; - - /// - /// Polonium is a chemical element with the symbol Po and atomic number 84. - /// A rare and highly radioactive metal with no stable isotopes, polonium - /// is chemically similar to selenium and tellurium, though its metallic - /// character resembles that of its horizontal neighbors in the periodic - /// table: thallium, lead, and bismuth. - /// - const struct POLONIUM - { - const long double atomic_weight = (209); // u - const int atomic_number = 84; - const long double density_STP = 9196.0; // kg/m^3 - const long double melting_point = 255.0; // C - const long double boiling_point = 961.9; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = 2.3; // MS/m - const long double resistivity = 4.3e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = 100.0; // kJ/mol - const long double heat_fusion = 13.0; // kJ/mol - const long double ionization_1st = 8.417; // eV - static void display() - { - displayElementImg(getFileName(84)); - } - } Po; - - /// - /// Astatine is a chemical element with the symbol At and atomic number 85. - /// It is the rarest naturally occurring element in the Earth's crust, - /// occurring only as the decay product of various heavier elements. - /// All of astatine's isotopes are short-lived; the most stable is - /// astatine-210, with a half-life of 8.1 hours. - /// - const struct ASTATINE - { - const long double atomic_weight = (210); // u - const int atomic_number = 85; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = 302.0; // C - const long double boiling_point = 350.0; // C - const long double thermal_conductivity = 2.0; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = 40.0; // kJ/mol - const long double heat_fusion = 6.0; // kJ/mol - const long double ionization_1st = 9.22; // eV - static void display() - { - displayElementImg(getFileName(85)); - } - } At; - - /// - /// Radon is a chemical element with the symbol Rn and atomic number 86. - /// It is a radioactive, colorless, odorless, tasteless noble gas. - /// - const struct RADON - { - const long double atomic_weight = (222); // u - const int atomic_number = 86; - const long double density_STP = 9.73; // kg/m^3 - const long double melting_point = -71.1; // C - const long double boiling_point = -61.85; // C - const long double thermal_conductivity = .00361; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 93.65; // J/kgK - const long double heat_vaporization = 17.0; // kJ/mol - const long double heat_fusion = 3.0; // kJ/mol - const long double ionization_1st = 10.75; // eV - static void display() - { - displayElementImg(getFileName(86)); - } - } Rn; - - /// - /// Francium is a chemical element with the symbol Fr and atomic number 87. - /// Prior to its discovery, it was referred to as eka-caesium. It is extremely - /// radioactive; its most stable isotope, francium-223, has a half-life - /// of only 22 minutes. - /// - const struct FRANCIUM - { - const long double atomic_weight = (223); // u - const int atomic_number = 87; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = 20.9; // C - const long double boiling_point = 650.0; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = 65.0; // kJ/mol - const long double heat_fusion = 2.0; // kJ/mol - const long double ionization_1st = 3.94; // eV - static void display() - { - displayElementImg(getFileName(87)); - } - } Fr; - - /// - /// Radium is a chemical element with the symbol Ra and atomic number 88. - /// It is the sixth element in group 2 of the periodic table, also known - /// as the alkaline earth metals. Pure radium is silvery-white, but it - /// readily reacts with nitrogen on exposure to air, forming a black - /// surface layer of radium nitride. - /// - const struct RADIUM - { - const long double atomic_weight = (226); // u - const int atomic_number = 88; - const long double density_STP = 5000.0; // kg/m^3 - const long double melting_point = 700.0; // C - const long double boiling_point = 1737.0; // C - const long double thermal_conductivity = 19.0; // W/mK - const long double electric_conductivity = 1.0; // MS/m - const long double resistivity = 1.0e-6; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 92.0; // J/kgK - const long double heat_vaporization = 125.0; // kJ/mol - const long double heat_fusion = 8.0; // kJ/mol - const long double ionization_1st = 5.279; // eV - static void display() - { - displayElementImg(getFileName(88)); - } - } Ra; - - - /// - /// Actinium is a chemical element with the symbol Ac and atomic number 89. - /// It was first isolated by Friedrich Oskar Giesel in 1902, who gave it - /// the name emanium; the element got its name by being wrongly identified - /// with a substance André-Louis Debierne found and called actinium. - /// - const struct ACTINIUM - { - const long double atomic_weight = (227); // u - const int atomic_number = 89; - const long double density_STP = 10070.0; // kg/m^3 - const long double melting_point = 1050.0; // C - const long double boiling_point = 3200.0; // C - const long double thermal_conductivity = 12.0; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 120.0; // J/kgK - const long double heat_vaporization = 400.0; // kJ/mol - const long double heat_fusion = 14.0; // kJ/mol - const long double ionization_1st = 5.17; // eV - static void display() - { - displayElementImg(getFileName(89)); - } - } Ac; - - /// - /// Thorium is a weakly radioactive metallic chemical element with the symbol Th and atomic number 90. - /// Thorium is silvery and tarnishes black when it is exposed to air, forming - /// thorium dioxide; it is moderately soft, malleable, and has a high melting point. - /// - const struct THORIUM - { - const long double atomic_weight = 232.04; // u - const int atomic_number = 90; - const long double density_STP = 11724.0; // kg/m^3 - const long double melting_point = 1750.0; // C - const long double boiling_point = 4820.0; // C - const long double thermal_conductivity = 54.0; // W/mK - const long double electric_conductivity = 6.7; // MS/m - const long double resistivity = 1.5e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 118.0; // J/kgK - const long double heat_vaporization = 530.0; // kJ/mol - const long double heat_fusion = 16.0; // kJ/mol - const long double ionization_1st = 6.08; // eV - static void display() - { - displayElementImg(getFileName(90)); - } - } Th; - - /// - /// Protactinium is a chemical element with the symbol Pa and atomic number 91. - /// It is a dense, silvery-gray actinide metal which readily reacts with oxygen, - /// water vapor and inorganic acids. - /// - const struct PROTACTINIUM - { - const long double atomic_weight = 231.04; // u - const int atomic_number = 91; - const long double density_STP = 15370.0; // kg/m^3 - const long double melting_point = 1572.0; // C - const long double boiling_point = 4000.0; // C - const long double thermal_conductivity = 47.0; // W/mK - const long double electric_conductivity = 5.6; // MS/m - const long double resistivity = 1.8e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 99.1; // J/kgK - const long double heat_vaporization = 470.0; // kJ/mol - const long double heat_fusion = 15.0; // kJ/mol - const long double ionization_1st = 5.89; // eV - static void display() - { - displayElementImg(getFileName(91)); - } - } Pa; - - /// - /// Uranium is a chemical element with the symbol U and atomic number 92. - /// It is a silvery-grey metal in the actinide series of the periodic table. - /// A uranium atom has 92 protons and 92 electrons, of which 6 are - /// valence electrons. - /// - const struct URANIUM - { - const long double atomic_weight = 238.03; // u - const int atomic_number = 92; - const long double density_STP = 19050.0; // kg/m^3 - const long double melting_point = 1135.0; // C - const long double boiling_point = 3900.0; // C - const long double thermal_conductivity = 27.0; // W/mK - const long double electric_conductivity = 3.6; // MS/m - const long double resistivity = 2.8e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = 116.0; // J/kgK - const long double heat_vaporization = 420.0; // kJ/mol - const long double heat_fusion = 14.0; // kJ/mol - const long double ionization_1st = 6.194; // eV - static void display() - { - displayElementImg(getFileName(192)); - } - } U; - - /// - /// Neptunium is a chemical element with the symbol Np and atomic number 93. - /// A radioactive actinide metal, neptunium is the first transuranic element. - /// Its position in the periodic table just after uranium, named after the - /// planet Uranus, led to it being named after Neptune, the next planet - /// beyond Uranus. - /// - const struct NEPTUNIUM - { - const long double atomic_weight = (237); // u - const int atomic_number = 93; - const long double density_STP = 20450.0; // kg/m^3 - const long double melting_point = 644.0; // C - const long double boiling_point = 4000.0; // C - const long double thermal_conductivity = 6.0; // W/mK - const long double electric_conductivity = .83; // MS/m - const long double resistivity = 1.2e-6; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = 335.0; // kJ/mol - const long double heat_fusion = 10.0; // kJ/mol - const long double ionization_1st = 6.265; // eV - static void display() - { - displayElementImg(getFileName(93)); - } - } Np; - - /// - /// Plutonium is a radioactive chemical element with the symbol Pu and atomic number 94. - /// It is an actinide metal of silvery-gray appearance that tarnishes when exposed to air, - /// and forms a dull coating when oxidized. The element normally exhibits six allotropes - /// and four oxidation states. - /// - const struct PLUTONIUM - { - const long double atomic_weight = (244); // u - const int atomic_number = 94; - const long double density_STP = 19816.0; // kg/m^3 - const long double melting_point = 640.0; // C - const long double boiling_point = 3230.0; // C - const long double thermal_conductivity = 6.0; // W/mK - const long double electric_conductivity = .67; // MS/m - const long double resistivity = 1.5e-6; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = 325.0; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = 6.060; // eV - static void display() - { - displayElementImg(getFileName(94)); - } - } Pu; - - /// - /// Americium is a synthetic radioactive chemical element with the symbol Am and atomic number 95. - /// It is a transuranic member of the actinide series, in the periodic table located under - /// the lanthanide element europium, and thus by analogy was named after the Americas. - /// - const struct AMERICIUM - { - const long double atomic_weight = (243); // u - const int atomic_number = 95; - const long double density_STP = 13670.0; // kg/m^3 - const long double melting_point = 1176.0; // C - const long double boiling_point = 2011.0; // C - const long double thermal_conductivity = 10.0; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = 5.99; // eV - static void display() - { - displayElementImg(getFileName(95)); - } - } Am; - - /// - /// Curium is a transuranic radioactive chemical element with the symbol Cm and atomic number 96. - /// This element of the actinide series was named after Marie and Pierre Curie, both known - /// for their research on radioactivity. - /// - const struct CURIUM - { - const long double atomic_weight = (247); // u - const int atomic_number = 96; - const long double density_STP = 13510.0; // kg/m^3 - const long double melting_point = 1345.0; // C - const long double boiling_point = 3110.0; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = 6.02; // eV - static void display() - { - displayElementImg(getFileName(96)); - } - } Cm; - - /// - /// Berkelium is a transuranic radioactive chemical element with the symbol Bk and atomic number 97. - /// It is a member of the actinide and transuranium element series. It is named - /// after the city of Berkeley, California, the location of the Lawrence Berkeley - /// National Laboratory where it was discovered in December 1949. - /// - const struct BERKELIUM - { - const long double atomic_weight = (247); // u - const int atomic_number = 97; - const long double density_STP = 14780.00; // kg/m^3 - const long double melting_point = 1050.0; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = 10.0; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = 6.23; // eV - static void display() - { - displayElementImg(getFileName(97)); - } - } Bk; - - /// - /// Californium is a radioactive chemical element with the symbol Cf and atomic number 98. - /// The element was first synthesized in 1950 at the Lawrence Berkeley National Laboratory, - /// by bombarding curium with alpha particles. - /// - const struct CALIFORNIUM - { - const long double atomic_weight = (251); // u - const int atomic_number = 98; - const long double density_STP = 15100.0; // kg/m^3 - const long double melting_point = 899.9; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = 6.30; // eV - static void display() - { - displayElementImg(getFileName(98)); - } - } Cf; - - /// - /// Einsteinium is a synthetic element with the symbol Es and atomic number 99. - /// Einsteinium is a member of the actinide series and it is the seventh transuranic - /// element. It is named to honor Albert Einstein. Einsteinium was discovered - /// as a component of the debris of the first hydrogen bomb explosion in 1952. - /// - const struct EINSTEINIUM - { - const long double atomic_weight = (252); // u - const int atomic_number = 99; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = 859.9; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = 6.42; // eV - static void display() - { - displayElementImg(getFileName(99)); - } - } Es; - - /// - /// Fermium is a synthetic element with the symbol Fm and atomic number 100. - /// It is an actinide and the heaviest element that can be formed by neutron - /// bombardment of lighter elements, and hence the last element that can be - /// prepared in macroscopic quantities, although pure fermium metal has not - /// yet been prepared. - /// - const struct FERMIUM - { - const long double atomic_weight = (257); // u - const int atomic_number = 100; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = 1500.0; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = 6.50; // eV - static void display() - { - displayElementImg(getFileName(100)); - } - } Fm; - - /// - /// Mendelevium is a synthetic element with the symbol Md and atomic number 101. - /// A metallic radioactive transuranic element in the actinide series, it is the - /// first element by atomic number that currently cannot be produced in - /// macroscopic quantities through neutron bombardment of lighter elements. - /// - const struct MANDELEVIUM - { - const long double atomic_weight = (258); // u - const int atomic_number = 101; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = 830.0; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = 6.58; // eV - static void display() - { - displayElementImg(getFileName(101)); - } - } Md; - - /// - /// Nobelium is a synthetic chemical element with the symbol No and atomic number 102. - /// It is named in honor of Alfred Nobel, the inventor of dynamite and benefactor - /// of science. A radioactive metal, it is the tenth transuranic element and is - /// the penultimate member of the actinide series. - /// - const struct NOBELIUM - { - const long double atomic_weight = (259); // u - const int atomic_number = 102; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = 830.0; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = 6.65; // eV - static void display() - { - displayElementImg(getFileName(102)); - } - } No; - - /// - /// Lawrencium is a synthetic chemical element with the symbol Lr and atomic number 103. - /// It is named in honor of Ernest Lawrence, inventor of the cyclotron, a - /// device that was used to discover many artificial radioactive elements. - /// - const struct LAWRENCIUM - { - const long double atomic_weight = (266); // u - const int atomic_number = 103; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = 1600.0; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = 4.87; // eV - static void display() - { - displayElementImg(getFileName(103)); - } - } Lr; - - /// - /// Rutherfordium is a synthetic chemical element with the symbol Rf and atomic number 104, - /// named after New Zealand physicist Ernest Rutherford. As a synthetic element, - /// it is not found in nature and can only be created in a laboratory. - /// - const struct RUTHERFORDIUM - { - const long double atomic_weight = (267); // u - const int atomic_number = 104; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = 6.01; // eV - static void display() - { - displayElementImg(getFileName(104)); - } - } Rf; - - /// - /// Dubnium is a synthetic chemical element with the symbol Db and atomic number 105. - /// Dubnium is highly radioactive: the most stable known isotope, dubnium-268, - /// has a half-life of about 28 hours. This greatly limits extended research - /// on dubnium. Dubnium does not occur naturally on Earth and is produced - /// artificially. - /// - const struct DUBNIUM - { - const long double atomic_weight = (268); // u - const int atomic_number = 105; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = FP_NAN; // eV - static void display() - { - displayElementImg(getFileName(105)); - } - } Db; - - /// - /// Seaborgium is a synthetic chemical element with the symbol Sg and atomic number 106. - /// It is named after the American nuclear chemist Glenn T. Seaborg. As a synthetic - /// element, it can be created in a laboratory but is not found in nature. - /// - const struct SEABORGIUM - { - const long double atomic_weight = (269); // u - const int atomic_number = 106; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = FP_NAN; // eV - static void display() - { - displayElementImg(getFileName(106)); - } - } Sg; - - /// - /// Bohrium is a synthetic chemical element with the symbol Bh and atomic number 107. - /// It is named after Danish physicist Niels Bohr. As a synthetic element, - /// it can be created in a laboratory but is not found in nature. - /// - const struct BOHRIUM - { - const long double atomic_weight = (270); // u - const int atomic_number = 107; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = FP_NAN; // eV - static void display() - { - displayElementImg(getFileName(107)); - } - } Bh; - - /// - /// Hassium is a chemical element with the symbol Hs and the atomic number 108. - /// Hassium is highly radioactive; its most stable known isotopes have half-lives - /// of approximately ten seconds. - /// - const struct HASSIUM - { - const long double atomic_weight = 277; // u - const int atomic_number = 108; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = FP_NAN; // eV - static void display() - { - displayElementImg(getFileName(108)); - } - } Hs; - - /// - /// Meitnerium is a synthetic chemical element with the symbol Mt and atomic number 109. - /// It is an extremely radioactive synthetic element. The most stable known isotope, - /// meitnerium-278, has a half-life of 4.5 seconds, although the unconfirmed - /// meitnerium-282 may have a longer half-life of 67 seconds. - /// - const struct MEITNERIUM - { - const long double atomic_weight = 278; // u - const int atomic_number = 109; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = FP_NAN; // eV - static void display() - { - displayElementImg(getFileName(109)); - } - } Mt; - - /// - /// Darmstadtium is a chemical element with the symbol Ds and atomic number 110. - /// It is an extremely radioactive synthetic element. The most stable known - /// isotope, darmstadtium-281, has a half-life of approximately 12.7 seconds. - /// - const struct DARMSTADTIUM - { - const long double atomic_weight = 281; // u - const int atomic_number = 110; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = FP_NAN; // eV - static void display() - { - displayElementImg(getFileName(110)); - } - } Ds; - - - /// - /// Roentgenium is a chemical element with the symbol Rg and atomic number 111. - /// It is an extremely radioactive synthetic element that can be created in a - /// laboratory but is not found in nature. - /// - const struct ROENTGENUIM - { - const long double atomic_weight = 282; // u - const int atomic_number = 111; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = FP_NAN; // eV - static void display() - { - displayElementImg(getFileName(111)); - } - } Rg; - - /// - /// Copernicium is a synthetic chemical element with the symbol Cn and atomic number 112. - /// Its known isotopes are extremely radioactive, and have only been created in a laboratory. - /// The most stable known isotope, copernicium-285, has a half-life of approximately 28 seconds. - /// - const struct COPERNICIUM - { - const long double atomic_weight = 285; // u - const int atomic_number = 112; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = FP_NAN; // eV - static void display() - { - displayElementImg(getFileName(112)); - } - } Cn; - - /// - /// Nihonium is a synthetic chemical element with the symbol Nh and atomic number 113. - /// It is extremely radioactive; its most stable known isotope, nihonium-286, - /// has a half-life of about 10 seconds. In the periodic table, nihonium is - /// a transactinide element in the p-block. It is a member of period 7 - /// and group 13. - /// - const struct NIHONIUM - { - const long double atomic_weight = 286; // u - const int atomic_number = 113; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = FP_NAN; // eV - static void display() - { - displayElementImg(getFileName(113)); - } - } Nh; - - /// - /// Flerovium is a superheavy artificial chemical element with the symbol Fl and atomic number 114. - /// It is an extremely radioactive synthetic element. The element is named - /// after the Flerov Laboratory of Nuclear Reactions of the Joint Institute - /// for Nuclear Research in Dubna, Russia, where the element was discovered in 1998. - /// - const struct FLEROVIUM - { - const long double atomic_weight = 289; // u - const int atomic_number = 114; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = FP_NAN; // eV - static void display() - { - displayElementImg(getFileName(114)); - } - } Fl; - - /// - /// Moscovium is a synthetic chemical element with the symbol Mc and atomic number 115. - /// It was first synthesized in 2003 by a joint team of Russian and American scientists - /// at the Joint Institute for Nuclear Research in Dubna, Russia. - /// - const struct MOSCOVIUM - { - const long double atomic_weight = 290; // u - const int atomic_number = 115; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = FP_NAN; // eV - static void display() - { - displayElementImg(getFileName(115)); - } - } Mc; - - /// - /// Livermorium is a synthetic chemical element with the symbol Lv and has an atomic number of 116. - /// It is an extremely radioactive element that has only been created in the - /// laboratory and has not been observed in nature. - /// - const struct LIVERMORIUM - { - const long double atomic_weight = 293; // u - const int atomic_number = 116; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = FP_NAN; // eV - static void display() - { - displayElementImg(getFileName(116)); - } - } Lv; - - /// - /// Tennessine is a synthetic chemical element with the symbol Ts and atomic number 117. - /// It is the second-heaviest known element and the penultimate element of the - /// 7th period of the periodic table. - /// - const struct TENNESSINE - { - const long double atomic_weight = 294; // u - const int atomic_number = 117; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = FP_NAN; // eV - static void display() - { - displayElementImg(getFileName(117)); - } - } Ts; - - /// - /// Oganesson is a synthetic chemical element with the symbol Og and atomic number 118. - /// It was first synthesized in 2002 at the Joint Institute for Nuclear Research in Dubna, - /// near Moscow, Russia, by a joint team of Russian and American scientists. - /// - const struct OGANESSON - { - const long double atomic_weight = 294; // u - const int atomic_number = 118; - const long double density_STP = FP_NAN; // kg/m^3 - const long double melting_point = FP_NAN; // C - const long double boiling_point = FP_NAN; // C - const long double thermal_conductivity = FP_NAN; // W/mK - const long double electric_conductivity = FP_NAN; // MS/m - const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) - const long double heat_specific = FP_NAN; // J/kgK - const long double heat_vaporization = FP_NAN; // kJ/mol - const long double heat_fusion = FP_NAN; // kJ/mol - const long double ionization_1st = FP_NAN; // eV - static void display() - { - displayElementImg(getFileName(118)); - } - } Og; - -// static void loadImage(const char* pathname, sf::Texture& texture, sf::Sprite& sprite) -// { -// texture.loadFromFile(pathname); // load it from the file -// sprite.setTexture(texture); // put that texture in our sprite -// // the rectangle of the texture to use for this sprite -// sprite.setTextureRect( sf::IntRect(0,0,screenSize_X,screenSize_Y) ); -// } - - static void displayElementImg(const char elementName[]) - { - -// // Create our window -// sf::RenderWindow window( -// sf::VideoMode(screenSize_X,screenSize_Y), // size of the client area we want -// "Display an Image" // The text to appear on the window title -// ); -// -// // load our image -// sf::Texture texture; // the texture which will contain our pixel data -// sf::Sprite sprite; // the sprite which will actually draw it -// loadImage(elementName,texture,sprite); -// -// // Set FPS so this draws at 60 FPS (note: I didn't do this for the WinAPI version because it'd be too hard for such -// // a small example) -// window.setFramerateLimit( 60 ); -// -// bool program_running = true; // true until the user wants to quit -// while(program_running) -// { -// // Do the event pump -- same idea as with Windows... look for events and process them -// sf::Event evt; -// while( window.pollEvent(evt) ) // while there are any events to process... -// { -// // process them. But we're only interested in the closed event -// if(evt.type == sf::Event::EventType::Closed) // is this a close event? -// program_running = false; // indicate that we want the window to close -// } -// -// // now that events are processed... draw our image -// window.draw(sprite); // just draw it to the back buffer -// window.display(); // and display it so the back buffer moves to the front -// } - - - } - - static const char* getFileName(int atomicNumber) - { - switch (atomicNumber) - { - case 1: return "img\\hydrogen.bmp"; - case 2: return "img\\helium.bmp"; - case 3: return "img\\lithium.bmp"; - case 4: return "img\\beryllium.bmp"; - case 5: return "img\\boron.bmp"; - case 6: return "img\\carbon.bmp"; - case 7: return "img\\nitrogen.bmp"; - case 8: return "img\\oxygen.bmp"; - case 9: return "img\\fluorine.bmp"; - case 10: return "img\\neon.bmp"; - case 11: return "img\\sodium.bmp"; - case 12: return "img\\magnesium.bmp"; - case 13: return "img\\aluminium.bmp"; - case 14: return "img\\silicon.bmp"; - case 15: return "img\\phosphorus.bmp"; - case 16: return "img\\sulfur.bmp"; - case 17: return "img\\chlorine.bmp"; - case 18: return "img\\argon.bmp"; - case 19: return "img\\potassium.bmp"; - case 20: return "img\\calcium.bmp"; - case 21: return "img\\scandium.bmp"; - case 22: return "img\\titanium.bmp"; - case 23: return "img\\vanadium.bmp"; - case 24: return "img\\chromium.bmp"; - case 25: return "img\\manganese.bmp"; - case 26: return "img\\iron.bmp"; - case 27: return "img\\cobalt.bmp"; - case 28: return "img\\nickel.bmp"; - case 29: return "img\\copper.bmp"; - case 30: return "img\\zinc.bmp"; - case 31: return "img\\gallium.bmp"; - case 32: return "img\\germanium.bmp"; - case 33: return "img\\arsenic.bmp"; - case 34: return "img\\selenium.bmp"; - case 35: return "img\\bromine.bmp"; - case 36: return "img\\krypton.bmp"; - case 37: return "img\\rubidium.bmp"; - case 38: return "img\\strontium.bmp"; - case 39: return "img\\yttrium.bmp"; - case 40: return "img\\zirconium.bmp"; - case 41: return "img\\niobium.bmp"; - case 42: return "img\\molybdenum.bmp"; - case 43: return "img\\technetium.bmp"; - case 44: return "img\\ruthenium.bmp"; - case 45: return "img\\rhodium.bmp"; - case 46: return "img\\palladium.bmp"; - case 47: return "img\\silver.bmp"; - case 48: return "img\\cadmium.bmp"; - case 49: return "img\\indium.bmp"; - case 50: return "img\\tin.bmp"; - case 51: return "img\\antimony.bmp"; - case 52: return "img\\tellurium.bmp"; - case 53: return "img\\iodine.bmp"; - case 54: return "img\\xenon.bmp"; - case 55: return "img\\ceasium.bmp"; - case 56: return "img\\barium.bmp"; - case 57: return "img\\lanthanum.bmp"; - case 58: return "img\\cerium.bmp"; - case 59: return "img\\praseodymium.bmp"; - case 60: return "img\\neodymium.bmp"; - case 61: return "img\\promethium.bmp"; - case 62: return "img\\samarium.bmp"; - case 63: return "img\\europium.bmp"; - case 64: return "img\\gadolinium.bmp"; - case 65: return "img\\terbium.bmp"; - case 66: return "img\\dysprosium.bmp"; - case 67: return "img\\holmium.bmp"; - case 68: return "img\\erbium.bmp"; - case 69: return "img\\thulium.bmp"; - case 70: return "img\\ytterbium.bmp"; - case 71: return "img\\lutetium.bmp"; - case 72: return "img\\hafnium.bmp"; - case 73: return "img\\tantalum.bmp"; - case 74: return "img\\tungsten.bmp"; - case 75: return "img\\rhenium.bmp"; - case 76: return "img\\osmium.bmp"; - case 77: return "img\\iridium.bmp"; - case 78: return "img\\platinum.bmp"; - case 79: return "img\\gold.bmp"; - case 80: return "img\\mercury.bmp"; - case 81: return "img\\thallium.bmp"; - case 82: return "img\\lead.bmp"; - case 83: return "img\\bismuth.bmp"; - case 84: return "img\\polonium.bmp"; - case 85: return "img\\astatine.bmp"; - case 86: return "img\\radon.bmp"; - case 87: return "img\\francium.bmp"; - case 88: return "img\\radium.bmp"; - case 89: return "img\\actinium.bmp"; - case 90: return "img\\thorium.bmp"; - case 91: return "img\\protactinium.bmp"; - case 92: return "img\\uranium.bmp"; - case 93: return "img\\neptunium.bmp"; - case 94: return "img\\plutonium.bmp"; - case 95: return "img\\americium.bmp"; - case 96: return "img\\curium.bmp"; - case 97: return "img\\berkelium.bmp"; - case 98: return "img\\califomium.bmp"; - case 99: return "img\\einsteinium.bmp"; - case 100: return "img\\fermium.bmp"; - case 101: return "img\\mendelevium.bmp"; - case 102: return "img\\nobelium.bmp"; - case 103: return "img\\lawrencium.bmp"; - case 104: return "img\\rutherfordium.bmp"; - case 105: return "img\\dubnium.bmp"; - case 106: return "img\\seaborgium.bmp"; - case 107: return "img\\bohrium.bmp"; - case 108: return "img\\hassium.bmp"; - case 109: return "img\\meitnerium.bmp"; - case 110: return "img\\darmstadtium.bmp"; - case 111: return "img\\roentgenium.bmp"; - case 112: return "img\\copernicium.bmp"; - case 113: return "img\\nihonium.bmp"; - case 114: return "img\\flerovium.bmp"; - case 115: return "img\\moscovium.bmp"; - case 116: return "img\\livermorium.bmp"; - case 117: return "img\\tennessine.bmp"; - case 118: return "img\\oganesson.bmp"; - } - return "no file"; - } -#endif //PHYSICSFORMULA_PERIODICELEMENTS_H -}elements; -// -//template -//static void printElementData(ELEM el) -//{ -// printf("\nelement: (%s)\n", typeid(el).name()+17); -// std::cout << setw(23) << left << "atomic #: " << el.atomic_number << " Z" << std::endl; -// std::cout << setw(23) << left << "atomic Weight: " << el.atomic_weight << " u" << std::endl; -// std::cout << setw(23) << left << "density STP: " << el.density_STP << " kg/m^3" << std::endl; -// std::cout << setw(23) << left << "melting point: " << el.melting_point << " C" << std::endl; -// std::cout << setw(23) << left << "boiling point: " << el.boiling_point << " C" << std::endl; -// std::cout << setw(23) << left << "thermal conductivity: " << el.thermal_conductivity << " W/mK" << std::endl; -// std::cout << setw(23) << left << "electric conductivity: " << el.electric_conductivity << " MS/m" << std::endl; -// std::cout << setw(23) << left << "resistivity: " << el.resistivity << " Ohm*m" << std::endl; -// std::cout << setw(23) << left << "specific heat: " << el.heat_specific << " J/kgK" << std::endl; -// std::cout << setw(23) << left << "vaporization heat: " << el.heat_vaporization << " kJ/mol" << std::endl; -// std::cout << setw(23) << left << "fusion heat: " << el.heat_fusion << " kJ/mol" << std::endl; -// std::cout << setw(23) << left << "first ionization: " << el.ionization_1st << " eV" << std::endl; -//} - +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_PERIODICELEMENTS_H +#define PHYSICSFORMULA_PERIODICELEMENTS_H +#pragma once + +/** + * @struct Elements + * @details structure holong doubleing data on all the periodic elements + * @author Ryan Zurrin + * @date 1/1/2021 + */ +//#include +//#include +#include + +//const int screenSize_X = 640; +//const int screenSize_Y = 480; + +static struct UnifiedAtomicMass +{ + const long double kg = 1.66053906660 * 50 * pow(10, -27); + const long double Mu = 1.0; + const long double Me = 1822.888486209 * 53; +} u; + + +/// +/// The periodic table, also known as the periodic table of elements, is a +/// tabular display of the chemical elements, which are arranged by atomic +/// number, electron configuration, and recurring chemical properties. +/// The structure of the table shows periodic trends.\n\n +/// atomic_weight: The atomic mass is the mass of an atom. Although the SI unit +/// of mass is kilogram, the atomic mass is often expressed in the non-SI unit +/// dalton where 1 dalton is defined as 1⁄12 of the mass of a single +/// carbon-12 atom, at rest.\n\n +/// atomic_number: The atomic number or proton number (symbol Z) of a chemical +/// element is the number of protons found in the nucleus of every atom of +/// that element. The atomic number uniquely identifies a chemical element. +/// It is identical to the charge number of the nucleus. In an uncharged atom, +/// the atomic number is also equal to the number of electrons.\n\n +/// density_STP: Density is a measure of an element's mass per unit volume.\n\n +/// melting_point: Melting point, temperature at which the solid and liquid forms +/// of a pure substance can exist in equilibrium. ... As heat is applied to a +/// solid, its temperature will increase until the melting point is reached. +/// More heat then will convert the solid into a liquid with no temperature change.\n\n +/// boiling_point: The boiling point of a substance is the temperature at which +/// the vapor pressure of a liquid equals the pressure surrounding the liquid +/// and the liquid changes into a vapor. ... The standard boiling point has +/// been defined by IUPAC since 1982 as the temperature at which boiling +/// occurs under a pressure of one bar.\n\n +/// thermal_conductivity: The heat transfer characteristics of a solid material +/// are measured by a property called the thermal conductivity, k (or λ), +/// measured in W/m.K. It is a measure of a substance's ability to transfer +/// heat through a material by conduction.\n\n +/// electric_conductivity: in metals is a result of the movement of electrically +/// charged particles. The atoms of metal elements are characterized by the +/// presence of valence electrons, which are electrons in the outer shell of +/// an atom that are free to move about.\n\n +/// resistivity: (also called specific electrical resistance or volume resistivity) +/// is a fundamental property of a material that measures how strongly it resists +/// electric current. Its inverse, called electrical conductivity, quantifies +/// how well a material conducts electricity.\n\n +/// heat_specific: the quantity of heat required to raise the temperature of one +/// gram of a substance by one Celsius degree. The units of specific heat are +/// usually calories or joules per gram per Celsius degree.\n\n +/// heat_vaporization: The enthalpy of vaporization, also known as the heat of +/// vaporization or heat of evaporation, is the amount of energy that must +/// be added to a liquid substance to transform a quantity of that substance +/// into a gas. The enthalpy of vaporization is a function of the pressure at +/// which that transformation takes place.\n\n +/// heat_fusion: The enthalpy of fusion of a substance, also known as heat of +/// fusion is the change in its enthalpy resulting from providing energy, typically +/// heat, to a specific quantity of the substance to change its state from a +/// solid to a liquid, at constant pressure.\n\n +/// ionization_1st: Ionization energy is the minimum amount of energy required +/// to remove the most loosely bound electron of a neutral atom. +/// +static struct Elements +{ + Elements() { //cout << "testing Element" << endl; + }; + + /// + /// + /// + const struct NEUTRON + { + const long double atomic_weight = 1.008665; + const long double halfLife = 622.2; + const int atomic_number = 0; + } n; + + /// + /// Hydrogen is the chemical element with the symbol H and atomic number 1. + /// With a standard atomic weight of 1.008, hydrogen is the lightest element + /// in the periodic table. Hydrogen is the most abundant chemical substance + /// in the universe, constituting roughly 75% of all baryonic mass + /// + const struct HYDROGEN + { + const long double atomic_weight = 1.007825; // 1.007825 u + const int atomic_number = 1; // Z = 1 + const long double density_STP = .0899; // .0899 kg/m^3 + const long double melting_point = -259.1; // -259.1 C + const long double boiling_point = -252.9; // -252.9 C + const long double thermal_conductivity = .18; // .18 W/mK + const long double electric_conductivity = FP_NAN; // FP_NAN + const long double resistivity = FP_NAN; //FP_NAN + const long double heat_specific = 14300.0; // 14300.0 J/kgK + const long double heat_vaporization = .452; // 452 kJ/mol + const long double heat_fusion = .558; // .558 kJ/mol + const long double ionization_1st = 13.598; + static void display() + { + displayElementImg(getFileName(1)); } + + } H; + + /// + /// Helium is a chemical element with the symbol He and atomic number 2. + /// It is a colorless, odorless, tasteless, non-toxic, inert, monatomic gas, + /// the first in the noble gas group in the periodic table. Its boiling point + /// is the lowest among all the elements + /// + const struct HELIUM + { + const long double atomic_weight = 4.002602; // 4.002602 u + const int atomic_number = 2; // Z = 2 + const long double density_STP = 0.1785; // 0.1785 kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = -269; // -269 C + const long double thermal_conductivity = 0.1513; // 0.1513 W/mK + const long double electric_conductivity = FP_NAN; // FP_NAN + const long double resistivity = FP_NAN; // FP_NAN + const long double heat_specific = 5193.1; // 5193.1 J/kgK + const long double heat_vaporization = .083; // .083 kJ/mol + const long double heat_fusion = .02; // .02 kJ/mol + const long double ionization_1st = 24.587; // eV + static void display() + { + displayElementImg(getFileName(2)); + } + } He; + + /// + /// Lithium is a chemical element with the symbol Li and atomic number 3. + /// It is a soft, silvery-white alkali metal. Under standard conditions, + /// it is the lightest metal and the lightest solid element. + /// + const struct LITHIUM + { + const long double atomic_weight = 6.941; // 6.94 u + const int atomic_number = 3; // Z = 3 + const long double density_STP = 535.0; // 535.0 kg/m^3 + const long double melting_point = 180.54; // 180.54 C + const long double boiling_point = 1342.0; // 1342.0 C + const long double thermal_conductivity = 85.0; // 85.0 W/mK + const long double electric_conductivity = 11.0; // 11.0 MS/m + const long double resistivity = 9.40 * pow(10, -8); // 9.4e-8 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 3570.0; // 3570.0 J/kgK + const long double heat_vaporization = 147.0; // 147.0 kJ/mol + const long double heat_fusion = 3.0; // 3.0 kJ/mol + const long double ionization_1st = 5.391; // eV + static void display() + { + displayElementImg(getFileName(3)); + } + } Li; + + /// + /// Beryllium is a chemical element with the symbol Be and atomic number 4. + /// It is a relatively rare element in the universe, usually occurring as a + /// product of the spallation of larger atomic nuclei that have collided + /// with cosmic rays. Within the cores of stars, beryllium is depleted as + /// it is fused into heavier elements. + /// + const struct BERYLLIUM + { + const long double atomic_weight = 9.0121831; // 9.0121831 u + const int atomic_number = 4; //4 + const long double density_STP = 1848.0; // 1848.0 kg/m^3 + const long double melting_point = 1287; // 1287 C + const long double boiling_point = 2470; // 2470 C + const long double thermal_conductivity = 190; // 190 W/mK + const long double electric_conductivity = 25; // 25 MS/m + const long double resistivity = 3.999999999998 * pow(10, -8); // 4e-8 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 1820.0; // 1820.0 J/kgK + const long double heat_vaporization = 297.0; // 297.0 kJ/mol + const long double heat_fusion = 7.95; // 7.95 kJ/mol + const long double ionization_1st = 9.323; // eV + static void display() + { + displayElementImg(getFileName(4)); + } + } Be; + + /// + /// Boron is a chemical element with the symbol B and atomic number 5. + /// Produced entirely by cosmic ray spallation and supernovae and not by + /// stellar nucleosynthesis, it is a low-abundance element in the Solar + /// System and in the Earth's crust. It constitutes about 0.001 percent + /// by weight of Earth's crust. + /// + const struct BORON + { + const long double atomic_weight = 10.81; // 10.81 u + const int atomic_number = 5; // 5 + const long double density_STP = 2460.0; // 2460.0 kg/m^3 + const long double melting_point = 2075; // 2075 C + const long double boiling_point = 4000; // 4000 C + const long double thermal_conductivity = 27.0; // 27.0W/mK + const long double electric_conductivity = 1; // MS/m + const long double resistivity = 10000.0; // 10000 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 1030.0; // J/kgK + const long double heat_vaporization = 507.0; // kJ/mol + const long double heat_fusion = 50.0; // kJ/mol + const long double ionization_1st = 8.298; // eV + static void display() + { + displayElementImg(getFileName(5)); + } + } B; + + /// + /// Carbon is a chemical element with the symbol C and atomic number 6. + /// It is nonmetallic and tetravalent—making four electrons available to + /// form covalent chemical bonds. It belongs to group 14 of the periodic + /// table. Carbon makes up only about 0.025 percent of Earth's crust. + /// + const struct CARBON + { + const long double atomic_weight = 12.011; // u + const int atomic_number = 6; + const long double density_STP = 2260.0; // kg/m^3 + const long double melting_point = 3550; // C + const long double boiling_point = 4027; // C + const long double thermal_conductivity = 140.0; // W/mK + const long double electric_conductivity = .10; // MS/m + const long double resistivity = 0.00001; // 0.00001 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 710.0; // J/kgK + const long double heat_vaporization = 715.0; // kJ/mol + const long double heat_fusion = 105; // kJ/mol + const long double ionization_1st = 11.261; // eV + static void display() + { + displayElementImg(getFileName(6)); + } + } C; + + /// + /// Nitrogen is the chemical element with the symbol N and atomic number 7. + /// It was first discovered and isolated by Scottish physician Daniel + /// Rutherford in 1772. + /// + const struct NITROGEN + { + const long double atomic_weight = 14.007; // u + const int atomic_number = 7; + const long double density_STP = 1.251; // kg/m^3 + const long double melting_point = -210.1; // C + const long double boiling_point = -195.8; // C + const long double thermal_conductivity = .025; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; //FP_NAN + const long double heat_specific = 1040; // J/kgK + const long double heat_vaporization = 2.79; // kJ/mol + const long double heat_fusion = .36; // kJ/mol + const long double ionization_1st = 14.534; // eV + static void display() + { + displayElementImg(getFileName(7)); + } + } N; + + /// + /// Oxygen is the chemical element with the symbol O and atomic number 8. + /// It is a member of the chalcogen group in the periodic table, a highly + /// reactive nonmetal, and an oxidizing agent that readily forms oxides with + /// most elements as well as with other compounds. + /// + const struct OXYGEN + { + const long double atomic_weight = 15.999; // u + const int atomic_number = 8; + const long double density_STP = 1.251; // kg/m^3 + const long double melting_point = -218.0; // C + const long double boiling_point = -183.0; // C + const long double thermal_conductivity = 0.02658; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // FP_NAN + const long double heat_specific = 919; // J/kgK + const long double heat_vaporization = 3.41; // kJ/mol + const long double heat_fusion = .222; // kJ/mol + const long double ionization_1st = 13.681; // eV + static void display() + { + displayElementImg(getFileName(8)); + } + } O; + + /// + /// Fluorine is a chemical element with the symbol F and atomic number 9. + /// It is the lightest halogen and exists at standard conditions as a highly + /// toxic, pale yellow diatomic gas. As the most electronegative element, + /// it is extremely reactive, as it reacts with all other elements, except + /// for argon, neon, and helium. + /// + const struct FLUORINE + { + const long double atomic_weight = 18.998403163; // u + const int atomic_number = 9; + const long double density_STP = 1.696; // kg/m^3 + const long double melting_point = -220.0; // C + const long double boiling_point = -188.1; // C + const long double thermal_conductivity = .0277; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // FP_NAN + const long double heat_specific = 824; // J/kgK + const long double heat_vaporization = 3.27; // kJ/mol + const long double heat_fusion = .26; // kJ/mol + const long double ionization_1st = 17.422; // eV + static void display() + { + displayElementImg(getFileName(9)); + } + } F; + + /// + /// Neon is a chemical element with the symbol Ne and atomic number 10. + /// It is a noble gas. Neon is a colorless, odorless, inert monatomic gas + /// under standard conditions, with about two-thirds the density of air. + /// + const struct NEON + { + const long double atomic_weight = 20.1797; // u + const int atomic_number = 10; + const long double density_STP = .900; // kg/m^3 + const long double melting_point = -248.6; // C + const long double boiling_point = -246.1; // C + const long double thermal_conductivity = .0491; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // FP_NAN + const long double heat_specific = 1030; // J/kgK + const long double heat_vaporization = 1.75; // kJ/mol + const long double heat_fusion = 0.34; // kJ/mol + const long double ionization_1st = 21.565; // eV + static void display() + { + displayElementImg(getFileName(10)); + } + } Ne; + + /// + /// Sodium is a chemical element with the symbol Na and atomic number 11. + /// It is a soft, silvery-white, highly reactive metal. Sodium is an + /// alkali metal, being in group 1 of the periodic table. Its only stable + /// isotope is ²³Na. The free metal does not occur in nature, and must be + /// prepared from compounds. + /// + const struct SODIUM + { + const long double atomic_weight = 22.98976928; // u + const int atomic_number = 11; + const long double density_STP = 968; // kg/m^3 + const long double melting_point = 97.720; // C + const long double boiling_point = 882.9; // C + const long double thermal_conductivity = 140.0; // W/mK + const long double electric_conductivity = 21.0; // MS/m + const long double resistivity = 4.69999999e-8; // 4.7e-8 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 1230; // J/kgK + const long double heat_vaporization = 97.7; // kJ/mol + const long double heat_fusion = 2.60; // kJ/mol + const long double ionization_1st = 5.139; // eV + static void display() + { + displayElementImg(getFileName(11)); + } + } Na; + + /// + /// Magnesium is a chemical element with the symbol Mg and atomic number 12. + /// It is a shiny gray solid which bears a close physical resemblance to + /// the other five elements in the second column of the periodic + /// + const struct MAGNESIUM + { + const long double atomic_weight = 24.305; // u + const int atomic_number = 12; + const long double density_STP = 1738.0; // kg/m^3 + const long double melting_point = 650; // C + const long double boiling_point = 1090; // C + const long double thermal_conductivity = 160.0; // W/mK + const long double electric_conductivity = 23.0; // MS/m + const long double resistivity = 4.39999999e-8; // 4.4e-8 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 1020; // J/kgK + const long double heat_vaporization = 128; // kJ/mol + const long double heat_fusion = 8.7; // kJ/mol + const long double ionization_1st = 7.646; // eV + static void display() + { + displayElementImg(getFileName(12)); + } + } Mg; + + /// + /// Aluminium is a chemical element with the symbol Al and atomic number 13. + /// Aluminium has a density lower than those of other common metals, at + /// approximately one third that of steel. It has a great affinity towards + /// oxygen, and forms a protective layer of oxide on the surface when + /// exposed to air. + /// + const struct ALUMINIUM + { + const long double atomic_weight = 26.9815385; // 26.9815385 u + const int atomic_number = 13; // 13 + const long double density_STP = 2700; // 2700 kg/m^3 + const long double melting_point = 660.32; // 660.32 C + const long double boiling_point = 2519.0; // 2519C + const long double thermal_conductivity = 235; // 235 W/mK + const long double electric_conductivity = 38.0; // 38 MS/m + const long double resistivity = 2.6e-8; // 2.6e-8 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 904.0; // 904 J/kgK + const long double heat_vaporization = 293.0; // 293 kJ/mol + const long double heat_fusion = 10.7; // 10.7 kJ/mol + const long double ionization_1st = 5.985; // eV + static void display() + { + displayElementImg(getFileName(13)); + } + } Al; + + /// + /// Silicon is a chemical element with the symbol Si and atomic number 14. + /// It is a hard, brittle crystalline solid with a blue-grey metallic lustre, + /// and is a tetravalent metalloid and semiconductor. It is a member of group + /// 14 in the periodic table: carbon is above it; and germanium, tin, lead + /// and flerovium, are below it + /// + const struct SILICON + { + const long double atomic_weight = 28.085; // 28.085 u + const int atomic_number = 14; //14 + const long double density_STP = 2330.0; // 2330 kg/m^3 + const long double melting_point = 1414.0; // 1414 C + const long double boiling_point = 2900.0; // 2000 C + const long double thermal_conductivity = 150.0; // 150 W/mK + const long double electric_conductivity = .0010; // .0010 MS/m + const long double resistivity = .001; // .001 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 710.0; // 710 J/kgK + const long double heat_vaporization = 359.0; // 359 kJ/mol + const long double heat_fusion = 50.2; // 50.2 kJ/mol + const long double ionization_1st = 8.151; // eV + static void display() + { + displayElementImg(getFileName(14)); + } + } Si; + + /// + /// Phosphorus is a chemical element with the symbol P and atomic number 15. + /// Elemental phosphorus exists in two major forms, white phosphorus and + /// red phosphorus, but because it is highly reactive, phosphorus is never + /// found as a free element on Earth. + /// + const struct PHOSPHORUS + { + const long double atomic_weight = 30.973761998; // 30.973761998 u + const int atomic_number = 15; //15 + const long double density_STP = 1823.0; // 1823 kg/m^3 + const long double melting_point = 44.15; // 44.15 C + const long double boiling_point = 280.5; // 280.5 C + const long double thermal_conductivity = .236; // .236 W/mK + const long double electric_conductivity = 10.0; // 10 MS/m + const long double resistivity = 1e-7; // 1e-7 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 769.7; // 769.7 J/kgK + const long double heat_vaporization = 12.4; // 12.4 kJ/mol + const long double heat_fusion = .64; // .64 kJ/mol + const long double ionization_1st = 10.487; // eV + static void display() + { + displayElementImg(getFileName(15)); + } + } P; + + /// + /// Sulfur is a chemical element with the symbol S and atomic number 16. + /// It is abundant, multivalent and nonmetallic. Under normal conditions, + /// sulfur atoms form cyclic octatomic molecules with a chemical formula S₈. + /// Elemental sulfur is a bright yellow, crystalline solid at room temperature + /// + const struct SULFUR + { + const long double atomic_weight = 32.06; // 32.06 u + const int atomic_number = 16; // 16 + const long double density_STP = 1960.0; // 1960.0 kg/m^3 + const long double melting_point = 115.21; // 115.21 C + const long double boiling_point = 444.72; // 444.72 C + const long double thermal_conductivity = .205; // .205 W/mK + const long double electric_conductivity = pow(1.0, -21); // 1e-21 MS/m + const long double resistivity = 1e15; // 1e15 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 705.0; // 705 J/kgK + const long double heat_vaporization = 9.8; // 9.8 kJ/mol + const long double heat_fusion = 1.73; // 1.73 kJ/mol + const long double ionization_1st = 10.36; // eV + static void display() + { + displayElementImg(getFileName(16)); + } + } S; + + /// + /// Chlorine is a chemical element with the symbol Cl and atomic number 17. + /// The second-lightest of the halogens, it appears between fluorine and + /// bromine in the periodic table and its properties are mostly intermediate + /// between them. Chlorine is a yellow-green gas at room temperature. + /// + const struct CHLORINE + { + const long double atomic_weight = 35.45; // 35.45 u + const int atomic_number = 17; //17 + const long double density_STP = 3.214; // 3.214 kg/m^3 + const long double melting_point = -101.5; // -101.5 C + const long double boiling_point = -34.040; // -34.040 C + const long double thermal_conductivity = .0089; // .0089 W/mK + const long double electric_conductivity = pow(1.0, -8.0); // 1e-8 MS/m + const long double resistivity = 100; // 100 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 478.2; // 478.2 J/kgK + const long double heat_vaporization = 10.2; // 10.2 kJ/mol + const long double heat_fusion = 3.2; // 3.2 kJ/mol + const long double ionization_1st = 12.968; // eV + static void display() + { + displayElementImg(getFileName(17)); + } + } Cl; + + /// + /// Argon is a chemical element with the symbol Ar and atomic number 18. + /// It is in group 18 of the periodic table and is a noble gas. Argon is + /// the third-most abundant gas in the Earth's atmosphere, at 0.934% + /// + const struct ARGON + { + const long double atomic_weight = 39.948; // 39.948 u + const int atomic_number = 18; //18 + const long double density_STP = 1784.0; // 1784 kg/m^3 + const long double melting_point = -189; // -189 C + const long double boiling_point = -186; // -186 C + const long double thermal_conductivity = .01772; // .01772 W/mK + const long double electric_conductivity = FP_NAN; // FP_NAN + const long double resistivity = FP_NAN; // FP_NAN + const long double heat_specific = 520.33; // 520.33 J/kgK + const long double heat_vaporization = 6.5; // 6.5 kJ/mol + const long double heat_fusion = 1.18; // 1.18 kJ/mol + const long double ionization_1st = 15.760; // eV + static void display() + { + displayElementImg(getFileName(18)); + } + } Ar; + + /// + /// Potassium is a chemical element with the symbol K and atomic number 19. + /// Potassium is a silvery-white metal that is soft enough to be cut with a + /// knife with little force. Potassium metal reacts rapidly with atmospheric + /// oxygen to form flaky white potassium peroxide in only seconds of exposure. + /// + const struct POTASSIUM + { + const long double atomic_weight = 39.0983; // 39.0983 u + const int atomic_number = 19; // 19 + const long double density_STP = 856; // 856 kg/m^3 + const long double melting_point = 63.380; // 63.38C + const long double boiling_point = 758.9; // 758.9C + const long double thermal_conductivity = 100.0; // 100 W/mK + const long double electric_conductivity = 14.0; // 14 MS/m + const long double resistivity = 7.000000000002e-8; // 7.0e-8 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 757; // 757 J/kgK + const long double heat_vaporization = 76.9; // 76.9 kJ/mol + const long double heat_fusion = 2.33; // 2.33kJ/mol + const long double ionization_1st = 4.341; // eV + static void display() + { + displayElementImg(getFileName(19)); + } + } K; + + /// + /// Calcium is a chemical element with the symbol Ca and atomic number 20. + /// As an alkaline earth metal, calcium is a reactive metal that forms a + /// dark oxide-nitride layer when exposed to air. ... It is the fifth most + /// abundant element in Earth's crust, and the third most abundant metal, + /// after iron and aluminium + /// + const struct CALCIUM + { + const long double atomic_weight = 40.078; // 40.078 u + const int atomic_number = 20; // 20 + const long double density_STP = 1550.0; // 1550kg/m^3 + const long double melting_point = 841.9; // 841.9C + const long double boiling_point = 1484; // 1484 C + const long double thermal_conductivity = 200.0; //200 W/mK + const long double electric_conductivity = 29; // 29 MS/m + const long double resistivity = 3.39999999e-8; // 3.4e-8 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 631; // 631 J/kgK + const long double heat_vaporization = 155.0; // 155 kJ/mol + const long double heat_fusion = 8.54; // 8.54 kJ/mol + const long double ionization_1st = 6.113; // eV + static void display() + { + displayElementImg(getFileName(20)); + } + } Ca; + + /// + /// Scandium is a chemical element with the symbol Sc and atomic number 21. + /// A silvery-white metallic d-block element, it has historically been + /// classified as a rare-earth element, together with yttrium and the + /// lanthanide. + /// + const struct SCANDIUM + { + const long double atomic_weight = 44.955908; // 44.955908 u + const int atomic_number = 21; // 21 + const long double density_STP = 2985.0; // 2985 kg/m^3 + const long double melting_point = 1541.0; // 1541 C + const long double boiling_point = 2830.0; // 2830 C + const long double thermal_conductivity = 16; // 16W/mK + const long double electric_conductivity = 1.8; // 1.8 MS/m + const long double resistivity = 5.5e-7; // 5.5e-7 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 567.0; // 567 J/kgK + const long double heat_vaporization = 318.0; // 318 kJ/mol + const long double heat_fusion = 16.0; // 16 kJ/mol + const long double ionization_1st = 6.562; // eV + static void display() + { + displayElementImg(getFileName(21)); + } + } Sc; + + /// + /// Titanium is a chemical element with the symbol Ti and atomic number 22. + /// Its atomic weight is 47.867 measured in daltons. It is a lustrous + /// transition metal with a silver color, low density, and high strength. + /// Titanium is resistant to corrosion in sea water, aqua regia, and chlorine. + /// + const struct TITANIUM + { + const long double atomic_weight = 47.867; // 47.867 u + const int atomic_number = 22; //22 + const long double density_STP = 4507.0; // 4507 kg/m^3 + const long double melting_point = 1668.0; // 1668 C + const long double boiling_point = 3287.0; // 3287 C + const long double thermal_conductivity = 22.0; // 22.0 W/mK + const long double electric_conductivity = 2.5; // 2.5 MS/m + const long double resistivity = 4e-7; // 4e-7 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 520.0; // 525 J/kgK + const long double heat_vaporization = 425.0; // 425 kJ/mol + const long double heat_fusion = 18.7; // 18.7 kJ/mol + const long double ionization_1st = 6.828; // eV + static void display() + { + displayElementImg(getFileName(22)); + } + } Ti; + + /// + /// Vanadium is a chemical element with the symbol V and atomic number 23. + /// It is a hard, silvery-grey, malleable transition metal. The elemental + /// metal is rarely found in nature, but once isolated artificially, the + /// formation of an oxide layer somewhat stabilizes the free metal against + /// further oxidation. + /// + const struct VANADIUM + { + const long double atomic_weight = 50.9415; // 50.9415 u + const int atomic_number = 23; // 19 + const long double density_STP = 6110; // kg/m^3 + const long double melting_point = 1910; // 1910 C + const long double boiling_point = 3407; // 3407 C + const long double thermal_conductivity = 31; // 31 W/mK + const long double electric_conductivity = 5; // MS/m + const long double resistivity = 2e-7; // 2e-7 m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 489; // J/kgK + const long double heat_vaporization = 453; // kJ/mol + const long double heat_fusion = 22.8; // kJ/mol + const long double ionization_1st = 6.746; // eV + static void display() + { + displayElementImg(getFileName(23)); + } + } V; + + /// + /// Chromium is a chemical element with the symbol Cr and atomic number 24. + /// It is the first element in group 6. It is a steely-grey, lustrous, hard, + /// and brittle transition metal. Chromium is the main additive in stainless + /// steel, to which it adds anti-corrosive properties. + /// + const struct CHROMIUM + { + const long double atomic_weight = 51.996; // u + const int atomic_number = 24; + const long double density_STP = 7190; // kg/m^3 + const long double melting_point = 1907; // C + const long double boiling_point = 2671; // C + const long double thermal_conductivity = 94; // W/mK + const long double electric_conductivity = 7.9; // MS/m + const long double resistivity = 1.3e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 448; // J/kgK + const long double heat_vaporization = 339; // kJ/mol + const long double heat_fusion = 20.5; // kJ/mol + const long double ionization_1st = 6.767; // eV + static void display() + { + displayElementImg(getFileName(24)); + } + } Cr; + + /// + /// Manganese is a chemical element with the symbol Mn and atomic number 25. + /// It is not found as a free element in nature; it is often found in minerals + /// in combination with iron. Manganese is a transition metal with a + /// multifaceted array of industrial alloy uses, particularly in + /// stainless steels. + /// + const struct MANGANESE + { + const long double atomic_weight = 54.938; // u + const int atomic_number = 25; + const long double density_STP = 7470; // kg/m^3 + const long double melting_point = 1246; // C + const long double boiling_point = 2061; // C + const long double thermal_conductivity = 7.8; // W/mK + const long double electric_conductivity = .62; // MS/m + const long double resistivity = 1.6e-6; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 479; // J/kgK + const long double heat_vaporization = 220; // kJ/mol + const long double heat_fusion = 13.2; // kJ/mol + const long double ionization_1st = 7.434; // eV + static void display() + { + displayElementImg(getFileName(25)); + } + } Mn; + + /// + /// Iron is a chemical element with symbol Fe and atomic number 26. + /// It is a metal that belongs to the first transition series and group + /// 8 of the periodic table. It is, by mass, the most common element on + /// Earth, right in front of oxygen, forming much of Earth's outer and + /// inner core. + /// + const struct IRON + { + const long double atomic_weight = 55.845; // u + const int atomic_number = 26; + const long double density_STP = 7874; // kg/m^3 + const long double melting_point = 1538; // C + const long double boiling_point = 2861; // C + const long double thermal_conductivity = 80; // W/mK + const long double electric_conductivity = 10; // MS/m + const long double resistivity = 9.7e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 449; // J/kgK + const long double heat_vaporization = 347; // kJ/mol + const long double heat_fusion = 13.8; // kJ/mol + const long double ionization_1st = 7.903; // eV + static void display() + { + displayElementImg(getFileName(26)); + } + } Fe; + + /// + /// Cobalt is a chemical element with the symbol Co and atomic number 27. + /// Like nickel, cobalt is found in the Earth's crust only in a chemically + /// combined form, save for small deposits found in alloys of natural meteoric + /// iron. The free element, produced by reductive smelting, is a hard, + /// lustrous, silver-gray metal. + /// + const struct COBALT + { + const long double atomic_weight = 58.933; // u + const int atomic_number = 27; + const long double density_STP = 8900; // kg/m^3 + const long double melting_point = 1495; // C + const long double boiling_point = 2900; // C + const long double thermal_conductivity = 100; // W/mK + const long double electric_conductivity = 17; // MS/m + const long double resistivity = 6e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 421; // J/kgK + const long double heat_vaporization = 375; // kJ/mol + const long double heat_fusion = 16.2; // kJ/mol + const long double ionization_1st = 7.881; // eV + static void display() + { + displayElementImg(getFileName(27)); + } + } Co; + + /// + /// Nickel is a chemical element with the symbol Ni and atomic number 28. + /// It is a silvery-white lustrous metal with a slight golden tinge. + /// Nickel belongs to the transition metals and is hard and ductile. + /// + const struct NICKEL + { + const long double atomic_weight = 58.693; // u + const int atomic_number = 28; + const long double density_STP = 8908.0; // kg/m^3 + const long double melting_point = 1455; // C + const long double boiling_point = 2913; // C + const long double thermal_conductivity = 91; // W/mK + const long double electric_conductivity = 14; // MS/m + const long double resistivity = 7e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 445; // J/kgK + const long double heat_vaporization = 378; // kJ/mol + const long double heat_fusion = 17.2; // kJ/mol + const long double ionization_1st = 7.641; // eV + static void display() + { + displayElementImg(getFileName(28)); + } + } Ni; + + /// + /// Copper is a chemical element with the symbol Cu and atomic number 29. + /// It is a soft, malleable, and ductile metal with very high thermal and + /// electrical conductivity. A freshly exposed surface of pure copper has + /// a pinkish-orange color. + /// + const struct COPPER + { + const long double atomic_weight = 63.546; // u + const int atomic_number = 29; + const long double density_STP = 8940.0; // kg/m^3 + const long double melting_point = 1084; // C + const long double boiling_point = 2562; // C + const long double thermal_conductivity = 400; // W/mK + const long double electric_conductivity = 59; // MS/m + const long double resistivity = 1.7e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 384.4; // J/kgK + const long double heat_vaporization = 300; // kJ/mol + const long double heat_fusion = 13.1; // kJ/mol + const long double ionization_1st = 7.727; // eV + static void display() + { + displayElementImg(getFileName(29)); + } + } Cu; + + /// + /// Zinc is a chemical element with the symbol Zn and atomic number 30. + /// Zinc is a slightly brittle metal at room temperature and has a + /// silvery-grayish appearance when oxidation is removed. It is the first + /// element in group 12 of the periodic table. + /// + const struct ZINC + { + const long double atomic_weight = 65.38; // u + const int atomic_number = 30; + const long double density_STP = 7140; // kg/m^3 + const long double melting_point = 419.53; // C + const long double boiling_point = 906.9; // C + const long double thermal_conductivity = 120; // W/mK + const long double electric_conductivity = 17; // MS/m + const long double resistivity = 5.9e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 388; // J/kgK + const long double heat_vaporization = 119; // kJ/mol + const long double heat_fusion = 7.35; // kJ/mol + const long double ionization_1st = 9.394; // eV + static void display() + { + displayElementImg(getFileName(30)); + } + } Zn; + + /// + /// Gallium is a chemical element with the symbol Ga and atomic number 31. + /// Elemental gallium is a soft, silvery metal at standard temperature and + /// pressure; however in its liquid state it becomes silvery white. If too + /// much force is applied, the gallium may fracture conchoidally. + /// + const struct GALLIUM + { + const long double atomic_weight = 69.723; // u + const int atomic_number = 31; + const long double density_STP = 5904.0; // kg/m^3 + const long double melting_point = 29.760; // C + const long double boiling_point = 2204.0; // C + const long double thermal_conductivity = 29.0; // W/mK + const long double electric_conductivity = 7.1; // MS/m + const long double resistivity = 1.4e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 371.0; // J/kgK + const long double heat_vaporization = 256.0; // kJ/mol + const long double heat_fusion = 5.59; // kJ/mol + const long double ionization_1st = 5.999; // eV + static void display() + { + displayElementImg(getFileName(31)); + } + } Ga; + + /// + /// Germanium is a chemical element with the symbol Ge and atomic number 32. + /// It is a lustrous, hard-brittle, grayish-white metalloid in the carbon + /// group, chemically similar to its group neighbors silicon and tin. + /// Pure germanium is a semiconductor with an appearance similar to + /// elemental silicon. + /// + const struct GERMANIUM + { + const long double atomic_weight = 72.630; // u + const int atomic_number = 32; + const long double density_STP = 5323; // kg/m^3 + const long double melting_point = 938.25; // C + const long double boiling_point = 2820; // C + const long double thermal_conductivity = 60.0; // W/mK + const long double electric_conductivity = .0020; // MS/m + const long double resistivity = .0005; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 321.4; // J/kgK + const long double heat_vaporization = 334.0; // kJ/mol + const long double heat_fusion = 31.8; // kJ/mol + const long double ionization_1st = 7.90; // eV + static void display() + { + displayElementImg(getFileName(32)); + } + } Ge; + + /// + /// Arsenic is a chemical element with the symbol As and atomic number 33. + /// Arsenic occurs in many minerals, usually in combination with sulfur and + /// metals, but also as a pure elemental crystal. Arsenic is a metalloid. + /// + const struct ARSENIC + { + const long double atomic_weight = 74.922; // u + const int atomic_number = 33; + const long double density_STP = 5727; // kg/m^3 + const long double melting_point = 816.9; // C + const long double boiling_point = 614; // C + const long double thermal_conductivity = 50.0; // W/mK + const long double electric_conductivity = 3.3; // MS/m + const long double resistivity = 3e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 328.0; // J/kgK + const long double heat_vaporization = 32.4; // kJ/mol + const long double heat_fusion = 27.7; // kJ/mol + const long double ionization_1st = 9.815; // eV + static void display() + { + displayElementImg(getFileName(33)); + } + } As; + + /// + /// Selenium is a chemical element with the symbol Se and atomic number 34. + /// It is a nonmetal with properties that are intermediate between the + /// elements above and below in the periodic table, sulfur and tellurium, + /// and also has similarities to arsenic + /// + const struct SELENIUM + { + const long double atomic_weight = 78.971; // u + const int atomic_number = 34; + const long double density_STP = 4819; // kg/m^3 + const long double melting_point = 221; // C + const long double boiling_point = 685; // C + const long double thermal_conductivity = 0; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 321.2; // J/kgK + const long double heat_vaporization = 26.0; // kJ/mol + const long double heat_fusion = 5.4; // kJ/mol + const long double ionization_1st = 9.753; // eV + static void display() + { + displayElementImg(getFileName(34)); + } + } Se; + + /// + /// Bromine is a chemical element with the symbol Br and atomic number 35. + /// It is the third-lightest halogen, and is a fuming red-brown liquid at + /// room temperature that evaporates readily to form a similarly coloured + /// vapour. Its properties are intermediate between those of chlorine + /// and iodine. + /// + const struct BROMINE + { + const long double atomic_weight = 79.904; // u + const int atomic_number = 35; + const long double density_STP = 3120; // kg/m^3 + const long double melting_point = -7.350; // C + const long double boiling_point = 58.9; // C + const long double thermal_conductivity = 0.12; // W/mK + const long double electric_conductivity = 1.0e-16; // MS/m + const long double resistivity = 1.0e10; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 947.3; // J/kgK + const long double heat_vaporization = 14.8; // kJ/mol + const long double heat_fusion = 5.8; // kJ/mol + const long double ionization_1st = 11.814; // eV + static void display() + { + displayElementImg(getFileName(35)); + } + } Br; + + /// + /// Krypton is a chemical element with the symbol Kr and atomic number 36. + /// It is a colorless, odorless, tasteless noble gas that occurs in trace + /// amounts in the atmosphere and is often used with other rare gases in + /// fluorescent lamps. With rare exceptions, krypton is chemically inert + /// + const struct KRYPTON + { + const long double atomic_weight = 83.798; // u + const int atomic_number = 36; + const long double density_STP = 3.75; // kg/m^3 + const long double melting_point = -157.36; // C + const long double boiling_point = -153.22; // C + const long double thermal_conductivity = 0.00943; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 248.05; // J/kgK + const long double heat_vaporization = 9.02; // kJ/mol + const long double heat_fusion = 1.64; // kJ/mol + const long double ionization_1st = 14.000; // eV + static void display() + { + displayElementImg(getFileName(36)); + } + } Kr; + + /// + /// Rubidium is the chemical element with the symbol Rb and atomic number 37. + /// Rubidium is a very soft, silvery-white metal in the alkali metal group. + /// Rubidium metal shares similarities to potassium metal and caesium metal + /// in physical appearance, softness and conductivity. + /// + const struct RUBIDIUM + { + const long double atomic_weight = 85.468; // u + const int atomic_number = 37; + const long double density_STP = 1532; // kg/m^3 + const long double melting_point = 39.310; // C + const long double boiling_point = 688.0; // C + const long double thermal_conductivity = 58.0; // W/mK + const long double electric_conductivity = 8.30; // MS/m + const long double resistivity = 1.2e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 364; // J/kgK + const long double heat_vaporization = 72.0; // kJ/mol + const long double heat_fusion = 2.19; // kJ/mol + const long double ionization_1st = 4.177; // eV + static void display() + { + displayElementImg(getFileName(37)); + } + } Rb; + + /// + /// Strontium is the chemical element with the symbol Sr and atomic number 38. + /// An alkaline earth metal, strontium is a soft silver-white yellowish metallic + /// element that is highly chemically reactive. The metal forms a dark oxide + /// layer when it is exposed to air. + /// + const struct STRONTIUM + { + const long double atomic_weight = 87.62; // u + const int atomic_number = 38; + const long double density_STP = 2630; // kg/m^3 + const long double melting_point = 776.9; // C + const long double boiling_point = 1382.0; // C + const long double thermal_conductivity = 35; // W/mK + const long double electric_conductivity = 7.7; // MS/m + const long double resistivity = 1.3e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 300.0; // J/kgK + const long double heat_vaporization = 137.0; // kJ/mol + const long double heat_fusion = 8.0; // kJ/mol + const long double ionization_1st = 5.695; // eV + static void display() + { + displayElementImg(getFileName(38)); + } + } Sr; + + /// + /// Yttrium is a chemical element with the symbol Y and atomic number 39. + /// It is a silvery-metallic transition metal chemically similar to the + /// lanthanides and has often been classified as a "rare-earth element" + /// + const struct YTTRIUM + { + const long double atomic_weight = 88.906; // u + const int atomic_number = 39; + const long double density_STP = 4472; // kg/m^3 + const long double melting_point = 1526.0; // C + const long double boiling_point = 3345.0; // C + const long double thermal_conductivity = 17; // W/mK + const long double electric_conductivity = 1.80; // MS/m + const long double resistivity = 5.6e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 298.0; // J/kgK + const long double heat_vaporization = 380.0; // kJ/mol + const long double heat_fusion = 11.4; // kJ/mol + const long double ionization_1st = 6.22; // eV + static void display() + { + displayElementImg(getFileName(39)); + } + } Y; + + /// + /// Zirconium is a chemical element with the symbol Zr and atomic number 40. + /// The name zirconium is taken from the name of the mineral zircon, the + /// most important source of zirconium. It is a lustrous, grey-white, strong + /// transition metal that closely resembles hafnium and, to a lesser + /// extent, titanium. + /// + const struct ZIRCONIUM + { + const long double atomic_weight = 91.224; // u + const int atomic_number = 40; + const long double density_STP = 6511; // kg/m^3 + const long double melting_point = 1855.0; // C + const long double boiling_point = 4409.0; // C + const long double thermal_conductivity = 23; // W/mK + const long double electric_conductivity = 2.4; // MS/m + const long double resistivity = 4.2e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 278.0; // J/kgK + const long double heat_vaporization = 580.0; // kJ/mol + const long double heat_fusion = 21.0; // kJ/mol + const long double ionization_1st = 6.634; // eV + static void display() + { + displayElementImg(getFileName(40)); + } + } Zr; + + /// + /// Niobium, also known as columbium, + /// is a chemical element with the symbol Nb and atomic number 41. + /// Niobium is a light grey, crystalline, and ductile transition metal. + /// Pure niobium has a Mohs hardness rating similar to that of pure titanium, + /// and it has similar ductility to iron. + /// + const struct NIOBIUM + { + const long double atomic_weight = 92.906; // u + const int atomic_number = 41; + const long double density_STP = 8570; // kg/m^3 + const long double melting_point = 2477.0; // C + const long double boiling_point = 4744.0; // C + const long double thermal_conductivity = 54; // W/mK + const long double electric_conductivity = 6.7; // MS/m + const long double resistivity = 1.5e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 265.0; // J/kgK + const long double heat_vaporization = 690.0; // kJ/mol + const long double heat_fusion = 26.8; // kJ/mol + const long double ionization_1st = 6.759; // eV + static void display() + { + displayElementImg(getFileName(41)); + } + } Nb; + + /// + /// Molybdenum is a chemical element with the symbol Mo and atomic number 42. + /// The name is from Neo-Latin molybdaenum, which is based on Ancient Greek + /// Μόλυβδος molybdos, meaning lead, since its ores were confused with lead ores. + /// + const struct MOLYBDENUM + { + const long double atomic_weight = 95.95; // u + const int atomic_number = 42; + const long double density_STP = 10280; // kg/m^3 + const long double melting_point = 2623.0; // C + const long double boiling_point = 4639.0; // C + const long double thermal_conductivity = 139.0; // W/mK + const long double electric_conductivity = 20.0; // MS/m + const long double resistivity = 5.0e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 251.0; // J/kgK + const long double heat_vaporization = 600.0; // kJ/mol + const long double heat_fusion = 36.0; // kJ/mol + const long double ionization_1st = 7.092; // eV + static void display() + { + displayElementImg(getFileName(42)); + } + } Mo; + + /// + /// Technetium is a chemical element with the symbol Tc and atomic number 43. + /// It is the lightest element whose isotopes are all radioactive, none of + /// which is stable other than the fully ionized state of ⁹⁷Tc. Nearly all + /// available technetium is produced as a synthetic element. + /// + const struct TECHNETIUM + { + const long double atomic_weight = (98); // u + const int atomic_number = 43; + const long double density_STP = 11500; // kg/m^3 + const long double melting_point = 2157.0; // C + const long double boiling_point = 4265.0; // C + const long double thermal_conductivity = 51.0; // W/mK + const long double electric_conductivity = 5.0; // MS/m + const long double resistivity = 2.0e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 63.0; // J/kgK + const long double heat_vaporization = 550.0; // kJ/mol + const long double heat_fusion = 23.0; // kJ/mol + const long double ionization_1st = 7.28; // eV + static void display() + { + displayElementImg(getFileName(43)); + } + } Tc; + + /// + /// Ruthenium is a chemical element with the symbol Ru and atomic number 44. + /// It is a rare transition metal belonging to the platinum group of the + /// periodic table. Like the other metals of the platinum group, ruthenium + /// is inert to most other chemicals. + /// + const struct RUTHENIUM + { + const long double atomic_weight = 101.07; // u + const int atomic_number = 44; + const long double density_STP = 12370; // kg/m^3 + const long double melting_point = 2334.0; // C + const long double boiling_point = 4150.0; // C + const long double thermal_conductivity = 120.0; // W/mK + const long double electric_conductivity = 14.0; // MS/m + const long double resistivity = 7.1e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 238.0; // J/kgK + const long double heat_vaporization = 580.0; // kJ/mol + const long double heat_fusion = 25.7; // kJ/mol + const long double ionization_1st = 7.361; // eV + static void display() + { + displayElementImg(getFileName(44)); + } + } Ru; + + /// + /// Rhodium is a chemical element with the symbol Rh and atomic number 45. + /// It is an extraordinarily rare, silvery-white, hard, corrosion-resistant, + /// and chemically inert transition metal. It is a noble metal and a member + /// of the platinum group. It has only one naturally occurring isotope, ¹⁰³Rh + /// + const struct RHODIUM + { + const long double atomic_weight = 102.91; // u + const int atomic_number = 45; + const long double density_STP = 12450; // kg/m^3 + const long double melting_point = 1964.0; // C + const long double boiling_point = 3695.0; // C + const long double thermal_conductivity = 150.0; // W/mK + const long double electric_conductivity = 23.0; // MS/m + const long double resistivity = 4.3e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 240.0; // J/kgK + const long double heat_vaporization = 495.0; // kJ/mol + const long double heat_fusion = 21.7; // kJ/mol + const long double ionization_1st = 7.459; // eV + static void display() + { + displayElementImg(getFileName(45)); + } + } Rh; + + /// + /// Palladium is a chemical element with the symbol Pd and atomic number 46. + /// It is a rare and lustrous silvery-white metal discovered in 1803 by the + /// English chemist William Hyde Wollaston. + /// + const struct PALLADIUM + { + const long double atomic_weight = 106.42; // u + const int atomic_number = 46; + const long double density_STP = 12023; // kg/m^3 + const long double melting_point = 1554.90; // C + const long double boiling_point = 2963.0; // C + const long double thermal_conductivity = 72.0; // W/mK + const long double electric_conductivity = 10.0; // MS/m + const long double resistivity = 1.0e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 240.0; // J/kgK + const long double heat_vaporization = 380.0; // kJ/mol + const long double heat_fusion = 16.7; // kJ/mol + const long double ionization_1st = 8.337; // eV + static void display() + { + displayElementImg(getFileName(46)); + } + } Pd; + + /// + /// Silver is a chemical element with the symbol Ag and atomic number 47. + /// A soft, white, lustrous transition metal, it exhibits the highest + /// electrical conductivity, thermal conductivity, and reflectivity of + /// any metal. + /// + const struct SILVER + { + const long double atomic_weight = 107.87; // u + const int atomic_number = 47; + const long double density_STP = 10490; // kg/m^3 + const long double melting_point = 961.780; // C + const long double boiling_point = 2162.0; // C + const long double thermal_conductivity = 430.0; // W/mK + const long double electric_conductivity = 62.0; // MS/m + const long double resistivity = 1.6e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 235.0; // J/kgK + const long double heat_vaporization = 255.0; // kJ/mol + const long double heat_fusion = 11.3; // kJ/mol + const long double ionization_1st = 7.576; // eV + static void display() + { + displayElementImg(getFileName(47)); + } + } Ag; + + /// + /// Cadmium is a chemical element with the symbol Cd and atomic number 48. + /// This soft, silvery-white metal is chemically similar to the two other + /// stable metals in group 12, zinc and mercury. + /// + const struct CADMIUM + { + const long double atomic_weight = 112.41; // u + const int atomic_number = 48; + const long double density_STP = 8650; // kg/m^3 + const long double melting_point = 321.07; // C + const long double boiling_point = 766.9; // C + const long double thermal_conductivity = 97.0; // W/mK + const long double electric_conductivity = 14.0; // MS/m + const long double resistivity = 7.0e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 230.0; // J/kgK + const long double heat_vaporization = 100.0; // kJ/mol + const long double heat_fusion = 6.3; // kJ/mol + const long double ionization_1st = 8.994; // eV + static void display() + { + displayElementImg(getFileName(48)); + } + } Cd; + + /// + /// Indium is a chemical element with the symbol In and atomic number 49. + /// Indium is the softest metal that is not an alkali metal. It is a + /// silvery-white metal that resembles tin in appearance. It is a + /// post-transition metal that makes up 0.21 parts per million of the + /// Earth's crust + /// + const struct INDIUM + { + const long double atomic_weight = 114.82; // u + const int atomic_number = 49; + const long double density_STP = 7310; // kg/m^3 + const long double melting_point = 156.60; // C + const long double boiling_point = 2072.0; // C + const long double thermal_conductivity = 82.0; // W/mK + const long double electric_conductivity = 12.0; // MS/m + const long double resistivity = 8.0e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 233.0; // J/kgK + const long double heat_vaporization = 230.0; // kJ/mol + const long double heat_fusion = 3.26; // kJ/mol + const long double ionization_1st = 5.786; // eV + static void display() + { + displayElementImg(getFileName(49)); + } + } In; + + /// + /// Tin is a chemical element with the symbol Sn and atomic number 50. + /// Tin is a silvery metal that characteristically has a faint yellow hue. + /// Tin, like indium, is soft enough to be cut without much force. + /// + const struct TIN + { + const long double atomic_weight = 118.71; // u + const int atomic_number = 50; + const long double density_STP = 7310; // kg/m^3 + const long double melting_point = 231.93; // C + const long double boiling_point = 2602.0; // C + const long double thermal_conductivity = 67.0; // W/mK + const long double electric_conductivity = 9.1; // MS/m + const long double resistivity = 1.1e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 217.0; // J/kgK + const long double heat_vaporization = 290.0; // kJ/mol + const long double heat_fusion = 7.0; // kJ/mol + const long double ionization_1st = 7.344; // eV + static void display() + { + displayElementImg(getFileName(50)); + } + } Sn; + + /// + /// Antimony is a chemical element with the symbol Sb and atomic number 51. + /// A lustrous gray metalloid, it is found in nature mainly as the sulfide + /// mineral stibnite. Antimony compounds have been known since ancient times + /// and were powdered for use as medicine and cosmetics, often known by the + /// Arabic name kohl. + /// + const struct ANTIMONY + { + const long double atomic_weight = 121.76; // u + const int atomic_number = 51; + const long double density_STP = 6697; // kg/m^3 + const long double melting_point = 630.63; // C + const long double boiling_point = 1587.0; // C + const long double thermal_conductivity = 24.0; // W/mK + const long double electric_conductivity = 2.5; // MS/m + const long double resistivity = 4.0e-7; //m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 207.0; // J/kgK + const long double heat_vaporization = 68.0; // kJ/mol + const long double heat_fusion = 19.7; // kJ/mol + const long double ionization_1st = 8.64; // eV + static void display() + { + displayElementImg(getFileName(51)); + } + } Sb; + + /// + /// Tellurium is a chemical element with the symbol Te and atomic number 52. + /// It is a brittle, mildly toxic, rare, silver-white metalloid. Tellurium + /// is chemically related to selenium and sulfur, all three of which are + /// chalcogens. It is occasionally found in native form as elemental crystals + /// + const struct TELLURIUM + { + const long double atomic_weight = 127.60; // u + const int atomic_number = 52; + const long double density_STP = 62420; // kg/m^3 + const long double melting_point = 449.51; // C + const long double boiling_point = 987.9; // C + const long double thermal_conductivity = 3.0; // W/mK + const long double electric_conductivity = 0.010; // MS/m + const long double resistivity = .0001; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 201.0; // J/kgK + const long double heat_vaporization = 48.0; // kJ/mol + const long double heat_fusion = 17.5; // kJ/mol + const long double ionization_1st = 9.010; // eV + static void display() + { + displayElementImg(getFileName(52)); + } + } Te; + + /// + /// Iodine is a chemical element with the symbol I and atomic number 53. + /// The heaviest of the stable halogens, it exists as a semi-lustrous, + /// non-metallic solid at standard conditions that melts to form a deep + /// violet liquid at 114 degrees Celsius, and boils to a violet gas at + /// 184 degrees Celsius. + /// + const struct IODINE + { + const long double atomic_weight = 126.90; // u + const int atomic_number = 53; + const long double density_STP = 4940; // kg/m^3 + const long double melting_point = 113.7; // C + const long double boiling_point = 184.3; // C + const long double thermal_conductivity = 0.449; // W/mK + const long double electric_conductivity = 1.0e-13; // MS/m + const long double resistivity = 1.0e7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 429.0; // J/kgK + const long double heat_vaporization = 20.9; // kJ/mol + const long double heat_fusion = 7.76; // kJ/mol + const long double ionization_1st = 10.451; // eV + static void display() + { + displayElementImg(getFileName(53)); + } + } I; + + /// + /// Xenon is a chemical element with the symbol Xe and atomic number 54. + /// It is a colorless, dense, odorless noble gas found in Earth's atmosphere + /// in trace amounts. + /// + const struct XENON + { + const long double atomic_weight = 131.29; // u + const int atomic_number = 54; + const long double density_STP = 5.9; // kg/m^3 + const long double melting_point = -111.8; // C + const long double boiling_point = -108.0; // C + const long double thermal_conductivity = .00565; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 158.32; // J/kgK + const long double heat_vaporization = 12.64; // kJ/mol + const long double heat_fusion = 2.30; // kJ/mol + const long double ionization_1st = 12.130; // eV + static void display() + { + displayElementImg(getFileName(54)); + } + } XE; + + /// + /// Caesium is a chemical element with the symbol Cs and atomic number 55. + /// It is a soft, silvery-golden alkali metal with a melting point of 28.5 °C, + /// which makes it one of only five elemental metals that are liquid at or + /// near room temperature + /// + const struct CAESIUM + { + const long double atomic_weight = 132.91; // u + const int atomic_number = 55; + const long double density_STP = 1879; // kg/m^3 + const long double melting_point = 28.440; // C + const long double boiling_point = 671.0; // C + const long double thermal_conductivity = 36.0; // W/mK + const long double electric_conductivity = 5.0; // MS/m + const long double resistivity = 2.0e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 242.0; // J/kgK + const long double heat_vaporization = 65.0; // kJ/mol + const long double heat_fusion = 2.09; // kJ/mol + const long double ionization_1st = 3.894; // eV + static void display() + { + displayElementImg(getFileName(55)); + } + } Cs; + + /// + /// Barium is a chemical element with the symbol Ba and atomic number 56. + /// It is the fifth element in group 2 and is a soft, silvery alkaline earth + /// metal. Because of its high chemical reactivity, barium is never found in + /// nature as a free element. + /// + const struct BARIUM + { + const long double atomic_weight = 137.33; // u + const int atomic_number = 56; + const long double density_STP = 3510; // kg/m^3 + const long double melting_point = 730.0; // C + const long double boiling_point = 1870.0; // C + const long double thermal_conductivity = 18.0; // W/mK + const long double electric_conductivity = 2.9; // MS/m + const long double resistivity = 3.5e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 205.0; // J/kgK + const long double heat_vaporization = 140.0; // kJ/mol + const long double heat_fusion = 8.0; // kJ/mol + const long double ionization_1st = 5.212; // eV + static void display() + { + displayElementImg(getFileName(56)); + } + } Ba; + + + /// + /// Lanthanum is a chemical element with the symbol La and atomic number 57. + /// It is a soft, ductile, silvery-white metal that tarnishes slowly when + /// exposed to air. + /// + const struct LANTHANUM + { + const long double atomic_weight = 138.91; // u + const int atomic_number = 57; + const long double density_STP = 6146; // kg/m^3 + const long double melting_point = 919.9; // C + const long double boiling_point = 3463.0; // C + const long double thermal_conductivity = 13.0; // W/mK + const long double electric_conductivity = 1.6; // MS/m + const long double resistivity = 6.1e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 195.0; // J/kgK + const long double heat_vaporization = 400.0; // kJ/mol + const long double heat_fusion = 6.2; // kJ/mol + const long double ionization_1st = 5.577; // eV + static void display() + { + displayElementImg(getFileName(57)); + } + } La; + + /// + /// Cerium is a chemical element with the symbol Ce and atomic number 58. + /// Cerium is a soft, ductile, and silvery-white metal that tarnishes when + /// exposed to air, and it is soft enough to be cut with a steel kitchen knife. + /// + const struct CERIUM + { + const long double atomic_weight = 140.12; // u + const int atomic_number = 58; + const long double density_STP = 6689; // kg/m^3 + const long double melting_point = 797.9; // C + const long double boiling_point = 3360.0; // C + const long double thermal_conductivity = 11.0; // W/mK + const long double electric_conductivity = 1.4; // MS/m + const long double resistivity = 7.4e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 192.0; // J/kgK + const long double heat_vaporization = 350.0; // kJ/mol + const long double heat_fusion = 5.5; // kJ/mol + const long double ionization_1st = 5.539; // eV + static void display() + { + displayElementImg(getFileName(58)); + } + } Ce; + + /// + /// Praseodymium is a chemical element with the symbol Pr and atomic number 59. + /// It is the third member of the lanthanide series and is traditionally + /// considered to be one of the rare-earth metals. + /// + const struct PRASEODYMIUM + { + const long double atomic_weight = 140.91; // u + const int atomic_number = 59; + const long double density_STP = 6640; // kg/m^3 + const long double melting_point = 930.9; // C + const long double boiling_point = 3290.0; // C + const long double thermal_conductivity = 13.0; // W/mK + const long double electric_conductivity = 1.4; // MS/m + const long double resistivity = 7.0e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 193.0; // J/kgK + const long double heat_vaporization = 330.0; // kJ/mol + const long double heat_fusion = 6.9; // kJ/mol + const long double ionization_1st = 5.46; // eV + static void display() + { + displayElementImg(getFileName(59)); + } + }Pr; + + /// + /// Neodymium is a chemical element with the symbol Nd and atomic number 60. + /// Neodymium belongs to the lanthanide series and is a rare-earth element. + /// It is a hard, slightly malleable silvery metal that quickly tarnishes + /// in air and moisture + /// + const struct NEODYMIUM + { + const long double atomic_weight = 144.24; // u + const int atomic_number = 60; + const long double density_STP = 7010; // kg/m^3 + const long double melting_point = 1021.0; // C + const long double boiling_point = 3100.0; // C + const long double thermal_conductivity = 17.0; // W/mK + const long double electric_conductivity = 1.6; // MS/m + const long double resistivity = 6.4e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 190.0; // J/kgK + const long double heat_vaporization = 285.0; // kJ/mol + const long double heat_fusion = 7.1; // kJ/mol + const long double ionization_1st = 5.525; // eV + static void display() + { + displayElementImg(getFileName(60)); + } + } Nd; + + /// + /// Promethium is a chemical element with the symbol Pm and atomic number 61. + /// All of its isotopes are radioactive; it is extremely rare, with only + /// about 500–600 grams naturally occurring in Earth's crust at any + /// given time. + /// + const struct PROMETHIUM + { + const long double atomic_weight = (145); // u + const int atomic_number = 61; + const long double density_STP = 7264; // kg/m^3 + const long double melting_point = 1100.0; // C + const long double boiling_point = 3000.0; // C + const long double thermal_conductivity = 15.0; // W/mK + const long double electric_conductivity = 1.3; // MS/m + const long double resistivity = 7.5e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = 290.0; // kJ/mol + const long double heat_fusion = 7.7; // kJ/mol + const long double ionization_1st = 5.6; // eV + static void display() + { + displayElementImg(getFileName(61)); + } + } Pm; + + /// + /// Samarium is a chemical element with the symbol Sm and atomic number 62. + /// It is a moderately hard silvery metal that slowly oxidizes in air. + /// Being a typical member of the lanthanide series, samarium usually assumes + /// the oxidation state +3. + /// + const struct SAMARIUM + { + const long double atomic_weight = 150.36; // u + const int atomic_number = 62; + const long double density_STP = 7353; // kg/m^3 + const long double melting_point = 1072.0; // C + const long double boiling_point = 1803.0; // C + const long double thermal_conductivity = 13.0; // W/mK + const long double electric_conductivity = 1.1; // MS/m + const long double resistivity = 9.4e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 196.0; // J/kgK + const long double heat_vaporization = 175.0; // kJ/mol + const long double heat_fusion = 8.6; // kJ/mol + const long double ionization_1st = 5.643; // eV + static void display() + { + displayElementImg(getFileName(62)); + } + } Sm; + + /// + /// Europium is a chemical element with the symbol Eu and atomic number 63. + /// Europium is the most reactive lanthanide by far, having to be stored + /// under an inert fluid to protect it from atmospheric oxygen or moisture. + /// + const struct EUROPIUM + { + const long double atomic_weight = 151.96; // u + const int atomic_number = 63; + const long double density_STP = 5244; // kg/m^3 + const long double melting_point = 821.9; // C + const long double boiling_point = 1500.0; // C + const long double thermal_conductivity = 14.0; // W/mK + const long double electric_conductivity = 1.1; // MS/m + const long double resistivity = 9.0e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 182.0; // J/kgK + const long double heat_vaporization = 175.0; // kJ/mol + const long double heat_fusion = 9.2; // kJ/mol + const long double ionization_1st = 5.670; // eV + static void display() + { + displayElementImg(getFileName(63)); + } + } Eu; + + /// + /// Gadolinium is a chemical element with the symbol Gd and atomic number 64. + /// Gadolinium is a silvery-white metal when oxidation is removed. It is + /// only slightly malleable and is a ductile rare-earth element. Gadolinium + /// reacts with atmospheric oxygen or moisture slowly to form a black coating. + /// + const struct GADOLINIUM + { + const long double atomic_weight = 157.25; // u + const int atomic_number = 64; + const long double density_STP = 7901; // kg/m^3 + const long double melting_point = 1313.0; // C + const long double boiling_point = 3250.0; // C + const long double thermal_conductivity = 11.0; // W/mK + const long double electric_conductivity = .77; // MS/m + const long double resistivity = 1.3e-6; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 240.0; // J/kgK + const long double heat_vaporization = 305.0; // kJ/mol + const long double heat_fusion = 10.0; // kJ/mol + const long double ionization_1st = 6.150; // eV + static void display() + { + displayElementImg(getFileName(64)); + } + } Gd; + + /// + /// Terbium is a chemical element with the symbol Tb and atomic number 65. + /// It is a silvery-white, rare earth metal that is malleable, ductile, + /// and soft enough to be cut with a knife. The ninth member of the + /// lanthanide series, terbium is a fairly electro-positive metal that reacts + /// with water, evolving hydrogen gas. + /// + const struct TERBIUM + { + const long double atomic_weight = 158.93; // u + const int atomic_number = 65; + const long double density_STP = 8219; // kg/m^3 + const long double melting_point = 1356.0; // C + const long double boiling_point = 3230.0; // C + const long double thermal_conductivity = 11.0; // W/mK + const long double electric_conductivity = .83; // MS/m + const long double resistivity = 1.2e-6; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 182.0; // J/kgK + const long double heat_vaporization = 295.0; // kJ/mol + const long double heat_fusion = 10.8; // kJ/mol + const long double ionization_1st = 5.864; // eV + static void display() + { + displayElementImg(getFileName(65)); + } + } Tb; + + /// + /// Dysprosium is the chemical element with the symbol Dy and atomic number 66. + /// It is a rare-earth element with a metallic silver luster. Dysprosium is + /// never found in nature as a free element, though it is found in various + /// minerals, such as xenotime. + /// + const struct DYSPROSIUM + { + const long double atomic_weight = 162.50; // u + const int atomic_number = 66; + const long double density_STP = 8551; // kg/m^3 + const long double melting_point = 1412.0; // C + const long double boiling_point = 2567.0; // C + const long double thermal_conductivity = 11.0; // W/mK + const long double electric_conductivity = 1.1; // MS/m + const long double resistivity = 9.1e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 167.0; // J/kgK + const long double heat_vaporization = 280.0; // kJ/mol + const long double heat_fusion = 11.1; // kJ/mol + const long double ionization_1st = 5.934; // eV + static void display() + { + displayElementImg(getFileName(66)); + } + } Dy; + + /// + /// Holmium is a chemical element with the symbol Ho and atomic number 67. + /// Part of the lanthanide series, holmium is a rare-earth element. Holmium + /// was discovered through isolation by Swedish chemist Per Theodor Cleve + /// and independently by Jacques-Louis Soret and Marc Delafontaine who + /// observed it spectroscopically in 1878. + /// + const struct HOLMIUM + { + const long double atomic_weight = 164.93; // u + const int atomic_number = 67; + const long double density_STP = 8795; // kg/m^3 + const long double melting_point = 1474.0; // C + const long double boiling_point = 2700.0; // C + const long double thermal_conductivity = 16.0; // W/mK + const long double electric_conductivity = 1.1; // MS/m + const long double resistivity = 9.4e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 165.0; // J/kgK + const long double heat_vaporization = 265.0; // kJ/mol + const long double heat_fusion = 17.0; // kJ/mol + const long double ionization_1st = 6.022; // eV + static void display() + { + displayElementImg(getFileName(67)); + } + } Ho; + + /// + /// Erbium is a chemical element with the symbol Er and atomic number 68. + /// A silvery-white solid metal when artificially isolated, natural erbium + /// is always found in chemical combination with other elements. + /// + const struct ERBIUM + { + const long double atomic_weight = 167.26; // u + const int atomic_number = 68; + const long double density_STP = 9066; // kg/m^3 + const long double melting_point = 1497.0; // C + const long double boiling_point = 2868.0; // C + const long double thermal_conductivity = 15.0; // W/mK + const long double electric_conductivity = 1.2; // MS/m + const long double resistivity = 8.6e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 168.0; // J/kgK + const long double heat_vaporization = 285.0; // kJ/mol + const long double heat_fusion = 19.9; // kJ/mol + const long double ionization_1st = 6.108; // eV + static void display() + { + displayElementImg(getFileName(68)); + } + } Er; + + /// + /// Thulium is a chemical element with the symbol Tm and atomic number 69. + /// It is the thirteenth and third-last element in the lanthanide series. + /// + const struct THULIUM + { + const long double atomic_weight = 168.93; // u + const int atomic_number = 69; + const long double density_STP = 9320; // kg/m^3 + const long double melting_point = 1545.0; // C + const long double boiling_point = 1950.0; // C + const long double thermal_conductivity = 17.0; // W/mK + const long double electric_conductivity = 1.4; // MS/m + const long double resistivity = 7.0e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 160.0; // J/kgK + const long double heat_vaporization = 250.0; // kJ/mol + const long double heat_fusion = 16.8; // kJ/mol + const long double ionization_1st = 6.184; // eV + static void display() + { + displayElementImg(getFileName(69)); + } + } Tm; + + /// + /// Ytterbium is a chemical element with the symbol Yb and atomic number 70. + /// It is the fourteenth and penultimate element in the lanthanide series, + /// which is the basis of the relative stability of its +2 oxidation state. + /// + const struct YTTERBIUM + { + const long double atomic_weight = 173.05; // u + const int atomic_number = 70; + const long double density_STP = 6570; // kg/m^3 + const long double melting_point = 818.9; // C + const long double boiling_point = 1196.0; // C + const long double thermal_conductivity = 39.0; // W/mK + const long double electric_conductivity = 3.6; // MS/m + const long double resistivity = 2.8e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 154.0; // J/kgK + const long double heat_vaporization = 160.0; // kJ/mol + const long double heat_fusion = 7.7; // kJ/mol + const long double ionization_1st = 6.254; // eV + static void display() + { + displayElementImg(getFileName(70)); + } + } Yb; + + /// + /// Lutetium is a chemical element with the symbol Lu and atomic number 71. + /// It is a silvery white metal, which resists corrosion in dry air, + /// but not in moist air. Lutetium is the last element in the lanthanide series, + /// and it is traditionally counted among the rare earths. + /// + const struct LUTERTIUM + { + const long double atomic_weight = 174.97; // u + const int atomic_number = 71; + const long double density_STP = 9841; // kg/m^3 + const long double melting_point = 1663.0; // C + const long double boiling_point = 3402.0; // C + const long double thermal_conductivity = 16.0; // W/mK + const long double electric_conductivity = 1.8; // MS/m + const long double resistivity = 5.6e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 154.0; // J/kgK + const long double heat_vaporization = 415.0; // kJ/mol + const long double heat_fusion = 22.0; // kJ/mol + const long double ionization_1st = 5.426; // eV + static void display() + { + displayElementImg(getFileName(71)); + } + } Lu; + + + /// + /// Hafnium is a chemical element with the symbol Hf and atomic number 72. + /// A lustrous, silvery gray, tetravalent transition metal, hafnium chemically + /// resembles zirconium and is found in many zirconium minerals. + /// + const struct HAFNIUM + { + const long double atomic_weight = 178.49; // u + const int atomic_number = 72; + const long double density_STP = 13310; // kg/m^3 + const long double melting_point = 2233.0; // C + const long double boiling_point = 4603.0; // C + const long double thermal_conductivity = 23.0; // W/mK + const long double electric_conductivity = 3.3; // MS/m + const long double resistivity = 3.0e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 144.0; // J/kgK + const long double heat_vaporization = 630.0; // kJ/mol + const long double heat_fusion = 25.5; // kJ/mol + const long double ionization_1st = 6.825; // eV + static void display() + { + displayElementImg(getFileName(72)); + } + } Hf; + + + /// + /// Tantalum is a chemical element with the symbol Ta and atomic number 73. + /// Previously known as tantalium, it is named after Tantalus, a villain + /// from Greek mythology. Tantalum is a rare, hard, blue-gray, lustrous + /// transition metal that is highly corrosion-resistant. + /// + const struct TANTALUM + { + const long double atomic_weight = 180.95; // u + const int atomic_number = 73; + const long double density_STP = 16650; // kg/m^3 + const long double melting_point = 3017.0; // C + const long double boiling_point = 5458.0; // C + const long double thermal_conductivity = 57.0; // W/mK + const long double electric_conductivity = 7.7; // MS/m + const long double resistivity = 1.3e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 140.0; // J/kgK + const long double heat_vaporization = 735.0; // kJ/mol + const long double heat_fusion = 36.0; // kJ/mol + const long double ionization_1st = 7.89; // eV + static void display() + { + displayElementImg(getFileName(73)); + } + } Ta; + /// + /// Tungsten, or wolfram, is a chemical element with the symbol W and atomic number 74. + /// Tungsten is a rare metal found naturally on Earth almost exclusively as + /// compounds with other elements. It was identified as a new element in 1781 + /// and first isolated as a metal in 1783. + /// + const struct TUNGSTEN + { + const long double atomic_weight = 183.84; // u + const int atomic_number = 74; + const long double density_STP = 19250; // kg/m^3 + const long double melting_point = 3422.0; // C + const long double boiling_point = 5555.0; // C + const long double thermal_conductivity = 170.0; // W/mK + const long double electric_conductivity = 20.0; // MS/m + const long double resistivity = 5.0e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 132.0; // J/kgK + const long double heat_vaporization = 800.0; // kJ/mol + const long double heat_fusion = 35.0; // kJ/mol + const long double ionization_1st = 7.98; // eV + static void display() + { + displayElementImg(getFileName(74)); + } + } W; + + /// + /// Rhenium is a chemical element with the symbol Re and atomic number 75. + /// It is a silvery-gray, heavy, third-row transition metal in group 7 of + /// the periodic table. With an estimated average concentration of 1 part + /// per billion, rhenium is one of the rarest elements in the Earth's crust. + /// + const struct RHENIUM + { + const long double atomic_weight = 186.21; // u + const int atomic_number = 75; + const long double density_STP = 21020; // kg/m^3 + const long double melting_point = 3186.0; // C + const long double boiling_point = 5596.0; // C + const long double thermal_conductivity = 48.0; // W/mK + const long double electric_conductivity = 5.6; // MS/m + const long double resistivity = 1.8e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 137.0; // J/kgK + const long double heat_vaporization = 705.0; // kJ/mol + const long double heat_fusion = 33.0; // kJ/mol + const long double ionization_1st = 7.88; // eV + static void display() + { + displayElementImg(getFileName(75)); + } + } Re; + + /// + /// Osmium is a chemical element with the symbol Os and atomic number 76. + /// It is a hard, brittle, bluish-white transition metal in the platinum + /// group that is found as a trace element in alloys, mostly in platinum ores. + /// + const struct OSMIUM + { + const long double atomic_weight = 190.23; // u + const int atomic_number = 76; + const long double density_STP = 22590; // kg/m^3 + const long double melting_point = 3033.0; // C + const long double boiling_point = 5012.0; // C + const long double thermal_conductivity = 88.0; // W/mK + const long double electric_conductivity = 12.0; // MS/m + const long double resistivity = 8.1e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 130.0; // J/kgK + const long double heat_vaporization = 630.0; // kJ/mol + const long double heat_fusion = 31.0; // kJ/mol + const long double ionization_1st = 8.71; // eV + static void display() + { + displayElementImg(getFileName(76)); + } + } Os; + + /// + /// Iridium is a chemical element with the symbol Ir and atomic number 77. + /// A very hard, brittle, silvery-white transition metal of the platinum group, + /// iridium is considered to be the second-densest metal with a density of + /// 22.56 g/cm³ as defined by experimental X-ray crystallography. + /// + const struct IRIDIUM + { + const long double atomic_weight = 192.22; // u + const int atomic_number = 77; + const long double density_STP = 22560; // kg/m^3 + const long double melting_point = 2466.0; // C + const long double boiling_point = 4428.0; // C + const long double thermal_conductivity = 150.0; // W/mK + const long double electric_conductivity = 21.0; // MS/m + const long double resistivity = 4.7e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 131.0; // J/kgK + const long double heat_vaporization = 560.0; // kJ/mol + const long double heat_fusion = 26.0; // kJ/mol + const long double ionization_1st = 9.12; // eV + static void display() + { + displayElementImg(getFileName(77)); + } + } Ir; + + /// + /// Platinum is a chemical element with the symbol Pt and atomic number 78. + /// It is a dense, malleable, ductile, highly nonreactive, precious, + /// silverish-white transition metal. Its name is derived from the Spanish + /// term platino, meaning "little silver". + /// + const struct PLATINUM + { + const long double atomic_weight = 195.08; // u + const int atomic_number = 78;//Z + const long double density_STP = 21450; // kg/m^3 + const long double melting_point = 1768.3; // C + const long double boiling_point = 3825.0; // C + const long double thermal_conductivity = 72.0; // W/mK + const long double electric_conductivity = 9.4; // MS/m + const long double resistivity = 1.1e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 133.0; // J/kgK + const long double heat_vaporization = 490.0; // kJ/mol + const long double heat_fusion = 20.0; // kJ/mol + const long double ionization_1st = 9.02; // eV + static void display() + { + displayElementImg(getFileName(78)); + } + } Pt; + + /// + /// Gold is a chemical element with the symbol Au and atomic number 79, + /// making it one of the higher atomic number elements that occur naturally. + /// In a pure form, it is a bright, slightly reddish yellow, dense, soft, + /// malleable, and ductile metal. Chemically, gold is a transition metal + /// and a group 11 element. + /// + const struct GOLD + { + const long double atomic_weight = 196.97; // u + const int atomic_number = 79; + const long double density_STP = 19300; // kg/m^3 + const long double melting_point = 1064.18; // C + const long double boiling_point = 2856; // C + const long double thermal_conductivity = 320.0; // W/mK + const long double electric_conductivity = 45.0; // MS/m + const long double resistivity = 2.2e-8; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 129.1; // J/kgK + const long double heat_vaporization = 330.0; // kJ/mol + const long double heat_fusion = 12.5; // kJ/mol + const long double ionization_1st = 9.225; // eV + static void display() + { + displayElementImg(getFileName(79)); + } + } Au; + + /// + /// Mercury is a chemical element with the symbol Hg and atomic number 80. + /// It is commonly known as quicksilver and was formerly named hydrargyrum. + /// + const struct MERCURY + { + const long double atomic_weight = 200.59; // u + const int atomic_number = 80; + const long double density_STP = 13534; // kg/m^3 + const long double melting_point = -38.830; // C + const long double boiling_point = 356.73; // C + const long double thermal_conductivity = 8.3; // W/mK + const long double electric_conductivity = 1.0; // MS/m + const long double resistivity = 9.6e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 139.5; // J/kgK + const long double heat_vaporization = 59.2; // kJ/mol + const long double heat_fusion = 2.29; // kJ/mol + const long double ionization_1st = 10.438; // eV + static void display() + { + displayElementImg(getFileName(80)); + } + } Hg; + + /// + /// Thallium is a chemical element with the symbol Tl and atomic number 81. + /// It is a gray post-transition metal that is not found free in nature. + /// When isolated, thallium resembles tin, but discolors when exposed to air. + /// + const struct THALLIUM + { + const long double atomic_weight = 204.38; // u + const int atomic_number = 81; + const long double density_STP = 11850; // kg/m^3 + const long double melting_point = 304.0; // C + const long double boiling_point = 1473.0; // C + const long double thermal_conductivity = 46.0; // W/mK + const long double electric_conductivity = 6.7; // MS/m + const long double resistivity = 1.5e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 129.0; // J/kg + const long double heat_vaporization = 165.0; // kJ/mol + const long double heat_fusion = 4.2; // kJ/mol + const long double ionization_1st = 6.109; // eV + static void display() + { + displayElementImg(getFileName(81)); + } + } Tl; + + /// + /// Lead is a chemical element with the symbol Pb and atomic number 82. + /// It is a heavy metal that is denser than most common materials. Lead is + /// soft and malleable, and also has a relatively low melting point. When + /// freshly cut, lead is silvery with a hint of blue; it tarnishes to a dull + /// gray color when exposed to air. + /// + const struct LEAD + { + const long double atomic_weight = 207.2; // u + const int atomic_number = 82; + const long double density_STP = 11340; // kg/m^3 + const long double melting_point = 327.46; // C + const long double boiling_point = 1749.0; // C + const long double thermal_conductivity = 35.0; // W/mK + const long double electric_conductivity = 4.8; // MS/m + const long double resistivity = 2.1e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 127.0; // J/kgK + const long double heat_vaporization = 178.0; // kJ/mol + const long double heat_fusion = 4.77; // kJ/mol + const long double ionization_1st = 7.417; // eV + static void display() + { + displayElementImg(getFileName(82)); + } + } Pb; + + /// + /// Bismuth is a chemical element with the symbol Bi and atomic number 83. + /// It is a pentavalent post-transition metal and one of the pnictogens with + /// chemical properties resembling its lighter group 15 siblings arsenic + /// and antimony. + /// + const struct BISMUTH + { + const long double atomic_weight = 208.98; // u + const int atomic_number = 83; + const long double density_STP = 9780; // kg/m^3 + const long double melting_point = 271.3; // C + const long double boiling_point = 1564.0; // C + const long double thermal_conductivity = 8.0; // W/mK + const long double electric_conductivity = .77; // MS/m + const long double resistivity = 1.3e-6; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 122.0; // J/kgK + const long double heat_vaporization = 160.0; // kJ/mol + const long double heat_fusion = 10.9; // kJ/mol + const long double ionization_1st = 7.29; // eV + static void display() + { + displayElementImg(getFileName(83)); + } + } Bi; + + /// + /// Polonium is a chemical element with the symbol Po and atomic number 84. + /// A rare and highly radioactive metal with no stable isotopes, polonium + /// is chemically similar to selenium and tellurium, though its metallic + /// character resembles that of its horizontal neighbors in the periodic + /// table: thallium, lead, and bismuth. + /// + const struct POLONIUM + { + const long double atomic_weight = (209); // u + const int atomic_number = 84; + const long double density_STP = 9196.0; // kg/m^3 + const long double melting_point = 255.0; // C + const long double boiling_point = 961.9; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = 2.3; // MS/m + const long double resistivity = 4.3e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = 100.0; // kJ/mol + const long double heat_fusion = 13.0; // kJ/mol + const long double ionization_1st = 8.417; // eV + static void display() + { + displayElementImg(getFileName(84)); + } + } Po; + + /// + /// Astatine is a chemical element with the symbol At and atomic number 85. + /// It is the rarest naturally occurring element in the Earth's crust, + /// occurring only as the decay product of various heavier elements. + /// All of astatine's isotopes are short-lived; the most stable is + /// astatine-210, with a half-life of 8.1 hours. + /// + const struct ASTATINE + { + const long double atomic_weight = (210); // u + const int atomic_number = 85; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = 302.0; // C + const long double boiling_point = 350.0; // C + const long double thermal_conductivity = 2.0; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = 40.0; // kJ/mol + const long double heat_fusion = 6.0; // kJ/mol + const long double ionization_1st = 9.22; // eV + static void display() + { + displayElementImg(getFileName(85)); + } + } At; + + /// + /// Radon is a chemical element with the symbol Rn and atomic number 86. + /// It is a radioactive, colorless, odorless, tasteless noble gas. + /// + const struct RADON + { + const long double atomic_weight = (222); // u + const int atomic_number = 86; + const long double density_STP = 9.73; // kg/m^3 + const long double melting_point = -71.1; // C + const long double boiling_point = -61.85; // C + const long double thermal_conductivity = .00361; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 93.65; // J/kgK + const long double heat_vaporization = 17.0; // kJ/mol + const long double heat_fusion = 3.0; // kJ/mol + const long double ionization_1st = 10.75; // eV + static void display() + { + displayElementImg(getFileName(86)); + } + } Rn; + + /// + /// Francium is a chemical element with the symbol Fr and atomic number 87. + /// Prior to its discovery, it was referred to as eka-caesium. It is extremely + /// radioactive; its most stable isotope, francium-223, has a half-life + /// of only 22 minutes. + /// + const struct FRANCIUM + { + const long double atomic_weight = (223); // u + const int atomic_number = 87; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = 20.9; // C + const long double boiling_point = 650.0; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = 65.0; // kJ/mol + const long double heat_fusion = 2.0; // kJ/mol + const long double ionization_1st = 3.94; // eV + static void display() + { + displayElementImg(getFileName(87)); + } + } Fr; + + /// + /// Radium is a chemical element with the symbol Ra and atomic number 88. + /// It is the sixth element in group 2 of the periodic table, also known + /// as the alkaline earth metals. Pure radium is silvery-white, but it + /// readily reacts with nitrogen on exposure to air, forming a black + /// surface layer of radium nitride. + /// + const struct RADIUM + { + const long double atomic_weight = (226); // u + const int atomic_number = 88; + const long double density_STP = 5000.0; // kg/m^3 + const long double melting_point = 700.0; // C + const long double boiling_point = 1737.0; // C + const long double thermal_conductivity = 19.0; // W/mK + const long double electric_conductivity = 1.0; // MS/m + const long double resistivity = 1.0e-6; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 92.0; // J/kgK + const long double heat_vaporization = 125.0; // kJ/mol + const long double heat_fusion = 8.0; // kJ/mol + const long double ionization_1st = 5.279; // eV + static void display() + { + displayElementImg(getFileName(88)); + } + } Ra; + + + /// + /// Actinium is a chemical element with the symbol Ac and atomic number 89. + /// It was first isolated by Friedrich Oskar Giesel in 1902, who gave it + /// the name emanium; the element got its name by being wrongly identified + /// with a substance André-Louis Debierne found and called actinium. + /// + const struct ACTINIUM + { + const long double atomic_weight = (227); // u + const int atomic_number = 89; + const long double density_STP = 10070.0; // kg/m^3 + const long double melting_point = 1050.0; // C + const long double boiling_point = 3200.0; // C + const long double thermal_conductivity = 12.0; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 120.0; // J/kgK + const long double heat_vaporization = 400.0; // kJ/mol + const long double heat_fusion = 14.0; // kJ/mol + const long double ionization_1st = 5.17; // eV + static void display() + { + displayElementImg(getFileName(89)); + } + } Ac; + + /// + /// Thorium is a weakly radioactive metallic chemical element with the symbol Th and atomic number 90. + /// Thorium is silvery and tarnishes black when it is exposed to air, forming + /// thorium dioxide; it is moderately soft, malleable, and has a high melting point. + /// + const struct THORIUM + { + const long double atomic_weight = 232.04; // u + const int atomic_number = 90; + const long double density_STP = 11724.0; // kg/m^3 + const long double melting_point = 1750.0; // C + const long double boiling_point = 4820.0; // C + const long double thermal_conductivity = 54.0; // W/mK + const long double electric_conductivity = 6.7; // MS/m + const long double resistivity = 1.5e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 118.0; // J/kgK + const long double heat_vaporization = 530.0; // kJ/mol + const long double heat_fusion = 16.0; // kJ/mol + const long double ionization_1st = 6.08; // eV + static void display() + { + displayElementImg(getFileName(90)); + } + } Th; + + /// + /// Protactinium is a chemical element with the symbol Pa and atomic number 91. + /// It is a dense, silvery-gray actinide metal which readily reacts with oxygen, + /// water vapor and inorganic acids. + /// + const struct PROTACTINIUM + { + const long double atomic_weight = 231.04; // u + const int atomic_number = 91; + const long double density_STP = 15370.0; // kg/m^3 + const long double melting_point = 1572.0; // C + const long double boiling_point = 4000.0; // C + const long double thermal_conductivity = 47.0; // W/mK + const long double electric_conductivity = 5.6; // MS/m + const long double resistivity = 1.8e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 99.1; // J/kgK + const long double heat_vaporization = 470.0; // kJ/mol + const long double heat_fusion = 15.0; // kJ/mol + const long double ionization_1st = 5.89; // eV + static void display() + { + displayElementImg(getFileName(91)); + } + } Pa; + + /// + /// Uranium is a chemical element with the symbol U and atomic number 92. + /// It is a silvery-grey metal in the actinide series of the periodic table. + /// A uranium atom has 92 protons and 92 electrons, of which 6 are + /// valence electrons. + /// + const struct URANIUM + { + const long double atomic_weight = 238.03; // u + const int atomic_number = 92; + const long double density_STP = 19050.0; // kg/m^3 + const long double melting_point = 1135.0; // C + const long double boiling_point = 3900.0; // C + const long double thermal_conductivity = 27.0; // W/mK + const long double electric_conductivity = 3.6; // MS/m + const long double resistivity = 2.8e-7; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = 116.0; // J/kgK + const long double heat_vaporization = 420.0; // kJ/mol + const long double heat_fusion = 14.0; // kJ/mol + const long double ionization_1st = 6.194; // eV + static void display() + { + displayElementImg(getFileName(192)); + } + } U; + + /// + /// Neptunium is a chemical element with the symbol Np and atomic number 93. + /// A radioactive actinide metal, neptunium is the first transuranic element. + /// Its position in the periodic table just after uranium, named after the + /// planet Uranus, led to it being named after Neptune, the next planet + /// beyond Uranus. + /// + const struct NEPTUNIUM + { + const long double atomic_weight = (237); // u + const int atomic_number = 93; + const long double density_STP = 20450.0; // kg/m^3 + const long double melting_point = 644.0; // C + const long double boiling_point = 4000.0; // C + const long double thermal_conductivity = 6.0; // W/mK + const long double electric_conductivity = .83; // MS/m + const long double resistivity = 1.2e-6; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = 335.0; // kJ/mol + const long double heat_fusion = 10.0; // kJ/mol + const long double ionization_1st = 6.265; // eV + static void display() + { + displayElementImg(getFileName(93)); + } + } Np; + + /// + /// Plutonium is a radioactive chemical element with the symbol Pu and atomic number 94. + /// It is an actinide metal of silvery-gray appearance that tarnishes when exposed to air, + /// and forms a dull coating when oxidized. The element normally exhibits six allotropes + /// and four oxidation states. + /// + const struct PLUTONIUM + { + const long double atomic_weight = (244); // u + const int atomic_number = 94; + const long double density_STP = 19816.0; // kg/m^3 + const long double melting_point = 640.0; // C + const long double boiling_point = 3230.0; // C + const long double thermal_conductivity = 6.0; // W/mK + const long double electric_conductivity = .67; // MS/m + const long double resistivity = 1.5e-6; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = 325.0; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = 6.060; // eV + static void display() + { + displayElementImg(getFileName(94)); + } + } Pu; + + /// + /// Americium is a synthetic radioactive chemical element with the symbol Am and atomic number 95. + /// It is a transuranic member of the actinide series, in the periodic table located under + /// the lanthanide element europium, and thus by analogy was named after the Americas. + /// + const struct AMERICIUM + { + const long double atomic_weight = (243); // u + const int atomic_number = 95; + const long double density_STP = 13670.0; // kg/m^3 + const long double melting_point = 1176.0; // C + const long double boiling_point = 2011.0; // C + const long double thermal_conductivity = 10.0; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = 5.99; // eV + static void display() + { + displayElementImg(getFileName(95)); + } + } Am; + + /// + /// Curium is a transuranic radioactive chemical element with the symbol Cm and atomic number 96. + /// This element of the actinide series was named after Marie and Pierre Curie, both known + /// for their research on radioactivity. + /// + const struct CURIUM + { + const long double atomic_weight = (247); // u + const int atomic_number = 96; + const long double density_STP = 13510.0; // kg/m^3 + const long double melting_point = 1345.0; // C + const long double boiling_point = 3110.0; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = 6.02; // eV + static void display() + { + displayElementImg(getFileName(96)); + } + } Cm; + + /// + /// Berkelium is a transuranic radioactive chemical element with the symbol Bk and atomic number 97. + /// It is a member of the actinide and transuranium element series. It is named + /// after the city of Berkeley, California, the location of the Lawrence Berkeley + /// National Laboratory where it was discovered in December 1949. + /// + const struct BERKELIUM + { + const long double atomic_weight = (247); // u + const int atomic_number = 97; + const long double density_STP = 14780.00; // kg/m^3 + const long double melting_point = 1050.0; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = 10.0; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = 6.23; // eV + static void display() + { + displayElementImg(getFileName(97)); + } + } Bk; + + /// + /// Californium is a radioactive chemical element with the symbol Cf and atomic number 98. + /// The element was first synthesized in 1950 at the Lawrence Berkeley National Laboratory, + /// by bombarding curium with alpha particles. + /// + const struct CALIFORNIUM + { + const long double atomic_weight = (251); // u + const int atomic_number = 98; + const long double density_STP = 15100.0; // kg/m^3 + const long double melting_point = 899.9; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = 6.30; // eV + static void display() + { + displayElementImg(getFileName(98)); + } + } Cf; + + /// + /// Einsteinium is a synthetic element with the symbol Es and atomic number 99. + /// Einsteinium is a member of the actinide series and it is the seventh transuranic + /// element. It is named to honor Albert Einstein. Einsteinium was discovered + /// as a component of the debris of the first hydrogen bomb explosion in 1952. + /// + const struct EINSTEINIUM + { + const long double atomic_weight = (252); // u + const int atomic_number = 99; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = 859.9; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = 6.42; // eV + static void display() + { + displayElementImg(getFileName(99)); + } + } Es; + + /// + /// Fermium is a synthetic element with the symbol Fm and atomic number 100. + /// It is an actinide and the heaviest element that can be formed by neutron + /// bombardment of lighter elements, and hence the last element that can be + /// prepared in macroscopic quantities, although pure fermium metal has not + /// yet been prepared. + /// + const struct FERMIUM + { + const long double atomic_weight = (257); // u + const int atomic_number = 100; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = 1500.0; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = 6.50; // eV + static void display() + { + displayElementImg(getFileName(100)); + } + } Fm; + + /// + /// Mendelevium is a synthetic element with the symbol Md and atomic number 101. + /// A metallic radioactive transuranic element in the actinide series, it is the + /// first element by atomic number that currently cannot be produced in + /// macroscopic quantities through neutron bombardment of lighter elements. + /// + const struct MANDELEVIUM + { + const long double atomic_weight = (258); // u + const int atomic_number = 101; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = 830.0; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = 6.58; // eV + static void display() + { + displayElementImg(getFileName(101)); + } + } Md; + + /// + /// Nobelium is a synthetic chemical element with the symbol No and atomic number 102. + /// It is named in honor of Alfred Nobel, the inventor of dynamite and benefactor + /// of science. A radioactive metal, it is the tenth transuranic element and is + /// the penultimate member of the actinide series. + /// + const struct NOBELIUM + { + const long double atomic_weight = (259); // u + const int atomic_number = 102; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = 830.0; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = 6.65; // eV + static void display() + { + displayElementImg(getFileName(102)); + } + } No; + + /// + /// Lawrencium is a synthetic chemical element with the symbol Lr and atomic number 103. + /// It is named in honor of Ernest Lawrence, inventor of the cyclotron, a + /// device that was used to discover many artificial radioactive elements. + /// + const struct LAWRENCIUM + { + const long double atomic_weight = (266); // u + const int atomic_number = 103; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = 1600.0; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = 4.87; // eV + static void display() + { + displayElementImg(getFileName(103)); + } + } Lr; + + /// + /// Rutherfordium is a synthetic chemical element with the symbol Rf and atomic number 104, + /// named after New Zealand physicist Ernest Rutherford. As a synthetic element, + /// it is not found in nature and can only be created in a laboratory. + /// + const struct RUTHERFORDIUM + { + const long double atomic_weight = (267); // u + const int atomic_number = 104; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = 6.01; // eV + static void display() + { + displayElementImg(getFileName(104)); + } + } Rf; + + /// + /// Dubnium is a synthetic chemical element with the symbol Db and atomic number 105. + /// Dubnium is highly radioactive: the most stable known isotope, dubnium-268, + /// has a half-life of about 28 hours. This greatly limits extended research + /// on dubnium. Dubnium does not occur naturally on Earth and is produced + /// artificially. + /// + const struct DUBNIUM + { + const long double atomic_weight = (268); // u + const int atomic_number = 105; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = FP_NAN; // eV + static void display() + { + displayElementImg(getFileName(105)); + } + } Db; + + /// + /// Seaborgium is a synthetic chemical element with the symbol Sg and atomic number 106. + /// It is named after the American nuclear chemist Glenn T. Seaborg. As a synthetic + /// element, it can be created in a laboratory but is not found in nature. + /// + const struct SEABORGIUM + { + const long double atomic_weight = (269); // u + const int atomic_number = 106; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = FP_NAN; // eV + static void display() + { + displayElementImg(getFileName(106)); + } + } Sg; + + /// + /// Bohrium is a synthetic chemical element with the symbol Bh and atomic number 107. + /// It is named after Danish physicist Niels Bohr. As a synthetic element, + /// it can be created in a laboratory but is not found in nature. + /// + const struct BOHRIUM + { + const long double atomic_weight = (270); // u + const int atomic_number = 107; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = FP_NAN; // eV + static void display() + { + displayElementImg(getFileName(107)); + } + } Bh; + + /// + /// Hassium is a chemical element with the symbol Hs and the atomic number 108. + /// Hassium is highly radioactive; its most stable known isotopes have half-lives + /// of approximately ten seconds. + /// + const struct HASSIUM + { + const long double atomic_weight = 277; // u + const int atomic_number = 108; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = FP_NAN; // eV + static void display() + { + displayElementImg(getFileName(108)); + } + } Hs; + + /// + /// Meitnerium is a synthetic chemical element with the symbol Mt and atomic number 109. + /// It is an extremely radioactive synthetic element. The most stable known isotope, + /// meitnerium-278, has a half-life of 4.5 seconds, although the unconfirmed + /// meitnerium-282 may have a longer half-life of 67 seconds. + /// + const struct MEITNERIUM + { + const long double atomic_weight = 278; // u + const int atomic_number = 109; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = FP_NAN; // eV + static void display() + { + displayElementImg(getFileName(109)); + } + } Mt; + + /// + /// Darmstadtium is a chemical element with the symbol Ds and atomic number 110. + /// It is an extremely radioactive synthetic element. The most stable known + /// isotope, darmstadtium-281, has a half-life of approximately 12.7 seconds. + /// + const struct DARMSTADTIUM + { + const long double atomic_weight = 281; // u + const int atomic_number = 110; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = FP_NAN; // eV + static void display() + { + displayElementImg(getFileName(110)); + } + } Ds; + + + /// + /// Roentgenium is a chemical element with the symbol Rg and atomic number 111. + /// It is an extremely radioactive synthetic element that can be created in a + /// laboratory but is not found in nature. + /// + const struct ROENTGENUIM + { + const long double atomic_weight = 282; // u + const int atomic_number = 111; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = FP_NAN; // eV + static void display() + { + displayElementImg(getFileName(111)); + } + } Rg; + + /// + /// Copernicium is a synthetic chemical element with the symbol Cn and atomic number 112. + /// Its known isotopes are extremely radioactive, and have only been created in a laboratory. + /// The most stable known isotope, copernicium-285, has a half-life of approximately 28 seconds. + /// + const struct COPERNICIUM + { + const long double atomic_weight = 285; // u + const int atomic_number = 112; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = FP_NAN; // eV + static void display() + { + displayElementImg(getFileName(112)); + } + } Cn; + + /// + /// Nihonium is a synthetic chemical element with the symbol Nh and atomic number 113. + /// It is extremely radioactive; its most stable known isotope, nihonium-286, + /// has a half-life of about 10 seconds. In the periodic table, nihonium is + /// a transactinide element in the p-block. It is a member of period 7 + /// and group 13. + /// + const struct NIHONIUM + { + const long double atomic_weight = 286; // u + const int atomic_number = 113; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = FP_NAN; // eV + static void display() + { + displayElementImg(getFileName(113)); + } + } Nh; + + /// + /// Flerovium is a superheavy artificial chemical element with the symbol Fl and atomic number 114. + /// It is an extremely radioactive synthetic element. The element is named + /// after the Flerov Laboratory of Nuclear Reactions of the Joint Institute + /// for Nuclear Research in Dubna, Russia, where the element was discovered in 1998. + /// + const struct FLEROVIUM + { + const long double atomic_weight = 289; // u + const int atomic_number = 114; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = FP_NAN; // eV + static void display() + { + displayElementImg(getFileName(114)); + } + } Fl; + + /// + /// Moscovium is a synthetic chemical element with the symbol Mc and atomic number 115. + /// It was first synthesized in 2003 by a joint team of Russian and American scientists + /// at the Joint Institute for Nuclear Research in Dubna, Russia. + /// + const struct MOSCOVIUM + { + const long double atomic_weight = 290; // u + const int atomic_number = 115; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = FP_NAN; // eV + static void display() + { + displayElementImg(getFileName(115)); + } + } Mc; + + /// + /// Livermorium is a synthetic chemical element with the symbol Lv and has an atomic number of 116. + /// It is an extremely radioactive element that has only been created in the + /// laboratory and has not been observed in nature. + /// + const struct LIVERMORIUM + { + const long double atomic_weight = 293; // u + const int atomic_number = 116; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = FP_NAN; // eV + static void display() + { + displayElementImg(getFileName(116)); + } + } Lv; + + /// + /// Tennessine is a synthetic chemical element with the symbol Ts and atomic number 117. + /// It is the second-heaviest known element and the penultimate element of the + /// 7th period of the periodic table. + /// + const struct TENNESSINE + { + const long double atomic_weight = 294; // u + const int atomic_number = 117; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = FP_NAN; // eV + static void display() + { + displayElementImg(getFileName(117)); + } + } Ts; + + /// + /// Oganesson is a synthetic chemical element with the symbol Og and atomic number 118. + /// It was first synthesized in 2002 at the Joint Institute for Nuclear Research in Dubna, + /// near Moscow, Russia, by a joint team of Russian and American scientists. + /// + const struct OGANESSON + { + const long double atomic_weight = 294; // u + const int atomic_number = 118; + const long double density_STP = FP_NAN; // kg/m^3 + const long double melting_point = FP_NAN; // C + const long double boiling_point = FP_NAN; // C + const long double thermal_conductivity = FP_NAN; // W/mK + const long double electric_conductivity = FP_NAN; // MS/m + const long double resistivity = FP_NAN; // m Ohm (m * kg*m^2*s^-3*A^-2) + const long double heat_specific = FP_NAN; // J/kgK + const long double heat_vaporization = FP_NAN; // kJ/mol + const long double heat_fusion = FP_NAN; // kJ/mol + const long double ionization_1st = FP_NAN; // eV + static void display() + { + displayElementImg(getFileName(118)); + } + } Og; + +// static void loadImage(const char* pathname, sf::Texture& texture, sf::Sprite& sprite) +// { +// texture.loadFromFile(pathname); // load it from the file +// sprite.setTexture(texture); // put that texture in our sprite +// // the rectangle of the texture to use for this sprite +// sprite.setTextureRect( sf::IntRect(0,0,screenSize_X,screenSize_Y) ); +// } + + static void displayElementImg(const char elementName[]) + { + +// // Create our window +// sf::RenderWindow window( +// sf::VideoMode(screenSize_X,screenSize_Y), // size of the client area we want +// "Display an Image" // The text to appear on the window title +// ); +// +// // load our image +// sf::Texture texture; // the texture which will contain our pixel data +// sf::Sprite sprite; // the sprite which will actually draw it +// loadImage(elementName,texture,sprite); +// +// // Set FPS so this draws at 60 FPS (note: I didn't do this for the WinAPI version because it'd be too hard for such +// // a small example) +// window.setFramerateLimit( 60 ); +// +// bool program_running = true; // true until the user wants to quit +// while(program_running) +// { +// // Do the event pump -- same idea as with Windows... look for events and process them +// sf::Event evt; +// while( window.pollEvent(evt) ) // while there are any events to process... +// { +// // process them. But we're only interested in the closed event +// if(evt.type == sf::Event::EventType::Closed) // is this a close event? +// program_running = false; // indicate that we want the window to close +// } +// +// // now that events are processed... draw our image +// window.draw(sprite); // just draw it to the back buffer +// window.display(); // and display it so the back buffer moves to the front +// } + + + } + + static const char* getFileName(int atomicNumber) + { + switch (atomicNumber) + { + case 1: return "img\\hydrogen.bmp"; + case 2: return "img\\helium.bmp"; + case 3: return "img\\lithium.bmp"; + case 4: return "img\\beryllium.bmp"; + case 5: return "img\\boron.bmp"; + case 6: return "img\\carbon.bmp"; + case 7: return "img\\nitrogen.bmp"; + case 8: return "img\\oxygen.bmp"; + case 9: return "img\\fluorine.bmp"; + case 10: return "img\\neon.bmp"; + case 11: return "img\\sodium.bmp"; + case 12: return "img\\magnesium.bmp"; + case 13: return "img\\aluminium.bmp"; + case 14: return "img\\silicon.bmp"; + case 15: return "img\\phosphorus.bmp"; + case 16: return "img\\sulfur.bmp"; + case 17: return "img\\chlorine.bmp"; + case 18: return "img\\argon.bmp"; + case 19: return "img\\potassium.bmp"; + case 20: return "img\\calcium.bmp"; + case 21: return "img\\scandium.bmp"; + case 22: return "img\\titanium.bmp"; + case 23: return "img\\vanadium.bmp"; + case 24: return "img\\chromium.bmp"; + case 25: return "img\\manganese.bmp"; + case 26: return "img\\iron.bmp"; + case 27: return "img\\cobalt.bmp"; + case 28: return "img\\nickel.bmp"; + case 29: return "img\\copper.bmp"; + case 30: return "img\\zinc.bmp"; + case 31: return "img\\gallium.bmp"; + case 32: return "img\\germanium.bmp"; + case 33: return "img\\arsenic.bmp"; + case 34: return "img\\selenium.bmp"; + case 35: return "img\\bromine.bmp"; + case 36: return "img\\krypton.bmp"; + case 37: return "img\\rubidium.bmp"; + case 38: return "img\\strontium.bmp"; + case 39: return "img\\yttrium.bmp"; + case 40: return "img\\zirconium.bmp"; + case 41: return "img\\niobium.bmp"; + case 42: return "img\\molybdenum.bmp"; + case 43: return "img\\technetium.bmp"; + case 44: return "img\\ruthenium.bmp"; + case 45: return "img\\rhodium.bmp"; + case 46: return "img\\palladium.bmp"; + case 47: return "img\\silver.bmp"; + case 48: return "img\\cadmium.bmp"; + case 49: return "img\\indium.bmp"; + case 50: return "img\\tin.bmp"; + case 51: return "img\\antimony.bmp"; + case 52: return "img\\tellurium.bmp"; + case 53: return "img\\iodine.bmp"; + case 54: return "img\\xenon.bmp"; + case 55: return "img\\ceasium.bmp"; + case 56: return "img\\barium.bmp"; + case 57: return "img\\lanthanum.bmp"; + case 58: return "img\\cerium.bmp"; + case 59: return "img\\praseodymium.bmp"; + case 60: return "img\\neodymium.bmp"; + case 61: return "img\\promethium.bmp"; + case 62: return "img\\samarium.bmp"; + case 63: return "img\\europium.bmp"; + case 64: return "img\\gadolinium.bmp"; + case 65: return "img\\terbium.bmp"; + case 66: return "img\\dysprosium.bmp"; + case 67: return "img\\holmium.bmp"; + case 68: return "img\\erbium.bmp"; + case 69: return "img\\thulium.bmp"; + case 70: return "img\\ytterbium.bmp"; + case 71: return "img\\lutetium.bmp"; + case 72: return "img\\hafnium.bmp"; + case 73: return "img\\tantalum.bmp"; + case 74: return "img\\tungsten.bmp"; + case 75: return "img\\rhenium.bmp"; + case 76: return "img\\osmium.bmp"; + case 77: return "img\\iridium.bmp"; + case 78: return "img\\platinum.bmp"; + case 79: return "img\\gold.bmp"; + case 80: return "img\\mercury.bmp"; + case 81: return "img\\thallium.bmp"; + case 82: return "img\\lead.bmp"; + case 83: return "img\\bismuth.bmp"; + case 84: return "img\\polonium.bmp"; + case 85: return "img\\astatine.bmp"; + case 86: return "img\\radon.bmp"; + case 87: return "img\\francium.bmp"; + case 88: return "img\\radium.bmp"; + case 89: return "img\\actinium.bmp"; + case 90: return "img\\thorium.bmp"; + case 91: return "img\\protactinium.bmp"; + case 92: return "img\\uranium.bmp"; + case 93: return "img\\neptunium.bmp"; + case 94: return "img\\plutonium.bmp"; + case 95: return "img\\americium.bmp"; + case 96: return "img\\curium.bmp"; + case 97: return "img\\berkelium.bmp"; + case 98: return "img\\califomium.bmp"; + case 99: return "img\\einsteinium.bmp"; + case 100: return "img\\fermium.bmp"; + case 101: return "img\\mendelevium.bmp"; + case 102: return "img\\nobelium.bmp"; + case 103: return "img\\lawrencium.bmp"; + case 104: return "img\\rutherfordium.bmp"; + case 105: return "img\\dubnium.bmp"; + case 106: return "img\\seaborgium.bmp"; + case 107: return "img\\bohrium.bmp"; + case 108: return "img\\hassium.bmp"; + case 109: return "img\\meitnerium.bmp"; + case 110: return "img\\darmstadtium.bmp"; + case 111: return "img\\roentgenium.bmp"; + case 112: return "img\\copernicium.bmp"; + case 113: return "img\\nihonium.bmp"; + case 114: return "img\\flerovium.bmp"; + case 115: return "img\\moscovium.bmp"; + case 116: return "img\\livermorium.bmp"; + case 117: return "img\\tennessine.bmp"; + case 118: return "img\\oganesson.bmp"; + } + return "no file"; + } +#endif //PHYSICSFORMULA_PERIODICELEMENTS_H +}elements; +// +//template +//static void printElementData(ELEM el) +//{ +// printf("\nelement: (%s)\n", typeid(el).name()+17); +// std::cout << setw(23) << left << "atomic #: " << el.atomic_number << " Z" << std::endl; +// std::cout << setw(23) << left << "atomic Weight: " << el.atomic_weight << " u" << std::endl; +// std::cout << setw(23) << left << "density STP: " << el.density_STP << " kg/m^3" << std::endl; +// std::cout << setw(23) << left << "melting point: " << el.melting_point << " C" << std::endl; +// std::cout << setw(23) << left << "boiling point: " << el.boiling_point << " C" << std::endl; +// std::cout << setw(23) << left << "thermal conductivity: " << el.thermal_conductivity << " W/mK" << std::endl; +// std::cout << setw(23) << left << "electric conductivity: " << el.electric_conductivity << " MS/m" << std::endl; +// std::cout << setw(23) << left << "resistivity: " << el.resistivity << " Ohm*m" << std::endl; +// std::cout << setw(23) << left << "specific heat: " << el.heat_specific << " J/kgK" << std::endl; +// std::cout << setw(23) << left << "vaporization heat: " << el.heat_vaporization << " kJ/mol" << std::endl; +// std::cout << setw(23) << left << "fusion heat: " << el.heat_fusion << " kJ/mol" << std::endl; +// std::cout << setw(23) << left << "first ionization: " << el.ionization_1st << " eV" << std::endl; +//} + diff --git a/Physics_World.h b/Physics_World.h index 3163ce9..695719f 100644 --- a/Physics_World.h +++ b/Physics_World.h @@ -1,1177 +1,1196 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_PHYSICS_WORLD_H -#define PHYSICSFORMULA_PHYSICS_WORLD_H -/** - * @class PhysicsWorld - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @date 10/15/2020 - */ - -#define TYPE long double - -#include -#include "Testing.h" -#include "StringHelper.h" -#include "RegexHelper.h" -#include "AtomicPhysics.h" -#include "TemplateBST.h" -#include "Circuits.h" -#include "Cone.h" -#include "Cylinder.h" -#include "Cube.h" -#include "Drag.h" -#include "Forces.h" -#include "Elasticity.h" -#include "ElectroMagneticInduction.h" -#include "ElectroMagneticWaves.h" -#include "FluidStatics.h" -#include "Hearing.h" -#include "Kinematics.h" -#include "LinearAlgebra.h" -#include "LogisticRegression.h" -#include "MathFx.h" -#include "Momentum.h" -#include "Parallelogram.h" -#include "PeriodicElements.h" -#include "Point2D.h" -#include "Pyramid.h" -#include "RandomNumbers.h" -#include "Rectangle.h" -#include "RectangularPrism.h" -#include "RotationalMotion.h" -#include "Sphere.h" -#include "Statics.h" -#include "templateGraph.h" -#include "Thermodynamics.h" -#include "Torque.h" -#include "TransitiveClosure.h" -#include "TriangleSolver.h" -#include "Vector.h" -#include "VisionOpticalInstruments.h" -#include "Square.h" -#include "QuantumPhysics.h" -typedef TriangleSolver TS; -typedef QuantumPhysics QP; -typedef SpecialRelativity SR; -typedef WaveOptics WO; -typedef VisionOpticalInstruments VOI; -typedef UniformCircularMotion UCM; -typedef Thermodynamics TD; -typedef Temperature TEMP; -typedef RotationalMotion RM; -typedef GeometricOptics GO; -typedef FluidStatics FS; -typedef FluidDynamics FD; -typedef ElectromagneticWaves EMW; -typedef ElectroMagneticInduction EMI; -typedef ElectricPotential EP; -typedef ElectricCurrent EC; -typedef ElectricCharge ELCHRG; -typedef Forces DAF; -typedef RandomNumbers RN; -typedef AtomicPhysics AP; - - - - - -static auto physics_objectCount = 0; - - -template -void print_type_properties() -{ - std::cout <<'\n' - << "min=" - << std::numeric_limits::min() << '\n' - << "max=" - << std::numeric_limits::max() << '\n' - << "bits=" - << std::numeric_limits::digits << '\n' - << "decdigits=" - << std::numeric_limits::digits10 << '\n' - << "integral=" - << std::numeric_limits::is_integer << '\n' - << "signed=" - << std::numeric_limits::is_signed << '\n' - << "exact=" - << std::numeric_limits::is_exact << '\n' - << "infinity=" - << std::numeric_limits::has_infinity << '\n'; -} - -//_____________________________________________________________________________ -//global constants, methods and structures -// -// - - -static long double _val_;// = 0.0; - - - -/// -/// Sets the value of the static member _val_ -/// -/// The value to set val too. -/// returns the value of v -static auto setVal = [](const T & v) { - _val_ = v; - return _val_; -}; - -/// -/// Gets the value. -/// -/// -static auto getVal = []() { - return _val_; -}; - -/// -/// Shows the value with a label in front and units in back -/// -/// The label. -/// The units. -static auto show_val = [](const T label = "", const T units = "") { - cout << "\n"< -/// Prints the vector values of passed in vector. -/// -/// The v. -/* -static void printVectorValues(vector& v) -{ - cout << "vector: "; - for (int i = 0; i < v.size(); i++) - { - std::cout << v[i] << ", "; - } - std::cout << std::endl; -}//end printVectorValues -*/ -/// -/// Prints the vector values of a vector -/// -/// The vector to print. -template -static auto printVector(vector& v) -{ - cout << "vector: "; - for (size_t i = 0; i < v.size(); i++) - { - std::cout << v[i] << (i -/// Prints the vector of any type -/// -/// The vector to print. -template -void printVector(const T& t) { - std::copy(t.cbegin(), t.cend(), std::ostream_iterator(std::cout, ", ")); -}//end printVector - -/// -/// Prints out a multidimensional vector values of any type. -/// -/// The vector to print. -template -void printVectorInVector(const T& t) { - std::for_each(t.cbegin(), t.cend(), printVector); -}//end printVectorInVector - -/// -/// Prints an array of any type -/// -/// The array. -template -void static printArray(const T(&array)[size]) -{ - for (size_t i = 0; i < size; i++) - cout << array[i] << " "; - - cout << endl; -}//end printArray - -/// -/// Prints a map of any types out in its entirety. -/// -/// The map to print. -template -void printMap(std::map const &m) -{ - for (auto const& pair: m) { - std::cout << "{" << pair.first << ": " << pair.second << "}\n"; - } -}//end print_map - -/// -/// Searches any type map by found value. only use if you need the values saved.\n -/// WARNING*** printMapValues allows you to pass only a map and a search value in -/// and it instantiates a vector within its scope and then fills it as well as -/// prints out the values to screen.*****\n -/// Use this method when you need to find the -/// values that match and then use them in other calculations within client code. -/// -/// The vector to store the results in. -/// The map of elements to search by values. -/// The value to look for. -/// true if a match was found: else false -template -bool searchMapByValue(std::vector & vec, std::map mapOfElemen, V value) -{ - bool bResult = false; - auto it = mapOfElemen.begin(); - while(it != mapOfElemen.end()) - { - if(it->second == value) - { - bResult = true; - vec.push_back(it->first); - } - it++; - } - return bResult; -}//end searchMapByValue -template -bool searchMapByValue(std::vector & vec, std::multimap mapOfElemen, V value) -{ - bool bResult = false; - auto it = mapOfElemen.begin(); - while(it != mapOfElemen.end()) - { - if(it->second == value) - { - bResult = true; - vec.push_back(it->first); - } - it++; - } - return bResult; -}//end searchMapByValue - -/// -/// Prints the map keys found by search value. -/// -/// The map to search. -/// The value to search for. -template -void printMapByValue(std::map m, const V val) -{ - std::cout << "looking for value: "<< val< results; - bool tests = searchMapByValue(results, m, val); - if(tests) - { - std::cout<<"Keys with value "<< val<< " are:"< -/// Prints the map keys found by search value. -/// -/// The map to search. -/// The value to search for. -template -void printMapByValue(std::multimap m, const V val) -{ - std::cout << "looking for value: "<< val< results; - bool tests = searchMapByValue(results, m, val); - if(tests) - { - std::cout<<"Keys with value "<< val<< " are:"< -/// Prints an array of long doubles with a size of n -/// -/// The array. -/// = sizeof( arr ) / sizeof( *arr ) -void static printArr(const long double arr[], const int n) -{ - cout << "array values: "; - for (int i = 0; i < n; i++) - { - cout << arr[i] << ' '; - } -}//end printArr - - - - -/// -/// Calculates the area of a sphere. -/// -/// The radius. -/// the area of sphere (m^2) -static auto sphereArea = [](const T r) -{ - return 4.0 * _PI_ * (r * r); -}; - - -/// -/// Calculates the volume of a sphere. -/// -/// The radius. -/// the volume of sphere(m^3) -static auto sphereVolume = [](const long double r) -{ - return (4.0 / 3.0) * (_PI_ * (r * r * r)); -}; - - -/// -/// Calculates the circumference of a circle. -/// -/// The radius or diameter, use mode to specify. -/// use 'd' to specify if you use diameter and not -/// radius. Do not add anything here if it is the radius you are using -/// as it is defaulted to radius -/// circumference of circle (m) -static auto circleCircumference = [](const T rd, const char mode = 'r') -{ - if (mode == 'r') - { - return 2.0 * _PI_ * rd; - } - return _PI_ * rd; -}; - -/// -/// Calculates the area of a circle. -/// -/// The radius or diameter, use mode to specify. -/// use 'd' to specify if you use diameter and not -/// radius. Do not add anything here if it is the radius you are using -/// as it is defaulted to radius -/// area of a circle (m^2) -static auto circleArea = [](const T rd, const char mode = 'r') -{ - if (mode == 'r') - { - return _PI_ * (rd * rd); - } - return (_PI_ * (rd * rd)) / 4.0; -}; - -/// -/// Calculates the change in any two values xi and xf. -/// -/// The initial starting value. -/// The final value. -/// the change in a value -static auto delta = [](const T xi, const T xf) -{ - return xf - xi; -}; - - -/// -/// structure filled with conversion methods -/// -static struct Conversions -{ - struct SpecificHeatConverter - { - template - static auto joulesKgC_to_kCalKgC(const T j = _val_) - { - return j * .000238845896627; - } - template - static auto kCalKgC_to_joulesKgC_IT(const T kCal = _val_) - { - return kCal * 4186.8; - } - }heat; - - template - static auto atomicMass_to_kilograms(const T u = _val_) - { - return u * 1.66053904E-27; - } - - template - static auto kiloJoules_to_calories(const T kJ) - { - return (kJ * 1000.0) / 4186.0; - } - template - static auto revolutionsFromRadians(const T radTotal) - { - //cout << "revolutions: " << radTotal / (2.0 * _PI_) << endl; - return radTotal / (2.0 * _PI_); - } - - /** - * @brief Returns the revolutions in radians per second which is the - * angular velocity as well - * @param revMin revolutions per minute - * @returns revolutions in radians per second - */ - template - static auto revolutions_min_to_radians_second(const T revMin) - { - return (revMin * 2.0 * _PI_) / 60; - } - - /** - * @brief Returns the conversion from revolutions per radian second to - * revolutions per minute - * @param radSec is the rotation speed in radians per second - * @returns the revolutions per minute - */ - template - static auto radians_second_to_revolutions_minute(const T radSec) - { - return (radSec * 60.0) / (2.0 * _PI_); - } - - /** - * @brief Returns the ratio of the value to gravity - * @param unit can be whatever you are dividing by gravity acceleration - * @returns the gravity ratio - */ - template - static auto gravity_ratio(const T unit) - { - return unit / _G_; - } - - - /** - * @brief Returns the conversion from meters per second to kilometers - * per hour - * @param mps is meters per second - * @returns kilometers per hour - */ - template - static auto mps_to_kmh(const T mps = _val_) - { - return mps * 3.6; - } - /** - * @brief Returns the conversion from kilometers per hour to meters per - * second - * @param kmh is kilometers per hour - * @returns meters per second - */ - template - static auto kmh_to_mps(const T kmh = _val_) - { - return (kmh*1000.0) / 3600.0; - } - - /// - /// KMSs to KMH. - /// - /// kilometers per second. - /// kilometers per hour - template - static auto kms_to_kmh(const T kms = _val_) - { - return kms * 3600.0; - } - /// - /// KMHs to KMS. - /// - /// kilometers per hour. - /// kilometers per second - template - static auto kmh_to_kms(const T kmh = _val_) - { - return kmh / 3600.0; - } - /** - * @brief Returns the conversion from miles per hour to meters per second - * @param mph is miles per hour - * @returns meters per second - */ - template - static auto mph_to_mps(const T mph = _val_) - { - return mph / 2.237; - } - /** - * @brief Returns the conversion from meters per second to miles per hour - * @param mps is meters per second - * @returns miles per hour - */ - template - static auto mps_to_mph(const T mps = _val_) - { - return mps * 2.237; - } - /** - * @brief Returns the conversion from milliseconds to seconds - * @param ms to be converted to seconds - * @returns seconds from milliseconds - */ - template - static auto millisecond_to_seconds(const T ms = _val_) - { - return ms / 1000; - } - template - static auto minutes_to_seconds(const T min = _val_) - { - return min * 60; - } - template - static auto hours_to_seconds(const T hours = _val_) - { - return hours * 3600; - } - /** - * @brief Returns the conversion from days to seconds for use in calculation - * @param days can be expressed as a decimal, four and a half days would - * be 4.5 - * @returns total seconds converted from days - */ - template - static auto days_to_seconds(const T days = _val_) - { - return days * 86400.0; - } - /** - * @brief Returns the conversion from seconds to days - * @param seconds to be converted - * @returns days - */ - template - static auto seconds_to_days(const T seconds = _val_) - { - return seconds / 86400.0; - } - /** - * @brief Returns the conversion from miles to meters - * @param miles to be converted - * @returns meters from miles - */ - template - static auto miles_to_meters(const T miles = _val_) - { - return miles * 1609.0; - } - /** - * @brief Returns the conversion from feet to meters - * @param feet to be converted - * @returns meters - */ - template - static auto feet_to_meters(const T feet = _val_) - { - return feet / 3.281; - } - /** - * @brief Returns the conversion from inches to meters - * @param inches to be converted - * @returns meters - */ - template - static auto inches_to_meters(const T inches = _val_) - { - return inches / 39.37; - } - /** - * @brief Returns the conversion from meters to inches - * @param meters is the total meters - * @returns inches - */ - template - static auto meters_to_inches(const T meters = _val_) - { - return meters * 39.37; - } - /** - * @brief Returns the conversion from centimeters to meters - * @param cm centimeters - * @returns meters - */ - template - static auto centimeters_to_meters(const T cm = _val_) - { - return cm / 100; - } - template - static auto meters_to_centimeters(const T m = _val_) - { - return m * 100; - } - template - static auto kilometers_to_meters(const T km = _val_) - { - return km * 1000; - } - template - static auto millimeters_to_meters(const T mm = _val_) - { - return mm / 1000; - } - template - static auto micrometers_to_meters(const T Mm = _val_) - { - return Mm / pow(1, -6); - } - template - static auto nanometers_to_meters(const T nm = _val_) - { - return nm / pow(1, -9); - } - template - static auto kilogram_to_pound(const T kg = _val_) - { - return kg * 2.20462; - } - template - static auto pound_to_kilogram(const T lbs = _val_) - { - return lbs / 2.205; - } - template - static auto milligram_to_kilogram(const T mg = _val_) - { - return mg / pow(1, -6); - } - template - static auto gram_to_kilogram(const T g = _val_) - { - return g / 1000.0; - } - template - static auto ounce_to_kilogram(const T ounce = _val_) - { - return ounce / 35.274; - } - template - static auto watts_to_kilowatts(const T watt = _val_) - { - return watt / 1000; - } - template - static auto kWh_to_joules(const T kWh = _val_) - { - return kWh * (3.6*pow(10, 6)); - } - template - static auto joules_to_kWh(const T j = _val_) - { - return j / (3.6 * pow(10, 6)); - } - template - static auto joules_to_eV(const T j = _val_) - { - return j / _PROTON_CHARGE_; - } - template - static auto newtonMeters_to_ftPounds(const T Nm = _val_) - { - return Nm / .73756; - } - template - static auto radians_to_revolutions(const T rad = _val_) - { - return rad / (2 * _PI_); - } - template - static auto revolutions_to_radians(const T rev = _val_) - { - return rev * 2 * _PI_; - } - template - static auto atm_to_pascals(const T atm = _val_) - { - return atm * 101325.0; - } - -}converter; - -/// -/// structure filled with common densities -/// -static struct Densities -{ - const long double aluminum_S = 2.7e3; // 2700 kg/m^3 - const long double brass_S = 8.44e3; // 8440 kg/m^3 - const long double copperAverage_S = 8.84e3; // 8800 kg/m^3 - const long double gold_S = 19.32e3; // 19320 kg/m^3 - const long double ironOrSteele_S = 7.8e3; // 7800 kg/m^3 - const long double lead_S = 11.3e3; // 11300 kg/m^3 - const long double polystyrene_S = .10e3; // 100 kg/m^3 - const long double tungsten = 19.30e3; // 19300 kg/m^3 - const long double uranium = 18.7e3; // 18700 kg/m^3 - const long double concrete_light_S = 2.30e3; // 2300 kg/m^3 - const long double concrete_med_S = 2.7e3; // 2700 kg/m^3 - const long double concrete_heavyDuty_S = 3.0e3; // 3000 kg/m^3 - const long double cork_S = .24e3; // 240 kg/m^3 - const long double glassAverage_S = 2.6e3; // 2600 kg/m^3 - const long double granite = 2.7e3; // 2700 kg/m^3 - const long double earthsCrust_S = 3.3e3; // 3300 kg/m^3 - const long double woodSoft_S = .3e3; // 300 kg/m^3 - const long double woodMed_S = .6e3 ; // 600 kg/m^3 - const long double woodHard_S = .9e3; // 900 kg/m^3 - const long double ice_0deg_S = .917e3; // 917 kg/m^3 - const long double boneSoft_S = 1.7e3; // 1700 kg/m^3 - const long double boneHard_S = 2.0e3; // 2000 kg/m^3 - const long double water_L = 1.0e3; // 1000 kg/m^3 - const long double blood_L = 1.05e3; // 1050 kg/m^3 - const long double seaWater_L = 1.025e3; // 1025 kg/m^3 - const long double mercury_L = 13.6e3; // 13600 kg/m^3 - const long double ethylAlcohol_L = .79e3; // 790 kg/m^3 - const long double petrol_L = .68e3; // 680 kg/m^3 - const long double glycerin_L = 1.26e3; // 1260 kg/m^3 - const long double oliveOil_L = .92e3; // 920 kg/m^3 - const long double air_G = 1.293e3; // 1.29 kg/m^3 - const long double carbon_dioxide_G = 1.98e3; // 1.98 kg/m^3 - const long double carbon_monoxide_G3e = 1.25e3; // 1.25 kg/m^3 - const long double hydrogen_G = 0.090e3; // 0.090 kg/m^3 - const long double helium_G = 0.18e3; // 0.18 kg/m^3 - const long double methane_G = 0.72e3; // 0.72 kg/m^3 - const long double nitrogen_G = 1.25e3; // 1.25 kg/m^3 - const long double nitrous_oxide_G = 1.98e3; // 1.98 kg/m^3 - const long double oxygen_G = 1.43e3; // 1.43 kg/m^3 - const long double steam_G = 0.60e3; // 0.60 kg/m^3 - const long double interstellar_space_G = 10.0e-20; // 10.0 x 10^-20 kg/m^3 - const long double black_hole = 10e19; // 10 x 10^19 kg/m^3 -}p; - - - -/// -/// the Physics world class that is the driver class of many smaller more -/// specific classes. This class instantiates all them classes for use in the -/// testFactory.cpp driver file. -/// -class Physics_World -{ -private: - static void countIncrease() { physics_objectCount += 1; } - static void countDecrease() { physics_objectCount -= 1; } - -public: - - /** - * @brief Template method to print out an array that is passed to it - * @param array of values - */ - template - void static print_array(const T(&array)[size]) - { - for (size_t i = 0; i < size; i++) - cout << array[i] << " "; - - cout << endl; - } - - unique_ptr atomic; - unique_ptr> linear_regression; - unique_ptr> logistic_regression; - unique_ptr> etl; - unique_ptr> matrixNd; - unique_ptr> vectorNd; - unique_ptr triangle; - unique_ptr kinematics; - unique_ptr friction; - unique_ptr drag; - unique_ptr elasticity; - unique_ptr uniformCircularMotion; - unique_ptr vector2d; - unique_ptr vector3d; - unique_ptr energy; - unique_ptr momentum; - unique_ptr torque; - unique_ptr statics; - unique_ptr rotationalMotion; - unique_ptr temperature; - unique_ptr heat; - unique_ptr thermodynamic; - unique_ptr dynamics_and_forces; - unique_ptr fluid_statics; - unique_ptr fluid_dynamics; - unique_ptr waves; - unique_ptr hearing; - unique_ptr electric_charge; - unique_ptr electric_potential; - unique_ptr electric_current; - unique_ptr circuits; - unique_ptr magnetism; - unique_ptr emi; - unique_ptr emWaves; - unique_ptr geometric_optics; - unique_ptr wave_optics; - unique_ptr vision_optical; - unique_ptr relativity; - unique_ptr quantum; - unique_ptr square; - unique_ptr cube; - unique_ptr rectangle; - unique_ptr rectangular_prism; - unique_ptr cylinder; - unique_ptr cone; - unique_ptr sphere; - unique_ptr pyramid; - unique_ptr circle; - unique_ptr parallelogram; - unique_ptr> point2d; - unique_ptr> vector; - - - Physics_World(); - Physics_World(TYPE t1, TYPE t2, TYPE t3); - Physics_World(TYPE t1, TYPE t2); - Physics_World(const Physics_World&); //copy constructor - Physics_World& operator=(const Physics_World&); //copy assignment operator - Physics_World(Physics_World&& o) noexcept : - atomic(std::move(o.atomic)), - linear_regression(std::move(o.linear_regression)), - logistic_regression(std::move(o.logistic_regression)), - etl(std::move(o.etl)), - matrixNd(std::move(o.matrixNd)), - vectorNd(std::move(o.vectorNd)), - triangle(std::move(o.triangle)), - kinematics(std::move(o.kinematics)), - friction(std::move(o.friction)), - drag(std::move(o.drag)), - elasticity(std::move(o.elasticity)), - uniformCircularMotion(std::move(o.uniformCircularMotion)), - vector2d(std::move(o.vector2d)), - vector3d(std::move(o.vector3d)), - energy(std::move(o.energy)), - momentum(std::move(o.momentum)), - torque(std::move(o.torque)), - statics(std::move(o.statics)), - rotationalMotion(std::move(o.rotationalMotion)), - temperature(std::move(o.temperature)), - heat(std::move(o.heat)), - thermodynamic(std::move(o.thermodynamic)), - dynamics_and_forces(std::move(o.dynamics_and_forces)), - fluid_statics(std::move(o.fluid_statics)), - fluid_dynamics(std::move(o.fluid_dynamics)), - waves(std::move(o.waves)), - hearing(std::move(o.hearing)), - electric_charge(std::move(o.electric_charge)), - electric_potential(std::move(o.electric_potential)), - electric_current(std::move(o.electric_current)), - circuits(std::move(o.circuits)), - magnetism(std::move(o.magnetism)), - emi(std::move(o.emi)), - emWaves(std::move(o.emWaves)), - geometric_optics(std::move(o.geometric_optics)), - wave_optics(std::move(o.wave_optics)), - vision_optical(std::move(o.vision_optical)), - relativity(std::move(o.relativity)), - quantum(std::move(o.quantum)), - square(std::move(o.square)), - cube(std::move(o.cube)), - rectangle(std::move(o.rectangle)), - rectangular_prism(std::move(o.rectangular_prism)), - cylinder(std::move(o.cylinder)), - cone(std::move(o.cone)), - sphere(std::move(o.sphere)), - pyramid(std::move(o.pyramid)), - circle(std::move(o.circle)), - parallelogram(std::move(o.parallelogram)), - point2d(std::move(o.point2d)), - vector(std::move(o.vector)){} // move constructor - - /**======================================================================== - * overloaded operators - */ - Physics_World operator+(const Physics_World& r)const - { - long double x, y, z; - x = vector3d->getX() + r.vector3d->getX(); - y = vector3d->getY() + r.vector3d->getY(); - z = vector3d->return_z() + r.vector3d->return_z(); - std::unique_ptr sum = std::make_unique(); - sum->vector3d->set_coordinates(x, y, z); - x = vector2d->getX() + r.vector2d->getX(); - y = vector2d->getY() + r.vector2d->getY(); - sum->vector2d->set_coordinates(x, y); - sum->vector3d->mode = r.vector3d->mode; - sum->vector2d->mode = this->vector2d->mode; - return *sum; - } - Physics_World operator+(long double n)const - { - long double x, y, z; - x = vector3d->getX() + n; - y = vector3d->getY() + n; - z = vector3d->return_z() + n; - std::unique_ptr sum = std::make_unique(); - sum->vector3d->set_coordinates(x, y, z); - x = vector2d->getX() + n; - y = vector2d->getY() + n; - sum->vector2d->set_coordinates(x, y); - sum->vector3d->mode = this->vector3d->mode; - sum->vector2d->mode = this->vector2d->mode; - _val_ = +n; - return *sum; - } - - Physics_World& operator+=(const Physics_World& r) const - { - long double x, y, z; - x = vector3d->getX() + r.vector3d->getX(); - y = vector3d->getY() + r.vector3d->getY(); - z = vector3d->return_z() + r.vector3d->return_z(); - std::unique_ptr sum = std::make_unique(); - sum->vector3d->set_coordinates(x, y, z); - x = vector2d->getX() + r.vector2d->getX(); - y = vector2d->getY() + r.vector2d->getY(); - sum->vector2d->set_coordinates(x, y); - sum->vector3d->mode = r.vector3d->mode; - sum->vector2d->mode = this->vector2d->mode; - return *sum; - - } - Physics_World operator+()const - { - long double x, y, z; - x = vector3d->getX() + 1.0; - y = vector3d->getY() + 1.0; - z = vector3d->return_z() + 1.0; - Physics_World sum; - sum.vector3d->set_coordinates(x, y, z); - x = vector2d->getX() + 1.0; - y = vector2d->getY() + 1.0; - vector2d->set_coordinates(x, y); - vector3d->mode = this->vector3d->mode; - vector2d->mode = this->vector2d->mode; - _val_ += 1; - - return sum; - } - - // destructor - ~Physics_World(); -}; -#endif //PHYSICSFORMULA_PHYSICS_WORLD_H - -//============================================================================= -//in-line class Implementation - -/** - *default constructor - */ -inline Physics_World::Physics_World() -{ - atomic = std::make_unique(); - linear_regression = std::make_unique>(); - logistic_regression = std::make_unique>(); - etl = std::make_unique>(); - matrixNd = std::make_unique>(); - vectorNd = std::make_unique>(); - triangle = std::make_unique(); - kinematics = std::make_unique(); - drag = std::make_unique(); - elasticity = std::make_unique(); - friction = std::make_unique(); - uniformCircularMotion = std::make_unique(); - vector2d = std::make_unique(); - vector3d = std::make_unique(); - energy = std::make_unique(); - momentum = std::make_unique(); - torque = std::make_unique(); - statics = std::make_unique(); - rotationalMotion = std::make_unique(); - temperature = std::make_unique(); - heat = std::make_unique(); - thermodynamic = std::make_unique(); - dynamics_and_forces = std::make_unique(); - fluid_statics = std::make_unique(); - fluid_dynamics = std::make_unique(); - waves = std::make_unique(); - hearing = std::make_unique(); - electric_charge = std::make_unique(); - electric_potential = std::make_unique(); - electric_current = std::make_unique(); - circuits =std::make_unique(); - magnetism = std::make_unique(); - emi = std::make_unique(); - emWaves = std::make_unique(); - geometric_optics = std::make_unique(); - wave_optics = std::make_unique(); - vision_optical = std::make_unique(); - relativity = std::make_unique(); - quantum = std::make_unique(); - square = std::make_unique(); - cube = std::make_unique(); - rectangle = std::make_unique(); - rectangular_prism = std::make_unique(); - cylinder = std::make_unique(); - cone = std::make_unique(); - sphere = std::make_unique(); - pyramid = std::make_unique(); - circle = std::make_unique(); - parallelogram = std::make_unique(); - point2d = std::make_unique>(); - vector = std::make_unique >(); - countIncrease(); - //countShow(); -} -/** - *copy constructor - */ -inline Physics_World::Physics_World(const Physics_World& p) -{ - - countIncrease(); -} -/** - *copy assignment operator - */ -inline Physics_World& Physics_World::operator=(const Physics_World& r) -{ - if(this != &r) - { - countIncrease(); - } - return *this; -} - -inline Physics_World::Physics_World(const TYPE t1, const TYPE t2, const TYPE t3) -{ - atomic = std::make_unique(); - linear_regression = std::make_unique>(); - logistic_regression = std::make_unique>(); - etl = std::make_unique>(); - matrixNd = std::make_unique>(); - vectorNd = std::make_unique>(); - triangle = std::make_unique(); - kinematics = std::make_unique(); - drag = std::make_unique(); - elasticity = std::make_unique(); - friction = std::make_unique(); - uniformCircularMotion = std::make_unique(); - vector2d = std::make_unique(); - vector3d = std::make_unique(); - energy = std::make_unique(); - momentum = std::make_unique(); - torque = std::make_unique(); - statics = std::make_unique(); - rotationalMotion = std::make_unique(); - temperature = std::make_unique(); - heat = std::make_unique(); - thermodynamic = std::make_unique(); - dynamics_and_forces = std::make_unique(); - fluid_statics = std::make_unique(); - fluid_dynamics = std::make_unique(); - waves = std::make_unique(); - hearing = std::make_unique(); - electric_charge = std::make_unique(); - electric_potential = std::make_unique(); - electric_current = std::make_unique(); - circuits =std::make_unique(); - magnetism = std::make_unique(); - emi = std::make_unique(); - emWaves = std::make_unique(); - geometric_optics = std::make_unique(); - wave_optics = std::make_unique(); - vision_optical = std::make_unique(); - relativity = std::make_unique(); - quantum = std::make_unique(); - square = std::make_unique(); - cube = std::make_unique(); - rectangle = std::make_unique(); - rectangular_prism = std::make_unique(); - cylinder = std::make_unique(); - cone = std::make_unique(); - sphere = std::make_unique(); - pyramid = std::make_unique(); - circle = std::make_unique(); - parallelogram = std::make_unique(); - point2d = std::make_unique>(); - vector = std::make_unique >(); - this->vector3d->set_coordinates(t1, t2, t3); - - countIncrease(); -} - -inline Physics_World::Physics_World(const TYPE t1, const TYPE t2) -{ - atomic = std::make_unique(); - linear_regression = std::make_unique>(); - logistic_regression = std::make_unique>(); - etl = std::make_unique>(); - matrixNd = std::make_unique>(); - vectorNd = std::make_unique>(); - triangle = std::make_unique(); - kinematics = std::make_unique(); - drag = std::make_unique(); - elasticity = std::make_unique(); - friction = std::make_unique(); - uniformCircularMotion = std::make_unique(); - vector2d = std::make_unique(); - vector3d = std::make_unique(); - energy = std::make_unique(); - momentum = std::make_unique(); - torque = std::make_unique(); - statics = std::make_unique(); - rotationalMotion = std::make_unique(); - temperature = std::make_unique(); - heat = std::make_unique(); - thermodynamic = std::make_unique(); - dynamics_and_forces = std::make_unique(); - fluid_statics = std::make_unique(); - fluid_dynamics = std::make_unique(); - waves = std::make_unique(); - hearing = std::make_unique(); - electric_charge = std::make_unique(); - electric_potential = std::make_unique(); - electric_current = std::make_unique(); - circuits =std::make_unique(); - magnetism = std::make_unique(); - emi = std::make_unique(); - emWaves = std::make_unique(); - geometric_optics = std::make_unique(); - wave_optics = std::make_unique(); - vision_optical = std::make_unique(); - relativity = std::make_unique(); - quantum = std::make_unique(); - square = std::make_unique(); - cube = std::make_unique(); - rectangle = std::make_unique(); - rectangular_prism = std::make_unique(); - cylinder = std::make_unique(); - cone = std::make_unique(); - sphere = std::make_unique(); - pyramid = std::make_unique(); - circle = std::make_unique(); - parallelogram = std::make_unique(); - point2d = std::make_unique>(); - vector = std::make_unique >(); - this->vector2d->set_coordinates(t1, t2); -} - -inline Physics_World::~Physics_World() -{ - countDecrease(); -} - +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_PHYSICS_WORLD_H +#define PHYSICSFORMULA_PHYSICS_WORLD_H +/** + * @class PhysicsWorld + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @date 10/15/2020 + */ + +#define TYPE long double + +#include +#include "Testing.h" +#include "StringHelper.h" +#include "RegexHelper.h" +#include "AtomicPhysics.h" +#include "TemplateBST.h" +#include "Circuits.h" +#include "Cone.h" +#include "Cylinder.h" +#include "Cube.h" +#include "Drag.h" +#include "Forces.h" +#include "Elasticity.h" +#include "ElectroMagneticInduction.h" +#include "ElectroMagneticWaves.h" +#include "FluidStatics.h" +#include "Hearing.h" +#include "Kinematics.h" +#include "LinearAlgebra.h" +#include "LogisticRegression.h" +#include "MathFx.h" +#include "Momentum.h" +#include "Parallelogram.h" +#include "PeriodicElements.h" +#include "Point2D.h" +#include "Pyramid.h" +#include "RandomNumbers.h" +#include "Rectangle.h" +#include "RectangularPrism.h" +#include "RotationalMotion.h" +#include "Sphere.h" +#include "Statics.h" +#include "templateGraph.h" +#include "Thermodynamics.h" +#include "Torque.h" +#include "TransitiveClosure.h" +#include "TriangleSolver.h" +#include "Vector.h" +#include "VisionOpticalInstruments.h" +#include "Square.h" +#include "QuantumPhysics.h" +typedef TriangleSolver TS; +typedef QuantumPhysics QP; +typedef SpecialRelativity SR; +typedef WaveOptics WO; +typedef VisionOpticalInstruments VOI; +typedef UniformCircularMotion UCM; +typedef Thermodynamics TD; +typedef Temperature TEMP; +typedef RotationalMotion RM; +typedef GeometricOptics GO; +typedef FluidStatics FS; +typedef FluidDynamics FD; +typedef ElectromagneticWaves EMW; +typedef ElectroMagneticInduction EMI; +typedef ElectricPotential EP; +typedef ElectricCurrent EC; +typedef ElectricCharge ELCHRG; +typedef Forces DAF; +typedef RandomNumbers RN; +typedef AtomicPhysics AP; + + + + + +static auto physics_objectCount = 0; + + +template +void print_type_properties() +{ + std::cout <<'\n' + << "min=" + << std::numeric_limits::min() << '\n' + << "max=" + << std::numeric_limits::max() << '\n' + << "bits=" + << std::numeric_limits::digits << '\n' + << "decdigits=" + << std::numeric_limits::digits10 << '\n' + << "integral=" + << std::numeric_limits::is_integer << '\n' + << "signed=" + << std::numeric_limits::is_signed << '\n' + << "exact=" + << std::numeric_limits::is_exact << '\n' + << "infinity=" + << std::numeric_limits::has_infinity << '\n'; +} + +//_____________________________________________________________________________ +//global constants, methods and structures +// +// + + +static long double _val_;// = 0.0; + + + +/// +/// Sets the value of the static member _val_ +/// +/// The value to set val too. +/// returns the value of v +static auto setVal = [](const T & v) { + _val_ = v; + return _val_; +}; + +/// +/// Gets the value. +/// +/// +static auto getVal = []() { + return _val_; +}; + +/// +/// Shows the value with a label in front and units in back +/// +/// The label. +/// The units. +static auto show_val = [](const T label = "", const T units = "") { + cout << "\n"< +/// Prints the vector values of passed in vector. +/// +/// The v. +/* +static void printVectorValues(vector& v) +{ + cout << "vector: "; + for (int i = 0; i < v.size(); i++) + { + std::cout << v[i] << ", "; + } + std::cout << std::endl; +}//end printVectorValues +*/ +/// +/// Prints the vector values of a vector +/// +/// The vector to print. +template +static auto printVector(vector& v) +{ + cout << "vector: "; + for (size_t i = 0; i < v.size(); i++) + { + std::cout << v[i] << (i +/// Prints the vector of any type +/// +/// The vector to print. +template +void printVector(const T& t) { + std::copy(t.cbegin(), t.cend(), std::ostream_iterator(std::cout, ", ")); +}//end printVector + +/// +/// Prints out a multidimensional vector values of any type. +/// +/// The vector to print. +template +void printVectorInVector(const T& t) { + std::for_each(t.cbegin(), t.cend(), printVector); +}//end printVectorInVector + +/// +/// Prints an array of any type +/// +/// The array. +template +void static printArray(const T(&array)[size]) +{ + for (size_t i = 0; i < size; i++) + cout << array[i] << " "; + + cout << endl; +}//end printArray + +/// +/// Prints a map of any types out in its entirety. +/// +/// The map to print. +template +void printMap(std::map const &m) +{ + for (auto const& pair: m) { + std::cout << "{" << pair.first << ": " << pair.second << "}\n"; + } +}//end print_map + +/// +/// Searches any type map by found value. only use if you need the values saved.\n +/// WARNING*** printMapValues allows you to pass only a map and a search value in +/// and it instantiates a vector within its scope and then fills it as well as +/// prints out the values to screen.*****\n +/// Use this method when you need to find the +/// values that match and then use them in other calculations within client code. +/// +/// The vector to store the results in. +/// The map of elements to search by values. +/// The value to look for. +/// true if a match was found: else false +template +bool searchMapByValue(std::vector & vec, std::map mapOfElemen, V value) +{ + bool bResult = false; + auto it = mapOfElemen.begin(); + while(it != mapOfElemen.end()) + { + if(it->second == value) + { + bResult = true; + vec.push_back(it->first); + } + it++; + } + return bResult; +}//end searchMapByValue +template +bool searchMapByValue(std::vector & vec, std::multimap mapOfElemen, V value) +{ + bool bResult = false; + auto it = mapOfElemen.begin(); + while(it != mapOfElemen.end()) + { + if(it->second == value) + { + bResult = true; + vec.push_back(it->first); + } + it++; + } + return bResult; +}//end searchMapByValue + +/// +/// Prints the map keys found by search value. +/// +/// The map to search. +/// The value to search for. +template +void printMapByValue(std::map m, const V val) +{ + std::cout << "looking for value: "<< val< results; + bool tests = searchMapByValue(results, m, val); + if(tests) + { + std::cout<<"Keys with value "<< val<< " are:"< +/// Prints the map keys found by search value. +/// +/// The map to search. +/// The value to search for. +template +void printMapByValue(std::multimap m, const V val) +{ + std::cout << "looking for value: "<< val< results; + bool tests = searchMapByValue(results, m, val); + if(tests) + { + std::cout<<"Keys with value "<< val<< " are:"< +/// Prints an array of long doubles with a size of n +/// +/// The array. +/// = sizeof( arr ) / sizeof( *arr ) +void static printArr(const long double arr[], const int n) +{ + cout << "array values: "; + for (int i = 0; i < n; i++) + { + cout << arr[i] << ' '; + } +}//end printArr + + + + +/// +/// Calculates the area of a sphere. +/// +/// The radius. +/// the area of sphere (m^2) +static auto sphereArea = [](const T r) +{ + return 4.0 * _PI_ * (r * r); +}; + + +/// +/// Calculates the volume of a sphere. +/// +/// The radius. +/// the volume of sphere(m^3) +static auto sphereVolume = [](const long double r) +{ + return (4.0 / 3.0) * (_PI_ * (r * r * r)); +}; + + +/// +/// Calculates the circumference of a circle. +/// +/// The radius or diameter, use mode to specify. +/// use 'd' to specify if you use diameter and not +/// radius. Do not add anything here if it is the radius you are using +/// as it is defaulted to radius +/// circumference of circle (m) +static auto circleCircumference = [](const T rd, const char mode = 'r') +{ + if (mode == 'r') + { + return 2.0 * _PI_ * rd; + } + return _PI_ * rd; +}; + +/// +/// Calculates the area of a circle. +/// +/// The radius or diameter, use mode to specify. +/// use 'd' to specify if you use diameter and not +/// radius. Do not add anything here if it is the radius you are using +/// as it is defaulted to radius +/// area of a circle (m^2) +static auto circleArea = [](const T rd, const char mode = 'r') +{ + if (mode == 'r') + { + return _PI_ * (rd * rd); + } + return (_PI_ * (rd * rd)) / 4.0; +}; + +/// +/// Calculates the change in any two values xi and xf. +/// +/// The initial starting value. +/// The final value. +/// the change in a value +static auto delta = [](const T xi, const T xf) +{ + return xf - xi; +}; + + +/// +/// structure filled with conversion methods +/// +static struct Conversions +{ + struct SpecificHeatConverter + { + template + static auto joulesKgC_to_kCalKgC(const T j = _val_) + { + return j * .000238845896627; + } + template + static auto kCalKgC_to_joulesKgC_IT(const T kCal = _val_) + { + return kCal * 4186.8; + } + }heat; + + template + static auto atomicMass_to_kilograms(const T u = _val_) + { + return u * 1.66053904E-27; + } + + template + static auto kiloJoules_to_calories(const T kJ) + { + return (kJ * 1000.0) / 4186.0; + } + template + static auto revolutionsFromRadians(const T radTotal) + { + //cout << "revolutions: " << radTotal / (2.0 * _PI_) << endl; + return radTotal / (2.0 * _PI_); + } + + /** + * @brief Returns the revolutions in radians per second which is the + * angular velocity as well + * @param revMin revolutions per minute + * @returns revolutions in radians per second + */ + template + static auto revolutions_min_to_radians_second(const T revMin) + { + return (revMin * 2.0 * _PI_) / 60; + } + + /** + * @brief Returns the conversion from revolutions per radian second to + * revolutions per minute + * @param radSec is the rotation speed in radians per second + * @returns the revolutions per minute + */ + template + static auto radians_second_to_revolutions_minute(const T radSec) + { + return (radSec * 60.0) / (2.0 * _PI_); + } + + /** + * @brief Returns the ratio of the value to gravity + * @param unit can be whatever you are dividing by gravity acceleration + * @returns the gravity ratio + */ + template + static auto gravity_ratio(const T unit) + { + return unit / _G_; + } + + + /** + * @brief Returns the conversion from meters per second to kilometers + * per hour + * @param mps is meters per second + * @returns kilometers per hour + */ + template + static auto mps_to_kmh(const T mps = _val_) + { + return mps * 3.6; + } + /** + * @brief Returns the conversion from kilometers per hour to meters per + * second + * @param kmh is kilometers per hour + * @returns meters per second + */ + template + static auto kmh_to_mps(const T kmh = _val_) + { + return (kmh*1000.0) / 3600.0; + } + + /// + /// KMSs to KMH. + /// + /// kilometers per second. + /// kilometers per hour + template + static auto kms_to_kmh(const T kms = _val_) + { + return kms * 3600.0; + } + /// + /// KMHs to KMS. + /// + /// kilometers per hour. + /// kilometers per second + template + static auto kmh_to_kms(const T kmh = _val_) + { + return kmh / 3600.0; + } + /** + * @brief Returns the conversion from miles per hour to meters per second + * @param mph is miles per hour + * @returns meters per second + */ + template + static auto mph_to_mps(const T mph = _val_) + { + return mph / 2.237; + } + /** + * @brief Returns the conversion from meters per second to miles per hour + * @param mps is meters per second + * @returns miles per hour + */ + template + static auto mps_to_mph(const T mps = _val_) + { + return mps * 2.237; + } + /** + * @brief Returns the conversion from milliseconds to seconds + * @param ms to be converted to seconds + * @returns seconds from milliseconds + */ + template + static auto millisecond_to_seconds(const T ms = _val_) + { + return ms / 1000; + } + template + static auto minutes_to_seconds(const T min = _val_) + { + return min * 60; + } + template + static auto hours_to_seconds(const T hours = _val_) + { + return hours * 3600; + } + /** + * @brief Returns the conversion from days to seconds for use in calculation + * @param days can be expressed as a decimal, four and a half days would + * be 4.5 + * @returns total seconds converted from days + */ + template + static auto days_to_seconds(const T days = _val_) + { + return days * 86400.0; + } + /** + * @brief Returns the conversion from seconds to days + * @param seconds to be converted + * @returns days + */ + template + static auto seconds_to_days(const T seconds = _val_) + { + return seconds / 86400.0; + } + /** + * @brief Returns the conversion from miles to meters + * @param miles to be converted + * @returns meters from miles + */ + template + static auto miles_to_meters(const T miles = _val_) + { + return miles * 1609.0; + } + /** + * @brief Returns the conversion from feet to meters + * @param feet to be converted + * @returns meters + */ + template + static auto feet_to_meters(const T feet = _val_) + { + return feet / 3.281; + } + /** + * @brief Returns the conversion from inches to meters + * @param inches to be converted + * @returns meters + */ + template + static auto inches_to_meters(const T inches = _val_) + { + return inches / 39.37; + } + /** + * @brief Returns the conversion from meters to inches + * @param meters is the total meters + * @returns inches + */ + template + static auto meters_to_inches(const T meters = _val_) + { + return meters * 39.37; + } + /** + * @brief Returns the conversion from centimeters to meters + * @param cm centimeters + * @returns meters + */ + template + static auto centimeters_to_meters(const T cm = _val_) + { + return cm / 100; + } + template + static auto meters_to_centimeters(const T m = _val_) + { + return m * 100; + } + template + static auto kilometers_to_meters(const T km = _val_) + { + return km * 1000; + } + template + static auto millimeters_to_meters(const T mm = _val_) + { + return mm / 1000; + } + template + static auto micrometers_to_meters(const T Mm = _val_) + { + return Mm / pow(1, -6); + } + template + static auto nanometers_to_meters(const T nm = _val_) + { + return nm / pow(1, -9); + } + template + static auto kilogram_to_pound(const T kg = _val_) + { + return kg * 2.20462; + } + template + static auto pound_to_kilogram(const T lbs = _val_) + { + return lbs / 2.205; + } + template + static auto milligram_to_kilogram(const T mg = _val_) + { + return mg / pow(1, -6); + } + template + static auto gram_to_kilogram(const T g = _val_) + { + return g / 1000.0; + } + template + static auto ounce_to_kilogram(const T ounce = _val_) + { + return ounce / 35.274; + } + template + static auto watts_to_kilowatts(const T watt = _val_) + { + return watt / 1000; + } + template + static auto kWh_to_joules(const T kWh = _val_) + { + return kWh * (3.6*pow(10, 6)); + } + template + static auto joules_to_kWh(const T j = _val_) + { + return j / (3.6 * pow(10, 6)); + } + template + static auto joules_to_eV(const T j = _val_) + { + return j / _PROTON_CHARGE_; + } + template + static auto newtonMeters_to_ftPounds(const T Nm = _val_) + { + return Nm / .73756; + } + template + static auto radians_to_revolutions(const T rad = _val_) + { + return rad / (2 * _PI_); + } + template + static auto revolutions_to_radians(const T rev = _val_) + { + return rev * 2 * _PI_; + } + template + static auto atm_to_pascals(const T atm = _val_) + { + return atm * 101325.0; + } + + template + static auto kcalPerDay_to_watts(const T d = _val_) { + return d * .0484259259; + } + + template + static auto watts_to_hp(T d = _val_) { + return d * .001341022089; + } + + template + static auto hp_to_watts(T d = _val_) { + return d * 745.7; + } + + template + static auto lbs_kg(T lbs = _val_) { + return lbs * .45359237; + } +}converter; + +/// +/// structure filled with common densities +/// +static struct Densities +{ + const long double aluminum_S = 2.7e3; // 2700 kg/m^3 + const long double brass_S = 8.44e3; // 8440 kg/m^3 + const long double copperAverage_S = 8.84e3; // 8800 kg/m^3 + const long double gold_S = 19.32e3; // 19320 kg/m^3 + const long double ironOrSteele_S = 7.8e3; // 7800 kg/m^3 + const long double lead_S = 11.3e3; // 11300 kg/m^3 + const long double polystyrene_S = .10e3; // 100 kg/m^3 + const long double tungsten = 19.30e3; // 19300 kg/m^3 + const long double uranium = 18.7e3; // 18700 kg/m^3 + const long double concrete_light_S = 2.30e3; // 2300 kg/m^3 + const long double concrete_med_S = 2.7e3; // 2700 kg/m^3 + const long double concrete_heavyDuty_S = 3.0e3; // 3000 kg/m^3 + const long double cork_S = .24e3; // 240 kg/m^3 + const long double glassAverage_S = 2.6e3; // 2600 kg/m^3 + const long double granite = 2.7e3; // 2700 kg/m^3 + const long double earthsCrust_S = 3.3e3; // 3300 kg/m^3 + const long double woodSoft_S = .3e3; // 300 kg/m^3 + const long double woodMed_S = .6e3 ; // 600 kg/m^3 + const long double woodHard_S = .9e3; // 900 kg/m^3 + const long double ice_0deg_S = .917e3; // 917 kg/m^3 + const long double boneSoft_S = 1.7e3; // 1700 kg/m^3 + const long double boneHard_S = 2.0e3; // 2000 kg/m^3 + const long double water_L = 1.0e3; // 1000 kg/m^3 + const long double blood_L = 1.05e3; // 1050 kg/m^3 + const long double seaWater_L = 1.025e3; // 1025 kg/m^3 + const long double mercury_L = 13.6e3; // 13600 kg/m^3 + const long double ethylAlcohol_L = .79e3; // 790 kg/m^3 + const long double petrol_L = .68e3; // 680 kg/m^3 + const long double glycerin_L = 1.26e3; // 1260 kg/m^3 + const long double oliveOil_L = .92e3; // 920 kg/m^3 + const long double air_G = 1.293e3; // 1.29 kg/m^3 + const long double carbon_dioxide_G = 1.98e3; // 1.98 kg/m^3 + const long double carbon_monoxide_G3e = 1.25e3; // 1.25 kg/m^3 + const long double hydrogen_G = 0.090e3; // 0.090 kg/m^3 + const long double helium_G = 0.18e3; // 0.18 kg/m^3 + const long double methane_G = 0.72e3; // 0.72 kg/m^3 + const long double nitrogen_G = 1.25e3; // 1.25 kg/m^3 + const long double nitrous_oxide_G = 1.98e3; // 1.98 kg/m^3 + const long double oxygen_G = 1.43e3; // 1.43 kg/m^3 + const long double steam_G = 0.60e3; // 0.60 kg/m^3 + const long double interstellar_space_G = 10.0e-20; // 10.0 x 10^-20 kg/m^3 + const long double black_hole = 10e19; // 10 x 10^19 kg/m^3 +}p; + + + +/// +/// the Physics world class that is the driver class of many smaller more +/// specific classes. This class instantiates all them classes for use in the +/// testFactory.cpp driver file. +/// +class Physics_World +{ +private: + static void countIncrease() { physics_objectCount += 1; } + static void countDecrease() { physics_objectCount -= 1; } + +public: + + /** + * @brief Template method to print out an array that is passed to it + * @param array of values + */ + template + void static print_array(const T(&array)[size]) + { + for (size_t i = 0; i < size; i++) + cout << array[i] << " "; + + cout << endl; + } + + unique_ptr atomic; + unique_ptr> linear_regression; + unique_ptr> logistic_regression; + unique_ptr> etl; + unique_ptr> matrixNd; + unique_ptr> vectorNd; + unique_ptr triangle; + unique_ptr kinematics; + unique_ptr friction; + unique_ptr drag; + unique_ptr elasticity; + unique_ptr uniformCircularMotion; + unique_ptr vector2d; + unique_ptr vector3d; + unique_ptr energy; + unique_ptr momentum; + unique_ptr torque; + unique_ptr statics; + unique_ptr rotationalMotion; + unique_ptr temperature; + unique_ptr heat; + unique_ptr thermodynamic; + unique_ptr dynamics_and_forces; + unique_ptr fluid_statics; + unique_ptr fluid_dynamics; + unique_ptr waves; + unique_ptr hearing; + unique_ptr electric_charge; + unique_ptr electric_potential; + unique_ptr electric_current; + unique_ptr circuits; + unique_ptr magnetism; + unique_ptr emi; + unique_ptr emWaves; + unique_ptr geometric_optics; + unique_ptr wave_optics; + unique_ptr vision_optical; + unique_ptr relativity; + unique_ptr quantum; + unique_ptr square; + unique_ptr cube; + unique_ptr rectangle; + unique_ptr rectangular_prism; + unique_ptr cylinder; + unique_ptr cone; + unique_ptr sphere; + unique_ptr pyramid; + unique_ptr circle; + unique_ptr parallelogram; + unique_ptr> point2d; + unique_ptr> vector; + + + Physics_World(); + Physics_World(TYPE t1, TYPE t2, TYPE t3); + Physics_World(TYPE t1, TYPE t2); + Physics_World(const Physics_World&); //copy constructor + Physics_World& operator=(const Physics_World&); //copy assignment operator + Physics_World(Physics_World&& o) noexcept : + atomic(std::move(o.atomic)), + linear_regression(std::move(o.linear_regression)), + logistic_regression(std::move(o.logistic_regression)), + etl(std::move(o.etl)), + matrixNd(std::move(o.matrixNd)), + vectorNd(std::move(o.vectorNd)), + triangle(std::move(o.triangle)), + kinematics(std::move(o.kinematics)), + friction(std::move(o.friction)), + drag(std::move(o.drag)), + elasticity(std::move(o.elasticity)), + uniformCircularMotion(std::move(o.uniformCircularMotion)), + vector2d(std::move(o.vector2d)), + vector3d(std::move(o.vector3d)), + energy(std::move(o.energy)), + momentum(std::move(o.momentum)), + torque(std::move(o.torque)), + statics(std::move(o.statics)), + rotationalMotion(std::move(o.rotationalMotion)), + temperature(std::move(o.temperature)), + heat(std::move(o.heat)), + thermodynamic(std::move(o.thermodynamic)), + dynamics_and_forces(std::move(o.dynamics_and_forces)), + fluid_statics(std::move(o.fluid_statics)), + fluid_dynamics(std::move(o.fluid_dynamics)), + waves(std::move(o.waves)), + hearing(std::move(o.hearing)), + electric_charge(std::move(o.electric_charge)), + electric_potential(std::move(o.electric_potential)), + electric_current(std::move(o.electric_current)), + circuits(std::move(o.circuits)), + magnetism(std::move(o.magnetism)), + emi(std::move(o.emi)), + emWaves(std::move(o.emWaves)), + geometric_optics(std::move(o.geometric_optics)), + wave_optics(std::move(o.wave_optics)), + vision_optical(std::move(o.vision_optical)), + relativity(std::move(o.relativity)), + quantum(std::move(o.quantum)), + square(std::move(o.square)), + cube(std::move(o.cube)), + rectangle(std::move(o.rectangle)), + rectangular_prism(std::move(o.rectangular_prism)), + cylinder(std::move(o.cylinder)), + cone(std::move(o.cone)), + sphere(std::move(o.sphere)), + pyramid(std::move(o.pyramid)), + circle(std::move(o.circle)), + parallelogram(std::move(o.parallelogram)), + point2d(std::move(o.point2d)), + vector(std::move(o.vector)){} // move constructor + + /**======================================================================== + * overloaded operators + */ + Physics_World operator+(const Physics_World& r)const + { + long double x, y, z; + x = vector3d->getX() + r.vector3d->getX(); + y = vector3d->getY() + r.vector3d->getY(); + z = vector3d->return_z() + r.vector3d->return_z(); + std::unique_ptr sum = std::make_unique(); + sum->vector3d->set_coordinates(x, y, z); + x = vector2d->getX() + r.vector2d->getX(); + y = vector2d->getY() + r.vector2d->getY(); + sum->vector2d->set_coordinates(x, y); + sum->vector3d->mode = r.vector3d->mode; + sum->vector2d->mode = this->vector2d->mode; + return *sum; + } + Physics_World operator+(long double n)const + { + long double x, y, z; + x = vector3d->getX() + n; + y = vector3d->getY() + n; + z = vector3d->return_z() + n; + std::unique_ptr sum = std::make_unique(); + sum->vector3d->set_coordinates(x, y, z); + x = vector2d->getX() + n; + y = vector2d->getY() + n; + sum->vector2d->set_coordinates(x, y); + sum->vector3d->mode = this->vector3d->mode; + sum->vector2d->mode = this->vector2d->mode; + _val_ = +n; + return *sum; + } + + Physics_World& operator+=(const Physics_World& r) const + { + long double x, y, z; + x = vector3d->getX() + r.vector3d->getX(); + y = vector3d->getY() + r.vector3d->getY(); + z = vector3d->return_z() + r.vector3d->return_z(); + std::unique_ptr sum = std::make_unique(); + sum->vector3d->set_coordinates(x, y, z); + x = vector2d->getX() + r.vector2d->getX(); + y = vector2d->getY() + r.vector2d->getY(); + sum->vector2d->set_coordinates(x, y); + sum->vector3d->mode = r.vector3d->mode; + sum->vector2d->mode = this->vector2d->mode; + return *sum; + + } + Physics_World operator+()const + { + long double x, y, z; + x = vector3d->getX() + 1.0; + y = vector3d->getY() + 1.0; + z = vector3d->return_z() + 1.0; + Physics_World sum; + sum.vector3d->set_coordinates(x, y, z); + x = vector2d->getX() + 1.0; + y = vector2d->getY() + 1.0; + vector2d->set_coordinates(x, y); + vector3d->mode = this->vector3d->mode; + vector2d->mode = this->vector2d->mode; + _val_ += 1; + + return sum; + } + + // destructor + ~Physics_World(); +}; +#endif //PHYSICSFORMULA_PHYSICS_WORLD_H + +//============================================================================= +//in-line class Implementation + +/** + *default constructor + */ +inline Physics_World::Physics_World() +{ + atomic = std::make_unique(); + linear_regression = std::make_unique>(); + logistic_regression = std::make_unique>(); + etl = std::make_unique>(); + matrixNd = std::make_unique>(); + vectorNd = std::make_unique>(); + triangle = std::make_unique(); + kinematics = std::make_unique(); + drag = std::make_unique(); + elasticity = std::make_unique(); + friction = std::make_unique(); + uniformCircularMotion = std::make_unique(); + vector2d = std::make_unique(); + vector3d = std::make_unique(); + energy = std::make_unique(); + momentum = std::make_unique(); + torque = std::make_unique(); + statics = std::make_unique(); + rotationalMotion = std::make_unique(); + temperature = std::make_unique(); + heat = std::make_unique(); + thermodynamic = std::make_unique(); + dynamics_and_forces = std::make_unique(); + fluid_statics = std::make_unique(); + fluid_dynamics = std::make_unique(); + waves = std::make_unique(); + hearing = std::make_unique(); + electric_charge = std::make_unique(); + electric_potential = std::make_unique(); + electric_current = std::make_unique(); + circuits =std::make_unique(); + magnetism = std::make_unique(); + emi = std::make_unique(); + emWaves = std::make_unique(); + geometric_optics = std::make_unique(); + wave_optics = std::make_unique(); + vision_optical = std::make_unique(); + relativity = std::make_unique(); + quantum = std::make_unique(); + square = std::make_unique(); + cube = std::make_unique(); + rectangle = std::make_unique(); + rectangular_prism = std::make_unique(); + cylinder = std::make_unique(); + cone = std::make_unique(); + sphere = std::make_unique(); + pyramid = std::make_unique(); + circle = std::make_unique(); + parallelogram = std::make_unique(); + point2d = std::make_unique>(); + vector = std::make_unique >(); + countIncrease(); + //countShow(); +} +/** + *copy constructor + */ +inline Physics_World::Physics_World(const Physics_World& p) +{ + + countIncrease(); +} +/** + *copy assignment operator + */ +inline Physics_World& Physics_World::operator=(const Physics_World& r) +{ + if(this != &r) + { + countIncrease(); + } + return *this; +} + +inline Physics_World::Physics_World(const TYPE t1, const TYPE t2, const TYPE t3) +{ + atomic = std::make_unique(); + linear_regression = std::make_unique>(); + logistic_regression = std::make_unique>(); + etl = std::make_unique>(); + matrixNd = std::make_unique>(); + vectorNd = std::make_unique>(); + triangle = std::make_unique(); + kinematics = std::make_unique(); + drag = std::make_unique(); + elasticity = std::make_unique(); + friction = std::make_unique(); + uniformCircularMotion = std::make_unique(); + vector2d = std::make_unique(); + vector3d = std::make_unique(); + energy = std::make_unique(); + momentum = std::make_unique(); + torque = std::make_unique(); + statics = std::make_unique(); + rotationalMotion = std::make_unique(); + temperature = std::make_unique(); + heat = std::make_unique(); + thermodynamic = std::make_unique(); + dynamics_and_forces = std::make_unique(); + fluid_statics = std::make_unique(); + fluid_dynamics = std::make_unique(); + waves = std::make_unique(); + hearing = std::make_unique(); + electric_charge = std::make_unique(); + electric_potential = std::make_unique(); + electric_current = std::make_unique(); + circuits =std::make_unique(); + magnetism = std::make_unique(); + emi = std::make_unique(); + emWaves = std::make_unique(); + geometric_optics = std::make_unique(); + wave_optics = std::make_unique(); + vision_optical = std::make_unique(); + relativity = std::make_unique(); + quantum = std::make_unique(); + square = std::make_unique(); + cube = std::make_unique(); + rectangle = std::make_unique(); + rectangular_prism = std::make_unique(); + cylinder = std::make_unique(); + cone = std::make_unique(); + sphere = std::make_unique(); + pyramid = std::make_unique(); + circle = std::make_unique(); + parallelogram = std::make_unique(); + point2d = std::make_unique>(); + vector = std::make_unique >(); + this->vector3d->set_coordinates(t1, t2, t3); + + countIncrease(); +} + +inline Physics_World::Physics_World(const TYPE t1, const TYPE t2) +{ + atomic = std::make_unique(); + linear_regression = std::make_unique>(); + logistic_regression = std::make_unique>(); + etl = std::make_unique>(); + matrixNd = std::make_unique>(); + vectorNd = std::make_unique>(); + triangle = std::make_unique(); + kinematics = std::make_unique(); + drag = std::make_unique(); + elasticity = std::make_unique(); + friction = std::make_unique(); + uniformCircularMotion = std::make_unique(); + vector2d = std::make_unique(); + vector3d = std::make_unique(); + energy = std::make_unique(); + momentum = std::make_unique(); + torque = std::make_unique(); + statics = std::make_unique(); + rotationalMotion = std::make_unique(); + temperature = std::make_unique(); + heat = std::make_unique(); + thermodynamic = std::make_unique(); + dynamics_and_forces = std::make_unique(); + fluid_statics = std::make_unique(); + fluid_dynamics = std::make_unique(); + waves = std::make_unique(); + hearing = std::make_unique(); + electric_charge = std::make_unique(); + electric_potential = std::make_unique(); + electric_current = std::make_unique(); + circuits =std::make_unique(); + magnetism = std::make_unique(); + emi = std::make_unique(); + emWaves = std::make_unique(); + geometric_optics = std::make_unique(); + wave_optics = std::make_unique(); + vision_optical = std::make_unique(); + relativity = std::make_unique(); + quantum = std::make_unique(); + square = std::make_unique(); + cube = std::make_unique(); + rectangle = std::make_unique(); + rectangular_prism = std::make_unique(); + cylinder = std::make_unique(); + cone = std::make_unique(); + sphere = std::make_unique(); + pyramid = std::make_unique(); + circle = std::make_unique(); + parallelogram = std::make_unique(); + point2d = std::make_unique>(); + vector = std::make_unique >(); + this->vector2d->set_coordinates(t1, t2); +} + +inline Physics_World::~Physics_World() +{ + countDecrease(); +} + diff --git a/Plane.h b/Plane.h index 8af41df..58fca96 100644 --- a/Plane.h +++ b/Plane.h @@ -1,90 +1,90 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_PLANE_H -#define PHYSICSFORMULA_PLANE_H -#include "Vector.h" -#include "Point.h" -#include -using namespace std; -namespace rez { - - template - class Plane { - // Based on the normal-point form ( n . X = d ) definition of a plane -// Vector3f normal; -// float d = 0; - public: - Vector3f normal; - float d = 0; - - Plane() {} - - Plane(Vector3f& _normal) :normal(_normal) { - normal.normalize(); - } - - // Make sure to calculate the _constant using normalized vector. - Plane(Vector3f& _normal, float _constant) : normal(_normal), d(_constant) { - normal.normalize(); - } - - Plane(Vector3f& _normal, Point3d& _point) - { - normal = _normal; - d = dotProduct(normal, _point); - } - - Plane(Point3d& _p1, Point3d& _p2, Point3d& _p3) - { - Vector3f v21 = _p2 - _p1; - Vector3f v31 = _p3 - _p1; - - normal = crossProduct3d(v21, v31); - normal.normalize(); - - d = dotProduct(normal, _p1); - } - - //Eqality check - bool operator==(const Plane& _other) - { - if (normal == _other.normal && isEqualD(d, _other.d)) - { - return true; - } - return false; - } - - //Not equal check operator - bool operator!=(const Plane& _other) - { - return !(*this == _other); - } - - Vector getNormal() const - { - return normal; - } - - float getD() const - { - return d; - } - - template - friend ostream& operator<<(ostream& os, const Plane& rhs); - }; - - typedef Plane Planef; - - template - ostream& operator<<(ostream& os, const Plane& rhs) - { - os << "the normal vector is: "; - os << "<" << rhs.normal[0] << ", " << rhs.normal[1] << ", " << rhs.normal[2] << ">" << std::endl; - return os; - } -} -#endif //PHYSICSFORMULA_PLANE_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_PLANE_H +#define PHYSICSFORMULA_PLANE_H +#include "Vector.h" +#include "Point.h" +#include +using namespace std; +namespace rez { + + template + class Plane { + // Based on the normal-point form ( n . X = d ) definition of a plane +// Vector3f normal; +// float d = 0; + public: + Vector3f normal; + float d = 0; + + Plane() {} + + Plane(Vector3f& _normal) :normal(_normal) { + normal.normalize(); + } + + // Make sure to calculate the _constant using normalized vector. + Plane(Vector3f& _normal, float _constant) : normal(_normal), d(_constant) { + normal.normalize(); + } + + Plane(Vector3f& _normal, Point3d& _point) + { + normal = _normal; + d = dotProduct(normal, _point); + } + + Plane(Point3d& _p1, Point3d& _p2, Point3d& _p3) + { + Vector3f v21 = _p2 - _p1; + Vector3f v31 = _p3 - _p1; + + normal = crossProduct3d(v21, v31); + normal.normalize(); + + d = dotProduct(normal, _p1); + } + + //Eqality check + bool operator==(const Plane& _other) + { + if (normal == _other.normal && isEqualD(d, _other.d)) + { + return true; + } + return false; + } + + //Not equal check operator + bool operator!=(const Plane& _other) + { + return !(*this == _other); + } + + Vector getNormal() const + { + return normal; + } + + float getD() const + { + return d; + } + + template + friend ostream& operator<<(ostream& os, const Plane& rhs); + }; + + typedef Plane Planef; + + template + ostream& operator<<(ostream& os, const Plane& rhs) + { + os << "the normal vector is: "; + os << "<" << rhs.normal[0] << ", " << rhs.normal[1] << ", " << rhs.normal[2] << ">" << std::endl; + return os; + } +} +#endif //PHYSICSFORMULA_PLANE_H diff --git a/Point.cpp b/Point.cpp index c60859c..608546d 100644 --- a/Point.cpp +++ b/Point.cpp @@ -1,49 +1,49 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#include "Point.h" - -bool rez::sort2DLRTB(const Point2d& a, const Point2d& b) -{ - if ((a[X] < b[X]) - || (a[X] == b[X]) && (a[Y] < b[Y])) - { - return true; - } - return false; -} - -bool rez::sort3DTBLR(const Point3d& a, const Point3d& b) -{ - if ((a[Y] > b[Y]) - || (a[Y] == b[Y]) && (a[X] < b[X])) - { - return true; - } - return false; -} - -bool rez::sort2DTBLR(const Point2d& a, const Point2d& b) -{ - if ((a[Y] > b[Y]) - || (a[Y] == b[Y]) && (a[X] < b[X])) - { - return true; - } - return false; -} - -bool rez::sort2DbyX(const Point2d& a, const Point2d& b) -{ - if (a[X] < b[X]) - return true; - return false; -} - -bool rez::sort2DbyY(const Point2d& a, const Point2d& b) -{ - if (a[Y] < b[Y]) - return true; - return false; +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#include "Point.h" + +bool rez::sort2DLRTB(const Point2d& a, const Point2d& b) +{ + if ((a[X] < b[X]) + || (a[X] == b[X]) && (a[Y] < b[Y])) + { + return true; + } + return false; +} + +bool rez::sort3DTBLR(const Point3d& a, const Point3d& b) +{ + if ((a[Y] > b[Y]) + || (a[Y] == b[Y]) && (a[X] < b[X])) + { + return true; + } + return false; +} + +bool rez::sort2DTBLR(const Point2d& a, const Point2d& b) +{ + if ((a[Y] > b[Y]) + || (a[Y] == b[Y]) && (a[X] < b[X])) + { + return true; + } + return false; +} + +bool rez::sort2DbyX(const Point2d& a, const Point2d& b) +{ + if (a[X] < b[X]) + return true; + return false; +} + +bool rez::sort2DbyY(const Point2d& a, const Point2d& b) +{ + if (a[Y] < b[Y]) + return true; + return false; } \ No newline at end of file diff --git a/Point.h b/Point.h index 4fc473b..9521127 100644 --- a/Point.h +++ b/Point.h @@ -1,28 +1,28 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_POINT_H -#define PHYSICSFORMULA_POINT_H -#include "Vector.h" -#include -namespace rez -{ - typedef Vector2f Point2d; - typedef Vector3f Point3d; - - static const Point2d DEFAULT_POINT_2D(FLT_MAX, FLT_MAX); - static const Point3d DEFAULT_POINT_3D(FLT_MAX, FLT_MAX, FLT_MAX); - - bool sort2DLRTB(const Point2d& a, const Point2d& b); - - bool sort3DTBLR(const Point3d& a, const Point3d& b); - - bool sort2DTBLR(const Point2d& a, const Point2d& b); - - bool sort2DbyX(const Point2d& a, const Point2d& b); - - bool sort2DbyY(const Point2d& a, const Point2d& b); - -} -#endif //PHYSICSFORMULA_POINT_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_POINT_H +#define PHYSICSFORMULA_POINT_H +#include "Vector.h" +#include +namespace rez +{ + typedef Vector2f Point2d; + typedef Vector3f Point3d; + + static const Point2d DEFAULT_POINT_2D(FLT_MAX, FLT_MAX); + static const Point3d DEFAULT_POINT_3D(FLT_MAX, FLT_MAX, FLT_MAX); + + bool sort2DLRTB(const Point2d& a, const Point2d& b); + + bool sort3DTBLR(const Point3d& a, const Point3d& b); + + bool sort2DTBLR(const Point2d& a, const Point2d& b); + + bool sort2DbyX(const Point2d& a, const Point2d& b); + + bool sort2DbyY(const Point2d& a, const Point2d& b); + +} +#endif //PHYSICSFORMULA_POINT_H diff --git a/Point2D.h b/Point2D.h index 5da8d45..8ccdff5 100644 --- a/Point2D.h +++ b/Point2D.h @@ -1,328 +1,328 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_POINT2D_H -#define PHYSICSFORMULA_POINT2D_H -/** - * @class Point2D - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @dateBuilt 11/22/21 - * @lastEdit 11/22/21 - */ - -#include "Vector2D.h" -#include - -static int pointObjectCount = 0; - -template -class Point2D -{ - Vector2D points; - static auto countIncrease() { pointObjectCount += 1; } - static auto countDecrease() { pointObjectCount -= 1; } -public: - /// - /// Initializes a new instance of the class. - /// - Point2D() :points(0,0) - { countIncrease(); } - - /// - /// Initializes a new instance of the class. - /// - /// The x value. - /// The y value. - Point2D(NumericType x_val, NumericType y_val) - { - if (x_val == NAN || x_val == INFINITY || y_val == NAN || y_val == INFINITY) - { - throw std::invalid_argument("Coordinates must be finite"); - } - points.set_x(x_val); - points.set_y(y_val); - countIncrease(); - } - - - /// - /// Initializes a new instance of the class. - /// - /// The p. - Point2D(const Point2D& p) - { - points.set_x(p.getX()); - points.set_y(p.getY()); - countIncrease(); - } - - - /// - /// Initializes a new instance of the class. - /// - /// The p. - Point2D(Point2D&& p) noexcept - { - points.set_x(p.getX()); - points.set_y(p.getY()); - countIncrease(); - } - - - /// - /// Operator=s the specified p. - /// - /// The p. - /// - Point2D& operator=(Point2D&& p) noexcept - { - if (this != &p) - { - points.set_x(p.getX()); - points.set_y(p.getY()); - countIncrease(); - } - return *this; - } - - /// - /// Operator=s the specified other. - /// - /// The other. - /// - Point2D& operator=(Point2D other) - { - points.set_x(other.getX()); - points.set_y(other.getY()); - return *this; - } - - /// - /// Finalizes an instance of the class. - /// - ~Point2D() = default; - - static void show_objectCount() - { - std::cout << "\n template object count: " - << pointObjectCount << std::endl; - } - - /// - /// Gets the Point2D object count. - /// - /// number of Point2D objects instantiated - static int get_objectCount() { return pointObjectCount; } - - /// - /// Sets the x. - /// - /// The x variable. - /// void - auto setX(NumericType xVar) { points.set_x(xVar); } - - /// - /// Sets the y. - /// - /// The y variable. - /// void - auto setY(NumericType yVar) { points.set_y(yVar); } - - /// - /// returns the x instance. - /// - /// the x-coordinate - [[nodiscard]] auto getX() const { return points.getX(); } - - /// - /// returns the y instance. - /// - /// the y-coordinate - [[nodiscard]] auto getY() const { return points.getY(); } - - /// - /// the polar radius of this point. - /// - /// the polar radius of this point in polar coordinates: sqrt(x*x + y*y) - auto r() { return points.square(); } - - /// - /// the angle of this point in polar coordinates. - /// - /// the angle (in radians) of this point in polar coordinates (between –π and π) - auto theta() { return atan2(points.getY(), points.getX()); } - - /// - /// the angle between this point and that point. - /// - /// The that. - /// the angle in radians (between –π and π) between this point and that point (0 if equal) - auto angleTo(Point2D that); - - /// - /// twice the signed area of the triangle a-b-c. - /// - /// a first point. - /// b second point - /// c third point - /// twice the signed area of the triangle a-b-c - static auto area2(Point2Da, Point2D b, Point2D c); - - /// - /// Returns true if a→b→c is a counterclockwise turn. - /// - /// a first point - /// b second point - /// c third point - /// { -1, 0, +1 } if a→b→c is a { clockwise, collinear; counterclockwise } turn. - static int ccw(Point2D a, Point2D b, Point2D c); - - /// - /// the Euclidean distance between this point and that point. - /// - /// that the other point - /// the Euclidean distance between this point and that point - auto distanceTo(Point2D that); - - /// - /// the square of the Euclidean distance between this point and that point. - /// - /// that the other point - /// the square of the Euclidean distance between this point and that point - auto distanceSquaredTo(Point2D that); - - /// - /// Compares two points by x-coordinate - /// - /// The other. - /// - auto compareByX(Point2D other); - - /// - /// Compares two points by y-coordinate. - /// - /// The other. - /// - auto compareByY(Point2D other); - - /// - /// Compares two points by polar radius. - /// - /// The other. - /// - auto compareByR(Point2D other); - - /// - /// To the string. - /// - /// - auto display() { std::cout << "(" << this->getX() << ", " << this->getY() << ")"; } - - template - friend ostream& operator<<(ostream& os, const Point2D& p); - - template - friend istream& operator>>(istream& is, Point2D p); - -}; -#endif //PHYSICSFORMULA_POINT2D_H - -template -inline auto Point2D::angleTo(Point2D that) -{ - auto dx = that.x_ - this->x_; - auto dy = that.y_ - this->y_; - return atan2(dy, dx); -} - - - -template -inline auto Point2D::area2(Point2D a, Point2D b, Point2D c) -{ - return (b.points.getX() - a.points.getX()) * - (c.points.getY() - a.points.getY()) - - (b.points.getY() - a.points.getY()) * - (c.points.getX() - a.points.getX()); -} -template -inline int Point2D::ccw(Point2D a, Point2D b, Point2D c) -{ - double area2 = area2(a, b, c); - if (area2 < 0) - return -1; - else if (area2 > 0) - return +1; - else - return 0; -} -template -inline auto Point2D::distanceTo(Point2D that) -{ - double dx = this->points.getX() - that.points.getX(); - double dy = this->points.getY() - that.points.getY(); - return sqrt(dx * dx + dy * dy); -} - -template -inline auto Point2D::distanceSquaredTo(Point2D that) -{ - auto dx = this->points.getX() - that.points.getX(); - auto dy = this->points.getY() - that.points.getY(); - return dx * dx + dy * dy; -} - - - - -template -inline auto Point2D::compareByX(Point2D other) -{ - if (this->points.getX() > other.points.getX()) - return 1; - else if (this->x_ < other->x_) - return -1; - else - return 0; -} - -template -inline auto Point2D::compareByY(Point2D other) -{ - if (this->points.getY() > other.points.getY()) - return 1; - else if (this->y_ < other->y_) - return -1; - else - return 0; -} - -template -inline auto Point2D::compareByR(Point2D other) -{ - const double delta = this->r() - other.r(); - if (delta < 0) - return -1; - else if (delta > 0) - return 1; - else - return 0; -} - -template -inline ostream& operator<<(ostream& os, const Point2D& p) -{ - os << "(" << p.x_ << ", " << p.y_ << ")" << std::endl; - return os; -} - -template -inline istream& operator>>(istream& is, Point2D p) -{ - std::cout << "\nEnter the x and y values of this point seperated by a space\n";; - is >> p.x_ >> p.y_; - return is; -} - +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_POINT2D_H +#define PHYSICSFORMULA_POINT2D_H +/** + * @class Point2D + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @dateBuilt 11/22/21 + * @lastEdit 11/22/21 + */ + +#include "Vector2D.h" +#include + +static int pointObjectCount = 0; + +template +class Point2D +{ + Vector2D points; + static auto countIncrease() { pointObjectCount += 1; } + static auto countDecrease() { pointObjectCount -= 1; } +public: + /// + /// Initializes a new instance of the class. + /// + Point2D() :points(0,0) + { countIncrease(); } + + /// + /// Initializes a new instance of the class. + /// + /// The x value. + /// The y value. + Point2D(NumericType x_val, NumericType y_val) + { + if (x_val == NAN || x_val == INFINITY || y_val == NAN || y_val == INFINITY) + { + throw std::invalid_argument("Coordinates must be finite"); + } + points.set_x(x_val); + points.set_y(y_val); + countIncrease(); + } + + + /// + /// Initializes a new instance of the class. + /// + /// The p. + Point2D(const Point2D& p) + { + points.set_x(p.getX()); + points.set_y(p.getY()); + countIncrease(); + } + + + /// + /// Initializes a new instance of the class. + /// + /// The p. + Point2D(Point2D&& p) noexcept + { + points.set_x(p.getX()); + points.set_y(p.getY()); + countIncrease(); + } + + + /// + /// Operator=s the specified p. + /// + /// The p. + /// + Point2D& operator=(Point2D&& p) noexcept + { + if (this != &p) + { + points.set_x(p.getX()); + points.set_y(p.getY()); + countIncrease(); + } + return *this; + } + + /// + /// Operator=s the specified other. + /// + /// The other. + /// + Point2D& operator=(Point2D other) + { + points.set_x(other.getX()); + points.set_y(other.getY()); + return *this; + } + + /// + /// Finalizes an instance of the class. + /// + ~Point2D() = default; + + static void show_objectCount() + { + std::cout << "\n template object count: " + << pointObjectCount << std::endl; + } + + /// + /// Gets the Point2D object count. + /// + /// number of Point2D objects instantiated + static int get_objectCount() { return pointObjectCount; } + + /// + /// Sets the x. + /// + /// The x variable. + /// void + auto setX(NumericType xVar) { points.set_x(xVar); } + + /// + /// Sets the y. + /// + /// The y variable. + /// void + auto setY(NumericType yVar) { points.set_y(yVar); } + + /// + /// returns the x instance. + /// + /// the x-coordinate + [[nodiscard]] auto getX() const { return points.getX(); } + + /// + /// returns the y instance. + /// + /// the y-coordinate + [[nodiscard]] auto getY() const { return points.getY(); } + + /// + /// the polar radius of this point. + /// + /// the polar radius of this point in polar coordinates: sqrt(x*x + y*y) + auto r() { return points.square(); } + + /// + /// the angle of this point in polar coordinates. + /// + /// the angle (in radians) of this point in polar coordinates (between –π and π) + auto theta() { return atan2(points.getY(), points.getX()); } + + /// + /// the angle between this point and that point. + /// + /// The that. + /// the angle in radians (between –π and π) between this point and that point (0 if equal) + auto angleTo(Point2D that); + + /// + /// twice the signed area of the triangle a-b-c. + /// + /// a first point. + /// b second point + /// c third point + /// twice the signed area of the triangle a-b-c + static auto area2(Point2Da, Point2D b, Point2D c); + + /// + /// Returns true if a→b→c is a counterclockwise turn. + /// + /// a first point + /// b second point + /// c third point + /// { -1, 0, +1 } if a→b→c is a { clockwise, collinear; counterclockwise } turn. + static int ccw(Point2D a, Point2D b, Point2D c); + + /// + /// the Euclidean distance between this point and that point. + /// + /// that the other point + /// the Euclidean distance between this point and that point + auto distanceTo(Point2D that); + + /// + /// the square of the Euclidean distance between this point and that point. + /// + /// that the other point + /// the square of the Euclidean distance between this point and that point + auto distanceSquaredTo(Point2D that); + + /// + /// Compares two points by x-coordinate + /// + /// The other. + /// + auto compareByX(Point2D other); + + /// + /// Compares two points by y-coordinate. + /// + /// The other. + /// + auto compareByY(Point2D other); + + /// + /// Compares two points by polar radius. + /// + /// The other. + /// + auto compareByR(Point2D other); + + /// + /// To the string. + /// + /// + auto display() { std::cout << "(" << this->getX() << ", " << this->getY() << ")"; } + + template + friend ostream& operator<<(ostream& os, const Point2D& p); + + template + friend istream& operator>>(istream& is, Point2D p); + +}; +#endif //PHYSICSFORMULA_POINT2D_H + +template +inline auto Point2D::angleTo(Point2D that) +{ + auto dx = that.x_ - this->x_; + auto dy = that.y_ - this->y_; + return atan2(dy, dx); +} + + + +template +inline auto Point2D::area2(Point2D a, Point2D b, Point2D c) +{ + return (b.points.getX() - a.points.getX()) * + (c.points.getY() - a.points.getY()) - + (b.points.getY() - a.points.getY()) * + (c.points.getX() - a.points.getX()); +} +template +inline int Point2D::ccw(Point2D a, Point2D b, Point2D c) +{ + double area2 = area2(a, b, c); + if (area2 < 0) + return -1; + else if (area2 > 0) + return +1; + else + return 0; +} +template +inline auto Point2D::distanceTo(Point2D that) +{ + double dx = this->points.getX() - that.points.getX(); + double dy = this->points.getY() - that.points.getY(); + return sqrt(dx * dx + dy * dy); +} + +template +inline auto Point2D::distanceSquaredTo(Point2D that) +{ + auto dx = this->points.getX() - that.points.getX(); + auto dy = this->points.getY() - that.points.getY(); + return dx * dx + dy * dy; +} + + + + +template +inline auto Point2D::compareByX(Point2D other) +{ + if (this->points.getX() > other.points.getX()) + return 1; + else if (this->x_ < other->x_) + return -1; + else + return 0; +} + +template +inline auto Point2D::compareByY(Point2D other) +{ + if (this->points.getY() > other.points.getY()) + return 1; + else if (this->y_ < other->y_) + return -1; + else + return 0; +} + +template +inline auto Point2D::compareByR(Point2D other) +{ + const double delta = this->r() - other.r(); + if (delta < 0) + return -1; + else if (delta > 0) + return 1; + else + return 0; +} + +template +inline ostream& operator<<(ostream& os, const Point2D& p) +{ + os << "(" << p.x_ << ", " << p.y_ << ")" << std::endl; + return os; +} + +template +inline istream& operator>>(istream& is, Point2D p) +{ + std::cout << "\nEnter the x and y values of this point seperated by a space\n";; + is >> p.x_ >> p.y_; + return is; +} + diff --git a/Polygon.cpp b/Polygon.cpp index 1c899dd..020da60 100644 --- a/Polygon.cpp +++ b/Polygon.cpp @@ -1,143 +1,143 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// -#include "Polygon.h" - -#include "GeoUtils.h" - -using namespace rez; - -// Namespace classes and functions. - -rez::Polygon::Polygon() -{ -} - -// Polygon class function -Polygon::Polygon(std::vector _point_list) -{ - for (Point3d& _point : _point_list) - { - vertex_list.push_back(Vertex(_point)); - } - - const unsigned int size = vertex_list.size(); - - for (size_t i = 0; i < size; i++) - { - vertex_list[i].next = &vertex_list[(i + 1) % size]; - - if (i != 0) - vertex_list[i].prev = &vertex_list[i - 1]; - else - vertex_list[i].prev = &vertex_list[size - 1]; - } -} - -void rez::Polygon::Insert(Point3d& _point) -{ - vertex_list.push_back(Vertex(_point)); - int size = vertex_list.size(); - if (size > 1) - { - vertex_list[size - 1].next = vertex_list[size - 2].next; - vertex_list[size - 2].next = &vertex_list[size - 1]; - vertex_list[size - 1].prev = &vertex_list[size - 2]; - vertex_list[size - 1].next->prev = &vertex_list[size - 1]; - } -} - -// Polygon class function -std::vector Polygon::getPoints() -{ - std::vector point_list; - for (const Vertex& vertex : vertex_list) - { - point_list.push_back(vertex.point); - } - return point_list; -} - - -rez::Polygon2dSimple::Polygon2dSimple() -{ -} - -rez::Polygon2dSimple::Polygon2dSimple(std::vector _point_list) -{ - for (Point2d& _point : _point_list) - { - vertex_list.push_back(new Vertex2dSimple(_point)); - } - - const unsigned int size = vertex_list.size(); - - for (size_t i = 0; i < size; i++) - { - vertex_list[i]->next = vertex_list[(i + 1) % size]; - - if (i != 0) - vertex_list[i]->prev = vertex_list[i - 1]; - else - vertex_list[i]->prev = vertex_list[size - 1]; - } -} - -rez::Polygon2dSimple::Polygon2dSimple(Vertex2dSimple* root_vertex) -{ - vertex_list.push_back(root_vertex); - auto temp = root_vertex->next; - - while (temp != root_vertex) { - vertex_list.push_back(temp); - temp = temp->next; - } -} - -void rez::Polygon2dSimple::Insert(Point2d& _point) -{ - vertex_list.push_back(new Vertex2dSimple(_point)); - int size = vertex_list.size(); - if (size > 1) - { - vertex_list[size - 1]->next = vertex_list[size - 2]->next; - vertex_list[size - 2]->next = vertex_list[size - 1]; - vertex_list[size - 1]->prev = vertex_list[size - 2]; - vertex_list[size - 1]->next->prev = vertex_list[size - 1]; - } -} - -void rez::Polygon2dSimple::RemoveVertex(Vertex2dSimple* _vert) -{ - auto itr = std::find(vertex_list.begin(), vertex_list.end(), _vert); - if (itr != vertex_list.end()) - { - vertex_list.erase(itr); - } -} - -std::vector rez::Polygon2dSimple::getPoints() -{ - std::vector point_list; - for (const Vertex2dSimple* vertex : vertex_list) - { - point_list.push_back(vertex->point); - } - return point_list; -} - -int rez::Polygon2dSimple::size() -{ - return vertex_list.size(); -} - -std::vector rez::Polygon2dSimple::getVertcies() -{ - return this->vertex_list; -} - - -void rez::merge(Polygon& poly1, Polygon& poly2, Polygon& final_poly) -{ - -} +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// +#include "Polygon.h" + +#include "GeoUtils.h" + +using namespace rez; + +// Namespace classes and functions. + +rez::Polygon::Polygon() +{ +} + +// Polygon class function +Polygon::Polygon(std::vector _point_list) +{ + for (Point3d& _point : _point_list) + { + vertex_list.push_back(Vertex(_point)); + } + + const unsigned int size = vertex_list.size(); + + for (size_t i = 0; i < size; i++) + { + vertex_list[i].next = &vertex_list[(i + 1) % size]; + + if (i != 0) + vertex_list[i].prev = &vertex_list[i - 1]; + else + vertex_list[i].prev = &vertex_list[size - 1]; + } +} + +void rez::Polygon::Insert(Point3d& _point) +{ + vertex_list.push_back(Vertex(_point)); + int size = vertex_list.size(); + if (size > 1) + { + vertex_list[size - 1].next = vertex_list[size - 2].next; + vertex_list[size - 2].next = &vertex_list[size - 1]; + vertex_list[size - 1].prev = &vertex_list[size - 2]; + vertex_list[size - 1].next->prev = &vertex_list[size - 1]; + } +} + +// Polygon class function +std::vector Polygon::getPoints() +{ + std::vector point_list; + for (const Vertex& vertex : vertex_list) + { + point_list.push_back(vertex.point); + } + return point_list; +} + + +rez::Polygon2dSimple::Polygon2dSimple() +{ +} + +rez::Polygon2dSimple::Polygon2dSimple(std::vector _point_list) +{ + for (Point2d& _point : _point_list) + { + vertex_list.push_back(new Vertex2dSimple(_point)); + } + + const unsigned int size = vertex_list.size(); + + for (size_t i = 0; i < size; i++) + { + vertex_list[i]->next = vertex_list[(i + 1) % size]; + + if (i != 0) + vertex_list[i]->prev = vertex_list[i - 1]; + else + vertex_list[i]->prev = vertex_list[size - 1]; + } +} + +rez::Polygon2dSimple::Polygon2dSimple(Vertex2dSimple* root_vertex) +{ + vertex_list.push_back(root_vertex); + auto temp = root_vertex->next; + + while (temp != root_vertex) { + vertex_list.push_back(temp); + temp = temp->next; + } +} + +void rez::Polygon2dSimple::Insert(Point2d& _point) +{ + vertex_list.push_back(new Vertex2dSimple(_point)); + int size = vertex_list.size(); + if (size > 1) + { + vertex_list[size - 1]->next = vertex_list[size - 2]->next; + vertex_list[size - 2]->next = vertex_list[size - 1]; + vertex_list[size - 1]->prev = vertex_list[size - 2]; + vertex_list[size - 1]->next->prev = vertex_list[size - 1]; + } +} + +void rez::Polygon2dSimple::RemoveVertex(Vertex2dSimple* _vert) +{ + auto itr = std::find(vertex_list.begin(), vertex_list.end(), _vert); + if (itr != vertex_list.end()) + { + vertex_list.erase(itr); + } +} + +std::vector rez::Polygon2dSimple::getPoints() +{ + std::vector point_list; + for (const Vertex2dSimple* vertex : vertex_list) + { + point_list.push_back(vertex->point); + } + return point_list; +} + +int rez::Polygon2dSimple::size() +{ + return vertex_list.size(); +} + +std::vector rez::Polygon2dSimple::getVertcies() +{ + return this->vertex_list; +} + + +void rez::merge(Polygon& poly1, Polygon& poly2, Polygon& final_poly) +{ + +} diff --git a/Polygon.h b/Polygon.h index a29aa92..b6e121c 100644 --- a/Polygon.h +++ b/Polygon.h @@ -1,93 +1,93 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_POLYGON_H -#define PHYSICSFORMULA_POLYGON_H -#pragma once -#include - -#include "Point.h" - -namespace rez { - struct Vertex - { - Point3d point; - Vertex* next = nullptr; - Vertex* prev = nullptr; - int id = 0; - - friend class Polygon; - - public: - Vertex(Point3d& _point, Vertex* _next = nullptr, Vertex* _prev = nullptr) : point(_point), next(_next), prev(_prev) {} - }; - - struct Vertex2dSimple { - Point2d point; - Vertex2dSimple* next = nullptr; - Vertex2dSimple* prev = nullptr; - bool is_ear = false; - bool is_processed = false; - - friend class Polygon2dSimple; - - public: - Vertex2dSimple(Point2d& _point, Vertex2dSimple* _next = nullptr, Vertex2dSimple* _prev = nullptr) : point(_point), next(_next), prev(_prev) {} - }; - - struct Edge2dSimple { - Point2d p1; - Point2d p2; - Point2d fp1; - Point2d fp2; - public: - Edge2dSimple() {} - - Edge2dSimple(Point2d _p1, Point2d _p2) :p1(_p1), p2(_p2) - {} - - }; - - class Polygon - { - std::vector vertex_list; - public: - Polygon(); - - // Construct the Polyhon with given point set - Polygon(std::vector _point_list); - - void Insert(Point3d&); - - // Return the points list of underline vertices - std::vector getPoints(); - }; - - class Polygon2dSimple { - std::vector vertex_list; - public: - Polygon2dSimple(); - - // Construct the Polyhon with given point set - Polygon2dSimple(std::vector _point_list); - - Polygon2dSimple(Vertex2dSimple* root_vertex); - - void Insert(Point2d&); - - // If vert exist in the polygon, update the neighbour pointer accoidingly and remove the vertex. - void RemoveVertex(Vertex2dSimple* vert); - - std::vector getVertcies(); - - // Return the points list of underline vertices - std::vector getPoints(); - - int size(); - - }; - - void merge(Polygon& poly1, Polygon& poly2, Polygon& final_poly); -} -#endif //PHYSICSFORMULA_POLYGON_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_POLYGON_H +#define PHYSICSFORMULA_POLYGON_H +#pragma once +#include + +#include "Point.h" + +namespace rez { + struct Vertex + { + Point3d point; + Vertex* next = nullptr; + Vertex* prev = nullptr; + int id = 0; + + friend class Polygon; + + public: + Vertex(Point3d& _point, Vertex* _next = nullptr, Vertex* _prev = nullptr) : point(_point), next(_next), prev(_prev) {} + }; + + struct Vertex2dSimple { + Point2d point; + Vertex2dSimple* next = nullptr; + Vertex2dSimple* prev = nullptr; + bool is_ear = false; + bool is_processed = false; + + friend class Polygon2dSimple; + + public: + Vertex2dSimple(Point2d& _point, Vertex2dSimple* _next = nullptr, Vertex2dSimple* _prev = nullptr) : point(_point), next(_next), prev(_prev) {} + }; + + struct Edge2dSimple { + Point2d p1; + Point2d p2; + Point2d fp1; + Point2d fp2; + public: + Edge2dSimple() {} + + Edge2dSimple(Point2d _p1, Point2d _p2) :p1(_p1), p2(_p2) + {} + + }; + + class Polygon + { + std::vector vertex_list; + public: + Polygon(); + + // Construct the Polyhon with given point set + Polygon(std::vector _point_list); + + void Insert(Point3d&); + + // Return the points list of underline vertices + std::vector getPoints(); + }; + + class Polygon2dSimple { + std::vector vertex_list; + public: + Polygon2dSimple(); + + // Construct the Polyhon with given point set + Polygon2dSimple(std::vector _point_list); + + Polygon2dSimple(Vertex2dSimple* root_vertex); + + void Insert(Point2d&); + + // If vert exist in the polygon, update the neighbour pointer accoidingly and remove the vertex. + void RemoveVertex(Vertex2dSimple* vert); + + std::vector getVertcies(); + + // Return the points list of underline vertices + std::vector getPoints(); + + int size(); + + }; + + void merge(Polygon& poly1, Polygon& poly2, Polygon& final_poly); +} +#endif //PHYSICSFORMULA_POLYGON_H diff --git a/PolygonDCEL.h b/PolygonDCEL.h index 1ac4750..b926aad 100644 --- a/PolygonDCEL.h +++ b/PolygonDCEL.h @@ -1,395 +1,395 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_POLYGONDCEL_H -#define PHYSICSFORMULA_POLYGONDCEL_H -#pragma once - -#include -#include -#include "Point.h" - -namespace rez { - static int _id = 1; - - template - struct EdgeDCEL; - - template - struct FaceDCEL; - - template - struct VertexDCEL { - Vector point; // Coordinates of the vertex - EdgeDCEL* incident_edge = nullptr; // Incident edge to the vertex - - VertexDCEL(Vector& _point) : point(_point) {} - - void print() { - std::cout << "(" << point[X] << "," << point[Y] << ") \n"; - } - }; - - template - struct EdgeDCEL { - VertexDCEL* origin = nullptr; - EdgeDCEL* twin = nullptr; - EdgeDCEL* next = nullptr; - EdgeDCEL* prev = nullptr; - FaceDCEL* incident_face = nullptr; - int id; - - EdgeDCEL() { id = -1; } - - EdgeDCEL(VertexDCEL* _origin) :origin(_origin) { - id = _id++; - }; - - VertexDCEL* destination() { - return twin->origin; - } - - void print() - { - std::cout << "This point pointer" << this << "\n"; - std::cout << "Origin : "; this->origin->print(); - std::cout << "Twin pointer" << this->twin << "\n"; - std::cout << "Next pointer" << this->next << "\n"; - std::cout << "Prev pointer" << this->prev << "\n"; - } - }; - - template - struct FaceDCEL { - EdgeDCEL* outer = nullptr; // Pointer to one of the counter clockwise edges - std::vector*> inner; // Pointer to first halfedges which represnt holes. - - void print() { - if (outer) - { - auto edge_ptr = outer; - auto next_ptr = outer->next; - - edge_ptr->origin->print(); - while (next_ptr != edge_ptr) { - next_ptr->origin->print(); - next_ptr = next_ptr->next; - } - } - } - - std::vector*> getEdgeList() { - std::vector*> edge_list; - if (outer) { - auto edge_ptr = outer; - auto next_ptr = outer->next; - edge_list.push_back(edge_ptr); - edge_ptr->origin->print(); - while (next_ptr != edge_ptr) { - edge_list.push_back(next_ptr); - next_ptr = next_ptr->next; - } - } - return edge_list; - } - - std::vector> getPoints() - { - std::vector> point_list; - if (outer) { - auto edge_ptr = outer; - auto next_ptr = outer->next; - point_list.push_back(edge_ptr->origin->point); - while (next_ptr != edge_ptr) { - point_list.push_back(next_ptr->origin->point); - next_ptr = next_ptr->next; - } - } - return point_list; - } - }; - - template - class PolygonDCEL { - typedef Vector VectorNf; - std::vector*> vertex_list; - std::vector*> edge_list; - std::vector*> face_list; - - EdgeDCEL* empty_edge = new EdgeDCEL(); - public: - - // Construct the double connected edge list using the given points. - // Assume the given points list is for polygon and have counter clockwise order - explicit PolygonDCEL(std::vector&); - - // Insert an edge between virtices _v1 and _v2 given that the edge lies completely inside the orginal polygon - bool split(VertexDCEL* _v1, VertexDCEL* _v2); - - // Join the two faces sepated by edge between _v1 and _v2 - bool join(VertexDCEL* _v1, VertexDCEL* _v2); - - // Return the all the vertices across all the faces. - std::vector*> getVertexList(); - - // Return all faces - std::vector*> getFaceList(); - - std::vector*> getEdgeList(); - - VertexDCEL* getVertex(VectorNf&); - - void getEdgesWithSamefaceAndGivenOrigins(VertexDCEL* _v1, VertexDCEL* _v2, - EdgeDCEL** edge_leaving_v1, EdgeDCEL** edge_leaving_v2); - }; - - typedef VertexDCEL Vertex2dDCEL; - typedef EdgeDCEL Edge2dDCEL; - typedef PolygonDCEL Polygon2d; - - template - inline PolygonDCEL::PolygonDCEL(std::vector& _points) - { - int size = _points.size(); - // Polygon should have atleast tree vertices. - if (size < 3) - return; - - for (size_t i = 0; i < _points.size(); i++) { - vertex_list.push_back(new VertexDCEL(_points[i])); - } - - for (size_t i = 0; i <= vertex_list.size() - 2; i++) { - auto hfedge = new EdgeDCEL(vertex_list[i]); - auto edge_twin = new EdgeDCEL(vertex_list[i + 1]); - - vertex_list[i]->incident_edge = hfedge; - - hfedge->twin = edge_twin; - edge_twin->twin = hfedge; - - edge_list.push_back(hfedge); - edge_list.push_back(edge_twin); - } - - auto hfedge = new EdgeDCEL(vertex_list.back()); - auto edge_twin = new EdgeDCEL(vertex_list.front()); - - hfedge->twin = edge_twin; - edge_twin->twin = hfedge; - edge_list.push_back(hfedge); - edge_list.push_back(edge_twin); - - vertex_list[vertex_list.size() - 1]->incident_edge = hfedge; - - // Set the prev and next for the element middle of the list ( 2 : size- 2) - for (size_t i = 2; i <= edge_list.size() - 3; i++) { - - if (i % 2 == 0) // Even case. Counter clockwise edges - { - edge_list[i]->next = edge_list[i + 2]; - edge_list[i]->prev = edge_list[i - 2]; - } - else // Odd case. Clockwise edges - { - edge_list[i]->next = edge_list[i - 2]; - edge_list[i]->prev = edge_list[i + 2]; - } - } - - edge_list[0]->next = edge_list[2]; - edge_list[0]->prev = edge_list[edge_list.size() - 2]; - edge_list[1]->next = edge_list[edge_list.size() - 1]; - edge_list[1]->prev = edge_list[3]; - - edge_list[edge_list.size() - 2]->next = edge_list[0]; - edge_list[edge_list.size() - 2]->prev = edge_list[edge_list.size() - 4]; - edge_list[edge_list.size() - 1]->next = edge_list[edge_list.size() - 3]; - edge_list[edge_list.size() - 1]->prev = edge_list[1]; - - // Configure the faces. - FaceDCEL* f1 = new FaceDCEL(); - FaceDCEL* f2 = new FaceDCEL(); - - f1->outer = edge_list[0]; - // f2 is unbounded face which wrap the f1. So f1 is a hole in f2. So have clockwise edges in innder edge list - f2->inner.push_back(edge_list[1]); - - face_list.push_back(f1); - face_list.push_back(f2); - - f1->outer->incident_face = f1; - EdgeDCEL* edge = f1->outer->next; - while (edge != f1->outer) - { - edge->incident_face = f1; - edge = edge->next; - } - - // f2->inner has halfedges connect in clockwise order - f2->inner[0]->incident_face = f2; - edge = f2->inner[0]->next; - while (edge != f2->inner[0]) - { - edge->incident_face = f2; - edge = edge->next; - } - - } - - template - inline void PolygonDCEL::getEdgesWithSamefaceAndGivenOrigins( - VertexDCEL* _v1, VertexDCEL* _v2, - EdgeDCEL** edge_leaving_v1, EdgeDCEL** edge_leaving_v2) - { - std::vector*> edges_with_v1_ori, edges_with_v2_ori; - - // Get all the edges with orgin _v1 - auto v1_inci_edge = _v1->incident_edge; - edges_with_v1_ori.push_back(v1_inci_edge); - - auto next_edge = v1_inci_edge->twin->next; - while (next_edge != v1_inci_edge) { - edges_with_v1_ori.push_back(next_edge); - next_edge = next_edge->twin->next; - } - - // Get all the edges with orgin _v2 - auto v2_inci_edge = _v2->incident_edge; - edges_with_v2_ori.push_back(v2_inci_edge); - - next_edge = v2_inci_edge->twin->next; - while (next_edge != v2_inci_edge) - { - edges_with_v2_ori.push_back(next_edge); - next_edge = next_edge->twin->next; - } - - // Get two edges, one with origin v1 and other with origin v2 and incident to same face - for (auto ev1 : edges_with_v1_ori) { - for (auto ev2 : edges_with_v2_ori) { - if (ev1->incident_face->outer != nullptr) { - if (ev1->incident_face == ev2->incident_face) { - *edge_leaving_v1 = ev1; - *edge_leaving_v2 = ev2; - return; - } - } - } - } - } - - template - inline bool PolygonDCEL::split(VertexDCEL* _v1, VertexDCEL* _v2) - { - // Find two edges with given points as origins and are in same face. - EdgeDCEL* edge_oriV1; - EdgeDCEL* edge_oriV2; - getEdgesWithSamefaceAndGivenOrigins(_v1, _v2, &edge_oriV1, &edge_oriV2); - - if (edge_oriV1->id == -1 || edge_oriV2->id == -1) - return false; // Cannot find a edges with same face with ori _v1, _v2 - - // If the vertices are adjucent we can return. - if (edge_oriV1->next->origin == _v2 || edge_oriV1->prev->origin == _v2) - return false; - - // Later we can delete this entry - FaceDCEL* previous_face = edge_oriV1->incident_face; - - auto half_edge1 = new EdgeDCEL(_v1); - auto half_edge2 = new EdgeDCEL(_v2); - - half_edge1->twin = half_edge2; - half_edge2->twin = half_edge1; - half_edge1->next = edge_oriV2; - half_edge2->next = edge_oriV1; - - half_edge1->prev = edge_oriV1->prev; - half_edge2->prev = edge_oriV2->prev; - - half_edge1->next->prev = half_edge1; - half_edge2->next->prev = half_edge2; - half_edge1->prev->next = half_edge1; - half_edge2->prev->next = half_edge2; - - FaceDCEL* new_face1 = new FaceDCEL(); - new_face1->outer = half_edge1; - half_edge1->incident_face = new_face1; - auto temp_edge = half_edge1->next; - while (temp_edge != half_edge1) { - temp_edge->incident_face = new_face1; - temp_edge = temp_edge->next; - } - - FaceDCEL* new_face2 = new FaceDCEL(); - new_face2->outer = half_edge2; - half_edge2->incident_face = new_face2; - temp_edge = half_edge2->next; - while (temp_edge != half_edge2) { - temp_edge->incident_face = new_face2; - temp_edge = temp_edge->next; - } - - face_list.push_back(new_face1); - face_list.push_back(new_face2); - - auto itr = std::find(face_list.begin(), face_list.end(), previous_face); - - if (itr != face_list.end()) { - face_list.erase(itr); - delete previous_face; - } - - return true; - } - - template - inline bool PolygonDCEL::join(VertexDCEL* _v1, VertexDCEL* _v2) - { - return false; - } - - template - inline std::vector*> PolygonDCEL::getVertexList() - { - return vertex_list; - } - - template - inline std::vector*> PolygonDCEL::getFaceList() - { - return face_list; - } - - template - inline std::vector*> PolygonDCEL::getEdgeList() - { - return edge_list; - } - - template - inline VertexDCEL* PolygonDCEL::getVertex(VectorNf& _point) - { - for (size_t i = 0; i < vertex_list.size(); i++) { - if (_point == vertex_list[i]->point) - return vertex_list[i]; - } - return nullptr; - } - - struct Vertex2DSortTBLR { - bool operator()(Vertex2dDCEL* ref1, Vertex2dDCEL* ref2) { - auto a = ref1->point; - auto b = ref2->point; - if ((a[Y] > b[Y]) - || (a[Y] == b[Y]) && (a[X] < b[X])) - { - return true; - } - return false; - } - }; -} -#endif //PHYSICSFORMULA_POLYGONDCEL_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_POLYGONDCEL_H +#define PHYSICSFORMULA_POLYGONDCEL_H +#pragma once + +#include +#include +#include "Point.h" + +namespace rez { + static int _id = 1; + + template + struct EdgeDCEL; + + template + struct FaceDCEL; + + template + struct VertexDCEL { + Vector point; // Coordinates of the vertex + EdgeDCEL* incident_edge = nullptr; // Incident edge to the vertex + + VertexDCEL(Vector& _point) : point(_point) {} + + void print() { + std::cout << "(" << point[X] << "," << point[Y] << ") \n"; + } + }; + + template + struct EdgeDCEL { + VertexDCEL* origin = nullptr; + EdgeDCEL* twin = nullptr; + EdgeDCEL* next = nullptr; + EdgeDCEL* prev = nullptr; + FaceDCEL* incident_face = nullptr; + int id; + + EdgeDCEL() { id = -1; } + + EdgeDCEL(VertexDCEL* _origin) :origin(_origin) { + id = _id++; + }; + + VertexDCEL* destination() { + return twin->origin; + } + + void print() + { + std::cout << "This point pointer" << this << "\n"; + std::cout << "Origin : "; this->origin->print(); + std::cout << "Twin pointer" << this->twin << "\n"; + std::cout << "Next pointer" << this->next << "\n"; + std::cout << "Prev pointer" << this->prev << "\n"; + } + }; + + template + struct FaceDCEL { + EdgeDCEL* outer = nullptr; // Pointer to one of the counter clockwise edges + std::vector*> inner; // Pointer to first halfedges which represnt holes. + + void print() { + if (outer) + { + auto edge_ptr = outer; + auto next_ptr = outer->next; + + edge_ptr->origin->print(); + while (next_ptr != edge_ptr) { + next_ptr->origin->print(); + next_ptr = next_ptr->next; + } + } + } + + std::vector*> getEdgeList() { + std::vector*> edge_list; + if (outer) { + auto edge_ptr = outer; + auto next_ptr = outer->next; + edge_list.push_back(edge_ptr); + edge_ptr->origin->print(); + while (next_ptr != edge_ptr) { + edge_list.push_back(next_ptr); + next_ptr = next_ptr->next; + } + } + return edge_list; + } + + std::vector> getPoints() + { + std::vector> point_list; + if (outer) { + auto edge_ptr = outer; + auto next_ptr = outer->next; + point_list.push_back(edge_ptr->origin->point); + while (next_ptr != edge_ptr) { + point_list.push_back(next_ptr->origin->point); + next_ptr = next_ptr->next; + } + } + return point_list; + } + }; + + template + class PolygonDCEL { + typedef Vector VectorNf; + std::vector*> vertex_list; + std::vector*> edge_list; + std::vector*> face_list; + + EdgeDCEL* empty_edge = new EdgeDCEL(); + public: + + // Construct the double connected edge list using the given points. + // Assume the given points list is for polygon and have counter clockwise order + explicit PolygonDCEL(std::vector&); + + // Insert an edge between virtices _v1 and _v2 given that the edge lies completely inside the orginal polygon + bool split(VertexDCEL* _v1, VertexDCEL* _v2); + + // Join the two faces sepated by edge between _v1 and _v2 + bool join(VertexDCEL* _v1, VertexDCEL* _v2); + + // Return the all the vertices across all the faces. + std::vector*> getVertexList(); + + // Return all faces + std::vector*> getFaceList(); + + std::vector*> getEdgeList(); + + VertexDCEL* getVertex(VectorNf&); + + void getEdgesWithSamefaceAndGivenOrigins(VertexDCEL* _v1, VertexDCEL* _v2, + EdgeDCEL** edge_leaving_v1, EdgeDCEL** edge_leaving_v2); + }; + + typedef VertexDCEL Vertex2dDCEL; + typedef EdgeDCEL Edge2dDCEL; + typedef PolygonDCEL Polygon2d; + + template + inline PolygonDCEL::PolygonDCEL(std::vector& _points) + { + int size = _points.size(); + // Polygon should have atleast tree vertices. + if (size < 3) + return; + + for (size_t i = 0; i < _points.size(); i++) { + vertex_list.push_back(new VertexDCEL(_points[i])); + } + + for (size_t i = 0; i <= vertex_list.size() - 2; i++) { + auto hfedge = new EdgeDCEL(vertex_list[i]); + auto edge_twin = new EdgeDCEL(vertex_list[i + 1]); + + vertex_list[i]->incident_edge = hfedge; + + hfedge->twin = edge_twin; + edge_twin->twin = hfedge; + + edge_list.push_back(hfedge); + edge_list.push_back(edge_twin); + } + + auto hfedge = new EdgeDCEL(vertex_list.back()); + auto edge_twin = new EdgeDCEL(vertex_list.front()); + + hfedge->twin = edge_twin; + edge_twin->twin = hfedge; + edge_list.push_back(hfedge); + edge_list.push_back(edge_twin); + + vertex_list[vertex_list.size() - 1]->incident_edge = hfedge; + + // Set the prev and next for the element middle of the list ( 2 : size- 2) + for (size_t i = 2; i <= edge_list.size() - 3; i++) { + + if (i % 2 == 0) // Even case. Counter clockwise edges + { + edge_list[i]->next = edge_list[i + 2]; + edge_list[i]->prev = edge_list[i - 2]; + } + else // Odd case. Clockwise edges + { + edge_list[i]->next = edge_list[i - 2]; + edge_list[i]->prev = edge_list[i + 2]; + } + } + + edge_list[0]->next = edge_list[2]; + edge_list[0]->prev = edge_list[edge_list.size() - 2]; + edge_list[1]->next = edge_list[edge_list.size() - 1]; + edge_list[1]->prev = edge_list[3]; + + edge_list[edge_list.size() - 2]->next = edge_list[0]; + edge_list[edge_list.size() - 2]->prev = edge_list[edge_list.size() - 4]; + edge_list[edge_list.size() - 1]->next = edge_list[edge_list.size() - 3]; + edge_list[edge_list.size() - 1]->prev = edge_list[1]; + + // Configure the faces. + FaceDCEL* f1 = new FaceDCEL(); + FaceDCEL* f2 = new FaceDCEL(); + + f1->outer = edge_list[0]; + // f2 is unbounded face which wrap the f1. So f1 is a hole in f2. So have clockwise edges in innder edge list + f2->inner.push_back(edge_list[1]); + + face_list.push_back(f1); + face_list.push_back(f2); + + f1->outer->incident_face = f1; + EdgeDCEL* edge = f1->outer->next; + while (edge != f1->outer) + { + edge->incident_face = f1; + edge = edge->next; + } + + // f2->inner has halfedges connect in clockwise order + f2->inner[0]->incident_face = f2; + edge = f2->inner[0]->next; + while (edge != f2->inner[0]) + { + edge->incident_face = f2; + edge = edge->next; + } + + } + + template + inline void PolygonDCEL::getEdgesWithSamefaceAndGivenOrigins( + VertexDCEL* _v1, VertexDCEL* _v2, + EdgeDCEL** edge_leaving_v1, EdgeDCEL** edge_leaving_v2) + { + std::vector*> edges_with_v1_ori, edges_with_v2_ori; + + // Get all the edges with orgin _v1 + auto v1_inci_edge = _v1->incident_edge; + edges_with_v1_ori.push_back(v1_inci_edge); + + auto next_edge = v1_inci_edge->twin->next; + while (next_edge != v1_inci_edge) { + edges_with_v1_ori.push_back(next_edge); + next_edge = next_edge->twin->next; + } + + // Get all the edges with orgin _v2 + auto v2_inci_edge = _v2->incident_edge; + edges_with_v2_ori.push_back(v2_inci_edge); + + next_edge = v2_inci_edge->twin->next; + while (next_edge != v2_inci_edge) + { + edges_with_v2_ori.push_back(next_edge); + next_edge = next_edge->twin->next; + } + + // Get two edges, one with origin v1 and other with origin v2 and incident to same face + for (auto ev1 : edges_with_v1_ori) { + for (auto ev2 : edges_with_v2_ori) { + if (ev1->incident_face->outer != nullptr) { + if (ev1->incident_face == ev2->incident_face) { + *edge_leaving_v1 = ev1; + *edge_leaving_v2 = ev2; + return; + } + } + } + } + } + + template + inline bool PolygonDCEL::split(VertexDCEL* _v1, VertexDCEL* _v2) + { + // Find two edges with given points as origins and are in same face. + EdgeDCEL* edge_oriV1; + EdgeDCEL* edge_oriV2; + getEdgesWithSamefaceAndGivenOrigins(_v1, _v2, &edge_oriV1, &edge_oriV2); + + if (edge_oriV1->id == -1 || edge_oriV2->id == -1) + return false; // Cannot find a edges with same face with ori _v1, _v2 + + // If the vertices are adjucent we can return. + if (edge_oriV1->next->origin == _v2 || edge_oriV1->prev->origin == _v2) + return false; + + // Later we can delete this entry + FaceDCEL* previous_face = edge_oriV1->incident_face; + + auto half_edge1 = new EdgeDCEL(_v1); + auto half_edge2 = new EdgeDCEL(_v2); + + half_edge1->twin = half_edge2; + half_edge2->twin = half_edge1; + half_edge1->next = edge_oriV2; + half_edge2->next = edge_oriV1; + + half_edge1->prev = edge_oriV1->prev; + half_edge2->prev = edge_oriV2->prev; + + half_edge1->next->prev = half_edge1; + half_edge2->next->prev = half_edge2; + half_edge1->prev->next = half_edge1; + half_edge2->prev->next = half_edge2; + + FaceDCEL* new_face1 = new FaceDCEL(); + new_face1->outer = half_edge1; + half_edge1->incident_face = new_face1; + auto temp_edge = half_edge1->next; + while (temp_edge != half_edge1) { + temp_edge->incident_face = new_face1; + temp_edge = temp_edge->next; + } + + FaceDCEL* new_face2 = new FaceDCEL(); + new_face2->outer = half_edge2; + half_edge2->incident_face = new_face2; + temp_edge = half_edge2->next; + while (temp_edge != half_edge2) { + temp_edge->incident_face = new_face2; + temp_edge = temp_edge->next; + } + + face_list.push_back(new_face1); + face_list.push_back(new_face2); + + auto itr = std::find(face_list.begin(), face_list.end(), previous_face); + + if (itr != face_list.end()) { + face_list.erase(itr); + delete previous_face; + } + + return true; + } + + template + inline bool PolygonDCEL::join(VertexDCEL* _v1, VertexDCEL* _v2) + { + return false; + } + + template + inline std::vector*> PolygonDCEL::getVertexList() + { + return vertex_list; + } + + template + inline std::vector*> PolygonDCEL::getFaceList() + { + return face_list; + } + + template + inline std::vector*> PolygonDCEL::getEdgeList() + { + return edge_list; + } + + template + inline VertexDCEL* PolygonDCEL::getVertex(VectorNf& _point) + { + for (size_t i = 0; i < vertex_list.size(); i++) { + if (_point == vertex_list[i]->point) + return vertex_list[i]; + } + return nullptr; + } + + struct Vertex2DSortTBLR { + bool operator()(Vertex2dDCEL* ref1, Vertex2dDCEL* ref2) { + auto a = ref1->point; + auto b = ref2->point; + if ((a[Y] > b[Y]) + || (a[Y] == b[Y]) && (a[X] < b[X])) + { + return true; + } + return false; + } + }; +} +#endif //PHYSICSFORMULA_POLYGONDCEL_H diff --git a/Polyhedron.h b/Polyhedron.h index 71de1bc..efea992 100644 --- a/Polyhedron.h +++ b/Polyhedron.h @@ -1,96 +1,96 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_POLYHEDRON_H -#define PHYSICSFORMULA_POLYHEDRON_H -#pragma once -#include -#include "Polygon.h" // For vertex -#include "Plane.h" - -namespace rez { - - struct Face; - - struct Vertex3d { - Point3d* point = nullptr; - bool processed = false; - - Vertex3d() {} - - Vertex3d(Point3d* _point) - { - point = _point; - processed = false; - } - }; - - struct Edge3d { - Vertex3d* vertices[2]; - Face* faces[2] = { nullptr, nullptr }; - - Edge3d(Vertex3d* p1, Vertex3d* p2) - { - vertices[0] = p1; - vertices[1] = p2; - } - - bool operator==(const Edge3d& _other) - { - if (*vertices[0]->point == *_other.vertices[0]->point - && *vertices[1]->point == *_other.vertices[1]->point) - return true; - return false; - } - }; - - struct Face { - std::vector edges; - std::vector vertices; - Planef plane; - bool visible = false; - bool normal_switch_needed = false; - - Face() {} - - Face(Vertex3d* p1, Vertex3d* p2, Vertex3d* p3) - { - vertices.push_back(p1); - vertices.push_back(p2); - vertices.push_back(p3); - - plane = Planef(*p1->point, *p2->point, *p3->point); - } - - bool operator==(const Face& _other) - { - if (vertices.size() != _other.vertices.size()) - return false; - - bool ret = true; - for (size_t i = 0; i < vertices.size(); i++) - { - if (vertices[i]->point != _other.vertices[i]->point) - { - ret = false; - break; - } - } - return ret; - } - - void addEdge(Edge3d* edg_ptr) - { - edges.push_back(edg_ptr); - } - }; - - class Polyhedron { - std::vector faces; - - public: - }; - -} -#endif //PHYSICSFORMULA_POLYHEDRON_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_POLYHEDRON_H +#define PHYSICSFORMULA_POLYHEDRON_H +#pragma once +#include +#include "Polygon.h" // For vertex +#include "Plane.h" + +namespace rez { + + struct Face; + + struct Vertex3d { + Point3d* point = nullptr; + bool processed = false; + + Vertex3d() {} + + Vertex3d(Point3d* _point) + { + point = _point; + processed = false; + } + }; + + struct Edge3d { + Vertex3d* vertices[2]; + Face* faces[2] = { nullptr, nullptr }; + + Edge3d(Vertex3d* p1, Vertex3d* p2) + { + vertices[0] = p1; + vertices[1] = p2; + } + + bool operator==(const Edge3d& _other) + { + if (*vertices[0]->point == *_other.vertices[0]->point + && *vertices[1]->point == *_other.vertices[1]->point) + return true; + return false; + } + }; + + struct Face { + std::vector edges; + std::vector vertices; + Planef plane; + bool visible = false; + bool normal_switch_needed = false; + + Face() {} + + Face(Vertex3d* p1, Vertex3d* p2, Vertex3d* p3) + { + vertices.push_back(p1); + vertices.push_back(p2); + vertices.push_back(p3); + + plane = Planef(*p1->point, *p2->point, *p3->point); + } + + bool operator==(const Face& _other) + { + if (vertices.size() != _other.vertices.size()) + return false; + + bool ret = true; + for (size_t i = 0; i < vertices.size(); i++) + { + if (vertices[i]->point != _other.vertices[i]->point) + { + ret = false; + break; + } + } + return ret; + } + + void addEdge(Edge3d* edg_ptr) + { + edges.push_back(edg_ptr); + } + }; + + class Polyhedron { + std::vector faces; + + public: + }; + +} +#endif //PHYSICSFORMULA_POLYHEDRON_H diff --git a/Pyramid.h b/Pyramid.h index 75bfd87..d39498f 100644 --- a/Pyramid.h +++ b/Pyramid.h @@ -1,174 +1,174 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_PYRAMID_H -#define PHYSICSFORMULA_PYRAMID_H -/** - * @class Pyramid - * @details class that represents a Pyramid object - * @author Ryan Zurrin - * @dateBuilt 11/4/2021 - * @lastEdit 11/4/2021 - */ -#include -#include -static int pyramidObjectCount = 0; -typedef long double ld; - -class Pyramid -{ - ld lenght; - ld width; - ld height; - ld volume; - ld surfaceArea; - static auto countIncrease() { pyramidObjectCount += 1; } - static auto countDecrease() { pyramidObjectCount -= 1; } - ld calculateVolume()const; - ld calculateSurfaceArea()const; -public: - - Pyramid() - { - lenght = 0.0; - width = 0.0; - height = 0.0; - volume = 0.0; - surfaceArea = 0.0; - countIncrease(); - } - - Pyramid(ld length, ld width, ld height) - { - this->lenght = length; - this->width = width; - this->height = height; - this->volume = calculateVolume(); - this->surfaceArea = calculateSurfaceArea(); - countIncrease(); - } - - /** - * @brief copy constructor - */ - Pyramid(const Pyramid& s) - { - lenght = s.lenght; - width = s.width; - height = s.height; - volume = s.volume; - surfaceArea = s.surfaceArea; - countIncrease(); - } - /** - * #brief move constructor - */ - Pyramid(Pyramid&& s) noexcept - { - lenght = s.lenght; - width = s.width; - height = s.height; - volume = s.volume; - surfaceArea = s.surfaceArea; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Pyramid& operator=(Pyramid&& s) noexcept - { - if (this != &s) - { - lenght = s.lenght; - width = s.width; - height = s.height; - volume = s.volume; - surfaceArea = s.surfaceArea; - countIncrease(); - } - return *this; - } - - Pyramid& operator=(Pyramid other) - { - std::swap(lenght, other.lenght); - std::swap(width, other.width); - std::swap(height, other.height); - std::swap(volume, other.volume); - std::swap(surfaceArea, other.surfaceArea); - return *this; - } - - static void show_objectCount() { - std::cout << "\n rectangle object count: " - << pyramidObjectCount << std::endl; - } - static int get_objectCount() { return pyramidObjectCount; } - - - ~Pyramid() = default; - - auto setWidth(ld w); - auto setLength(ld l); - auto setHeight(ld h); - - [[nodiscard]] auto getWidth() const { return width; } - [[nodiscard]] auto getLength() const { return lenght; } - [[nodiscard]] auto getHeight() const { return height; } - [[nodiscard]] auto getVolume() const { return volume; } - [[nodiscard]] auto getSurfaceArea() const { return surfaceArea; } - [[nodiscard]] auto getWeight(ld densityKgM) const; - - void printPyramidInfo()const; -}; - -#endif //PHYSICSFORMULA_PYRAMID_H - -inline ld Pyramid::calculateVolume() const -{ - return 1.0/3.0*(lenght*width)*height; -} - -inline ld Pyramid::calculateSurfaceArea() const -{ - return lenght * width + lenght * (sqrt(pow((width / 2.0), 2) + height * height)) + - width * (sqrt(pow((lenght / 2.0), 2) + height * height)); -} - -inline auto Pyramid::setWidth(ld w) -{ - width = w; - volume = calculateVolume(); - surfaceArea = calculateSurfaceArea(); -} - -inline auto Pyramid::setLength(ld l) -{ - lenght = l; - volume = calculateVolume(); - surfaceArea = calculateSurfaceArea(); -} - -inline auto Pyramid::setHeight(ld h) -{ - height = h; - volume = calculateVolume(); - surfaceArea = calculateSurfaceArea(); -} - -inline auto Pyramid::getWeight(ld densityKgM) const -{ - return densityKgM * volume; -} - -inline void Pyramid::printPyramidInfo() const -{ - std::cout << "length: " << lenght << std::endl; - std::cout << "width: " << width << std::endl; - std::cout << "height: " << height << std::endl; - std::cout << "volume: " << volume << std::endl; - std::cout << "surface area: " << surfaceArea << std::endl; -} - - +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_PYRAMID_H +#define PHYSICSFORMULA_PYRAMID_H +/** + * @class Pyramid + * @details class that represents a Pyramid object + * @author Ryan Zurrin + * @dateBuilt 11/4/2021 + * @lastEdit 11/4/2021 + */ +#include +#include +static int pyramidObjectCount = 0; +typedef long double ld; + +class Pyramid +{ + ld lenght; + ld width; + ld height; + ld volume; + ld surfaceArea; + static auto countIncrease() { pyramidObjectCount += 1; } + static auto countDecrease() { pyramidObjectCount -= 1; } + ld calculateVolume()const; + ld calculateSurfaceArea()const; +public: + + Pyramid() + { + lenght = 0.0; + width = 0.0; + height = 0.0; + volume = 0.0; + surfaceArea = 0.0; + countIncrease(); + } + + Pyramid(ld length, ld width, ld height) + { + this->lenght = length; + this->width = width; + this->height = height; + this->volume = calculateVolume(); + this->surfaceArea = calculateSurfaceArea(); + countIncrease(); + } + + /** + * @brief copy constructor + */ + Pyramid(const Pyramid& s) + { + lenght = s.lenght; + width = s.width; + height = s.height; + volume = s.volume; + surfaceArea = s.surfaceArea; + countIncrease(); + } + /** + * #brief move constructor + */ + Pyramid(Pyramid&& s) noexcept + { + lenght = s.lenght; + width = s.width; + height = s.height; + volume = s.volume; + surfaceArea = s.surfaceArea; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Pyramid& operator=(Pyramid&& s) noexcept + { + if (this != &s) + { + lenght = s.lenght; + width = s.width; + height = s.height; + volume = s.volume; + surfaceArea = s.surfaceArea; + countIncrease(); + } + return *this; + } + + Pyramid& operator=(Pyramid other) + { + std::swap(lenght, other.lenght); + std::swap(width, other.width); + std::swap(height, other.height); + std::swap(volume, other.volume); + std::swap(surfaceArea, other.surfaceArea); + return *this; + } + + static void show_objectCount() { + std::cout << "\n rectangle object count: " + << pyramidObjectCount << std::endl; + } + static int get_objectCount() { return pyramidObjectCount; } + + + ~Pyramid() = default; + + auto setWidth(ld w); + auto setLength(ld l); + auto setHeight(ld h); + + [[nodiscard]] auto getWidth() const { return width; } + [[nodiscard]] auto getLength() const { return lenght; } + [[nodiscard]] auto getHeight() const { return height; } + [[nodiscard]] auto getVolume() const { return volume; } + [[nodiscard]] auto getSurfaceArea() const { return surfaceArea; } + [[nodiscard]] auto getWeight(ld densityKgM) const; + + void printPyramidInfo()const; +}; + +#endif //PHYSICSFORMULA_PYRAMID_H + +inline ld Pyramid::calculateVolume() const +{ + return 1.0/3.0*(lenght*width)*height; +} + +inline ld Pyramid::calculateSurfaceArea() const +{ + return lenght * width + lenght * (sqrt(pow((width / 2.0), 2) + height * height)) + + width * (sqrt(pow((lenght / 2.0), 2) + height * height)); +} + +inline auto Pyramid::setWidth(ld w) +{ + width = w; + volume = calculateVolume(); + surfaceArea = calculateSurfaceArea(); +} + +inline auto Pyramid::setLength(ld l) +{ + lenght = l; + volume = calculateVolume(); + surfaceArea = calculateSurfaceArea(); +} + +inline auto Pyramid::setHeight(ld h) +{ + height = h; + volume = calculateVolume(); + surfaceArea = calculateSurfaceArea(); +} + +inline auto Pyramid::getWeight(ld densityKgM) const +{ + return densityKgM * volume; +} + +inline void Pyramid::printPyramidInfo() const +{ + std::cout << "length: " << lenght << std::endl; + std::cout << "width: " << width << std::endl; + std::cout << "height: " << height << std::endl; + std::cout << "volume: " << volume << std::endl; + std::cout << "surface area: " << surfaceArea << std::endl; +} + + diff --git a/QuadTree.cpp b/QuadTree.cpp index 59305d0..4613548 100644 --- a/QuadTree.cpp +++ b/QuadTree.cpp @@ -1,362 +1,362 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#include "QuadTree.h" - -rez::QuadTree::QuadTree(const std::vector& _points) -{ - -} - -static void partition(rez::QDTNode* _parent, std::vector _points) { - if (_points.empty()) { - //_parent->isAEmptyNode = true; - _parent->isALeaf = true; - return; - } - else if (_points.size() == 1) { - _parent->point = _points[0]; - _parent->isALeaf = true; - return; - } - else { - // Calcualte the boundaries of each child using the bounds of the parent - auto box = _parent->box; - float x_mid = (box.x_min + box.x_max) / 2; - float y_mid = (box.y_min + box.y_max) / 2; - - rez::AABB boxNW{ box.x_min, x_mid, y_mid, box.y_max }; - rez::AABB boxNE{ x_mid, box.x_max, y_mid, box.y_max }; - rez::AABB boxSW{ box.x_min, x_mid, box.y_min, y_mid }; - rez::AABB boxSE{ x_mid, box.x_max, box.y_min, y_mid }; - - // Paritition the _points to four list. - std::vector pointsNW, pointsNE, pointsSW, pointsSE; - for (auto& point : _points) { - if (boxNW.isInside(point)) - pointsNW.push_back(point); - else if (boxNE.isInside(point)) - pointsNE.push_back(point); - else if (boxSW.isInside(point)) - pointsSW.push_back(point); - else - pointsSE.push_back(point); - } - - // Create 4 childs and set the bounds - auto nodeNW = new rez::QDTNode(); - auto nodeNE = new rez::QDTNode(); - auto nodeSW = new rez::QDTNode(); - auto nodeSE = new rez::QDTNode(); - - nodeNW->box = boxNW; - nodeNE->box = boxNE; - nodeSW->box = boxSW; - nodeSE->box = boxSE; - - // Do the recursive call. - partition(nodeNW, pointsNW); - partition(nodeNE, pointsNE); - partition(nodeSW, pointsSW); - partition(nodeSE, pointsSE); - - _parent->NW = nodeNW; - _parent->NE = nodeNE; - _parent->SW = nodeSW; - _parent->SE = nodeSE; - nodeNW->parent = _parent; - nodeNE->parent = _parent; - nodeSW->parent = _parent; - nodeSE->parent = _parent; - } -} - -static void addBoundariesToTheList(rez::QDTNode* _node, std::vector& _segList) { - //if (!_node->isALeaf && !_node->isAEmptyNode) { - if (!_node->isALeaf) { - auto box = _node->box; - float x_mid = (box.x_min + box.x_max) / 2; - float y_mid = (box.y_min + box.y_max) / 2; - - rez::Point2d bot_mid(x_mid, box.y_min); - rez::Point2d top_mid(x_mid, box.y_max); - rez::Point2d left_mid(box.x_min, y_mid); - rez::Point2d right_mid(box.x_max, y_mid); - - _segList.emplace_back(bot_mid, top_mid); - _segList.emplace_back(left_mid, right_mid); - - addBoundariesToTheList(_node->NW, _segList); - addBoundariesToTheList(_node->NE, _segList); - addBoundariesToTheList(_node->SW, _segList); - addBoundariesToTheList(_node->SE, _segList); - } -} - -static rez::QDTNode* northNeighbor(rez::QDTNode* _node, rez::QDTNode* _root) { - if (_node == _root) - return nullptr; - - if (_node == _node->parent->SW) - return _node->parent->NW; - - if (_node == _node->parent->SE) - return _node->parent->NE; - - auto u = northNeighbor(_node->parent, _root); - //if (!u || u->isALeaf || u->isAEmptyNode) - if (!u || u->isALeaf) - return u; - else if (_node == _node->parent->NW) - return u->SW; - else - return u->SE; -} - -static rez::QDTNode* southNeighbor(rez::QDTNode* _node, rez::QDTNode* _root) { - if (_node == _root) - return nullptr; - - if (_node == _node->parent->NW) - return _node->parent->SW; - - if (_node == _node->parent->NE) - return _node->parent->SE; - - auto u = southNeighbor(_node->parent, _root); - //if (!u || u->isALeaf || u->isAEmptyNode) - if (!u || u->isALeaf) - return u; - else if (_node == _node->parent->SW) - return u->NW; - else - return u->NE; -} - -static rez::QDTNode* eastNeighbor(rez::QDTNode* _node, rez::QDTNode* _root) { - if (_node == _root) - return nullptr; - - if (_node == _node->parent->NW) - return _node->parent->NE; - - if (_node == _node->parent->SW) - return _node->parent->SE; - - auto u = eastNeighbor(_node->parent, _root); - //if (!u || u->isALeaf || u->isAEmptyNode) - if (!u || u->isALeaf) - return u; - else if (_node == _node->parent->NE) - return u->NW; - else - return u->SW; -} - -static rez::QDTNode* westNeighbor(rez::QDTNode* _node, rez::QDTNode* _root) { - if (_node == _root) - return nullptr; - - if (_node == _node->parent->NE) - return _node->parent->NW; - - if (_node == _node->parent->SE) - return _node->parent->SW; - - auto u = westNeighbor(_node->parent, _root); - //if (!u || u->isALeaf || u->isAEmptyNode) - if (!u || u->isALeaf) - return u; - else if (_node == _node->parent->NW) - return u->NE; - else - return u->SE; -} - -rez::QuadTree::QuadTree(const std::vector& _points, AABB& bounds) -{ - if (_points.empty()) - return; - else { - root = new rez::QDTNode(); - root->box = bounds; - partition(root, _points); - } -} - -void balancing(rez::QDTNode* _node) { - -} - -static void getLeafNodes(rez::QDTNode* _node, std::vector& _leafs) { - if (!_node) - return; - //if (_node->isALeaf || _node->isAEmptyNode) - if (_node->isALeaf) - _leafs.push_back(_node); - else { - getLeafNodes(_node->NW, _leafs); - getLeafNodes(_node->NE, _leafs); - getLeafNodes(_node->SW, _leafs); - getLeafNodes(_node->SE, _leafs); - } -} - -static bool isEndNode(rez::QDTNode* _node) { - //if (_node && (_node->isALeaf || _node->isAEmptyNode)) - if (_node && (_node->isALeaf)) - return true; - return false; -} - -static bool needToSplit(rez::QDTNode* _node, rez::QDTNode* root) { - if (!_node) - return false; - - auto nNbor = northNeighbor(_node, root); - auto sNbor = southNeighbor(_node, root); - auto wNbor = westNeighbor(_node, root); - auto eNbor = eastNeighbor(_node, root); - - // Check if this leaf has to split - bool hasToSplit = false; - if (nNbor && !(nNbor->isALeaf) - && (!(nNbor->SW->isALeaf) || !(nNbor->SE->isALeaf))) { - hasToSplit = true; - } - else if (sNbor && !(sNbor->isALeaf) - && (!(sNbor->NW->isALeaf) || !(sNbor->NE->isALeaf))) { - hasToSplit = true; - } - else if (wNbor && !(wNbor->isALeaf) - && (!(wNbor->NE->isALeaf) || !(wNbor->SE->isALeaf))) { - hasToSplit = true; - } - else if (eNbor && !(eNbor->isALeaf) - && (!(eNbor->NW->isALeaf) || !(eNbor->SW->isALeaf))) { - hasToSplit = true; - } - - //if (nNbor && !(nNbor->isALeaf || nNbor->isAEmptyNode) - // && (!(nNbor->SW->isALeaf || nNbor->SW->isAEmptyNode) || !( nNbor->SE->isALeaf || nNbor->SE->isAEmptyNode))) { - // hasToSplit = true; - //} - //else if (sNbor && !(sNbor->isALeaf || sNbor->isAEmptyNode) - // && (!(sNbor->NW->isALeaf|| sNbor->NW->isAEmptyNode) || !(sNbor->NE->isALeaf || sNbor->NE->isAEmptyNode))) { - // hasToSplit = true; - //} - //else if (wNbor && !(wNbor->isALeaf || wNbor->isAEmptyNode) - // && (!(wNbor->NE->isALeaf || wNbor->NE->isAEmptyNode) || !(wNbor->SE->isALeaf || wNbor->SE->isAEmptyNode))) { - // hasToSplit = true; - //} - //else if (eNbor && !(eNbor->isALeaf || eNbor->isAEmptyNode) - // && (!(eNbor->NW->isALeaf || eNbor->NW->isAEmptyNode) || !(eNbor->SW->isALeaf || eNbor->SW->isAEmptyNode))) { - // hasToSplit = true; - //} - - return hasToSplit; -} - -void rez::QuadTree::BalanceTheTree() { - std::vector leafNodes; - getLeafNodes(root, leafNodes); - - while (!leafNodes.empty()) { - auto leaf = leafNodes.back(); - leafNodes.pop_back(); - - bool hasToSplit = needToSplit(leaf, root); - if (hasToSplit) { - // Split the this node in to four childs. - auto box = leaf->box; - float x_mid = (box.x_min + box.x_max) / 2; - float y_mid = (box.y_min + box.y_max) / 2; - - rez::AABB boxNW{ box.x_min, x_mid, y_mid, box.y_max }; - rez::AABB boxNE{ x_mid, box.x_max, y_mid, box.y_max }; - rez::AABB boxSW{ box.x_min, x_mid, box.y_min, y_mid }; - rez::AABB boxSE{ x_mid, box.x_max, box.y_min, y_mid }; - - // Create 4 childs and set the bounds - auto nodeNW = new rez::QDTNode(); - auto nodeNE = new rez::QDTNode(); - auto nodeSW = new rez::QDTNode(); - auto nodeSE = new rez::QDTNode(); - - nodeNW->box = boxNW; - nodeNE->box = boxNE; - nodeSW->box = boxSW; - nodeSE->box = boxSE; - - nodeNW->isALeaf = true; - nodeNE->isALeaf = true; - nodeSW->isALeaf = true; - nodeSE->isALeaf = true; - - if (boxNW.isInside(leaf->point)) - nodeNW->point = leaf->point; - else if (boxNE.isInside(leaf->point)) - nodeNE->point = leaf->point; - else if (boxSW.isInside(leaf->point)) - nodeSW->point = leaf->point; - else - nodeSE->point = leaf->point; - - leaf->NW = nodeNW; - leaf->NE = nodeNE; - leaf->SW = nodeSW; - leaf->SE = nodeSE; - nodeNW->parent = leaf; - nodeNE->parent = leaf; - nodeSW->parent = leaf; - nodeSE->parent = leaf; - - //Leaf is no longer a empty node or a leaf node - leaf->isALeaf = false; - - leafNodes.push_back(nodeNW); - leafNodes.push_back(nodeNE); - leafNodes.push_back(nodeSW); - leafNodes.push_back(nodeSE); - - // Check if neighbours have to split or not - auto nNbor = northNeighbor(leaf, root); - auto sNbor = southNeighbor(leaf, root); - auto wNbor = westNeighbor(leaf, root); - auto eNbor = eastNeighbor(leaf, root); - - if (isEndNode(nNbor) && needToSplit(nNbor, root)) - leafNodes.push_back(nNbor); - - if (isEndNode(sNbor) && needToSplit(sNbor, root)) - leafNodes.push_back(sNbor); - - if (isEndNode(eNbor) && needToSplit(eNbor, root)) - leafNodes.push_back(eNbor); - - if (isEndNode(wNbor) && needToSplit(wNbor, root)) - leafNodes.push_back(wNbor); - } - } -} - -void rez::QuadTree::GenerateMesh() -{ -} - -void rez::QuadTree::GetUniqueSegmentList(std::vector& _segList) { - if (root) { - auto box = root->box; - Point2d bot_left(box.x_min, box.y_min); - Point2d bot_right(box.x_max, box.y_min); - Point2d top_left(box.x_min, box.y_max); - Point2d top_right(box.x_max, box.y_max); - _segList.emplace_back(bot_left, bot_right); - _segList.emplace_back(bot_right, top_right); - _segList.emplace_back(top_right, top_left); - _segList.emplace_back(top_left, bot_left); - - addBoundariesToTheList(root, _segList); - } +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#include "QuadTree.h" + +rez::QuadTree::QuadTree(const std::vector& _points) +{ + +} + +static void partition(rez::QDTNode* _parent, std::vector _points) { + if (_points.empty()) { + //_parent->isAEmptyNode = true; + _parent->isALeaf = true; + return; + } + else if (_points.size() == 1) { + _parent->point = _points[0]; + _parent->isALeaf = true; + return; + } + else { + // Calcualte the boundaries of each child using the bounds of the parent + auto box = _parent->box; + float x_mid = (box.x_min + box.x_max) / 2; + float y_mid = (box.y_min + box.y_max) / 2; + + rez::AABB boxNW{ box.x_min, x_mid, y_mid, box.y_max }; + rez::AABB boxNE{ x_mid, box.x_max, y_mid, box.y_max }; + rez::AABB boxSW{ box.x_min, x_mid, box.y_min, y_mid }; + rez::AABB boxSE{ x_mid, box.x_max, box.y_min, y_mid }; + + // Paritition the _points to four list. + std::vector pointsNW, pointsNE, pointsSW, pointsSE; + for (auto& point : _points) { + if (boxNW.isInside(point)) + pointsNW.push_back(point); + else if (boxNE.isInside(point)) + pointsNE.push_back(point); + else if (boxSW.isInside(point)) + pointsSW.push_back(point); + else + pointsSE.push_back(point); + } + + // Create 4 childs and set the bounds + auto nodeNW = new rez::QDTNode(); + auto nodeNE = new rez::QDTNode(); + auto nodeSW = new rez::QDTNode(); + auto nodeSE = new rez::QDTNode(); + + nodeNW->box = boxNW; + nodeNE->box = boxNE; + nodeSW->box = boxSW; + nodeSE->box = boxSE; + + // Do the recursive call. + partition(nodeNW, pointsNW); + partition(nodeNE, pointsNE); + partition(nodeSW, pointsSW); + partition(nodeSE, pointsSE); + + _parent->NW = nodeNW; + _parent->NE = nodeNE; + _parent->SW = nodeSW; + _parent->SE = nodeSE; + nodeNW->parent = _parent; + nodeNE->parent = _parent; + nodeSW->parent = _parent; + nodeSE->parent = _parent; + } +} + +static void addBoundariesToTheList(rez::QDTNode* _node, std::vector& _segList) { + //if (!_node->isALeaf && !_node->isAEmptyNode) { + if (!_node->isALeaf) { + auto box = _node->box; + float x_mid = (box.x_min + box.x_max) / 2; + float y_mid = (box.y_min + box.y_max) / 2; + + rez::Point2d bot_mid(x_mid, box.y_min); + rez::Point2d top_mid(x_mid, box.y_max); + rez::Point2d left_mid(box.x_min, y_mid); + rez::Point2d right_mid(box.x_max, y_mid); + + _segList.emplace_back(bot_mid, top_mid); + _segList.emplace_back(left_mid, right_mid); + + addBoundariesToTheList(_node->NW, _segList); + addBoundariesToTheList(_node->NE, _segList); + addBoundariesToTheList(_node->SW, _segList); + addBoundariesToTheList(_node->SE, _segList); + } +} + +static rez::QDTNode* northNeighbor(rez::QDTNode* _node, rez::QDTNode* _root) { + if (_node == _root) + return nullptr; + + if (_node == _node->parent->SW) + return _node->parent->NW; + + if (_node == _node->parent->SE) + return _node->parent->NE; + + auto u = northNeighbor(_node->parent, _root); + //if (!u || u->isALeaf || u->isAEmptyNode) + if (!u || u->isALeaf) + return u; + else if (_node == _node->parent->NW) + return u->SW; + else + return u->SE; +} + +static rez::QDTNode* southNeighbor(rez::QDTNode* _node, rez::QDTNode* _root) { + if (_node == _root) + return nullptr; + + if (_node == _node->parent->NW) + return _node->parent->SW; + + if (_node == _node->parent->NE) + return _node->parent->SE; + + auto u = southNeighbor(_node->parent, _root); + //if (!u || u->isALeaf || u->isAEmptyNode) + if (!u || u->isALeaf) + return u; + else if (_node == _node->parent->SW) + return u->NW; + else + return u->NE; +} + +static rez::QDTNode* eastNeighbor(rez::QDTNode* _node, rez::QDTNode* _root) { + if (_node == _root) + return nullptr; + + if (_node == _node->parent->NW) + return _node->parent->NE; + + if (_node == _node->parent->SW) + return _node->parent->SE; + + auto u = eastNeighbor(_node->parent, _root); + //if (!u || u->isALeaf || u->isAEmptyNode) + if (!u || u->isALeaf) + return u; + else if (_node == _node->parent->NE) + return u->NW; + else + return u->SW; +} + +static rez::QDTNode* westNeighbor(rez::QDTNode* _node, rez::QDTNode* _root) { + if (_node == _root) + return nullptr; + + if (_node == _node->parent->NE) + return _node->parent->NW; + + if (_node == _node->parent->SE) + return _node->parent->SW; + + auto u = westNeighbor(_node->parent, _root); + //if (!u || u->isALeaf || u->isAEmptyNode) + if (!u || u->isALeaf) + return u; + else if (_node == _node->parent->NW) + return u->NE; + else + return u->SE; +} + +rez::QuadTree::QuadTree(const std::vector& _points, AABB& bounds) +{ + if (_points.empty()) + return; + else { + root = new rez::QDTNode(); + root->box = bounds; + partition(root, _points); + } +} + +void balancing(rez::QDTNode* _node) { + +} + +static void getLeafNodes(rez::QDTNode* _node, std::vector& _leafs) { + if (!_node) + return; + //if (_node->isALeaf || _node->isAEmptyNode) + if (_node->isALeaf) + _leafs.push_back(_node); + else { + getLeafNodes(_node->NW, _leafs); + getLeafNodes(_node->NE, _leafs); + getLeafNodes(_node->SW, _leafs); + getLeafNodes(_node->SE, _leafs); + } +} + +static bool isEndNode(rez::QDTNode* _node) { + //if (_node && (_node->isALeaf || _node->isAEmptyNode)) + if (_node && (_node->isALeaf)) + return true; + return false; +} + +static bool needToSplit(rez::QDTNode* _node, rez::QDTNode* root) { + if (!_node) + return false; + + auto nNbor = northNeighbor(_node, root); + auto sNbor = southNeighbor(_node, root); + auto wNbor = westNeighbor(_node, root); + auto eNbor = eastNeighbor(_node, root); + + // Check if this leaf has to split + bool hasToSplit = false; + if (nNbor && !(nNbor->isALeaf) + && (!(nNbor->SW->isALeaf) || !(nNbor->SE->isALeaf))) { + hasToSplit = true; + } + else if (sNbor && !(sNbor->isALeaf) + && (!(sNbor->NW->isALeaf) || !(sNbor->NE->isALeaf))) { + hasToSplit = true; + } + else if (wNbor && !(wNbor->isALeaf) + && (!(wNbor->NE->isALeaf) || !(wNbor->SE->isALeaf))) { + hasToSplit = true; + } + else if (eNbor && !(eNbor->isALeaf) + && (!(eNbor->NW->isALeaf) || !(eNbor->SW->isALeaf))) { + hasToSplit = true; + } + + //if (nNbor && !(nNbor->isALeaf || nNbor->isAEmptyNode) + // && (!(nNbor->SW->isALeaf || nNbor->SW->isAEmptyNode) || !( nNbor->SE->isALeaf || nNbor->SE->isAEmptyNode))) { + // hasToSplit = true; + //} + //else if (sNbor && !(sNbor->isALeaf || sNbor->isAEmptyNode) + // && (!(sNbor->NW->isALeaf|| sNbor->NW->isAEmptyNode) || !(sNbor->NE->isALeaf || sNbor->NE->isAEmptyNode))) { + // hasToSplit = true; + //} + //else if (wNbor && !(wNbor->isALeaf || wNbor->isAEmptyNode) + // && (!(wNbor->NE->isALeaf || wNbor->NE->isAEmptyNode) || !(wNbor->SE->isALeaf || wNbor->SE->isAEmptyNode))) { + // hasToSplit = true; + //} + //else if (eNbor && !(eNbor->isALeaf || eNbor->isAEmptyNode) + // && (!(eNbor->NW->isALeaf || eNbor->NW->isAEmptyNode) || !(eNbor->SW->isALeaf || eNbor->SW->isAEmptyNode))) { + // hasToSplit = true; + //} + + return hasToSplit; +} + +void rez::QuadTree::BalanceTheTree() { + std::vector leafNodes; + getLeafNodes(root, leafNodes); + + while (!leafNodes.empty()) { + auto leaf = leafNodes.back(); + leafNodes.pop_back(); + + bool hasToSplit = needToSplit(leaf, root); + if (hasToSplit) { + // Split the this node in to four childs. + auto box = leaf->box; + float x_mid = (box.x_min + box.x_max) / 2; + float y_mid = (box.y_min + box.y_max) / 2; + + rez::AABB boxNW{ box.x_min, x_mid, y_mid, box.y_max }; + rez::AABB boxNE{ x_mid, box.x_max, y_mid, box.y_max }; + rez::AABB boxSW{ box.x_min, x_mid, box.y_min, y_mid }; + rez::AABB boxSE{ x_mid, box.x_max, box.y_min, y_mid }; + + // Create 4 childs and set the bounds + auto nodeNW = new rez::QDTNode(); + auto nodeNE = new rez::QDTNode(); + auto nodeSW = new rez::QDTNode(); + auto nodeSE = new rez::QDTNode(); + + nodeNW->box = boxNW; + nodeNE->box = boxNE; + nodeSW->box = boxSW; + nodeSE->box = boxSE; + + nodeNW->isALeaf = true; + nodeNE->isALeaf = true; + nodeSW->isALeaf = true; + nodeSE->isALeaf = true; + + if (boxNW.isInside(leaf->point)) + nodeNW->point = leaf->point; + else if (boxNE.isInside(leaf->point)) + nodeNE->point = leaf->point; + else if (boxSW.isInside(leaf->point)) + nodeSW->point = leaf->point; + else + nodeSE->point = leaf->point; + + leaf->NW = nodeNW; + leaf->NE = nodeNE; + leaf->SW = nodeSW; + leaf->SE = nodeSE; + nodeNW->parent = leaf; + nodeNE->parent = leaf; + nodeSW->parent = leaf; + nodeSE->parent = leaf; + + //Leaf is no longer a empty node or a leaf node + leaf->isALeaf = false; + + leafNodes.push_back(nodeNW); + leafNodes.push_back(nodeNE); + leafNodes.push_back(nodeSW); + leafNodes.push_back(nodeSE); + + // Check if neighbours have to split or not + auto nNbor = northNeighbor(leaf, root); + auto sNbor = southNeighbor(leaf, root); + auto wNbor = westNeighbor(leaf, root); + auto eNbor = eastNeighbor(leaf, root); + + if (isEndNode(nNbor) && needToSplit(nNbor, root)) + leafNodes.push_back(nNbor); + + if (isEndNode(sNbor) && needToSplit(sNbor, root)) + leafNodes.push_back(sNbor); + + if (isEndNode(eNbor) && needToSplit(eNbor, root)) + leafNodes.push_back(eNbor); + + if (isEndNode(wNbor) && needToSplit(wNbor, root)) + leafNodes.push_back(wNbor); + } + } +} + +void rez::QuadTree::GenerateMesh() +{ +} + +void rez::QuadTree::GetUniqueSegmentList(std::vector& _segList) { + if (root) { + auto box = root->box; + Point2d bot_left(box.x_min, box.y_min); + Point2d bot_right(box.x_max, box.y_min); + Point2d top_left(box.x_min, box.y_max); + Point2d top_right(box.x_max, box.y_max); + _segList.emplace_back(bot_left, bot_right); + _segList.emplace_back(bot_right, top_right); + _segList.emplace_back(top_right, top_left); + _segList.emplace_back(top_left, bot_left); + + addBoundariesToTheList(root, _segList); + } } \ No newline at end of file diff --git a/QuadTree.h b/QuadTree.h index e37f932..89927c8 100644 --- a/QuadTree.h +++ b/QuadTree.h @@ -1,51 +1,51 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_QUADTREE_H -#define PHYSICSFORMULA_QUADTREE_H -#pragma once - -#include "Point.h" -#include "Segment.h" -#include "Boundries.h" - -#include - -namespace rez { - -#define NUM_POINTS 4 -#define INE 0 -#define INW 1 -#define ISE 2 -#define ISW 3 - - - struct QDTNode { - QDTNode* NE = nullptr, * NW = nullptr, * SE = nullptr, * SW = nullptr; - QDTNode* parent = nullptr; - AABB box{}; - Point2d point = DEFAULT_POINT_2D; - bool isALeaf = false; - //bool isAEmptyNode = false; - }; - - class QuadTree { - - QDTNode* root = nullptr; - - public: - QuadTree() = default; - - explicit QuadTree(const std::vector& _points); - - QuadTree(const std::vector& _points, AABB& bounds); - - void BalanceTheTree(); - - void GenerateMesh(); - - void GetUniqueSegmentList(std::vector& _segList); - }; -} -#endif //PHYSICSFORMULA_QUADTREE_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_QUADTREE_H +#define PHYSICSFORMULA_QUADTREE_H +#pragma once + +#include "Point.h" +#include "Segment.h" +#include "Boundries.h" + +#include + +namespace rez { + +#define NUM_POINTS 4 +#define INE 0 +#define INW 1 +#define ISE 2 +#define ISW 3 + + + struct QDTNode { + QDTNode* NE = nullptr, * NW = nullptr, * SE = nullptr, * SW = nullptr; + QDTNode* parent = nullptr; + AABB box{}; + Point2d point = DEFAULT_POINT_2D; + bool isALeaf = false; + //bool isAEmptyNode = false; + }; + + class QuadTree { + + QDTNode* root = nullptr; + + public: + QuadTree() = default; + + explicit QuadTree(const std::vector& _points); + + QuadTree(const std::vector& _points, AABB& bounds); + + void BalanceTheTree(); + + void GenerateMesh(); + + void GetUniqueSegmentList(std::vector& _segList); + }; +} +#endif //PHYSICSFORMULA_QUADTREE_H diff --git a/QuantumPhysics.h b/QuantumPhysics.h index e0451b1..935af38 100644 --- a/QuantumPhysics.h +++ b/QuantumPhysics.h @@ -1,955 +1,955 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_QUANTUMPHYSICS_H -#define PHYSICSFORMULA_QUANTUMPHYSICS_H -#include "SpecialRelativity.h" -#include - -static int quantum_objectCount = 0; -//α=224,ß=225,π=227,Σ=228,σ=229,µ=230,τ=231,phi=232,Θ=233 -//Ω=234,delta=235,∞=236,phi=237,ε=238,∩=239,≡=240,gamma=226,gamma, σ, ϑ, Å, Ώ, lambda, gamma, delta -/** - * @class QuantumPhysics - * @details class of static methods that relate to chapter 29 of the open-stax - * college physics text book. - * @author Ryan Zurrin - * dateBuilt 5/15/2021 - * lastEdit 6/8/2021 - */ - -class QuantumPhysics : - public SpecialRelativity -{ - -public: - QuantumPhysics* _quantumPtr; - - QuantumPhysics() - { - _quantumPtr = nullptr; - quantumVar = 0.0; - countIncrease(); - } - - /** - * @brief copy constructor - */ - QuantumPhysics(const QuantumPhysics& t) - { - _quantumPtr = t._quantumPtr; - quantumVar = t.quantumVar; - countIncrease(); - } - /** - * #brief move constructor - */ - QuantumPhysics(QuantumPhysics&& t) noexcept - { - _quantumPtr = t._quantumPtr; - quantumVar = t.quantumVar; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - QuantumPhysics& operator=(QuantumPhysics&& t) noexcept - { - if (this != &t) - { - _quantumPtr = t._quantumPtr; - quantumVar = t.quantumVar; - countIncrease(); - } - return *this; - } - - static void show_objectCount() { std::cout << "\n quantum object count: " - << quantum_objectCount << std::endl; } - static int get_objectCount() { return quantum_objectCount; } - - - ~QuantumPhysics() - { - delete _quantumPtr; - } - void setTemplateVar(ld var) { quantumVar = var; } - auto getTemplateVar() const { return quantumVar; } - - /// - /// A LiBr molecule oscillates with a frequency of 1.7×10^13 Hz(f). Calculate - /// the difference in energy in eV between allowed oscillator states. - /// - /// The frequency (Hz). - /// Energy between oscillator states in eV - template - static constexpr auto energyBetweenOscillatorStates_eM(const T f); - - /// - /// Calculates the energy in joules a photon in a radio wave from - /// an AM station that has a 1530-kHz(f) broadcast frequency - /// - /// The frequency. - /// Energy in Joules - template - static constexpr auto energy_J(const T f); - - /// - /// Calculates the energy in eV of a photon in a radio wave from - /// an AM station that has a 1530-kHz(f) broadcast frequency - /// - /// The frequency. - /// Energy in eV - template - static constexpr auto energy_eM(const T f); - - /// - /// A physicist is watching a 15-kg orangutan at a zoo swing lazily in a - /// tire at the end of a rope. He (the physicist) notices that each - /// oscillation takes 3.00 s(time) and hypothesizes that the energy is - /// quantized. Calculate the difference in energy in joules between allowed - /// oscillator states - /// - /// The time. - /// energy between oscillator states in joules - template - static constexpr auto energyBetweenOscillatorStates_J(const T time); - - /// - /// A LiBr molecule oscillates with a frequency of 1.7×1013 Hz(frequency). - /// Calculate the approximate value of n for a state having an - /// energy of 1.0 eV(energy). - /// - /// The frequency. - /// The energy. - /// the n state, where n is some whole number - template - static constexpr auto valueOf_nState_f(const F frequency, const E energy); - - /// - /// A physicist is watching a 15-kg orangutan at a zoo swing lazily in a - /// tire at the end of a rope. He (the physicist) notices that each - /// oscillation takes 3.00 s(time) and hypothesizes that the energy is quantized. - /// Calculate the value of n for a state where the energy is 5.00 J?(energy) - /// - /// The time. - /// The energy. - /// the n state, where n is some whole number - template - static constexpr auto valueOf_nState_t(const T time, const E energy); - - /// - /// The difference in energy between allowed oscillator states in HBr - /// molecules is 0.330 eV(energy). What is the oscillation frequency of - /// this molecule? - /// - /// The energy. - /// frequency between oscillation states - template - static constexpr auto oscillationFrequency(const E energy); - - /// - /// Calculate the longest-wavelength EM radiation that can eject a - /// photo-electron from silver, given that the binding energy is 4.73 eV(BE) - /// Is this in the visible range? - /// - /// The binding energy. - /// longest wavelength - template - static constexpr auto longestWavelength_eMRadiationEjection(const T BE); - - /// - /// What is the binding energy in eV of electrons in magnesium, if the - /// longest-wavelength photon that can eject electrons is 337 nm(lambda) - /// - /// The wavelength(lambda). - /// binding energy - template - static constexpr auto bindingEnergy(const T lambda); - - /// - /// Calculates the binding energy in joules. - /// - /// The lambda. - /// energy in joules - template - static constexpr auto bindingEnergy_Joules(const T lambda); - - /// - /// Violet light of wavelength 400 nm(lambda) ejects electrons with a maximum - /// kinetic energy of 0.860 eV(KE) from sodium metal. Calculate the binding - /// energy of electrons to sodium metal - /// - /// The wavelength lambda. - /// The kinetic energy. - /// binding energy (eV) - template - static constexpr auto bindingEnergy(const T lambda, const K KE); - - /// - /// Bindings the energy f. - /// - /// The f. - /// The ke. - /// - template - static constexpr auto bindingEnergy_f(const T f, const K KE); - - /// - /// Calculate the maximum kinetic energy in eV of electrons ejected from - /// sodium metal by 450-nm EM(lambda) radiation, given that the binding energy - /// is 2.28 eV?(BE) - /// - /// The lambda. - /// The be. - /// - template - static constexpr auto maximumKineticEnergy(const T lambda, const B BE); - - /// - /// Maximums the kinetic energy f. - /// - /// The f. - /// The be. - /// - template - static constexpr auto maximumKineticEnergy_f(const T f, const B BE); - - /// - ///Calculate the wavelength of EM radiation that ejects 2.00-eV(KE) electrons - /// from calcium metal, given that the binding energy is 2.71 eV(BE). - /// - /// The kinetic energy. - /// The binding energy. - /// wavelength - template - static constexpr auto wavelength(const K KE, const B BE); - - /// - /// Calculates the wavelength of a 1.00-eV(E) photon - /// - /// The Energy. - /// wavelength lambda - template - static constexpr auto wavelength(const T E); - - /// - /// Calculate the maximum velocity of electrons(m) ejected from a material by - /// 80-nm photons( lambda), if they are bound to the material by 4.73 eV(BE) - /// - /// The lambda. - /// The mass. - /// The binding energy. - /// maximum velocity - template - static constexpr auto maximumVelocity(const T lambda, const M m, const B BE); - - /// - /// Photoelectrons(m) from a material with a binding energy of 2.71 eV(BE) are - /// ejected by 420-nm(lambda) photons. Once ejected, how long does it take these - /// electrons to travel 2.50 cm(dis) to a detection device - /// - /// The lambda. - /// The m. - /// The be. - /// The dis. - /// - template - static constexpr auto timeToTravelDistance(const T lambda, const M m, const B BE, const D dis); - - /// - /// A laser with a power output of 2.00 mW(P) at a wavelength of 400 nm(lambda) - /// is projected onto calcium metal. Calculate How many electrons per second - /// are ejected. - /// - /// The wavelength lambda. - /// The power output. - /// how many electrons per second are ejected - template - static constexpr auto electronsPerSecondEjected(const T lambda, const P P_); - - /// - /// Calculate the number of photoelectrons per second ejected from a - /// 1.00 mm^2 area(A) of sodium metal by 500-nm EM(lambda) radiation having an - /// intensity of 1.30 kW/m2(I) (the intensity of sunlight above the - /// Earth’s atmosphere) - /// - /// area. - /// The wavelength lambda. - /// The intensity. - /// - template - static constexpr auto photoelectronsPerSecondEjected(const T A, const T lambda, const T I); - - /// - /// A laser with a power output of 2.00 mW(P) at a wavelength of 400 nm(lambda) - /// is projected onto calcium metal. What power is carried away by the - /// electrons, given that the binding energy is 2.71 eV(BE). - /// - /// The wavelength lambda. - /// The power output. - /// The binding energy. - /// power carried away by the electrons (W) - template - static constexpr auto powerCarriedAwayByElectrons(const T lambda, const T P, const T BE); - - /// - /// If the number of photoelectrons per second ejected from a - /// 1.00 mm^2 area of sodium metal by 500-nm EM radiation having an - /// intensity of 1.30 kW/m2 as well as a binding energy is 2.28 eV, - /// calculate the power that is carried away by the electrons. - /// - /// a. - /// The lambda. - /// The i. - /// The be. - /// - template - static constexpr auto powerCarriedAwayByElectrons(const T A, const T lambda, const T I, const T BE); - - /// - /// Calculates the frequency in hertz of a 1.00-MeV(E) gamma-ray photon. - /// - /// The Energy. - /// the frequency in (Hz) - template - static constexpr auto frequency_fromE(const T E); - - /// - /// Calculate the energy in eV of an IR photon of frequency 2.00×10^13 Hz. - /// How many of these photons would need to be absorbed simultaneously by - /// a tightly bound molecule to break it apart - /// - /// The e tot. - /// The e. - /// number of photons - template - static constexpr auto numberOfSimultaneouslyAbsorbedPhotons(T E_tot, T E); - - /// - /// Numbers the of tightly bound molecules gamma ray can break apart. - /// - /// The e tot. - /// The e. - /// - template - static constexpr auto numOfTightlyBoundMolecules_gammaRayCanBreakApart(T E_tot, T E); - - /// - /// What is the accelerating voltage of an x-ray tube that produces x-rays - /// with a shortest wavelength of lambda nm? - /// - /// The wavelength lambda. - /// The charge. - /// accelerating voltage - template - static constexpr auto acceleratingVoltage(const T lambda, const T q); - - /// - /// Calculate the maximum energy in eV of photons produced in a CRT using a - /// 25.0-kV(volts) accelerating potential, such as a color TV - /// - /// The charge of a proton or other molecule. - /// The volts. - /// the max energy produced - template - static constexpr auto energyMax_eV(const Q q, const V volts); - - /// - /// Calculate the ratio of power outputs by two microwave ovens having - /// frequencies of f_1 and f_2 Hz, if they emit the same number of - /// photons per second - /// - /// The first frequency. - /// The second frequency. - /// ratio of the frequency - template - static constexpr auto ratioOf_frequencies(const F f_1, const F f_2); - - - /// - /// calculate the ratio of photons per second if two microwave ovens having - /// frequencies of f_1 and f_2 Hz have the same power output - /// - /// The f 1. - /// The f 2. - /// ratio of photons per second - template - static constexpr auto ratioOf_photonsPerSecond(const F f_1, const F f_2); - - /// - /// Calculate how many photons per second are emitted by the antenna of a microwave - /// oven, if its power output is P_ at a frequency of f Hz - /// - /// The power. - /// The frequency. - /// number of photons per second emittedgamma - template - static constexpr auto photonsPerSecondEmitted(const P P_, const F f); - - /// - /// Some satellites use nuclear power. If such a satellite emits a - /// 1.00-W(P_) flux of gamma rays having an average energy of 0.500 MeV(E_), - /// Calculate how many are emitted per second. - /// - /// The power. - /// The energy. - /// gamma rays emitted per second - template - static constexpr auto gammaRaysPerSecondEmitted(const P P_, const E E_); - - /// - /// Some satellites use nuclear power. If such a satellite emits a - /// 1.00-W(P_) flux of gamma rays having an average energy of 0.500 MeV(E_), - /// Using the number of emitted per second and that these gamma rays affect other - /// satellites. Calculate how far away must another satellite be to only - /// receive one gamma ray per second per square meter. - /// - /// The power. - /// The energy. - /// The phi or number of gamma rays per second received by - /// satellite. - /// radius r, or distance away - template - static constexpr auto distanceBetween2Satellites(const P P_, const E E_, const F phi); - - /// - /// Find the momentum of a 4.00-cm-wavelength(lambda) microwave photon - /// - /// The wavelength lambda. - /// photon momentum - template - static constexpr auto photonMomentum(const W lambda); - - /// - /// Find the momentum of a 100-keV(E_) x-ray photon - /// - /// The e. - /// - template - static constexpr auto momentum_fromEnergy(const E E_); - - /// - /// the momentum of a photon is p for which it can - /// detect details of an atom. What is its energy in eV - /// - /// The momentum. - /// energy in eV - template - static constexpr auto energy_fromMomentum(const P p); - - /// - /// What is the wavelength of a photon that has a momentum of 5.00×10−29 kg⋅m/s? . - /// - /// The momentum. - /// wavelength - template - static constexpr auto wavelength_fromMomentum(const P p); - - /// - /// Velocities from momentum. - /// - /// The p. - /// The m. - /// - template - static constexpr auto velocityFromMomentum(const P p, const M m); - - /// - /// Kinetics the energy. - /// - /// The m. - /// The v. - /// - template - static constexpr auto kineticEnergy(const M m, const V v); - - /// - /// Calculate the kinetic energy of an electron in a TEM having a 0.0100-nm - /// wavelength - /// - /// The mass. - /// The wavelength lambda. - /// the kinetic energy - template - static constexpr auto kineticEnergy_fromWavelength(const M m, const W lambda); - - /// - /// Calculate at what velocity an electron will have a wavelength of lambda - /// - /// The wavelength lambda. - /// velocity of electron - template - static constexpr auto electronVelocity(const W lambda); - - /// - /// Calculate the velocity of a 0.400-kg(m) billiard ball if its wavelength - /// is 7.50 cm(lambda) (large enough for it to interfere with other billiard balls - /// - /// The mass. - /// The wavelength lambda. - /// - template - static constexpr auto objectVelocity(const M m, const W lambda); - - /// - /// What is the wavelength of an electron moving at 3.00%(percentOfLightSpeed) - /// of the speed of light - /// - /// The percent of light speed. - /// - template - static constexpr auto electronWavelength_movingAtPercentSpeedOfLight( - const V percentOfLightSpeed - ); - - - /// - /// Find the wavelength of a particle of mass m moving at the speed of v - /// - /// The m. - /// The speed. - /// - template - static constexpr auto deBrogile_wavelength(const M m, const V v); - - /// - /// Calculate the wavelength of an electron(m,q) accelerated through a - /// 30.0-kV(v) potential, as in a TV tube? - /// - /// The mass of particle. - /// The charge of particle. - /// The voltage accelerated through. - /// the wavelength - template - static constexpr auto wavelengthParticleAcceleratedThroughVoltageOf( - const M m, const Q q, const V v - ); - - /// - /// Calculate through what voltage must an electron be accelerated to have - /// a speed of (velocity) - /// - /// The mass of particle. - /// The charge of particle. - /// The velocity. - /// voltage accelerated through to have certain speed - template - static constexpr auto voltageToHaveVelocityOf(const M m, const Q q, const V velocity); - - /// - /// If the position of an electron in a membrane is measured to an - /// accuracy of 1.00 μm(x), what is the electron’s(m) minimum uncertainty - /// in velocity - /// - /// The accuracy of measurement. - /// The mass. - /// minimum uncertainty of velocity - template - static constexpr auto min_uncertaintyInVelocity(const XX x, const M m); - - /// - /// Suppose the velocity of an electron(m) in an atom is known to an accuracy - /// of 2.0×10^3 m/s(v) (reasonably accurate compared with orbital velocities). - /// Calculate the electron’s minimum uncertainty in position - /// - /// The velocity. - /// The mass. - /// minimum uncertainty in position - template - static constexpr auto min_uncertaintyInPosition(const V v, const M m); - - /// - /// A relatively long-lived excited state of an atom has a lifetime of - /// 3.00 ms(t). What is the minimum uncertainty in its energy - /// - /// The t. - /// minimum uncertainty in energy - template - static constexpr auto min_uncertaintyInEnergy(const T t); - - /// - /// The decay energy of a short-lived particle has an uncertainty of - /// 1.0 MeV(E_) due to its short lifetime. Calculate the smallest lifetime - /// it can have - /// - /// The energy. - /// minimum possible lifespan of particle - template - static constexpr auto min_uncertaintyInLifetime(const E E_); - - /// - /// What is the approximate uncertainty in the mass of a muon, as - /// determined from its decay lifetime(t). - /// - /// The decay time. - /// uncertainty in mass - template - static constexpr auto min_uncertaintyInMass(const T t); - - /// - /// A certain heat lamp has a binding energy of E_. - /// How many of these photons are required to increase the temperature - /// of a object by delta_temp∘ , assuming the affected object is has a mass kg - /// with a specific heat of specHeat⋅C∘. Also assume no other - /// significant heat transfer - /// - /// The mass. - /// The spec heat. - /// The delta temporary. - /// The e. - /// - template - static constexpr auto photonsRequiredToIncreaseTemperature( - const M mass, const C specHeat, const T delta_temp, const E E_ - ); - - /// - /// A certain heat lamp emits 200 W of mostly IR radiation averaging - /// 1500 nm in wavelength. How many of these photons are required to - /// increase the temperature of a person’s shoulder by 2.0C∘ , assuming - /// the affected mass is 4.0 kg with a specific heat of 0.83 kcal/kg⋅C∘. - /// Also assume no other significant heat transfer - /// - /// The watts. - /// The wavelength lambda. - /// The mass. - /// The specific heat. - /// The delta(change in) temperature. - /// total Number of photons to increase mass by - /// temperature specified - template - static constexpr auto photonsRequiredToIncreaseTemperature( - const P watts, const W lambda, const M mass, const C specHeat, const T delta_temp - ); - - -private: - ld quantumVar; - static void countIncrease() { quantum_objectCount += 1; } - static void countDecrease() { quantum_objectCount -= 1; } - - -}; - -#endif //PHYSICSFORMULA_QUANTUMPHYSICS_H - - -template -constexpr auto QuantumPhysics::energyBetweenOscillatorStates_eM(const T f) -{ - return _PLANKS_EM_ * f; -} - -template -inline constexpr auto QuantumPhysics::energy_J(const T f) -{ - return _PLANKS_J_ * f; -} - -template -inline constexpr auto QuantumPhysics::energy_eM(const T f) -{ - return _PLANKS_EM_ * f; -} - -template -constexpr auto QuantumPhysics::energyBetweenOscillatorStates_J(const T time) -{ - return _PLANKS_J_ * (1.0 / time); -} - -template -constexpr auto QuantumPhysics::valueOf_nState_f(const F frequency, const E energy) -{ - return round((energy / (_PLANKS_EM_ * frequency)) - (1 / 2)); -} - -template -constexpr auto QuantumPhysics::valueOf_nState_t(const T time, const E energy) -{ - return ((energy * time) / _PLANKS_J_) - 1 / 2; -} - -template -constexpr auto QuantumPhysics::oscillationFrequency(const E energy) -{ - return energy / _PLANKS_EM_; -} - -template -constexpr auto QuantumPhysics::longestWavelength_eMRadiationEjection(const T BE) -{ - return (_PLANKS_C_) / BE; -} - -template -constexpr auto QuantumPhysics::bindingEnergy(const T lambda) -{ - return (_PLANKS_C_) / lambda; -} - -template -constexpr auto QuantumPhysics::bindingEnergy_Joules(const T lambda) -{ - return (_PLANKS_J_ * _C_) / lambda; -} - -template -constexpr auto QuantumPhysics::bindingEnergy(const T lambda, const K KE) -{ - return ((_PLANKS_C_) / lambda) - KE; -} - -template -constexpr auto QuantumPhysics::bindingEnergy_f(const T f, const K KE) -{ - return (_PLANKS_J_*f) - KE; -} - -template -constexpr auto QuantumPhysics::maximumKineticEnergy(const T lambda, const B BE) -{ - return ((_PLANKS_C_)/ lambda) - BE; -} - -template -constexpr auto QuantumPhysics::maximumKineticEnergy_f(const T f, const B BE) -{ - return _PLANKS_EM_ * f - BE; -} - -template -constexpr auto QuantumPhysics::wavelength(const K KE, const B BE) -{ - return _PLANKS_C_ / (KE + BE); -} - -template -constexpr auto QuantumPhysics::wavelength(const T E) -{ - return _PLANKS_C_ / E; -} - -template -constexpr auto QuantumPhysics::maximumVelocity(const T lambda, const M m, const B BE) -{ - return sqrt((2.0 / m) * (((_PLANKS_J_*_C_) / lambda) - (BE*1.602e-19 ))); -} - -template -constexpr auto QuantumPhysics::timeToTravelDistance(const T lambda, const M m, const B BE, const D dis) -{ - return dis/sqrt((2.0 / m) * (((_PLANKS_J_ * _C_) / lambda) - (BE * 1.602e-19))); -} - -template -constexpr auto QuantumPhysics::electronsPerSecondEjected(const T lambda, const P P_) -{ - return (P_ * lambda) / (_PLANKS_J_ * _C_); -} - -template -constexpr auto QuantumPhysics::photoelectronsPerSecondEjected(const T A, const T lambda, const T I) -{ - return (I * (A * A) * lambda) / (_PLANKS_J_ * _C_); -} - -template -constexpr auto QuantumPhysics::powerCarriedAwayByElectrons(const T lambda, const T P, const T BE) -{ - return (((_PLANKS_J_ * _C_) / lambda) - (BE*1.602e-19)) * electronsPerSecondEjected(lambda, P); -} - -template -constexpr auto QuantumPhysics::powerCarriedAwayByElectrons(const T A, const T lambda, const T I, const T BE) -{ - return I * (A * A) * (1.0 - (BE * lambda) / _PLANKS_C_); -} - -template -constexpr auto QuantumPhysics::frequency_fromE(const T E) -{ - return E / _PLANKS_EM_; -} - -template -constexpr auto QuantumPhysics::numberOfSimultaneouslyAbsorbedPhotons(T E_tot, T E) -{ - return E_tot / E; -} - -template -constexpr auto QuantumPhysics::numOfTightlyBoundMolecules_gammaRayCanBreakApart(T E_tot, T E) -{ - return E / E_tot; -} - -template -constexpr auto QuantumPhysics::acceleratingVoltage(const T lambda, const T q) -{ - return (_PLANKS_J_ * _C_) / (q * lambda); -} - -template -constexpr auto QuantumPhysics::energyMax_eV(const Q q, const V volts) -{ - return q * volts * _JOULES2eV_; -} - -template -constexpr auto QuantumPhysics::ratioOf_frequencies(const F f_1, const F f_2) -{ - return static_cast( f_1) / static_cast( f_2); -} - -template -constexpr auto QuantumPhysics::ratioOf_photonsPerSecond(const F f_1, const F f_2) -{ - return static_cast( f_2) / static_cast( f_1); -} - -template -constexpr auto QuantumPhysics::photonsPerSecondEmitted(const P P_, const F f) -{ - return P_ / (_PLANKS_J_ * f); -} - -template -constexpr auto QuantumPhysics::gammaRaysPerSecondEmitted(const P P_, const E E_) -{ - return P_ / (E_ * _PROTON_CHARGE_); -} - -template -constexpr auto QuantumPhysics::distanceBetween2Satellites(const P P_, const E E_, const F phi) -{ - return sqrt(gammaRaysPerSecondEmitted(P_, E_) / (4.0 * Pi_ * phi)); -} - -template -constexpr auto QuantumPhysics::photonMomentum(const W lambda) -{ - return _PLANKS_J_ / lambda; -} - -template -constexpr auto QuantumPhysics::momentum_fromEnergy(const E E_) -{ - return (E_*_PROTON_CHARGE_) / _C_; -} - -template -constexpr auto QuantumPhysics::energy_fromMomentum(const P p) -{ - return p * _C_ * _JOULES2eV_; -} - -template -constexpr auto QuantumPhysics::wavelength_fromMomentum(const P p) -{ - return _PLANKS_J_ / p; -} - -template -constexpr auto QuantumPhysics::velocityFromMomentum(const P p, const M m) -{ - return p / m; -} - -template -constexpr auto QuantumPhysics::kineticEnergy(const M m, const V v) -{ - return (1.0 / 2.0) * m * (v * v); -} - -template -constexpr auto QuantumPhysics::kineticEnergy_fromWavelength(const M m, const W lambda) -{ - return pow(_PLANKS_J_, 2) / (2.0 * m * (lambda * lambda)) * _JOULES2eV_; -} - -template -constexpr auto QuantumPhysics::electronVelocity(const W lambda) -{ - return _PLANKS_J_ / (_ELECTRON_MASS_ * lambda); -} - -template -constexpr auto QuantumPhysics::objectVelocity(const M m, const W lambda) -{ - return _PLANKS_J_ / (m * lambda); -} - -template -constexpr auto QuantumPhysics::electronWavelength_movingAtPercentSpeedOfLight(const V percentOfLightSpeed) -{ - auto decimalVal = percentOfLightSpeed / 100.0; - return _PLANKS_J_ / (_ELECTRON_MASS_ * decimalVal * _C_); -} - -template -constexpr auto QuantumPhysics::deBrogile_wavelength(const M m, const V v) -{ - return _PLANKS_J_ / (m * v); -} - -template -constexpr auto QuantumPhysics::wavelengthParticleAcceleratedThroughVoltageOf(const M m, const Q q, const V v) -{ - return _PLANKS_J_ / (sqrt((2.0 * q * m * v))); -} - -template -constexpr auto QuantumPhysics::voltageToHaveVelocityOf(const M m, const Q q, const V velocity) -{ - return (m * (velocity * velocity)) / (2.0 * q); -} - -template -constexpr auto QuantumPhysics::min_uncertaintyInVelocity(const XX x, const M m) -{ - return _PLANKS_J_ / (4.0 * Pi_ * x * m); -} - -template -constexpr auto QuantumPhysics::min_uncertaintyInPosition(const V v, const M m) -{ - return _PLANKS_J_ / (4.0 * Pi_ * m * v); -} - -template -constexpr auto QuantumPhysics::min_uncertaintyInEnergy(const T t) -{ - return _PLANKS_EM_ / (4.0 * Pi_ * t); -} - -template -constexpr auto QuantumPhysics::min_uncertaintyInLifetime(const E E_) -{ - return _PLANKS_EM_ / (4.0 * Pi_ * E_); -} - -template -constexpr auto QuantumPhysics::min_uncertaintyInMass(const T t) -{ - return _PLANKS_J_ / (4.0 * Pi_ * (_C_ * _C_) * t); -} - -template -constexpr auto QuantumPhysics::photonsRequiredToIncreaseTemperature( - const M mass, const C specHeat, const T delta_temp, const E E_) -{ - return (mass * specHeat * delta_temp) / E_; -} - -template -constexpr auto QuantumPhysics::photonsRequiredToIncreaseTemperature( - const P watts, const W lambda, const M mass, const C specHeat, const T delta_temp) -{ - auto engJ = bindingEnergy_Joules(lambda); - return (mass * specHeat * delta_temp) / engJ; -} - - +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_QUANTUMPHYSICS_H +#define PHYSICSFORMULA_QUANTUMPHYSICS_H +#include "SpecialRelativity.h" +#include + +static int quantum_objectCount = 0; +//α=224,ß=225,π=227,Σ=228,σ=229,µ=230,τ=231,phi=232,Θ=233 +//Ω=234,delta=235,∞=236,phi=237,ε=238,∩=239,≡=240,gamma=226,gamma, σ, ϑ, Å, Ώ, lambda, gamma, delta +/** + * @class QuantumPhysics + * @details class of static methods that relate to chapter 29 of the open-stax + * college physics text book. + * @author Ryan Zurrin + * dateBuilt 5/15/2021 + * lastEdit 6/8/2021 + */ + +class QuantumPhysics : + public SpecialRelativity +{ + +public: + QuantumPhysics* _quantumPtr; + + QuantumPhysics() + { + _quantumPtr = nullptr; + quantumVar = 0.0; + countIncrease(); + } + + /** + * @brief copy constructor + */ + QuantumPhysics(const QuantumPhysics& t) + { + _quantumPtr = t._quantumPtr; + quantumVar = t.quantumVar; + countIncrease(); + } + /** + * #brief move constructor + */ + QuantumPhysics(QuantumPhysics&& t) noexcept + { + _quantumPtr = t._quantumPtr; + quantumVar = t.quantumVar; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + QuantumPhysics& operator=(QuantumPhysics&& t) noexcept + { + if (this != &t) + { + _quantumPtr = t._quantumPtr; + quantumVar = t.quantumVar; + countIncrease(); + } + return *this; + } + + static void show_objectCount() { std::cout << "\n quantum object count: " + << quantum_objectCount << std::endl; } + static int get_objectCount() { return quantum_objectCount; } + + + ~QuantumPhysics() + { + delete _quantumPtr; + } + void setTemplateVar(ld var) { quantumVar = var; } + auto getTemplateVar() const { return quantumVar; } + + /// + /// A LiBr molecule oscillates with a frequency of 1.7×10^13 Hz(f). Calculate + /// the difference in energy in eV between allowed oscillator states. + /// + /// The frequency (Hz). + /// Energy between oscillator states in eV + template + static constexpr auto energyBetweenOscillatorStates_eM(const T f); + + /// + /// Calculates the energy in joules a photon in a radio wave from + /// an AM station that has a 1530-kHz(f) broadcast frequency + /// + /// The frequency. + /// Energy in Joules + template + static constexpr auto energy_J(const T f); + + /// + /// Calculates the energy in eV of a photon in a radio wave from + /// an AM station that has a 1530-kHz(f) broadcast frequency + /// + /// The frequency. + /// Energy in eV + template + static constexpr auto energy_eM(const T f); + + /// + /// A physicist is watching a 15-kg orangutan at a zoo swing lazily in a + /// tire at the end of a rope. He (the physicist) notices that each + /// oscillation takes 3.00 s(time) and hypothesizes that the energy is + /// quantized. Calculate the difference in energy in joules between allowed + /// oscillator states + /// + /// The time. + /// energy between oscillator states in joules + template + static constexpr auto energyBetweenOscillatorStates_J(const T time); + + /// + /// A LiBr molecule oscillates with a frequency of 1.7×1013 Hz(frequency). + /// Calculate the approximate value of n for a state having an + /// energy of 1.0 eV(energy). + /// + /// The frequency. + /// The energy. + /// the n state, where n is some whole number + template + static constexpr auto valueOf_nState_f(const F frequency, const E energy); + + /// + /// A physicist is watching a 15-kg orangutan at a zoo swing lazily in a + /// tire at the end of a rope. He (the physicist) notices that each + /// oscillation takes 3.00 s(time) and hypothesizes that the energy is quantized. + /// Calculate the value of n for a state where the energy is 5.00 J?(energy) + /// + /// The time. + /// The energy. + /// the n state, where n is some whole number + template + static constexpr auto valueOf_nState_t(const T time, const E energy); + + /// + /// The difference in energy between allowed oscillator states in HBr + /// molecules is 0.330 eV(energy). What is the oscillation frequency of + /// this molecule? + /// + /// The energy. + /// frequency between oscillation states + template + static constexpr auto oscillationFrequency(const E energy); + + /// + /// Calculate the longest-wavelength EM radiation that can eject a + /// photo-electron from silver, given that the binding energy is 4.73 eV(BE) + /// Is this in the visible range? + /// + /// The binding energy. + /// longest wavelength + template + static constexpr auto longestWavelength_eMRadiationEjection(const T BE); + + /// + /// What is the binding energy in eV of electrons in magnesium, if the + /// longest-wavelength photon that can eject electrons is 337 nm(lambda) + /// + /// The wavelength(lambda). + /// binding energy + template + static constexpr auto bindingEnergy(const T lambda); + + /// + /// Calculates the binding energy in joules. + /// + /// The lambda. + /// energy in joules + template + static constexpr auto bindingEnergy_Joules(const T lambda); + + /// + /// Violet light of wavelength 400 nm(lambda) ejects electrons with a maximum + /// kinetic energy of 0.860 eV(KE) from sodium metal. Calculate the binding + /// energy of electrons to sodium metal + /// + /// The wavelength lambda. + /// The kinetic energy. + /// binding energy (eV) + template + static constexpr auto bindingEnergy(const T lambda, const K KE); + + /// + /// Bindings the energy f. + /// + /// The f. + /// The ke. + /// + template + static constexpr auto bindingEnergy_f(const T f, const K KE); + + /// + /// Calculate the maximum kinetic energy in eV of electrons ejected from + /// sodium metal by 450-nm EM(lambda) radiation, given that the binding energy + /// is 2.28 eV?(BE) + /// + /// The lambda. + /// The be. + /// + template + static constexpr auto maximumKineticEnergy(const T lambda, const B BE); + + /// + /// Maximums the kinetic energy f. + /// + /// The f. + /// The be. + /// + template + static constexpr auto maximumKineticEnergy_f(const T f, const B BE); + + /// + ///Calculate the wavelength of EM radiation that ejects 2.00-eV(KE) electrons + /// from calcium metal, given that the binding energy is 2.71 eV(BE). + /// + /// The kinetic energy. + /// The binding energy. + /// wavelength + template + static constexpr auto wavelength(const K KE, const B BE); + + /// + /// Calculates the wavelength of a 1.00-eV(E) photon + /// + /// The Energy. + /// wavelength lambda + template + static constexpr auto wavelength(const T E); + + /// + /// Calculate the maximum velocity of electrons(m) ejected from a material by + /// 80-nm photons( lambda), if they are bound to the material by 4.73 eV(BE) + /// + /// The lambda. + /// The mass. + /// The binding energy. + /// maximum velocity + template + static constexpr auto maximumVelocity(const T lambda, const M m, const B BE); + + /// + /// Photoelectrons(m) from a material with a binding energy of 2.71 eV(BE) are + /// ejected by 420-nm(lambda) photons. Once ejected, how long does it take these + /// electrons to travel 2.50 cm(dis) to a detection device + /// + /// The lambda. + /// The m. + /// The be. + /// The dis. + /// + template + static constexpr auto timeToTravelDistance(const T lambda, const M m, const B BE, const D dis); + + /// + /// A laser with a power output of 2.00 mW(P) at a wavelength of 400 nm(lambda) + /// is projected onto calcium metal. Calculate How many electrons per second + /// are ejected. + /// + /// The wavelength lambda. + /// The power output. + /// how many electrons per second are ejected + template + static constexpr auto electronsPerSecondEjected(const T lambda, const P P_); + + /// + /// Calculate the number of photoelectrons per second ejected from a + /// 1.00 mm^2 area(A) of sodium metal by 500-nm EM(lambda) radiation having an + /// intensity of 1.30 kW/m2(I) (the intensity of sunlight above the + /// Earth’s atmosphere) + /// + /// area. + /// The wavelength lambda. + /// The intensity. + /// + template + static constexpr auto photoelectronsPerSecondEjected(const T A, const T lambda, const T I); + + /// + /// A laser with a power output of 2.00 mW(P) at a wavelength of 400 nm(lambda) + /// is projected onto calcium metal. What power is carried away by the + /// electrons, given that the binding energy is 2.71 eV(BE). + /// + /// The wavelength lambda. + /// The power output. + /// The binding energy. + /// power carried away by the electrons (W) + template + static constexpr auto powerCarriedAwayByElectrons(const T lambda, const T P, const T BE); + + /// + /// If the number of photoelectrons per second ejected from a + /// 1.00 mm^2 area of sodium metal by 500-nm EM radiation having an + /// intensity of 1.30 kW/m2 as well as a binding energy is 2.28 eV, + /// calculate the power that is carried away by the electrons. + /// + /// a. + /// The lambda. + /// The i. + /// The be. + /// + template + static constexpr auto powerCarriedAwayByElectrons(const T A, const T lambda, const T I, const T BE); + + /// + /// Calculates the frequency in hertz of a 1.00-MeV(E) gamma-ray photon. + /// + /// The Energy. + /// the frequency in (Hz) + template + static constexpr auto frequency_fromE(const T E); + + /// + /// Calculate the energy in eV of an IR photon of frequency 2.00×10^13 Hz. + /// How many of these photons would need to be absorbed simultaneously by + /// a tightly bound molecule to break it apart + /// + /// The e tot. + /// The e. + /// number of photons + template + static constexpr auto numberOfSimultaneouslyAbsorbedPhotons(T E_tot, T E); + + /// + /// Numbers the of tightly bound molecules gamma ray can break apart. + /// + /// The e tot. + /// The e. + /// + template + static constexpr auto numOfTightlyBoundMolecules_gammaRayCanBreakApart(T E_tot, T E); + + /// + /// What is the accelerating voltage of an x-ray tube that produces x-rays + /// with a shortest wavelength of lambda nm? + /// + /// The wavelength lambda. + /// The charge. + /// accelerating voltage + template + static constexpr auto acceleratingVoltage(const T lambda, const T q); + + /// + /// Calculate the maximum energy in eV of photons produced in a CRT using a + /// 25.0-kV(volts) accelerating potential, such as a color TV + /// + /// The charge of a proton or other molecule. + /// The volts. + /// the max energy produced + template + static constexpr auto energyMax_eV(const Q q, const V volts); + + /// + /// Calculate the ratio of power outputs by two microwave ovens having + /// frequencies of f_1 and f_2 Hz, if they emit the same number of + /// photons per second + /// + /// The first frequency. + /// The second frequency. + /// ratio of the frequency + template + static constexpr auto ratioOf_frequencies(const F f_1, const F f_2); + + + /// + /// calculate the ratio of photons per second if two microwave ovens having + /// frequencies of f_1 and f_2 Hz have the same power output + /// + /// The f 1. + /// The f 2. + /// ratio of photons per second + template + static constexpr auto ratioOf_photonsPerSecond(const F f_1, const F f_2); + + /// + /// Calculate how many photons per second are emitted by the antenna of a microwave + /// oven, if its power output is P_ at a frequency of f Hz + /// + /// The power. + /// The frequency. + /// number of photons per second emittedgamma + template + static constexpr auto photonsPerSecondEmitted(const P P_, const F f); + + /// + /// Some satellites use nuclear power. If such a satellite emits a + /// 1.00-W(P_) flux of gamma rays having an average energy of 0.500 MeV(E_), + /// Calculate how many are emitted per second. + /// + /// The power. + /// The energy. + /// gamma rays emitted per second + template + static constexpr auto gammaRaysPerSecondEmitted(const P P_, const E E_); + + /// + /// Some satellites use nuclear power. If such a satellite emits a + /// 1.00-W(P_) flux of gamma rays having an average energy of 0.500 MeV(E_), + /// Using the number of emitted per second and that these gamma rays affect other + /// satellites. Calculate how far away must another satellite be to only + /// receive one gamma ray per second per square meter. + /// + /// The power. + /// The energy. + /// The phi or number of gamma rays per second received by + /// satellite. + /// radius r, or distance away + template + static constexpr auto distanceBetween2Satellites(const P P_, const E E_, const F phi); + + /// + /// Find the momentum of a 4.00-cm-wavelength(lambda) microwave photon + /// + /// The wavelength lambda. + /// photon momentum + template + static constexpr auto photonMomentum(const W lambda); + + /// + /// Find the momentum of a 100-keV(E_) x-ray photon + /// + /// The e. + /// + template + static constexpr auto momentum_fromEnergy(const E E_); + + /// + /// the momentum of a photon is p for which it can + /// detect details of an atom. What is its energy in eV + /// + /// The momentum. + /// energy in eV + template + static constexpr auto energy_fromMomentum(const P p); + + /// + /// What is the wavelength of a photon that has a momentum of 5.00×10−29 kg⋅m/s? . + /// + /// The momentum. + /// wavelength + template + static constexpr auto wavelength_fromMomentum(const P p); + + /// + /// Velocities from momentum. + /// + /// The p. + /// The m. + /// + template + static constexpr auto velocityFromMomentum(const P p, const M m); + + /// + /// Kinetics the energy. + /// + /// The m. + /// The v. + /// + template + static constexpr auto kineticEnergy(const M m, const V v); + + /// + /// Calculate the kinetic energy of an electron in a TEM having a 0.0100-nm + /// wavelength + /// + /// The mass. + /// The wavelength lambda. + /// the kinetic energy + template + static constexpr auto kineticEnergy_fromWavelength(const M m, const W lambda); + + /// + /// Calculate at what velocity an electron will have a wavelength of lambda + /// + /// The wavelength lambda. + /// velocity of electron + template + static constexpr auto electronVelocity(const W lambda); + + /// + /// Calculate the velocity of a 0.400-kg(m) billiard ball if its wavelength + /// is 7.50 cm(lambda) (large enough for it to interfere with other billiard balls + /// + /// The mass. + /// The wavelength lambda. + /// + template + static constexpr auto objectVelocity(const M m, const W lambda); + + /// + /// What is the wavelength of an electron moving at 3.00%(percentOfLightSpeed) + /// of the speed of light + /// + /// The percent of light speed. + /// + template + static constexpr auto electronWavelength_movingAtPercentSpeedOfLight( + const V percentOfLightSpeed + ); + + + /// + /// Find the wavelength of a particle of mass m moving at the speed of v + /// + /// The m. + /// The speed. + /// + template + static constexpr auto deBrogile_wavelength(const M m, const V v); + + /// + /// Calculate the wavelength of an electron(m,q) accelerated through a + /// 30.0-kV(v) potential, as in a TV tube? + /// + /// The mass of particle. + /// The charge of particle. + /// The voltage accelerated through. + /// the wavelength + template + static constexpr auto wavelengthParticleAcceleratedThroughVoltageOf( + const M m, const Q q, const V v + ); + + /// + /// Calculate through what voltage must an electron be accelerated to have + /// a speed of (velocity) + /// + /// The mass of particle. + /// The charge of particle. + /// The velocity. + /// voltage accelerated through to have certain speed + template + static constexpr auto voltageToHaveVelocityOf(const M m, const Q q, const V velocity); + + /// + /// If the position of an electron in a membrane is measured to an + /// accuracy of 1.00 μm(x), what is the electron’s(m) minimum uncertainty + /// in velocity + /// + /// The accuracy of measurement. + /// The mass. + /// minimum uncertainty of velocity + template + static constexpr auto min_uncertaintyInVelocity(const XX x, const M m); + + /// + /// Suppose the velocity of an electron(m) in an atom is known to an accuracy + /// of 2.0×10^3 m/s(v) (reasonably accurate compared with orbital velocities). + /// Calculate the electron’s minimum uncertainty in position + /// + /// The velocity. + /// The mass. + /// minimum uncertainty in position + template + static constexpr auto min_uncertaintyInPosition(const V v, const M m); + + /// + /// A relatively long-lived excited state of an atom has a lifetime of + /// 3.00 ms(t). What is the minimum uncertainty in its energy + /// + /// The t. + /// minimum uncertainty in energy + template + static constexpr auto min_uncertaintyInEnergy(const T t); + + /// + /// The decay energy of a short-lived particle has an uncertainty of + /// 1.0 MeV(E_) due to its short lifetime. Calculate the smallest lifetime + /// it can have + /// + /// The energy. + /// minimum possible lifespan of particle + template + static constexpr auto min_uncertaintyInLifetime(const E E_); + + /// + /// What is the approximate uncertainty in the mass of a muon, as + /// determined from its decay lifetime(t). + /// + /// The decay time. + /// uncertainty in mass + template + static constexpr auto min_uncertaintyInMass(const T t); + + /// + /// A certain heat lamp has a binding energy of E_. + /// How many of these photons are required to increase the temperature + /// of a object by delta_temp∘ , assuming the affected object is has a mass kg + /// with a specific heat of specHeat⋅C∘. Also assume no other + /// significant heat transfer + /// + /// The mass. + /// The spec heat. + /// The delta temporary. + /// The e. + /// + template + static constexpr auto photonsRequiredToIncreaseTemperature( + const M mass, const C specHeat, const T delta_temp, const E E_ + ); + + /// + /// A certain heat lamp emits 200 W of mostly IR radiation averaging + /// 1500 nm in wavelength. How many of these photons are required to + /// increase the temperature of a person’s shoulder by 2.0C∘ , assuming + /// the affected mass is 4.0 kg with a specific heat of 0.83 kcal/kg⋅C∘. + /// Also assume no other significant heat transfer + /// + /// The watts. + /// The wavelength lambda. + /// The mass. + /// The specific heat. + /// The delta(change in) temperature. + /// total Number of photons to increase mass by + /// temperature specified + template + static constexpr auto photonsRequiredToIncreaseTemperature( + const P watts, const W lambda, const M mass, const C specHeat, const T delta_temp + ); + + +private: + ld quantumVar; + static void countIncrease() { quantum_objectCount += 1; } + static void countDecrease() { quantum_objectCount -= 1; } + + +}; + +#endif //PHYSICSFORMULA_QUANTUMPHYSICS_H + + +template +constexpr auto QuantumPhysics::energyBetweenOscillatorStates_eM(const T f) +{ + return _PLANKS_EM_ * f; +} + +template +inline constexpr auto QuantumPhysics::energy_J(const T f) +{ + return _PLANKS_J_ * f; +} + +template +inline constexpr auto QuantumPhysics::energy_eM(const T f) +{ + return _PLANKS_EM_ * f; +} + +template +constexpr auto QuantumPhysics::energyBetweenOscillatorStates_J(const T time) +{ + return _PLANKS_J_ * (1.0 / time); +} + +template +constexpr auto QuantumPhysics::valueOf_nState_f(const F frequency, const E energy) +{ + return round((energy / (_PLANKS_EM_ * frequency)) - (1 / 2)); +} + +template +constexpr auto QuantumPhysics::valueOf_nState_t(const T time, const E energy) +{ + return ((energy * time) / _PLANKS_J_) - 1 / 2; +} + +template +constexpr auto QuantumPhysics::oscillationFrequency(const E energy) +{ + return energy / _PLANKS_EM_; +} + +template +constexpr auto QuantumPhysics::longestWavelength_eMRadiationEjection(const T BE) +{ + return (_PLANKS_C_) / BE; +} + +template +constexpr auto QuantumPhysics::bindingEnergy(const T lambda) +{ + return (_PLANKS_C_) / lambda; +} + +template +constexpr auto QuantumPhysics::bindingEnergy_Joules(const T lambda) +{ + return (_PLANKS_J_ * _C_) / lambda; +} + +template +constexpr auto QuantumPhysics::bindingEnergy(const T lambda, const K KE) +{ + return ((_PLANKS_C_) / lambda) - KE; +} + +template +constexpr auto QuantumPhysics::bindingEnergy_f(const T f, const K KE) +{ + return (_PLANKS_J_*f) - KE; +} + +template +constexpr auto QuantumPhysics::maximumKineticEnergy(const T lambda, const B BE) +{ + return ((_PLANKS_C_)/ lambda) - BE; +} + +template +constexpr auto QuantumPhysics::maximumKineticEnergy_f(const T f, const B BE) +{ + return _PLANKS_EM_ * f - BE; +} + +template +constexpr auto QuantumPhysics::wavelength(const K KE, const B BE) +{ + return _PLANKS_C_ / (KE + BE); +} + +template +constexpr auto QuantumPhysics::wavelength(const T E) +{ + return _PLANKS_C_ / E; +} + +template +constexpr auto QuantumPhysics::maximumVelocity(const T lambda, const M m, const B BE) +{ + return sqrt((2.0 / m) * (((_PLANKS_J_*_C_) / lambda) - (BE*1.602e-19 ))); +} + +template +constexpr auto QuantumPhysics::timeToTravelDistance(const T lambda, const M m, const B BE, const D dis) +{ + return dis/sqrt((2.0 / m) * (((_PLANKS_J_ * _C_) / lambda) - (BE * 1.602e-19))); +} + +template +constexpr auto QuantumPhysics::electronsPerSecondEjected(const T lambda, const P P_) +{ + return (P_ * lambda) / (_PLANKS_J_ * _C_); +} + +template +constexpr auto QuantumPhysics::photoelectronsPerSecondEjected(const T A, const T lambda, const T I) +{ + return (I * (A * A) * lambda) / (_PLANKS_J_ * _C_); +} + +template +constexpr auto QuantumPhysics::powerCarriedAwayByElectrons(const T lambda, const T P, const T BE) +{ + return (((_PLANKS_J_ * _C_) / lambda) - (BE*1.602e-19)) * electronsPerSecondEjected(lambda, P); +} + +template +constexpr auto QuantumPhysics::powerCarriedAwayByElectrons(const T A, const T lambda, const T I, const T BE) +{ + return I * (A * A) * (1.0 - (BE * lambda) / _PLANKS_C_); +} + +template +constexpr auto QuantumPhysics::frequency_fromE(const T E) +{ + return E / _PLANKS_EM_; +} + +template +constexpr auto QuantumPhysics::numberOfSimultaneouslyAbsorbedPhotons(T E_tot, T E) +{ + return E_tot / E; +} + +template +constexpr auto QuantumPhysics::numOfTightlyBoundMolecules_gammaRayCanBreakApart(T E_tot, T E) +{ + return E / E_tot; +} + +template +constexpr auto QuantumPhysics::acceleratingVoltage(const T lambda, const T q) +{ + return (_PLANKS_J_ * _C_) / (q * lambda); +} + +template +constexpr auto QuantumPhysics::energyMax_eV(const Q q, const V volts) +{ + return q * volts * _JOULES2eV_; +} + +template +constexpr auto QuantumPhysics::ratioOf_frequencies(const F f_1, const F f_2) +{ + return static_cast( f_1) / static_cast( f_2); +} + +template +constexpr auto QuantumPhysics::ratioOf_photonsPerSecond(const F f_1, const F f_2) +{ + return static_cast( f_2) / static_cast( f_1); +} + +template +constexpr auto QuantumPhysics::photonsPerSecondEmitted(const P P_, const F f) +{ + return P_ / (_PLANKS_J_ * f); +} + +template +constexpr auto QuantumPhysics::gammaRaysPerSecondEmitted(const P P_, const E E_) +{ + return P_ / (E_ * _PROTON_CHARGE_); +} + +template +constexpr auto QuantumPhysics::distanceBetween2Satellites(const P P_, const E E_, const F phi) +{ + return sqrt(gammaRaysPerSecondEmitted(P_, E_) / (4.0 * Pi_ * phi)); +} + +template +constexpr auto QuantumPhysics::photonMomentum(const W lambda) +{ + return _PLANKS_J_ / lambda; +} + +template +constexpr auto QuantumPhysics::momentum_fromEnergy(const E E_) +{ + return (E_*_PROTON_CHARGE_) / _C_; +} + +template +constexpr auto QuantumPhysics::energy_fromMomentum(const P p) +{ + return p * _C_ * _JOULES2eV_; +} + +template +constexpr auto QuantumPhysics::wavelength_fromMomentum(const P p) +{ + return _PLANKS_J_ / p; +} + +template +constexpr auto QuantumPhysics::velocityFromMomentum(const P p, const M m) +{ + return p / m; +} + +template +constexpr auto QuantumPhysics::kineticEnergy(const M m, const V v) +{ + return (1.0 / 2.0) * m * (v * v); +} + +template +constexpr auto QuantumPhysics::kineticEnergy_fromWavelength(const M m, const W lambda) +{ + return pow(_PLANKS_J_, 2) / (2.0 * m * (lambda * lambda)) * _JOULES2eV_; +} + +template +constexpr auto QuantumPhysics::electronVelocity(const W lambda) +{ + return _PLANKS_J_ / (_ELECTRON_MASS_ * lambda); +} + +template +constexpr auto QuantumPhysics::objectVelocity(const M m, const W lambda) +{ + return _PLANKS_J_ / (m * lambda); +} + +template +constexpr auto QuantumPhysics::electronWavelength_movingAtPercentSpeedOfLight(const V percentOfLightSpeed) +{ + auto decimalVal = percentOfLightSpeed / 100.0; + return _PLANKS_J_ / (_ELECTRON_MASS_ * decimalVal * _C_); +} + +template +constexpr auto QuantumPhysics::deBrogile_wavelength(const M m, const V v) +{ + return _PLANKS_J_ / (m * v); +} + +template +constexpr auto QuantumPhysics::wavelengthParticleAcceleratedThroughVoltageOf(const M m, const Q q, const V v) +{ + return _PLANKS_J_ / (sqrt((2.0 * q * m * v))); +} + +template +constexpr auto QuantumPhysics::voltageToHaveVelocityOf(const M m, const Q q, const V velocity) +{ + return (m * (velocity * velocity)) / (2.0 * q); +} + +template +constexpr auto QuantumPhysics::min_uncertaintyInVelocity(const XX x, const M m) +{ + return _PLANKS_J_ / (4.0 * Pi_ * x * m); +} + +template +constexpr auto QuantumPhysics::min_uncertaintyInPosition(const V v, const M m) +{ + return _PLANKS_J_ / (4.0 * Pi_ * m * v); +} + +template +constexpr auto QuantumPhysics::min_uncertaintyInEnergy(const T t) +{ + return _PLANKS_EM_ / (4.0 * Pi_ * t); +} + +template +constexpr auto QuantumPhysics::min_uncertaintyInLifetime(const E E_) +{ + return _PLANKS_EM_ / (4.0 * Pi_ * E_); +} + +template +constexpr auto QuantumPhysics::min_uncertaintyInMass(const T t) +{ + return _PLANKS_J_ / (4.0 * Pi_ * (_C_ * _C_) * t); +} + +template +constexpr auto QuantumPhysics::photonsRequiredToIncreaseTemperature( + const M mass, const C specHeat, const T delta_temp, const E E_) +{ + return (mass * specHeat * delta_temp) / E_; +} + +template +constexpr auto QuantumPhysics::photonsRequiredToIncreaseTemperature( + const P watts, const W lambda, const M mass, const C specHeat, const T delta_temp) +{ + auto engJ = bindingEnergy_Joules(lambda); + return (mass * specHeat * delta_temp) / engJ; +} + + diff --git a/RandomNumbers.h b/RandomNumbers.h index c7ab253..094cc5d 100644 --- a/RandomNumbers.h +++ b/RandomNumbers.h @@ -1,230 +1,230 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_RANDOMNUMBERS_H -#define PHYSICSFORMULA_RANDOMNUMBERS_H - -#include -#include -#include -#include -#include -#include -using namespace std; -//#include - - -class RandomNumbers -{ - int min; - int max; - double mean; - double std; - std::random_device rd{}; -public: - RandomNumbers(); - RandomNumbers(int min_Mean, int max_Std, string mode = "ud"); - - - - std::mt19937 mt_gen;//32 bit mersenne twister engine with 19,937 bits - std::uniform_int_distribution ud;//uniform distribution - std::normal_distribution nd; - static void generate_and_print_distribution( - std::function gen, int const iterations = 10000); - - static auto generate_random_integer(int lb, int ub); - static auto generate_normDis_double(double mean_, double std_); - static auto generate_random_double(double lb, double ub); - - - double return_mean()const; - double return_std()const; - int return_min()const; - int return_max()const; - - void set_min(int min_); - void set_max(int max_); - void set_mean(double mean_); - void set_std(double std_); - - ~RandomNumbers(); -}; - -#endif //PHYSICSFORMULA_RANDOMNUMBERS_H - - -inline RandomNumbers::RandomNumbers() -{ - min = 1; - max = 6; - mean = 5.0; - std = 2.0; - mt_gen = std::mt19937{ rd() }; - ud = std::uniform_int_distribution<>{ min, max }; - nd = std::normal_distribution{ mean, std }; -} - -inline RandomNumbers::RandomNumbers(int min_Mean, int max_Std, string mode) -{ - if (mode == "ud") - { - min = min_Mean; - max = max_Std; - mean = 5.0; - std = 2.0; - } - else - { - min = 1; - max = 6; - mean = min_Mean; - std = max_Std; - } - - mt_gen = std::mt19937{ rd() }; - ud = std::uniform_int_distribution<>{ min, max }; - nd = std::normal_distribution{ static_cast(min), static_cast(max) }; -} - -inline void RandomNumbers::generate_and_print_distribution( - std::function gen, int const iterations) -{ - // map to store the numbers and their repetitions - auto data = std::map{}; - - for (auto n = 0; n < iterations; ++n) - ++data[gen()]; - - auto max = std::max_element( - std::begin(data), std::end(data), - [](auto kvp1, auto kvp2){ - return kvp1.second < kvp2.second;}); - - // print the bars - for (auto i = max->second / 200; i > 0; --i) - { - for (auto kvp : data) - { - std::cout - << std::fixed << std::setprecision(1) << std::setw(3) - << (kvp.second / 200 >= i ? (char)219 : ' '); - } - std::cout << '\n'; - } - - //print the numbers - for (auto kvp : data) - { - std::cout - << std::fixed << std::setprecision(1) << std::setw(3) - << kvp.first; - } - std::cout << '\n'; -} - -inline auto RandomNumbers::generate_random_integer(int lb, int ub) -{ - std::random_device rd{}; - std::array seed_data{}; - std::generate(std::begin(seed_data), std::end(seed_data), std::ref(rd)); - std::seed_seq seq(std::begin(seed_data), std::end(seed_data)); - auto eng = std::mt19937{ seq }; - const auto randInt = std::uniform_int_distribution<>{ lb,ub }; - return randInt; -} - -inline auto RandomNumbers::generate_random_double(double lb, double ub) -{ - std::random_device rd{}; - std::array seed_data{}; - std::generate(std::begin(seed_data), std::end(seed_data), std::ref(rd)); - std::seed_seq seq(std::begin(seed_data), std::end(seed_data)); - auto eng = std::mt19937{ seq }; - const auto randDouble = std::uniform_real_distribution<>{ lb,ub }; - return randDouble; -} - - -inline auto RandomNumbers::generate_normDis_double(double mean_, double std_) -{ - std::random_device rd{}; - std::array seed_data{}; - std::generate(std::begin(seed_data), std::end(seed_data), std::ref(rd)); - std::seed_seq seq(std::begin(seed_data), std::end(seed_data)); - auto eng = std::mt19937{ seq }; - auto randNormDist = std::normal_distribution<>{ mean_,std_ }; - return randNormDist(eng); -} -inline double RandomNumbers::return_mean() const -{ - return mean; -} - -inline double RandomNumbers::return_std() const -{ - return std; -} -inline int RandomNumbers::return_min()const -{ - return min; -} - -inline int RandomNumbers::return_max()const -{ - return max; -} -inline void RandomNumbers::set_min(int min_) -{ - min = min_; - ud = std::uniform_int_distribution<>{ min, max }; -} - -inline void RandomNumbers::set_max(int max_) -{ - max = max_; - ud = std::uniform_int_distribution<>{ min, max }; -} - -inline void RandomNumbers::set_mean(double mean_) -{ - mean = mean_; - nd = std::normal_distribution{ mean, std }; -} - -inline void RandomNumbers::set_std(double std_) -{ - std = std_; - nd = std::normal_distribution{ mean, std }; -} - - -inline RandomNumbers::~RandomNumbers() = default; - -/* - * - * RandomNumbers r{}; - - auto mtgen = r.mt_gen; - auto u_d = r.ud; - //auto n_d = r.nd; - r.set_mean(3.0); - auto n_d = r.nd; - - r.generate_and_print_distribution([&mtgen, &n_d]() - { - return static_cast(std::round(n_d(mtgen))); - }); - - for (size_t i = 0; i < 100; i++) - { - std::cout << r.generate_random_integer(5, 100) << " "; - } - std::cout << std::endl< +#include +#include +#include +#include +#include +using namespace std; +//#include + + +class RandomNumbers +{ + int min; + int max; + double mean; + double std; + std::random_device rd{}; +public: + RandomNumbers(); + RandomNumbers(int min_Mean, int max_Std, string mode = "ud"); + + + + std::mt19937 mt_gen;//32 bit mersenne twister engine with 19,937 bits + std::uniform_int_distribution ud;//uniform distribution + std::normal_distribution nd; + static void generate_and_print_distribution( + std::function gen, int const iterations = 10000); + + static auto generate_random_integer(int lb, int ub); + static auto generate_normDis_double(double mean_, double std_); + static auto generate_random_double(double lb, double ub); + + + double return_mean()const; + double return_std()const; + int return_min()const; + int return_max()const; + + void set_min(int min_); + void set_max(int max_); + void set_mean(double mean_); + void set_std(double std_); + + ~RandomNumbers(); +}; + +#endif //PHYSICSFORMULA_RANDOMNUMBERS_H + + +inline RandomNumbers::RandomNumbers() +{ + min = 1; + max = 6; + mean = 5.0; + std = 2.0; + mt_gen = std::mt19937{ rd() }; + ud = std::uniform_int_distribution<>{ min, max }; + nd = std::normal_distribution{ mean, std }; +} + +inline RandomNumbers::RandomNumbers(int min_Mean, int max_Std, string mode) +{ + if (mode == "ud") + { + min = min_Mean; + max = max_Std; + mean = 5.0; + std = 2.0; + } + else + { + min = 1; + max = 6; + mean = min_Mean; + std = max_Std; + } + + mt_gen = std::mt19937{ rd() }; + ud = std::uniform_int_distribution<>{ min, max }; + nd = std::normal_distribution{ static_cast(min), static_cast(max) }; +} + +inline void RandomNumbers::generate_and_print_distribution( + std::function gen, int const iterations) +{ + // map to store the numbers and their repetitions + auto data = std::map{}; + + for (auto n = 0; n < iterations; ++n) + ++data[gen()]; + + auto max = std::max_element( + std::begin(data), std::end(data), + [](auto kvp1, auto kvp2){ + return kvp1.second < kvp2.second;}); + + // print the bars + for (auto i = max->second / 200; i > 0; --i) + { + for (auto kvp : data) + { + std::cout + << std::fixed << std::setprecision(1) << std::setw(3) + << (kvp.second / 200 >= i ? (char)219 : ' '); + } + std::cout << '\n'; + } + + //print the numbers + for (auto kvp : data) + { + std::cout + << std::fixed << std::setprecision(1) << std::setw(3) + << kvp.first; + } + std::cout << '\n'; +} + +inline auto RandomNumbers::generate_random_integer(int lb, int ub) +{ + std::random_device rd{}; + std::array seed_data{}; + std::generate(std::begin(seed_data), std::end(seed_data), std::ref(rd)); + std::seed_seq seq(std::begin(seed_data), std::end(seed_data)); + auto eng = std::mt19937{ seq }; + const auto randInt = std::uniform_int_distribution<>{ lb,ub }; + return randInt; +} + +inline auto RandomNumbers::generate_random_double(double lb, double ub) +{ + std::random_device rd{}; + std::array seed_data{}; + std::generate(std::begin(seed_data), std::end(seed_data), std::ref(rd)); + std::seed_seq seq(std::begin(seed_data), std::end(seed_data)); + auto eng = std::mt19937{ seq }; + const auto randDouble = std::uniform_real_distribution<>{ lb,ub }; + return randDouble; +} + + +inline auto RandomNumbers::generate_normDis_double(double mean_, double std_) +{ + std::random_device rd{}; + std::array seed_data{}; + std::generate(std::begin(seed_data), std::end(seed_data), std::ref(rd)); + std::seed_seq seq(std::begin(seed_data), std::end(seed_data)); + auto eng = std::mt19937{ seq }; + auto randNormDist = std::normal_distribution<>{ mean_,std_ }; + return randNormDist(eng); +} +inline double RandomNumbers::return_mean() const +{ + return mean; +} + +inline double RandomNumbers::return_std() const +{ + return std; +} +inline int RandomNumbers::return_min()const +{ + return min; +} + +inline int RandomNumbers::return_max()const +{ + return max; +} +inline void RandomNumbers::set_min(int min_) +{ + min = min_; + ud = std::uniform_int_distribution<>{ min, max }; +} + +inline void RandomNumbers::set_max(int max_) +{ + max = max_; + ud = std::uniform_int_distribution<>{ min, max }; +} + +inline void RandomNumbers::set_mean(double mean_) +{ + mean = mean_; + nd = std::normal_distribution{ mean, std }; +} + +inline void RandomNumbers::set_std(double std_) +{ + std = std_; + nd = std::normal_distribution{ mean, std }; +} + + +inline RandomNumbers::~RandomNumbers() = default; + +/* + * + * RandomNumbers r{}; + + auto mtgen = r.mt_gen; + auto u_d = r.ud; + //auto n_d = r.nd; + r.set_mean(3.0); + auto n_d = r.nd; + + r.generate_and_print_distribution([&mtgen, &n_d]() + { + return static_cast(std::round(n_d(mtgen))); + }); + + for (size_t i = 0; i < 100; i++) + { + std::cout << r.generate_random_integer(5, 100) << " "; + } + std::cout << std::endl< - - -static int rectangleObjectCount = 0; -typedef long double ld; - -class Rectangle -{ - ld lenght; - ld width; - ld diagnal; - ld perimeter; - ld area; - static auto countIncrease() { rectangleObjectCount += 1; } - static auto countDecrease() { rectangleObjectCount -= 1; } - ld calculateLength()const; - ld calculateWidth()const; - ld calculateDiagnal()const; - ld calculatePerimeter()const; - ld calculateArea()const; -public: - - Rectangle() - { - lenght = 0.0; - width = 0.0; - diagnal = 0.0; - perimeter = 0.0; - area = 0.0; - countIncrease(); - } - - Rectangle(ld length, ld width) - { - this->lenght = length; - this->width = width; - this->diagnal = calculateDiagnal(); - this->perimeter = calculatePerimeter(); - this->area = calculateArea(); - countIncrease(); - } - - /** - * @brief copy constructor - */ - Rectangle(const Rectangle& s) - { - lenght = s.lenght; - width = s.width; - diagnal = s.diagnal; - perimeter = s.perimeter; - area = s.area; - countIncrease(); - } - /** - * #brief move constructor - */ - Rectangle(Rectangle&& s) noexcept - { - lenght = s.lenght; - width = s.width; - diagnal = s.diagnal; - perimeter = s.perimeter; - area = s.area; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Rectangle& operator=(Rectangle&& s) noexcept - { - if (this != &s) - { - lenght = s.lenght; - width = s.width; - diagnal = s.diagnal; - perimeter = s.perimeter; - area = s.area; - countIncrease(); - } - return *this; - } - - Rectangle& operator=(Rectangle other) - { - std::swap(lenght, other.lenght); - std::swap(width, other.width); - std::swap(diagnal, other.diagnal); - std::swap(perimeter, other.perimeter); - std::swap(area, other.area); - return *this; - } - - static void show_objectCount() { - std::cout << "\n rectangle object count: " - << rectangleObjectCount << std::endl; - } - static int get_objectCount() { return rectangleObjectCount; } - - - ~Rectangle() = default; - - auto setWidth(ld w); - auto setLength(ld l); - auto setPerimeter(ld p); - auto setArea(ld a); - - [[nodiscard]] auto getWidth() const { return width; } - [[nodiscard]] auto getLength() const { return lenght; } - [[nodiscard]] auto getDiagnol() const { return diagnal; } - [[nodiscard]] auto getPerimeter() const { return perimeter; } - [[nodiscard]] auto getArea() const { return area; } - - void printRectangleInfo()const; -}; - -#endif //PHYSICSFORMULA_RECTANGLE_H -inline ld Rectangle::calculateLength() const -{ - return (perimeter*sqrt((perimeter*perimeter) - 8.0*area))/2.0; -} - -inline ld Rectangle::calculateWidth() const -{ - return area/lenght; -} - -inline ld Rectangle::calculateDiagnal() const -{ - return sqrt((lenght*lenght) + (width*width)); -} - -inline ld Rectangle::calculatePerimeter() const -{ - return 2.0 * (lenght + width); -} - -inline ld Rectangle::calculateArea() const -{ - return lenght * width; -} - -inline auto Rectangle::setWidth(ld w) -{ - width = w; - perimeter = calculatePerimeter(); - area = calculateArea(); - diagnal = calculateDiagnal(); -} - -inline auto Rectangle::setLength(ld l) -{ - lenght = l; - perimeter = calculatePerimeter(); - area = calculateArea(); - diagnal = calculateDiagnal(); -} - -inline auto Rectangle::setPerimeter(ld p) -{ - perimeter = p; - lenght = calculateLength(); - width = calculateWidth(); - diagnal = calculateDiagnal(); -} - -inline auto Rectangle::setArea(ld a) -{ - area = a; - lenght = calculateLength(); - width = calculateWidth(); - diagnal = calculateDiagnal(); -} - -inline void Rectangle::printRectangleInfo() const -{ - std::cout << "length: " << lenght << std::endl; - std::cout << "width: " << width << std::endl; - std::cout << "diagonal: " << diagnal << std::endl; - std::cout << "perimeter: " << perimeter << std::endl; - std::cout << "area: " << area << std::endl; +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_RECTANGLE_H +#define PHYSICSFORMULA_RECTANGLE_H +/** + * @class Rectangle + * @details rectangle class that represents a rectangle object + * @author Ryan Zurrin + * @dateBuilt 11/4/2021 + * @lastEdit 11/4/2021 + */ +#include + + +static int rectangleObjectCount = 0; +typedef long double ld; + +class Rectangle +{ + ld lenght; + ld width; + ld diagnal; + ld perimeter; + ld area; + static auto countIncrease() { rectangleObjectCount += 1; } + static auto countDecrease() { rectangleObjectCount -= 1; } + ld calculateLength()const; + ld calculateWidth()const; + ld calculateDiagnal()const; + ld calculatePerimeter()const; + ld calculateArea()const; +public: + + Rectangle() + { + lenght = 0.0; + width = 0.0; + diagnal = 0.0; + perimeter = 0.0; + area = 0.0; + countIncrease(); + } + + Rectangle(ld length, ld width) + { + this->lenght = length; + this->width = width; + this->diagnal = calculateDiagnal(); + this->perimeter = calculatePerimeter(); + this->area = calculateArea(); + countIncrease(); + } + + /** + * @brief copy constructor + */ + Rectangle(const Rectangle& s) + { + lenght = s.lenght; + width = s.width; + diagnal = s.diagnal; + perimeter = s.perimeter; + area = s.area; + countIncrease(); + } + /** + * #brief move constructor + */ + Rectangle(Rectangle&& s) noexcept + { + lenght = s.lenght; + width = s.width; + diagnal = s.diagnal; + perimeter = s.perimeter; + area = s.area; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Rectangle& operator=(Rectangle&& s) noexcept + { + if (this != &s) + { + lenght = s.lenght; + width = s.width; + diagnal = s.diagnal; + perimeter = s.perimeter; + area = s.area; + countIncrease(); + } + return *this; + } + + Rectangle& operator=(Rectangle other) + { + std::swap(lenght, other.lenght); + std::swap(width, other.width); + std::swap(diagnal, other.diagnal); + std::swap(perimeter, other.perimeter); + std::swap(area, other.area); + return *this; + } + + static void show_objectCount() { + std::cout << "\n rectangle object count: " + << rectangleObjectCount << std::endl; + } + static int get_objectCount() { return rectangleObjectCount; } + + + ~Rectangle() = default; + + auto setWidth(ld w); + auto setLength(ld l); + auto setPerimeter(ld p); + auto setArea(ld a); + + [[nodiscard]] auto getWidth() const { return width; } + [[nodiscard]] auto getLength() const { return lenght; } + [[nodiscard]] auto getDiagnol() const { return diagnal; } + [[nodiscard]] auto getPerimeter() const { return perimeter; } + [[nodiscard]] auto getArea() const { return area; } + + void printRectangleInfo()const; +}; + +#endif //PHYSICSFORMULA_RECTANGLE_H +inline ld Rectangle::calculateLength() const +{ + return (perimeter*sqrt((perimeter*perimeter) - 8.0*area))/2.0; +} + +inline ld Rectangle::calculateWidth() const +{ + return area/lenght; +} + +inline ld Rectangle::calculateDiagnal() const +{ + return sqrt((lenght*lenght) + (width*width)); +} + +inline ld Rectangle::calculatePerimeter() const +{ + return 2.0 * (lenght + width); +} + +inline ld Rectangle::calculateArea() const +{ + return lenght * width; +} + +inline auto Rectangle::setWidth(ld w) +{ + width = w; + perimeter = calculatePerimeter(); + area = calculateArea(); + diagnal = calculateDiagnal(); +} + +inline auto Rectangle::setLength(ld l) +{ + lenght = l; + perimeter = calculatePerimeter(); + area = calculateArea(); + diagnal = calculateDiagnal(); +} + +inline auto Rectangle::setPerimeter(ld p) +{ + perimeter = p; + lenght = calculateLength(); + width = calculateWidth(); + diagnal = calculateDiagnal(); +} + +inline auto Rectangle::setArea(ld a) +{ + area = a; + lenght = calculateLength(); + width = calculateWidth(); + diagnal = calculateDiagnal(); +} + +inline void Rectangle::printRectangleInfo() const +{ + std::cout << "length: " << lenght << std::endl; + std::cout << "width: " << width << std::endl; + std::cout << "diagonal: " << diagnal << std::endl; + std::cout << "perimeter: " << perimeter << std::endl; + std::cout << "area: " << area << std::endl; } \ No newline at end of file diff --git a/RectangularPrism.h b/RectangularPrism.h index 14aeba4..7e50de8 100644 --- a/RectangularPrism.h +++ b/RectangularPrism.h @@ -1,174 +1,174 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_RECTANGULARPRISM_H -#define PHYSICSFORMULA_RECTANGULARPRISM_H -/** - * @class RectangularPrism - * @details rectangularPrism class that represents a rectangular prism object - * @author Ryan Zurrin - * @dateBuilt 11/4/2021 - * @lastEdit 11/4/2021 - */ -#include - -static int rectangularPrismObjectCount = 0; -typedef long double ld; - -class RectangularPrism -{ - ld lenght; - ld width; - ld height; - ld volume; - ld surfaceArea; - static auto countIncrease() { rectangularPrismObjectCount += 1; } - static auto countDecrease() { rectangularPrismObjectCount -= 1; } - ld calculateVolume()const; - ld calculateSurfaceArea()const; -public: - - RectangularPrism() - { - lenght = 0.0; - width = 0.0; - height = 0.0; - volume = 0.0; - surfaceArea = 0.0; - countIncrease(); - } - - RectangularPrism(ld length, ld width, ld height) - { - this->lenght = length; - this->width = width; - this->height = height; - this->volume = calculateVolume(); - this->surfaceArea = calculateSurfaceArea(); - countIncrease(); - } - - /** - * @brief copy constructor - */ - RectangularPrism(const RectangularPrism& s) - { - lenght = s.lenght; - width = s.width; - height = s.height; - volume = s.volume; - surfaceArea = s.surfaceArea; - countIncrease(); - } - /** - * #brief move constructor - */ - RectangularPrism(RectangularPrism&& s) noexcept - { - lenght = s.lenght; - width = s.width; - height = s.height; - volume = s.volume; - surfaceArea = s.surfaceArea; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - RectangularPrism& operator=(RectangularPrism&& s) noexcept - { - if (this != &s) - { - lenght = s.lenght; - width = s.width; - height = s.height; - volume = s.volume; - surfaceArea = s.surfaceArea; - countIncrease(); - } - return *this; - } - - RectangularPrism& operator=(RectangularPrism other) - { - std::swap(lenght, other.lenght); - std::swap(width, other.width); - std::swap(height, other.height); - std::swap(volume, other.volume); - std::swap(surfaceArea, other.surfaceArea); - return *this; - } - - static void show_objectCount() { - std::cout << "\n rectangle object count: " - << rectangularPrismObjectCount << std::endl; - } - static int get_objectCount() { return rectangularPrismObjectCount; } - - - ~RectangularPrism() = default; - - auto setWidth(ld w); - auto setLength(ld l); - auto setHeight(ld h); - - [[nodiscard]] auto getWidth() const { return width; } - [[nodiscard]] auto getLength() const { return lenght; } - [[nodiscard]] auto getHeight() const { return height; } - [[nodiscard]] auto getVolume() const { return volume; } - [[nodiscard]] auto getSurfaceArea() const { return surfaceArea; } - [[nodiscard]] auto getWeight(ld densityKgM) const; - - void printRectangularPrismInfo()const; -}; - -#endif //PHYSICSFORMULA_RECTANGULARPRISM_H - -inline ld RectangularPrism::calculateVolume() const -{ - return lenght * width * height; -} - -inline ld RectangularPrism::calculateSurfaceArea() const -{ - return 2.0 * (lenght * width) + 2.0 * (lenght * height) + 2.0 * (width * height); -} - -inline auto RectangularPrism::setWidth(ld w) -{ - width = w; - surfaceArea = calculateSurfaceArea(); - volume = calculateVolume(); - -} - -inline auto RectangularPrism::setLength(ld l) -{ - lenght = l; - surfaceArea = calculateSurfaceArea(); - volume = calculateVolume(); -} - -inline auto RectangularPrism::setHeight(ld h) -{ - height = h; - surfaceArea = calculateSurfaceArea(); - volume = calculateVolume(); -} - -inline auto RectangularPrism::getWeight(ld densityKgM) const -{ - return densityKgM * volume; -} - -inline void RectangularPrism::printRectangularPrismInfo() const -{ - std::cout << "length: " << lenght << std::endl; - std::cout << "width: " << width << std::endl; - std::cout << "height: " << height << std::endl; - std::cout << "volume: " << volume << std::endl; - std::cout << "surface area: " << surfaceArea << std::endl; -} - - +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_RECTANGULARPRISM_H +#define PHYSICSFORMULA_RECTANGULARPRISM_H +/** + * @class RectangularPrism + * @details rectangularPrism class that represents a rectangular prism object + * @author Ryan Zurrin + * @dateBuilt 11/4/2021 + * @lastEdit 11/4/2021 + */ +#include + +static int rectangularPrismObjectCount = 0; +typedef long double ld; + +class RectangularPrism +{ + ld lenght; + ld width; + ld height; + ld volume; + ld surfaceArea; + static auto countIncrease() { rectangularPrismObjectCount += 1; } + static auto countDecrease() { rectangularPrismObjectCount -= 1; } + ld calculateVolume()const; + ld calculateSurfaceArea()const; +public: + + RectangularPrism() + { + lenght = 0.0; + width = 0.0; + height = 0.0; + volume = 0.0; + surfaceArea = 0.0; + countIncrease(); + } + + RectangularPrism(ld length, ld width, ld height) + { + this->lenght = length; + this->width = width; + this->height = height; + this->volume = calculateVolume(); + this->surfaceArea = calculateSurfaceArea(); + countIncrease(); + } + + /** + * @brief copy constructor + */ + RectangularPrism(const RectangularPrism& s) + { + lenght = s.lenght; + width = s.width; + height = s.height; + volume = s.volume; + surfaceArea = s.surfaceArea; + countIncrease(); + } + /** + * #brief move constructor + */ + RectangularPrism(RectangularPrism&& s) noexcept + { + lenght = s.lenght; + width = s.width; + height = s.height; + volume = s.volume; + surfaceArea = s.surfaceArea; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + RectangularPrism& operator=(RectangularPrism&& s) noexcept + { + if (this != &s) + { + lenght = s.lenght; + width = s.width; + height = s.height; + volume = s.volume; + surfaceArea = s.surfaceArea; + countIncrease(); + } + return *this; + } + + RectangularPrism& operator=(RectangularPrism other) + { + std::swap(lenght, other.lenght); + std::swap(width, other.width); + std::swap(height, other.height); + std::swap(volume, other.volume); + std::swap(surfaceArea, other.surfaceArea); + return *this; + } + + static void show_objectCount() { + std::cout << "\n rectangle object count: " + << rectangularPrismObjectCount << std::endl; + } + static int get_objectCount() { return rectangularPrismObjectCount; } + + + ~RectangularPrism() = default; + + auto setWidth(ld w); + auto setLength(ld l); + auto setHeight(ld h); + + [[nodiscard]] auto getWidth() const { return width; } + [[nodiscard]] auto getLength() const { return lenght; } + [[nodiscard]] auto getHeight() const { return height; } + [[nodiscard]] auto getVolume() const { return volume; } + [[nodiscard]] auto getSurfaceArea() const { return surfaceArea; } + [[nodiscard]] auto getWeight(ld densityKgM) const; + + void printRectangularPrismInfo()const; +}; + +#endif //PHYSICSFORMULA_RECTANGULARPRISM_H + +inline ld RectangularPrism::calculateVolume() const +{ + return lenght * width * height; +} + +inline ld RectangularPrism::calculateSurfaceArea() const +{ + return 2.0 * (lenght * width) + 2.0 * (lenght * height) + 2.0 * (width * height); +} + +inline auto RectangularPrism::setWidth(ld w) +{ + width = w; + surfaceArea = calculateSurfaceArea(); + volume = calculateVolume(); + +} + +inline auto RectangularPrism::setLength(ld l) +{ + lenght = l; + surfaceArea = calculateSurfaceArea(); + volume = calculateVolume(); +} + +inline auto RectangularPrism::setHeight(ld h) +{ + height = h; + surfaceArea = calculateSurfaceArea(); + volume = calculateVolume(); +} + +inline auto RectangularPrism::getWeight(ld densityKgM) const +{ + return densityKgM * volume; +} + +inline void RectangularPrism::printRectangularPrismInfo() const +{ + std::cout << "length: " << lenght << std::endl; + std::cout << "width: " << width << std::endl; + std::cout << "height: " << height << std::endl; + std::cout << "volume: " << volume << std::endl; + std::cout << "surface area: " << surfaceArea << std::endl; +} + + diff --git a/RedBlackTree.h b/RedBlackTree.h index cce07c5..17afd83 100644 --- a/RedBlackTree.h +++ b/RedBlackTree.h @@ -1,268 +1,268 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_REDBLACKTREE_H -#define PHYSICSFORMULA_REDBLACKTREE_H -#pragma once - -#include -#include -#include - -namespace rez { - template> - class RedBlackTree { - enum class NodeColor { BLACK, RED }; - - struct RBTNode { - KType key = {}; - VType value = {}; - RBTNode* left = nullptr; - RBTNode* right = nullptr; - RBTNode* parent = nullptr; - NodeColor color = NodeColor::BLACK; - - public: - RBTNode() {} - - RBTNode(KType& _value, RBTNode* _left = nullptr, RBTNode* _right = nullptr, RBTNode* _parent = nullptr) : - key(_value), left(_left), right(_right), parent(_parent) {} - }; - - void insert_fixup(RBTNode*); - void delete_fixup(RBTNode*); - void transplant(RBTNode*, RBTNode*); - void rotateLeft(RBTNode*); - void rotateRight(RBTNode*); - - RBTNode* grandParent(RBTNode*); - RBTNode* sibling(RBTNode*); - RBTNode* uncle(RBTNode*); - RBTNode* distantNephew(RBTNode*); - RBTNode* closeNephew(RBTNode*); - void remove(RBTNode*); - - RBTNode* NilNode = new RBTNode(); - RBTNode* root = NilNode; - - public: - RedBlackTree() {} - - RedBlackTree(std::list& _data, const unsigned int _root_index = 0) { - root = new RBTNode(_data[_root_index]); - for (size_t i = 0; i < _data.size(); i++) { - if (i != _root_index) { - insert(_data[i]); - } - } - } - - void insert(const KType& _value); - void insert(std::list&); - void remove(const KType& _value); - - }; - - template - void RedBlackTree::insert_fixup(RBTNode* node) { - RBTNode* current = node; - - while (current->parent->color == NodeColor::RED) { - auto c_uncle = uncle(current); - auto gparent = grandParent(current); - - if (c_uncle->color == NodeColor::RED) { - c_uncle->color = NodeColor::BLACK; - current->parent = NodeColor::BLACK; - gparent->color = NodeColor::RED; - current = gparent; - } - else { - if (current == closeNephew(c_uncle)) { - auto prev_parent = current->parent; - if (c_uncle == gparent->right) - rotateLeft(current->parent); - else - rotateRight(current->parent); - current = prev_parent; - } - - current->parent->color = NodeColor::BLACK; - - gparent->color = NodeColor::RED; - if (c_uncle == gparent->right) - rotateLeft(gparent); - else - rotateRight(gparent); - } - } - root->color = NodeColor::RED; - } - - template - void RedBlackTree::delete_fixup(RBTNode* node) { - RBTNode* current = node; - while (current != root && current->color == NodeColor::BLACK) { - auto w = sibling(current); - if (w->color == NodeColor::RED) { - w->color = NodeColor::BLACK; - current->parent->color = NodeColor::RED; - if (current == current->parent->left) - rotateLeft(current->parent); - else - rotateRight(current->parent); - w = sibling(current); - } - - auto c_nephew = closeNephew(w); - auto dis_nephew = distantNephew(w); - - if (c_nephew->color == NodeColor::BLACK && dis_nephew->color == NodeColor::BLACK) { - w->color = NodeColor::RED; - current = current->parent; - } - else { - if (dis_nephew->color == NodeColor::BLACK) { - c_nephew->color = NodeColor::BLACK; - w->color = NodeColor::RED; - - if (current == current->parent->left) - rotateRight(w); - else - rotateLeft(w); - - w = sibling(current); - } - - w->color = current->parent->color; - current->parent->color = NodeColor::BLACK; - dis_nephew = distantNephew(current); - dis_nephew->color = NodeColor::BLACK; - - if (current == current->parent->left) - rotateLeft(current->parent); - else - rotateRight(current->parent); - current = root; - } - } - current->color = NodeColor::BLACK; - } - - template - void RedBlackTree::transplant(RBTNode* current, RBTNode* replacement) { - if (current->parent == nullptr) - root = replacement; - else if (current == current->parent->left) - current->parent->left = replacement; - else - current->parent->right = replacement; - replacement->parent = current->parent; - } - - template - void RedBlackTree::rotateLeft(RBTNode*) { - } - - template - void RedBlackTree::rotateRight(RBTNode*) { - } - - template - typename RedBlackTree::RBTNode* RedBlackTree::grandParent(RBTNode* _node) { - if (_node->parent != NilNode) - return _node->parent->parent; - return NilNode; - } - - template - typename RedBlackTree::RBTNode* RedBlackTree::sibling(RBTNode* _node) { - if (_node->parent != NilNode) { - if (_node == _node->parent->left) - return _node->parent->right; - else - return _node->parent->left; - } - return NilNode; - } - - template - typename RedBlackTree::RBTNode* RedBlackTree::uncle(RBTNode* _node) { - if (_node->parent != NilNode) - return sibling(_node->parent); - return NilNode; - } - - template - typename RedBlackTree::RBTNode* RedBlackTree::distantNephew(RBTNode* _node) { - auto sib = sibling(_node); - if (sib != NilNode) { - if (_node == _node->parent->left) - return sib->right; - else - return sib->left; - } - return NilNode; - } - - template - typename RedBlackTree::RBTNode* RedBlackTree::closeNephew(RBTNode* _node) { - auto sib = sibling(_node); - if (sib != NilNode) { - if (_node == _node->parent->left) - return sib->left; - else - return sib->right; - } - return NilNode; - } - - template - void RedBlackTree::remove(RBTNode*) - { - } - - template - void RedBlackTree::insert(const KType& _value) { - RBTNode* new_node = new RBTNode(_value); - - auto temp_parent = NilNode; - auto temp = root; - - while (temp != NilNode) { - temp_parent = temp; - if (_value < temp->key) - temp = temp->left; - else - temp = temp->right; - } - - new_node->parent = temp_parent; - if (temp_parent == NilNode) - root = new_node; - else if (_value < temp_parent->key) - temp_parent->left = new_node; - else - temp_parent->right = new_node; - - new_node->left = NilNode; - new_node->right = NilNode; - new_node->color = NodeColor::RED; - insert_fixup(new_node); - } - - template - void RedBlackTree::insert(std::list& _list) - { - for (const auto& key : _list) { - insert(key); - } - } - - template - void RedBlackTree::remove(const KType& _value) - { - } -} -#endif //PHYSICSFORMULA_REDBLACKTREE_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_REDBLACKTREE_H +#define PHYSICSFORMULA_REDBLACKTREE_H +#pragma once + +#include +#include +#include + +namespace rez { + template> + class RedBlackTree { + enum class NodeColor { BLACK, RED }; + + struct RBTNode { + KType key = {}; + VType value = {}; + RBTNode* left = nullptr; + RBTNode* right = nullptr; + RBTNode* parent = nullptr; + NodeColor color = NodeColor::BLACK; + + public: + RBTNode() {} + + RBTNode(KType& _value, RBTNode* _left = nullptr, RBTNode* _right = nullptr, RBTNode* _parent = nullptr) : + key(_value), left(_left), right(_right), parent(_parent) {} + }; + + void insert_fixup(RBTNode*); + void delete_fixup(RBTNode*); + void transplant(RBTNode*, RBTNode*); + void rotateLeft(RBTNode*); + void rotateRight(RBTNode*); + + RBTNode* grandParent(RBTNode*); + RBTNode* sibling(RBTNode*); + RBTNode* uncle(RBTNode*); + RBTNode* distantNephew(RBTNode*); + RBTNode* closeNephew(RBTNode*); + void remove(RBTNode*); + + RBTNode* NilNode = new RBTNode(); + RBTNode* root = NilNode; + + public: + RedBlackTree() {} + + RedBlackTree(std::list& _data, const unsigned int _root_index = 0) { + root = new RBTNode(_data[_root_index]); + for (size_t i = 0; i < _data.size(); i++) { + if (i != _root_index) { + insert(_data[i]); + } + } + } + + void insert(const KType& _value); + void insert(std::list&); + void remove(const KType& _value); + + }; + + template + void RedBlackTree::insert_fixup(RBTNode* node) { + RBTNode* current = node; + + while (current->parent->color == NodeColor::RED) { + auto c_uncle = uncle(current); + auto gparent = grandParent(current); + + if (c_uncle->color == NodeColor::RED) { + c_uncle->color = NodeColor::BLACK; + current->parent = NodeColor::BLACK; + gparent->color = NodeColor::RED; + current = gparent; + } + else { + if (current == closeNephew(c_uncle)) { + auto prev_parent = current->parent; + if (c_uncle == gparent->right) + rotateLeft(current->parent); + else + rotateRight(current->parent); + current = prev_parent; + } + + current->parent->color = NodeColor::BLACK; + + gparent->color = NodeColor::RED; + if (c_uncle == gparent->right) + rotateLeft(gparent); + else + rotateRight(gparent); + } + } + root->color = NodeColor::RED; + } + + template + void RedBlackTree::delete_fixup(RBTNode* node) { + RBTNode* current = node; + while (current != root && current->color == NodeColor::BLACK) { + auto w = sibling(current); + if (w->color == NodeColor::RED) { + w->color = NodeColor::BLACK; + current->parent->color = NodeColor::RED; + if (current == current->parent->left) + rotateLeft(current->parent); + else + rotateRight(current->parent); + w = sibling(current); + } + + auto c_nephew = closeNephew(w); + auto dis_nephew = distantNephew(w); + + if (c_nephew->color == NodeColor::BLACK && dis_nephew->color == NodeColor::BLACK) { + w->color = NodeColor::RED; + current = current->parent; + } + else { + if (dis_nephew->color == NodeColor::BLACK) { + c_nephew->color = NodeColor::BLACK; + w->color = NodeColor::RED; + + if (current == current->parent->left) + rotateRight(w); + else + rotateLeft(w); + + w = sibling(current); + } + + w->color = current->parent->color; + current->parent->color = NodeColor::BLACK; + dis_nephew = distantNephew(current); + dis_nephew->color = NodeColor::BLACK; + + if (current == current->parent->left) + rotateLeft(current->parent); + else + rotateRight(current->parent); + current = root; + } + } + current->color = NodeColor::BLACK; + } + + template + void RedBlackTree::transplant(RBTNode* current, RBTNode* replacement) { + if (current->parent == nullptr) + root = replacement; + else if (current == current->parent->left) + current->parent->left = replacement; + else + current->parent->right = replacement; + replacement->parent = current->parent; + } + + template + void RedBlackTree::rotateLeft(RBTNode*) { + } + + template + void RedBlackTree::rotateRight(RBTNode*) { + } + + template + typename RedBlackTree::RBTNode* RedBlackTree::grandParent(RBTNode* _node) { + if (_node->parent != NilNode) + return _node->parent->parent; + return NilNode; + } + + template + typename RedBlackTree::RBTNode* RedBlackTree::sibling(RBTNode* _node) { + if (_node->parent != NilNode) { + if (_node == _node->parent->left) + return _node->parent->right; + else + return _node->parent->left; + } + return NilNode; + } + + template + typename RedBlackTree::RBTNode* RedBlackTree::uncle(RBTNode* _node) { + if (_node->parent != NilNode) + return sibling(_node->parent); + return NilNode; + } + + template + typename RedBlackTree::RBTNode* RedBlackTree::distantNephew(RBTNode* _node) { + auto sib = sibling(_node); + if (sib != NilNode) { + if (_node == _node->parent->left) + return sib->right; + else + return sib->left; + } + return NilNode; + } + + template + typename RedBlackTree::RBTNode* RedBlackTree::closeNephew(RBTNode* _node) { + auto sib = sibling(_node); + if (sib != NilNode) { + if (_node == _node->parent->left) + return sib->left; + else + return sib->right; + } + return NilNode; + } + + template + void RedBlackTree::remove(RBTNode*) + { + } + + template + void RedBlackTree::insert(const KType& _value) { + RBTNode* new_node = new RBTNode(_value); + + auto temp_parent = NilNode; + auto temp = root; + + while (temp != NilNode) { + temp_parent = temp; + if (_value < temp->key) + temp = temp->left; + else + temp = temp->right; + } + + new_node->parent = temp_parent; + if (temp_parent == NilNode) + root = new_node; + else if (_value < temp_parent->key) + temp_parent->left = new_node; + else + temp_parent->right = new_node; + + new_node->left = NilNode; + new_node->right = NilNode; + new_node->color = NodeColor::RED; + insert_fixup(new_node); + } + + template + void RedBlackTree::insert(std::list& _list) + { + for (const auto& key : _list) { + insert(key); + } + } + + template + void RedBlackTree::remove(const KType& _value) + { + } +} +#endif //PHYSICSFORMULA_REDBLACKTREE_H diff --git a/RegexHelper.h b/RegexHelper.h index e12f1c3..5433698 100644 --- a/RegexHelper.h +++ b/RegexHelper.h @@ -1,54 +1,54 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_REGEXHELPER_H -#define PHYSICSFORMULA_REGEXHELPER_H -#include -#include -using namespace std::string_literals; - - - - -template -using t_string = -std::basic_string < CharT, std::char_traits, std::allocator>; - -template -using t_ss = -std::basic_stringstream, std::allocator>; - - -static struct RegularExpressionPatterns -{ - t_string EMAIL{ R"(^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$)"s }; - t_string PHONE{ R"(\d{3}-\d{3}-\d{4})"s }; - t_string ABSOLUTE_PATH{R"(^\/([A-z0-9-_+]+\/)*([A-z0-9]+\.(jpg|jpeg|txt|zip|png|pdf|doc|docx|exl|gif|dot|dotx|eml|bat|bin|bmp|exe|htm|html|css|iso))$)"s}; - t_string SSN{ R"(^(?!666|000|9\d{2})\d{3}-(?!00)\d{2}-(?!0{4})\d{4}$)"s }; - t_string IPV4{ R"((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))"s }; - t_string IPV6{ R"(((([0-9a-fA-F]){1,4})\:){7}([0-9a-fA-F]){1,4})"s }; - t_string MAC{ R"(^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})|([0-9a-fA-F]{4}\.[0-9a-fA-F]{4}\.[0-9a-fA-F]{4})$)"s }; - t_string MATH{ R"(^(?:[0-9 ()\.]+[*+/-])+[0-9 ()\.]+)"s }; - t_string ROOT_PATH{ R"(^[a-zA-Z]:.*([a-zA-Z]+([a-zA-Z]+)+).*[a-zA-Z]+$)"s }; - -}rgXRaw; - - -template -bool is_valid_format(t_string const& testString, t_string const pattern) -{ - auto rx = std::regex{ pattern, std::regex_constants::icase }; - return std::regex_match(testString, rx); -} - -inline auto reg_test = [](std::string const& text, std::string const& pattern) -{ - std::cout << std::setw(40) << std::left << text << " : " - << (is_valid_format(text, pattern) ? - - "valid format" : "invalid format") - << '\n'; -}; - -#endif //PHYSICSFORMULA_REGEXHELPER_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_REGEXHELPER_H +#define PHYSICSFORMULA_REGEXHELPER_H +#include +#include +using namespace std::string_literals; + + + + +template +using t_string = +std::basic_string < CharT, std::char_traits, std::allocator>; + +template +using t_ss = +std::basic_stringstream, std::allocator>; + + +static struct RegularExpressionPatterns +{ + t_string EMAIL{ R"(^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$)"s }; + t_string PHONE{ R"(\d{3}-\d{3}-\d{4})"s }; + t_string ABSOLUTE_PATH{R"(^\/([A-z0-9-_+]+\/)*([A-z0-9]+\.(jpg|jpeg|txt|zip|png|pdf|doc|docx|exl|gif|dot|dotx|eml|bat|bin|bmp|exe|htm|html|css|iso))$)"s}; + t_string SSN{ R"(^(?!666|000|9\d{2})\d{3}-(?!00)\d{2}-(?!0{4})\d{4}$)"s }; + t_string IPV4{ R"((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))"s }; + t_string IPV6{ R"(((([0-9a-fA-F]){1,4})\:){7}([0-9a-fA-F]){1,4})"s }; + t_string MAC{ R"(^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})|([0-9a-fA-F]{4}\.[0-9a-fA-F]{4}\.[0-9a-fA-F]{4})$)"s }; + t_string MATH{ R"(^(?:[0-9 ()\.]+[*+/-])+[0-9 ()\.]+)"s }; + t_string ROOT_PATH{ R"(^[a-zA-Z]:.*([a-zA-Z]+([a-zA-Z]+)+).*[a-zA-Z]+$)"s }; + +}rgXRaw; + + +template +bool is_valid_format(t_string const& testString, t_string const pattern) +{ + auto rx = std::regex{ pattern, std::regex_constants::icase }; + return std::regex_match(testString, rx); +} + +inline auto reg_test = [](std::string const& text, std::string const& pattern) +{ + std::cout << std::setw(40) << std::left << text << " : " + << (is_valid_format(text, pattern) ? + + "valid format" : "invalid format") + << '\n'; +}; + +#endif //PHYSICSFORMULA_REGEXHELPER_H diff --git a/RotationalMotion.h b/RotationalMotion.h index 3e6198f..9bf9627 100644 --- a/RotationalMotion.h +++ b/RotationalMotion.h @@ -1,470 +1,470 @@ -#ifndef PHYSICSFORMULA_ROTATIONALMOTION_H -#define PHYSICSFORMULA_ROTATIONALMOTION_H -/** - * @class RotationalMotion - * @details class to add to the Physics class to help with solving complex physics problems - * @author Ryan Zurrin - * @date 11/15/2020 - */ -#include "UniformCircularMotion.h" - -static int rotationalMotion_objectCount = 0; - -class RotationalMotion : UniformCircularMotion -{ -public: - RotationalMotion* _rotational_motionPtr; - /** - * @brief a structure filled with methods for finding the rotational inertia's of some commonly shaped objects - */ - static struct RotationalInertia - { - /** - * @brief calculates the moment of Inertia for a hoop about a cylinder axis - * @param M is the mass - * @param R is the radius - * @returns moment of inertia - */ - template - static auto hoop_aboutCylinderAxis(const T M, const T R) - { - return M * (R * R); - } - template - static auto hoop_aboutAnyDiameter(const T M, const T R) - { - return (M * (R * R)) / 2.0; - } - template - static auto solidCylinderOrDisk_aboutCylinderAxis(const T M, const T R) - { - return (M * (R * R)) / 2.0; - } - template - static auto thinRod_aboutAxisThroughCenterToLength(const T M, const T l) - { - return (M * (l * l)) / 12.0; - } - template - static auto solidSphere_aboutAnyDiameter(const T M, const T R) - { - return (2.0 * M * (R * R)) / 5.0; - } - template - static auto annularCylinderRing_aboutCylinderAxis(const T M, const T R1, const T R2) - { - return (M / 2.0)* ((R1 * R1) + (R2 * R2)); - } - template - static auto solidCylinder_aboutCentralDiameter(const T M, const T R, const T l) - { - return ((M * (R * R)) / 4.0) + ((M * (l * l)) / 12.0); - } - template - static auto thinRod_aboutAxisThroughOneEndToLength(const T M, const T l) - { - return (M * (l * l)) / 3.0; - } - template - static auto thinSphericalShell_aboutAnyDiameter(const T M, const T R) - { - return (2 * M * (R * R)) / 3; - } - template - static auto slab_aboutAxisThroughCenter(const T M, const T sideA, const T sideB) - { - return (M * ((sideA * sideA) + (sideB * sideB)) / 12.0); - } - }inertia; - - RotationalMotion() - { - _rotational_motionPtr = nullptr; - _angular_acceleration_ = 0.0; - _linear_acceleration_ = 0.0; - countIncrease(); - } - RotationalMotion(ld rpm, ld time) - { - _rotational_motionPtr = nullptr; - set_angularVelocityW_(conversion_revolutions_min_to_radians_second(rpm)); - _angular_acceleration_ = get_angularVelocityW() / time; - _linear_acceleration_ = rpm / time; - countIncrease(); - } - - void set_angular_acceleration(const ld ac) { _angular_acceleration_ = ac; } - void set_linear_acceleration(const ld ac) { _linear_acceleration_= ac; } - ld get_angular_acceleration()const { return _angular_acceleration_; } - ld get_linear_acceleration()const { return _linear_acceleration_; } - void show_angular_acceleration()const { cout << "angular acceleration: " << _angular_acceleration_ << endl; } - void show_linear_acceleration()const { cout << "linear acceleration: " <<_linear_acceleration_ << endl; } - - /** - * @brief calculates the angular acceleration - * @param w is the know angular velocity or torque - * @param rt is the radius or the time, if using torque use inertia(I) here Not r ro t - * @returns the angular acceleration - */ - ld static angularAcceleration(const ld w, const ld rt) - { - return w / rt; - } - - /** - * @brief calculate the angular acceleration using using net torque and the Inertia T/I - * - */ - ld static angularAcceleration(const ld F, const ld r, const ld I) - { - return (F*r)/ I; - } - - /** - * @brief calculates the angular acceleration using the transformed kinematics equation wf^2=wi^2+2*a*rad - * @param wi initial angular velocity - * @param wf final angular velocity - * @param rad total rotation in rad usually being multiplied by PI - * @returns the angular velocity rad/s^2 - */ - ld static angularAcceleration_K(const ld wi, const ld wf, const ld rad) - { - return ((wf * wf) - (wi * wi)) / (2 * (rad)); - } - - /** - * @brief calculates the angular acceleration of a spinning grind wheel with applied frictional coefficient - * @param mass is in kg - * @param r is the radius - * @param Force is the force being applied - * @param fC is the frictional Coefficient of the material being pressed to the wheel - * @returns the angular acceleration (2 * fC * Force) / (mass * r) - */ - ld static angularAcceleration_K(const ld mass, const ld r, const ld Force, const ld fC) - { - return ((2 * fC * Force) / (mass * r)); - } - - /** - * @brief calculates the angular acceleration using net torque and the rotational inertia of an object - * @param netTorque is the torque force - * @param I can be calculated with the inertia methods structure if not given - * @returns the angular acceleration - */ - ld static angularAcceleration_usingTorque_andInertia(const ld netTorque, const ld I) - { - return netTorque / I; - } - - /** - * @brief calculates the angular acceleration using the kinematics formula vf^2 = vi^2 + 2*a*t - * reworked as wf^2 = wi^2 + 2 * a * rotationTheta = w = (2*a*rotationTheta)^.5 - * @param angularAcceleration is the alpha - * @param radians is the angle rotating in radians - * @return angular velocity - */ - ld static angularVelocity_kinematicsFormula(const ld angularAcceleration, const ld radians) - { - return pow(2 * angularAcceleration * radians, .5); - } - - /** - * @brief calculates the angular velocity using the definition of angular momentum L=Iw so w=L/I - * @param Lv is the momentum of an object if L/I or the velocity if v/r v=tangential velocity(linear) - * @param Ir is the inertia of an object if L/I or the radius if v/r r= radius - * @return angular velocity rad/s - */ - ld static angularVelocity(const ld Lv, const ld Ir) - { - return Lv / Ir; - } - - /** - * @brief calculates the final angular velocity - * @param Aa is the angular acceleration - * @param seconds is the amount of seconds that pass - * @param wi is the initial angular velocity, default is at 0 - * @returns the final angular velocity - */ - ld static angularVelocity_final(const ld Aa, const ld seconds, const ld wi = 0.0) - { - return wi + Aa * seconds; - } - /** - * @brief calculates the linear acceleration - * @param lv is the known linear velocity - * @param tr is the time or radius, works with both - * @returns linear acceleration(tangential acceleration) - */ - ld static linearAcceleration(const ld lv, const ld tr) - { - return lv / tr; - } - - /** - * @brief calculates the angular momentum using radius, Force, and time - * @param r is the radius - * @param F is the force - * @param t is the time - * @returns momentum in kgm^2/s - */ - ld static angularMomentum(const ld r, const ld F, const ld t) - { - return r * F * t; - } - - /** - * @brief calculate the angular momentum of a object - * @param _I is the moment of inertia of the object - * @param w is the angular velocity - * @returns the the angular momentum kgm^2/s - */ - ld static angularMomentum(const ld _I, const ld w) - { - return _I * w; - } - - /** - * @brief calculates the linear acceleration which is (la = deltaV/deltaT, deltaV = rw, so la = r*deltaW/deltaT, a = deltaW/deltaT, so la = ra) - * @param r is the radius - * @param a is the angular acceleration - * @returns the tangential acceleration(linear acceleration) - */ - ld static tangentialAcceleration(const ld r, const ld a) - { - return r * a; - } - - /** - * @brief calculates the tangential velocity - * @param w is the angular velocity - * @param r is the radius - * @returns tangential velocity m/s - */ - ld static tangentialVelocity(const ld w, const ld r) - { - return w * r; - } - - /** - * @brief calculates the angular displacement using the adapted kinematics formula wf^2 =wi^2 + 2*a*t - * @param wi initial angular velocity - * @param wf final angular velocity - * @param Aa angular acceleration - * @param mode "rad" or "rev", radians or revolutions - * @returns the total displacement in rad must divide - */ - ld static theta_from_kinematics(const ld wi, const ld wf, const ld Aa, const string mode = "rev") - { - if(mode == "rad") - { - return ((wf * wf) - (wi * wi)) / (2 * (Aa)); - } - return ((wf * wf) - (wi * wi)) / (2 * (Aa))/(2*_PI_); - - } - - - /** - * @brief calculates the time to stop from known angular velocities - */ - ld static timeToStopSpinning(const ld startAngVelocity, const ld stoppingAngularAcceleration) - { - return -startAngVelocity / stoppingAngularAcceleration; - } - - /** - * @brief Sums inertia's of a system to return the total inertia - */ - ld static inertiaSUM(const ld i1 = 0.0, const ld i2 = 0.0, const ld i3 = 0.0,const ld i4 = 0.0, - const ld i5 = 0.0, const ld i6 = 0.0, const ld i7 = 0.0, const ld i8 = 0.0, - const ld i9 = 0.0, const ld i10 = 0.0, const ld i11 = 0.0, const ld i12 = 0.0) - { - return i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + i10 + i11 + i12; - } - - - /** - * @brief calculate the net Work done in rotation - * @param netTorque is the total sum of all the torques acting in a system - * @param rad is the total distance of rotation expressed in rad - * @returns net work causing rotation - */ - ld static netWork(const ld netTorque, const ld rad) - { - return netTorque * rad; - } - - /** - * @brief calculates the net torque - * @param L is the change in angular momentum - * @param t is the time it takes - * @returns the net torque - */ - ld static netTorque(const ld L, const ld t) - { - return L / t; - } - - /** - * @brief calculates the net torque using the radius and Force and angle - * @param r is the radius - * @param F is the force being applied in Newtons - * @param angleTheta is the angle the force is applied, default is at 90 degrees - * @return the net torque Nm - */ - ld static netTorque(const ld r, const ld F, const ld angleTheta = 90) - { - return r * F * sin(angleTheta * RADIAN); - } - - /** - * @brief calculates the work-energy-theorem for rotational motion only' - * @param iRi initial Rotational Inertia - * @param iAv initial Angular Velocity - * @param fRi final Rotational Inertia - * @param fAv final Angular Velocity - * @returns the net Work - */ - ld static work_energy_theorem_for_rotation(const ld iRi, const ld iAv, const ld fRi, const ld fAv) - { - return (.5 * fRi * (fAv * fAv)) - (.5 * iRi * (iAv * iAv)); - } - - /** - * @brief calculates the rotational kinetic energy for an object what a moment of inertia _I and an angualr velocity w - * @param _I is the moment of inertia - * @param w is the angular velocity - * @returns the rotational kinetic energy - */ - ld static kinetic_energy_for_rotation(const ld _I, const ld w) - { - return (.5 * _I * (w * w)); - } - - /** - * @brief finds the max height of a helicptor of mass m a known KE - */ - ld static maxHeight(const ld KE, const ld mass) - { - return ((KE) / (mass * _Ga_)); - } - - /** - * @brief calculates the speed of a cylinder rolling down an incline - */ - ld static speedOfRollingCylinder(const ld height) - { - return pow(((4.0 * _Ga_ * height) / 3.0), .5); - } - /** - * @brief calculates the distance something moves from the radius and the radians - * @param radius is the radius of thing moving - * @param radians is the total rotation in radians - * @returns the distance traveled. - */ - ld static distance(const ld radius, const ld radians) - { - return radius * radians; - } - - /** - * @brief calculates the distance traveled using the tangential velocity - * @param w is the angular velocity - * @param r is the radius in m - * @param seconds is the time in seconds - * @returns the distance traveled - */ - ld static distance(const ld w, const ld r, const ld seconds) - { - return w * r * seconds; - } - - /** - * @brief calculates the rotational torque which is the rotational analog of newtons law of F = ma - * @param m is the mass - * @param r is the radius - * @param aa is the angular acceleration - * @returns torque of rotation - */ - ld static rotationalTorque(const ld m, const ld r, const ld aa) - { - return m * (r * r) * aa; - } - - /** - * @brief calculates the angular velocity of a spinning ice skater - * @param exA_inertia is the inertia of the skater with arms extended - * @param exA_angularVelocity is the rate of the skaters spinning in rev/s - * @param clA_inertia is the inertia of the skater with closed arms - * @returns the angular velocity of the skater with closed arms - */ - ld static angularVelocitySpinningSkater(const ld exA_inertia, const ld exA_angularVelocity, const ld clA_inertia) - { - return (exA_inertia / clA_inertia) * exA_angularVelocity; - } - - /** - * @brief calculates the amount of revolutions it takes to stop spinning - */ - ld static revolutionsToStop(const ld a, const ld wi, const ld wf =0.0) - { - return (((wf * wf) - (wi * wi)) / (2 * a)) / (2 * _PI_); - } - - /** - * @brief calculates the force needed to be applied on a chain to get a bike wheel of a certain mass to - * a certain acceleration. - * @param tangentialResistiveForce is the resistive force applied against the force of the chain - * @param mass is the mass of the wheel in kg - * @param rOuter is the outer radius of wheel which is half of the diameter if that is what is given and it - * must be converted to m and not cm - * @param rInner is the radius of the the chain sprocket must be converted to m as well - * @param angAccel is the angular acceleration in question, we are looking for the force on the chain to - * reach this angular acceleration - * @returns the force on the chain in N (newtons) - */ - ld static forceOnChainToReachAngularAcceleration(const ld tangentialResistiveForce, const ld mass, const ld rOuter, const ld rInner, const ld angAccel ) - { - ld I = mass * (rOuter * rOuter); - ld Ti = rOuter * tangentialResistiveForce; - return (I * angAccel + Ti) / rInner; - } - - /** - * @brief calculates the system of answers for two point particles of mass m1 and m2 situated at the ends of a uniform rod of mass mRod that is capable - * of rotating about an axis through its center and perpendicular to its length. - * @param mRod is the mass of the rod - * @param lRod is the length of the rod - * @param m1 is the mass of point particle 1 - * @param m2 is the mass of point particle 2 - * @param w is the angular speed the rod rotates at - * @returns the vector with - * - */ - vector static inertiaAndKEofRotatingPointParticlesOnRod(const ld mRod, const ld lRod, const ld m1, const ld m2, const ld w) - { - vector results = { 0.0,0.0,0.0,0.0 }; - results[0] = (mRod * (lRod * lRod)) / (12) + (m1 * (lRod / 2.0)) + (m2 * (lRod / 2.0)); - results[1] = .5 * results[0] * (w * w); - results[2] = (m1 * (lRod / 2.0)) + (m2 * (lRod / 2.0)); - results[3] = .5 * results[2] * (w * w); - - return results; - } - - - ~RotationalMotion() - { - delete _rotational_motionPtr; - countDecrease(); - } - -private: - ld _angular_acceleration_; - ld _linear_acceleration_; - static void countIncrease() { rotationalMotion_objectCount += 1; } - static void countDecrease() { rotationalMotion_objectCount -= 1; } - -}; -#endif //PHYSICSFORMULA_ROTATIONALMOTION_H +#ifndef PHYSICSFORMULA_ROTATIONALMOTION_H +#define PHYSICSFORMULA_ROTATIONALMOTION_H +/** + * @class RotationalMotion + * @details class to add to the Physics class to help with solving complex physics problems + * @author Ryan Zurrin + * @date 11/15/2020 + */ +#include "UniformCircularMotion.h" + +static int rotationalMotion_objectCount = 0; + +class RotationalMotion : UniformCircularMotion +{ +public: + RotationalMotion* _rotational_motionPtr; + /** + * @brief a structure filled with methods for finding the rotational inertia's of some commonly shaped objects + */ + static struct RotationalInertia + { + /** + * @brief calculates the moment of Inertia for a hoop about a cylinder axis + * @param M is the mass + * @param R is the radius + * @returns moment of inertia + */ + template + static auto hoop_aboutCylinderAxis(const T M, const T R) + { + return M * (R * R); + } + template + static auto hoop_aboutAnyDiameter(const T M, const T R) + { + return (M * (R * R)) / 2.0; + } + template + static auto solidCylinderOrDisk_aboutCylinderAxis(const T M, const T R) + { + return (M * (R * R)) / 2.0; + } + template + static auto thinRod_aboutAxisThroughCenterToLength(const T M, const T l) + { + return (M * (l * l)) / 12.0; + } + template + static auto solidSphere_aboutAnyDiameter(const T M, const T R) + { + return (2.0 * M * (R * R)) / 5.0; + } + template + static auto annularCylinderRing_aboutCylinderAxis(const T M, const T R1, const T R2) + { + return (M / 2.0)* ((R1 * R1) + (R2 * R2)); + } + template + static auto solidCylinder_aboutCentralDiameter(const T M, const T R, const T l) + { + return ((M * (R * R)) / 4.0) + ((M * (l * l)) / 12.0); + } + template + static auto thinRod_aboutAxisThroughOneEndToLength(const T M, const T l) + { + return (M * (l * l)) / 3.0; + } + template + static auto thinSphericalShell_aboutAnyDiameter(const T M, const T R) + { + return (2 * M * (R * R)) / 3; + } + template + static auto slab_aboutAxisThroughCenter(const T M, const T sideA, const T sideB) + { + return (M * ((sideA * sideA) + (sideB * sideB)) / 12.0); + } + }inertia; + + RotationalMotion() + { + _rotational_motionPtr = nullptr; + _angular_acceleration_ = 0.0; + _linear_acceleration_ = 0.0; + countIncrease(); + } + RotationalMotion(ld rpm, ld time) + { + _rotational_motionPtr = nullptr; + set_angularVelocityW_(conversion_revolutions_min_to_radians_second(rpm)); + _angular_acceleration_ = get_angularVelocityW() / time; + _linear_acceleration_ = rpm / time; + countIncrease(); + } + + void set_angular_acceleration(const ld ac) { _angular_acceleration_ = ac; } + void set_linear_acceleration(const ld ac) { _linear_acceleration_= ac; } + ld get_angular_acceleration()const { return _angular_acceleration_; } + ld get_linear_acceleration()const { return _linear_acceleration_; } + void show_angular_acceleration()const { cout << "angular acceleration: " << _angular_acceleration_ << endl; } + void show_linear_acceleration()const { cout << "linear acceleration: " <<_linear_acceleration_ << endl; } + + /** + * @brief calculates the angular acceleration + * @param w is the know angular velocity or torque + * @param rt is the radius or the time, if using torque use inertia(I) here Not r ro t + * @returns the angular acceleration + */ + ld static angularAcceleration(const ld w, const ld rt) + { + return w / rt; + } + + /** + * @brief calculate the angular acceleration using using net torque and the Inertia T/I + * + */ + ld static angularAcceleration(const ld F, const ld r, const ld I) + { + return (F*r)/ I; + } + + /** + * @brief calculates the angular acceleration using the transformed kinematics equation wf^2=wi^2+2*a*rad + * @param wi initial angular velocity + * @param wf final angular velocity + * @param rad total rotation in rad usually being multiplied by PI + * @returns the angular velocity rad/s^2 + */ + ld static angularAcceleration_K(const ld wi, const ld wf, const ld rad) + { + return ((wf * wf) - (wi * wi)) / (2 * (rad)); + } + + /** + * @brief calculates the angular acceleration of a spinning grind wheel with applied frictional coefficient + * @param mass is in kg + * @param r is the radius + * @param Force is the force being applied + * @param fC is the frictional Coefficient of the material being pressed to the wheel + * @returns the angular acceleration (2 * fC * Force) / (mass * r) + */ + ld static angularAcceleration_K(const ld mass, const ld r, const ld Force, const ld fC) + { + return ((2 * fC * Force) / (mass * r)); + } + + /** + * @brief calculates the angular acceleration using net torque and the rotational inertia of an object + * @param netTorque is the torque force + * @param I can be calculated with the inertia methods structure if not given + * @returns the angular acceleration + */ + ld static angularAcceleration_usingTorque_andInertia(const ld netTorque, const ld I) + { + return netTorque / I; + } + + /** + * @brief calculates the angular acceleration using the kinematics formula vf^2 = vi^2 + 2*a*t + * reworked as wf^2 = wi^2 + 2 * a * rotationTheta = w = (2*a*rotationTheta)^.5 + * @param angularAcceleration is the alpha + * @param radians is the angle rotating in radians + * @return angular velocity + */ + ld static angularVelocity_kinematicsFormula(const ld angularAcceleration, const ld radians) + { + return pow(2 * angularAcceleration * radians, .5); + } + + /** + * @brief calculates the angular velocity using the definition of angular momentum L=Iw so w=L/I + * @param Lv is the momentum of an object if L/I or the velocity if v/r v=tangential velocity(linear) + * @param Ir is the inertia of an object if L/I or the radius if v/r r= radius + * @return angular velocity rad/s + */ + ld static angularVelocity(const ld Lv, const ld Ir) + { + return Lv / Ir; + } + + /** + * @brief calculates the final angular velocity + * @param Aa is the angular acceleration + * @param seconds is the amount of seconds that pass + * @param wi is the initial angular velocity, default is at 0 + * @returns the final angular velocity + */ + ld static angularVelocity_final(const ld Aa, const ld seconds, const ld wi = 0.0) + { + return wi + Aa * seconds; + } + /** + * @brief calculates the linear acceleration + * @param lv is the known linear velocity + * @param tr is the time or radius, works with both + * @returns linear acceleration(tangential acceleration) + */ + ld static linearAcceleration(const ld lv, const ld tr) + { + return lv / tr; + } + + /** + * @brief calculates the angular momentum using radius, Force, and time + * @param r is the radius + * @param F is the force + * @param t is the time + * @returns momentum in kgm^2/s + */ + ld static angularMomentum(const ld r, const ld F, const ld t) + { + return r * F * t; + } + + /** + * @brief calculate the angular momentum of a object + * @param _I is the moment of inertia of the object + * @param w is the angular velocity + * @returns the the angular momentum kgm^2/s + */ + ld static angularMomentum(const ld _I, const ld w) + { + return _I * w; + } + + /** + * @brief calculates the linear acceleration which is (la = deltaV/deltaT, deltaV = rw, so la = r*deltaW/deltaT, a = deltaW/deltaT, so la = ra) + * @param r is the radius + * @param a is the angular acceleration + * @returns the tangential acceleration(linear acceleration) + */ + ld static tangentialAcceleration(const ld r, const ld a) + { + return r * a; + } + + /** + * @brief calculates the tangential velocity + * @param w is the angular velocity + * @param r is the radius + * @returns tangential velocity m/s + */ + ld static tangentialVelocity(const ld w, const ld r) + { + return w * r; + } + + /** + * @brief calculates the angular displacement using the adapted kinematics formula wf^2 =wi^2 + 2*a*t + * @param wi initial angular velocity + * @param wf final angular velocity + * @param Aa angular acceleration + * @param mode "rad" or "rev", radians or revolutions + * @returns the total displacement in rad must divide + */ + ld static theta_from_kinematics(const ld wi, const ld wf, const ld Aa, const string mode = "rev") + { + if(mode == "rad") + { + return ((wf * wf) - (wi * wi)) / (2 * (Aa)); + } + return ((wf * wf) - (wi * wi)) / (2 * (Aa))/(2*_PI_); + + } + + + /** + * @brief calculates the time to stop from known angular velocities + */ + ld static timeToStopSpinning(const ld startAngVelocity, const ld stoppingAngularAcceleration) + { + return -startAngVelocity / stoppingAngularAcceleration; + } + + /** + * @brief Sums inertia's of a system to return the total inertia + */ + ld static inertiaSUM(const ld i1 = 0.0, const ld i2 = 0.0, const ld i3 = 0.0,const ld i4 = 0.0, + const ld i5 = 0.0, const ld i6 = 0.0, const ld i7 = 0.0, const ld i8 = 0.0, + const ld i9 = 0.0, const ld i10 = 0.0, const ld i11 = 0.0, const ld i12 = 0.0) + { + return i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + i10 + i11 + i12; + } + + + /** + * @brief calculate the net Work done in rotation + * @param netTorque is the total sum of all the torques acting in a system + * @param rad is the total distance of rotation expressed in rad + * @returns net work causing rotation + */ + ld static netWork(const ld netTorque, const ld rad) + { + return netTorque * rad; + } + + /** + * @brief calculates the net torque + * @param L is the change in angular momentum + * @param t is the time it takes + * @returns the net torque + */ + ld static netTorque(const ld L, const ld t) + { + return L / t; + } + + /** + * @brief calculates the net torque using the radius and Force and angle + * @param r is the radius + * @param F is the force being applied in Newtons + * @param angleTheta is the angle the force is applied, default is at 90 degrees + * @return the net torque Nm + */ + ld static netTorque(const ld r, const ld F, const ld angleTheta = 90) + { + return r * F * sin(angleTheta * RADIAN); + } + + /** + * @brief calculates the work-energy-theorem for rotational motion only' + * @param iRi initial Rotational Inertia + * @param iAv initial Angular Velocity + * @param fRi final Rotational Inertia + * @param fAv final Angular Velocity + * @returns the net Work + */ + ld static work_energy_theorem_for_rotation(const ld iRi, const ld iAv, const ld fRi, const ld fAv) + { + return (.5 * fRi * (fAv * fAv)) - (.5 * iRi * (iAv * iAv)); + } + + /** + * @brief calculates the rotational kinetic energy for an object what a moment of inertia _I and an angualr velocity w + * @param _I is the moment of inertia + * @param w is the angular velocity + * @returns the rotational kinetic energy + */ + ld static kinetic_energy_for_rotation(const ld _I, const ld w) + { + return (.5 * _I * (w * w)); + } + + /** + * @brief finds the max height of a helicptor of mass m a known KE + */ + ld static maxHeight(const ld KE, const ld mass) + { + return ((KE) / (mass * _Ga_)); + } + + /** + * @brief calculates the speed of a cylinder rolling down an incline + */ + ld static speedOfRollingCylinder(const ld height) + { + return pow(((4.0 * _Ga_ * height) / 3.0), .5); + } + /** + * @brief calculates the distance something moves from the radius and the radians + * @param radius is the radius of thing moving + * @param radians is the total rotation in radians + * @returns the distance traveled. + */ + ld static distance(const ld radius, const ld radians) + { + return radius * radians; + } + + /** + * @brief calculates the distance traveled using the tangential velocity + * @param w is the angular velocity + * @param r is the radius in m + * @param seconds is the time in seconds + * @returns the distance traveled + */ + ld static distance(const ld w, const ld r, const ld seconds) + { + return w * r * seconds; + } + + /** + * @brief calculates the rotational torque which is the rotational analog of newtons law of F = ma + * @param m is the mass + * @param r is the radius + * @param aa is the angular acceleration + * @returns torque of rotation + */ + ld static rotationalTorque(const ld m, const ld r, const ld aa) + { + return m * (r * r) * aa; + } + + /** + * @brief calculates the angular velocity of a spinning ice skater + * @param exA_inertia is the inertia of the skater with arms extended + * @param exA_angularVelocity is the rate of the skaters spinning in rev/s + * @param clA_inertia is the inertia of the skater with closed arms + * @returns the angular velocity of the skater with closed arms + */ + ld static angularVelocitySpinningSkater(const ld exA_inertia, const ld exA_angularVelocity, const ld clA_inertia) + { + return (exA_inertia / clA_inertia) * exA_angularVelocity; + } + + /** + * @brief calculates the amount of revolutions it takes to stop spinning + */ + ld static revolutionsToStop(const ld a, const ld wi, const ld wf =0.0) + { + return (((wf * wf) - (wi * wi)) / (2 * a)) / (2 * _PI_); + } + + /** + * @brief calculates the force needed to be applied on a chain to get a bike wheel of a certain mass to + * a certain acceleration. + * @param tangentialResistiveForce is the resistive force applied against the force of the chain + * @param mass is the mass of the wheel in kg + * @param rOuter is the outer radius of wheel which is half of the diameter if that is what is given and it + * must be converted to m and not cm + * @param rInner is the radius of the the chain sprocket must be converted to m as well + * @param angAccel is the angular acceleration in question, we are looking for the force on the chain to + * reach this angular acceleration + * @returns the force on the chain in N (newtons) + */ + ld static forceOnChainToReachAngularAcceleration(const ld tangentialResistiveForce, const ld mass, const ld rOuter, const ld rInner, const ld angAccel ) + { + ld I = mass * (rOuter * rOuter); + ld Ti = rOuter * tangentialResistiveForce; + return (I * angAccel + Ti) / rInner; + } + + /** + * @brief calculates the system of answers for two point particles of mass m1 and m2 situated at the ends of a uniform rod of mass mRod that is capable + * of rotating about an axis through its center and perpendicular to its length. + * @param mRod is the mass of the rod + * @param lRod is the length of the rod + * @param m1 is the mass of point particle 1 + * @param m2 is the mass of point particle 2 + * @param w is the angular speed the rod rotates at + * @returns the vector with + * + */ + vector static inertiaAndKEofRotatingPointParticlesOnRod(const ld mRod, const ld lRod, const ld m1, const ld m2, const ld w) + { + vector results = { 0.0,0.0,0.0,0.0 }; + results[0] = (mRod * (lRod * lRod)) / (12) + (m1 * (lRod / 2.0)) + (m2 * (lRod / 2.0)); + results[1] = .5 * results[0] * (w * w); + results[2] = (m1 * (lRod / 2.0)) + (m2 * (lRod / 2.0)); + results[3] = .5 * results[2] * (w * w); + + return results; + } + + + ~RotationalMotion() + { + delete _rotational_motionPtr; + countDecrease(); + } + +private: + ld _angular_acceleration_; + ld _linear_acceleration_; + static void countIncrease() { rotationalMotion_objectCount += 1; } + static void countDecrease() { rotationalMotion_objectCount -= 1; } + +}; +#endif //PHYSICSFORMULA_ROTATIONALMOTION_H diff --git a/RunTimer.h b/RunTimer.h index 83aa2b7..24fbd40 100644 --- a/RunTimer.h +++ b/RunTimer.h @@ -1,91 +1,91 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_RUNTIMER_H -#define PHYSICSFORMULA_RUNTIMER_H -#include -#include -using namespace std; -// create an enum for the different units of time -enum TimeUnit { - SECONDS, - MILLISECONDS, - MICROSECONDS, - NANOSECONDS -}; - -class RunTimer { -private: - chrono::time_point start_; - chrono::time_point end_; - chrono::nanoseconds elapsed_{}; - TimeUnit timeUnit; -public: - RunTimer(); - explicit RunTimer(TimeUnit unit); - void start(); - void stop(); - [[nodiscard]] chrono::nanoseconds elapsed() const; - void setTimeUnit(TimeUnit unit); - [[nodiscard]] TimeUnit getTimeUnit() const; - void display() const; -}; -#endif //PHYSICSFORMULA_RUNTIMER_H - -inline RunTimer::RunTimer() { - start_ = chrono::system_clock::now(); - end_ = chrono::system_clock::now(); - elapsed_ = chrono::nanoseconds(0); - timeUnit = TimeUnit::NANOSECONDS; -} - -inline RunTimer::RunTimer(TimeUnit unit) { - start_ = chrono::system_clock::now(); - end_ = chrono::system_clock::now(); - elapsed_ = chrono::nanoseconds(0); - timeUnit = unit; -} - -inline void RunTimer::start() { - start_ = chrono::system_clock::now(); - -} - -inline void RunTimer::stop() { - end_ = chrono::system_clock::now(); - elapsed_ = end_ - start_; -} - -inline chrono::nanoseconds RunTimer::elapsed() const -{ - return elapsed_; -} - -inline void RunTimer::setTimeUnit(TimeUnit unit) { - timeUnit = unit; -} - -inline TimeUnit RunTimer::getTimeUnit() const -{ - return timeUnit; -} - -inline void RunTimer::display() const -{ - switch (timeUnit) { - case TimeUnit::SECONDS: - cout << "Elapsed seconds: " << elapsed_.count() / 1000000000.0 << " seconds" << endl; - break; - case TimeUnit::MILLISECONDS: - cout << "Elapsed milliseconds: " << elapsed_.count() / 1000000.0 << " milliseconds" << endl; - break; - case TimeUnit::MICROSECONDS: - cout << "Elapsed microseconds: " << elapsed_.count() / 1000.0 << " microseconds" << endl; - break; - case TimeUnit::NANOSECONDS: - cout << "Elapsed nanoseconds: " << elapsed_.count() << " nanoseconds" << endl; - break; - } -} - +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_RUNTIMER_H +#define PHYSICSFORMULA_RUNTIMER_H +#include +#include +using namespace std; +// create an enum for the different units of time +enum TimeUnit { + SECONDS, + MILLISECONDS, + MICROSECONDS, + NANOSECONDS +}; + +class RunTimer { +private: + chrono::time_point start_; + chrono::time_point end_; + chrono::nanoseconds elapsed_{}; + TimeUnit timeUnit; +public: + RunTimer(); + explicit RunTimer(TimeUnit unit); + void start(); + void stop(); + [[nodiscard]] chrono::nanoseconds elapsed() const; + void setTimeUnit(TimeUnit unit); + [[nodiscard]] TimeUnit getTimeUnit() const; + void display() const; +}; +#endif //PHYSICSFORMULA_RUNTIMER_H + +inline RunTimer::RunTimer() { + start_ = chrono::system_clock::now(); + end_ = chrono::system_clock::now(); + elapsed_ = chrono::nanoseconds(0); + timeUnit = TimeUnit::NANOSECONDS; +} + +inline RunTimer::RunTimer(TimeUnit unit) { + start_ = chrono::system_clock::now(); + end_ = chrono::system_clock::now(); + elapsed_ = chrono::nanoseconds(0); + timeUnit = unit; +} + +inline void RunTimer::start() { + start_ = chrono::system_clock::now(); + +} + +inline void RunTimer::stop() { + end_ = chrono::system_clock::now(); + elapsed_ = end_ - start_; +} + +inline chrono::nanoseconds RunTimer::elapsed() const +{ + return elapsed_; +} + +inline void RunTimer::setTimeUnit(TimeUnit unit) { + timeUnit = unit; +} + +inline TimeUnit RunTimer::getTimeUnit() const +{ + return timeUnit; +} + +inline void RunTimer::display() const +{ + switch (timeUnit) { + case TimeUnit::SECONDS: + cout << "Elapsed seconds: " << elapsed_.count() / 1000000000.0 << " seconds" << endl; + break; + case TimeUnit::MILLISECONDS: + cout << "Elapsed milliseconds: " << elapsed_.count() / 1000000.0 << " milliseconds" << endl; + break; + case TimeUnit::MICROSECONDS: + cout << "Elapsed microseconds: " << elapsed_.count() / 1000.0 << " microseconds" << endl; + break; + case TimeUnit::NANOSECONDS: + cout << "Elapsed nanoseconds: " << elapsed_.count() << " nanoseconds" << endl; + break; + } +} + diff --git a/Segment.h b/Segment.h index 476a73d..99d971f 100644 --- a/Segment.h +++ b/Segment.h @@ -1,37 +1,37 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_SEGMENT_H -#define PHYSICSFORMULA_SEGMENT_H -#include "Point.h" - -namespace rez { - - struct Segment { - Point3d& p1; - Point3d& p2; - }; - - struct Segment2d { - Point2d p1 = DEFAULT_POINT_2D; - Point2d p2 = DEFAULT_POINT_2D; - Segment2d() {} - - //Segment2d(Point2d _p1, Point2d _p2) : p1(_p1), p2(_p2) {} - Segment2d(Point2d& _p1, Point2d& _p2) : p1(_p1), p2(_p2) {} - - double get_x(double y) const - { - double x1 = p1[X]; - double y1 = p1[Y]; - double x2 = p2[X]; - double y2 = p2[Y]; - - double y2_y1 = y2 - y1; - - return y * (x2 - x1) / y2_y1 + (y2 * x1 - y1 * x2) / y2_y1; - } - }; -} -#endif //PHYSICSFORMULA_SEGMENT_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_SEGMENT_H +#define PHYSICSFORMULA_SEGMENT_H +#include "Point.h" + +namespace rez { + + struct Segment { + Point3d& p1; + Point3d& p2; + }; + + struct Segment2d { + Point2d p1 = DEFAULT_POINT_2D; + Point2d p2 = DEFAULT_POINT_2D; + Segment2d() {} + + //Segment2d(Point2d _p1, Point2d _p2) : p1(_p1), p2(_p2) {} + Segment2d(Point2d& _p1, Point2d& _p2) : p1(_p1), p2(_p2) {} + + double get_x(double y) const + { + double x1 = p1[X]; + double y1 = p1[Y]; + double x2 = p2[X]; + double y2 = p2[Y]; + + double y2_y1 = y2 - y1; + + return y * (x2 - x1) / y2_y1 + (y2 * x1 - y1 * x2) / y2_y1; + } + }; +} +#endif //PHYSICSFORMULA_SEGMENT_H diff --git a/SpecialRelativity.h b/SpecialRelativity.h index 642a9c5..ca96119 100644 --- a/SpecialRelativity.h +++ b/SpecialRelativity.h @@ -1,867 +1,867 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_SPECIALRELATIVITY_H -#define PHYSICSFORMULA_SPECIALRELATIVITY_H -/** - * class: SpecialRelativity - * details: driver class for solving complex physics problems - * author: Ryan Zurrin - * dateBuilt: 5/3/2021 - * lastEdit: 5/15/2021 - */ -//α=224,ß=225,π=227,Σ=228,σ=229,µ=230,τ=231,Φ=232,Θ=233 -//Ω=234,δ=235,∞=236,φ=237,ε=238,∩=239,≡=240,gamma=226,gamma, σ, ϑ, Å, Ώ, lambda, gamma - -#include - -//#include "VisionOpticalInstruments.h" -static int specialRelativity_objectCount = 0; -typedef long double ld; - -inline static auto lFactor = [](const T & v) { - const auto upsilon = 1.0 / sqrt(1.0 - (v * v)); - std::cout << "gamma: "<< upsilon; - return upsilon; -}; - - -class SpecialRelativity: - public VisionOpticalInstruments -{ -public: - SpecialRelativity* _specialRelativityPtr; - - SpecialRelativity() - { - _specialRelativityPtr = nullptr; - specialRelativityVar = 0.0; - countIncrease(); - } - - /** - * @brief copy constructor - */ - SpecialRelativity(const SpecialRelativity& t) - { - _specialRelativityPtr = t._specialRelativityPtr; - specialRelativityVar = t.specialRelativityVar; - countIncrease(); - } - /** - * #brief move constructor - */ - SpecialRelativity(SpecialRelativity&& t) noexcept - { - _specialRelativityPtr = t._specialRelativityPtr; - specialRelativityVar = t.specialRelativityVar; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - SpecialRelativity& operator=(SpecialRelativity&& t) noexcept - { - if (this != &t) - { - _specialRelativityPtr = t._specialRelativityPtr; - specialRelativityVar = t.specialRelativityVar; - countIncrease(); - } - return *this; - } - - static void show_objectCount() { std::cout << "\n special relativity object count: " - << specialRelativity_objectCount << std::endl; } - static int get_objectCount() { return specialRelativity_objectCount; } - - /// - /// Calculates the Lorentz factor(gamma) if v is a decimal of the percent of the - /// speed of light, for instance if something was going half the speed of - /// light you would put a value of .500 for v. - /// - /// The velocity . - /// Lorentz factor, gamma (gamma) - template - static constexpr auto lorentzFactor(const T upsilon); - - - /// - /// Find the value of gamma(gamma) for the following situation. An Earth-bound - /// observer measures t h to have passed while signals from a high-velocity - /// space probe indicate that t_o h have passed on board. - /// - /// The relativistic time(should be greater then proper). - /// The proper time. - /// value of gamma, Lorentz factor - template - static constexpr auto lorentzValue(const T t, const K t_o); - - /// - /// Particles called π-mesons are produced by accelerator beams. If these - /// particles travel at v m/s and live t s when at rest - /// relative to an observer, this method will calculate how long they - /// live as viewed in the laboratory? - /// - /// The speed of particle. - /// The time in seconds particle can live. - /// relativistic time alive is seconds, time dilation - template - static constexpr auto relativisticTimeDilation(const T upsilon, const K t_o); - - /// - /// Suppose a particle called a kaon is created by cosmic radiation striking - /// the atmosphere. It moves by you at vc, and it lives t s when - /// at rest relative to an observer. How long does it live as you observe it? - /// - /// The velocity . - /// The relatively observed time. - /// time from observers perspective - template - static constexpr auto timeDilation(const T upsilonc, const K t_o); - - /// - /// A neutral π-meson is a particle that can be created by accelerator - /// beams. If one such particle lives t s as measured in the - /// laboratory, and t_o s when at rest relative to an observer, - /// what is its velocity relative to the laboratory? - /// - /// The observed time. - /// The proper time, time at rest. - /// speed relative to the observed time - template - static constexpr auto relativeVelocity(const T t, const K t_o); - - /// - /// If relativistic effects are to be less than percent_gamma %, then gamma must be less - /// than x = 1.00 + %. At what relative velocity is gamma=x - /// - /// The percent of Lorentz(gamma). - /// speed to achieve desired percent of Lorentz factor - template - static constexpr auto relativeVelocity_percentLorentz(const T percent_gamma); - - /// - /// Calculate at what relative velocity is gamma= gamma - /// - /// The gamma. - /// - template - static constexpr auto relativeVelocity_lorantzAt(const T gamma); - - /// - /// A neutron lives t_o s when at rest relative to an observer. How fast - /// is the neutron moving relative to an observer who measures its life - /// span to be t s? - /// - /// The time at rest with respect to observer(proper time). - /// The observed time. - /// speed of particle as measured by while being observed in - /// under proper time - template - static constexpr auto observedVelocity(const T t, const K t_o); - - - /// - /// A spaceship, L_o m long as seen on board, moves by the Earth at vc. - /// (.950 = .950c) ->leave out the c but this is what % of the speed of - /// light something is traveling. - /// What is its length as measured by an Earth-bound observer? - /// - /// The actual length. - /// The velocity relative to light speed c. - /// observed length, relativistic length - template - static constexpr auto lengthContraction(const T L_o, const K vc); - - /// - /// How fast would a l_o m-long sports car have to be going past you in - /// order for it to appear only l m long? - /// - /// The original length, real length. - /// The relativistic length. - /// velocity to appear length - template - static constexpr auto speedToAppearSomeLength(const T l_o, const K l); - - /// - /// Suppose a cosmic ray colliding with a nucleus in the Earth’s upper - /// atmosphere produces a muon that has a velocity v=0.950c(vc). The muon then - /// travels at constant velocity and lives 1.52μs(t_o) as measured in the muon’s - /// frame of reference. (You can imagine this as the muon’s internal clock.) - /// How long does the muon live as measured by an Earth-bound observer? - /// - /// The t o. - /// The vc. - /// distance traveled by particle from stationary observers - /// perspective - template - static constexpr auto distanceTraveled_earthBoundObserver(const T t_o, const K vc); - - /// - /// Suppose a cosmic ray colliding with a nucleus in the Earth’s upper - /// atmosphere produces a muon that has a velocity v=0.950c(vc). The muon then - /// travels at constant velocity and lives 1.52μs(t_o) as measured in the muon’s - /// frame of reference. (You can imagine this as the muon’s internal clock.) - /// How far does it travel as viewed by an observer moving with it? - /// Base your calculation on its velocity relative to the Earth and the - /// time it lives (proper time) - /// - /// The t o. - /// The vc. - /// distance traveled (m) - template - static constexpr auto distanceTraveled_proper(const T t_o, const K vc); - - - /// - /// Verify that two distances are related through length contraction - /// if gamma = gamma. - /// - /// The proper length. - /// The gamma. - /// contracted length - template - static constexpr auto contractedLength(const T l_o, const K gamma); - - /// - /// How long does it take the astronaut to travel - /// l_o units at vc units of speed (as measured by the Earth- bound observer) - /// - /// The proper length. - /// The velocity with respect to speed of light. - /// time to travel some distance - template - static constexpr auto time(const T l_o, const K vc); - - /// - /// How long does it take a astronaut to travel t units at a speed of vc units - /// according to the astronaut, which is proper time - /// - /// The relativistic time. - /// The speed. - /// proper time - template - static constexpr auto properTime(const T t, const K vc); - - /// - /// Verify time is related through time dilation with gamma = gamma as given. - /// - /// The t o. - /// The gamma. - /// - template - static constexpr auto timeGamma(const T t_o, const K gamma); - - /// - /// A spaceship is heading directly toward the Earth at a velocity of - /// 0.800c(uv) . The astronaut on board claims that he can send a canister - /// toward the Earth at 1.20c(v) relative to the Earth. Calculate the - /// velocity the canister must have relative to the spaceship. - /// - /// The v. - /// The uv. - /// speed relativity relationship - template - static constexpr auto relative_velocity_away(const T v, const K uv); - - /// - /// Relatives the velocity towards. - /// - /// The v. - /// The uv. - /// - template - static constexpr auto relative_velocity_towards(const T v, const K uv); - - /// - /// When a missile is shot from one spaceship towards another, it leaves - /// the first at 0.950c(u_) and approaches the other at 0.750c(u). What is the - /// relative velocity of the two ships? - /// - /// The relative velocity of object to observer . - /// The relative velocity to the other observer. - /// relative velocity between the two observers - template - static constexpr auto relativeVelocity_between2Objects(const T u, const K u_); - - /// - /// Suppose the speed of light were only 3000 m/s(c_) . A jet fighter moving - /// toward a target on the ground at 800 m/s(v) shoots bullets, each having a - /// muzzle velocity of 1000 m/s(uv). calculate the bullets’ velocity relative - /// to the target. - /// - /// The velocity of observer. - /// The velocity of object. - /// The speed of light. - /// velocity relative to target - template - static constexpr auto relative_velocity(const T v, const K uv, const C c_); - - /// - /// If a galaxy moving away from the Earth has a speed of 1000 km/s(u) and - /// emits 656 nm(lambda_s) light characteristic of hydrogen (the most common element - /// in the universe). Calculate the wavelength we observe on the Earth - /// - /// The speed. - /// The wavelength source. - /// observed wavelength - template - static constexpr auto wavelengthObserved(const T u, const K lambda_s); - - /// - /// A space probe speeding towards the nearest star moves at 0.250c(u) and - /// sends radio information at a broadcast frequency of 1.00 GHz(f_s). - /// Calculate what frequency is received on the Earth. - /// - /// The speed. - /// The f s. - /// - template - static constexpr auto frequencyObserved(const T uc, const K f_s); - - /// - /// Near the center of our galaxy, hydrogen gas is moving directly away - /// from us in its orbit about a black hole. We receive 1900(lambda_obs) nm electromagnetic - /// radiation and know that it was 1875 nm(lambda_s) when emitted by the hydrogen gas. - /// What is the speed of the gas - /// - /// The lambda s. - /// The lambda obs. - /// - template - static constexpr auto velocity_fromWaveLengths(const T lambda_s, const K lambda_obs); - - /// - /// A highway patrol officer uses a device that measures the speed of - /// vehicles by bouncing radar off them and measuring the Doppler shift. - /// The outgoing radar has a frequency of 100 GHz(f_S) and the returning echo - /// has a frequency 15.0 kHz(increase) higher. What is the velocity of the vehicle? - /// Note that there are two Doppler shifts in echoes. Be certain not to - /// round off until the end of the problem, because the effect is small. - /// - /// The frequency from the source. - /// The increase in the frequency from it bouncing - /// back to the radar gun. - /// velocity of moving object the frequency bounced off of - template - static constexpr auto velocity_fromFrequencyEcho(const T f_s, const K increase); - - /// - /// All but the closest galaxies are receding from our own Milky Way Galaxy. - /// If a galaxy 12.0×109 ly(l_o) away is receding from us at 0.900c(v), if - /// the velocity relative to us of the probe moving towards the other galaxy - /// is 0.99947c(u), as measured from that galaxy, calculate - /// How long it will take the probe to reach the other galaxy as - /// measured from the Earth. You may assume that the velocity of the other - /// galaxy remains constant. - /// The u. - /// The v. - /// The l o. - /// time for probe to reach other galaxy - template - static constexpr auto relativisticTime(const T u, const K v, const L l_o); - - /// - /// Find the momentum of a helium nucleus having a mass of 6.68×10−27 kg(m) - /// that is moving at 0.200c.(u) - /// - /// The mass. - /// The velocity. - /// relativistic momentum - template - static constexpr auto relativisticMomentum(const T m, const K u); - - /// - /// One cosmic ray neutron has a velocity of 0.250c relative to the Earth. - /// Calculate its momentum. - /// - /// The velocity. - /// The rest energy, can be looked up in tables. - /// momentum - template - static constexpr auto momentum_fromEnergies(const V v, const E E_o); - - /// - /// Find the momentum of a 1.00×109 kg(m) asteroid heading towards the - /// Earth at 30.0 km/s(u). - /// - /// The m. - /// The u. - /// - template - static constexpr auto momentum_slowerObject(const T m, const K u); - - /// - /// Find the ratio of this momentum to the classical momentum. - /// (Use the approximation that gamma=1+12v2c2 at low velocities.) - /// - /// The velocity. - /// gamma, Lorentz factor - template - static constexpr auto momentumRatios_classical2relativistic(const T v); - - /// - /// What is the velocity of an electron that has a momentum of - /// 3.04×10−21 kg⋅m/s?(p) Note that you must calculate the velocity to - /// at least four digits to see the difference from c. - /// - /// The relativistic momentum. - /// The mass. - /// velocity - template - static constexpr auto velocityFrom_momentum(const T p, const M m); - - /// - /// What is the rest energy of an electron, given its mass is 9.11 - /// *10^-31 kg(m) - /// - /// The mass. - /// energy in joules - template - static constexpr auto newtonsEnergy(const T m); - - /// - /// Calculates the mass from rest energy. - /// - /// The rest energy o. - /// mass in kg - template - static constexpr auto mass_fromRestEnergy(const T E_o); - - /// - /// If the rest energies of a proton and a neutron (the two constituents - /// of nuclei) are 938.3(E_o2) and 939.6(E_o1) MeV respectively, what is the difference - /// in their masses in kilograms? - /// - /// The rest energy 1. - /// The rest energy 2. - /// difference in Mass - template - static constexpr auto difference_inMass_fromRestEnergies(const T E_o1, const K E_o2); - - /// - /// The Big Bang that began the universe is estimated to have released - /// 10^68 J(E_o) of energy. How many stars could half this energy create, - /// assuming the average star's mass is 4.00×1030 kg(m). - /// - /// The rest energy. - /// The mass. - /// N objects that can be made(stars) from energy - template - static constexpr auto objectsMade(const T E_o, const K m); - - /// - /// Relativistics the total energy. - /// - /// The p. - /// The m. - /// - template - static constexpr auto relativisticTotalEnergy(const P p, const M m); - - /// - /// A supernova explosion of a 2.00×1030 kg star produces 1.00×1044 J of - /// energy. What is the ratio Δm/m_i of mass destroyed to the original - /// mass of the star? - /// - /// The m. - /// The m i. - /// - template - static constexpr auto ratioOfMassUsedAsEnergy(const T m, const K m_i); - - /// - /// Calculates the kinetics energy. - /// - /// gamma. - /// The mass. - /// kinetic energy (J) - template - static constexpr auto kineticEnergy(const T gamma, const K m); - - /// - /// Totals the energy. - /// - /// The e o. - /// The v. - /// - template - static constexpr auto totalEnergy(const E E_o, const V v); - - /// - /// Calculate the relativistic kinetic energy of a 1000-kg(m) car moving at - /// 30.0 m/s(v) if the speed of light were only 45.0 m/ s(c_). - /// - /// The velocity. - /// The mass. - /// The speed of light. - /// relativistic kinetic energy - template - static auto relativisticKineticEnergy(const V v, const M m, const C c_ = _C_); - - /// - /// Calculate the kinetic energy in MeV of a π-meson that lives 1.40×10−16 s(t) - /// as measured in the laboratory, and 0.840×10−16 s(t_o) when at rest relative - /// to an observer, given that its rest energy is 135 MeV(E_o) - /// - /// The proper time. - /// time dilation. - /// The rest energy. - /// kinetic energy - template - static constexpr auto kineticEnergy_fromTimesAndRestEnergy(const T t_o, const T1 t, const E E_o); - - /// - /// A muon has a rest mass energy of 105.7 MeV(m_i), and it decays into an - /// electron(m_d = .5110MeV) and a mass-less particle. If all the lost - /// mass is converted into the electron’s kinetic energy, find gamma for the - /// electron. - /// - /// The initial rest mass. - /// The rest mass of particle after decay. - /// - template - static constexpr auto gamma_fromRestMassesOfDecayingParticle(const T m_i, const M m_d); - - /// - /// A π-meson is a particle that decays into a muon and a mass-less particle. - /// The π-meson has a rest mass energy of 139.6 MeV(E_i), and the muon has a - /// rest mass energy of 105.7 MeV(E_f). Suppose the π-meson is at rest and all - /// of the missing mass goes into the muon’s kinetic energy.Calculate How fast - /// the muon moves. - /// - /// The e i. - /// The e f. - /// gamma gamma - template - static constexpr auto gamma_fromRestMassEnergies(const T E_i, const E E_f); - - /// - /// What is gamma for a proton->(q) having a mass energy of 938.3 MeV->(M) accelerated - /// through an effective potential of 1.0 TV(teravolt)->(volts) at Fermilab - /// outside Chicago - /// - /// The charge of the particle. - /// The volts. - /// The mass energy. - /// gamma gamma - template - static constexpr auto gamma_fromAccelerationThroughVoltage(const Q q, const V volts, const M m); - - /// - /// Calculate the effective accelerating potential for electrons->(m) at the - /// Stanford Linear Accelerator, if gamma=1.00×105->(gamma) for them - /// - /// gamma (gamma). - /// The mass of particle. - /// The charge of particle. - /// the effective volts needed to accelerate particle - template - static constexpr auto effectiveAccelerationPotential(const G gamma, const M m, const Q q); - - /// - /// Using a calculation of the energy released by the destruction of 1.00 kg->(m) - /// of mass. Calculate how many kilograms could be lifted to a 10.0 km->(h) - /// height by this amount of energy? - /// - /// The m. - /// The h. - /// - template - static constexpr auto forDestructionMassHowManyKgCanBeLiftedHeightKm(const M m, const H h); - - - - - ~SpecialRelativity() - { - delete _specialRelativityPtr; - } - void setTemplateVar(ld var) { specialRelativityVar = var; } - ld getTemplateVar() const { return specialRelativityVar; } - -private: - ld specialRelativityVar; - static void countIncrease() { specialRelativity_objectCount += 1; } - static void countDecrease() { specialRelativity_objectCount -= 1; } - -}; - -#endif //PHYSICSFORMULA_SPECIALRELATIVITY_H - -template -constexpr auto SpecialRelativity::lorentzFactor(const T upsilon) -{ - return 1.0 / sqrt(1.0 - (upsilon * upsilon)); -} - -template -constexpr auto SpecialRelativity::lorentzValue(const T t, const K t_o) -{ - return t / t_o; -} - -template -constexpr auto SpecialRelativity::relativisticTimeDilation(const T upsilon, const K t_o) -{ - return t_o / sqrt(1.0 - ((upsilon * upsilon)/(C_*C_) )); -} - -template -constexpr auto SpecialRelativity::timeDilation(const T upsilonc, const K t_o) -{ - return t_o / sqrt(1.0 - (upsilonc * upsilonc)); -} - -template -constexpr auto SpecialRelativity::relativeVelocity(const T t, const K t_o) -{ - return (_C_ / t) * sqrt(pow(t, 2) - pow(t_o, 2)); -} - -template -constexpr auto SpecialRelativity::relativeVelocity_percentLorentz(const T percent_gamma) -{// gamma = gamma = Lorentz - const auto gamma = 1.00 + percent_gamma / 100; - return (_C_ / gamma) * sqrt((gamma * gamma) - 1); -} - -template -constexpr auto SpecialRelativity::relativeVelocity_lorantzAt(const T gamma) -{ - return _C_ * sqrt(1.0 - (1.0 / (gamma * gamma))); -} - -template -constexpr auto SpecialRelativity::observedVelocity(const T t, const K t_o) -{ - return _C_ * sqrt((1.0 - (t_o * t_o) / (t * t))); -} - -template -constexpr auto SpecialRelativity::lengthContraction(const T L_o, const K vc) -{ - return L_o * sqrt(1.0 - (vc * vc)); -} - -template -constexpr auto SpecialRelativity::speedToAppearSomeLength(const T l_o, const K l) -{ - return _C_ * sqrt(1.0 - ((l*l)/ (l_o* l_o))); -} - -template -constexpr auto SpecialRelativity::distanceTraveled_earthBoundObserver(const T t_o, const K vc) -{ - return sqrt(1.0 - (vc * vc)) * vc * _C_ * t_o; -} - -template -constexpr auto SpecialRelativity::distanceTraveled_proper(const T t_o, const K vc) -{ - return vc * _C_ * t_o; -} - -template -constexpr auto SpecialRelativity::contractedLength(const T l_o, const K gamma) -{ - return l_o / gamma; -} - -template -constexpr auto SpecialRelativity::time(const T l_o, const K vc) -{ - return l_o / (vc*_C_); -} - -template -constexpr auto SpecialRelativity::properTime(const T t, const K vc) -{ - return sqrt(1.0 - (vc * vc)) * t; -} - -template -constexpr auto SpecialRelativity::timeGamma(const T t_o, const K gamma) -{ - return gamma * t_o; -} - -template -constexpr auto SpecialRelativity::relative_velocity_away(const T v, const K uv) -{ - return (v - uv) / (1.0 - (v * uv)); -} - -template -constexpr auto SpecialRelativity::relative_velocity_towards(const T v, const K uv) -{ - return (v + uv) / (1.0 + (v * uv)); -} - -template -constexpr auto SpecialRelativity::relativeVelocity_between2Objects(const T u, const K u_) -{ - return (u_ - u) / ((u_ * u) - 1); -} - -template -constexpr auto SpecialRelativity::relative_velocity(const T v, const K uv, const C c_) -{ - return (v + uv) / (1.0 + ((v * uv)/(c_*c_))); -} - -template -constexpr auto SpecialRelativity::wavelengthObserved(const T u, const K lambda_s) -{ - return lambda_s * sqrt((1.0 + (u / _C_)) / (1.0 - (u / _C_))); -} - -template -constexpr auto SpecialRelativity::frequencyObserved(const T uc, const K f_s) -{ - return f_s * sqrt((1.0 - (uc )) / (1.0 + (uc ))); -} - -template -constexpr auto SpecialRelativity::velocity_fromWaveLengths(const T lambda_s, const K lambda_obs) -{ - return _C_ * ((((lambda_obs * lambda_obs) / (lambda_s * lambda_s)) - 1.0) / (1.0 + (((lambda_obs * lambda_obs) / (lambda_s * lambda_s))))); -} - -template -constexpr auto SpecialRelativity::velocity_fromFrequencyEcho(const T f_s, const K increase) -{ - return _C_ * (-increase) / (2.0 * f_s + increase); -} - -template -constexpr auto SpecialRelativity::relativisticTime(const T u, const K v, const L l_o) -{ - return l_o / (u - v); -} - -template -constexpr auto SpecialRelativity::relativisticMomentum(const T m, const K u) -{ - return (m * (u * _C_)) / sqrt(1.0 - (u * u)); -} - -template -constexpr auto SpecialRelativity::momentum_fromEnergies(const V v, const E E_o) -{ - const auto E_ = totalEnergy(E_o, v); - return sqrt((E_ * E_) - (E_o * E_o) ); -} - -template -constexpr auto SpecialRelativity::momentum_slowerObject(const T m, const K u) -{ - return (m * u) / sqrt(1.0 - ((u * u)/(_C_*_C_))); -} - -template -constexpr auto SpecialRelativity::momentumRatios_classical2relativistic(const T v) -{ - return 1.0 + (1 / 2) * ((v * v) / (_C_ * _C_)); -} - -template -constexpr auto SpecialRelativity::velocityFrom_momentum(const T p, const M m) -{ - return p / sqrt((m * m) + ((p * p) / (_C_ * _C_))); -} - -template -constexpr auto SpecialRelativity::newtonsEnergy(const T m) -{ - return m * (_C_ * _C_); -} - -template -constexpr auto SpecialRelativity::mass_fromRestEnergy(const T E_o) -{ - return E_o / (_C_ * _C_); -} - -template -constexpr auto SpecialRelativity::difference_inMass_fromRestEnergies(const T E_o1, const K E_o2) -{ - return abs((E_o1 - E_o2) / (_C_ * _C_)); -} - -template -constexpr auto SpecialRelativity::objectsMade(const T E_o, const K m) -{ - return E_o / (2.0 * m * (_C_ * _C_)); -} - -template -constexpr auto SpecialRelativity::relativisticTotalEnergy(const P p, const M m) -{ - return sqrt((pow(p * _C_,2) + pow(m * (_C_ * _C_), 2))); -} - -template -constexpr auto SpecialRelativity::ratioOfMassUsedAsEnergy(const T m, const K m_i) -{ - return m / m_i; -} - -template -constexpr auto SpecialRelativity::kineticEnergy(const T gamma, const K m) -{ - return (gamma - 1.0) * m * (_C_ * _C_); -} - -template -constexpr auto SpecialRelativity::totalEnergy(const E E_o, const V v) -{ - return E_o / sqrt(1.0 - (v * v)); -} - -template -inline auto SpecialRelativity::relativisticKineticEnergy(const V v, const M m, const C c_) -{ - return (((m * (c_*c_))/ sqrt(1.0 - ((v * v) / (c_ * c_)))) - (m * (c_*c_))); -} - -template -constexpr auto SpecialRelativity::kineticEnergy_fromTimesAndRestEnergy(const T t_o, const T1 t, const E E_o) -{ - return ((t / t_o) - 1.0) * E_o; -} - -template -constexpr auto SpecialRelativity::gamma_fromRestMassesOfDecayingParticle(const T m_i, const M m_d) -{ - return m_i / m_d; -} - -template -constexpr auto SpecialRelativity::gamma_fromRestMassEnergies(const T E_i, const E E_f) -{ - return ((E_i - E_f) / E_f) + 1.0; -} - -template -constexpr auto SpecialRelativity::gamma_fromAccelerationThroughVoltage(const Q q, const V volts, const M m) -{ - return ((q * volts) / (m * (_C_ * _C_))) + 1.0; -} - -template -constexpr auto SpecialRelativity::effectiveAccelerationPotential(const G gamma, const M m, const Q q) -{ - return ((gamma - 1.0) * m * (_C_ * _C_)) / q; -} - -template -constexpr auto SpecialRelativity::forDestructionMassHowManyKgCanBeLiftedHeightKm(const M m, const H h) -{ - const auto PE = newtonsEnergy(m); - return PE / (_Ga_ * h); -} - - +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_SPECIALRELATIVITY_H +#define PHYSICSFORMULA_SPECIALRELATIVITY_H +/** + * class: SpecialRelativity + * details: driver class for solving complex physics problems + * author: Ryan Zurrin + * dateBuilt: 5/3/2021 + * lastEdit: 5/15/2021 + */ +//α=224,ß=225,π=227,Σ=228,σ=229,µ=230,τ=231,Φ=232,Θ=233 +//Ω=234,δ=235,∞=236,φ=237,ε=238,∩=239,≡=240,gamma=226,gamma, σ, ϑ, Å, Ώ, lambda, gamma + +#include + +//#include "VisionOpticalInstruments.h" +static int specialRelativity_objectCount = 0; +typedef long double ld; + +inline static auto lFactor = [](const T & v) { + const auto upsilon = 1.0 / sqrt(1.0 - (v * v)); + std::cout << "gamma: "<< upsilon; + return upsilon; +}; + + +class SpecialRelativity: + public VisionOpticalInstruments +{ +public: + SpecialRelativity* _specialRelativityPtr; + + SpecialRelativity() + { + _specialRelativityPtr = nullptr; + specialRelativityVar = 0.0; + countIncrease(); + } + + /** + * @brief copy constructor + */ + SpecialRelativity(const SpecialRelativity& t) + { + _specialRelativityPtr = t._specialRelativityPtr; + specialRelativityVar = t.specialRelativityVar; + countIncrease(); + } + /** + * #brief move constructor + */ + SpecialRelativity(SpecialRelativity&& t) noexcept + { + _specialRelativityPtr = t._specialRelativityPtr; + specialRelativityVar = t.specialRelativityVar; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + SpecialRelativity& operator=(SpecialRelativity&& t) noexcept + { + if (this != &t) + { + _specialRelativityPtr = t._specialRelativityPtr; + specialRelativityVar = t.specialRelativityVar; + countIncrease(); + } + return *this; + } + + static void show_objectCount() { std::cout << "\n special relativity object count: " + << specialRelativity_objectCount << std::endl; } + static int get_objectCount() { return specialRelativity_objectCount; } + + /// + /// Calculates the Lorentz factor(gamma) if v is a decimal of the percent of the + /// speed of light, for instance if something was going half the speed of + /// light you would put a value of .500 for v. + /// + /// The velocity . + /// Lorentz factor, gamma (gamma) + template + static constexpr auto lorentzFactor(const T upsilon); + + + /// + /// Find the value of gamma(gamma) for the following situation. An Earth-bound + /// observer measures t h to have passed while signals from a high-velocity + /// space probe indicate that t_o h have passed on board. + /// + /// The relativistic time(should be greater then proper). + /// The proper time. + /// value of gamma, Lorentz factor + template + static constexpr auto lorentzValue(const T t, const K t_o); + + /// + /// Particles called π-mesons are produced by accelerator beams. If these + /// particles travel at v m/s and live t s when at rest + /// relative to an observer, this method will calculate how long they + /// live as viewed in the laboratory? + /// + /// The speed of particle. + /// The time in seconds particle can live. + /// relativistic time alive is seconds, time dilation + template + static constexpr auto relativisticTimeDilation(const T upsilon, const K t_o); + + /// + /// Suppose a particle called a kaon is created by cosmic radiation striking + /// the atmosphere. It moves by you at vc, and it lives t s when + /// at rest relative to an observer. How long does it live as you observe it? + /// + /// The velocity . + /// The relatively observed time. + /// time from observers perspective + template + static constexpr auto timeDilation(const T upsilonc, const K t_o); + + /// + /// A neutral π-meson is a particle that can be created by accelerator + /// beams. If one such particle lives t s as measured in the + /// laboratory, and t_o s when at rest relative to an observer, + /// what is its velocity relative to the laboratory? + /// + /// The observed time. + /// The proper time, time at rest. + /// speed relative to the observed time + template + static constexpr auto relativeVelocity(const T t, const K t_o); + + /// + /// If relativistic effects are to be less than percent_gamma %, then gamma must be less + /// than x = 1.00 + %. At what relative velocity is gamma=x + /// + /// The percent of Lorentz(gamma). + /// speed to achieve desired percent of Lorentz factor + template + static constexpr auto relativeVelocity_percentLorentz(const T percent_gamma); + + /// + /// Calculate at what relative velocity is gamma= gamma + /// + /// The gamma. + /// + template + static constexpr auto relativeVelocity_lorantzAt(const T gamma); + + /// + /// A neutron lives t_o s when at rest relative to an observer. How fast + /// is the neutron moving relative to an observer who measures its life + /// span to be t s? + /// + /// The time at rest with respect to observer(proper time). + /// The observed time. + /// speed of particle as measured by while being observed in + /// under proper time + template + static constexpr auto observedVelocity(const T t, const K t_o); + + + /// + /// A spaceship, L_o m long as seen on board, moves by the Earth at vc. + /// (.950 = .950c) ->leave out the c but this is what % of the speed of + /// light something is traveling. + /// What is its length as measured by an Earth-bound observer? + /// + /// The actual length. + /// The velocity relative to light speed c. + /// observed length, relativistic length + template + static constexpr auto lengthContraction(const T L_o, const K vc); + + /// + /// How fast would a l_o m-long sports car have to be going past you in + /// order for it to appear only l m long? + /// + /// The original length, real length. + /// The relativistic length. + /// velocity to appear length + template + static constexpr auto speedToAppearSomeLength(const T l_o, const K l); + + /// + /// Suppose a cosmic ray colliding with a nucleus in the Earth’s upper + /// atmosphere produces a muon that has a velocity v=0.950c(vc). The muon then + /// travels at constant velocity and lives 1.52μs(t_o) as measured in the muon’s + /// frame of reference. (You can imagine this as the muon’s internal clock.) + /// How long does the muon live as measured by an Earth-bound observer? + /// + /// The t o. + /// The vc. + /// distance traveled by particle from stationary observers + /// perspective + template + static constexpr auto distanceTraveled_earthBoundObserver(const T t_o, const K vc); + + /// + /// Suppose a cosmic ray colliding with a nucleus in the Earth’s upper + /// atmosphere produces a muon that has a velocity v=0.950c(vc). The muon then + /// travels at constant velocity and lives 1.52μs(t_o) as measured in the muon’s + /// frame of reference. (You can imagine this as the muon’s internal clock.) + /// How far does it travel as viewed by an observer moving with it? + /// Base your calculation on its velocity relative to the Earth and the + /// time it lives (proper time) + /// + /// The t o. + /// The vc. + /// distance traveled (m) + template + static constexpr auto distanceTraveled_proper(const T t_o, const K vc); + + + /// + /// Verify that two distances are related through length contraction + /// if gamma = gamma. + /// + /// The proper length. + /// The gamma. + /// contracted length + template + static constexpr auto contractedLength(const T l_o, const K gamma); + + /// + /// How long does it take the astronaut to travel + /// l_o units at vc units of speed (as measured by the Earth- bound observer) + /// + /// The proper length. + /// The velocity with respect to speed of light. + /// time to travel some distance + template + static constexpr auto time(const T l_o, const K vc); + + /// + /// How long does it take a astronaut to travel t units at a speed of vc units + /// according to the astronaut, which is proper time + /// + /// The relativistic time. + /// The speed. + /// proper time + template + static constexpr auto properTime(const T t, const K vc); + + /// + /// Verify time is related through time dilation with gamma = gamma as given. + /// + /// The t o. + /// The gamma. + /// + template + static constexpr auto timeGamma(const T t_o, const K gamma); + + /// + /// A spaceship is heading directly toward the Earth at a velocity of + /// 0.800c(uv) . The astronaut on board claims that he can send a canister + /// toward the Earth at 1.20c(v) relative to the Earth. Calculate the + /// velocity the canister must have relative to the spaceship. + /// + /// The v. + /// The uv. + /// speed relativity relationship + template + static constexpr auto relative_velocity_away(const T v, const K uv); + + /// + /// Relatives the velocity towards. + /// + /// The v. + /// The uv. + /// + template + static constexpr auto relative_velocity_towards(const T v, const K uv); + + /// + /// When a missile is shot from one spaceship towards another, it leaves + /// the first at 0.950c(u_) and approaches the other at 0.750c(u). What is the + /// relative velocity of the two ships? + /// + /// The relative velocity of object to observer . + /// The relative velocity to the other observer. + /// relative velocity between the two observers + template + static constexpr auto relativeVelocity_between2Objects(const T u, const K u_); + + /// + /// Suppose the speed of light were only 3000 m/s(c_) . A jet fighter moving + /// toward a target on the ground at 800 m/s(v) shoots bullets, each having a + /// muzzle velocity of 1000 m/s(uv). calculate the bullets’ velocity relative + /// to the target. + /// + /// The velocity of observer. + /// The velocity of object. + /// The speed of light. + /// velocity relative to target + template + static constexpr auto relative_velocity(const T v, const K uv, const C c_); + + /// + /// If a galaxy moving away from the Earth has a speed of 1000 km/s(u) and + /// emits 656 nm(lambda_s) light characteristic of hydrogen (the most common element + /// in the universe). Calculate the wavelength we observe on the Earth + /// + /// The speed. + /// The wavelength source. + /// observed wavelength + template + static constexpr auto wavelengthObserved(const T u, const K lambda_s); + + /// + /// A space probe speeding towards the nearest star moves at 0.250c(u) and + /// sends radio information at a broadcast frequency of 1.00 GHz(f_s). + /// Calculate what frequency is received on the Earth. + /// + /// The speed. + /// The f s. + /// + template + static constexpr auto frequencyObserved(const T uc, const K f_s); + + /// + /// Near the center of our galaxy, hydrogen gas is moving directly away + /// from us in its orbit about a black hole. We receive 1900(lambda_obs) nm electromagnetic + /// radiation and know that it was 1875 nm(lambda_s) when emitted by the hydrogen gas. + /// What is the speed of the gas + /// + /// The lambda s. + /// The lambda obs. + /// + template + static constexpr auto velocity_fromWaveLengths(const T lambda_s, const K lambda_obs); + + /// + /// A highway patrol officer uses a device that measures the speed of + /// vehicles by bouncing radar off them and measuring the Doppler shift. + /// The outgoing radar has a frequency of 100 GHz(f_S) and the returning echo + /// has a frequency 15.0 kHz(increase) higher. What is the velocity of the vehicle? + /// Note that there are two Doppler shifts in echoes. Be certain not to + /// round off until the end of the problem, because the effect is small. + /// + /// The frequency from the source. + /// The increase in the frequency from it bouncing + /// back to the radar gun. + /// velocity of moving object the frequency bounced off of + template + static constexpr auto velocity_fromFrequencyEcho(const T f_s, const K increase); + + /// + /// All but the closest galaxies are receding from our own Milky Way Galaxy. + /// If a galaxy 12.0×109 ly(l_o) away is receding from us at 0.900c(v), if + /// the velocity relative to us of the probe moving towards the other galaxy + /// is 0.99947c(u), as measured from that galaxy, calculate + /// How long it will take the probe to reach the other galaxy as + /// measured from the Earth. You may assume that the velocity of the other + /// galaxy remains constant. + /// The u. + /// The v. + /// The l o. + /// time for probe to reach other galaxy + template + static constexpr auto relativisticTime(const T u, const K v, const L l_o); + + /// + /// Find the momentum of a helium nucleus having a mass of 6.68×10−27 kg(m) + /// that is moving at 0.200c.(u) + /// + /// The mass. + /// The velocity. + /// relativistic momentum + template + static constexpr auto relativisticMomentum(const T m, const K u); + + /// + /// One cosmic ray neutron has a velocity of 0.250c relative to the Earth. + /// Calculate its momentum. + /// + /// The velocity. + /// The rest energy, can be looked up in tables. + /// momentum + template + static constexpr auto momentum_fromEnergies(const V v, const E E_o); + + /// + /// Find the momentum of a 1.00×109 kg(m) asteroid heading towards the + /// Earth at 30.0 km/s(u). + /// + /// The m. + /// The u. + /// + template + static constexpr auto momentum_slowerObject(const T m, const K u); + + /// + /// Find the ratio of this momentum to the classical momentum. + /// (Use the approximation that gamma=1+12v2c2 at low velocities.) + /// + /// The velocity. + /// gamma, Lorentz factor + template + static constexpr auto momentumRatios_classical2relativistic(const T v); + + /// + /// What is the velocity of an electron that has a momentum of + /// 3.04×10−21 kg⋅m/s?(p) Note that you must calculate the velocity to + /// at least four digits to see the difference from c. + /// + /// The relativistic momentum. + /// The mass. + /// velocity + template + static constexpr auto velocityFrom_momentum(const T p, const M m); + + /// + /// What is the rest energy of an electron, given its mass is 9.11 + /// *10^-31 kg(m) + /// + /// The mass. + /// energy in joules + template + static constexpr auto newtonsEnergy(const T m); + + /// + /// Calculates the mass from rest energy. + /// + /// The rest energy o. + /// mass in kg + template + static constexpr auto mass_fromRestEnergy(const T E_o); + + /// + /// If the rest energies of a proton and a neutron (the two constituents + /// of nuclei) are 938.3(E_o2) and 939.6(E_o1) MeV respectively, what is the difference + /// in their masses in kilograms? + /// + /// The rest energy 1. + /// The rest energy 2. + /// difference in Mass + template + static constexpr auto difference_inMass_fromRestEnergies(const T E_o1, const K E_o2); + + /// + /// The Big Bang that began the universe is estimated to have released + /// 10^68 J(E_o) of energy. How many stars could half this energy create, + /// assuming the average star's mass is 4.00×1030 kg(m). + /// + /// The rest energy. + /// The mass. + /// N objects that can be made(stars) from energy + template + static constexpr auto objectsMade(const T E_o, const K m); + + /// + /// Relativistics the total energy. + /// + /// The p. + /// The m. + /// + template + static constexpr auto relativisticTotalEnergy(const P p, const M m); + + /// + /// A supernova explosion of a 2.00×1030 kg star produces 1.00×1044 J of + /// energy. What is the ratio Δm/m_i of mass destroyed to the original + /// mass of the star? + /// + /// The m. + /// The m i. + /// + template + static constexpr auto ratioOfMassUsedAsEnergy(const T m, const K m_i); + + /// + /// Calculates the kinetics energy. + /// + /// gamma. + /// The mass. + /// kinetic energy (J) + template + static constexpr auto kineticEnergy(const T gamma, const K m); + + /// + /// Totals the energy. + /// + /// The e o. + /// The v. + /// + template + static constexpr auto totalEnergy(const E E_o, const V v); + + /// + /// Calculate the relativistic kinetic energy of a 1000-kg(m) car moving at + /// 30.0 m/s(v) if the speed of light were only 45.0 m/ s(c_). + /// + /// The velocity. + /// The mass. + /// The speed of light. + /// relativistic kinetic energy + template + static auto relativisticKineticEnergy(const V v, const M m, const C c_ = _C_); + + /// + /// Calculate the kinetic energy in MeV of a π-meson that lives 1.40×10−16 s(t) + /// as measured in the laboratory, and 0.840×10−16 s(t_o) when at rest relative + /// to an observer, given that its rest energy is 135 MeV(E_o) + /// + /// The proper time. + /// time dilation. + /// The rest energy. + /// kinetic energy + template + static constexpr auto kineticEnergy_fromTimesAndRestEnergy(const T t_o, const T1 t, const E E_o); + + /// + /// A muon has a rest mass energy of 105.7 MeV(m_i), and it decays into an + /// electron(m_d = .5110MeV) and a mass-less particle. If all the lost + /// mass is converted into the electron’s kinetic energy, find gamma for the + /// electron. + /// + /// The initial rest mass. + /// The rest mass of particle after decay. + /// + template + static constexpr auto gamma_fromRestMassesOfDecayingParticle(const T m_i, const M m_d); + + /// + /// A π-meson is a particle that decays into a muon and a mass-less particle. + /// The π-meson has a rest mass energy of 139.6 MeV(E_i), and the muon has a + /// rest mass energy of 105.7 MeV(E_f). Suppose the π-meson is at rest and all + /// of the missing mass goes into the muon’s kinetic energy.Calculate How fast + /// the muon moves. + /// + /// The e i. + /// The e f. + /// gamma gamma + template + static constexpr auto gamma_fromRestMassEnergies(const T E_i, const E E_f); + + /// + /// What is gamma for a proton->(q) having a mass energy of 938.3 MeV->(M) accelerated + /// through an effective potential of 1.0 TV(teravolt)->(volts) at Fermilab + /// outside Chicago + /// + /// The charge of the particle. + /// The volts. + /// The mass energy. + /// gamma gamma + template + static constexpr auto gamma_fromAccelerationThroughVoltage(const Q q, const V volts, const M m); + + /// + /// Calculate the effective accelerating potential for electrons->(m) at the + /// Stanford Linear Accelerator, if gamma=1.00×105->(gamma) for them + /// + /// gamma (gamma). + /// The mass of particle. + /// The charge of particle. + /// the effective volts needed to accelerate particle + template + static constexpr auto effectiveAccelerationPotential(const G gamma, const M m, const Q q); + + /// + /// Using a calculation of the energy released by the destruction of 1.00 kg->(m) + /// of mass. Calculate how many kilograms could be lifted to a 10.0 km->(h) + /// height by this amount of energy? + /// + /// The m. + /// The h. + /// + template + static constexpr auto forDestructionMassHowManyKgCanBeLiftedHeightKm(const M m, const H h); + + + + + ~SpecialRelativity() + { + delete _specialRelativityPtr; + } + void setTemplateVar(ld var) { specialRelativityVar = var; } + ld getTemplateVar() const { return specialRelativityVar; } + +private: + ld specialRelativityVar; + static void countIncrease() { specialRelativity_objectCount += 1; } + static void countDecrease() { specialRelativity_objectCount -= 1; } + +}; + +#endif //PHYSICSFORMULA_SPECIALRELATIVITY_H + +template +constexpr auto SpecialRelativity::lorentzFactor(const T upsilon) +{ + return 1.0 / sqrt(1.0 - (upsilon * upsilon)); +} + +template +constexpr auto SpecialRelativity::lorentzValue(const T t, const K t_o) +{ + return t / t_o; +} + +template +constexpr auto SpecialRelativity::relativisticTimeDilation(const T upsilon, const K t_o) +{ + return t_o / sqrt(1.0 - ((upsilon * upsilon)/(C_*C_) )); +} + +template +constexpr auto SpecialRelativity::timeDilation(const T upsilonc, const K t_o) +{ + return t_o / sqrt(1.0 - (upsilonc * upsilonc)); +} + +template +constexpr auto SpecialRelativity::relativeVelocity(const T t, const K t_o) +{ + return (_C_ / t) * sqrt(pow(t, 2) - pow(t_o, 2)); +} + +template +constexpr auto SpecialRelativity::relativeVelocity_percentLorentz(const T percent_gamma) +{// gamma = gamma = Lorentz + const auto gamma = 1.00 + percent_gamma / 100; + return (_C_ / gamma) * sqrt((gamma * gamma) - 1); +} + +template +constexpr auto SpecialRelativity::relativeVelocity_lorantzAt(const T gamma) +{ + return _C_ * sqrt(1.0 - (1.0 / (gamma * gamma))); +} + +template +constexpr auto SpecialRelativity::observedVelocity(const T t, const K t_o) +{ + return _C_ * sqrt((1.0 - (t_o * t_o) / (t * t))); +} + +template +constexpr auto SpecialRelativity::lengthContraction(const T L_o, const K vc) +{ + return L_o * sqrt(1.0 - (vc * vc)); +} + +template +constexpr auto SpecialRelativity::speedToAppearSomeLength(const T l_o, const K l) +{ + return _C_ * sqrt(1.0 - ((l*l)/ (l_o* l_o))); +} + +template +constexpr auto SpecialRelativity::distanceTraveled_earthBoundObserver(const T t_o, const K vc) +{ + return sqrt(1.0 - (vc * vc)) * vc * _C_ * t_o; +} + +template +constexpr auto SpecialRelativity::distanceTraveled_proper(const T t_o, const K vc) +{ + return vc * _C_ * t_o; +} + +template +constexpr auto SpecialRelativity::contractedLength(const T l_o, const K gamma) +{ + return l_o / gamma; +} + +template +constexpr auto SpecialRelativity::time(const T l_o, const K vc) +{ + return l_o / (vc*_C_); +} + +template +constexpr auto SpecialRelativity::properTime(const T t, const K vc) +{ + return sqrt(1.0 - (vc * vc)) * t; +} + +template +constexpr auto SpecialRelativity::timeGamma(const T t_o, const K gamma) +{ + return gamma * t_o; +} + +template +constexpr auto SpecialRelativity::relative_velocity_away(const T v, const K uv) +{ + return (v - uv) / (1.0 - (v * uv)); +} + +template +constexpr auto SpecialRelativity::relative_velocity_towards(const T v, const K uv) +{ + return (v + uv) / (1.0 + (v * uv)); +} + +template +constexpr auto SpecialRelativity::relativeVelocity_between2Objects(const T u, const K u_) +{ + return (u_ - u) / ((u_ * u) - 1); +} + +template +constexpr auto SpecialRelativity::relative_velocity(const T v, const K uv, const C c_) +{ + return (v + uv) / (1.0 + ((v * uv)/(c_*c_))); +} + +template +constexpr auto SpecialRelativity::wavelengthObserved(const T u, const K lambda_s) +{ + return lambda_s * sqrt((1.0 + (u / _C_)) / (1.0 - (u / _C_))); +} + +template +constexpr auto SpecialRelativity::frequencyObserved(const T uc, const K f_s) +{ + return f_s * sqrt((1.0 - (uc )) / (1.0 + (uc ))); +} + +template +constexpr auto SpecialRelativity::velocity_fromWaveLengths(const T lambda_s, const K lambda_obs) +{ + return _C_ * ((((lambda_obs * lambda_obs) / (lambda_s * lambda_s)) - 1.0) / (1.0 + (((lambda_obs * lambda_obs) / (lambda_s * lambda_s))))); +} + +template +constexpr auto SpecialRelativity::velocity_fromFrequencyEcho(const T f_s, const K increase) +{ + return _C_ * (-increase) / (2.0 * f_s + increase); +} + +template +constexpr auto SpecialRelativity::relativisticTime(const T u, const K v, const L l_o) +{ + return l_o / (u - v); +} + +template +constexpr auto SpecialRelativity::relativisticMomentum(const T m, const K u) +{ + return (m * (u * _C_)) / sqrt(1.0 - (u * u)); +} + +template +constexpr auto SpecialRelativity::momentum_fromEnergies(const V v, const E E_o) +{ + const auto E_ = totalEnergy(E_o, v); + return sqrt((E_ * E_) - (E_o * E_o) ); +} + +template +constexpr auto SpecialRelativity::momentum_slowerObject(const T m, const K u) +{ + return (m * u) / sqrt(1.0 - ((u * u)/(_C_*_C_))); +} + +template +constexpr auto SpecialRelativity::momentumRatios_classical2relativistic(const T v) +{ + return 1.0 + (1 / 2) * ((v * v) / (_C_ * _C_)); +} + +template +constexpr auto SpecialRelativity::velocityFrom_momentum(const T p, const M m) +{ + return p / sqrt((m * m) + ((p * p) / (_C_ * _C_))); +} + +template +constexpr auto SpecialRelativity::newtonsEnergy(const T m) +{ + return m * (_C_ * _C_); +} + +template +constexpr auto SpecialRelativity::mass_fromRestEnergy(const T E_o) +{ + return E_o / (_C_ * _C_); +} + +template +constexpr auto SpecialRelativity::difference_inMass_fromRestEnergies(const T E_o1, const K E_o2) +{ + return abs((E_o1 - E_o2) / (_C_ * _C_)); +} + +template +constexpr auto SpecialRelativity::objectsMade(const T E_o, const K m) +{ + return E_o / (2.0 * m * (_C_ * _C_)); +} + +template +constexpr auto SpecialRelativity::relativisticTotalEnergy(const P p, const M m) +{ + return sqrt((pow(p * _C_,2) + pow(m * (_C_ * _C_), 2))); +} + +template +constexpr auto SpecialRelativity::ratioOfMassUsedAsEnergy(const T m, const K m_i) +{ + return m / m_i; +} + +template +constexpr auto SpecialRelativity::kineticEnergy(const T gamma, const K m) +{ + return (gamma - 1.0) * m * (_C_ * _C_); +} + +template +constexpr auto SpecialRelativity::totalEnergy(const E E_o, const V v) +{ + return E_o / sqrt(1.0 - (v * v)); +} + +template +inline auto SpecialRelativity::relativisticKineticEnergy(const V v, const M m, const C c_) +{ + return (((m * (c_*c_))/ sqrt(1.0 - ((v * v) / (c_ * c_)))) - (m * (c_*c_))); +} + +template +constexpr auto SpecialRelativity::kineticEnergy_fromTimesAndRestEnergy(const T t_o, const T1 t, const E E_o) +{ + return ((t / t_o) - 1.0) * E_o; +} + +template +constexpr auto SpecialRelativity::gamma_fromRestMassesOfDecayingParticle(const T m_i, const M m_d) +{ + return m_i / m_d; +} + +template +constexpr auto SpecialRelativity::gamma_fromRestMassEnergies(const T E_i, const E E_f) +{ + return ((E_i - E_f) / E_f) + 1.0; +} + +template +constexpr auto SpecialRelativity::gamma_fromAccelerationThroughVoltage(const Q q, const V volts, const M m) +{ + return ((q * volts) / (m * (_C_ * _C_))) + 1.0; +} + +template +constexpr auto SpecialRelativity::effectiveAccelerationPotential(const G gamma, const M m, const Q q) +{ + return ((gamma - 1.0) * m * (_C_ * _C_)) / q; +} + +template +constexpr auto SpecialRelativity::forDestructionMassHowManyKgCanBeLiftedHeightKm(const M m, const H h) +{ + const auto PE = newtonsEnergy(m); + return PE / (_Ga_ * h); +} + + diff --git a/Sphere.h b/Sphere.h index 2748aa6..c276cef 100644 --- a/Sphere.h +++ b/Sphere.h @@ -1,159 +1,159 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_SPHERE_H -#define PHYSICSFORMULA_SPHERE_H -/** - * @class Sphere - * @details class to represent a Sphere object - * @author Ryan Zurrin - * @dateBuilt 11/5/2021 - * @lastEdit 11/5/2021 - */ -#include -constexpr auto pi = 3.14159265358979323846; - -static int sphereObjectCount = 0; -typedef long double ld; - -class Sphere -{ - ld radius; - ld volume; - ld surfaceArea; - static auto countIncrease() { sphereObjectCount += 1; } - static auto countDecrease() { sphereObjectCount -= 1; } - ld calculateRadius()const; - ld calculateVolume()const; - ld calculateSurfaceArea()const; -public: - - Sphere() - { - radius = 0.0; - volume = 0.0; - surfaceArea = 0.0; - countIncrease(); - } - - explicit Sphere(ld radius) - { - this->radius = radius; - this->volume = calculateVolume(); - this->surfaceArea = calculateSurfaceArea(); - countIncrease(); - } - - /** - * @brief copy constructor - */ - Sphere(const Sphere& s) - { - radius = s.radius; - volume = s.volume; - surfaceArea = s.surfaceArea; - countIncrease(); - } - /** - * #brief move constructor - */ - Sphere(Sphere&& s) noexcept - { - radius = s.radius; - volume = s.volume; - surfaceArea = s.surfaceArea; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Sphere& operator=(Sphere&& s) noexcept - { - if (this != &s) - { - radius = s.radius; - volume = s.volume; - surfaceArea = s.surfaceArea; - countIncrease(); - } - return *this; - } - - Sphere& operator=(Sphere other) - { - std::swap(radius, other.radius); - std::swap(volume, other.volume); - std::swap(surfaceArea, other.surfaceArea); - return *this; - } - - static void show_objectCount() { - std::cout << "\n sphere object count: " - << sphereObjectCount << std::endl; - } - static int get_objectCount() { return sphereObjectCount; } - - - ~Sphere() = default; - - auto setVolume(ld v); - auto setRadius(ld r); - auto setSurfaceArea(ld sa); - - [[nodiscard]] auto getRadius() const { return radius; } - [[nodiscard]] auto getVolume() const { return volume; } - [[nodiscard]] auto getSurfaceArea() const { return surfaceArea; } - [[nodiscard]] auto getWeight(ld densityKgM) const; - - void printSphereInfo()const; -}; - -#endif //PHYSICSFORMULA_SPHERE_H -inline ld Sphere::calculateRadius() const -{ - return pow(3.0*(volume/(4.0*pi)), 1.0/3.0); -} - -inline ld Sphere::calculateVolume() const -{ - return 4.0/3.0*(pi*pow(radius, 3)); -} - -inline ld Sphere::calculateSurfaceArea() const -{ - return 4.0*pi*(radius*radius); -} - -inline auto Sphere::setVolume(ld v) -{ - volume = v; - radius = calculateRadius(); - surfaceArea = calculateSurfaceArea(); -} - -inline auto Sphere::setRadius(ld r) -{ - radius = r; - volume = calculateVolume(); - surfaceArea = calculateSurfaceArea(); -} - -inline auto Sphere::setSurfaceArea(ld sa) -{ - surfaceArea = sa; - radius = sqrt(surfaceArea / 4.0); - volume = calculateVolume(); -} - -inline auto Sphere::getWeight(ld densityKgM) const -{ - return densityKgM * volume; -} - -inline void Sphere::printSphereInfo() const -{ - std::cout << "radius: " << radius << std::endl; - std::cout << "surface area: " << surfaceArea << std::endl; - std::cout << "volume: " << volume << std::endl; +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_SPHERE_H +#define PHYSICSFORMULA_SPHERE_H +/** + * @class Sphere + * @details class to represent a Sphere object + * @author Ryan Zurrin + * @dateBuilt 11/5/2021 + * @lastEdit 11/5/2021 + */ +#include +constexpr auto pi = 3.14159265358979323846; + +static int sphereObjectCount = 0; +typedef long double ld; + +class Sphere +{ + ld radius; + ld volume; + ld surfaceArea; + static auto countIncrease() { sphereObjectCount += 1; } + static auto countDecrease() { sphereObjectCount -= 1; } + ld calculateRadius()const; + ld calculateVolume()const; + ld calculateSurfaceArea()const; +public: + + Sphere() + { + radius = 0.0; + volume = 0.0; + surfaceArea = 0.0; + countIncrease(); + } + + explicit Sphere(ld radius) + { + this->radius = radius; + this->volume = calculateVolume(); + this->surfaceArea = calculateSurfaceArea(); + countIncrease(); + } + + /** + * @brief copy constructor + */ + Sphere(const Sphere& s) + { + radius = s.radius; + volume = s.volume; + surfaceArea = s.surfaceArea; + countIncrease(); + } + /** + * #brief move constructor + */ + Sphere(Sphere&& s) noexcept + { + radius = s.radius; + volume = s.volume; + surfaceArea = s.surfaceArea; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Sphere& operator=(Sphere&& s) noexcept + { + if (this != &s) + { + radius = s.radius; + volume = s.volume; + surfaceArea = s.surfaceArea; + countIncrease(); + } + return *this; + } + + Sphere& operator=(Sphere other) + { + std::swap(radius, other.radius); + std::swap(volume, other.volume); + std::swap(surfaceArea, other.surfaceArea); + return *this; + } + + static void show_objectCount() { + std::cout << "\n sphere object count: " + << sphereObjectCount << std::endl; + } + static int get_objectCount() { return sphereObjectCount; } + + + ~Sphere() = default; + + auto setVolume(ld v); + auto setRadius(ld r); + auto setSurfaceArea(ld sa); + + [[nodiscard]] auto getRadius() const { return radius; } + [[nodiscard]] auto getVolume() const { return volume; } + [[nodiscard]] auto getSurfaceArea() const { return surfaceArea; } + [[nodiscard]] auto getWeight(ld densityKgM) const; + + void printSphereInfo()const; +}; + +#endif //PHYSICSFORMULA_SPHERE_H +inline ld Sphere::calculateRadius() const +{ + return pow(3.0*(volume/(4.0*pi)), 1.0/3.0); +} + +inline ld Sphere::calculateVolume() const +{ + return 4.0/3.0*(pi*pow(radius, 3)); +} + +inline ld Sphere::calculateSurfaceArea() const +{ + return 4.0*pi*(radius*radius); +} + +inline auto Sphere::setVolume(ld v) +{ + volume = v; + radius = calculateRadius(); + surfaceArea = calculateSurfaceArea(); +} + +inline auto Sphere::setRadius(ld r) +{ + radius = r; + volume = calculateVolume(); + surfaceArea = calculateSurfaceArea(); +} + +inline auto Sphere::setSurfaceArea(ld sa) +{ + surfaceArea = sa; + radius = sqrt(surfaceArea / 4.0); + volume = calculateVolume(); +} + +inline auto Sphere::getWeight(ld densityKgM) const +{ + return densityKgM * volume; +} + +inline void Sphere::printSphereInfo() const +{ + std::cout << "radius: " << radius << std::endl; + std::cout << "surface area: " << surfaceArea << std::endl; + std::cout << "volume: " << volume << std::endl; } \ No newline at end of file diff --git a/Square.h b/Square.h index d22e738..3829fc7 100644 --- a/Square.h +++ b/Square.h @@ -1,151 +1,151 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_SQUARE_H -#define PHYSICSFORMULA_SQUARE_H -/** - * @class Square - * @details class to represent a square object - * @author Ryan Zurrin - * @dateBuilt 11/4/2021 - * @lastEdit 11/4/2021 - */ -#include - -static int squareObjectCount = 0; -typedef long double ld; - -class Square -{ - ld side; - ld perimeter; - ld area; - static auto countIncrease() { squareObjectCount += 1; } - static auto countDecrease() { squareObjectCount -= 1; } - ld calculatePerimeter()const; - ld calculateArea()const; - ld calculateSide()const; -public: - - Square() - { - side = 0.0; - perimeter = 0.0; - area = 0.0; - countIncrease(); - } - - Square(ld side) - { - this->side = side; - this->perimeter = 4.0 * side; - this->area = side * side; - countIncrease(); - } - - /** - * @brief copy constructor - */ - Square(const Square& s) - { - side = s.side; - perimeter = s.perimeter; - area = s.area; - countIncrease(); - } - /** - * #brief move constructor - */ - Square(Square&& s) noexcept - { - side = s.side; - perimeter = s.perimeter; - area = s.area; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Square& operator=(Square&& s) noexcept - { - if (this != &s) - { - side = s.side; - perimeter = s.perimeter; - area = s.area; - countIncrease(); - } - return *this; - } - - Square& operator=(Square other) - { - std::swap(side, other.side); - return *this; - } - - static void show_objectCount() { - std::cout << "\n square object count: " - << squareObjectCount << std::endl; - } - static int get_objectCount() { return squareObjectCount; } - - - ~Square() = default; - - auto setSide(ld s); - auto setPerimeter(ld p); - auto setArea(ld a); - - [[nodiscard]] auto getSide() const { return side; } - [[nodiscard]] auto getPerimeter() const { return perimeter; } - [[nodiscard]] auto getArea() const { return area; } - - void printSquareInfo()const; -}; - -#endif //PHYSICSFORMULA_SQUARE_H - -inline auto Square::setSide(ld s) -{ - side = s; - perimeter = calculatePerimeter(); - area = calculateArea(); -} - -inline auto Square::setPerimeter(ld p) -{ - perimeter = p; - side = calculateSide(); - area = calculateArea(); -} - -inline auto Square::setArea(ld a) -{ - area = a; - side = sqrt(a); - perimeter = calculatePerimeter(); -} - -inline void Square::printSquareInfo()const -{ - std::cout << "side: " << side << std::endl; - std::cout << "perimeter: " << perimeter << std::endl; - std::cout << "area: " << area << std::endl; -} - -inline ld Square::calculatePerimeter()const -{ - return 4.0 * side; -} - -inline ld Square::calculateArea()const -{ - return side * side; -} - -inline ld Square::calculateSide()const -{ - return perimeter / 4.0; +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_SQUARE_H +#define PHYSICSFORMULA_SQUARE_H +/** + * @class Square + * @details class to represent a square object + * @author Ryan Zurrin + * @dateBuilt 11/4/2021 + * @lastEdit 11/4/2021 + */ +#include + +static int squareObjectCount = 0; +typedef long double ld; + +class Square +{ + ld side; + ld perimeter; + ld area; + static auto countIncrease() { squareObjectCount += 1; } + static auto countDecrease() { squareObjectCount -= 1; } + ld calculatePerimeter()const; + ld calculateArea()const; + ld calculateSide()const; +public: + + Square() + { + side = 0.0; + perimeter = 0.0; + area = 0.0; + countIncrease(); + } + + Square(ld side) + { + this->side = side; + this->perimeter = 4.0 * side; + this->area = side * side; + countIncrease(); + } + + /** + * @brief copy constructor + */ + Square(const Square& s) + { + side = s.side; + perimeter = s.perimeter; + area = s.area; + countIncrease(); + } + /** + * #brief move constructor + */ + Square(Square&& s) noexcept + { + side = s.side; + perimeter = s.perimeter; + area = s.area; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Square& operator=(Square&& s) noexcept + { + if (this != &s) + { + side = s.side; + perimeter = s.perimeter; + area = s.area; + countIncrease(); + } + return *this; + } + + Square& operator=(Square other) + { + std::swap(side, other.side); + return *this; + } + + static void show_objectCount() { + std::cout << "\n square object count: " + << squareObjectCount << std::endl; + } + static int get_objectCount() { return squareObjectCount; } + + + ~Square() = default; + + auto setSide(ld s); + auto setPerimeter(ld p); + auto setArea(ld a); + + [[nodiscard]] auto getSide() const { return side; } + [[nodiscard]] auto getPerimeter() const { return perimeter; } + [[nodiscard]] auto getArea() const { return area; } + + void printSquareInfo()const; +}; + +#endif //PHYSICSFORMULA_SQUARE_H + +inline auto Square::setSide(ld s) +{ + side = s; + perimeter = calculatePerimeter(); + area = calculateArea(); +} + +inline auto Square::setPerimeter(ld p) +{ + perimeter = p; + side = calculateSide(); + area = calculateArea(); +} + +inline auto Square::setArea(ld a) +{ + area = a; + side = sqrt(a); + perimeter = calculatePerimeter(); +} + +inline void Square::printSquareInfo()const +{ + std::cout << "side: " << side << std::endl; + std::cout << "perimeter: " << perimeter << std::endl; + std::cout << "area: " << area << std::endl; +} + +inline ld Square::calculatePerimeter()const +{ + return 4.0 * side; +} + +inline ld Square::calculateArea()const +{ + return side * side; +} + +inline ld Square::calculateSide()const +{ + return perimeter / 4.0; } \ No newline at end of file diff --git a/Statics.h b/Statics.h index aaa9f63..e2c9932 100644 --- a/Statics.h +++ b/Statics.h @@ -1,29 +1,29 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_STATICS_H -#define PHYSICSFORMULA_STATICS_H -/** - * @class Statics - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @date 10/26/2020 - */ - - -class Statics -{ -public: - - //constructor - Statics() = default; - - - - - //destructor - ~Statics() = default; - -}; -#endif //PHYSICSFORMULA_STATICS_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_STATICS_H +#define PHYSICSFORMULA_STATICS_H +/** + * @class Statics + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @date 10/26/2020 + */ + + +class Statics +{ +public: + + //constructor + Statics() = default; + + + + + //destructor + ~Statics() = default; + +}; +#endif //PHYSICSFORMULA_STATICS_H diff --git a/StringHelper.h b/StringHelper.h index 9b270d9..0ee61bb 100644 --- a/StringHelper.h +++ b/StringHelper.h @@ -1,171 +1,171 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_STRINGHELPER_H -#define PHYSICSFORMULA_STRINGHELPER_H - -#include -#include -#include - -using namespace std::string_literals; - -template -using t_string = -std::basic_string < CharT, std::char_traits, std::allocator>; - -template -using t_ss = -std::basic_stringstream, std::allocator>; - - -/// -/// Removes the specified text. -/// -/// The text. -/// The ch. -/// -template -t_string remove(t_string text, CharT const ch) -{ - auto start = std::remove_if( - std::begin(text), std::end(text), - [=](CharT const c) {return c == ch; }); - text.erase(start, std::end(text)); - return text; - -} -/// -/// builds a new string with all uppercase letters. -/// -/// The text. -/// new changed string -template -t_string to_upper(t_string text) -{ - transform( - text,std::begin(text), std::toupper); - return text; -} - -/// -/// builds a new string with all lowercase letters. -/// -/// The text. -/// new changed string -template -t_string to_lower(t_string text) -{ - transform( - text,std::begin(text), std::tolower); - return text; -} - -/// -/// builds a new string with the reverse of the specified text. -/// -/// The text. -/// new reversed string -template -t_string reverse(t_string text) -{ - std::reverse(std::begin(text), std::end(text)); - return text; -} - -/// -/// Trims the specified text. -/// -/// The text. -/// new string with blank spaces trimmed from front and back -template -t_string trim(t_string const& text) -{ - auto first{ text.find_first_not_of(' ') }; - auto last{ text.find_last_not_of(' ') }; - return text.substr(first, (last - first + 1)); -} - -/// -/// Trims the left. -/// -/// The text. -/// new string with blank spaces trimmed from front -template -t_string trim_left(t_string const& text) -{ - auto first{ text.find_first_not_of(' ') }; - return text.substr(first, text.size() - first); -} - -/// -/// Trims the right. -/// -/// The text. -/// new string with blank spaces trimmed from back -template -t_string trim_right(t_string const& text) -{ - auto last{ text.find_last_not_of(' ') }; - return text.substr(0, last + 1); -} - -/// -/// Trims the specified front and back of text of the specified -/// character -/// -/// The text. -/// The chars. -/// new string with trimmed front and back -template -t_string trim(t_string const& text, - t_string const& chars) -{ - auto first{ text.find_first_not_of(chars) }; - auto last{ text.find_last_not_of(chars) }; - return text.substr(first, (last - first + 1)); -} - -/// -/// Trims the front of text of the specified character. -/// -/// The text. -/// The chars. -/// new string with trimmed front -template -t_string trim_left(t_string const& text, - t_string const& chars) -{ - auto first{ text.find_first_not_of(chars) }; - return text.substr(first, text.size() - first); -} - -/// -/// Trims the back of text of specified character. -/// -/// The text. -/// The chars. -/// new string with trimmed back -template -t_string trim_right(t_string const& text, - t_string const& chars) -{ - auto last{ text.find_last_not_of(chars) }; - return text.substr(0, last + 1); -} - - -template -std::vector> split(t_string text, CharT const delimiter) -{ - auto sstr = t_ss{ text }; - auto tokens = std::vector>{}; - auto token = t_string{}; - while (std::getline(sstr, token, delimiter)) - { - if (!token.empty()) tokens.push_back(token); - } - return tokens; -} -#endif //PHYSICSFORMULA_STRINGHELPER_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_STRINGHELPER_H +#define PHYSICSFORMULA_STRINGHELPER_H + +#include +#include +#include + +using namespace std::string_literals; + +template +using t_string = +std::basic_string < CharT, std::char_traits, std::allocator>; + +template +using t_ss = +std::basic_stringstream, std::allocator>; + + +/// +/// Removes the specified text. +/// +/// The text. +/// The ch. +/// +template +t_string remove(t_string text, CharT const ch) +{ + auto start = std::remove_if( + std::begin(text), std::end(text), + [=](CharT const c) {return c == ch; }); + text.erase(start, std::end(text)); + return text; + +} +/// +/// builds a new string with all uppercase letters. +/// +/// The text. +/// new changed string +template +t_string to_upper(t_string text) +{ + transform( + text,std::begin(text), std::toupper); + return text; +} + +/// +/// builds a new string with all lowercase letters. +/// +/// The text. +/// new changed string +template +t_string to_lower(t_string text) +{ + transform( + text,std::begin(text), std::tolower); + return text; +} + +/// +/// builds a new string with the reverse of the specified text. +/// +/// The text. +/// new reversed string +template +t_string reverse(t_string text) +{ + std::reverse(std::begin(text), std::end(text)); + return text; +} + +/// +/// Trims the specified text. +/// +/// The text. +/// new string with blank spaces trimmed from front and back +template +t_string trim(t_string const& text) +{ + auto first{ text.find_first_not_of(' ') }; + auto last{ text.find_last_not_of(' ') }; + return text.substr(first, (last - first + 1)); +} + +/// +/// Trims the left. +/// +/// The text. +/// new string with blank spaces trimmed from front +template +t_string trim_left(t_string const& text) +{ + auto first{ text.find_first_not_of(' ') }; + return text.substr(first, text.size() - first); +} + +/// +/// Trims the right. +/// +/// The text. +/// new string with blank spaces trimmed from back +template +t_string trim_right(t_string const& text) +{ + auto last{ text.find_last_not_of(' ') }; + return text.substr(0, last + 1); +} + +/// +/// Trims the specified front and back of text of the specified +/// character +/// +/// The text. +/// The chars. +/// new string with trimmed front and back +template +t_string trim(t_string const& text, + t_string const& chars) +{ + auto first{ text.find_first_not_of(chars) }; + auto last{ text.find_last_not_of(chars) }; + return text.substr(first, (last - first + 1)); +} + +/// +/// Trims the front of text of the specified character. +/// +/// The text. +/// The chars. +/// new string with trimmed front +template +t_string trim_left(t_string const& text, + t_string const& chars) +{ + auto first{ text.find_first_not_of(chars) }; + return text.substr(first, text.size() - first); +} + +/// +/// Trims the back of text of specified character. +/// +/// The text. +/// The chars. +/// new string with trimmed back +template +t_string trim_right(t_string const& text, + t_string const& chars) +{ + auto last{ text.find_last_not_of(chars) }; + return text.substr(0, last + 1); +} + + +template +std::vector> split(t_string text, CharT const delimiter) +{ + auto sstr = t_ss{ text }; + auto tokens = std::vector>{}; + auto token = t_string{}; + while (std::getline(sstr, token, delimiter)) + { + if (!token.empty()) tokens.push_back(token); + } + return tokens; +} +#endif //PHYSICSFORMULA_STRINGHELPER_H diff --git a/Temperature.h b/Temperature.h index 61f5b3c..4acd47e 100644 --- a/Temperature.h +++ b/Temperature.h @@ -1,480 +1,480 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_TEMPERATURE_H -#define PHYSICSFORMULA_TEMPERATURE_H -/** - * @class Temperature - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @date 11/23/2020 - ____________________________________________________________________________*/ -#ifndef TEMPERATURE_H -#define TEMPERATURE_H -#include -using namespace std; - -/** - * @brief Global Constant _K_ is the Boltzmann constant - * .0000000000000000000000138 J/K - */ -constexpr auto BOLTZMANN_K_ = 1.38e-23;//1.38e-23 - -[[maybe_unused]] constexpr auto ATOMIC_MASS_UNIT_ = 1.66e-27; //1.6605e-27 (u) - -/** - * @brief Global Constant _Na_ is Avogadro's number and is used to express - * units in moles, abb(mol) and is equal to 6.02e23 mol^-1 - */ -constexpr auto AVOGADRO_ = 6.02e23;//6.02*10^23 - -static struct TemperatureConversions -{ - static ld celsius_to_fahrenheit(const ld c) { return (9.0 / 5.0) * c + 32.0; } - static ld fahrenheit_to_celsius(const ld f) { return (5.0 / 9.0) * (f - 32.0); } - static ld celsius_to_kelvin(const ld c) { return c + 273.15; } - static ld kelvin_to_celsius(const ld k) { return k - 273.15; } - static ld fahrenheit_to_kelvin(const ld f) { return (5.0 / 9.0) * (f - 32) + 273.15; } - static ld kelvin_to_fahrenheit(const ld k) { return (9.0 / 5.0) * (k - 273.15) + 32.0; } -}tempConverter; - -/** - * @brief structure of thermal expansion coefficients, each is a std::vector of two - * and is followed by a capitol letter of either a S for solid a L for liquid or - * a G for gases, only solids have std::vectors with two values the others are ld's here is an example: - * aluminum_S[0] = coefficient of linear expansion // holds the value 25*10^-6 - * aluminum_S[1] = coefficient of volume expansion //holds the value 75*10^-6 - * of ether_L = coefficient of volume expansion // holds the value of 1650*10^-6 - */ -static struct ThermalExpansionCoefficients -{ - const std::vector aluminum_S = { 25 * pow(10, -6), 75 * pow(10, -6) }; - const std::vector brass_S = { 19 * pow(10, -6), 56 * pow(10, -6) }; - const std::vector copper_S = { 17 * pow(10, -6), 51 * pow(10, -6) }; - const std::vector gold_S = { 14 * pow(10, -6), 42 * pow(10, -6) }; - const std::vector iron_or_steel_S = { 12 * pow(10, -6), 35 * pow(10, -6) }; - const std::vector invar_nickel_iron_allow_S = { 0.9 * pow(10, -6), 2.7 * pow(10, -6) }; - const std::vector lead_S = { 29 * pow(10, -6), 87 * pow(10, -6) }; - const std::vector silver_S = { 18 * pow(10, -6), 54 * pow(10, -6) }; - const std::vector glass_ordinary_S = { 9 * pow(10, -6), 27 * pow(10, -6) }; - const std::vector glass_pyrex_S = { 3 * pow(10, -6), 9 * pow(10, -6) }; - const std::vector quartz_S = { 0.4 * pow(10, -6), 1 * pow(10, -6) }; - const std::vector concrete_brick_S = { 12 * pow(10, -6), 36 * pow(10, -6) }; //average - const std::vector marble_S = { 7 * pow(10, -6), 2.1 * pow(10, -6) }; //average - const ld ether_L = 1650 * pow(10, -6); - const ld ethyl_alcohol = 1100 * pow(10, -6); - const ld petrol = 950 * pow(10, -6); - const ld glycerin = 500 * pow(10, -6); - const ld mercury = 180 * pow(10, -6); - const ld water = 210 * pow(10, -6); - const ld air_and_most_gases_at_atmospheric_pressure = 3400 * pow(10, -6); - -}tec; - -/** - * @brief Global constant _R_ is the universal gas constant struct which has _R_ - * in different units for use in different kinds of problems all represented - * as unit/mol * K - */ -const struct UniversalGasConstant -{ - const ld joules = 8.31; //8.31 J/mol * K - const ld cal = 1.99; // 1.99 cal/mol * k - const ld L_atm = .0821; // .0821 L * atm/mol * K -}R; - - -static int temperature_objectCount = 0; - -class Temperature -{ -private: - - static void countIncrease() { temperature_objectCount += 1; } - static void countDecrease() { temperature_objectCount -= 1; } -public: - Temperature* _tempPtr; - /** - * @brief no argument constructor - */ - Temperature() - { - _tempPtr = nullptr; - T._celsius = 0.0; - T._fahrenheit = 0.0; - T._kelvin = 0.0; - _mode = 'f'; - countIncrease(); - } - /** - * @brief copy constructor - */ - Temperature(const Temperature& t) - { - T._celsius = t.T._celsius; - T._fahrenheit = t.T._fahrenheit; - T._kelvin = t.T._kelvin; - _mode = t._mode; - _tempPtr = t._tempPtr; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Temperature& operator=(const Temperature& t) - { - if (this != &t) - { - T._celsius = t.T._celsius; - T._fahrenheit = t.T._fahrenheit; - T._kelvin = t.T._kelvin; - _mode = t._mode; - _tempPtr = t._tempPtr; - countIncrease(); - } - return *this; - } - - /** - * #brief move constructor - */ - Temperature(Temperature&& t) noexcept : _tempPtr(nullptr), _mode(t._mode) - { - T._fahrenheit = t.T._fahrenheit; - T._celsius = t.T._celsius; - T._kelvin = t.T._kelvin; - } - - static void show_temperature_objectCount() { std::cout << "\ntemperature object count: " << temperature_objectCount << std::endl; } - static int get_temperature_objectCount() { return temperature_objectCount; } - - struct Temp - { - ld _celsius; - ld _fahrenheit; - ld _kelvin; - - ld getFahrenheit()const { return _fahrenheit; } - ld getCelsius()const { return _celsius; } - ld getKelvin()const { return _kelvin; } - void showFahrenheit()const { std::cout << "F: " << getFahrenheit() << std::endl; } - void showCelsius()const { std::cout << "C: " << getCelsius() << std::endl; } - void showKelvin()const { std::cout << "K: " << getKelvin() << std::endl; } - void showAllTemps()const - { - showFahrenheit(); - showCelsius(); - showKelvin(); - } - - /** - * @brief method to set the fahrenheit instance variable. will update other - * instance variables to reflect. - * @param f is the temp in fahrenheit - */ - void set_fahrenheit(const ld f) - { - _fahrenheit = f; - _celsius = tempConverter.fahrenheit_to_celsius(_fahrenheit); - _kelvin = tempConverter.fahrenheit_to_kelvin(_fahrenheit); - } - /** - * @brief method to set the celsius instance variable. will update other - * instance variables to reflect. - * @param c is the temp in celsius - */ - void set_celsius(const ld c) - { - _celsius = c; - _fahrenheit = tempConverter.celsius_to_fahrenheit(_celsius); - _kelvin = tempConverter.celsius_to_kelvin(_celsius); - } - /** - * @brief method to set the kelvin instance variable. will update other - * instance variables to reflect. - * @param k is the temp in kelvin - */ - void set_kelvin(const ld k) - { - _kelvin = k; - _celsius = tempConverter.kelvin_to_celsius(_kelvin); - _fahrenheit = tempConverter.kelvin_to_fahrenheit(_kelvin); - } - }T; - - - /** - * @brief char variable when set will change the default of the constructor arguments being - * passed in - * 'c' = celsius - * 'f' = fahrenheit - * 'k' = kelvin - */ - char _mode; - - /** - * @brief method to set the mode to either f or fahrenheit, c for celsius or k for kelvin - * @param mode is a char of the mode either 'f','c','k'. be sure to include single quotes - * if its a literal being passed - */ - void set_mode(char mode) - { - if(mode == 'c' || mode == 'f' || mode == 'k') - { - _mode = mode; - } - else - { - do - { - std::cout << "You entered a wrong mode please re-enter a single c, f, or k\n>>"; - std::cin >> mode; - } - while (mode != 'c' && mode != 'f' && mode != 'k'); - } - - } - /** - * @brief method to set the fahrenheit instance variable. will update other - * instance variables to reflect. - * @param f is the temp in fahrenheit - */ - void set_fahrenheit(const ld f) - { - T._fahrenheit = f; - T._celsius = tempConverter.fahrenheit_to_celsius(T._fahrenheit); - T._kelvin = tempConverter.fahrenheit_to_kelvin(T._fahrenheit); - } - /** - * @brief method to set the celsius instance variable. will update other - * instance variables to reflect. - * @param c is the temp in celsius - */ - void set_celsius(const ld c) - { - T._celsius = c; - T._fahrenheit = tempConverter.celsius_to_fahrenheit(T._celsius); - T._kelvin = tempConverter.celsius_to_kelvin(T._celsius); - } - /** - * @brief method to set the kelvin instance variable. will update other - * instance variables to reflect. - * @param k is the temp in kelvin - */ - void set_kelvin(const ld k) - { - T._kelvin = k; - T._celsius = tempConverter.kelvin_to_celsius(T._kelvin); - T._fahrenheit = tempConverter.kelvin_to_fahrenheit(T._kelvin); - } - ld getFahrenheit()const { return T._fahrenheit; } - ld getCelsius()const { return T._celsius; } - ld getKelvin()const { return T._kelvin; } - void showFahrenheit()const { std::cout << "F: " << getFahrenheit() << std::endl; } - void showCelsius()const { std::cout << "C: " << getCelsius() << std::endl; } - void showKelvin()const { std::cout << "K: " << getKelvin() << std::endl; } - void showAllTemps()const - { - showFahrenheit(); - showCelsius(); - showKelvin(); - } - - - - /** - * @brief converts from molecules to moles - * @param N is the number of molecules - * @returns the mole^-1 - */ - ld static convert_to_mol(const ld N) - { - return N / AVOGADRO_; - } - - /** - * @brief calculates the linear thermal expansion of a object made of certain materials which, distance - * we use the expansion coefficients with - * @param a is the coefficient of 'linear expansion' - * @param L is the length and the change of the thermal expansion is proportional to its length - * @param tempChange is the change in temperature - * @returns the total expansion in meters - */ - static ld thermalExpansionLinear1D(const ld a, const ld L, const ld tempChange) - { - return a * L * tempChange; - } - - /** - * @brief calculates the thermal expansion in 2 dimensions, area - * @param a is the coefficient of 'linear expansion' - * @param areaChange is the change in the area - * @param tempChange is the change in temperature - * @returns the total thermal expansion of in area - */ - static ld thermalExpansionArea2D(const ld a, const ld areaChange, const ld tempChange) - { - return a * areaChange * tempChange; - } - - /** - * @brief calculates the thermal expansion in 2 dimensions, area - * @param av is the coefficient of 'volume expansion' - * @param vChange is the change in the volume - * @param tempChange is the change in temperature - * @returns the total thermal expansion of a volume - */ - static ld thermalExpansionVolume3D(const ld av, const ld vChange, const ld tempChange) - { - return av * vChange * tempChange; - } - - /** - * @brief calculates the final temperature needed for an object to reach a certain expansion as - * described by the reworked linear thermal equation Tf = ((lRf -lRi)/(a * lRi)) + Ti. - * @param a is the coefficient of 'linear expansion' - * @param lRi is the initial length or radius of object at an initial temp - * @param lRf is the final length or radius caused from thermal expansion - * @param Ti is the initial temperature - * @returns final temperature needed for a object to expand a certain amount - */ - static ld tempFinalFromThermalExpansionLinear1D(const ld a, const ld lRi, const ld lRf, const ld Ti) - { - return ((lRf-lRi)/(a*lRi))+Ti; - } - - /** - * @brief calculate the gas pressure in a tank - * @param F is the total change in volume calculated previously - * @param A is the total volume of tank - * @param B is the bulk modulus - * @returns the gas pressure in Pa - */ - static ld gasPressure(const ld F, const ld A, const ld B) - { - return ((F / A)-1) * B; - } - - /** - * @brief calculates pressure change due to temperature change in a system using the - * ideal gas law PV=NkT which is algebraically reworked to solve for the final pressure - * in the equation: Pf = Pi*(Tf/Ti) - * @param Pi is the initial pressure in the system - * @param Ti is the initial temp in kelvins - * @param Tf is the final temp in kelvins - * @returns the change in pressure due to temp - */ - static ld pressureChangeFromTemperatureChange(const ld Pi, const ld Tf, const ld Ti) - { - return Pi * (Tf / Ti); - } - - /** - * @brief ideal gas law PV = NkT where reworked to solve for P - * which is the absolute pressure of a gas: P = (NkT)/V, k = Boltzmann constant - * @param V is the volume it occupies - * @param N is the number of atoms and molecules in the gas - * @param T is the absolute Temperature - * @returns the absolute pressure - */ - static ld absolutePressure_idealGasLaw(const ld V, const ld N, const ld T) - { - return (N * BOLTZMANN_K_ * T) / V; - } - /** - * @brief ideal gas law PV = NkT where reworked to solve for N - * which is the number of atoms and molecules in the gas N = (PV)/(kT) - * k = boltzmann constant - * @param P is the absolute pressure of a gas - * @param V is the volume it occupies - * @param T is the absolute Temperature in kelvins - * @returns the absolute pressure - */ - static ld numberMolecules_idealGasLaw(const ld P, const ld V, const ld T) - { - return (P * V)/(BOLTZMANN_K_ * T); - } - - /** - * @brief ideal gas law PV = nRT where reworked to solve for n - * which is the number of atoms and moles in the gas n = (PV)/(RT) - * R = Universal gas law constant set to default in joules - * @param P is the absolute pressure of a gas - * @param V is the volume it occupies - * @param T is the absolute Temperature in kelvins - * @param _R is the universal gas law constant default in J - * @returns the absolute pressure - */ - static ld numberMoles_idealGasLaw(const ld P, const ld V, const ld T, const ld _R = R.joules) - { - return (P * V) / (_R * T); - } - - /** - * @brief calculates the KE of a cloud or gas of N molecules - * @param T is the absolute temperature in kelvin - * @returns Thermal energy, molecular interpretation of temperature - */ - static ld translationalKineticEnergy_molecules(const ld T) - { - return (3.0 / 2.0)* BOLTZMANN_K_* T; - } - - /** - * @brief calculates the average speed of molecules at a certain temperature - * @param m is the mass of a single molecule - * @param T Temp K - */ - static ld speedAverage_rms(const ld m, const ld T) - { - return sqrt((3.0 * BOLTZMANN_K_ * T) / m); - } - - /** - * @brief calculates the temperature in kelvin a molecule would need to be to reach a certain velocity - * @param m is the mass of a molecule - * @param v is the velocity in question - * @returns the temp in kelvin needed for a molecule to reach a velocity - */ - static ld temperatureOfMoleculeAtVelocity(const ld m, const ld v) - { - return (m * (v * v)) / (3.0 * BOLTZMANN_K_); - } - - /** - * @brief calculates the density of vapor - */ - static ld vaporDensity(const ld p, const ld m, const ld T, const ld _R = R.joules) - { - return (p * m) / (_R * T); - } - - /** - * @calculates the humidity or dew point - * @param vD is the calculated vapor density - * @param svD is the saturation vapor density level - * @returns humidity level as % - */ - static ld humidityLevel(const ld vD, const ld svD) - { - return (vD / svD) * 100.0; - } - - /** - * @brief calculates the change in temperature - */ - static ld temperatureChange(const ld startTemp, const ld finishTemp) - { - return finishTemp - startTemp; - } - - ~Temperature() - { - delete _tempPtr; - } -}; - -#endif - -#endif //PHYSICSFORMULA_TEMPERATURE_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_TEMPERATURE_H +#define PHYSICSFORMULA_TEMPERATURE_H +/** + * @class Temperature + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @date 11/23/2020 + ____________________________________________________________________________*/ +#ifndef TEMPERATURE_H +#define TEMPERATURE_H +#include +using namespace std; + +/** + * @brief Global Constant _K_ is the Boltzmann constant + * .0000000000000000000000138 J/K + */ +constexpr auto BOLTZMANN_K_ = 1.38e-23;//1.38e-23 + +[[maybe_unused]] constexpr auto ATOMIC_MASS_UNIT_ = 1.66e-27; //1.6605e-27 (u) + +/** + * @brief Global Constant _Na_ is Avogadro's number and is used to express + * units in moles, abb(mol) and is equal to 6.02e23 mol^-1 + */ +constexpr auto AVOGADRO_ = 6.02e23;//6.02*10^23 + +static struct TemperatureConversions +{ + static ld celsius_to_fahrenheit(const ld c) { return (9.0 / 5.0) * c + 32.0; } + static ld fahrenheit_to_celsius(const ld f) { return (5.0 / 9.0) * (f - 32.0); } + static ld celsius_to_kelvin(const ld c) { return c + 273.15; } + static ld kelvin_to_celsius(const ld k) { return k - 273.15; } + static ld fahrenheit_to_kelvin(const ld f) { return (5.0 / 9.0) * (f - 32) + 273.15; } + static ld kelvin_to_fahrenheit(const ld k) { return (9.0 / 5.0) * (k - 273.15) + 32.0; } +}tempConverter; + +/** + * @brief structure of thermal expansion coefficients, each is a std::vector of two + * and is followed by a capitol letter of either a S for solid a L for liquid or + * a G for gases, only solids have std::vectors with two values the others are ld's here is an example: + * aluminum_S[0] = coefficient of linear expansion // holds the value 25*10^-6 + * aluminum_S[1] = coefficient of volume expansion //holds the value 75*10^-6 + * of ether_L = coefficient of volume expansion // holds the value of 1650*10^-6 + */ +static struct ThermalExpansionCoefficients +{ + const std::vector aluminum_S = { 25 * pow(10, -6), 75 * pow(10, -6) }; + const std::vector brass_S = { 19 * pow(10, -6), 56 * pow(10, -6) }; + const std::vector copper_S = { 17 * pow(10, -6), 51 * pow(10, -6) }; + const std::vector gold_S = { 14 * pow(10, -6), 42 * pow(10, -6) }; + const std::vector iron_or_steel_S = { 12 * pow(10, -6), 35 * pow(10, -6) }; + const std::vector invar_nickel_iron_allow_S = { 0.9 * pow(10, -6), 2.7 * pow(10, -6) }; + const std::vector lead_S = { 29 * pow(10, -6), 87 * pow(10, -6) }; + const std::vector silver_S = { 18 * pow(10, -6), 54 * pow(10, -6) }; + const std::vector glass_ordinary_S = { 9 * pow(10, -6), 27 * pow(10, -6) }; + const std::vector glass_pyrex_S = { 3 * pow(10, -6), 9 * pow(10, -6) }; + const std::vector quartz_S = { 0.4 * pow(10, -6), 1 * pow(10, -6) }; + const std::vector concrete_brick_S = { 12 * pow(10, -6), 36 * pow(10, -6) }; //average + const std::vector marble_S = { 7 * pow(10, -6), 2.1 * pow(10, -6) }; //average + const ld ether_L = 1650 * pow(10, -6); + const ld ethyl_alcohol = 1100 * pow(10, -6); + const ld petrol = 950 * pow(10, -6); + const ld glycerin = 500 * pow(10, -6); + const ld mercury = 180 * pow(10, -6); + const ld water = 210 * pow(10, -6); + const ld air_and_most_gases_at_atmospheric_pressure = 3400 * pow(10, -6); + +}tec; + +/** + * @brief Global constant _R_ is the universal gas constant struct which has _R_ + * in different units for use in different kinds of problems all represented + * as unit/mol * K + */ +const struct UniversalGasConstant +{ + const ld joules = 8.31; //8.31 J/mol * K + const ld cal = 1.99; // 1.99 cal/mol * k + const ld L_atm = .0821; // .0821 L * atm/mol * K +}R; + + +static int temperature_objectCount = 0; + +class Temperature +{ +private: + + static void countIncrease() { temperature_objectCount += 1; } + static void countDecrease() { temperature_objectCount -= 1; } +public: + Temperature* _tempPtr; + /** + * @brief no argument constructor + */ + Temperature() + { + _tempPtr = nullptr; + T._celsius = 0.0; + T._fahrenheit = 0.0; + T._kelvin = 0.0; + _mode = 'f'; + countIncrease(); + } + /** + * @brief copy constructor + */ + Temperature(const Temperature& t) + { + T._celsius = t.T._celsius; + T._fahrenheit = t.T._fahrenheit; + T._kelvin = t.T._kelvin; + _mode = t._mode; + _tempPtr = t._tempPtr; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Temperature& operator=(const Temperature& t) + { + if (this != &t) + { + T._celsius = t.T._celsius; + T._fahrenheit = t.T._fahrenheit; + T._kelvin = t.T._kelvin; + _mode = t._mode; + _tempPtr = t._tempPtr; + countIncrease(); + } + return *this; + } + + /** + * #brief move constructor + */ + Temperature(Temperature&& t) noexcept : _tempPtr(nullptr), _mode(t._mode) + { + T._fahrenheit = t.T._fahrenheit; + T._celsius = t.T._celsius; + T._kelvin = t.T._kelvin; + } + + static void show_temperature_objectCount() { std::cout << "\ntemperature object count: " << temperature_objectCount << std::endl; } + static int get_temperature_objectCount() { return temperature_objectCount; } + + struct Temp + { + ld _celsius; + ld _fahrenheit; + ld _kelvin; + + ld getFahrenheit()const { return _fahrenheit; } + ld getCelsius()const { return _celsius; } + ld getKelvin()const { return _kelvin; } + void showFahrenheit()const { std::cout << "F: " << getFahrenheit() << std::endl; } + void showCelsius()const { std::cout << "C: " << getCelsius() << std::endl; } + void showKelvin()const { std::cout << "K: " << getKelvin() << std::endl; } + void showAllTemps()const + { + showFahrenheit(); + showCelsius(); + showKelvin(); + } + + /** + * @brief method to set the fahrenheit instance variable. will update other + * instance variables to reflect. + * @param f is the temp in fahrenheit + */ + void set_fahrenheit(const ld f) + { + _fahrenheit = f; + _celsius = tempConverter.fahrenheit_to_celsius(_fahrenheit); + _kelvin = tempConverter.fahrenheit_to_kelvin(_fahrenheit); + } + /** + * @brief method to set the celsius instance variable. will update other + * instance variables to reflect. + * @param c is the temp in celsius + */ + void set_celsius(const ld c) + { + _celsius = c; + _fahrenheit = tempConverter.celsius_to_fahrenheit(_celsius); + _kelvin = tempConverter.celsius_to_kelvin(_celsius); + } + /** + * @brief method to set the kelvin instance variable. will update other + * instance variables to reflect. + * @param k is the temp in kelvin + */ + void set_kelvin(const ld k) + { + _kelvin = k; + _celsius = tempConverter.kelvin_to_celsius(_kelvin); + _fahrenheit = tempConverter.kelvin_to_fahrenheit(_kelvin); + } + }T; + + + /** + * @brief char variable when set will change the default of the constructor arguments being + * passed in + * 'c' = celsius + * 'f' = fahrenheit + * 'k' = kelvin + */ + char _mode; + + /** + * @brief method to set the mode to either f or fahrenheit, c for celsius or k for kelvin + * @param mode is a char of the mode either 'f','c','k'. be sure to include single quotes + * if its a literal being passed + */ + void set_mode(char mode) + { + if(mode == 'c' || mode == 'f' || mode == 'k') + { + _mode = mode; + } + else + { + do + { + std::cout << "You entered a wrong mode please re-enter a single c, f, or k\n>>"; + std::cin >> mode; + } + while (mode != 'c' && mode != 'f' && mode != 'k'); + } + + } + /** + * @brief method to set the fahrenheit instance variable. will update other + * instance variables to reflect. + * @param f is the temp in fahrenheit + */ + void set_fahrenheit(const ld f) + { + T._fahrenheit = f; + T._celsius = tempConverter.fahrenheit_to_celsius(T._fahrenheit); + T._kelvin = tempConverter.fahrenheit_to_kelvin(T._fahrenheit); + } + /** + * @brief method to set the celsius instance variable. will update other + * instance variables to reflect. + * @param c is the temp in celsius + */ + void set_celsius(const ld c) + { + T._celsius = c; + T._fahrenheit = tempConverter.celsius_to_fahrenheit(T._celsius); + T._kelvin = tempConverter.celsius_to_kelvin(T._celsius); + } + /** + * @brief method to set the kelvin instance variable. will update other + * instance variables to reflect. + * @param k is the temp in kelvin + */ + void set_kelvin(const ld k) + { + T._kelvin = k; + T._celsius = tempConverter.kelvin_to_celsius(T._kelvin); + T._fahrenheit = tempConverter.kelvin_to_fahrenheit(T._kelvin); + } + ld getFahrenheit()const { return T._fahrenheit; } + ld getCelsius()const { return T._celsius; } + ld getKelvin()const { return T._kelvin; } + void showFahrenheit()const { std::cout << "F: " << getFahrenheit() << std::endl; } + void showCelsius()const { std::cout << "C: " << getCelsius() << std::endl; } + void showKelvin()const { std::cout << "K: " << getKelvin() << std::endl; } + void showAllTemps()const + { + showFahrenheit(); + showCelsius(); + showKelvin(); + } + + + + /** + * @brief converts from molecules to moles + * @param N is the number of molecules + * @returns the mole^-1 + */ + ld static convert_to_mol(const ld N) + { + return N / AVOGADRO_; + } + + /** + * @brief calculates the linear thermal expansion of a object made of certain materials which, distance + * we use the expansion coefficients with + * @param a is the coefficient of 'linear expansion' + * @param L is the length and the change of the thermal expansion is proportional to its length + * @param tempChange is the change in temperature + * @returns the total expansion in meters + */ + static ld thermalExpansionLinear1D(const ld a, const ld L, const ld tempChange) + { + return a * L * tempChange; + } + + /** + * @brief calculates the thermal expansion in 2 dimensions, area + * @param a is the coefficient of 'linear expansion' + * @param areaChange is the change in the area + * @param tempChange is the change in temperature + * @returns the total thermal expansion of in area + */ + static ld thermalExpansionArea2D(const ld a, const ld areaChange, const ld tempChange) + { + return a * areaChange * tempChange; + } + + /** + * @brief calculates the thermal expansion in 2 dimensions, area + * @param av is the coefficient of 'volume expansion' + * @param vChange is the change in the volume + * @param tempChange is the change in temperature + * @returns the total thermal expansion of a volume + */ + static ld thermalExpansionVolume3D(const ld av, const ld vChange, const ld tempChange) + { + return av * vChange * tempChange; + } + + /** + * @brief calculates the final temperature needed for an object to reach a certain expansion as + * described by the reworked linear thermal equation Tf = ((lRf -lRi)/(a * lRi)) + Ti. + * @param a is the coefficient of 'linear expansion' + * @param lRi is the initial length or radius of object at an initial temp + * @param lRf is the final length or radius caused from thermal expansion + * @param Ti is the initial temperature + * @returns final temperature needed for a object to expand a certain amount + */ + static ld tempFinalFromThermalExpansionLinear1D(const ld a, const ld lRi, const ld lRf, const ld Ti) + { + return ((lRf-lRi)/(a*lRi))+Ti; + } + + /** + * @brief calculate the gas pressure in a tank + * @param F is the total change in volume calculated previously + * @param A is the total volume of tank + * @param B is the bulk modulus + * @returns the gas pressure in Pa + */ + static ld gasPressure(const ld F, const ld A, const ld B) + { + return ((F / A)-1) * B; + } + + /** + * @brief calculates pressure change due to temperature change in a system using the + * ideal gas law PV=NkT which is algebraically reworked to solve for the final pressure + * in the equation: Pf = Pi*(Tf/Ti) + * @param Pi is the initial pressure in the system + * @param Ti is the initial temp in kelvins + * @param Tf is the final temp in kelvins + * @returns the change in pressure due to temp + */ + static ld pressureChangeFromTemperatureChange(const ld Pi, const ld Tf, const ld Ti) + { + return Pi * (Tf / Ti); + } + + /** + * @brief ideal gas law PV = NkT where reworked to solve for P + * which is the absolute pressure of a gas: P = (NkT)/V, k = Boltzmann constant + * @param V is the volume it occupies + * @param N is the number of atoms and molecules in the gas + * @param T is the absolute Temperature + * @returns the absolute pressure + */ + static ld absolutePressure_idealGasLaw(const ld V, const ld N, const ld T) + { + return (N * BOLTZMANN_K_ * T) / V; + } + /** + * @brief ideal gas law PV = NkT where reworked to solve for N + * which is the number of atoms and molecules in the gas N = (PV)/(kT) + * k = boltzmann constant + * @param P is the absolute pressure of a gas + * @param V is the volume it occupies + * @param T is the absolute Temperature in kelvins + * @returns the absolute pressure + */ + static ld numberMolecules_idealGasLaw(const ld P, const ld V, const ld T) + { + return (P * V)/(BOLTZMANN_K_ * T); + } + + /** + * @brief ideal gas law PV = nRT where reworked to solve for n + * which is the number of atoms and moles in the gas n = (PV)/(RT) + * R = Universal gas law constant set to default in joules + * @param P is the absolute pressure of a gas + * @param V is the volume it occupies + * @param T is the absolute Temperature in kelvins + * @param _R is the universal gas law constant default in J + * @returns the absolute pressure + */ + static ld numberMoles_idealGasLaw(const ld P, const ld V, const ld T, const ld _R = R.joules) + { + return (P * V) / (_R * T); + } + + /** + * @brief calculates the KE of a cloud or gas of N molecules + * @param T is the absolute temperature in kelvin + * @returns Thermal energy, molecular interpretation of temperature + */ + static ld translationalKineticEnergy_molecules(const ld T) + { + return (3.0 / 2.0)* BOLTZMANN_K_* T; + } + + /** + * @brief calculates the average speed of molecules at a certain temperature + * @param m is the mass of a single molecule + * @param T Temp K + */ + static ld speedAverage_rms(const ld m, const ld T) + { + return sqrt((3.0 * BOLTZMANN_K_ * T) / m); + } + + /** + * @brief calculates the temperature in kelvin a molecule would need to be to reach a certain velocity + * @param m is the mass of a molecule + * @param v is the velocity in question + * @returns the temp in kelvin needed for a molecule to reach a velocity + */ + static ld temperatureOfMoleculeAtVelocity(const ld m, const ld v) + { + return (m * (v * v)) / (3.0 * BOLTZMANN_K_); + } + + /** + * @brief calculates the density of vapor + */ + static ld vaporDensity(const ld p, const ld m, const ld T, const ld _R = R.joules) + { + return (p * m) / (_R * T); + } + + /** + * @calculates the humidity or dew point + * @param vD is the calculated vapor density + * @param svD is the saturation vapor density level + * @returns humidity level as % + */ + static ld humidityLevel(const ld vD, const ld svD) + { + return (vD / svD) * 100.0; + } + + /** + * @brief calculates the change in temperature + */ + static ld temperatureChange(const ld startTemp, const ld finishTemp) + { + return finishTemp - startTemp; + } + + ~Temperature() + { + delete _tempPtr; + } +}; + +#endif + +#endif //PHYSICSFORMULA_TEMPERATURE_H diff --git a/TemplateBST.h b/TemplateBST.h index c7c1547..f77af19 100644 --- a/TemplateBST.h +++ b/TemplateBST.h @@ -1,845 +1,845 @@ -// -// Created by Ryan.Zurrin001 on 12/17/2021. -// - -#ifndef PHYSICSFORMULA_TEMPLATEBST_H -#define PHYSICSFORMULA_TEMPLATEBST_H -#define INT_MAX 2147483647 -#include -#include -#include - -#define COUNT 10 -static int pos = 1; - -template -struct node -{ - node* left; - node* right; - node() : left(nullptr), right(nullptr) {} - ~node() { delete left; delete right; } - [[nodiscard]] int max_depth() const { - const int left_depth = left ? left->max_depth() : 0; - const int right_depth = right ? right->max_depth() : 0; - return (left_depth > right_depth ? left_depth : right_depth) + 1; - } - T item; -}; - - -template -class TBST -{ - node* root; - int qty; - int max; - /// - /// private auxiliary method to help with adding to the tree. - /// - /// The tree. - /// The key. - /// true if added: else false - bool pAdd(node* tree, T& k); - /// - /// private auxiliary method to help with deleting element from tree - /// - /// The tree. - /// The key. - /// true if deleted: else false - bool pDelete(node*& tree, T& k); - /// - /// private auxiliary function called when a node is found to - /// be deleted from the tree. - /// - /// The tree. - /// - bool deleteNode(node*& tree); - /// - /// Gets the predecessor node when deleting nodes what need to be relinked - /// - /// The tree. - /// The k. - static void getPredecessor(node* tree, T& k); - /// - /// Counts the nodes. - /// - /// The tree. - /// - static int countNodes(node* tree); - - static void countLeftSubTreeHelper(node* tree, int* count); - - static void countRightSubTreeHelper(node* tree, int* count); - /// - /// fills the auxiliary array with the values of the tree - /// - /// The tree. - void fillAuxArray(vector& arr, node* tree); - /// - /// shuffles the array in random fashion - /// - void shuffleArray(vector& arr); - /// - /// fill tree with the values of the array - /// - void fillTreeFromArray(vector& arr, TBST* tree); - - /// - /// Retrieves the specified tree. - /// - /// The tree. - /// The k. - /// The found. - /// - bool retrieve(node* tree, T k, T& found)const; - /// - /// Copies the tree. - /// - /// The copy. - /// The original tree. - static void copyTree(node*& copy, const node* originalTree); - /// - /// Destroys the specified tree. - /// - /// The tree. - void destroy(node*& tree); - /// - /// Prints the tree. - /// - /// The tree. - /// The os. - static void printTree(node* tree); - /// - /// auxiliary pre-order traversal helper - /// - /// The tree. - static void preOrderHelper(node* tree); - /// - /// auxiliary in-order traversal helper - /// - /// The tree. - static void inOrderHelper(node* tree); - /// - /// auxiliary post-order traversal helper - /// - /// The tree. - static void postOrderHelper(node* tree); - /// - /// auxiliary breadth-first-order traversal helper - /// - /// The tree. - static void breadthFirstHelper(node* tree); - /// - /// auxiliary reverse-order traversal helper - /// - /// The tree. - static void reverseOrderHelper(node* tree); - /// - /// auxiliary 2D-order traversal helper - /// - /// The tree. - /// The space between nodes. - static void twoDimensionalHelper(node* tree, int space); - -public: - /// - /// Initializes a new instance of the class. - /// - TBST(); - - /// - /// Initializes a new instance of the class. - /// - /// The maximum size. - explicit TBST(int maxSize); - - - /// - /// Copy Constructor initializes a new instance of the - /// class. - /// - /// The original tree. - TBST(const TBST& other); - - /// - /// Move Constructor initializes a new instance of the - /// class. - /// - /// The original tree. - TBST(TBST&& other) noexcept; - - /// - /// copy assignment operator - /// - /// The original tree. - TBST& operator=(const TBST& other); - - - /// - /// Move operator= copies from the specified original tree. - /// - /// The original tree. - TBST& operator=(TBST&& originalTree) noexcept; - - /// - /// copy assignment operator - /// - /// The original tree. - - - /// - /// Allows the user to pass one of these into traverseTree method and get - /// a tree printed out in the order they wish - /// - enum OrderType { - PRE_ORDER, - IN_ORDER, - POST_ORDER, - BREADTH_FIRST, - REVERSE_ORDER, - TWO_DIMENSIONS - }; - /// - /// Adds item to the tree - /// - /// The key value. - /// true if added: else false - bool addItem(T k); - - - /// - /// Deletes the item. - /// - /// The k. - /// - bool deleteItem(T k); - /// - /// Determines whether this instance is empty. - /// - /// - /// true if this instance is empty; otherwise, false. - /// - bool isEmpty()const; - /// - /// Determines whether this instance is full. - /// - /// - /// true if this instance is full; otherwise, false. - /// - bool isFull()const; - /// - /// Makes the tree empty. - /// - /// - bool makeEmpty(); - /// - /// Traverses the tree. - /// - /// The order to traverse the tree. - void traverseTree(OrderType order)const; - /// - /// Gets the qty. - /// - /// the number of elements in the tree - int getQty()const; - /// - /// Gets the count. - /// - /// counts the nodes and returns the count - int getCount()const; - /// - /// Finds the item. - /// - /// The key to look for. - /// The found. - /// - bool findItem(T k, T& found)const; - /// - /// Finds the rank of a node - /// - /// the tree node - /// value of height - /// - int rankOf(node* tree, T val); - /// - /// returns the root of the tree - /// - node* getRoot(); - /// - /// returns whether the tree is balanced or not - /// - /// - bool isBalanced(); - /// - /// balances the tree using auxiliary array - /// - void balanceTree(); - - /// - /// returns the size of the tree - /// - int getSize() const { return qty; } - static vector countLeftRightSubTree(node* tree); - /// - /// outputs the tree - /// - /// The output stream if being printed out to file. - /// true if prints: else false - bool display(std::ofstream& os)const; - /// - /// Finalizes an instance of the class. - /// - ~TBST(); -}; -////////////////////////////////////////////////////////////////////////////// - -template -inline bool TBST::pAdd(node* tree, T& k) -{ - if (tree->item == k || qty >= max) - { - return false; // duplicate item, or max size reached - } - - if (k < tree->item)//walk left - { - if (tree->left == NULL)//add element here - { - tree->left = new node; - tree->left->left = tree->left->right = NULL; - tree->left->item = k; - qty++; - return true; - } - else - return pAdd(tree->left, k); - } - else - { - if (tree->right == NULL)//add element here - { - tree->right = new node; - tree->right->left = tree->right->right = NULL; - tree->right->item = k; - qty++; - return true; - } - else - pAdd(tree->right, k); - } - return false; -} - -template -inline bool TBST::pDelete(node*& tree, T& k) -{ - if (k < tree->item) - { - if (tree->left == NULL) - return false; - return pDelete(tree->left, k); - } - else if (k > tree->item) - { - if (tree->right == NULL) - return false; - return pDelete(tree->right, k); - } - else - return deleteNode(tree); -} - -template -inline bool TBST::deleteNode(node*& tree) -{ - T _k = root->item; - node* tempPtr; - - tempPtr = tree; - if (tree->left == NULL) - { - tree = tree->right; - delete tempPtr; - qty--; - return true; - } - else if (tree->right == NULL) - { - tree = tree->left; - delete tempPtr; - qty--; - return true; - } - else - { - getPredecessor(tree->left, _k); - tree->item = _k; - return pDelete(tree->left, _k); - } -} - -template -inline void TBST::getPredecessor(node* tree, T& k) -{ - while (tree->right != NULL) - tree = tree->right; - k = tree->item; -} - -template -inline int TBST::countNodes(node* tree) -{ - if (tree == NULL) - return 0; - else - return countNodes(tree->left) + countNodes(tree->right) + 1; -} - -template -inline void TBST::countLeftSubTreeHelper(node* tree, int* count) -{ - if (tree == NULL) - return; - else - { - countLeftSubTreeHelper(tree->left, count); - countLeftSubTreeHelper(tree->right, count); - *count = *count + 1; - } -} -template -inline void TBST::countRightSubTreeHelper(node* tree, int* count) -{ - if (tree == NULL) - return; - else - { - countRightSubTreeHelper(tree->left, count); - countRightSubTreeHelper(tree->right, count); - *count = *count + 1; - } -} - - -template -inline bool TBST::retrieve(node* tree, const T k, T& found) const -{ - if (tree == NULL) - return false; - if (k < tree->item) - retrieve(root->left, k, found); - else if (k > tree->num) - retrieve(tree->right, k, found); - else if (k == tree->item) - { - found = tree->item; - return true; - } - else - return false; -} - -template -inline void TBST::copyTree(node*& copy, const node* originalTree) -{ - if (originalTree == NULL) - copy = NULL; - else - { - copy = new node; - copy->item = originalTree->item; - copyTree(copy->left, originalTree->left); - copyTree(copy->right, originalTree->right); - } -} - -template -inline void TBST::destroy(node*& tree) -{ - //cout << "Destroying tree..." << endl; - if (tree != NULL) - { - destroy(tree->left); - destroy(tree->right); - delete tree; - tree = NULL; - } - // cout << "Tree destroyed." << endl; -} - -template -inline void TBST::printTree(node* tree) -{ - if (tree != NULL) - { - printTree(tree->left); - std::cout << std::setw(7) << std::left << tree->item - << (pos % 10 == 0 ? '\n' : ' '); - std::cout << tree->item << " "; - pos++; - printTree(tree->right); - - } -} - -template -inline void TBST::preOrderHelper(node* tree) -{ - if (tree != NULL) - { - std::cout << tree->item << " "; - preOrderHelper(tree->left); - preOrderHelper(tree->right); - } -} - -template -inline void TBST::inOrderHelper(node* tree) -{ - if (tree != NULL) - { - inOrderHelper(tree->left); - std::cout << tree->item << " "; - inOrderHelper(tree->right); - } -} - -template -inline void TBST::postOrderHelper(node* tree) -{ - if (tree != NULL) - { - postOrderHelper(tree->left); - postOrderHelper(tree->right); - std::cout << tree->item << " "; - } -} - -template -inline void TBST::breadthFirstHelper(node* tree) -{ - if (tree == NULL) - return; - std::queue*> bFList; - bFList.push(tree); - while (bFList.empty() == false) - { - int nodeCount = bFList.size(); - while (nodeCount > 0) - { - node* node = bFList.front(); - std::cout << node->item << " "; - bFList.pop(); - if (node->left != NULL) - bFList.push(node->left); - if (node->right != NULL) - bFList.push(node->right); - nodeCount--; - } - std::cout << std::endl; - } -} - -template -inline void TBST::reverseOrderHelper(node* tree) -{ - if (tree != NULL) - { - reverseOrderHelper(tree->right); - std::cout << tree->item << " "; - reverseOrderHelper(tree->left); - } -} - -template -inline void TBST::twoDimensionalHelper(node* tree, int space) -{ - if (tree == NULL) - return; - space += COUNT; - twoDimensionalHelper(tree->right, space); - std::cout << std::endl; - for (int i = COUNT; i < space; i++) - std::cout << " "; - std::cout << tree->item << "\n"; - twoDimensionalHelper(tree->left, space); -} - -template -inline TBST::TBST() -{ - qty = 0; - max = INT_MAX; - root = NULL; -} - -template -inline TBST::TBST(int maxSize) -{ - qty = 0; - max = maxSize; - root = NULL; -} - -template -inline TBST::TBST(const TBST& other) -{ - qty = other.qty; - max = other.max; - copyTree(root, other.root); -} - -template -inline TBST &TBST::operator=(TBST&& originalTree) noexcept -{ - if (this != &originalTree) - { - destroy(root); - root = originalTree.root; - originalTree.root = NULL; - qty = originalTree.qty; - max = originalTree.max; - return *this; - } - else - return *this; -} - -template -inline bool TBST::addItem(T k) -{ - if (isFull()) - return false; - if (root == NULL) - { - root = new node; - root->left = NULL; - root->right = NULL; - root->item = k; - qty++; - return true; - } - - return pAdd(root, k); -} - -template -inline bool TBST::deleteItem(T k) -{ - return pDelete(root, k); -} - -template -inline bool TBST::isEmpty() const -{ - return root == NULL; -} - -template -inline bool TBST::isFull() const -{ - return qty >= max; -} - -template -inline bool TBST::makeEmpty() -{ - //cout << "Tree is being destroyed in makeEmpty." << endl; - destroy(root); - root = NULL; - qty = 0; - //cout << "Tree destroyed leaving Make empty." << endl; - return true; -} - -template -inline void TBST::traverseTree(OrderType order) const -{ - switch (order) - { - case PRE_ORDER: std::cout << "\nPre-Order tree traversal:\n"; - preOrderHelper(root); - break; - case IN_ORDER: std::cout << "\nIn-Order tree traversal:\n"; - inOrderHelper(root); - break; - case POST_ORDER: std::cout << "\nPost-Order tree traversal:\n"; - postOrderHelper(root); - break; - case BREADTH_FIRST: std::cout << "Breadth-first traversal:\n"; - breadthFirstHelper(root); - break; - case REVERSE_ORDER: std::cout << "\nReverse-Order tree traversal:\n"; - reverseOrderHelper(root); - break; - case TWO_DIMENSIONS: std::cout << "\nTwo-Dimensional-Order tree traversal:\n"; - twoDimensionalHelper(root, 0); - break; - default: - std::cout << "Invalid traversal order\n"; - break; - } - std::cout << std::endl; -} - -template -inline int TBST::getQty() const -{ - return qty; -} - -template -inline int TBST::getCount() const -{ - return countNodes(root); -} - -template -inline bool TBST::findItem(T k, T& found) const -{ - return retrieve(root, k, found); -} - -template -inline int TBST::rankOf(node* tree, T val) -{ - int rank = 1; - while (tree) { - if (val < tree->item) // move to left subtree - tree = tree->left; - else if (val > tree->item) { - rank += 1 + countLeftNodes(tree->left); - tree = tree->right; - } - else - return rank + countLeftNodes(tree->left) + 1; - } - return -1; // not found -} - -template -inline node* TBST::getRoot() -{ - return root; -} - -template -inline bool TBST::display(std::ofstream& os) const -{ - printTree(root, os); - return true; -} - -template -inline TBST::~TBST() -{ - destroy(root); -} - -template -TBST::TBST(TBST &&other) noexcept { - root = other.root; - qty = other.qty; - max = other.max; - other.root = NULL; -} - -template -TBST &TBST::operator=(const TBST &other) { - if (this != &other) { - destroy(root); - root = NULL; - qty = other.qty; - max = other.max; - copyTree(root, other.root); - } - return *this; -} - -template -bool TBST::isBalanced() { - if(root == NULL) - return true; - vector lr = countLeftRightSubTree(root); - if(abs(lr[0] - lr[1]) > 2) - return false; - else - return true; -} - -template -vector TBST::countLeftRightSubTree(node *tree) { - vector count{0,0}; - if(tree == NULL) - return count; - else { - node *temp = tree->left; - countLeftSubTreeHelper(temp, &count[0]); - temp = tree->right; - countRightSubTreeHelper(temp, &count[1]); - } - return count; -} - -template -void TBST::fillAuxArray(vector& arr, node* tree) { - //cout << "Filling array with values from tree" << endl; - if(tree == NULL) - return; - fillAuxArray(arr, tree->left); - arr.push_back(tree->item); - //cout << "item pushed is " << tree->item << endl; - fillAuxArray(arr, tree->right); - //cout << "Array filled" << endl; -} - -template -void TBST::shuffleArray(vector &arr) { - int n = arr.size(); - cout << "Shuffling array size is "<< n << endl; - bool added[n]; - srandom(time(nullptr)); - for(int i = 0; i < n;) { - int r = random() % n; - if(!added[r]) { - added[r] = true; - arr[i] = arr[r]; - i++; - } - } -} - -template -void TBST::fillTreeFromArray(vector &arr, TBST *tree) { - int n = arr.size() - 1; - int mid = n / 2; - addItem(arr[mid]); - cout << "Shuffling array size is "<< n << endl; - bool added[n]; - srandom(time(nullptr)); - for(int i = 1; i < n;) { - int r = random() % n; - if(!added[r] && r != mid) { - added[r] = true; - addItem(arr[r]); - i++; - } - } -} - -template -void TBST::balanceTree() { - //cout << "Balancing tree..." << endl; - if(root == NULL || isBalanced()) - return; - vector arr; - fillAuxArray(arr, root); - makeEmpty(); - //root = NULL; - //root = new node; - fillTreeFromArray(arr, this); - //cout << "Tree balanced ending!" << endl; -} - -#endif //PHYSICSFORMULA_TEMPLATEBST_H +// +// Created by Ryan.Zurrin001 on 12/17/2021. +// + +#ifndef PHYSICSFORMULA_TEMPLATEBST_H +#define PHYSICSFORMULA_TEMPLATEBST_H +#define INT_MAX 2147483647 +#include +#include +#include + +#define COUNT 10 +static int pos = 1; + +template +struct node +{ + node* left; + node* right; + node() : left(nullptr), right(nullptr) {} + ~node() { delete left; delete right; } + [[nodiscard]] int max_depth() const { + const int left_depth = left ? left->max_depth() : 0; + const int right_depth = right ? right->max_depth() : 0; + return (left_depth > right_depth ? left_depth : right_depth) + 1; + } + T item; +}; + + +template +class TBST +{ + node* root; + int qty; + int max; + /// + /// private auxiliary method to help with adding to the tree. + /// + /// The tree. + /// The key. + /// true if added: else false + bool pAdd(node* tree, T& k); + /// + /// private auxiliary method to help with deleting element from tree + /// + /// The tree. + /// The key. + /// true if deleted: else false + bool pDelete(node*& tree, T& k); + /// + /// private auxiliary function called when a node is found to + /// be deleted from the tree. + /// + /// The tree. + /// + bool deleteNode(node*& tree); + /// + /// Gets the predecessor node when deleting nodes what need to be relinked + /// + /// The tree. + /// The k. + static void getPredecessor(node* tree, T& k); + /// + /// Counts the nodes. + /// + /// The tree. + /// + static int countNodes(node* tree); + + static void countLeftSubTreeHelper(node* tree, int* count); + + static void countRightSubTreeHelper(node* tree, int* count); + /// + /// fills the auxiliary array with the values of the tree + /// + /// The tree. + void fillAuxArray(vector& arr, node* tree); + /// + /// shuffles the array in random fashion + /// + void shuffleArray(vector& arr); + /// + /// fill tree with the values of the array + /// + void fillTreeFromArray(vector& arr, TBST* tree); + + /// + /// Retrieves the specified tree. + /// + /// The tree. + /// The k. + /// The found. + /// + bool retrieve(node* tree, T k, T& found)const; + /// + /// Copies the tree. + /// + /// The copy. + /// The original tree. + static void copyTree(node*& copy, const node* originalTree); + /// + /// Destroys the specified tree. + /// + /// The tree. + void destroy(node*& tree); + /// + /// Prints the tree. + /// + /// The tree. + /// The os. + static void printTree(node* tree); + /// + /// auxiliary pre-order traversal helper + /// + /// The tree. + static void preOrderHelper(node* tree); + /// + /// auxiliary in-order traversal helper + /// + /// The tree. + static void inOrderHelper(node* tree); + /// + /// auxiliary post-order traversal helper + /// + /// The tree. + static void postOrderHelper(node* tree); + /// + /// auxiliary breadth-first-order traversal helper + /// + /// The tree. + static void breadthFirstHelper(node* tree); + /// + /// auxiliary reverse-order traversal helper + /// + /// The tree. + static void reverseOrderHelper(node* tree); + /// + /// auxiliary 2D-order traversal helper + /// + /// The tree. + /// The space between nodes. + static void twoDimensionalHelper(node* tree, int space); + +public: + /// + /// Initializes a new instance of the class. + /// + TBST(); + + /// + /// Initializes a new instance of the class. + /// + /// The maximum size. + explicit TBST(int maxSize); + + + /// + /// Copy Constructor initializes a new instance of the + /// class. + /// + /// The original tree. + TBST(const TBST& other); + + /// + /// Move Constructor initializes a new instance of the + /// class. + /// + /// The original tree. + TBST(TBST&& other) noexcept; + + /// + /// copy assignment operator + /// + /// The original tree. + TBST& operator=(const TBST& other); + + + /// + /// Move operator= copies from the specified original tree. + /// + /// The original tree. + TBST& operator=(TBST&& originalTree) noexcept; + + /// + /// copy assignment operator + /// + /// The original tree. + + + /// + /// Allows the user to pass one of these into traverseTree method and get + /// a tree printed out in the order they wish + /// + enum OrderType { + PRE_ORDER, + IN_ORDER, + POST_ORDER, + BREADTH_FIRST, + REVERSE_ORDER, + TWO_DIMENSIONS + }; + /// + /// Adds item to the tree + /// + /// The key value. + /// true if added: else false + bool addItem(T k); + + + /// + /// Deletes the item. + /// + /// The k. + /// + bool deleteItem(T k); + /// + /// Determines whether this instance is empty. + /// + /// + /// true if this instance is empty; otherwise, false. + /// + bool isEmpty()const; + /// + /// Determines whether this instance is full. + /// + /// + /// true if this instance is full; otherwise, false. + /// + bool isFull()const; + /// + /// Makes the tree empty. + /// + /// + bool makeEmpty(); + /// + /// Traverses the tree. + /// + /// The order to traverse the tree. + void traverseTree(OrderType order)const; + /// + /// Gets the qty. + /// + /// the number of elements in the tree + int getQty()const; + /// + /// Gets the count. + /// + /// counts the nodes and returns the count + int getCount()const; + /// + /// Finds the item. + /// + /// The key to look for. + /// The found. + /// + bool findItem(T k, T& found)const; + /// + /// Finds the rank of a node + /// + /// the tree node + /// value of height + /// + int rankOf(node* tree, T val); + /// + /// returns the root of the tree + /// + node* getRoot(); + /// + /// returns whether the tree is balanced or not + /// + /// + bool isBalanced(); + /// + /// balances the tree using auxiliary array + /// + void balanceTree(); + + /// + /// returns the size of the tree + /// + int getSize() const { return qty; } + static vector countLeftRightSubTree(node* tree); + /// + /// outputs the tree + /// + /// The output stream if being printed out to file. + /// true if prints: else false + bool display(std::ofstream& os)const; + /// + /// Finalizes an instance of the class. + /// + ~TBST(); +}; +////////////////////////////////////////////////////////////////////////////// + +template +inline bool TBST::pAdd(node* tree, T& k) +{ + if (tree->item == k || qty >= max) + { + return false; // duplicate item, or max size reached + } + + if (k < tree->item)//walk left + { + if (tree->left == NULL)//add element here + { + tree->left = new node; + tree->left->left = tree->left->right = NULL; + tree->left->item = k; + qty++; + return true; + } + else + return pAdd(tree->left, k); + } + else + { + if (tree->right == NULL)//add element here + { + tree->right = new node; + tree->right->left = tree->right->right = NULL; + tree->right->item = k; + qty++; + return true; + } + else + pAdd(tree->right, k); + } + return false; +} + +template +inline bool TBST::pDelete(node*& tree, T& k) +{ + if (k < tree->item) + { + if (tree->left == NULL) + return false; + return pDelete(tree->left, k); + } + else if (k > tree->item) + { + if (tree->right == NULL) + return false; + return pDelete(tree->right, k); + } + else + return deleteNode(tree); +} + +template +inline bool TBST::deleteNode(node*& tree) +{ + T _k = root->item; + node* tempPtr; + + tempPtr = tree; + if (tree->left == NULL) + { + tree = tree->right; + delete tempPtr; + qty--; + return true; + } + else if (tree->right == NULL) + { + tree = tree->left; + delete tempPtr; + qty--; + return true; + } + else + { + getPredecessor(tree->left, _k); + tree->item = _k; + return pDelete(tree->left, _k); + } +} + +template +inline void TBST::getPredecessor(node* tree, T& k) +{ + while (tree->right != NULL) + tree = tree->right; + k = tree->item; +} + +template +inline int TBST::countNodes(node* tree) +{ + if (tree == NULL) + return 0; + else + return countNodes(tree->left) + countNodes(tree->right) + 1; +} + +template +inline void TBST::countLeftSubTreeHelper(node* tree, int* count) +{ + if (tree == NULL) + return; + else + { + countLeftSubTreeHelper(tree->left, count); + countLeftSubTreeHelper(tree->right, count); + *count = *count + 1; + } +} +template +inline void TBST::countRightSubTreeHelper(node* tree, int* count) +{ + if (tree == NULL) + return; + else + { + countRightSubTreeHelper(tree->left, count); + countRightSubTreeHelper(tree->right, count); + *count = *count + 1; + } +} + + +template +inline bool TBST::retrieve(node* tree, const T k, T& found) const +{ + if (tree == NULL) + return false; + if (k < tree->item) + retrieve(root->left, k, found); + else if (k > tree->num) + retrieve(tree->right, k, found); + else if (k == tree->item) + { + found = tree->item; + return true; + } + else + return false; +} + +template +inline void TBST::copyTree(node*& copy, const node* originalTree) +{ + if (originalTree == NULL) + copy = NULL; + else + { + copy = new node; + copy->item = originalTree->item; + copyTree(copy->left, originalTree->left); + copyTree(copy->right, originalTree->right); + } +} + +template +inline void TBST::destroy(node*& tree) +{ + //cout << "Destroying tree..." << endl; + if (tree != NULL) + { + destroy(tree->left); + destroy(tree->right); + delete tree; + tree = NULL; + } + // cout << "Tree destroyed." << endl; +} + +template +inline void TBST::printTree(node* tree) +{ + if (tree != NULL) + { + printTree(tree->left); + std::cout << std::setw(7) << std::left << tree->item + << (pos % 10 == 0 ? '\n' : ' '); + std::cout << tree->item << " "; + pos++; + printTree(tree->right); + + } +} + +template +inline void TBST::preOrderHelper(node* tree) +{ + if (tree != NULL) + { + std::cout << tree->item << " "; + preOrderHelper(tree->left); + preOrderHelper(tree->right); + } +} + +template +inline void TBST::inOrderHelper(node* tree) +{ + if (tree != NULL) + { + inOrderHelper(tree->left); + std::cout << tree->item << " "; + inOrderHelper(tree->right); + } +} + +template +inline void TBST::postOrderHelper(node* tree) +{ + if (tree != NULL) + { + postOrderHelper(tree->left); + postOrderHelper(tree->right); + std::cout << tree->item << " "; + } +} + +template +inline void TBST::breadthFirstHelper(node* tree) +{ + if (tree == NULL) + return; + std::queue*> bFList; + bFList.push(tree); + while (bFList.empty() == false) + { + int nodeCount = bFList.size(); + while (nodeCount > 0) + { + node* node = bFList.front(); + std::cout << node->item << " "; + bFList.pop(); + if (node->left != NULL) + bFList.push(node->left); + if (node->right != NULL) + bFList.push(node->right); + nodeCount--; + } + std::cout << std::endl; + } +} + +template +inline void TBST::reverseOrderHelper(node* tree) +{ + if (tree != NULL) + { + reverseOrderHelper(tree->right); + std::cout << tree->item << " "; + reverseOrderHelper(tree->left); + } +} + +template +inline void TBST::twoDimensionalHelper(node* tree, int space) +{ + if (tree == NULL) + return; + space += COUNT; + twoDimensionalHelper(tree->right, space); + std::cout << std::endl; + for (int i = COUNT; i < space; i++) + std::cout << " "; + std::cout << tree->item << "\n"; + twoDimensionalHelper(tree->left, space); +} + +template +inline TBST::TBST() +{ + qty = 0; + max = INT_MAX; + root = NULL; +} + +template +inline TBST::TBST(int maxSize) +{ + qty = 0; + max = maxSize; + root = NULL; +} + +template +inline TBST::TBST(const TBST& other) +{ + qty = other.qty; + max = other.max; + copyTree(root, other.root); +} + +template +inline TBST &TBST::operator=(TBST&& originalTree) noexcept +{ + if (this != &originalTree) + { + destroy(root); + root = originalTree.root; + originalTree.root = NULL; + qty = originalTree.qty; + max = originalTree.max; + return *this; + } + else + return *this; +} + +template +inline bool TBST::addItem(T k) +{ + if (isFull()) + return false; + if (root == NULL) + { + root = new node; + root->left = NULL; + root->right = NULL; + root->item = k; + qty++; + return true; + } + + return pAdd(root, k); +} + +template +inline bool TBST::deleteItem(T k) +{ + return pDelete(root, k); +} + +template +inline bool TBST::isEmpty() const +{ + return root == NULL; +} + +template +inline bool TBST::isFull() const +{ + return qty >= max; +} + +template +inline bool TBST::makeEmpty() +{ + //cout << "Tree is being destroyed in makeEmpty." << endl; + destroy(root); + root = NULL; + qty = 0; + //cout << "Tree destroyed leaving Make empty." << endl; + return true; +} + +template +inline void TBST::traverseTree(OrderType order) const +{ + switch (order) + { + case PRE_ORDER: std::cout << "\nPre-Order tree traversal:\n"; + preOrderHelper(root); + break; + case IN_ORDER: std::cout << "\nIn-Order tree traversal:\n"; + inOrderHelper(root); + break; + case POST_ORDER: std::cout << "\nPost-Order tree traversal:\n"; + postOrderHelper(root); + break; + case BREADTH_FIRST: std::cout << "Breadth-first traversal:\n"; + breadthFirstHelper(root); + break; + case REVERSE_ORDER: std::cout << "\nReverse-Order tree traversal:\n"; + reverseOrderHelper(root); + break; + case TWO_DIMENSIONS: std::cout << "\nTwo-Dimensional-Order tree traversal:\n"; + twoDimensionalHelper(root, 0); + break; + default: + std::cout << "Invalid traversal order\n"; + break; + } + std::cout << std::endl; +} + +template +inline int TBST::getQty() const +{ + return qty; +} + +template +inline int TBST::getCount() const +{ + return countNodes(root); +} + +template +inline bool TBST::findItem(T k, T& found) const +{ + return retrieve(root, k, found); +} + +template +inline int TBST::rankOf(node* tree, T val) +{ + int rank = 1; + while (tree) { + if (val < tree->item) // move to left subtree + tree = tree->left; + else if (val > tree->item) { + rank += 1 + countLeftNodes(tree->left); + tree = tree->right; + } + else + return rank + countLeftNodes(tree->left) + 1; + } + return -1; // not found +} + +template +inline node* TBST::getRoot() +{ + return root; +} + +template +inline bool TBST::display(std::ofstream& os) const +{ + printTree(root, os); + return true; +} + +template +inline TBST::~TBST() +{ + destroy(root); +} + +template +TBST::TBST(TBST &&other) noexcept { + root = other.root; + qty = other.qty; + max = other.max; + other.root = NULL; +} + +template +TBST &TBST::operator=(const TBST &other) { + if (this != &other) { + destroy(root); + root = NULL; + qty = other.qty; + max = other.max; + copyTree(root, other.root); + } + return *this; +} + +template +bool TBST::isBalanced() { + if(root == NULL) + return true; + vector lr = countLeftRightSubTree(root); + if(abs(lr[0] - lr[1]) > 2) + return false; + else + return true; +} + +template +vector TBST::countLeftRightSubTree(node *tree) { + vector count{0,0}; + if(tree == NULL) + return count; + else { + node *temp = tree->left; + countLeftSubTreeHelper(temp, &count[0]); + temp = tree->right; + countRightSubTreeHelper(temp, &count[1]); + } + return count; +} + +template +void TBST::fillAuxArray(vector& arr, node* tree) { + //cout << "Filling array with values from tree" << endl; + if(tree == NULL) + return; + fillAuxArray(arr, tree->left); + arr.push_back(tree->item); + //cout << "item pushed is " << tree->item << endl; + fillAuxArray(arr, tree->right); + //cout << "Array filled" << endl; +} + +template +void TBST::shuffleArray(vector &arr) { + int n = arr.size(); + cout << "Shuffling array size is "<< n << endl; + bool added[n]; + srandom(time(nullptr)); + for(int i = 0; i < n;) { + int r = random() % n; + if(!added[r]) { + added[r] = true; + arr[i] = arr[r]; + i++; + } + } +} + +template +void TBST::fillTreeFromArray(vector &arr, TBST *tree) { + int n = arr.size() - 1; + int mid = n / 2; + addItem(arr[mid]); + cout << "Shuffling array size is "<< n << endl; + bool added[n]; + srandom(time(nullptr)); + for(int i = 1; i < n;) { + int r = random() % n; + if(!added[r] && r != mid) { + added[r] = true; + addItem(arr[r]); + i++; + } + } +} + +template +void TBST::balanceTree() { + //cout << "Balancing tree..." << endl; + if(root == NULL || isBalanced()) + return; + vector arr; + fillAuxArray(arr, root); + makeEmpty(); + //root = NULL; + //root = new node; + fillTreeFromArray(arr, this); + //cout << "Tree balanced ending!" << endl; +} + +#endif //PHYSICSFORMULA_TEMPLATEBST_H diff --git a/TemplateClass.h b/TemplateClass.h index 2befdaa..6793ebf 100644 --- a/TemplateClass.h +++ b/TemplateClass.h @@ -1,80 +1,80 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_TEMPLATECLASS_H -#define PHYSICSFORMULA_TEMPLATECLASS_H -/** - * @class TemplateClass - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @dateBuilt 3/18/2021 - * @lastEdit 3/21/2021 - */ -#include - - -static int objectCount = 0; - -template -class TemplateClass -{ - T templateVar; - static auto countIncrease() { objectCount += 1; } - static auto countDecrease() { objectCount -= 1; } -public: - - TemplateClass() - { - templateVar = 0.0; - countIncrease(); - } - - /** - * @brief copy constructor - */ - TemplateClass(const TemplateClass& t) - { - templateVar = t.templateVar; - countIncrease(); - } - /** - * #brief move constructor - */ - TemplateClass(TemplateClass&& t) noexcept - { - templateVar = t.templateVar; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - TemplateClass& operator=(TemplateClass&& t) noexcept - { - if (this != &t) - { - templateVar = t.templateVar; - countIncrease(); - } - return *this; - } - - TemplateClass& operator=(TemplateClass other) - { - std::swap(templateVar, other.templateVar); - return *this; - } - - static void show_objectCount() { std::cout << "\n template object count: " - << objectCount << std::endl; } - static int get_objectCount() { return objectCount; } - - - ~TemplateClass() = default; - - auto setTemplateVar(T var) { templateVar = var; } - [[nodiscard]] auto getTemplateVar() const { return templateVar; } - - -}; -#endif //PHYSICSFORMULA_TEMPLATECLASS_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_TEMPLATECLASS_H +#define PHYSICSFORMULA_TEMPLATECLASS_H +/** + * @class TemplateClass + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @dateBuilt 3/18/2021 + * @lastEdit 3/21/2021 + */ +#include + + +static int objectCount = 0; + +template +class TemplateClass +{ + T templateVar; + static auto countIncrease() { objectCount += 1; } + static auto countDecrease() { objectCount -= 1; } +public: + + TemplateClass() + { + templateVar = 0.0; + countIncrease(); + } + + /** + * @brief copy constructor + */ + TemplateClass(const TemplateClass& t) + { + templateVar = t.templateVar; + countIncrease(); + } + /** + * #brief move constructor + */ + TemplateClass(TemplateClass&& t) noexcept + { + templateVar = t.templateVar; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + TemplateClass& operator=(TemplateClass&& t) noexcept + { + if (this != &t) + { + templateVar = t.templateVar; + countIncrease(); + } + return *this; + } + + TemplateClass& operator=(TemplateClass other) + { + std::swap(templateVar, other.templateVar); + return *this; + } + + static void show_objectCount() { std::cout << "\n template object count: " + << objectCount << std::endl; } + static int get_objectCount() { return objectCount; } + + + ~TemplateClass() = default; + + auto setTemplateVar(T var) { templateVar = var; } + [[nodiscard]] auto getTemplateVar() const { return templateVar; } + + +}; +#endif //PHYSICSFORMULA_TEMPLATECLASS_H diff --git a/Testing.h b/Testing.h index a2895af..03317d8 100644 --- a/Testing.h +++ b/Testing.h @@ -1,224 +1,224 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_TESTING_H -#define PHYSICSFORMULA_TESTING_H -#pragma once -#pragma warning(suppress : 4996) - -#include -#include -#include -#include -#include -#include - -template -auto add(T value) -{ - return value; -} - - -template -auto add(T head, Ts... rest) -{ - return head + add(rest...); -} - - -template -auto make_even_tuple(T... a) -{ - static_assert(sizeof...(a) % 2 == 0, - "expected an even number of arguments"); - std::tuple t{ a... }; - - return t; -} - - -//left folding wit a unary form (... op pack): -template -auto add(Ts... args) -{ - return (... + args); -} - -//left folding with a binary form (init op ... op pack): -template -auto add_to_one(Ts... args) -{ - return (1 + ... + args); -} -/* -//right folding wit a unary form (pack op ...): -template -auto add(Ts... args) -{ - return (args + ...); -} - -//right folding with a binary form (pack op ... op init): -template -auto add_to_one(Ts... args) -{ - return (args + ... + 1); -} - -*/ - -template -struct wrapper -{ - T const& value; -}; - -template -constexpr auto operator<(wrapper const & lhs, - wrapper const & rhs) -{ - return wrapper { - lhs.value < rhs.value ? lhs.value : rhs.value}; -} - -template -constexpr auto min(Ts&&... args) -{ - return (wrapper{args} < ...).value; -} - - -inline void log(std::any const & value) -{ - if (value.has_value()) - { - auto const& tv = value.type(); - if (tv == typeid(int)) - { - std::cout << std::any_cast(value) << '\n'; - } - else if (tv == typeid(std::string)) - { - std::cout << std::any_cast(value) << '\n'; - } - else if (tv == typeid(double)) - { - std::cout << std::fixed << std::setprecision(2) << std::any_cast(value) << '\n'; - } - else if (tv == typeid(char)) - { - std::cout << std::any_cast(value) << '\n'; - } - else if (tv == typeid(std::chrono::time_point)) - { - auto t = std::any_cast>(value); - auto now = std::chrono::system_clock::to_time_t(t); - std::cout << std::put_time(std::localtime(&now), "%F %T") - << '\n'; - } - else - { - std::cout << "Unexpected value type: " << '\n'; - } - } - else - { - std::cout << "(empty)" << '\n'; - } -} - -inline bool isPrime(int n) -{ - if (n == 1) - return false; - auto ret = true; - for(int i = 2; i <= static_cast(floor(sqrt(n))); i++) - { - if(n % i == 0) - { - ret = false; - break; - } - } - return ret || (n==2); -} - -template -auto ascendingSort(T (&arr)[size]) -{ - - //std::cout << "n = 1 op: size is " << size << std::endl; - for(int i = 1; i < size; i++) - { - //std::cout << "1st for loop = 3 op * n\n"; - for(int j = 0; j < size - i; j++) - { - //std::cout << "2nd for loop = 4 op * n\n"; - if (arr[j] > arr[j+1]) - { - //std::cout << "if statement\n"; - auto temp = arr[j]; - arr[j] = arr[j + 1]; - arr[j + 1] = temp; - } - } - } - //std::cout << "return 1 op\n"; - return arr; -} - -template -auto fastExponentiation(T x, T y) -{ - unsigned long long p = 1; - T s = x, r = y; - - while(r > 0) - { - if (r % 2 == 1) - { - p = p * s; - } - s = s * s; - r = r / 2.0; - } - return p; -} - -template -auto y_minus_x(T (&arr)[size],T x, T y) -{ - auto n = size; - auto k = 0; - for(size_t i = 1; i < n; i++) - { - if (arr[i] + x == y) - { - k = k + 1; - } - else if (arr[i] + x > y) - { - break; - } - - } - return k; -} - -inline auto double_sum(int ilow, int iMax, int jlow, int jMax) -{ - auto total = 0; - for(int iLow = ilow;iLow <= iMax; iLow++){ - //std::cout << "outter i: " << iLow << std::endl; - for(int jLow = jlow;jLow <= jMax; jLow++){ - //std::cout <<"inner j: " << jLow << " total: "<< total << std::endl; - total = total + (iLow*iLow)+(jLow*jLow); - } - } - return total; -} - - -#endif //PHYSICSFORMULA_TESTING_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_TESTING_H +#define PHYSICSFORMULA_TESTING_H +#pragma once +#pragma warning(suppress : 4996) + +#include +#include +#include +#include +#include +#include + +template +auto add(T value) +{ + return value; +} + + +template +auto add(T head, Ts... rest) +{ + return head + add(rest...); +} + + +template +auto make_even_tuple(T... a) +{ + static_assert(sizeof...(a) % 2 == 0, + "expected an even number of arguments"); + std::tuple t{ a... }; + + return t; +} + + +//left folding wit a unary form (... op pack): +template +auto add(Ts... args) +{ + return (... + args); +} + +//left folding with a binary form (init op ... op pack): +template +auto add_to_one(Ts... args) +{ + return (1 + ... + args); +} +/* +//right folding wit a unary form (pack op ...): +template +auto add(Ts... args) +{ + return (args + ...); +} + +//right folding with a binary form (pack op ... op init): +template +auto add_to_one(Ts... args) +{ + return (args + ... + 1); +} + +*/ + +template +struct wrapper +{ + T const& value; +}; + +template +constexpr auto operator<(wrapper const & lhs, + wrapper const & rhs) +{ + return wrapper { + lhs.value < rhs.value ? lhs.value : rhs.value}; +} + +template +constexpr auto min(Ts&&... args) +{ + return (wrapper{args} < ...).value; +} + + +inline void log(std::any const & value) +{ + if (value.has_value()) + { + auto const& tv = value.type(); + if (tv == typeid(int)) + { + std::cout << std::any_cast(value) << '\n'; + } + else if (tv == typeid(std::string)) + { + std::cout << std::any_cast(value) << '\n'; + } + else if (tv == typeid(double)) + { + std::cout << std::fixed << std::setprecision(2) << std::any_cast(value) << '\n'; + } + else if (tv == typeid(char)) + { + std::cout << std::any_cast(value) << '\n'; + } + else if (tv == typeid(std::chrono::time_point)) + { + auto t = std::any_cast>(value); + auto now = std::chrono::system_clock::to_time_t(t); + std::cout << std::put_time(std::localtime(&now), "%F %T") + << '\n'; + } + else + { + std::cout << "Unexpected value type: " << '\n'; + } + } + else + { + std::cout << "(empty)" << '\n'; + } +} + +inline bool isPrime(int n) +{ + if (n == 1) + return false; + auto ret = true; + for(int i = 2; i <= static_cast(floor(sqrt(n))); i++) + { + if(n % i == 0) + { + ret = false; + break; + } + } + return ret || (n==2); +} + +template +auto ascendingSort(T (&arr)[size]) +{ + + //std::cout << "n = 1 op: size is " << size << std::endl; + for(int i = 1; i < size; i++) + { + //std::cout << "1st for loop = 3 op * n\n"; + for(int j = 0; j < size - i; j++) + { + //std::cout << "2nd for loop = 4 op * n\n"; + if (arr[j] > arr[j+1]) + { + //std::cout << "if statement\n"; + auto temp = arr[j]; + arr[j] = arr[j + 1]; + arr[j + 1] = temp; + } + } + } + //std::cout << "return 1 op\n"; + return arr; +} + +template +auto fastExponentiation(T x, T y) +{ + unsigned long long p = 1; + T s = x, r = y; + + while(r > 0) + { + if (r % 2 == 1) + { + p = p * s; + } + s = s * s; + r = r / 2.0; + } + return p; +} + +template +auto y_minus_x(T (&arr)[size],T x, T y) +{ + auto n = size; + auto k = 0; + for(size_t i = 1; i < n; i++) + { + if (arr[i] + x == y) + { + k = k + 1; + } + else if (arr[i] + x > y) + { + break; + } + + } + return k; +} + +inline auto double_sum(int ilow, int iMax, int jlow, int jMax) +{ + auto total = 0; + for(int iLow = ilow;iLow <= iMax; iLow++){ + //std::cout << "outter i: " << iLow << std::endl; + for(int jLow = jlow;jLow <= jMax; jLow++){ + //std::cout <<"inner j: " << jLow << " total: "<< total << std::endl; + total = total + (iLow*iLow)+(jLow*jLow); + } + } + return total; +} + + +#endif //PHYSICSFORMULA_TESTING_H diff --git a/Thermodynamics.h b/Thermodynamics.h index 292515f..24dc63c 100644 --- a/Thermodynamics.h +++ b/Thermodynamics.h @@ -1,409 +1,409 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_THERMODYNAMICS_H -#define PHYSICSFORMULA_THERMODYNAMICS_H -/** - * @class Thermodynamics - * @details driver class for solving complex physics problems - * @author Ryan Zurrin - * @date 12/6/2020 - */ -constexpr auto _ATM_TO_PASCAL_MULTIPLIER_ = 101325; -static int thermodynamics_objectCount = 0; - -double static kiloJoulesToCalories(const double kJ) -{ - return (kJ * 1000.0) / 4186.0; -} -static double Eff(const double W, const double Qh) -{ - return W / Qh; -} - -#include "Heat.h" -#include "Energy.h" - -class Thermodynamics : - public Energy, public Heat -{ -private: - static void countIncrease() { thermodynamics_objectCount += 1; } - static void countDecrease() { thermodynamics_objectCount -= 1; } -public: - Thermodynamics* _thermodynamicPtr; - - /** - * @brief no argument constructor - */ - Thermodynamics() - { - set_celsius(0.0); - _thermodynamicPtr = nullptr; - }//end no argument constructor - /** - * @brief copy constructor - */ - Thermodynamics(const Thermodynamics& t) - : Heat(t) - { - - T._celsius = t.T._celsius; - T._fahrenheit = t.T._fahrenheit; - T._kelvin = t.T._kelvin; - _mode = t._mode; - _tempPtr = t._tempPtr; - - _thermodynamicPtr = t._thermodynamicPtr; - countIncrease(); - } - /** - * #brief move constructor - */ - Thermodynamics(Thermodynamics&& t) noexcept - { - T._fahrenheit = t.T._fahrenheit; - T._celsius = t.T._celsius; - T._kelvin = t.T._kelvin; - this->_thermodynamicPtr = t._thermodynamicPtr; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Thermodynamics& operator=(const Thermodynamics& t) - { - if (this != &t) - { - T._celsius = t.T._celsius; - T._fahrenheit = t.T._fahrenheit; - T._kelvin = t.T._kelvin; - _mode = t._mode; - _tempPtr = t._tempPtr; - countIncrease(); - } - return *this; - } - - static void show_thermodynamics_objectCount() { std::cout << "\nthermodynamic object count: " << thermodynamics_objectCount << std::endl; } - static int get_thermodynamics_objectCount() { return thermodynamics_objectCount; } - - /** - * @brief first law of thermodynamics delta_U = Q - W - * @param Q is the sum of all heat transfer into and out of the system - * @param W is the sum of all work done on or by the system - * @returns delta U, is the change in internal energy U of the system - */ - static ld changeOfInternalEnergy(const ld Q, const ld W) - { - return Q - W; - } - - /** - * @brief first law of thermodynamics delta_U = Q - W - * @param Q_in is the sum of all heat transfer into a system - * @param Q_out is the sum of all heat transfer out of a system - * @param W is the sum of all work done by the system - * @returns delta U, is the change in internal energy U of the system - */ - static ld changeOfInternalEnergy(const ld Q_in, const ld Q_out, const ld W) - { - return Q_in - Q_out - W; - } - - /** - * @brief calculates the energy loss to environment - */ - static ld energyLossToEnvironment(const ld Qin, const ld eff) - { - return Qin * (1.0 - (eff / 100)); - } - - /** - * @brief calculates work done by a cyclical process system W = Qh - Qc - * @param Qh heat transfer out of hot reservoirs - * @param Qc heat transfer to the environment - * @returns work - */ - static ld work_by_cyclical_system(const ld Qh, const ld Qc) - { - return Qh - Qc; - } - - /** - * @brief calculates the work done using carnot efficiency and - * @param cEff carnot efficiency Eff=1-Tc/Th - * @param Qh heat transfer to source - * @returns work in Joules - */ - static ld work(const ld cEff, const ld Qh) - { - return cEff * Qh; - } - - /** - * @brief calculates a system of answers for the work done on a object, the total heat transfer - * done in process and the increase of the internal energy - * @param mass kg mass of object - * @param Ti initial temp c - * @param Tf final temp c - * @param c specific heat of substance - * @param density kg/m^3 - * @param coefLinExp coefficient of linear expansion - * @param Patm atmospheric pressures in atmospheres(atm)s, default value of 1.0 atm(leave blank if no change needed) - * @returns a vector with the Work done by object [0], - * heat energy transferred during process[1], increase of internal energy of system[2] - * - */ - static vector systemOfAnswers_workDone_heatTransfer_internalChange(const ld mass, const ld Ti, const ld Tf, const ld c, const ld density, const ld coefLinExp, const ld Patm = 1.0) - { - - const ld v0 = mass / density; - const ld changeV = 3.0 * coefLinExp * v0 * (Tf - Ti); - const ld W = Patm * _ATM_TO_PASCAL_MULTIPLIER_ * changeV; // a - const ld Q = heatTransfer_Q(mass, c, Tf - Ti); - const ld U = Q - W; - vector results = { W, Q, U }; - return results; - } - - /** - * @brief calculates the food energy used in doing kJ worth of work at a certain eff% - * @param W total work in kJ - * @param eff efficiency of work done - * @returns calories used - */ - static ld caloriesUsed(const ld W, const ld eff) - { - return kiloJoulesToCalories(W / (eff / 100)); - } - - - /** - * @brief using first law of thermodynamics Q = delta_U + W - * @param delta_U is te change of internal energy while doing work - * @param W is the sum of all work done on or by the system - * @returns delta U, is the change in internal energy U of the system - */ - static ld heatTransferToSystem(const ld delta_U, const ld W) - { - return delta_U + W; - } - - /** - * @brief calculates the heat transfer to an environment when the efficiency and work is known - * @param W work done - * @param eff efficiency rating - * @returns the total heat transfer to environment, usually as heat loss - */ - static ld heatTransferToEnvironment(const ld W, const ld eff) - { - return ((1.0 / (eff/100.0)) - 1.0) * W; - } - - /** - * @brief calculates the amount fuel something needed to do something N = Qh / Qf, Qh = Qc + W - * @param Qc is the heatTransfer to the cold reservoir - * @param W is the work done on a system - * @param Qf is the total heat transfer produced by the fuel used, varies and is usually given or can be looked up - * in tables - * @returns the total resources needed - */ - static ld resourcesNeededToDoWork(const ld Qc, const ld W, const ld Qf) - { - return (Qc + W) / Qf; - } - - /** - * @brief calculates the average metobolic rate in watts from metabolized food energy - * over a period of time in seconds - * @param kJFoodEnergy energy from food intake - * @param timeHours hours of work done - * @return watts - */ - static ld metabolicRate(const ld kJFoodEnergy, const ld timeHours) - { - return (kJFoodEnergy * pow(10, 3)) / (timeHours * 3600.0); - } - - /** - * @brief calculates how long the energy will last in a consumed food while - * doing steady work in watts at an eff % - * @param var either calories(default) or kiloJoules. must use a mode of 'k' if using kJ - * @param watts work rate of person - * @param eff efficiency rate - * @param mode is 'c' for Calorie mode, use 'k' for kiloJoules input instead - * @param timeSetting 'm' for minutes 's' of seconds and 'h' for hours 'd' for days - * @returns how long energy from calories will last - */ - static ld energyDuration(const ld var, const ld watts, const ld eff, const char mode = 'c', const char timeSetting = 'm') - { - if (mode == 'c') - { - if (timeSetting == 's') - { - return ((var * 4.184) * 1000.0 * (eff / 100.0)) / watts; - } - if (timeSetting == 'h') - { - return (((var * 4.184) * 1000.0 * (eff / 100.0)) / watts) / 3600.0; - } - if (timeSetting == 'm') - { - return (((var * 4.184) * 1000.0 * (eff / 100.0)) / watts) / 60.0; - } - if (timeSetting == 'd') - { - return (((var * 4.184) * 1000.0 * (eff / 100.0)) / watts) / 86400.0; - } - } - - if (timeSetting == 's') - { - return (var * 1000.0 * (eff / 100.0)) / watts; - } - if (timeSetting == 'h') - { - return ((var * 1000.0 * (eff / 100.0)) / watts) / 3600.0; - } - if (timeSetting == 'm') - { - return ((var * 1000.0 * (eff / 100.0)) / watts) / 60.0; - } - if (timeSetting == 'd') - { - return ((var * 1000.0 * (eff / 100.0)) / watts) / 86400.0; - } - return (var * 1000.0 * (eff / 100.0)) / watts; - } - - /** - * @brief calculates the carnot efficiency of a process - * @param Tc absolute temp of cold reservoirs - * @param Th absolute temp of hot reservoirs - * @returns Carnot Efficiency - */ - static ld carnotEfficiency(const ld Tc, const ld Th) - { - return 1.0 - (Tc / Th); - } - - /** - * @brief calculates the energy efficiency rating of a system (EER) - * @param Qc amount of heat transfer from a cold environment in BTU's(British thermal units) - * @param t1 time in hours - * @param W work input in Joules - * @param t2 time in seconds - * @returns the EEF of a product such as a AC or Refrigerator - */ - static ld energyEfficiencyRating(const ld Qc,const ld t1, const ld W, const ld t2) - { - return (Qc / t1) / (W / t2); - } - - /** - * @brief calculates the change in entropy for a reversible process {(S)rev} - * (S)rev = Q/T - * @param Q is the heat transfer necessary to change forms of an object - * @param T is the temperature it takes in kelvin to change an objects forms - * @returns entropy - */ - static ld entropy_ChangeIn(const ld Q, const ld T) - { - return Q / T; - } - - /** - * @brief calculates the difference of internal pressure if it was at zero gauge pressure - * @param atmP atm or pascals for pressure - * @param v liters default use 'm' for meters cubed as a volume - * @param mode default 'l' for liters 'm' is meters cubed as a volume measurement - * @returns the difference the internal energy would need to be - */ - static ld differenceOfGaugePressureToZeroGaugePressure(const ld atmP, const ld v, const char mode = 'l') - { - if (mode == 'l') - { - const double U2 = 1.5 * (101325.0) * (v / 1000.0); - cout << "u2: " << U2 << endl; - const double U1 = ((1.0 + atmP) / (1.0)) * U2; - cout << "u1: " << U1 << endl; - return U1 - U2; - } - else { - const double U2 = 1.5 * (101325.0) * (v); - cout << "u2: " << U2 << endl; - const double U1 = ((atmP) / (101325.0)) * U2; - return U1 - U2; - } - } - - /** - * @brief calculates the hot reservoir of a carnot engine - * @param eff efficiency % - * @param coldResTempCelsius - * @returns the temp in celsius of the Hot Reservoir - */ - static ld carnotEngineHotReservoir(const ld eff, const ld coldResTempCelsius) - { - return tempConverter.kelvin_to_celsius(tempConverter.celsius_to_kelvin(coldResTempCelsius) / (1.0 - (eff/100.0))); - } - - /** - * @brief calculates the coefficient of performance - */ - static ld coefficientOfPerformance(const ld Tc, const ld Th) - { - return tempConverter.celsius_to_kelvin(1); - } - - /** - * @brief calculates the cold reservoir of a carnot engine - * @param eff efficiency % - * @param hotResTempCelsius - * @returns the temp in celsius of the Hot Reservoir - */ - static ld carnotEngineColdReservoir(const ld eff, const ld hotResTempCelsius) - { - return tempConverter.kelvin_to_celsius((1.0 - (eff / 100.0))*tempConverter.celsius_to_kelvin(hotResTempCelsius)); - } - - /** - * @brief calculates the chance in volume with a constant pressure is maintained - * @param kPa pressure in kilo pascals - * @param Qin total work ii - */ - static ld changeInVolumeConstantPressure(const ld kPa, const ld Qin, const ld Qchange) - { - return (Qin - Qchange) / kPa; - } - - /** - * @brief monoatomic ideal gas internal energy change - */ - static ld monoatomicInternalEnergyChange(const ld Vi, const ld Vf, const ld pressureConstant) - { - return (pressureConstant * (Vf - Vi)) / (ATOMIC_MASS_UNIT_ - 1); - } - /** - * @brief calculates the work done during an isobaric process - * @param gP gauge pressure supplied - * @param A cross sectional area of piston head A = pi*radius^2 - * @param d is the distance it travels - * @returns work in J - */ - static ld work_isobaricProcessOnPiston(const ld gP, const ld A, const ld d) - { - return gP * A * d; - } - - /** - * @brief destructor - */ - ~Thermodynamics() - { - delete _thermodynamicPtr; - }//end destructor -}; -#endif //PHYSICSFORMULA_THERMODYNAMICS_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_THERMODYNAMICS_H +#define PHYSICSFORMULA_THERMODYNAMICS_H +/** + * @class Thermodynamics + * @details driver class for solving complex physics problems + * @author Ryan Zurrin + * @date 12/6/2020 + */ +constexpr auto _ATM_TO_PASCAL_MULTIPLIER_ = 101325; +static int thermodynamics_objectCount = 0; + +double static kiloJoulesToCalories(const double kJ) +{ + return (kJ * 1000.0) / 4186.0; +} +static double Eff(const double W, const double Qh) +{ + return W / Qh; +} + +#include "Heat.h" +#include "Energy.h" + +class Thermodynamics : + public Energy, public Heat +{ +private: + static void countIncrease() { thermodynamics_objectCount += 1; } + static void countDecrease() { thermodynamics_objectCount -= 1; } +public: + Thermodynamics* _thermodynamicPtr; + + /** + * @brief no argument constructor + */ + Thermodynamics() + { + set_celsius(0.0); + _thermodynamicPtr = nullptr; + }//end no argument constructor + /** + * @brief copy constructor + */ + Thermodynamics(const Thermodynamics& t) + : Heat(t) + { + + T._celsius = t.T._celsius; + T._fahrenheit = t.T._fahrenheit; + T._kelvin = t.T._kelvin; + _mode = t._mode; + _tempPtr = t._tempPtr; + + _thermodynamicPtr = t._thermodynamicPtr; + countIncrease(); + } + /** + * #brief move constructor + */ + Thermodynamics(Thermodynamics&& t) noexcept + { + T._fahrenheit = t.T._fahrenheit; + T._celsius = t.T._celsius; + T._kelvin = t.T._kelvin; + this->_thermodynamicPtr = t._thermodynamicPtr; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Thermodynamics& operator=(const Thermodynamics& t) + { + if (this != &t) + { + T._celsius = t.T._celsius; + T._fahrenheit = t.T._fahrenheit; + T._kelvin = t.T._kelvin; + _mode = t._mode; + _tempPtr = t._tempPtr; + countIncrease(); + } + return *this; + } + + static void show_thermodynamics_objectCount() { std::cout << "\nthermodynamic object count: " << thermodynamics_objectCount << std::endl; } + static int get_thermodynamics_objectCount() { return thermodynamics_objectCount; } + + /** + * @brief first law of thermodynamics delta_U = Q - W + * @param Q is the sum of all heat transfer into and out of the system + * @param W is the sum of all work done on or by the system + * @returns delta U, is the change in internal energy U of the system + */ + static ld changeOfInternalEnergy(const ld Q, const ld W) + { + return Q - W; + } + + /** + * @brief first law of thermodynamics delta_U = Q - W + * @param Q_in is the sum of all heat transfer into a system + * @param Q_out is the sum of all heat transfer out of a system + * @param W is the sum of all work done by the system + * @returns delta U, is the change in internal energy U of the system + */ + static ld changeOfInternalEnergy(const ld Q_in, const ld Q_out, const ld W) + { + return Q_in - Q_out - W; + } + + /** + * @brief calculates the energy loss to environment + */ + static ld energyLossToEnvironment(const ld Qin, const ld eff) + { + return Qin * (1.0 - (eff / 100)); + } + + /** + * @brief calculates work done by a cyclical process system W = Qh - Qc + * @param Qh heat transfer out of hot reservoirs + * @param Qc heat transfer to the environment + * @returns work + */ + static ld work_by_cyclical_system(const ld Qh, const ld Qc) + { + return Qh - Qc; + } + + /** + * @brief calculates the work done using carnot efficiency and + * @param cEff carnot efficiency Eff=1-Tc/Th + * @param Qh heat transfer to source + * @returns work in Joules + */ + static ld work(const ld cEff, const ld Qh) + { + return cEff * Qh; + } + + /** + * @brief calculates a system of answers for the work done on a object, the total heat transfer + * done in process and the increase of the internal energy + * @param mass kg mass of object + * @param Ti initial temp c + * @param Tf final temp c + * @param c specific heat of substance + * @param density kg/m^3 + * @param coefLinExp coefficient of linear expansion + * @param Patm atmospheric pressures in atmospheres(atm)s, default value of 1.0 atm(leave blank if no change needed) + * @returns a vector with the Work done by object [0], + * heat energy transferred during process[1], increase of internal energy of system[2] + * + */ + static vector systemOfAnswers_workDone_heatTransfer_internalChange(const ld mass, const ld Ti, const ld Tf, const ld c, const ld density, const ld coefLinExp, const ld Patm = 1.0) + { + + const ld v0 = mass / density; + const ld changeV = 3.0 * coefLinExp * v0 * (Tf - Ti); + const ld W = Patm * _ATM_TO_PASCAL_MULTIPLIER_ * changeV; // a + const ld Q = heatTransfer_Q(mass, c, Tf - Ti); + const ld U = Q - W; + vector results = { W, Q, U }; + return results; + } + + /** + * @brief calculates the food energy used in doing kJ worth of work at a certain eff% + * @param W total work in kJ + * @param eff efficiency of work done + * @returns calories used + */ + static ld caloriesUsed(const ld W, const ld eff) + { + return kiloJoulesToCalories(W / (eff / 100)); + } + + + /** + * @brief using first law of thermodynamics Q = delta_U + W + * @param delta_U is te change of internal energy while doing work + * @param W is the sum of all work done on or by the system + * @returns delta U, is the change in internal energy U of the system + */ + static ld heatTransferToSystem(const ld delta_U, const ld W) + { + return delta_U + W; + } + + /** + * @brief calculates the heat transfer to an environment when the efficiency and work is known + * @param W work done + * @param eff efficiency rating + * @returns the total heat transfer to environment, usually as heat loss + */ + static ld heatTransferToEnvironment(const ld W, const ld eff) + { + return ((1.0 / (eff/100.0)) - 1.0) * W; + } + + /** + * @brief calculates the amount fuel something needed to do something N = Qh / Qf, Qh = Qc + W + * @param Qc is the heatTransfer to the cold reservoir + * @param W is the work done on a system + * @param Qf is the total heat transfer produced by the fuel used, varies and is usually given or can be looked up + * in tables + * @returns the total resources needed + */ + static ld resourcesNeededToDoWork(const ld Qc, const ld W, const ld Qf) + { + return (Qc + W) / Qf; + } + + /** + * @brief calculates the average metobolic rate in watts from metabolized food energy + * over a period of time in seconds + * @param kJFoodEnergy energy from food intake + * @param timeHours hours of work done + * @return watts + */ + static ld metabolicRate(const ld kJFoodEnergy, const ld timeHours) + { + return (kJFoodEnergy * pow(10, 3)) / (timeHours * 3600.0); + } + + /** + * @brief calculates how long the energy will last in a consumed food while + * doing steady work in watts at an eff % + * @param var either calories(default) or kiloJoules. must use a mode of 'k' if using kJ + * @param watts work rate of person + * @param eff efficiency rate + * @param mode is 'c' for Calorie mode, use 'k' for kiloJoules input instead + * @param timeSetting 'm' for minutes 's' of seconds and 'h' for hours 'd' for days + * @returns how long energy from calories will last + */ + static ld energyDuration(const ld var, const ld watts, const ld eff, const char mode = 'c', const char timeSetting = 'm') + { + if (mode == 'c') + { + if (timeSetting == 's') + { + return ((var * 4.184) * 1000.0 * (eff / 100.0)) / watts; + } + if (timeSetting == 'h') + { + return (((var * 4.184) * 1000.0 * (eff / 100.0)) / watts) / 3600.0; + } + if (timeSetting == 'm') + { + return (((var * 4.184) * 1000.0 * (eff / 100.0)) / watts) / 60.0; + } + if (timeSetting == 'd') + { + return (((var * 4.184) * 1000.0 * (eff / 100.0)) / watts) / 86400.0; + } + } + + if (timeSetting == 's') + { + return (var * 1000.0 * (eff / 100.0)) / watts; + } + if (timeSetting == 'h') + { + return ((var * 1000.0 * (eff / 100.0)) / watts) / 3600.0; + } + if (timeSetting == 'm') + { + return ((var * 1000.0 * (eff / 100.0)) / watts) / 60.0; + } + if (timeSetting == 'd') + { + return ((var * 1000.0 * (eff / 100.0)) / watts) / 86400.0; + } + return (var * 1000.0 * (eff / 100.0)) / watts; + } + + /** + * @brief calculates the carnot efficiency of a process + * @param Tc absolute temp of cold reservoirs + * @param Th absolute temp of hot reservoirs + * @returns Carnot Efficiency + */ + static ld carnotEfficiency(const ld Tc, const ld Th) + { + return 1.0 - (Tc / Th); + } + + /** + * @brief calculates the energy efficiency rating of a system (EER) + * @param Qc amount of heat transfer from a cold environment in BTU's(British thermal units) + * @param t1 time in hours + * @param W work input in Joules + * @param t2 time in seconds + * @returns the EEF of a product such as a AC or Refrigerator + */ + static ld energyEfficiencyRating(const ld Qc,const ld t1, const ld W, const ld t2) + { + return (Qc / t1) / (W / t2); + } + + /** + * @brief calculates the change in entropy for a reversible process {(S)rev} + * (S)rev = Q/T + * @param Q is the heat transfer necessary to change forms of an object + * @param T is the temperature it takes in kelvin to change an objects forms + * @returns entropy + */ + static ld entropy_ChangeIn(const ld Q, const ld T) + { + return Q / T; + } + + /** + * @brief calculates the difference of internal pressure if it was at zero gauge pressure + * @param atmP atm or pascals for pressure + * @param v liters default use 'm' for meters cubed as a volume + * @param mode default 'l' for liters 'm' is meters cubed as a volume measurement + * @returns the difference the internal energy would need to be + */ + static ld differenceOfGaugePressureToZeroGaugePressure(const ld atmP, const ld v, const char mode = 'l') + { + if (mode == 'l') + { + const double U2 = 1.5 * (101325.0) * (v / 1000.0); + cout << "u2: " << U2 << endl; + const double U1 = ((1.0 + atmP) / (1.0)) * U2; + cout << "u1: " << U1 << endl; + return U1 - U2; + } + else { + const double U2 = 1.5 * (101325.0) * (v); + cout << "u2: " << U2 << endl; + const double U1 = ((atmP) / (101325.0)) * U2; + return U1 - U2; + } + } + + /** + * @brief calculates the hot reservoir of a carnot engine + * @param eff efficiency % + * @param coldResTempCelsius + * @returns the temp in celsius of the Hot Reservoir + */ + static ld carnotEngineHotReservoir(const ld eff, const ld coldResTempCelsius) + { + return tempConverter.kelvin_to_celsius(tempConverter.celsius_to_kelvin(coldResTempCelsius) / (1.0 - (eff/100.0))); + } + + /** + * @brief calculates the coefficient of performance + */ + static ld coefficientOfPerformance(const ld Tc, const ld Th) + { + return tempConverter.celsius_to_kelvin(1); + } + + /** + * @brief calculates the cold reservoir of a carnot engine + * @param eff efficiency % + * @param hotResTempCelsius + * @returns the temp in celsius of the Hot Reservoir + */ + static ld carnotEngineColdReservoir(const ld eff, const ld hotResTempCelsius) + { + return tempConverter.kelvin_to_celsius((1.0 - (eff / 100.0))*tempConverter.celsius_to_kelvin(hotResTempCelsius)); + } + + /** + * @brief calculates the chance in volume with a constant pressure is maintained + * @param kPa pressure in kilo pascals + * @param Qin total work ii + */ + static ld changeInVolumeConstantPressure(const ld kPa, const ld Qin, const ld Qchange) + { + return (Qin - Qchange) / kPa; + } + + /** + * @brief monoatomic ideal gas internal energy change + */ + static ld monoatomicInternalEnergyChange(const ld Vi, const ld Vf, const ld pressureConstant) + { + return (pressureConstant * (Vf - Vi)) / (ATOMIC_MASS_UNIT_ - 1); + } + /** + * @brief calculates the work done during an isobaric process + * @param gP gauge pressure supplied + * @param A cross sectional area of piston head A = pi*radius^2 + * @param d is the distance it travels + * @returns work in J + */ + static ld work_isobaricProcessOnPiston(const ld gP, const ld A, const ld d) + { + return gP * A * d; + } + + /** + * @brief destructor + */ + ~Thermodynamics() + { + delete _thermodynamicPtr; + }//end destructor +}; +#endif //PHYSICSFORMULA_THERMODYNAMICS_H diff --git a/Torque.h b/Torque.h index f6c79d2..47e99b3 100644 --- a/Torque.h +++ b/Torque.h @@ -1,194 +1,194 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_TORQUE_H -#define PHYSICSFORMULA_TORQUE_H -typedef long double ld; -#include "VectorND.h" -/** - * @class Torque - * @details class for composition with Physics class to help in solving complex physics problems - * @author Ryan Zurrin - * @date 10/26/2020 - */ - -class Torque -{ -public: - Torque* _torquePtr; - - //constructor - Torque() - { - _torquePtr = nullptr; - } - - /** - * @brief Returns the magnitude of torque - * @param r is the distance from the pivot point to the point where the force - * is applied - * @param F is the magnitude of the force - * @param theta is the angle between the force and the vector directed from the - * point of application to the pivot point - * @returns magnitude of torque - */ - ld static torque(const ld r, const ld F, const ld theta) - { - return r * F * sin(theta * RADIAN); - } - - /** - * @brief Returns the torque using the perpendicular lever arm and Force as input values - * @param pla is the value of the perpendicularLeverArm - * @param F is the magnitude of the force - * @returns magnitude of torque - */ - ld static torque(const ld pla, const ld F) - { - return pla * F; - } - - /** - * @brief Returns magnitude of the perpendicular lever arm - * @param r is the distance from the pivot point to the point where the force - * is applied - * @param theta is the angle between the force and the vector directed from the - * point of application to the pivot point - */ - ld static perpendicular_lever_arm(const ld r, const ld theta) - { - return r * sin(theta * RADIAN); - } - - /** - * @brief Returns the unknown r value for one side of a balance seesaw occupied by two different sized masses - * @param m1 is the mass of the first object on the side of the known r value - * @param r1 is the distance from the pivot to the point of applied force, center of seesaw to center of sitting spot - * @param m2 is the mass of the second object on the side of the unknown r value - * @returns the second r value needed to balance a seesaw system - */ - ld static torque_r2_val_seesaw(const ld m1, const ld r1, const ld m2) - { - return r1 * (m1 / m2); - } - - /** - * @brief return the net force on a pivot calculated by adding up the total - * weight of a system. - * @param m1 in kg is the mass of the first force acting on a pivot - * @param m2, - * @param m3 - * @param m4 - * @param m5 - * @param m6 in kg is the mass from the second to the sixth force acting on the - * same pivot, these are all defaulted to 0 so you only enter the masses you need making sure - * to include any negative forces in the calculation if there are any - */ - ld static net_force_by_pivot(const ld m1, const ld m2=0.0, const ld m3=0.0, const ld m4=0.0, const ld m5= 0.0, const ld m6 = 0.0) - { - return (m1 * _Ga_) + (m2 * _Ga_) + (m3 * _Ga_) + (m4 * _Ga_) + (m5 * _Ga_) + (m6 * _Ga_); - } - - /** - * @brief solves a system for an unknown r value - * @param m1 is the mass of the first weight - * @param r1 is the length of the first mass cg to the pivot - * @param theta1 is the angle of the applied force - * @param m2 is the mass of the second weight - * @param r2 is the length of the first mass cg to pivot - * @param theta2 is the angle of the second force - * @param mRod is the mass of the rod used - * @param lRod is length of the rod used - * @param mr3 is the mass or the distance of given variable from which we need to find the other part - * @param theta3 is the angle of the mr3 force - * @returns vector with the mass, distance, force up on pin, force down on pin - */ - vector static rod_of_mass_m_and_length_l(const ld m1, const ld r1, const ld theta1, const ld m2, const ld r2, const ld theta2, const ld mRod, const ld lRod, const ld mr3 = 0, const ld theta3 = 90) - { - vector result = { 0.0,0.0,0.0}; - double fu, fd, fd2; - if(ceill( mr3) == 0) - { - - result[0] = m1 + m2 - mRod; - result[1] = ((m1 * r1 * sin(theta1 * RADIAN)) + (m2 * r2 * sin(theta2* RADIAN)) - (mRod * (.5 * lRod) * sin(theta3 * RADIAN))) / (result[0]); - fu = (m1/1000 + m2/1000) * _Ga_; - fd = mRod/1000 + result[0]/1000; - result[2] = fu - fd; - return result; - } - - - result[0] = ((m1 * r1 * sin(theta1 * RADIAN)) + (m2 * r2 * sin(theta2 * RADIAN)) - (mRod * (.5 * lRod) * sin(theta3 * RADIAN))) / (mr3); - fu = (m1 / 1000 + m2 / 1000) * _Ga_; - fd = (mRod / 1000 + mr3 / 1000) * _Ga_; - fd2 = (mRod / 1000 + result[0] / 1000) * _Ga_; - result[1] = fu - fd; - result[2] = fd2 - fu; - return result; - } - - /** - * @brief calculates and returns the distance a fulcrum needs to be to lift a certain waight mass with it being a certain length - */ - ld static fulcrum_position(const ld massToLift, const ld leverLength, const ld limitForce) - { - return (massToLift * _Ga_ * leverLength) / (limitForce + massToLift * _Ga_); - } - - /** - * calculates the total force required to life a wheelbarrow - * @param w is the weight of the wheelbarrow and load - * @param ro is the the distance from cg(center of gravity to where the wheel touches the ground - * @param ri is the distance from the cg to where you are holding the wheelbarrow - * @returns force needed to lift wheelbarrow - */ - ld static force_to_lift_wheelbarrow(const ld w, const ld ro, const ld ri) - { - return w * _Ga_ * (ro / ri); - } - - /** - * @brief calculates the weight of the load in a wheelbarrow - * @param Mb is the mass of the wheelbarrow - * @param rToHandlesTo_cg is the lever arm from the lifting point on handles to the center of gravity(cg) - * @param cg_toPivot is the lever arm from the pivot to the center of gravity(cg) - * @param liftingForce is the force required to lift up the wheelbarrow, can be found by standing on a scale while holding - * the wheelbarrow up and getting a reading in pounds and then converting - * @returns the weight of a wheelbarrow load - */ - ld static weight_load_of_wheelbarrow(const ld Mb, const ld rToHandlesTo_cg, const ld cg_toPivot, const ld liftingForce) - { - ld a, b, c; - a = ((Mb * _Ga_ * cg_toPivot) / (rToHandlesTo_cg)); - b = ((_Ga_ * cg_toPivot) / rToHandlesTo_cg); - c = (liftingForce - a) / b; - - return c; - } - - - - /** - * Returns the machanical advantage of a simple machine - * MA = Fo/Fi = li/lo ;where Fo = output force, Fi = input force, li = distance from input source to pivot - * , lo = distance from output source to pivot. - * @param lo is the the distance from cg to pivot, on a crank this is the radius of the crank - * @param li is the distance from the cg to where the force is applied, on a crank this is the length from center - * of radius to center of the lever for cranking - * @returns the mechanical advantage of a simple machine - */ - ld static mechanical_advantage(const ld li, const ld lo) - { - return li / lo; - } - - - // destructor - ~Torque() - { - delete _torquePtr; - } -}; -#endif //PHYSICSFORMULA_TORQUE_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_TORQUE_H +#define PHYSICSFORMULA_TORQUE_H +typedef long double ld; +#include "VectorND.h" +/** + * @class Torque + * @details class for composition with Physics class to help in solving complex physics problems + * @author Ryan Zurrin + * @date 10/26/2020 + */ + +class Torque +{ +public: + Torque* _torquePtr; + + //constructor + Torque() + { + _torquePtr = nullptr; + } + + /** + * @brief Returns the magnitude of torque + * @param r is the distance from the pivot point to the point where the force + * is applied + * @param F is the magnitude of the force + * @param theta is the angle between the force and the vector directed from the + * point of application to the pivot point + * @returns magnitude of torque + */ + ld static torque(const ld r, const ld F, const ld theta) + { + return r * F * sin(theta * RADIAN); + } + + /** + * @brief Returns the torque using the perpendicular lever arm and Force as input values + * @param pla is the value of the perpendicularLeverArm + * @param F is the magnitude of the force + * @returns magnitude of torque + */ + ld static torque(const ld pla, const ld F) + { + return pla * F; + } + + /** + * @brief Returns magnitude of the perpendicular lever arm + * @param r is the distance from the pivot point to the point where the force + * is applied + * @param theta is the angle between the force and the vector directed from the + * point of application to the pivot point + */ + ld static perpendicular_lever_arm(const ld r, const ld theta) + { + return r * sin(theta * RADIAN); + } + + /** + * @brief Returns the unknown r value for one side of a balance seesaw occupied by two different sized masses + * @param m1 is the mass of the first object on the side of the known r value + * @param r1 is the distance from the pivot to the point of applied force, center of seesaw to center of sitting spot + * @param m2 is the mass of the second object on the side of the unknown r value + * @returns the second r value needed to balance a seesaw system + */ + ld static torque_r2_val_seesaw(const ld m1, const ld r1, const ld m2) + { + return r1 * (m1 / m2); + } + + /** + * @brief return the net force on a pivot calculated by adding up the total + * weight of a system. + * @param m1 in kg is the mass of the first force acting on a pivot + * @param m2, + * @param m3 + * @param m4 + * @param m5 + * @param m6 in kg is the mass from the second to the sixth force acting on the + * same pivot, these are all defaulted to 0 so you only enter the masses you need making sure + * to include any negative forces in the calculation if there are any + */ + ld static net_force_by_pivot(const ld m1, const ld m2=0.0, const ld m3=0.0, const ld m4=0.0, const ld m5= 0.0, const ld m6 = 0.0) + { + return (m1 * _Ga_) + (m2 * _Ga_) + (m3 * _Ga_) + (m4 * _Ga_) + (m5 * _Ga_) + (m6 * _Ga_); + } + + /** + * @brief solves a system for an unknown r value + * @param m1 is the mass of the first weight + * @param r1 is the length of the first mass cg to the pivot + * @param theta1 is the angle of the applied force + * @param m2 is the mass of the second weight + * @param r2 is the length of the first mass cg to pivot + * @param theta2 is the angle of the second force + * @param mRod is the mass of the rod used + * @param lRod is length of the rod used + * @param mr3 is the mass or the distance of given variable from which we need to find the other part + * @param theta3 is the angle of the mr3 force + * @returns vector with the mass, distance, force up on pin, force down on pin + */ + vector static rod_of_mass_m_and_length_l(const ld m1, const ld r1, const ld theta1, const ld m2, const ld r2, const ld theta2, const ld mRod, const ld lRod, const ld mr3 = 0, const ld theta3 = 90) + { + vector result = { 0.0,0.0,0.0}; + double fu, fd, fd2; + if(ceill( mr3) == 0) + { + + result[0] = m1 + m2 - mRod; + result[1] = ((m1 * r1 * sin(theta1 * RADIAN)) + (m2 * r2 * sin(theta2* RADIAN)) - (mRod * (.5 * lRod) * sin(theta3 * RADIAN))) / (result[0]); + fu = (m1/1000 + m2/1000) * _Ga_; + fd = mRod/1000 + result[0]/1000; + result[2] = fu - fd; + return result; + } + + + result[0] = ((m1 * r1 * sin(theta1 * RADIAN)) + (m2 * r2 * sin(theta2 * RADIAN)) - (mRod * (.5 * lRod) * sin(theta3 * RADIAN))) / (mr3); + fu = (m1 / 1000 + m2 / 1000) * _Ga_; + fd = (mRod / 1000 + mr3 / 1000) * _Ga_; + fd2 = (mRod / 1000 + result[0] / 1000) * _Ga_; + result[1] = fu - fd; + result[2] = fd2 - fu; + return result; + } + + /** + * @brief calculates and returns the distance a fulcrum needs to be to lift a certain waight mass with it being a certain length + */ + ld static fulcrum_position(const ld massToLift, const ld leverLength, const ld limitForce) + { + return (massToLift * _Ga_ * leverLength) / (limitForce + massToLift * _Ga_); + } + + /** + * calculates the total force required to life a wheelbarrow + * @param w is the weight of the wheelbarrow and load + * @param ro is the the distance from cg(center of gravity to where the wheel touches the ground + * @param ri is the distance from the cg to where you are holding the wheelbarrow + * @returns force needed to lift wheelbarrow + */ + ld static force_to_lift_wheelbarrow(const ld w, const ld ro, const ld ri) + { + return w * _Ga_ * (ro / ri); + } + + /** + * @brief calculates the weight of the load in a wheelbarrow + * @param Mb is the mass of the wheelbarrow + * @param rToHandlesTo_cg is the lever arm from the lifting point on handles to the center of gravity(cg) + * @param cg_toPivot is the lever arm from the pivot to the center of gravity(cg) + * @param liftingForce is the force required to lift up the wheelbarrow, can be found by standing on a scale while holding + * the wheelbarrow up and getting a reading in pounds and then converting + * @returns the weight of a wheelbarrow load + */ + ld static weight_load_of_wheelbarrow(const ld Mb, const ld rToHandlesTo_cg, const ld cg_toPivot, const ld liftingForce) + { + ld a, b, c; + a = ((Mb * _Ga_ * cg_toPivot) / (rToHandlesTo_cg)); + b = ((_Ga_ * cg_toPivot) / rToHandlesTo_cg); + c = (liftingForce - a) / b; + + return c; + } + + + + /** + * Returns the machanical advantage of a simple machine + * MA = Fo/Fi = li/lo ;where Fo = output force, Fi = input force, li = distance from input source to pivot + * , lo = distance from output source to pivot. + * @param lo is the the distance from cg to pivot, on a crank this is the radius of the crank + * @param li is the distance from the cg to where the force is applied, on a crank this is the length from center + * of radius to center of the lever for cranking + * @returns the mechanical advantage of a simple machine + */ + ld static mechanical_advantage(const ld li, const ld lo) + { + return li / lo; + } + + + // destructor + ~Torque() + { + delete _torquePtr; + } +}; +#endif //PHYSICSFORMULA_TORQUE_H diff --git a/TransitiveClosure.h b/TransitiveClosure.h index 3f022bc..4cfd02e 100644 --- a/TransitiveClosure.h +++ b/TransitiveClosure.h @@ -1,181 +1,181 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_TRANSITIVECLOSURE_H -#define PHYSICSFORMULA_TRANSITIVECLOSURE_H -#include -#include -#include -#include -using namespace std; - - -// Number of vertices's in the graph -const int V = 7; - -// A function to print the solution matrix -/* A utility function to print solution */ -template -auto printSolution(T reach[][V]) -{ - printf ("Following matrix is transitive"); - printf("closure of the given graph\n"); - for (int i = 0; i < V; i++) - { - for (int j = 0; j < V; j++) - { - /* because "i==j means same vertex" - and we can reach same vertex - from same vertex. So, we print 1.... - and we have not considered this in - Floyd Warshall Algo. so we need to - make this true by ourself - while printing transitive closure.*/ - if(i == j) - printf("1 "); - else - printf ("%d ", reach[i][j]); - } - printf("\n"); - } -} - -// Prints transitive closure of graph[][] -// using Floyd Warshall algorithm -template -auto transitiveClosure(T graph[][V]) -{ - /* reach[][] will be the output matrix - // that will finally have the - shortest distances between - every pair of vertices */ - int reach[V][V], i, j, k; - - /* Initialize the solution matrix same - as input graph matrix. Or - we can say the initial values of - shortest distances are based - on shortest paths considering - no intermediate vertex. */ - for (i = 0; i < V; i++) - for (j = 0; j < V; j++) - reach[i][j] = graph[i][j]; - - /* Add all vertices one by one to the - set of intermediate vertices. - ---> Before start of a iteration, - we have reachability values for - all pairs of vertices such that - the reachability values - consider only the vertices in - set {0, 1, 2, .. k-1} as - intermediate vertices. - ----> After the end of a iteration, - vertex no. k is added to the - set of intermediate vertices - and the set becomes {0, 1, .. k} */ - for (k = 0; k < V; k++) - { - // Pick all vertices as - // source one by one - for (i = 0; i < V; i++) - { - // Pick all vertices as - // destination for the - // above picked source - for (j = 0; j < V; j++) - { - // If vertex k is on a path - // from i to j, - // then make sure that the value - // of reach[i][j] is 1 - reach[i][j] = reach[i][j] || - (reach[i][k] && reach[k][j]); - } - } - } - - // Print the shortest distance matrix - printSolution(reach); -} - -/** - Let us create the following weighted graph - 10 - (0)------->(3) - | /|\ - 5 | | - | | 1 - \|/ | - (1)------->(2) - 3 - int graph[V][V] = { {0, 1, 0, 1}, - {0, 1, 0, 1}, - {1, 1, 0, 0}, - {0, 1, 0, } - }; - - // Print the solution - transitiveClosure(graph); - */ -class Graph -{ - int V; // No. of vertices - bool **tc; // To store transitive closure - list *adj; // array of adjacency lists - void DFSUtil(int u, int v); -public: - Graph(int V); // Constructor - - // function to add an edge to graph - void addEdge(int v, int w) { adj[v].push_back(w); } - - // prints transitive closure matrix - void transitiveClosure(); -}; - -inline Graph::Graph(int V) -{ - this->V = V; - adj = new list[V]; - - tc = new bool* [V]; - for (int i=0; i::iterator i; - for (i = adj[v].begin(); i != adj[v].end(); ++i) - if (tc[s][*i] == false) - DFSUtil(s, *i); -} - -// The function to find transitive closure. It uses -// recursive DFSUtil() -inline void Graph::transitiveClosure() -{ - // Call the recursive helper function to print DFS - // traversal starting from all vertices one by one - for (int i = 0; i < V; i++) - DFSUtil(i, i); // Every vertex is reachable from self. - - for (int i=0; i +#include +#include +#include +using namespace std; + + +// Number of vertices's in the graph +const int V = 7; + +// A function to print the solution matrix +/* A utility function to print solution */ +template +auto printSolution(T reach[][V]) +{ + printf ("Following matrix is transitive"); + printf("closure of the given graph\n"); + for (int i = 0; i < V; i++) + { + for (int j = 0; j < V; j++) + { + /* because "i==j means same vertex" + and we can reach same vertex + from same vertex. So, we print 1.... + and we have not considered this in + Floyd Warshall Algo. so we need to + make this true by ourself + while printing transitive closure.*/ + if(i == j) + printf("1 "); + else + printf ("%d ", reach[i][j]); + } + printf("\n"); + } +} + +// Prints transitive closure of graph[][] +// using Floyd Warshall algorithm +template +auto transitiveClosure(T graph[][V]) +{ + /* reach[][] will be the output matrix + // that will finally have the + shortest distances between + every pair of vertices */ + int reach[V][V], i, j, k; + + /* Initialize the solution matrix same + as input graph matrix. Or + we can say the initial values of + shortest distances are based + on shortest paths considering + no intermediate vertex. */ + for (i = 0; i < V; i++) + for (j = 0; j < V; j++) + reach[i][j] = graph[i][j]; + + /* Add all vertices one by one to the + set of intermediate vertices. + ---> Before start of a iteration, + we have reachability values for + all pairs of vertices such that + the reachability values + consider only the vertices in + set {0, 1, 2, .. k-1} as + intermediate vertices. + ----> After the end of a iteration, + vertex no. k is added to the + set of intermediate vertices + and the set becomes {0, 1, .. k} */ + for (k = 0; k < V; k++) + { + // Pick all vertices as + // source one by one + for (i = 0; i < V; i++) + { + // Pick all vertices as + // destination for the + // above picked source + for (j = 0; j < V; j++) + { + // If vertex k is on a path + // from i to j, + // then make sure that the value + // of reach[i][j] is 1 + reach[i][j] = reach[i][j] || + (reach[i][k] && reach[k][j]); + } + } + } + + // Print the shortest distance matrix + printSolution(reach); +} + +/** + Let us create the following weighted graph + 10 + (0)------->(3) + | /|\ + 5 | | + | | 1 + \|/ | + (1)------->(2) + 3 + int graph[V][V] = { {0, 1, 0, 1}, + {0, 1, 0, 1}, + {1, 1, 0, 0}, + {0, 1, 0, } + }; + + // Print the solution + transitiveClosure(graph); + */ +class Graph +{ + int V; // No. of vertices + bool **tc; // To store transitive closure + list *adj; // array of adjacency lists + void DFSUtil(int u, int v); +public: + Graph(int V); // Constructor + + // function to add an edge to graph + void addEdge(int v, int w) { adj[v].push_back(w); } + + // prints transitive closure matrix + void transitiveClosure(); +}; + +inline Graph::Graph(int V) +{ + this->V = V; + adj = new list[V]; + + tc = new bool* [V]; + for (int i=0; i::iterator i; + for (i = adj[v].begin(); i != adj[v].end(); ++i) + if (tc[s][*i] == false) + DFSUtil(s, *i); +} + +// The function to find transitive closure. It uses +// recursive DFSUtil() +inline void Graph::transitiveClosure() +{ + // Call the recursive helper function to print DFS + // traversal starting from all vertices one by one + for (int i = 0; i < V; i++) + DFSUtil(i, i); // Every vertex is reachable from self. + + for (int i=0; i -#include -#include -#include -#include -#include -#include "Vector2D.h" - -static int triangle_object_count = 0; - - -class TriangleSolver -{ - void badTriangle(); - template - T negativeNumCheck(T& num); - template - T negativeNumFix(T& num); - double pythagoreanTheorem(double, double)const; - void update_triangle(); - void triangleTypeBySide(); - void triangleTypeByAngle(); - void initiate_triangle(string id); - void calculate_angleA(); - void calculate_angleB(); - void calculate_angleC(); - void calculate_All_angles(); - void calculate_AllHeight(); - void calculate_heightBase_a(), - calculate_heightBase_b(), - calculate_heightBase_c(); - void calculate_medians_abc(); - void findMissingSide(); - void find_base(); - void calculate_area(); - void calculate_perimeter(); - void calculate_rVal(); - void calculate_sVal(); - void calculate_iVal(); - void set_vertices(); - void set_centroid(); - void set_eulersDistance(); - void set_ccc();//sets the circumcenter coordinates - bool checkSimilarity(TriangleSolver& T); - bool check_SSS(TriangleSolver&);// by Arnab Kundu - bool check_SAS(TriangleSolver&); - bool check_AAA(TriangleSolver&); - bool cong_SAS(TriangleSolver& t); - bool cong_ASA(TriangleSolver& t); - bool cong_AAS(TriangleSolver& t); - bool cong_SSS(TriangleSolver& t); - bool cong_HL(TriangleSolver& t); - - TriangleSolver *solve_by_AAA(const double&, const double&, const double&); // three sides known - TriangleSolver *solve_by_AAS(const double&, const double&, const double&); // two angles and a side not between - TriangleSolver *solve_by_ASA(const double&, const double&, const double&); // two angles and a side bewteen them - TriangleSolver *solve_by_SAS(const double&, const double&, const double&); // two sides and the included angle. - TriangleSolver *solve_by_SSA(const double&, const double&, const double&); // two sides and one angle that is not the included angle - TriangleSolver *solve_by_SSS(const double&, const double&, const double&); // all three sides of a triangle, but no angles - - // member variablesfor keeping track of triangle data - string ID; - double max_side; - double height_a, altHeight_a; - double height_b, altHeight_b; - double height_c, altHeight_c; - double max_height; - double side_a; - double side_b; - double side_c, altSide; - double angle_A, altAngle_A; - double angle_B, altAngle_B; - double angle_C, altAngle_C; - double area, altArea; - double perimeter, altPerimeter; - double sVal, altSval; // Semiperimeter - double rVal, altRval; // Circumradius - double iVal, altIval; // inradius - // these bools are for determining congruency and similarity type - double median_a, altMedian_a; - double median_b, altMedian_b; - double median_c, altMedian_c; - bool sssFlag, congSSSflag, - aaaFlag, congSASflag, - sasFlag, congASAflag, - ssaFlag, congAASflag, - asaFlag, congHLflag, - aasFlag, - missingSideFlag, - altTriFlag; - string sideType; - string angleType; - double eulersDistance; - vector> vertices; - pair centroid; - pair circumcenterCoordinate; - - -public: - TriangleSolver(string id = ""); - - /// - /// Initializes a new instance of the TriangleSolver class.\n - /// type of triangle:->("use")\n - /// side, side, side->("sss")\n - /// else use:___________________________________________\n - /// side angle side->("sas")\n - /// side, side, angle->("ssa")\n - /// angleA, angleB, angleC->("aaa")\n - /// angleA ,side_c, angleB->("asa")\n - /// angleA angleC side_c->("aas")\n - /// _____________________________________________________ - /// - /// The first parameter. - /// The second parameter. - /// The third parameter. - /// Three letter string literal or The type of triangle to be solved. - /// object identifier if wanted - TriangleSolver(const double param1, const double param2, const double param3, - const string type = "sss", const string id = ""); - - TriangleSolver( TriangleSolver&); // copy constructor - TriangleSolver(TriangleSolver&& t)noexcept; - TriangleSolver& operator=(TriangleSolver const& t); - TriangleSolver& operator=(TriangleSolver&& t)noexcept; - - - - [[nodiscard]] bool checkSides()const; - [[nodiscard]] bool checkTriangle()const; - [[nodiscard]] bool checkAngles()const; - - void similarBy(TriangleSolver&); - bool isCongruent(TriangleSolver& t); - void congruentBy(TriangleSolver& t); - void displayTriangleData(std::string label = "")const; - void showVertices()const; - void showCentroid()const; - void showEulersDistance()const; - void showCircumcenterCoordinates()const; - void showSides()const; - void showAngles()const; - void showAngleType()const; - void showAreaPerimeter()const; - void showSide_a()const { cout << "side a: " << side_a<< endl; } - void showSide_b()const { cout << "side b: " << side_b << endl; } - void showSide_c()const { cout << "side c: " << side_c << endl; } - void showAngle_A()const { cout << "angle A: " << angle_A<< endl; } - void showAngle_B()const { cout << "angle B: " << angle_B<< endl; } - void showAngle_C()const { cout << "angle C: " << angle_C<< endl; } - void showArea()const { cout << "area: " << area << endl; } - void showParameter()const { cout << "parameter: "<< perimeter<< endl; } - void showMaxHeight()const { cout << "Max Height: " << max_height << endl; } - void showHeight_a()const { cout << "height_a: " << height_a << endl; } - void showHeight_b()const { cout << "height_b: " << height_b << endl; } - void showHeight_c()const { cout << "height_c: " << height_c << endl; } - void showMedian_a()const { cout << "median_a: " << median_a << endl; } - void showMedian_b()const { cout << "median_b: " << median_b << endl; } - void showMedian_c()const { cout << "median_c: " << median_c << endl; } - void showAllHeights()const { - cout << "height_a: " << height_a << endl - << "height_b: " << height_b << endl - << "height_c: " << height_c << endl; - } - void showAllMedians()const { - cout << "median_a: " << median_a << endl - << "median_b: " << median_b << endl - << "median_c: " << median_c << endl; - } - void showLargestSide()const { cout << "most stable base: " << max_side << endl; } - void showCircumradius()const { cout << "circum-radius: " << rVal << endl; } - void showInRadius()const { cout << "in-radius: " << iVal << endl; } - void showSemiParameter()const { cout << "semi-parameter: " << sVal << endl; } - void showCongruencyFlags()const; - - [[nodiscard]] double returnSide_a()const { return side_a; } - [[nodiscard]] double returnSide_b()const { return side_b; } - [[nodiscard]] double returnSide_c()const { return side_c; } - [[nodiscard]] double returnAngle_A()const { return angle_A; } - [[nodiscard]] double returnAngle_B()const { return angle_B; } - [[nodiscard]] double returnAngle_C()const { return angle_C; } - [[nodiscard]] double returnArea()const { return area; }; - [[nodiscard]] double returnPerimeter()const { return perimeter; } - [[nodiscard]] double returnBase()const { return max_side; } - [[nodiscard]] double returnMaxHeight()const { return max_height; } - [[nodiscard]] double returnHeight_a()const { return height_a; } - [[nodiscard]] double returnHeight_b()const { return height_a; } - [[nodiscard]] double returnHeight_c()const { return height_c; } - [[nodiscard]] double returnMedian_a()const { return median_a; } - [[nodiscard]] double returnMedian_b()const { return median_b; } - [[nodiscard]] double returnMedian_c()const { return median_c; } - [[nodiscard]] double returnCircumradius()const { return rVal; } - [[nodiscard]] double returnSemiPerimeter()const { return sVal; } - [[nodiscard]] bool returnSAS()const { return sasFlag; } - [[nodiscard]] bool returnSSS() const { return sssFlag; } - [[nodiscard]] bool returnAAA() const { return aaaFlag; } - [[nodiscard]] bool returnSSA()const { return ssaFlag; } - [[nodiscard]] bool returnASA() const { return asaFlag; } - [[nodiscard]] bool returnAAS() const { return aasFlag; } - - void setSide_a(double _a); - void setSide_b(double _b); - void setSide_c(double _c); - void setSides(double, double, double); - void setAngles(double, double, double); - static int getTriangleObjectCount() { return triangle_object_count; } - //double setAngle_A(double _A) { angle_A = _A; update_triangle(); } - //double setAngle_B(double _B) { angle_B = _B; update_triangle(); } - //double setAngle_C(double _C) { angle_C = _C; update_triangle(); } - //double setTriangleArea(double tA) { area = tA; update_triangle(); } - - - //overloaded relational operators - bool operator>(const TriangleSolver& s)const { return area > s.area; } - bool operator>=(const TriangleSolver& s)const { return area >= s.area; } - bool operator<(const TriangleSolver& s)const { return area < s.area; } - bool operator<=(const TriangleSolver& s)const { return area <= s.area; } - bool operator==(const TriangleSolver& s)const { return area == s.area; } - bool operator!=(const TriangleSolver& s)const { return !(area == s.area); } - bool operator>(const double& n)const { return area > n; } - bool operator>=(const double& n)const { return area >= n; } - bool operator<(const double& n)const { return n < area; } - bool operator<=(const double& n)const { return n <= area; } - bool operator==(const double& n)const { return area == n; } - bool operator!=(const double& n)const { return !(area == n); } - - //overloaded additon operators - TriangleSolver operator++(); - TriangleSolver operator++(int); - TriangleSolver operator+(const TriangleSolver&)const; - TriangleSolver operator+(double)const; - TriangleSolver& operator+=(const TriangleSolver&); - friend TriangleSolver operator+(double num, TriangleSolver&); - friend TriangleSolver operator+(TriangleSolver& v, TriangleSolver& s); - TriangleSolver& operator+(const TriangleSolver& rhs); - //friend Triangle operator+(Triangle lhs, const Triangle&); - - // overloaded subtraction operators - TriangleSolver operator-()const; - TriangleSolver operator--(); - TriangleSolver operator--(int); - TriangleSolver operator-(const TriangleSolver&)const; - TriangleSolver operator-(double)const; - TriangleSolver& operator-=(const TriangleSolver&); - friend TriangleSolver operator-(double num, TriangleSolver&); - friend TriangleSolver operator-(TriangleSolver&, const TriangleSolver&); - - TriangleSolver operator*(double value)const; // multiply - - friend TriangleSolver operator*(double s, TriangleSolver& v); - friend TriangleSolver operator*(TriangleSolver& v, TriangleSolver& s); - TriangleSolver operator/(double)const; //division - TriangleSolver operator/(const TriangleSolver&)const; - - - friend ostream& operator<<(ostream&, const TriangleSolver&); - friend istream& operator>>(istream&, TriangleSolver&); - - ~TriangleSolver() = default; - - - - -}; -#endif //PHYSICSFORMULA_TRIANGLESOLVER_H - -/*______________________________________________________________________________ -*/ -inline TriangleSolver::TriangleSolver(string id) -{ - triangle_object_count++; - initiate_triangle(id); -} - - -inline TriangleSolver::TriangleSolver(const double param1, const double param2, const double param3, const string type, const string id) -{ //sss='s', sas='a', ssa ='b', aaa='l', asa='i', aas='n' - triangle_object_count++; - initiate_triangle(id); - if (type == "sss" || type == "SSS") // side, side, side(sss) - { - solve_by_SSS(param1, param2, param3); - } - else if (type == "sas" || type == "SAS") // side angle side(sas) - { - solve_by_SAS(param1, param2, param3); - } - else if (type == "ssa" || type == "SSA") // side, side, angle(ssa) - { - solve_by_SSA(param1, param2, param3); - } - else if (type == "aaa" || type == "AAA") // angleA, angleB, angleC(aaa) - { - solve_by_AAA(param1, param2, param3); - } - else if (type == "asa" || type == "ASA") // angleA ,side_c, angleB (asa) - { - solve_by_ASA(param1, param2, param3); - } - else if (type == "aas" || type == "AAS") // angleA angleC side_c (aas) - { - solve_by_AAS(param1, param2, param3); - } -} - -inline TriangleSolver::TriangleSolver(TriangleSolver& t) -{ - ID = "triangle_" + std::to_string(triangle_object_count); - side_a = t.side_a; - side_b = t.side_b; - side_c = t.side_c; - altSide = t.altSide; - angle_A = t.angle_A; - angle_B = t.angle_B; - angle_C = t.angle_C; - altAngle_A = t.altAngle_A; - altAngle_B = t.altAngle_B; - altAngle_C = t.altAngle_C; - perimeter = t.perimeter; - altPerimeter = t.altPerimeter; - max_height = t.max_height; - max_side = t.max_side; - sVal = t.sVal; - rVal = t.rVal; - iVal = t.iVal; - altRval = t.altRval; - altSval = t.altSval; - altIval = t.altIval; - area = t.area; - altArea = t.altArea; - sideType = t.sideType; - sssFlag = t.sssFlag; congSSSflag = t.congSSSflag; - aaaFlag = t.aaaFlag; - sasFlag = t.sasFlag; congSASflag = t.congSASflag; - ssaFlag = t.ssaFlag; - asaFlag = t.asaFlag; congASAflag = t.congASAflag; - aasFlag = t.aasFlag; congAASflag = t.congAASflag; - altTriFlag = t.altTriFlag; congHLflag = t.congHLflag; - height_a = t.height_a; - height_b = t.height_b; - height_c = t.height_c; - altHeight_a = t.altHeight_a; - altHeight_b = t.altHeight_b; - altHeight_c = t.altHeight_c; - median_a = t.median_a; - median_b = t.median_b; - median_c = t.median_c; - altMedian_a = t.altMedian_a; - altMedian_b = t.altMedian_b; - altMedian_c = t.altMedian_c; - missingSideFlag = t.missingSideFlag; - vertices = t.vertices; - centroid = t.centroid; - circumcenterCoordinate = t.circumcenterCoordinate; - eulersDistance = t.eulersDistance; -} - -inline TriangleSolver::TriangleSolver(TriangleSolver&& t)noexcept -{ - triangle_object_count++; - ID = "Triangle_" + std::to_string(triangle_object_count); - side_a = t.side_a; - side_b = t.side_b; - side_c = t.side_c; - altSide = t.altSide; - angle_A = t.angle_A; - angle_B = t.angle_B; - angle_C = t.angle_C; - altAngle_A = t.altAngle_A; - altAngle_B = t.altAngle_B; - altAngle_C = t.altAngle_C; - perimeter = t.perimeter; - altPerimeter = t.altPerimeter; - max_height = t.max_height; - max_side = t.max_side; - sVal = t.sVal; - rVal = t.rVal; - iVal = t.iVal; - altRval = t.altRval; - altSval = t.altSval; - altIval = t.altIval; - area = t.area; - altArea = t.altArea; - sideType = t.sideType; - sssFlag = t.sssFlag; congSSSflag = t.congSSSflag; - aaaFlag = t.aaaFlag; - sasFlag = t.sasFlag; congSASflag = t.congSASflag; - ssaFlag = t.ssaFlag; - asaFlag = t.asaFlag; congASAflag = t.congASAflag; - aasFlag = t.aasFlag; congAASflag = t.congAASflag; - altTriFlag = t.altTriFlag; congHLflag = t.congHLflag; - height_a = t.height_a; - height_b = t.height_b; - height_c = t.height_c; - altHeight_a = t.altHeight_a; - altHeight_b = t.altHeight_b; - altHeight_c = t.altHeight_c; - median_a = t.median_a; - median_b = t.median_b; - median_c = t.median_c; - altMedian_a = t.altMedian_a; - altMedian_b = t.altMedian_b; - altMedian_c = t.altMedian_c; - missingSideFlag = t.missingSideFlag; - vertices = t.vertices; - centroid = t.centroid; - circumcenterCoordinate = t.circumcenterCoordinate; - eulersDistance = t.eulersDistance; -} - - -inline TriangleSolver& TriangleSolver::operator=(TriangleSolver const& right) -{ - //cout << "in the overloaded Triangle =operator"; - if (this != &right) { - this->side_a = right.side_a; - this->side_b = right.side_b; - this->side_c = right.side_c; - this->update_triangle(); - return *this; - } - return *this; -} - -inline TriangleSolver& TriangleSolver::operator=(TriangleSolver&& t) noexcept -{ - //cout << "in the overloaded Triangle =operator"; - if (this != &t) { - this->side_a = t.side_a; - this->side_b = t.side_b; - this->side_c = t.side_c; - this->update_triangle(); - return *this; - } - return *this; -} - -inline void TriangleSolver::update_triangle() -{ - - if (angle_C > 0 && missingSideFlag == 1) { - calculate_perimeter(); - calculate_sVal(); - calculate_area(); - calculate_rVal(); - calculate_iVal(); - calculate_angleA(); - calculate_angleB(); - find_base(); - calculate_AllHeight(); - calculate_medians_abc(); - triangleTypeByAngle(); - triangleTypeBySide(); - set_vertices(); - set_centroid(); - set_eulersDistance(); - } - else if (max_side > 0 && max_height > 0) { - calculate_area(); - calculate_All_angles(); - calculate_rVal(); - calculate_sVal(); - calculate_perimeter(); - calculate_iVal(); - calculate_AllHeight(); - calculate_medians_abc(); - triangleTypeByAngle(); - triangleTypeBySide(); - set_vertices(); - set_centroid(); - set_eulersDistance(); - set_ccc(); - } - else if (side_a > 0 && side_b > 0 && side_c > 0 && - angle_A > 0 && angle_B > 0 && angle_C > 0) - { - calculate_perimeter(); - calculate_sVal(); - calculate_area(); - calculate_rVal(); - calculate_iVal(); - find_base(); - calculate_AllHeight(); - calculate_medians_abc(); - triangleTypeByAngle(); - triangleTypeBySide(); - set_vertices(); - set_centroid(); - set_eulersDistance(); - set_ccc(); - } - else { - calculate_perimeter(); - calculate_sVal(); - calculate_area(); - calculate_rVal(); - calculate_iVal(); - calculate_angleA(); - calculate_angleB(); - calculate_angleC(); - find_base(); - calculate_AllHeight(); - calculate_medians_abc(); - triangleTypeByAngle(); - triangleTypeBySide(); - set_vertices(); - set_centroid(); - set_eulersDistance(); - set_ccc(); - } - triangleTypeByAngle(); - triangleTypeBySide(); -} - -inline void TriangleSolver::badTriangle() -{ - - double _a, _b, _c; - do - { - cout << "Your triangle is no good" << endl - << "Lets fix it" << endl; - cout << "**please enter side a: "; - cin >> _a; - if (_a <= 0) { - negativeNumFix(_a); - } - else - side_a = _a; - - cout << "**please enter side b: "; - cin >> _b; - if (_b <= 0) { - negativeNumFix(_b); - } - else - side_b = _b; - - cout << "**please enter side c: "; - cin >> _c; - if (_c <= 0) { - negativeNumFix(_c); - } - else - side_c = _c; - - if (checkTriangle() == true) { - update_triangle(); - } - cin.clear(); - cin.ignore(100, '\n'); - } - while (!checkSides() || !cin); - -} - -inline void TriangleSolver::initiate_triangle(string id) -{ - if (id == "") - { - ID = "Triangle_" + std::to_string(triangle_object_count); - } - else - { - ID = id; - } - max_side = 0.0; - max_height = 0.0; - height_a = 0.0; - height_b = 0.0; - height_c = 0.0; - altHeight_a = 0.0; - altHeight_b = 0.0; - altHeight_c = 0.0; - side_a = 0.0; - side_b = 0.0; - side_c = 0.0; - altSide = 0.0; - angle_A = 0.0; - angle_B = 0.0; - angle_C = 0.0; - altAngle_A = 0.0; - altAngle_B = 0.0; - altAngle_C = 0.0; - area = 0.0; - altArea = 0.0; - perimeter = 0.0; - altPerimeter = 0.0; - median_a = 0.0; altMedian_a = 0.0; - median_b = 0.0; altMedian_b = 0.0; - median_c = 0.0; altMedian_c = 0.0; - sssFlag = false; - aaaFlag = false; - sasFlag = false; - ssaFlag = false; - asaFlag = false; - aasFlag = false; - congSASflag = false; - congSSSflag = false; - congASAflag = false; - congAASflag = false; - congHLflag = false; - missingSideFlag = false; - altTriFlag = false; - rVal = 0.0; - sVal = 0.0; - iVal = 0.0; - altRval = 0.0; - altSval = 0.0; - altIval = 0.0; - eulersDistance = 0.0; -} - -inline void TriangleSolver::calculate_angleA() -{ - if (angle_B > 0 && angle_C > 0) { - angle_A = 180 - (angle_B + angle_C); - } - else { - auto cosA = (pow(side_b, 2) + pow(side_c, 2) - - pow(side_a, 2)) / (2.0 * side_b * side_c); - angle_A = acos(cosA)*DEGREE; - } -} - -inline void TriangleSolver::calculate_angleB() -{ - if (angle_A > 0 && angle_C > 0) { - angle_B = 180 - (angle_A + angle_C); - } - else { - auto cosB = (pow(side_c, 2) + pow(side_a, 2) - - pow(side_b, 2)) / (2.0 * side_c * side_a); - angle_B = acos(cosB)*DEGREE; - } -} - -inline void TriangleSolver::calculate_angleC() -{ - if (angle_B > 0 && angle_A > 0) { - angle_C = 180 - (angle_A + angle_B); - } - else { - auto cosC = (pow(side_a, 2) + pow(side_b, 2) - - pow(side_c, 2)) / (2.0 * side_a * side_b); - angle_C = acos(cosC)*DEGREE; - } - -} - -inline void TriangleSolver::calculate_All_angles() -{ - calculate_angleA(); - calculate_angleB(); - calculate_angleC(); -} - - -inline void TriangleSolver::calculate_AllHeight() -{ - max_height = 2 * area / (max_side); - calculate_heightBase_a(); - calculate_heightBase_b(); - calculate_heightBase_c(); - -} - -inline void TriangleSolver::calculate_heightBase_a() -{ - height_a = (2 * area) / side_a; -} - -inline void TriangleSolver::calculate_heightBase_b() -{ - height_b = (2 * area) / side_b; -} - -inline void TriangleSolver::calculate_medians_abc() -{ - double a = 0.0, b = 0.0, c = 0.0; - a = side_a * side_a; - b = side_b * side_b; - c = side_c * side_c; - median_a = sqrt(((2 * b) + (2 * c) - a) / 4); - median_b = sqrt(((2 * a) + (2 * c) - b) / 4); - median_c = sqrt(((2 * a) + (2 * b) - c) / 4); -} - -inline void TriangleSolver::calculate_heightBase_c() -{ - height_c = (2 * area) / side_c; -} - -inline void TriangleSolver::findMissingSide() -{ - missingSideFlag = true; - double a, b, angle=0; - a = side_a; - b = side_b; - angle = angle_C; - if (angle == 90) { - side_c = pythagoreanTheorem(a, b); - } - else { - side_c = sqrt((a * a) + (b * b) - 2 * a * (b * cos(angle*RADIAN))); - } - update_triangle(); - -} - -inline bool TriangleSolver::checkAngles()const -{ - double temp = angle_A + angle_B + angle_C; - if (temp > 180) - return false; - return true; -} - -inline double TriangleSolver::pythagoreanTheorem(double a, double b)const -{ - return sqrt(a * a + b * b); -} - - -inline void TriangleSolver::find_base() -{ - const int size = 3; - double a, b, c; - a = side_a; - b = side_b; - c = side_c; - vector biggestSide = { a, b, c }; - auto min_pos = - min_element(biggestSide.cbegin(), biggestSide.cend()); - auto max_pos = - max_element(biggestSide.cbegin(), biggestSide.cend()); - sort(biggestSide.begin(), biggestSide.end()); - max_side = biggestSide[2]; -} -inline void TriangleSolver::calculate_area() -{ - if (max_side > 0 && max_height > 0) { - area = (max_height * max_side) / 2; - }else - area = sqrt(sVal * (sVal - side_a) * (sVal - side_b) * (sVal - side_c)); - -} -inline void TriangleSolver::calculate_perimeter() -{ - perimeter = side_a + side_b + side_c; -} -inline void TriangleSolver::calculate_rVal() -{ - rVal = (side_a * side_b * side_c) / (4 * area); -} -inline void TriangleSolver::calculate_sVal() -{ - sVal = perimeter / 2; -} -inline void TriangleSolver::calculate_iVal() -{ - iVal = area / sVal; -} -inline void TriangleSolver::set_vertices() -{ - pair a, b, c; - a.first = 0; - a.second = 0; - b.first = side_c; - b.second = 0; - c.first = side_b * (pow(side_b, 2) + pow(side_c, 2) - - pow(side_a, 2)) / (2.0 * side_b * side_c); - c.second = sqrt(pow(side_b, 2) - pow(c.first, 2)); - vertices = vector>{ a,b,c }; - -} -inline void TriangleSolver::set_centroid() -{ - centroid.first = (vertices[0].first + vertices[1].first + vertices[2].first) / 3.0; - centroid.second = (vertices[0].second + vertices[1].second + vertices[2].second) / 3.0; -} -inline void TriangleSolver::set_eulersDistance() -{ - eulersDistance = sqrt(pow(rVal, 2) - (2 * iVal * rVal)); -} -inline void TriangleSolver::set_ccc() -{ - auto d = 2.0 * (vertices[1].first * vertices[2].second - - vertices[1].second * vertices[2].first); - - circumcenterCoordinate.first = (vertices[2].second * (pow(vertices[1].first, 2) + - pow(vertices[1].second, 2)) - (vertices[1].second * (pow(vertices[2].first, 2) + - pow(vertices[2].second, 2)))) / d; - - circumcenterCoordinate.second = (vertices[1].first * (pow(vertices[2].first, 2) + - pow(vertices[2].second, 2)) - (vertices[2].first * (pow(vertices[1].first, 2) + - pow(vertices[1].second, 2)))) / d; -} -inline TriangleSolver *TriangleSolver::solve_by_AAA(const double& a1, const double& a2, const double& a3) -{ - angle_A = a1; angle_B = a2; angle_C = a3; - - double temp_a=0.0, temp_b=0.0, temp_c=0.0; - - cout << "You need at least one side to solve a triangle\n"; - do { - cout << "Enter a side length now for the sides you know\n" - << "if you do not know a side just enter a 0\n" - << "seperate with spaces input order is sides> a, b, c\n>"; - cin >> temp_a >> temp_b >> temp_c; - if (!cin) { - cout << "**ERROR**"; - cin.clear(); - cin.ignore(100, '\n'); - } - } while (!cin); - if (temp_a < 0) { - side_a = abs(temp_a); - } - else - side_a = temp_a; - - if (temp_b < 0) { - side_b = abs(temp_b); - } - else - side_b = temp_b; - - if (temp_c < 0) { - side_c = abs(temp_c); - } - else - side_c= temp_c; - - if (side_a > 0) { - side_b = sin(angle_B * RADIAN) * side_a / sin(angle_A * RADIAN); - side_c = sin(angle_C * RADIAN) * side_a / sin(angle_A * RADIAN); - } - else if (side_b > 0) { - side_a = sin(angle_A * RADIAN) * side_b / sin(angle_B * RADIAN); - side_c = sin(angle_C * RADIAN) * side_b / sin(angle_B * RADIAN); - } - else if (side_c > 0) { - side_a = sin(angle_A * RADIAN) * side_c / sin(angle_C * RADIAN); - side_b = sin(angle_B * RADIAN) * side_c / sin(angle_C * RADIAN); - } - else - cout << "You didn't enter a valid side lenght, no further computations made on triangle"; - - if (temp_a > 0.0) { - side_a = temp_a; - } - if (temp_b > 0.0) { - side_b = temp_b; - } - if (temp_c > 0.0) { - side_c = temp_c; - } - - if (checkTriangle() == true) { - update_triangle(); - } - else - cout << "\nthe data entered does not make a valid Triangle. Please try again."; - - return this; -} -inline TriangleSolver *TriangleSolver::solve_by_AAS(const double& a1, const double& a2, const double& s) -{ - //double tmp1, tmp2, tmp3, tmp4; - angle_A = a1; - angle_C = a2; - side_c = s; - calculate_angleB(); - side_a = sin(a1 * RADIAN) * s / sin(a2 * RADIAN); - side_b = sin(angle_B*RADIAN) * s / sin(a2 * RADIAN); - - - if (checkTriangle() == true) { - update_triangle(); - } - return this; -} -inline TriangleSolver *TriangleSolver::solve_by_ASA(const double& a1, const double& s, const double& a2) -{ - angle_A = a1; - side_c = s; - angle_B = a2; - - calculate_angleC(); - - side_b = sin(angle_B*RADIAN) * s/sin(angle_C*RADIAN); - side_a = sin(angle_A*RADIAN) * s/sin(angle_C*RADIAN); - - if (checkTriangle() == true) { - update_triangle(); - } - return this; -} -inline TriangleSolver* TriangleSolver::solve_by_SAS(const double &s1, const double &a, const double &s2) -{ - side_a = s1; - angle_C = a; - side_b = s2; - findMissingSide(); - return this; -} -inline TriangleSolver* TriangleSolver::solve_by_SSA(const double& s1, const double& s2, const double& _a) -{ - double t1 = 0.0, t2 = 0.0, t3 = 0.0, t4 = 0.0; - - side_a = s1; - side_b = s2; - angle_A = _a; - t1 = s2 / s1; - t2 = sin(_a * RADIAN); - t3 = (t1 * t2); - angle_B = asin(t3) * DEGREE; - calculate_angleC(); - t4 = side_a * sin(angle_C*RADIAN); - side_c = t4 / sin(angle_A*RADIAN); - //side_c = sqrt((s1 * s1) + (s2 * s2) - 2 * s1 * s2 * cos(angle_C)); - if (checkTriangle() == true) { - update_triangle(); - } - else - cout << "this is a bad tringle" << endl; - double check = sin(angle_B * RADIAN); - if (side_b > side_a && check >=0 && check <=1) // checking if an alternate triangle can be made - { // and if so then calculates the alternate data. - altTriFlag = true; - altAngle_B = 180 - angle_B; - altAngle_C = 180 - (angle_A + altAngle_B); - altSide = side_a * sin(altAngle_C * RADIAN) / sin(angle_A * RADIAN); - altArea = ( side_a * side_b ) * sin(altAngle_C*RADIAN) / 2; - altPerimeter = side_a + side_b + altSide; - altHeight_a = 2 * altArea / side_a; - altHeight_b = 2 * altArea / side_b; - altHeight_c = 2 * altArea / altSide; - } - - return this; - -} -inline TriangleSolver *TriangleSolver::solve_by_SSS(const double& s1, const double& s2, const double& s3) //law of cosines to solve angle C -{ - side_a = s1; - side_b = s2; - side_c = s3; - if (checkSides() == true) { - update_triangle(); - } - else { - badTriangle(); - } - return this; -} - - -inline bool TriangleSolver::check_SSS(TriangleSolver& t) -{ - - double s1[] = { side_a, side_b, side_c }; - double s2[] = { t.side_a, t.side_b, t.side_c }; - //double simi_sss(double s1[], double s2[]); - - sort(s1, s1 + 3); - sort(s2, s2 + 3); - - // Check for SSS - if (s1[0] / s2[0] == s1[1] / s2[1] && - s1[1] / s2[1] == s1[2] / s2[2] && - s1[2] / s2[2] == s1[0] / s2[0]) - { - sssFlag = true; - return true; - } - sssFlag = false; - return false; - -} -inline bool TriangleSolver::check_SAS(TriangleSolver& t) -{// Function for SAS similarity - - double s1[] = { side_a, side_b, side_c }; - double s2[] = { t.side_a, t.side_b, t.side_c }; - - double a1[] = { angle_A, angle_B, angle_C }; - double a2[] = { t.angle_A, t.angle_B, t.angle_C }; - - sort(a1, a1 + 3); - sort(a2, a2 + 3); - sort(s1, s1 + 3); - sort(s2, s2 + 3); - - // Check for SAS - - // angle b / w two smallest - // sides is largest. - if (s1[0] / s2[0] == s1[1] / s2[1]) - { - if (a1[2] == a2[2]) - { - sasFlag = true; - return true; - } - } - if (s1[1] / s2[1] == s1[2] / s2[2]) - { - if (a1[0] == a2[0]) - { - sasFlag = true; - return true; - } - } - if (s1[2] / s2[2] == s1[0] / s2[0]) - { - if (a1[1] == a2[1]) - { - sasFlag = true; - return true; - } - } - sasFlag = false; - return false; - -} - -inline bool TriangleSolver::check_AAA(TriangleSolver& t) -{ - double a1[] = { angle_A, angle_B, angle_C }; - double a2[] = { t.angle_A, t.angle_B, t.angle_C }; - - sort(a1, a1 + 3); - sort(a2, a2 + 3); - - // Check for AAA - if (a1[0] == a2[0] && - a1[1] == a2[1] && - a1[2] == a2[2]) - { - aaaFlag = true; - return true; - } - aaaFlag = false; - return false; -} -inline bool TriangleSolver::cong_SAS(TriangleSolver& t) -{ - double s1[] = { side_a, side_b, side_c }; - double s2[] = { t.side_a, t.side_b, t.side_c }; - - double a1[] = { angle_A, angle_B, angle_C }; - double a2[] = { t.angle_A, t.angle_B, t.angle_C }; - - sort(a1, a1 + 3); - sort(a2, a2 + 3); - sort(s1, s1 + 3); - sort(s2, s2 + 3); - - if (s1[0] == s2[0] && s1[1] == s2[1]) - { - if (a1[2] == a2[2]) - { - congSASflag = true; - return true; - } - } - if (s1[1] == s2[1] && s1[2] == s2[2]) - { - if (a1[0] == a2[0]) - { - congSASflag = true; - return true; - } - } - if (s1[2] == s2[2] && s1[0] == s2[0]) - { - if (a1[1] == a2[1]) - { - congSASflag = true; - return true; - } - } - sasFlag = false; - return false; -} -inline bool TriangleSolver::cong_ASA(TriangleSolver& t) -{ - double s1[] = { side_a, side_b, side_c }; - double s2[] = { t.side_a, t.side_b, t.side_c }; - - double a1[] = { angle_A, angle_B, angle_C }; - double a2[] = { t.angle_A, t.angle_B, t.angle_C }; - - sort(a1, a1 + 3); - sort(a2, a2 + 3); - sort(s1, s1 + 3); - sort(s2, s2 + 3); - - if (a1[0] == a2[0] && a1[1] == a2[1]) - { - if (s1[2] == s2[2]) - { - congASAflag = true; - return true; - } - } - if (a1[1] == a2[1] && a1[2] == a2[2]) - { - if (s1[0] == s2[0]) - { - congASAflag = true; - return true; - } - } - if (a1[2] == a2[2] && a1[0] == a2[0]) - { - if (s1[1] == s2[1]) - { - congASAflag = true; - return true; - } - } - sasFlag = false; - return false; -} -inline bool TriangleSolver::cong_AAS(TriangleSolver& t) -{ - double s1[] = { side_a, side_b, side_c }; - double s2[] = { t.side_a, t.side_b, t.side_c }; - - double a1[] = { angle_A, angle_B, angle_C }; - double a2[] = { t.angle_A, t.angle_B, t.angle_C }; - - sort(a1, a1 + 3); - sort(a2, a2 + 3); - sort(s1, s1 + 3); - sort(s2, s2 + 3); - - if (a1[0] == a2[0] && a1[1] == a2[1]) - { - if (s1[0] == s2[0] || s1[1] == s2[1]) - { - congAASflag = true; - return true; - } - } - if (a1[1] == a2[1] && a1[2] == a2[2]) - { - if (s1[1] == s2[1] || s1[2] == s2[2]) - { - congAASflag = true; - return true; - } - } - if (a1[2] == a2[2] && a1[0] == a2[0]) - { - if (s1[0] == s2[0] || s1[2] == s2[2]) - { - congAASflag = true; - return true; - } - } - sasFlag = false; - return false; -} -inline bool TriangleSolver::cong_SSS(TriangleSolver& t) -{ - double s1[] = { side_a, side_b, side_c }; - double s2[] = { t.side_a, t.side_b, t.side_c }; - sort(s1, s1 + 3); - sort(s2, s2 + 3); - - if (s1[0]==s2[0] && s1[1]==s2[1] && s1[2]==s2[2]) - { - congSSSflag = true; - return true; - } - return false; -} -inline bool TriangleSolver::cong_HL(TriangleSolver& t) -{ - double s1[] = { side_a, side_b, side_c }; - double s2[] = { t.side_a, t.side_b, t.side_c }; - sort(s1, s1 + 3); - sort(s2, s2 + 3); - - - if (s1[2] == s2[2]) - { - if (s1[1] == s2[1] || s1[0]== s2[0]) - { - congHLflag = true; - return true; - } - } - - return false; -} -/*______________________________________________________________________________ -*/ - - - -inline bool TriangleSolver::checkSides()const -{ - if ( - side_a + side_b > side_c && - side_c + side_b > side_a && - side_a + side_c > side_b - ) - return true; - else - return false; -} - -inline bool TriangleSolver::checkTriangle()const -{ - if(checkSides()==true&&checkAngles()==true) - return true; - return false; -} - -inline bool TriangleSolver::checkSimilarity(TriangleSolver &T) -{ - check_AAA(T); - check_SAS(T); - check_SSS(T); - if (sssFlag == true || - sasFlag == true || - sssFlag == true - ) - return true; - - return false; - -} - -inline void TriangleSolver::similarBy(TriangleSolver &T) -{ - if(checkSimilarity(T)==true){ - cout<< ID << " is similar with "<< T.ID << " by: "; - if (aaaFlag == 1) cout << "AAA "; - if (sssFlag == 1) cout << "SSS "; - if (sasFlag == 1) cout << "SAS "; - std::cout << endl; - } - else - cout << ID << " is not similar with " << T.ID << std::endl; - -} - -inline bool TriangleSolver::isCongruent(TriangleSolver& t) -{ - cong_AAS(t); - cong_ASA(t); - cong_SAS(t); - cong_SSS(t); - cong_HL(t); - if (congAASflag == true || - congSASflag == true || - congASAflag == true || - congSSSflag == true || - congHLflag ==true - - ) - return true; - - return false; -} - -inline void TriangleSolver::congruentBy(TriangleSolver& t) -{ - if (isCongruent(t) == true) { - cout << ID << " is congruent with " << t.ID << " by: "; - if (congSASflag == 1) cout << "SAS "; - if (congAASflag == 1) cout << "AAS "; - if (congASAflag == 1) cout << "ASA "; - if (congSSSflag == 1) cout << "SSS "; - if (congHLflag == 1) cout << "HL "; - std::cout << endl; - } - else - cout << ID << " is not congruent with " << t.ID << std::endl; - -} - -inline void TriangleSolver::triangleTypeBySide() -{ - if (!checkSides()) { - //cout << "Not a valid triangle" << endl; - sideType = "invalid"; - } - else { - if (side_a == side_b && side_b == side_c) { - //cout << "Equilateral" << endl; - sideType = "Equilateral"; - } - else if (side_a == side_b || side_b == side_c || side_c == side_a) { - //cout << "Isosceles" << endl; - sideType = "Isosceles"; - } - else { - //cout << "scalene" << endl; - sideType = "Scalene"; - } - - } -} - -inline void TriangleSolver::triangleTypeByAngle() -{ - double a, b, c; - a = angle_A; - b = angle_B; - c = angle_C; - - if (!checkAngles()) { - //cout << "Not a valid triangle" << endl; - //throw ExceptionHandler. - angleType = "invalid"; - } - else { - double longest = c; - - if (longest < a) { - c = longest; - longest = b; - a = c; - } - - if (longest < b) { - c = longest; - longest = b; - b = c; - - } - if (a * a + b * b == longest * longest || a == 90 || b == 90 || c==90) { - //cout << "This is a right-angled triangle.\n"; - angleType = "Right"; - } - else if (a * a + b * b > longest * longest) { - //cout << "This is an acute-angled triangle.\n"; - angleType = "Acute"; - } - else - //cout << "This is an obtuse-angled triangle.\n"; - angleType = "Obtuse"; - } -} - - -inline void TriangleSolver::displayTriangleData(std::string label) const -{ - std::cout << ((label == "") ? ID : label); - showAngleType(); - showSides(); - showAngles(); - showParameter(); - showSemiParameter(); - showArea(); - showInRadius(); - showCircumradius(); - showEulersDistance(); - showAllMedians(); - showAllHeights(); - showVertices(); - showCircumcenterCoordinates(); - showCentroid(); - if (altTriFlag == true) { - - cout << "\nthis Triangle has an alternative" << endl; - cout << "alt angle B: " << altAngle_B << endl; - cout << "alt angle C: " << altAngle_C << endl; - cout << "alt side c: " << altSide << endl; - cout << "alt area: " << altArea << endl; - cout << "alt perimeter: " << altPerimeter << endl; - cout << "alt height_a: " << altHeight_a << endl; - cout << "alt height_b: " << altHeight_b << endl; - cout << "alt height_c: " << altHeight_c << endl; - } - cout << endl; -} - -inline void TriangleSolver::showSides() const -{ - showSide_a(); - showSide_b(); - showSide_c(); -} - -inline void TriangleSolver::showAngles() const -{ - showAngle_A(); - showAngle_B(); - showAngle_C(); - -} -inline void TriangleSolver::showVertices()const -{ - size_t it = 0; - std::cout << "Vertex coordinates:" << setprecision(6); - for (const auto& v : vertices) - { - std::cout << "(" << v.first << "," << v.second - << ((it < 2) ? "), " : ")"); - it++; - } - std::cout << std::endl; -} -inline void TriangleSolver::showCentroid() const -{ - std::cout << "Centroid: (" << centroid.first - << "," << centroid.second << ")" <>"; - std::cin >> side_a; - cin.clear(); - cin.ignore(100, '\n'); - } - } - while (!checkSides() || !cin); - -} - -inline void TriangleSolver::setSide_b(double _b) -{ - side_b = _b; - do - { - if (checkSides()) - { - update_triangle(); - } - else - { - std::cout << "sides do don't make a proper triangle enter another" - << " value for side b now\n>>"; - std::cin >> side_b; - cin.clear(); - cin.ignore(100, '\n'); - } - } - while (!checkSides() || !cin); -} - -inline void TriangleSolver::setSide_c(double _c) -{ - side_c = _c; - do - { - if (checkSides()) - { - update_triangle(); - } - else - { - std::cout << "sides do don't make a proper triangle enter another" - << " value for side c now\n>>"; - std::cin >> side_c; - cin.clear(); - cin.ignore(100, '\n'); - } - } - while (!checkSides() || !cin); -} - -inline void TriangleSolver::setSides(double _a, double _b, double _c) -{ - side_a = _a; - side_b = _b; - side_c = _c; - if (checkSides() == true) { - update_triangle(); - } - else { - badTriangle(); - } - -} -inline void TriangleSolver::setAngles(double aA, double aB, double aC) -{ - // this will essentially build a new triangle from the one you have - angle_A = aA; - angle_B = aB; - angle_C = aC; - if (double check = aA + aB + aC; check != 180) { - do { - cout << "the angles need to add up to 180 degrees to be a real triangle\n" - << "please reenter the sides and make sure the total is 180 degrees.\n" - << "use spaces to seperate each angle esample: 40.5 65 79.5\n>"; - cin >> aA >> aB >> aC; - check = aA + aB + aC; - cin.clear(); - cin.ignore(100, '\n'); - } while (check != 180 || !cin); - } - if (checkAngles() == true) { - solve_by_AAA(aA, aB, aC); - } - //update_triangle(); -} -/*______________________________________________________________________________ - overloaded addition opperators*/ - -inline TriangleSolver TriangleSolver::operator++() -{ - return TriangleSolver{++side_a, ++side_b, ++side_c}; -} - -inline TriangleSolver TriangleSolver::operator++(int) -{ - return TriangleSolver{side_a++,side_b++,side_c++}; -} - -inline TriangleSolver TriangleSolver::operator+(const TriangleSolver& tri)const -{ - return TriangleSolver{side_a+tri.side_a, side_b+tri.side_b,side_c+tri.side_c}; -} - -inline TriangleSolver TriangleSolver::operator+(double n)const -{ - return TriangleSolver{side_a+n,side_b+n,side_c+n}; -} - -inline TriangleSolver& TriangleSolver::operator+=(const TriangleSolver& rhs) -{ - side_a += rhs.side_a; - side_b += rhs.side_b; - side_c += rhs.side_c; - calculate_All_angles(); - return *this; -} -inline TriangleSolver& TriangleSolver::operator+(const TriangleSolver& rhs) -{ - side_a += rhs.side_a; - side_b += rhs.side_b; - side_c += rhs.side_c; - calculate_All_angles(); - return *this; -} -inline TriangleSolver operator+(double num, TriangleSolver& t) -{ - return TriangleSolver{num+t.side_a,num+t.side_b,num+t.side_c}; -} - -inline TriangleSolver operator+(TriangleSolver& v, TriangleSolver& s) -{ - return TriangleSolver{v.side_a+s.side_a,v.side_b+s.side_b,v.side_c+s.side_c}; -} - - -/*______________________________________________________________________________ - overloaded subtraction opperators*/ - -inline TriangleSolver TriangleSolver::operator--() -{ - return TriangleSolver{--side_a, --side_b, --side_c}; -} - -inline TriangleSolver TriangleSolver::operator--(int) -{ - return TriangleSolver{side_a--,side_b--,side_c--}; -} - -inline TriangleSolver TriangleSolver::operator-(const TriangleSolver& tri) const -{ - return TriangleSolver{side_a-tri.side_a, side_b-tri.side_b,side_c-tri.side_c}; -} - -inline TriangleSolver TriangleSolver::operator-(double n) const -{ - return TriangleSolver{side_a-n,side_b-n,side_c-n}; -} - -inline TriangleSolver& TriangleSolver::operator-=(const TriangleSolver& rhs) -{ - side_a -= rhs.side_a; - side_b -= rhs.side_b; - side_c -= rhs.side_c; - calculate_All_angles(); - update_triangle(); - return *this; -} - -inline TriangleSolver operator-(double num, TriangleSolver& t) -{ - return TriangleSolver{num-t.side_a,num-t.side_b,num-t.side_c}; -} - -inline TriangleSolver operator-(TriangleSolver& v, const TriangleSolver& s) -{ - return TriangleSolver{v.side_a-s.side_a,v.side_b-s.side_b,v.side_c-s.side_c}; -} - -/*______________________________________________________________________________ - overloaded division opperators*/ - -inline TriangleSolver TriangleSolver::operator/(double d)const -{ - return TriangleSolver{side_a/d,side_b/d,side_c/d}; -} - -inline TriangleSolver TriangleSolver::operator/(const TriangleSolver& t)const -{ - return TriangleSolver{side_a/t.side_a,side_b/t.side_b,side_c/t.side_c}; -} - -/*______________________________________________________________________________ - overloaded multiplication opperators*/ - -inline TriangleSolver TriangleSolver::operator*(double t) const -{ - return TriangleSolver{side_a*t,side_b*t,side_c*t}; -} - -inline TriangleSolver operator*(double s, TriangleSolver& t) -{ - return TriangleSolver{s*t.side_a,s*t.side_b,s*t.side_c}; -} - -inline TriangleSolver operator*(TriangleSolver& v, TriangleSolver& s) -{ - return TriangleSolver{v.side_a*s.side_a,v.side_b*s.side_b,v.side_c*s.side_c}; -} -inline ostream& operator<<(ostream& os, const TriangleSolver& t) -{ - t.displayTriangleData(); - return os; -} - -inline istream& operator>>(istream& is, TriangleSolver& t) -{ - is >> t.side_a >> t.side_b >> t.side_c; - if (t.checkSides()) - { - t.update_triangle(); - return is; - } - else - { - t.badTriangle(); - } - return is; -} - -template -inline T TriangleSolver::negativeNumCheck(T& num) -{ - if (num > 0) - return 0; - else { - num = negativeNumFix(num); - } - return 0; -} - -template -inline T TriangleSolver::negativeNumFix(T& num) -{ - //double temp; - if (num < 0) { - do { - cout << "You cannot enter a negative value\n:"; - cout << "making it an absolute value instead"; - num = abs(num); - //return num; - cin.ignore(100, '\n'); - cin.clear(); - } while (!cin || num < 0); - return num; - } - return num; +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_TRIANGLESOLVER_H +#define PHYSICSFORMULA_TRIANGLESOLVER_H +// Part of a final project in c++ II, this program as a whole +// will calculate the properties of 2D and 3D objects and vectors + +// prgrammer: Ryan Zurrin +#include +#include +#include +#include +#include +#include +#include "Vector2D.h" + +static int triangle_object_count = 0; + + +class TriangleSolver +{ + void badTriangle(); + template + T negativeNumCheck(T& num); + template + T negativeNumFix(T& num); + double pythagoreanTheorem(double, double)const; + void update_triangle(); + void triangleTypeBySide(); + void triangleTypeByAngle(); + void initiate_triangle(string id); + void calculate_angleA(); + void calculate_angleB(); + void calculate_angleC(); + void calculate_All_angles(); + void calculate_AllHeight(); + void calculate_heightBase_a(), + calculate_heightBase_b(), + calculate_heightBase_c(); + void calculate_medians_abc(); + void findMissingSide(); + void find_base(); + void calculate_area(); + void calculate_perimeter(); + void calculate_rVal(); + void calculate_sVal(); + void calculate_iVal(); + void set_vertices(); + void set_centroid(); + void set_eulersDistance(); + void set_ccc();//sets the circumcenter coordinates + bool checkSimilarity(TriangleSolver& T); + bool check_SSS(TriangleSolver&);// by Arnab Kundu + bool check_SAS(TriangleSolver&); + bool check_AAA(TriangleSolver&); + bool cong_SAS(TriangleSolver& t); + bool cong_ASA(TriangleSolver& t); + bool cong_AAS(TriangleSolver& t); + bool cong_SSS(TriangleSolver& t); + bool cong_HL(TriangleSolver& t); + + TriangleSolver *solve_by_AAA(const double&, const double&, const double&); // three sides known + TriangleSolver *solve_by_AAS(const double&, const double&, const double&); // two angles and a side not between + TriangleSolver *solve_by_ASA(const double&, const double&, const double&); // two angles and a side bewteen them + TriangleSolver *solve_by_SAS(const double&, const double&, const double&); // two sides and the included angle. + TriangleSolver *solve_by_SSA(const double&, const double&, const double&); // two sides and one angle that is not the included angle + TriangleSolver *solve_by_SSS(const double&, const double&, const double&); // all three sides of a triangle, but no angles + + // member variablesfor keeping track of triangle data + string ID; + double max_side; + double height_a, altHeight_a; + double height_b, altHeight_b; + double height_c, altHeight_c; + double max_height; + double side_a; + double side_b; + double side_c, altSide; + double angle_A, altAngle_A; + double angle_B, altAngle_B; + double angle_C, altAngle_C; + double area, altArea; + double perimeter, altPerimeter; + double sVal, altSval; // Semiperimeter + double rVal, altRval; // Circumradius + double iVal, altIval; // inradius + // these bools are for determining congruency and similarity type + double median_a, altMedian_a; + double median_b, altMedian_b; + double median_c, altMedian_c; + bool sssFlag, congSSSflag, + aaaFlag, congSASflag, + sasFlag, congASAflag, + ssaFlag, congAASflag, + asaFlag, congHLflag, + aasFlag, + missingSideFlag, + altTriFlag; + string sideType; + string angleType; + double eulersDistance; + vector> vertices; + pair centroid; + pair circumcenterCoordinate; + + +public: + TriangleSolver(string id = ""); + + /// + /// Initializes a new instance of the TriangleSolver class.\n + /// type of triangle:->("use")\n + /// side, side, side->("sss")\n + /// else use:___________________________________________\n + /// side angle side->("sas")\n + /// side, side, angle->("ssa")\n + /// angleA, angleB, angleC->("aaa")\n + /// angleA ,side_c, angleB->("asa")\n + /// angleA angleC side_c->("aas")\n + /// _____________________________________________________ + /// + /// The first parameter. + /// The second parameter. + /// The third parameter. + /// Three letter string literal or The type of triangle to be solved. + /// object identifier if wanted + TriangleSolver(const double param1, const double param2, const double param3, + const string type = "sss", const string id = ""); + + TriangleSolver( TriangleSolver&); // copy constructor + TriangleSolver(TriangleSolver&& t)noexcept; + TriangleSolver& operator=(TriangleSolver const& t); + TriangleSolver& operator=(TriangleSolver&& t)noexcept; + + + + [[nodiscard]] bool checkSides()const; + [[nodiscard]] bool checkTriangle()const; + [[nodiscard]] bool checkAngles()const; + + void similarBy(TriangleSolver&); + bool isCongruent(TriangleSolver& t); + void congruentBy(TriangleSolver& t); + void displayTriangleData(std::string label = "")const; + void showVertices()const; + void showCentroid()const; + void showEulersDistance()const; + void showCircumcenterCoordinates()const; + void showSides()const; + void showAngles()const; + void showAngleType()const; + void showAreaPerimeter()const; + void showSide_a()const { cout << "side a: " << side_a<< endl; } + void showSide_b()const { cout << "side b: " << side_b << endl; } + void showSide_c()const { cout << "side c: " << side_c << endl; } + void showAngle_A()const { cout << "angle A: " << angle_A<< endl; } + void showAngle_B()const { cout << "angle B: " << angle_B<< endl; } + void showAngle_C()const { cout << "angle C: " << angle_C<< endl; } + void showArea()const { cout << "area: " << area << endl; } + void showParameter()const { cout << "parameter: "<< perimeter<< endl; } + void showMaxHeight()const { cout << "Max Height: " << max_height << endl; } + void showHeight_a()const { cout << "height_a: " << height_a << endl; } + void showHeight_b()const { cout << "height_b: " << height_b << endl; } + void showHeight_c()const { cout << "height_c: " << height_c << endl; } + void showMedian_a()const { cout << "median_a: " << median_a << endl; } + void showMedian_b()const { cout << "median_b: " << median_b << endl; } + void showMedian_c()const { cout << "median_c: " << median_c << endl; } + void showAllHeights()const { + cout << "height_a: " << height_a << endl + << "height_b: " << height_b << endl + << "height_c: " << height_c << endl; + } + void showAllMedians()const { + cout << "median_a: " << median_a << endl + << "median_b: " << median_b << endl + << "median_c: " << median_c << endl; + } + void showLargestSide()const { cout << "most stable base: " << max_side << endl; } + void showCircumradius()const { cout << "circum-radius: " << rVal << endl; } + void showInRadius()const { cout << "in-radius: " << iVal << endl; } + void showSemiParameter()const { cout << "semi-parameter: " << sVal << endl; } + void showCongruencyFlags()const; + + [[nodiscard]] double returnSide_a()const { return side_a; } + [[nodiscard]] double returnSide_b()const { return side_b; } + [[nodiscard]] double returnSide_c()const { return side_c; } + [[nodiscard]] double returnAngle_A()const { return angle_A; } + [[nodiscard]] double returnAngle_B()const { return angle_B; } + [[nodiscard]] double returnAngle_C()const { return angle_C; } + [[nodiscard]] double returnArea()const { return area; }; + [[nodiscard]] double returnPerimeter()const { return perimeter; } + [[nodiscard]] double returnBase()const { return max_side; } + [[nodiscard]] double returnMaxHeight()const { return max_height; } + [[nodiscard]] double returnHeight_a()const { return height_a; } + [[nodiscard]] double returnHeight_b()const { return height_a; } + [[nodiscard]] double returnHeight_c()const { return height_c; } + [[nodiscard]] double returnMedian_a()const { return median_a; } + [[nodiscard]] double returnMedian_b()const { return median_b; } + [[nodiscard]] double returnMedian_c()const { return median_c; } + [[nodiscard]] double returnCircumradius()const { return rVal; } + [[nodiscard]] double returnSemiPerimeter()const { return sVal; } + [[nodiscard]] bool returnSAS()const { return sasFlag; } + [[nodiscard]] bool returnSSS() const { return sssFlag; } + [[nodiscard]] bool returnAAA() const { return aaaFlag; } + [[nodiscard]] bool returnSSA()const { return ssaFlag; } + [[nodiscard]] bool returnASA() const { return asaFlag; } + [[nodiscard]] bool returnAAS() const { return aasFlag; } + + void setSide_a(double _a); + void setSide_b(double _b); + void setSide_c(double _c); + void setSides(double, double, double); + void setAngles(double, double, double); + static int getTriangleObjectCount() { return triangle_object_count; } + //double setAngle_A(double _A) { angle_A = _A; update_triangle(); } + //double setAngle_B(double _B) { angle_B = _B; update_triangle(); } + //double setAngle_C(double _C) { angle_C = _C; update_triangle(); } + //double setTriangleArea(double tA) { area = tA; update_triangle(); } + + + //overloaded relational operators + bool operator>(const TriangleSolver& s)const { return area > s.area; } + bool operator>=(const TriangleSolver& s)const { return area >= s.area; } + bool operator<(const TriangleSolver& s)const { return area < s.area; } + bool operator<=(const TriangleSolver& s)const { return area <= s.area; } + bool operator==(const TriangleSolver& s)const { return area == s.area; } + bool operator!=(const TriangleSolver& s)const { return !(area == s.area); } + bool operator>(const double& n)const { return area > n; } + bool operator>=(const double& n)const { return area >= n; } + bool operator<(const double& n)const { return n < area; } + bool operator<=(const double& n)const { return n <= area; } + bool operator==(const double& n)const { return area == n; } + bool operator!=(const double& n)const { return !(area == n); } + + //overloaded additon operators + TriangleSolver operator++(); + TriangleSolver operator++(int); + TriangleSolver operator+(const TriangleSolver&)const; + TriangleSolver operator+(double)const; + TriangleSolver& operator+=(const TriangleSolver&); + friend TriangleSolver operator+(double num, TriangleSolver&); + friend TriangleSolver operator+(TriangleSolver& v, TriangleSolver& s); + TriangleSolver& operator+(const TriangleSolver& rhs); + //friend Triangle operator+(Triangle lhs, const Triangle&); + + // overloaded subtraction operators + TriangleSolver operator-()const; + TriangleSolver operator--(); + TriangleSolver operator--(int); + TriangleSolver operator-(const TriangleSolver&)const; + TriangleSolver operator-(double)const; + TriangleSolver& operator-=(const TriangleSolver&); + friend TriangleSolver operator-(double num, TriangleSolver&); + friend TriangleSolver operator-(TriangleSolver&, const TriangleSolver&); + + TriangleSolver operator*(double value)const; // multiply + + friend TriangleSolver operator*(double s, TriangleSolver& v); + friend TriangleSolver operator*(TriangleSolver& v, TriangleSolver& s); + TriangleSolver operator/(double)const; //division + TriangleSolver operator/(const TriangleSolver&)const; + + + friend ostream& operator<<(ostream&, const TriangleSolver&); + friend istream& operator>>(istream&, TriangleSolver&); + + ~TriangleSolver() = default; + + + + +}; +#endif //PHYSICSFORMULA_TRIANGLESOLVER_H + +/*______________________________________________________________________________ +*/ +inline TriangleSolver::TriangleSolver(string id) +{ + triangle_object_count++; + initiate_triangle(id); +} + + +inline TriangleSolver::TriangleSolver(const double param1, const double param2, const double param3, const string type, const string id) +{ //sss='s', sas='a', ssa ='b', aaa='l', asa='i', aas='n' + triangle_object_count++; + initiate_triangle(id); + if (type == "sss" || type == "SSS") // side, side, side(sss) + { + solve_by_SSS(param1, param2, param3); + } + else if (type == "sas" || type == "SAS") // side angle side(sas) + { + solve_by_SAS(param1, param2, param3); + } + else if (type == "ssa" || type == "SSA") // side, side, angle(ssa) + { + solve_by_SSA(param1, param2, param3); + } + else if (type == "aaa" || type == "AAA") // angleA, angleB, angleC(aaa) + { + solve_by_AAA(param1, param2, param3); + } + else if (type == "asa" || type == "ASA") // angleA ,side_c, angleB (asa) + { + solve_by_ASA(param1, param2, param3); + } + else if (type == "aas" || type == "AAS") // angleA angleC side_c (aas) + { + solve_by_AAS(param1, param2, param3); + } +} + +inline TriangleSolver::TriangleSolver(TriangleSolver& t) +{ + ID = "triangle_" + std::to_string(triangle_object_count); + side_a = t.side_a; + side_b = t.side_b; + side_c = t.side_c; + altSide = t.altSide; + angle_A = t.angle_A; + angle_B = t.angle_B; + angle_C = t.angle_C; + altAngle_A = t.altAngle_A; + altAngle_B = t.altAngle_B; + altAngle_C = t.altAngle_C; + perimeter = t.perimeter; + altPerimeter = t.altPerimeter; + max_height = t.max_height; + max_side = t.max_side; + sVal = t.sVal; + rVal = t.rVal; + iVal = t.iVal; + altRval = t.altRval; + altSval = t.altSval; + altIval = t.altIval; + area = t.area; + altArea = t.altArea; + sideType = t.sideType; + sssFlag = t.sssFlag; congSSSflag = t.congSSSflag; + aaaFlag = t.aaaFlag; + sasFlag = t.sasFlag; congSASflag = t.congSASflag; + ssaFlag = t.ssaFlag; + asaFlag = t.asaFlag; congASAflag = t.congASAflag; + aasFlag = t.aasFlag; congAASflag = t.congAASflag; + altTriFlag = t.altTriFlag; congHLflag = t.congHLflag; + height_a = t.height_a; + height_b = t.height_b; + height_c = t.height_c; + altHeight_a = t.altHeight_a; + altHeight_b = t.altHeight_b; + altHeight_c = t.altHeight_c; + median_a = t.median_a; + median_b = t.median_b; + median_c = t.median_c; + altMedian_a = t.altMedian_a; + altMedian_b = t.altMedian_b; + altMedian_c = t.altMedian_c; + missingSideFlag = t.missingSideFlag; + vertices = t.vertices; + centroid = t.centroid; + circumcenterCoordinate = t.circumcenterCoordinate; + eulersDistance = t.eulersDistance; +} + +inline TriangleSolver::TriangleSolver(TriangleSolver&& t)noexcept +{ + triangle_object_count++; + ID = "Triangle_" + std::to_string(triangle_object_count); + side_a = t.side_a; + side_b = t.side_b; + side_c = t.side_c; + altSide = t.altSide; + angle_A = t.angle_A; + angle_B = t.angle_B; + angle_C = t.angle_C; + altAngle_A = t.altAngle_A; + altAngle_B = t.altAngle_B; + altAngle_C = t.altAngle_C; + perimeter = t.perimeter; + altPerimeter = t.altPerimeter; + max_height = t.max_height; + max_side = t.max_side; + sVal = t.sVal; + rVal = t.rVal; + iVal = t.iVal; + altRval = t.altRval; + altSval = t.altSval; + altIval = t.altIval; + area = t.area; + altArea = t.altArea; + sideType = t.sideType; + sssFlag = t.sssFlag; congSSSflag = t.congSSSflag; + aaaFlag = t.aaaFlag; + sasFlag = t.sasFlag; congSASflag = t.congSASflag; + ssaFlag = t.ssaFlag; + asaFlag = t.asaFlag; congASAflag = t.congASAflag; + aasFlag = t.aasFlag; congAASflag = t.congAASflag; + altTriFlag = t.altTriFlag; congHLflag = t.congHLflag; + height_a = t.height_a; + height_b = t.height_b; + height_c = t.height_c; + altHeight_a = t.altHeight_a; + altHeight_b = t.altHeight_b; + altHeight_c = t.altHeight_c; + median_a = t.median_a; + median_b = t.median_b; + median_c = t.median_c; + altMedian_a = t.altMedian_a; + altMedian_b = t.altMedian_b; + altMedian_c = t.altMedian_c; + missingSideFlag = t.missingSideFlag; + vertices = t.vertices; + centroid = t.centroid; + circumcenterCoordinate = t.circumcenterCoordinate; + eulersDistance = t.eulersDistance; +} + + +inline TriangleSolver& TriangleSolver::operator=(TriangleSolver const& right) +{ + //cout << "in the overloaded Triangle =operator"; + if (this != &right) { + this->side_a = right.side_a; + this->side_b = right.side_b; + this->side_c = right.side_c; + this->update_triangle(); + return *this; + } + return *this; +} + +inline TriangleSolver& TriangleSolver::operator=(TriangleSolver&& t) noexcept +{ + //cout << "in the overloaded Triangle =operator"; + if (this != &t) { + this->side_a = t.side_a; + this->side_b = t.side_b; + this->side_c = t.side_c; + this->update_triangle(); + return *this; + } + return *this; +} + +inline void TriangleSolver::update_triangle() +{ + + if (angle_C > 0 && missingSideFlag == 1) { + calculate_perimeter(); + calculate_sVal(); + calculate_area(); + calculate_rVal(); + calculate_iVal(); + calculate_angleA(); + calculate_angleB(); + find_base(); + calculate_AllHeight(); + calculate_medians_abc(); + triangleTypeByAngle(); + triangleTypeBySide(); + set_vertices(); + set_centroid(); + set_eulersDistance(); + } + else if (max_side > 0 && max_height > 0) { + calculate_area(); + calculate_All_angles(); + calculate_rVal(); + calculate_sVal(); + calculate_perimeter(); + calculate_iVal(); + calculate_AllHeight(); + calculate_medians_abc(); + triangleTypeByAngle(); + triangleTypeBySide(); + set_vertices(); + set_centroid(); + set_eulersDistance(); + set_ccc(); + } + else if (side_a > 0 && side_b > 0 && side_c > 0 && + angle_A > 0 && angle_B > 0 && angle_C > 0) + { + calculate_perimeter(); + calculate_sVal(); + calculate_area(); + calculate_rVal(); + calculate_iVal(); + find_base(); + calculate_AllHeight(); + calculate_medians_abc(); + triangleTypeByAngle(); + triangleTypeBySide(); + set_vertices(); + set_centroid(); + set_eulersDistance(); + set_ccc(); + } + else { + calculate_perimeter(); + calculate_sVal(); + calculate_area(); + calculate_rVal(); + calculate_iVal(); + calculate_angleA(); + calculate_angleB(); + calculate_angleC(); + find_base(); + calculate_AllHeight(); + calculate_medians_abc(); + triangleTypeByAngle(); + triangleTypeBySide(); + set_vertices(); + set_centroid(); + set_eulersDistance(); + set_ccc(); + } + triangleTypeByAngle(); + triangleTypeBySide(); +} + +inline void TriangleSolver::badTriangle() +{ + + double _a, _b, _c; + do + { + cout << "Your triangle is no good" << endl + << "Lets fix it" << endl; + cout << "**please enter side a: "; + cin >> _a; + if (_a <= 0) { + negativeNumFix(_a); + } + else + side_a = _a; + + cout << "**please enter side b: "; + cin >> _b; + if (_b <= 0) { + negativeNumFix(_b); + } + else + side_b = _b; + + cout << "**please enter side c: "; + cin >> _c; + if (_c <= 0) { + negativeNumFix(_c); + } + else + side_c = _c; + + if (checkTriangle() == true) { + update_triangle(); + } + cin.clear(); + cin.ignore(100, '\n'); + } + while (!checkSides() || !cin); + +} + +inline void TriangleSolver::initiate_triangle(string id) +{ + if (id == "") + { + ID = "Triangle_" + std::to_string(triangle_object_count); + } + else + { + ID = id; + } + max_side = 0.0; + max_height = 0.0; + height_a = 0.0; + height_b = 0.0; + height_c = 0.0; + altHeight_a = 0.0; + altHeight_b = 0.0; + altHeight_c = 0.0; + side_a = 0.0; + side_b = 0.0; + side_c = 0.0; + altSide = 0.0; + angle_A = 0.0; + angle_B = 0.0; + angle_C = 0.0; + altAngle_A = 0.0; + altAngle_B = 0.0; + altAngle_C = 0.0; + area = 0.0; + altArea = 0.0; + perimeter = 0.0; + altPerimeter = 0.0; + median_a = 0.0; altMedian_a = 0.0; + median_b = 0.0; altMedian_b = 0.0; + median_c = 0.0; altMedian_c = 0.0; + sssFlag = false; + aaaFlag = false; + sasFlag = false; + ssaFlag = false; + asaFlag = false; + aasFlag = false; + congSASflag = false; + congSSSflag = false; + congASAflag = false; + congAASflag = false; + congHLflag = false; + missingSideFlag = false; + altTriFlag = false; + rVal = 0.0; + sVal = 0.0; + iVal = 0.0; + altRval = 0.0; + altSval = 0.0; + altIval = 0.0; + eulersDistance = 0.0; +} + +inline void TriangleSolver::calculate_angleA() +{ + if (angle_B > 0 && angle_C > 0) { + angle_A = 180 - (angle_B + angle_C); + } + else { + auto cosA = (pow(side_b, 2) + pow(side_c, 2) - + pow(side_a, 2)) / (2.0 * side_b * side_c); + angle_A = acos(cosA)*DEGREE; + } +} + +inline void TriangleSolver::calculate_angleB() +{ + if (angle_A > 0 && angle_C > 0) { + angle_B = 180 - (angle_A + angle_C); + } + else { + auto cosB = (pow(side_c, 2) + pow(side_a, 2) - + pow(side_b, 2)) / (2.0 * side_c * side_a); + angle_B = acos(cosB)*DEGREE; + } +} + +inline void TriangleSolver::calculate_angleC() +{ + if (angle_B > 0 && angle_A > 0) { + angle_C = 180 - (angle_A + angle_B); + } + else { + auto cosC = (pow(side_a, 2) + pow(side_b, 2) - + pow(side_c, 2)) / (2.0 * side_a * side_b); + angle_C = acos(cosC)*DEGREE; + } + +} + +inline void TriangleSolver::calculate_All_angles() +{ + calculate_angleA(); + calculate_angleB(); + calculate_angleC(); +} + + +inline void TriangleSolver::calculate_AllHeight() +{ + max_height = 2 * area / (max_side); + calculate_heightBase_a(); + calculate_heightBase_b(); + calculate_heightBase_c(); + +} + +inline void TriangleSolver::calculate_heightBase_a() +{ + height_a = (2 * area) / side_a; +} + +inline void TriangleSolver::calculate_heightBase_b() +{ + height_b = (2 * area) / side_b; +} + +inline void TriangleSolver::calculate_medians_abc() +{ + double a = 0.0, b = 0.0, c = 0.0; + a = side_a * side_a; + b = side_b * side_b; + c = side_c * side_c; + median_a = sqrt(((2 * b) + (2 * c) - a) / 4); + median_b = sqrt(((2 * a) + (2 * c) - b) / 4); + median_c = sqrt(((2 * a) + (2 * b) - c) / 4); +} + +inline void TriangleSolver::calculate_heightBase_c() +{ + height_c = (2 * area) / side_c; +} + +inline void TriangleSolver::findMissingSide() +{ + missingSideFlag = true; + double a, b, angle=0; + a = side_a; + b = side_b; + angle = angle_C; + if (angle == 90) { + side_c = pythagoreanTheorem(a, b); + } + else { + side_c = sqrt((a * a) + (b * b) - 2 * a * (b * cos(angle*RADIAN))); + } + update_triangle(); + +} + +inline bool TriangleSolver::checkAngles()const +{ + double temp = angle_A + angle_B + angle_C; + if (temp > 180) + return false; + return true; +} + +inline double TriangleSolver::pythagoreanTheorem(double a, double b)const +{ + return sqrt(a * a + b * b); +} + + +inline void TriangleSolver::find_base() +{ + const int size = 3; + double a, b, c; + a = side_a; + b = side_b; + c = side_c; + vector biggestSide = { a, b, c }; + auto min_pos = + min_element(biggestSide.cbegin(), biggestSide.cend()); + auto max_pos = + max_element(biggestSide.cbegin(), biggestSide.cend()); + sort(biggestSide.begin(), biggestSide.end()); + max_side = biggestSide[2]; +} +inline void TriangleSolver::calculate_area() +{ + if (max_side > 0 && max_height > 0) { + area = (max_height * max_side) / 2; + }else + area = sqrt(sVal * (sVal - side_a) * (sVal - side_b) * (sVal - side_c)); + +} +inline void TriangleSolver::calculate_perimeter() +{ + perimeter = side_a + side_b + side_c; +} +inline void TriangleSolver::calculate_rVal() +{ + rVal = (side_a * side_b * side_c) / (4 * area); +} +inline void TriangleSolver::calculate_sVal() +{ + sVal = perimeter / 2; +} +inline void TriangleSolver::calculate_iVal() +{ + iVal = area / sVal; +} +inline void TriangleSolver::set_vertices() +{ + pair a, b, c; + a.first = 0; + a.second = 0; + b.first = side_c; + b.second = 0; + c.first = side_b * (pow(side_b, 2) + pow(side_c, 2) - + pow(side_a, 2)) / (2.0 * side_b * side_c); + c.second = sqrt(pow(side_b, 2) - pow(c.first, 2)); + vertices = vector>{ a,b,c }; + +} +inline void TriangleSolver::set_centroid() +{ + centroid.first = (vertices[0].first + vertices[1].first + vertices[2].first) / 3.0; + centroid.second = (vertices[0].second + vertices[1].second + vertices[2].second) / 3.0; +} +inline void TriangleSolver::set_eulersDistance() +{ + eulersDistance = sqrt(pow(rVal, 2) - (2 * iVal * rVal)); +} +inline void TriangleSolver::set_ccc() +{ + auto d = 2.0 * (vertices[1].first * vertices[2].second - + vertices[1].second * vertices[2].first); + + circumcenterCoordinate.first = (vertices[2].second * (pow(vertices[1].first, 2) + + pow(vertices[1].second, 2)) - (vertices[1].second * (pow(vertices[2].first, 2) + + pow(vertices[2].second, 2)))) / d; + + circumcenterCoordinate.second = (vertices[1].first * (pow(vertices[2].first, 2) + + pow(vertices[2].second, 2)) - (vertices[2].first * (pow(vertices[1].first, 2) + + pow(vertices[1].second, 2)))) / d; +} +inline TriangleSolver *TriangleSolver::solve_by_AAA(const double& a1, const double& a2, const double& a3) +{ + angle_A = a1; angle_B = a2; angle_C = a3; + + double temp_a=0.0, temp_b=0.0, temp_c=0.0; + + cout << "You need at least one side to solve a triangle\n"; + do { + cout << "Enter a side length now for the sides you know\n" + << "if you do not know a side just enter a 0\n" + << "seperate with spaces input order is sides> a, b, c\n>"; + cin >> temp_a >> temp_b >> temp_c; + if (!cin) { + cout << "**ERROR**"; + cin.clear(); + cin.ignore(100, '\n'); + } + } while (!cin); + if (temp_a < 0) { + side_a = abs(temp_a); + } + else + side_a = temp_a; + + if (temp_b < 0) { + side_b = abs(temp_b); + } + else + side_b = temp_b; + + if (temp_c < 0) { + side_c = abs(temp_c); + } + else + side_c= temp_c; + + if (side_a > 0) { + side_b = sin(angle_B * RADIAN) * side_a / sin(angle_A * RADIAN); + side_c = sin(angle_C * RADIAN) * side_a / sin(angle_A * RADIAN); + } + else if (side_b > 0) { + side_a = sin(angle_A * RADIAN) * side_b / sin(angle_B * RADIAN); + side_c = sin(angle_C * RADIAN) * side_b / sin(angle_B * RADIAN); + } + else if (side_c > 0) { + side_a = sin(angle_A * RADIAN) * side_c / sin(angle_C * RADIAN); + side_b = sin(angle_B * RADIAN) * side_c / sin(angle_C * RADIAN); + } + else + cout << "You didn't enter a valid side lenght, no further computations made on triangle"; + + if (temp_a > 0.0) { + side_a = temp_a; + } + if (temp_b > 0.0) { + side_b = temp_b; + } + if (temp_c > 0.0) { + side_c = temp_c; + } + + if (checkTriangle() == true) { + update_triangle(); + } + else + cout << "\nthe data entered does not make a valid Triangle. Please try again."; + + return this; +} +inline TriangleSolver *TriangleSolver::solve_by_AAS(const double& a1, const double& a2, const double& s) +{ + //double tmp1, tmp2, tmp3, tmp4; + angle_A = a1; + angle_C = a2; + side_c = s; + calculate_angleB(); + side_a = sin(a1 * RADIAN) * s / sin(a2 * RADIAN); + side_b = sin(angle_B*RADIAN) * s / sin(a2 * RADIAN); + + + if (checkTriangle() == true) { + update_triangle(); + } + return this; +} +inline TriangleSolver *TriangleSolver::solve_by_ASA(const double& a1, const double& s, const double& a2) +{ + angle_A = a1; + side_c = s; + angle_B = a2; + + calculate_angleC(); + + side_b = sin(angle_B*RADIAN) * s/sin(angle_C*RADIAN); + side_a = sin(angle_A*RADIAN) * s/sin(angle_C*RADIAN); + + if (checkTriangle() == true) { + update_triangle(); + } + return this; +} +inline TriangleSolver* TriangleSolver::solve_by_SAS(const double &s1, const double &a, const double &s2) +{ + side_a = s1; + angle_C = a; + side_b = s2; + findMissingSide(); + return this; +} +inline TriangleSolver* TriangleSolver::solve_by_SSA(const double& s1, const double& s2, const double& _a) +{ + double t1 = 0.0, t2 = 0.0, t3 = 0.0, t4 = 0.0; + + side_a = s1; + side_b = s2; + angle_A = _a; + t1 = s2 / s1; + t2 = sin(_a * RADIAN); + t3 = (t1 * t2); + angle_B = asin(t3) * DEGREE; + calculate_angleC(); + t4 = side_a * sin(angle_C*RADIAN); + side_c = t4 / sin(angle_A*RADIAN); + //side_c = sqrt((s1 * s1) + (s2 * s2) - 2 * s1 * s2 * cos(angle_C)); + if (checkTriangle() == true) { + update_triangle(); + } + else + cout << "this is a bad tringle" << endl; + double check = sin(angle_B * RADIAN); + if (side_b > side_a && check >=0 && check <=1) // checking if an alternate triangle can be made + { // and if so then calculates the alternate data. + altTriFlag = true; + altAngle_B = 180 - angle_B; + altAngle_C = 180 - (angle_A + altAngle_B); + altSide = side_a * sin(altAngle_C * RADIAN) / sin(angle_A * RADIAN); + altArea = ( side_a * side_b ) * sin(altAngle_C*RADIAN) / 2; + altPerimeter = side_a + side_b + altSide; + altHeight_a = 2 * altArea / side_a; + altHeight_b = 2 * altArea / side_b; + altHeight_c = 2 * altArea / altSide; + } + + return this; + +} +inline TriangleSolver *TriangleSolver::solve_by_SSS(const double& s1, const double& s2, const double& s3) //law of cosines to solve angle C +{ + side_a = s1; + side_b = s2; + side_c = s3; + if (checkSides() == true) { + update_triangle(); + } + else { + badTriangle(); + } + return this; +} + + +inline bool TriangleSolver::check_SSS(TriangleSolver& t) +{ + + double s1[] = { side_a, side_b, side_c }; + double s2[] = { t.side_a, t.side_b, t.side_c }; + //double simi_sss(double s1[], double s2[]); + + sort(s1, s1 + 3); + sort(s2, s2 + 3); + + // Check for SSS + if (s1[0] / s2[0] == s1[1] / s2[1] && + s1[1] / s2[1] == s1[2] / s2[2] && + s1[2] / s2[2] == s1[0] / s2[0]) + { + sssFlag = true; + return true; + } + sssFlag = false; + return false; + +} +inline bool TriangleSolver::check_SAS(TriangleSolver& t) +{// Function for SAS similarity + + double s1[] = { side_a, side_b, side_c }; + double s2[] = { t.side_a, t.side_b, t.side_c }; + + double a1[] = { angle_A, angle_B, angle_C }; + double a2[] = { t.angle_A, t.angle_B, t.angle_C }; + + sort(a1, a1 + 3); + sort(a2, a2 + 3); + sort(s1, s1 + 3); + sort(s2, s2 + 3); + + // Check for SAS + + // angle b / w two smallest + // sides is largest. + if (s1[0] / s2[0] == s1[1] / s2[1]) + { + if (a1[2] == a2[2]) + { + sasFlag = true; + return true; + } + } + if (s1[1] / s2[1] == s1[2] / s2[2]) + { + if (a1[0] == a2[0]) + { + sasFlag = true; + return true; + } + } + if (s1[2] / s2[2] == s1[0] / s2[0]) + { + if (a1[1] == a2[1]) + { + sasFlag = true; + return true; + } + } + sasFlag = false; + return false; + +} + +inline bool TriangleSolver::check_AAA(TriangleSolver& t) +{ + double a1[] = { angle_A, angle_B, angle_C }; + double a2[] = { t.angle_A, t.angle_B, t.angle_C }; + + sort(a1, a1 + 3); + sort(a2, a2 + 3); + + // Check for AAA + if (a1[0] == a2[0] && + a1[1] == a2[1] && + a1[2] == a2[2]) + { + aaaFlag = true; + return true; + } + aaaFlag = false; + return false; +} +inline bool TriangleSolver::cong_SAS(TriangleSolver& t) +{ + double s1[] = { side_a, side_b, side_c }; + double s2[] = { t.side_a, t.side_b, t.side_c }; + + double a1[] = { angle_A, angle_B, angle_C }; + double a2[] = { t.angle_A, t.angle_B, t.angle_C }; + + sort(a1, a1 + 3); + sort(a2, a2 + 3); + sort(s1, s1 + 3); + sort(s2, s2 + 3); + + if (s1[0] == s2[0] && s1[1] == s2[1]) + { + if (a1[2] == a2[2]) + { + congSASflag = true; + return true; + } + } + if (s1[1] == s2[1] && s1[2] == s2[2]) + { + if (a1[0] == a2[0]) + { + congSASflag = true; + return true; + } + } + if (s1[2] == s2[2] && s1[0] == s2[0]) + { + if (a1[1] == a2[1]) + { + congSASflag = true; + return true; + } + } + sasFlag = false; + return false; +} +inline bool TriangleSolver::cong_ASA(TriangleSolver& t) +{ + double s1[] = { side_a, side_b, side_c }; + double s2[] = { t.side_a, t.side_b, t.side_c }; + + double a1[] = { angle_A, angle_B, angle_C }; + double a2[] = { t.angle_A, t.angle_B, t.angle_C }; + + sort(a1, a1 + 3); + sort(a2, a2 + 3); + sort(s1, s1 + 3); + sort(s2, s2 + 3); + + if (a1[0] == a2[0] && a1[1] == a2[1]) + { + if (s1[2] == s2[2]) + { + congASAflag = true; + return true; + } + } + if (a1[1] == a2[1] && a1[2] == a2[2]) + { + if (s1[0] == s2[0]) + { + congASAflag = true; + return true; + } + } + if (a1[2] == a2[2] && a1[0] == a2[0]) + { + if (s1[1] == s2[1]) + { + congASAflag = true; + return true; + } + } + sasFlag = false; + return false; +} +inline bool TriangleSolver::cong_AAS(TriangleSolver& t) +{ + double s1[] = { side_a, side_b, side_c }; + double s2[] = { t.side_a, t.side_b, t.side_c }; + + double a1[] = { angle_A, angle_B, angle_C }; + double a2[] = { t.angle_A, t.angle_B, t.angle_C }; + + sort(a1, a1 + 3); + sort(a2, a2 + 3); + sort(s1, s1 + 3); + sort(s2, s2 + 3); + + if (a1[0] == a2[0] && a1[1] == a2[1]) + { + if (s1[0] == s2[0] || s1[1] == s2[1]) + { + congAASflag = true; + return true; + } + } + if (a1[1] == a2[1] && a1[2] == a2[2]) + { + if (s1[1] == s2[1] || s1[2] == s2[2]) + { + congAASflag = true; + return true; + } + } + if (a1[2] == a2[2] && a1[0] == a2[0]) + { + if (s1[0] == s2[0] || s1[2] == s2[2]) + { + congAASflag = true; + return true; + } + } + sasFlag = false; + return false; +} +inline bool TriangleSolver::cong_SSS(TriangleSolver& t) +{ + double s1[] = { side_a, side_b, side_c }; + double s2[] = { t.side_a, t.side_b, t.side_c }; + sort(s1, s1 + 3); + sort(s2, s2 + 3); + + if (s1[0]==s2[0] && s1[1]==s2[1] && s1[2]==s2[2]) + { + congSSSflag = true; + return true; + } + return false; +} +inline bool TriangleSolver::cong_HL(TriangleSolver& t) +{ + double s1[] = { side_a, side_b, side_c }; + double s2[] = { t.side_a, t.side_b, t.side_c }; + sort(s1, s1 + 3); + sort(s2, s2 + 3); + + + if (s1[2] == s2[2]) + { + if (s1[1] == s2[1] || s1[0]== s2[0]) + { + congHLflag = true; + return true; + } + } + + return false; +} +/*______________________________________________________________________________ +*/ + + + +inline bool TriangleSolver::checkSides()const +{ + if ( + side_a + side_b > side_c && + side_c + side_b > side_a && + side_a + side_c > side_b + ) + return true; + else + return false; +} + +inline bool TriangleSolver::checkTriangle()const +{ + if(checkSides()==true&&checkAngles()==true) + return true; + return false; +} + +inline bool TriangleSolver::checkSimilarity(TriangleSolver &T) +{ + check_AAA(T); + check_SAS(T); + check_SSS(T); + if (sssFlag == true || + sasFlag == true || + sssFlag == true + ) + return true; + + return false; + +} + +inline void TriangleSolver::similarBy(TriangleSolver &T) +{ + if(checkSimilarity(T)==true){ + cout<< ID << " is similar with "<< T.ID << " by: "; + if (aaaFlag == 1) cout << "AAA "; + if (sssFlag == 1) cout << "SSS "; + if (sasFlag == 1) cout << "SAS "; + std::cout << endl; + } + else + cout << ID << " is not similar with " << T.ID << std::endl; + +} + +inline bool TriangleSolver::isCongruent(TriangleSolver& t) +{ + cong_AAS(t); + cong_ASA(t); + cong_SAS(t); + cong_SSS(t); + cong_HL(t); + if (congAASflag == true || + congSASflag == true || + congASAflag == true || + congSSSflag == true || + congHLflag ==true + + ) + return true; + + return false; +} + +inline void TriangleSolver::congruentBy(TriangleSolver& t) +{ + if (isCongruent(t) == true) { + cout << ID << " is congruent with " << t.ID << " by: "; + if (congSASflag == 1) cout << "SAS "; + if (congAASflag == 1) cout << "AAS "; + if (congASAflag == 1) cout << "ASA "; + if (congSSSflag == 1) cout << "SSS "; + if (congHLflag == 1) cout << "HL "; + std::cout << endl; + } + else + cout << ID << " is not congruent with " << t.ID << std::endl; + +} + +inline void TriangleSolver::triangleTypeBySide() +{ + if (!checkSides()) { + //cout << "Not a valid triangle" << endl; + sideType = "invalid"; + } + else { + if (side_a == side_b && side_b == side_c) { + //cout << "Equilateral" << endl; + sideType = "Equilateral"; + } + else if (side_a == side_b || side_b == side_c || side_c == side_a) { + //cout << "Isosceles" << endl; + sideType = "Isosceles"; + } + else { + //cout << "scalene" << endl; + sideType = "Scalene"; + } + + } +} + +inline void TriangleSolver::triangleTypeByAngle() +{ + double a, b, c; + a = angle_A; + b = angle_B; + c = angle_C; + + if (!checkAngles()) { + //cout << "Not a valid triangle" << endl; + //throw ExceptionHandler. + angleType = "invalid"; + } + else { + double longest = c; + + if (longest < a) { + c = longest; + longest = b; + a = c; + } + + if (longest < b) { + c = longest; + longest = b; + b = c; + + } + if (a * a + b * b == longest * longest || a == 90 || b == 90 || c==90) { + //cout << "This is a right-angled triangle.\n"; + angleType = "Right"; + } + else if (a * a + b * b > longest * longest) { + //cout << "This is an acute-angled triangle.\n"; + angleType = "Acute"; + } + else + //cout << "This is an obtuse-angled triangle.\n"; + angleType = "Obtuse"; + } +} + + +inline void TriangleSolver::displayTriangleData(std::string label) const +{ + std::cout << ((label == "") ? ID : label); + showAngleType(); + showSides(); + showAngles(); + showParameter(); + showSemiParameter(); + showArea(); + showInRadius(); + showCircumradius(); + showEulersDistance(); + showAllMedians(); + showAllHeights(); + showVertices(); + showCircumcenterCoordinates(); + showCentroid(); + if (altTriFlag == true) { + + cout << "\nthis Triangle has an alternative" << endl; + cout << "alt angle B: " << altAngle_B << endl; + cout << "alt angle C: " << altAngle_C << endl; + cout << "alt side c: " << altSide << endl; + cout << "alt area: " << altArea << endl; + cout << "alt perimeter: " << altPerimeter << endl; + cout << "alt height_a: " << altHeight_a << endl; + cout << "alt height_b: " << altHeight_b << endl; + cout << "alt height_c: " << altHeight_c << endl; + } + cout << endl; +} + +inline void TriangleSolver::showSides() const +{ + showSide_a(); + showSide_b(); + showSide_c(); +} + +inline void TriangleSolver::showAngles() const +{ + showAngle_A(); + showAngle_B(); + showAngle_C(); + +} +inline void TriangleSolver::showVertices()const +{ + size_t it = 0; + std::cout << "Vertex coordinates:" << setprecision(6); + for (const auto& v : vertices) + { + std::cout << "(" << v.first << "," << v.second + << ((it < 2) ? "), " : ")"); + it++; + } + std::cout << std::endl; +} +inline void TriangleSolver::showCentroid() const +{ + std::cout << "Centroid: (" << centroid.first + << "," << centroid.second << ")" <>"; + std::cin >> side_a; + cin.clear(); + cin.ignore(100, '\n'); + } + } + while (!checkSides() || !cin); + +} + +inline void TriangleSolver::setSide_b(double _b) +{ + side_b = _b; + do + { + if (checkSides()) + { + update_triangle(); + } + else + { + std::cout << "sides do don't make a proper triangle enter another" + << " value for side b now\n>>"; + std::cin >> side_b; + cin.clear(); + cin.ignore(100, '\n'); + } + } + while (!checkSides() || !cin); +} + +inline void TriangleSolver::setSide_c(double _c) +{ + side_c = _c; + do + { + if (checkSides()) + { + update_triangle(); + } + else + { + std::cout << "sides do don't make a proper triangle enter another" + << " value for side c now\n>>"; + std::cin >> side_c; + cin.clear(); + cin.ignore(100, '\n'); + } + } + while (!checkSides() || !cin); +} + +inline void TriangleSolver::setSides(double _a, double _b, double _c) +{ + side_a = _a; + side_b = _b; + side_c = _c; + if (checkSides() == true) { + update_triangle(); + } + else { + badTriangle(); + } + +} +inline void TriangleSolver::setAngles(double aA, double aB, double aC) +{ + // this will essentially build a new triangle from the one you have + angle_A = aA; + angle_B = aB; + angle_C = aC; + if (double check = aA + aB + aC; check != 180) { + do { + cout << "the angles need to add up to 180 degrees to be a real triangle\n" + << "please reenter the sides and make sure the total is 180 degrees.\n" + << "use spaces to seperate each angle esample: 40.5 65 79.5\n>"; + cin >> aA >> aB >> aC; + check = aA + aB + aC; + cin.clear(); + cin.ignore(100, '\n'); + } while (check != 180 || !cin); + } + if (checkAngles() == true) { + solve_by_AAA(aA, aB, aC); + } + //update_triangle(); +} +/*______________________________________________________________________________ + overloaded addition opperators*/ + +inline TriangleSolver TriangleSolver::operator++() +{ + return TriangleSolver{++side_a, ++side_b, ++side_c}; +} + +inline TriangleSolver TriangleSolver::operator++(int) +{ + return TriangleSolver{side_a++,side_b++,side_c++}; +} + +inline TriangleSolver TriangleSolver::operator+(const TriangleSolver& tri)const +{ + return TriangleSolver{side_a+tri.side_a, side_b+tri.side_b,side_c+tri.side_c}; +} + +inline TriangleSolver TriangleSolver::operator+(double n)const +{ + return TriangleSolver{side_a+n,side_b+n,side_c+n}; +} + +inline TriangleSolver& TriangleSolver::operator+=(const TriangleSolver& rhs) +{ + side_a += rhs.side_a; + side_b += rhs.side_b; + side_c += rhs.side_c; + calculate_All_angles(); + return *this; +} +inline TriangleSolver& TriangleSolver::operator+(const TriangleSolver& rhs) +{ + side_a += rhs.side_a; + side_b += rhs.side_b; + side_c += rhs.side_c; + calculate_All_angles(); + return *this; +} +inline TriangleSolver operator+(double num, TriangleSolver& t) +{ + return TriangleSolver{num+t.side_a,num+t.side_b,num+t.side_c}; +} + +inline TriangleSolver operator+(TriangleSolver& v, TriangleSolver& s) +{ + return TriangleSolver{v.side_a+s.side_a,v.side_b+s.side_b,v.side_c+s.side_c}; +} + + +/*______________________________________________________________________________ + overloaded subtraction opperators*/ + +inline TriangleSolver TriangleSolver::operator--() +{ + return TriangleSolver{--side_a, --side_b, --side_c}; +} + +inline TriangleSolver TriangleSolver::operator--(int) +{ + return TriangleSolver{side_a--,side_b--,side_c--}; +} + +inline TriangleSolver TriangleSolver::operator-(const TriangleSolver& tri) const +{ + return TriangleSolver{side_a-tri.side_a, side_b-tri.side_b,side_c-tri.side_c}; +} + +inline TriangleSolver TriangleSolver::operator-(double n) const +{ + return TriangleSolver{side_a-n,side_b-n,side_c-n}; +} + +inline TriangleSolver& TriangleSolver::operator-=(const TriangleSolver& rhs) +{ + side_a -= rhs.side_a; + side_b -= rhs.side_b; + side_c -= rhs.side_c; + calculate_All_angles(); + update_triangle(); + return *this; +} + +inline TriangleSolver operator-(double num, TriangleSolver& t) +{ + return TriangleSolver{num-t.side_a,num-t.side_b,num-t.side_c}; +} + +inline TriangleSolver operator-(TriangleSolver& v, const TriangleSolver& s) +{ + return TriangleSolver{v.side_a-s.side_a,v.side_b-s.side_b,v.side_c-s.side_c}; +} + +/*______________________________________________________________________________ + overloaded division opperators*/ + +inline TriangleSolver TriangleSolver::operator/(double d)const +{ + return TriangleSolver{side_a/d,side_b/d,side_c/d}; +} + +inline TriangleSolver TriangleSolver::operator/(const TriangleSolver& t)const +{ + return TriangleSolver{side_a/t.side_a,side_b/t.side_b,side_c/t.side_c}; +} + +/*______________________________________________________________________________ + overloaded multiplication opperators*/ + +inline TriangleSolver TriangleSolver::operator*(double t) const +{ + return TriangleSolver{side_a*t,side_b*t,side_c*t}; +} + +inline TriangleSolver operator*(double s, TriangleSolver& t) +{ + return TriangleSolver{s*t.side_a,s*t.side_b,s*t.side_c}; +} + +inline TriangleSolver operator*(TriangleSolver& v, TriangleSolver& s) +{ + return TriangleSolver{v.side_a*s.side_a,v.side_b*s.side_b,v.side_c*s.side_c}; +} +inline ostream& operator<<(ostream& os, const TriangleSolver& t) +{ + t.displayTriangleData(); + return os; +} + +inline istream& operator>>(istream& is, TriangleSolver& t) +{ + is >> t.side_a >> t.side_b >> t.side_c; + if (t.checkSides()) + { + t.update_triangle(); + return is; + } + else + { + t.badTriangle(); + } + return is; +} + +template +inline T TriangleSolver::negativeNumCheck(T& num) +{ + if (num > 0) + return 0; + else { + num = negativeNumFix(num); + } + return 0; +} + +template +inline T TriangleSolver::negativeNumFix(T& num) +{ + //double temp; + if (num < 0) { + do { + cout << "You cannot enter a negative value\n:"; + cout << "making it an absolute value instead"; + num = abs(num); + //return num; + cin.ignore(100, '\n'); + cin.clear(); + } while (!cin || num < 0); + return num; + } + return num; } \ No newline at end of file diff --git a/Triangulation.cpp b/Triangulation.cpp index 2086fa4..24cf261 100644 --- a/Triangulation.cpp +++ b/Triangulation.cpp @@ -1,174 +1,174 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// -#include "Triangulation.h" -#include -#include -#include -#include "GeoUtils.h" - -using namespace rez; - -static bool is_in_same_chain(Vertex2dDCEL* a, Vertex2dDCEL* b) -{ - if (a->incident_edge->prev->origin == b || a->incident_edge->next->origin == b) - return true; - return false; -} - -// Vertex should be in a monotone polygon -// a[Y] <= b[Y] -static bool valid_diagonal_DCEL(Vertex2dDCEL* a, Vertex2dDCEL* b) -{ - // TODO this is wrong. have to modify. Here only incode test would be needed. - auto edge = a->incident_edge; - // If the vertices are adjucent we can return. - if (edge->next->origin == b || edge->prev->origin == b) - return false; - - if (a->point[X] <= b->point[X]) { - edge = edge->prev; - while (edge->origin != b) { - if (!left(a->point, b->point, edge->origin->point)) - return false; - edge = edge->prev; - } - } - else { - edge = edge->next; - while (edge->origin != b) { - if (left(a->point, b->point, edge->origin->point)) - return false; - edge = edge->next; - } - } - - return true; -} - -static void triangulate(Polygon2d* poly, std::vector& vertices) -{ - if (vertices.size() == 3) - return; - - std::sort(vertices.begin(), vertices.end(), Vertex2DSortTBLR()); - std::stack vertex_stack; - vertex_stack.push(vertices[0]); - vertex_stack.push(vertices[1]); - - for (size_t i = 2; i < vertices.size() - 1; i++) { - if (!is_in_same_chain(vertices[i], vertex_stack.top())) { - bool popped = false; - Vertex2dDCEL* top = vertex_stack.top(); - - while (!vertex_stack.empty()) { - if (vertex_stack.size() > 1) - poly->split(vertices[i], vertex_stack.top()); - vertex_stack.pop(); - //popped = true; - } - - //if(popped) - if (top) - vertex_stack.push(top); - vertex_stack.push(vertices[i]); - } - else { - Vertex2dDCEL* top_before_ops = vertex_stack.top(); - vertex_stack.pop(); - Vertex2dDCEL* last_vertex_ptr = nullptr; - Vertex2dDCEL* last_diagonal_vert = nullptr; - - //bool diagonal_added = false; - - while (vertex_stack.size() != 0) { - last_vertex_ptr = vertex_stack.top(); - if (valid_diagonal_DCEL(vertices[i], last_vertex_ptr)) { - poly->split(vertices[i], last_vertex_ptr); - last_diagonal_vert = last_vertex_ptr; - } - else { - break; - } - vertex_stack.pop(); - } - - if (last_diagonal_vert) { - vertex_stack.push(last_diagonal_vert); - } - else { - vertex_stack.push(top_before_ops); - } - vertex_stack.push(vertices[i]); - } - } - - if (vertex_stack.size() != 0) - vertex_stack.pop(); - - auto size = vertices.size(); - while (vertex_stack.size() > 1) - { - poly->split(vertices[size - 1], vertex_stack.top()); - vertex_stack.pop(); - } - - vertex_stack.pop(); -} - -void rez::triangulate_monotone(Polygon2d* poly) -{ - std::vector vertices = poly->getVertexList(); - triangulate(poly, vertices); -} - -static void initialize_ear_status(Polygon2dSimple* polygon) -{ - Vertex2dSimple* v0, * v1, * v2; - - auto vertices = polygon->getVertcies(); - v1 = vertices[0]; - do { - v0 = v1->prev; - v2 = v1->next; - v1->is_ear = isDiagonal(v0, v2); - v1 = v1->next; - } while (v1 != vertices[0]); -} - -void rez::triangulate_earclipping(Polygon2dSimple* poly, std::vector& edge_list) { - - initialize_ear_status(poly); - - auto vertex_list = poly->getVertcies(); - int no_vertex_to_process = vertex_list.size(); - - Vertex2dSimple* v0, * v1, * v2, * v3, * v4; - int index = 0; - - while (no_vertex_to_process > 3) { - for (size_t i = 0; i < vertex_list.size(); i++) - { - v2 = vertex_list[i]; - if (v2->is_ear && !v2->is_processed) { - v3 = v2->next; - v4 = v3->next; - v1 = v2->prev; - v0 = v1->prev; - - edge_list.push_back(Edge2dSimple(v1->point, v3->point)); - v2->is_processed = true; - - v1->next = v3; - v3->prev = v1; - - v1->is_ear = isDiagonal(v0, v3, nullptr); - v3->is_ear = isDiagonal(v1, v4, nullptr); - - no_vertex_to_process--; - index++; - break; - } - } - } -} +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// +#include "Triangulation.h" +#include +#include +#include +#include "GeoUtils.h" + +using namespace rez; + +static bool is_in_same_chain(Vertex2dDCEL* a, Vertex2dDCEL* b) +{ + if (a->incident_edge->prev->origin == b || a->incident_edge->next->origin == b) + return true; + return false; +} + +// Vertex should be in a monotone polygon +// a[Y] <= b[Y] +static bool valid_diagonal_DCEL(Vertex2dDCEL* a, Vertex2dDCEL* b) +{ + // TODO this is wrong. have to modify. Here only incode test would be needed. + auto edge = a->incident_edge; + // If the vertices are adjucent we can return. + if (edge->next->origin == b || edge->prev->origin == b) + return false; + + if (a->point[X] <= b->point[X]) { + edge = edge->prev; + while (edge->origin != b) { + if (!left(a->point, b->point, edge->origin->point)) + return false; + edge = edge->prev; + } + } + else { + edge = edge->next; + while (edge->origin != b) { + if (left(a->point, b->point, edge->origin->point)) + return false; + edge = edge->next; + } + } + + return true; +} + +static void triangulate(Polygon2d* poly, std::vector& vertices) +{ + if (vertices.size() == 3) + return; + + std::sort(vertices.begin(), vertices.end(), Vertex2DSortTBLR()); + std::stack vertex_stack; + vertex_stack.push(vertices[0]); + vertex_stack.push(vertices[1]); + + for (size_t i = 2; i < vertices.size() - 1; i++) { + if (!is_in_same_chain(vertices[i], vertex_stack.top())) { + bool popped = false; + Vertex2dDCEL* top = vertex_stack.top(); + + while (!vertex_stack.empty()) { + if (vertex_stack.size() > 1) + poly->split(vertices[i], vertex_stack.top()); + vertex_stack.pop(); + //popped = true; + } + + //if(popped) + if (top) + vertex_stack.push(top); + vertex_stack.push(vertices[i]); + } + else { + Vertex2dDCEL* top_before_ops = vertex_stack.top(); + vertex_stack.pop(); + Vertex2dDCEL* last_vertex_ptr = nullptr; + Vertex2dDCEL* last_diagonal_vert = nullptr; + + //bool diagonal_added = false; + + while (vertex_stack.size() != 0) { + last_vertex_ptr = vertex_stack.top(); + if (valid_diagonal_DCEL(vertices[i], last_vertex_ptr)) { + poly->split(vertices[i], last_vertex_ptr); + last_diagonal_vert = last_vertex_ptr; + } + else { + break; + } + vertex_stack.pop(); + } + + if (last_diagonal_vert) { + vertex_stack.push(last_diagonal_vert); + } + else { + vertex_stack.push(top_before_ops); + } + vertex_stack.push(vertices[i]); + } + } + + if (vertex_stack.size() != 0) + vertex_stack.pop(); + + auto size = vertices.size(); + while (vertex_stack.size() > 1) + { + poly->split(vertices[size - 1], vertex_stack.top()); + vertex_stack.pop(); + } + + vertex_stack.pop(); +} + +void rez::triangulate_monotone(Polygon2d* poly) +{ + std::vector vertices = poly->getVertexList(); + triangulate(poly, vertices); +} + +static void initialize_ear_status(Polygon2dSimple* polygon) +{ + Vertex2dSimple* v0, * v1, * v2; + + auto vertices = polygon->getVertcies(); + v1 = vertices[0]; + do { + v0 = v1->prev; + v2 = v1->next; + v1->is_ear = isDiagonal(v0, v2); + v1 = v1->next; + } while (v1 != vertices[0]); +} + +void rez::triangulate_earclipping(Polygon2dSimple* poly, std::vector& edge_list) { + + initialize_ear_status(poly); + + auto vertex_list = poly->getVertcies(); + int no_vertex_to_process = vertex_list.size(); + + Vertex2dSimple* v0, * v1, * v2, * v3, * v4; + int index = 0; + + while (no_vertex_to_process > 3) { + for (size_t i = 0; i < vertex_list.size(); i++) + { + v2 = vertex_list[i]; + if (v2->is_ear && !v2->is_processed) { + v3 = v2->next; + v4 = v3->next; + v1 = v2->prev; + v0 = v1->prev; + + edge_list.push_back(Edge2dSimple(v1->point, v3->point)); + v2->is_processed = true; + + v1->next = v3; + v3->prev = v1; + + v1->is_ear = isDiagonal(v0, v3, nullptr); + v3->is_ear = isDiagonal(v1, v4, nullptr); + + no_vertex_to_process--; + index++; + break; + } + } + } +} diff --git a/Triangulation.h b/Triangulation.h index 8c85a9c..8520169 100644 --- a/Triangulation.h +++ b/Triangulation.h @@ -1,26 +1,26 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_TRIANGULATION_H -#define PHYSICSFORMULA_TRIANGULATION_H -#include -#include - -#include "Point.h" -#include "PolygonDCEL.h" -#include "MonotonePartition.h" - -namespace rez { - - // triangulate the given polygon using ear clipping method - void triangulate_earclipping(Polygon2dSimple* poly, std::vector& edge_list); - - // Triangulate the given monotone polygon. Result is undefined if the polygon is not monotone - void triangulate_monotone(Polygon2d* poly); - - //// Triangulate the general polygon. - //// Internally first we partition the polygon in to monotone peices and then call the triangulate_monotone - //void triangulate_general(Polygon2d* poly); -} -#endif //PHYSICSFORMULA_TRIANGULATION_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_TRIANGULATION_H +#define PHYSICSFORMULA_TRIANGULATION_H +#include +#include + +#include "Point.h" +#include "PolygonDCEL.h" +#include "MonotonePartition.h" + +namespace rez { + + // triangulate the given polygon using ear clipping method + void triangulate_earclipping(Polygon2dSimple* poly, std::vector& edge_list); + + // Triangulate the given monotone polygon. Result is undefined if the polygon is not monotone + void triangulate_monotone(Polygon2d* poly); + + //// Triangulate the general polygon. + //// Internally first we partition the polygon in to monotone peices and then call the triangulate_monotone + //void triangulate_general(Polygon2d* poly); +} +#endif //PHYSICSFORMULA_TRIANGULATION_H diff --git a/UniformCircularMotion.h b/UniformCircularMotion.h index 75bb654..280abdb 100644 --- a/UniformCircularMotion.h +++ b/UniformCircularMotion.h @@ -1,494 +1,494 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_UNIFORMCIRCULARMOTION_H -#define PHYSICSFORMULA_UNIFORMCIRCULARMOTION_H -// class for doing physics problems -// author: Ryan Zurrin -// last Modified: 2/5/2022 -#include -#include "VectorND.h" -#include "Circle.h" -//constant for the degrees in one radian -constexpr auto _RAD_ = 360.0 / (2.0 * _PI_); -//Gravitational Constant 6.67408(31) * 10^(-11) * N -constexpr auto _Gc_ = 6.674e-11; -//Radius of the earth 6,371km -constexpr auto EARTH_RADIUS = 6.371e6; -//Radius of the sun 6,963km -constexpr auto SUN_RADIUS = 6.963e8; - -static int circularMotion_objectCount = 0; -ld static _masses_[] = { 0.0, 0.0 }; - - - -class UniformCircularMotion -{ - - // pointer for the class object to use - UniformCircularMotion* _circlePtr; - - // radius variable of object - ld _radius_; - - // rotational angle variable of object - ld _rotationAngle_; - - // angular velocity variable of object - ld _angularVelocityW_; - - // linear velocity variable - ld _linearVelocity; - - // arc length variable of object - ld _arcLength_; - - // centripetal acceleration variable of object - ld _centripetalAcceleration_; - - ld _frequency_; - - ld _time_period_; - - // array to hold the value of two masses - - - -public: - - static void countShow() { std::cout << "circular motion count: " << circularMotion_objectCount << std::endl; } - // suppresses default constructor - UniformCircularMotion() - { - _circlePtr = nullptr; - _radius_ = 0.0; - _rotationAngle_ = 0.0; - _angularVelocityW_ = 0.0; - _linearVelocity = 0.0; - _arcLength_ = 0.0; - _centripetalAcceleration_ = 0.0; - _frequency_ = 0.0; - _time_period_ = 0.0; - - countIncrease(); - } - // assignment constructor - UniformCircularMotion(ld radius, ld velocity) - { - _circlePtr = nullptr; - _radius_ = radius; - _angularVelocityW_ = velocity / radius; - _linearVelocity = radius * _angularVelocityW_; - _rotationAngle_ = 0.0; - _arcLength_ = 0.0; - _centripetalAcceleration_ = (velocity * velocity)/(radius); - _time_period_ = 2.0* _PI_ * _radius_ / (radius*_angularVelocityW_); - _frequency_ = 1.0 / _time_period_; - countIncrease(); - } - // overloaded constructor - UniformCircularMotion(ld radius, ld velocity, ld time) - { - _circlePtr = nullptr; - _radius_ = radius; - _angularVelocityW_ = velocity / radius; - _linearVelocity = radius * _angularVelocityW_; - _rotationAngle_ = 0.0; - _arcLength_ = 0.0; - _centripetalAcceleration_ = (velocity * velocity) / (radius); - _frequency_ = radius * (_angularVelocityW_ * _angularVelocityW_); - _time_period_ = time; - countIncrease(); - } - //copy constructor - UniformCircularMotion(const UniformCircularMotion& r) - { - _circlePtr = r._circlePtr; - _angularVelocityW_ = r._angularVelocityW_; - _centripetalAcceleration_ = r._centripetalAcceleration_; - _linearVelocity = r._linearVelocity; - _arcLength_ = r._arcLength_; - _radius_ = r._radius_; - _rotationAngle_ = r._rotationAngle_; - _frequency_ = r._frequency_; - _time_period_ = r._time_period_; - countIncrease(); - //countShow(); - } - //copy assignment operator - UniformCircularMotion& operator=(UniformCircularMotion&& r) noexcept - { - if (this != &r) - { - _circlePtr = r._circlePtr; - _centripetalAcceleration_ = r._centripetalAcceleration_; - _angularVelocityW_ = r._angularVelocityW_; - _linearVelocity = r._linearVelocity; - _arcLength_ = r._arcLength_; - _radius_ = r._radius_; - _rotationAngle_ = r._rotationAngle_; - _frequency_ = r._frequency_; - _time_period_ = r._time_period_; - countIncrease(); - - } - return *this; - } - /*=================================================================== - * setters - */ - void set_radius_(const ld r) { _radius_ = r; } - void set_rotationalAngle_(const ld ra) { - _rotationAngle_ = ra; - _arcLength_ = _radius_ * _rotationAngle_ * _RAD_; - } - void set_angularVelocityW_(const ld av) { _angularVelocityW_ = av; } - void set_linearVelocity_(const ld lv) { _linearVelocity = lv; } - void set_arcLength_(const ld al) { - _arcLength_ = al; - _rotationAngle_ = _arcLength_ / (_radius_ * _RAD_); - } - void set_centripetalAcceleration_(const ld ca) { _centripetalAcceleration_ = ca; } - void set_frequency_(const ld f) { _frequency_ = f; } - void set_time_period_(const ld tp) { _time_period_ = tp; } - - /*=================================================================== - * getters - */ - ld get_radius()const { return _radius_; } - ld get_rotationalAngle()const { return _rotationAngle_; } - ld get_angularVelocityW()const { return _angularVelocityW_; } - ld get_linearVelocity()const { return _linearVelocity; } - ld get_arcLength()const { return _arcLength_; } - ld get_centripetalAcceleration()const { return _centripetalAcceleration_; } - ld get_frequency()const { return _frequency_; } - ld get_time_period()const { return _time_period_; } - - /*=================================================================== - * display methods - */ - void show_radius()const { cout << "radius: " << _radius_ << "m" < - void static show_array(const T(&array)[size]) - { - for (size_t i = 0; i < size; i++) - cout << array[i] << " "; - - cout << endl; - } - - /** - * @brief Global Positioning System (GPS) satellites circle Earth at altitudes of - * approximately oH, where the gravitational acceleration has pL (%) of its surface - * value. To the nearest hour, what's the orbital period of the GPS satellites?\n - * fx = (2 * PI * sqrt(oH_ / (_Ga_ * pL_))) / 3600 - * @param oH is the altitude of the satellite in meters - * @param pL is the percentage of the surface gravity of the earth - * @returns the orbital period in hours - */ - ld static orbit_time_earth_satellite(ld oH, ld pL, ld planetRadius = EARTH_RADIUS) - { - // turn the percentage into a decimal - ld pL_ = pL / 100.0; - // add the radius of the earth to the altitude - ld oH_ = oH + planetRadius; - return (2 * PI * sqrt(oH_ / (_Ga_ * pL_))) / 3600; - } - /** - * @brief Calculates the frequency from a known period time - * @param period is the period of the wave in seconds - * @return the frequency in hertz - */ - ld static calculate_frequency(const ld period) - { - return 1.0 / period; - } - /** - * @brief Calculates the period from a known frequency - * @param frequency is the frequency of the wave in hertz - * @return the period in seconds - */ - ld static calculate_period(const ld frequency) - { - return 1.0 / frequency; - } - - /** - * @brief Pilots of high-performance aircraft risk loss of consciousness if they - * undergo accelerations exceeding about Xg's. For a jet flying at a speed of - * v0 (L/T), what's the minimum radius for a turn that will keep the - * acceleration below Xg's? - * fx = pow(v0, ) / (Xg * _G_) - * @param v0 is the speed of the aircraft in meters per second - * @param Xg is the acceleration in meters per second squared - * @returns the minimum radius in meters - */ - ld static minimum_turn_radius(const ld v0, const ld Xg) { - // r = v0^2 / Xg*gravity - return pow(v0, 2) / (Xg * _G_); - } - - - ~UniformCircularMotion() { - delete _circlePtr; - countDecrease(); - }; - -private: - static void countIncrease() { circularMotion_objectCount += 1; } - static void countDecrease() { circularMotion_objectCount -= 1; } - -}; -#endif //PHYSICSFORMULA_UNIFORMCIRCULARMOTION_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_UNIFORMCIRCULARMOTION_H +#define PHYSICSFORMULA_UNIFORMCIRCULARMOTION_H +// class for doing physics problems +// author: Ryan Zurrin +// last Modified: 2/5/2022 +#include +#include "VectorND.h" +#include "Circle.h" +//constant for the degrees in one radian +constexpr auto _RAD_ = 360.0 / (2.0 * _PI_); +//Gravitational Constant 6.67408(31) * 10^(-11) * N +constexpr auto _Gc_ = 6.674e-11; +//Radius of the earth 6,371km +constexpr auto EARTH_RADIUS = 6.371e6; +//Radius of the sun 6,963km +constexpr auto SUN_RADIUS = 6.963e8; + +static int circularMotion_objectCount = 0; +ld static _masses_[] = { 0.0, 0.0 }; + + + +class UniformCircularMotion +{ + + // pointer for the class object to use + UniformCircularMotion* _circlePtr; + + // radius variable of object + ld _radius_; + + // rotational angle variable of object + ld _rotationAngle_; + + // angular velocity variable of object + ld _angularVelocityW_; + + // linear velocity variable + ld _linearVelocity; + + // arc length variable of object + ld _arcLength_; + + // centripetal acceleration variable of object + ld _centripetalAcceleration_; + + ld _frequency_; + + ld _time_period_; + + // array to hold the value of two masses + + + +public: + + static void countShow() { std::cout << "circular motion count: " << circularMotion_objectCount << std::endl; } + // suppresses default constructor + UniformCircularMotion() + { + _circlePtr = nullptr; + _radius_ = 0.0; + _rotationAngle_ = 0.0; + _angularVelocityW_ = 0.0; + _linearVelocity = 0.0; + _arcLength_ = 0.0; + _centripetalAcceleration_ = 0.0; + _frequency_ = 0.0; + _time_period_ = 0.0; + + countIncrease(); + } + // assignment constructor + UniformCircularMotion(ld radius, ld velocity) + { + _circlePtr = nullptr; + _radius_ = radius; + _angularVelocityW_ = velocity / radius; + _linearVelocity = radius * _angularVelocityW_; + _rotationAngle_ = 0.0; + _arcLength_ = 0.0; + _centripetalAcceleration_ = (velocity * velocity)/(radius); + _time_period_ = 2.0* _PI_ * _radius_ / (radius*_angularVelocityW_); + _frequency_ = 1.0 / _time_period_; + countIncrease(); + } + // overloaded constructor + UniformCircularMotion(ld radius, ld velocity, ld time) + { + _circlePtr = nullptr; + _radius_ = radius; + _angularVelocityW_ = velocity / radius; + _linearVelocity = radius * _angularVelocityW_; + _rotationAngle_ = 0.0; + _arcLength_ = 0.0; + _centripetalAcceleration_ = (velocity * velocity) / (radius); + _frequency_ = radius * (_angularVelocityW_ * _angularVelocityW_); + _time_period_ = time; + countIncrease(); + } + //copy constructor + UniformCircularMotion(const UniformCircularMotion& r) + { + _circlePtr = r._circlePtr; + _angularVelocityW_ = r._angularVelocityW_; + _centripetalAcceleration_ = r._centripetalAcceleration_; + _linearVelocity = r._linearVelocity; + _arcLength_ = r._arcLength_; + _radius_ = r._radius_; + _rotationAngle_ = r._rotationAngle_; + _frequency_ = r._frequency_; + _time_period_ = r._time_period_; + countIncrease(); + //countShow(); + } + //copy assignment operator + UniformCircularMotion& operator=(UniformCircularMotion&& r) noexcept + { + if (this != &r) + { + _circlePtr = r._circlePtr; + _centripetalAcceleration_ = r._centripetalAcceleration_; + _angularVelocityW_ = r._angularVelocityW_; + _linearVelocity = r._linearVelocity; + _arcLength_ = r._arcLength_; + _radius_ = r._radius_; + _rotationAngle_ = r._rotationAngle_; + _frequency_ = r._frequency_; + _time_period_ = r._time_period_; + countIncrease(); + + } + return *this; + } + /*=================================================================== + * setters + */ + void set_radius_(const ld r) { _radius_ = r; } + void set_rotationalAngle_(const ld ra) { + _rotationAngle_ = ra; + _arcLength_ = _radius_ * _rotationAngle_ * _RAD_; + } + void set_angularVelocityW_(const ld av) { _angularVelocityW_ = av; } + void set_linearVelocity_(const ld lv) { _linearVelocity = lv; } + void set_arcLength_(const ld al) { + _arcLength_ = al; + _rotationAngle_ = _arcLength_ / (_radius_ * _RAD_); + } + void set_centripetalAcceleration_(const ld ca) { _centripetalAcceleration_ = ca; } + void set_frequency_(const ld f) { _frequency_ = f; } + void set_time_period_(const ld tp) { _time_period_ = tp; } + + /*=================================================================== + * getters + */ + ld get_radius()const { return _radius_; } + ld get_rotationalAngle()const { return _rotationAngle_; } + ld get_angularVelocityW()const { return _angularVelocityW_; } + ld get_linearVelocity()const { return _linearVelocity; } + ld get_arcLength()const { return _arcLength_; } + ld get_centripetalAcceleration()const { return _centripetalAcceleration_; } + ld get_frequency()const { return _frequency_; } + ld get_time_period()const { return _time_period_; } + + /*=================================================================== + * display methods + */ + void show_radius()const { cout << "radius: " << _radius_ << "m" < + void static show_array(const T(&array)[size]) + { + for (size_t i = 0; i < size; i++) + cout << array[i] << " "; + + cout << endl; + } + + /** + * @brief Global Positioning System (GPS) satellites circle Earth at altitudes of + * approximately oH, where the gravitational acceleration has pL (%) of its surface + * value. To the nearest hour, what's the orbital period of the GPS satellites?\n + * fx = (2 * PI * sqrt(oH_ / (_Ga_ * pL_))) / 3600 + * @param oH is the altitude of the satellite in meters + * @param pL is the percentage of the surface gravity of the earth + * @returns the orbital period in hours + */ + ld static orbit_time_earth_satellite(ld oH, ld pL, ld planetRadius = EARTH_RADIUS) + { + // turn the percentage into a decimal + ld pL_ = pL / 100.0; + // add the radius of the earth to the altitude + ld oH_ = oH + planetRadius; + return (2 * PI * sqrt(oH_ / (_Ga_ * pL_))) / 3600; + } + /** + * @brief Calculates the frequency from a known period time + * @param period is the period of the wave in seconds + * @return the frequency in hertz + */ + ld static calculate_frequency(const ld period) + { + return 1.0 / period; + } + /** + * @brief Calculates the period from a known frequency + * @param frequency is the frequency of the wave in hertz + * @return the period in seconds + */ + ld static calculate_period(const ld frequency) + { + return 1.0 / frequency; + } + + /** + * @brief Pilots of high-performance aircraft risk loss of consciousness if they + * undergo accelerations exceeding about Xg's. For a jet flying at a speed of + * v0 (L/T), what's the minimum radius for a turn that will keep the + * acceleration below Xg's? + * fx = pow(v0, ) / (Xg * _G_) + * @param v0 is the speed of the aircraft in meters per second + * @param Xg is the acceleration in meters per second squared + * @returns the minimum radius in meters + */ + ld static minimum_turn_radius(const ld v0, const ld Xg) { + // r = v0^2 / Xg*gravity + return pow(v0, 2) / (Xg * _G_); + } + + + ~UniformCircularMotion() { + delete _circlePtr; + countDecrease(); + }; + +private: + static void countIncrease() { circularMotion_objectCount += 1; } + static void countDecrease() { circularMotion_objectCount -= 1; } + +}; +#endif //PHYSICSFORMULA_UNIFORMCIRCULARMOTION_H diff --git a/Vector.cpp b/Vector.cpp index e9ea72b..db4302c 100644 --- a/Vector.cpp +++ b/Vector.cpp @@ -1,50 +1,50 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#include "Vector.h" - -//template -//float jmk::dotProduct(Vector& v1, Vector& v2) -//{ -// if (v1.coords.size() != v2.coords.size()) -// return FLT_MIN; -// -// float product = 0; -// for (int i = 0; i < v1.coords.size(); i++) -// product = product + v1[i] * v2[i]; -// return product; -//} - -rez::Vector3f rez::crossProduct3d(Vector3f a, Vector3f b) -{ - float x_, y_, z_; - x_ = a[Y] * b[Z] - b[Y] * a[Z]; - y_ = -(b[Z] * a[X] - a[Z] * b[X]); - z_ = a[X] * b[Y] - b[X] * a[Y]; - - return Vector3f(x_, y_, z_); -} - -float rez::corssProduct2d(Vector2f a, Vector2f b) -{ - return 0.0f; -} - -float rez::scalerTripleProduct(Vector3f a, Vector3f b, Vector3f c) -{ - Vector3f b_cross_c = crossProduct3d(b, c); - float value = dotProduct(a, b_cross_c); - return value; -} - -bool rez::orthogonal(Vector3f a, Vector3f b) -{ - float value = dotProduct(a, b); - return isEqualD(value, 0.0); -} - -rez::Vector2f rez::prependicluar(Vector2f& vec) -{ - return Vector2f(vec[Y], -vec[X]); +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#include "Vector.h" + +//template +//float jmk::dotProduct(Vector& v1, Vector& v2) +//{ +// if (v1.coords.size() != v2.coords.size()) +// return FLT_MIN; +// +// float product = 0; +// for (int i = 0; i < v1.coords.size(); i++) +// product = product + v1[i] * v2[i]; +// return product; +//} + +rez::Vector3f rez::crossProduct3d(Vector3f a, Vector3f b) +{ + float x_, y_, z_; + x_ = a[Y] * b[Z] - b[Y] * a[Z]; + y_ = -(b[Z] * a[X] - a[Z] * b[X]); + z_ = a[X] * b[Y] - b[X] * a[Y]; + + return Vector3f(x_, y_, z_); +} + +float rez::corssProduct2d(Vector2f a, Vector2f b) +{ + return 0.0f; +} + +float rez::scalerTripleProduct(Vector3f a, Vector3f b, Vector3f c) +{ + Vector3f b_cross_c = crossProduct3d(b, c); + float value = dotProduct(a, b_cross_c); + return value; +} + +bool rez::orthogonal(Vector3f a, Vector3f b) +{ + float value = dotProduct(a, b); + return isEqualD(value, 0.0); +} + +rez::Vector2f rez::prependicluar(Vector2f& vec) +{ + return Vector2f(vec[Y], -vec[X]); } \ No newline at end of file diff --git a/Vector.h b/Vector.h index a36d209..eec4b98 100644 --- a/Vector.h +++ b/Vector.h @@ -1,255 +1,255 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_VECTOR_H -#define PHYSICSFORMULA_VECTOR_H -#include -#include -#include "Core.h" -#include -namespace rez -{ -#define DIM2 2 -#define DIM3 3 - -#define X 0 -#define Y 1 -#define Z 2 - - template - class Vector - { - static_assert(std::is_arithmetic_v, "Vector class can only store integral or floating points values"); - static_assert(dimensions >= DIM2, "Vector dimension atleast should be 2D"); - - - - template - friend float dotProduct(const Vector& v1, const Vector& v2); - - public: - std::array coords = {}; - - bool is_normalized = false; - Vector() {} - - Vector(std::array _coords) : coords(_coords) {} - - Vector(coordinate_type _x, coordinate_type _y, coordinate_type _z) : coords({ _x,_y,_z }) {} - - Vector(coordinate_type _x, coordinate_type _y) : coords({ _x,_y }) {} - - //Vector(const Vector&); - - // Eqality check - bool operator==(const Vector&) const; - - // Not equal check operator - bool operator!=(const Vector&) const; - - // Less than operator for comparison - bool operator<(const Vector&) const; - - // Greater than operator for comparison - bool operator>(const Vector&) const; - - Vector operator*(coordinate_type value); - - // Substraction operator. Substract x and y component separately. - Vector operator-(const Vector&) const; - - // Greater than operator for comparison - Vector operator+(const Vector&) const; - - //TODO make this to modifiable - coordinate_type operator[](const unsigned int) const; - - // Dot product - float dot(Vector& v1, Vector& v2); - - // Cross product - Vector cross(const Vector&); - - void assign(const unsigned int dim, coordinate_type value); - - // Return the magnitude of the the vector (mod(A) / |A|) - float magnitude() const; - - // Normalize the vector - void normalize(); - - // Returns the underline array object - std::array data(); - - template - friend std::ostream& operator<<(std::ostream& os, const Vector& rhs); - }; - - typedef Vector Vector2f; - typedef Vector Vector3f; - - template - std::ostream& operator<<(std::ostream& os, const Vector& rhs) - { - os << "the vector is < "; - for (int i = 0; i < dimensions; i++) - { - os << rhs.coords[i] << " "; - } - os << "> \n"; - - return os; - } - - template - inline bool Vector::operator==(const Vector& _other) const - { - for (int i = 0; i < dimensions; i++) - { - if (!isEqualD(coords[i], _other.coords[i])) - return false; - } - return true; - } - - - template - inline bool Vector::operator!=(const Vector& _other) const - { - return !(*this == _other); - } - - - template - inline bool Vector::operator<(const Vector& _other) const - { - for (size_t i = 0; i < dimensions; i++) - { - if (this->coords[i] < _other.coords[i]) - return true; - else if (this->coords[i] > _other.coords[i]) - return false; - } - - return false; - } - - - template - inline bool Vector::operator>(const Vector& _other) const - { - if (*this == _other) - return false; - return !(*this < _other); - } - - template - inline Vector Vector::operator*(coordinate_type value) - { - std::array temp_array; - - for (int i = 0; i < dimensions; i++) - temp_array[i] = coords[i] * value; - - return Vector(temp_array); - } - - - template - inline Vector Vector::operator-(const Vector& _other) const - { - std::array temp_array; - - for (int i = 0; i < dimensions; i++) - temp_array[i] = coords[i] - _other.coords[i]; - - return Vector(temp_array); - } - - - template - inline Vector Vector::operator+(const Vector& _other) const - { - std::array temp_array; - - for (int i = 0; i < dimensions; i++) - temp_array[i] = coords[i] + _other.coords[i]; - - return Vector(temp_array); - } - - - template - inline coordinate_type Vector::operator[](const unsigned int _index) const - { - if (_index >= coords.size()) { - std::cout << "Index out of bounds"; - return coordinate_type(); - } - - return coords[_index]; - } - - - template - inline void Vector::assign(const unsigned int _index, coordinate_type value) - { - if (_index >= coords.size()) { - std::cout << "Index out of bounds"; - } - - coords[_index] = value; - } - - template - inline float Vector::magnitude() const - { - float value = 0.0f; - for (int i = 0; i < dimensions; i++) - value += pow(coords[i], 2.0); - - return sqrt(value); - } - - - template - inline void Vector::normalize() - { - auto mag = magnitude(); - for (int i = 0; i < dimensions; i++) - assign(i, coords[i] / mag); - } - - - template - inline std::array Vector::data() - { - return std::array(); - } - - - template - float dotProduct(const Vector& v1, const Vector& v2) - { - if (v1.coords.size() != v2.coords.size()) - return FLT_MIN; - - float product = 0; - for (size_t i = 0; i < v1.coords.size(); i++) - product = product + v1[i] * v2[i]; - return product; - } - - Vector3f crossProduct3d(Vector3f a, Vector3f b); - - float corssProduct2d(Vector2f a, Vector2f b); - - Vector2f prependicluar(Vector2f&); - - float scalerTripleProduct(Vector3f a, Vector3f b, Vector3f c); - - bool orthogonal(Vector3f a, Vector3f b); - -} -#endif //PHYSICSFORMULA_VECTOR_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_VECTOR_H +#define PHYSICSFORMULA_VECTOR_H +#include +#include +#include "Core.h" +#include +namespace rez +{ +#define DIM2 2 +#define DIM3 3 + +#define X 0 +#define Y 1 +#define Z 2 + + template + class Vector + { + static_assert(std::is_arithmetic_v, "Vector class can only store integral or floating points values"); + static_assert(dimensions >= DIM2, "Vector dimension atleast should be 2D"); + + + + template + friend float dotProduct(const Vector& v1, const Vector& v2); + + public: + std::array coords = {}; + + bool is_normalized = false; + Vector() {} + + Vector(std::array _coords) : coords(_coords) {} + + Vector(coordinate_type _x, coordinate_type _y, coordinate_type _z) : coords({ _x,_y,_z }) {} + + Vector(coordinate_type _x, coordinate_type _y) : coords({ _x,_y }) {} + + //Vector(const Vector&); + + // Eqality check + bool operator==(const Vector&) const; + + // Not equal check operator + bool operator!=(const Vector&) const; + + // Less than operator for comparison + bool operator<(const Vector&) const; + + // Greater than operator for comparison + bool operator>(const Vector&) const; + + Vector operator*(coordinate_type value); + + // Substraction operator. Substract x and y component separately. + Vector operator-(const Vector&) const; + + // Greater than operator for comparison + Vector operator+(const Vector&) const; + + //TODO make this to modifiable + coordinate_type operator[](const unsigned int) const; + + // Dot product + float dot(Vector& v1, Vector& v2); + + // Cross product + Vector cross(const Vector&); + + void assign(const unsigned int dim, coordinate_type value); + + // Return the magnitude of the the vector (mod(A) / |A|) + float magnitude() const; + + // Normalize the vector + void normalize(); + + // Returns the underline array object + std::array data(); + + template + friend std::ostream& operator<<(std::ostream& os, const Vector& rhs); + }; + + typedef Vector Vector2f; + typedef Vector Vector3f; + + template + std::ostream& operator<<(std::ostream& os, const Vector& rhs) + { + os << "the vector is < "; + for (int i = 0; i < dimensions; i++) + { + os << rhs.coords[i] << " "; + } + os << "> \n"; + + return os; + } + + template + inline bool Vector::operator==(const Vector& _other) const + { + for (int i = 0; i < dimensions; i++) + { + if (!isEqualD(coords[i], _other.coords[i])) + return false; + } + return true; + } + + + template + inline bool Vector::operator!=(const Vector& _other) const + { + return !(*this == _other); + } + + + template + inline bool Vector::operator<(const Vector& _other) const + { + for (size_t i = 0; i < dimensions; i++) + { + if (this->coords[i] < _other.coords[i]) + return true; + else if (this->coords[i] > _other.coords[i]) + return false; + } + + return false; + } + + + template + inline bool Vector::operator>(const Vector& _other) const + { + if (*this == _other) + return false; + return !(*this < _other); + } + + template + inline Vector Vector::operator*(coordinate_type value) + { + std::array temp_array; + + for (int i = 0; i < dimensions; i++) + temp_array[i] = coords[i] * value; + + return Vector(temp_array); + } + + + template + inline Vector Vector::operator-(const Vector& _other) const + { + std::array temp_array; + + for (int i = 0; i < dimensions; i++) + temp_array[i] = coords[i] - _other.coords[i]; + + return Vector(temp_array); + } + + + template + inline Vector Vector::operator+(const Vector& _other) const + { + std::array temp_array; + + for (int i = 0; i < dimensions; i++) + temp_array[i] = coords[i] + _other.coords[i]; + + return Vector(temp_array); + } + + + template + inline coordinate_type Vector::operator[](const unsigned int _index) const + { + if (_index >= coords.size()) { + std::cout << "Index out of bounds"; + return coordinate_type(); + } + + return coords[_index]; + } + + + template + inline void Vector::assign(const unsigned int _index, coordinate_type value) + { + if (_index >= coords.size()) { + std::cout << "Index out of bounds"; + } + + coords[_index] = value; + } + + template + inline float Vector::magnitude() const + { + float value = 0.0f; + for (int i = 0; i < dimensions; i++) + value += pow(coords[i], 2.0); + + return sqrt(value); + } + + + template + inline void Vector::normalize() + { + auto mag = magnitude(); + for (int i = 0; i < dimensions; i++) + assign(i, coords[i] / mag); + } + + + template + inline std::array Vector::data() + { + return std::array(); + } + + + template + float dotProduct(const Vector& v1, const Vector& v2) + { + if (v1.coords.size() != v2.coords.size()) + return FLT_MIN; + + float product = 0; + for (size_t i = 0; i < v1.coords.size(); i++) + product = product + v1[i] * v2[i]; + return product; + } + + Vector3f crossProduct3d(Vector3f a, Vector3f b); + + float corssProduct2d(Vector2f a, Vector2f b); + + Vector2f prependicluar(Vector2f&); + + float scalerTripleProduct(Vector3f a, Vector3f b, Vector3f c); + + bool orthogonal(Vector3f a, Vector3f b); + +} +#endif //PHYSICSFORMULA_VECTOR_H diff --git a/Vector2D.h b/Vector2D.h index 31a79d9..f71a2f0 100644 --- a/Vector2D.h +++ b/Vector2D.h @@ -1,774 +1,774 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_VECTOR2D_H -#define PHYSICSFORMULA_VECTOR2D_H -/** - * @class Vector2D - * @details class for operating with 2D vectors - * @author Ryan Zurrin - * dateBuilt 11/22/2020 - * lastEdit 2/5/2022 - */ -#ifndef Vector2D_H -#define Vector2D_H - -#include -#include -#include -#include -#include - -using namespace std; - - -constexpr auto _PI_ = 3.141592653589793238462643383; -constexpr auto DEGREE = 180/_PI_; -constexpr auto RADIAN = _PI_/180; -constexpr auto _Ga_ = 9.81; -static int vec2d_object_counter = 0; - -class Vector2D -{ - friend class Vector3D; - string ID; - long double x; - long double y; - long double magnitude; - long double angle; - long double arcLength; - long double revolutionAngle_inDegrees; - static void countShow() { std::cout << "Vector2D count: " - << vec2d_object_counter << std::endl; } - //void calculate_parametric_equation(); - void validate_setMode(); - void calculate_magnitude(); - void calculate_angle(); - void adjust_angle(); - void calculate_rectangular(); - void calculate_polar(); - void calculate_arcLength(); - static void countIncrease() { vec2d_object_counter += 1; } - static void countDecrease() { vec2d_object_counter -= 1; } - -public: - char mode; //sets mode to Polar w/ 'p' or Rectangular w/ 'r' - Vector2D(string id = ""); //default constructor - Vector2D(char, string id = "");//mode select, defaults to 0, in rectangular, constructor - Vector2D(long double, long double, char _mode = 'r', string id = ""); //constructor takes both coordinates and mode - Vector2D(const Vector2D &, string id = ""); //copy constructor - virtual void displayAllData(const std::string& label = "")const; //virtual so any derived classes must redefine - virtual void display(const std::string& label = "")const; - virtual void showUnitVector(const std::string& label = "")const; - virtual void showRectCord(const std::string& label = "")const; - void showPolarCord(const std::string& label = "")const; - void showRevolutionAngle(const std::string& label = "")const; - void show_x()const; - void show_y()const; - void show_mag()const; - void show_angle()const; - void show_mode()const; - void show_arcLength()const; - std::string getID() const { return ID; } - long double getX()const; - long double getY()const; - virtual long double return_mag()const; - virtual long double return_angle()const; - virtual long double return_arcLength()const; - virtual char return_mode()const; - static int return_objectCount(){return vec2d_object_counter;} - void set_coordinates(long double, long double, char _mode = 'r'); - void set_rectCord(long double, long double); - void set_polarCord(long double, long double); - void set_x(long double); - void set_y(long double); - void set_mag(long double); - void set_mode(char); - Vector2D projection(Vector2D& v); - Vector2D projection(Vector2D&)const; - long double angle_between_vectors(Vector2D&)const; - /// - /// Distance from a point(vector head) to a line is equal to length of the - /// perpendicular distance from the point to the line. If Ax + By + C = 0, - /// 2D line equation, then distance between point V(x, y) and line can be - /// found using the following formula d = (|a·x + b·y + c|)/(√a^2 + b^2) - /// - /// coefficient a in ax + by + c = 0. - /// coefficient b in ax + by + c = 0. - /// coefficient c in ax + by + c = 0. - /// distance from the vector head to line with given equations - /// coefficients - template - long double distance_to_line(T a, T b, T c); - virtual long double square() const; //gives square olong double the Vector2D - virtual long double find_magnitude() const; //magnitude olong double the Vector2D - [[nodiscard]] long double dot_product(const Vector2D&)const; //scalar dot_product - [[nodiscard]] long double distance(const Vector2D&)const; //gives distance between two Vector2Ds - [[nodiscard]] long double cross_product(const Vector2D&)const; //cross_product - Vector2D normalize_Vector2D(); //normalized Vector2D - Vector2D getUnitVector()const; - bool isOrthogonalWith(Vector2D& v)const; - void typeOfAngleBetween(const Vector2D& v)const; - static void show_objectCount() { std::cout << "\n vector2D object count: " - << vec2d_object_counter << std::endl; } - static int get_objectCount() { return vec2d_object_counter; } - bool operator>(const Vector2D &)const; - bool operator>=(const Vector2D&)const; - bool operator<(const Vector2D &)const; - bool operator<=(const Vector2D&)const; - bool operator==(const Vector2D &)const; - bool operator!=(const Vector2D&)const; - bool operator>(const long double& n)const { return magnitude > n; } - bool operator>=(const long double& n)const { return magnitude >= n; } - bool operator<(const long double& n)const { return magnitude < n; } - bool operator<=(const long double& n)const { return magnitude <= n; } - bool operator==(const long double& n)const { return magnitude == n; } - bool operator!=(const long double& n)const { return !(magnitude == n); } - - Vector2D operator+(const Vector2D &)const; - Vector2D operator+(long double number)const; - Vector2D &operator+=(const Vector2D &); - Vector2D operator+()const; - Vector2D operator++(); - Vector2D operator++(int); - Vector2D operator-(const Vector2D&) const; - Vector2D operator-(const long double number)const; - Vector2D operator-()const; - Vector2D operator--(); - Vector2D operator--(int); - Vector2D& operator=(const Vector2D &); - Vector2D &operator=(const Vector2D *); - Vector2D &operator=(Vector2D&& right)noexcept; - Vector2D(Vector2D&& temp)noexcept; - - Vector2D operator*(long double)const; - - friend Vector2D operator*(long double s, Vector2D& v); - friend Vector2D operator*(Vector2D& v, Vector2D& s); - friend Vector2D operator-(long double s, Vector2D& v); - friend Vector2D operator+(long double s, Vector2D& v); - friend ostream& operator<<(ostream&, const Vector2D&); - friend istream& operator>>(istream&, Vector2D&); - - virtual ~Vector2D(); - - -}; -#endif -//============================================================================= -//in-line class Implementation - -inline Vector2D::Vector2D(string id) -{ - x = static_cast(0.0); - y = static_cast(0.0); - magnitude = static_cast( 0.0); - angle = static_cast(0.0); - calculate_arcLength(); - arcLength = static_cast(0.0); - revolutionAngle_inDegrees = static_cast(0.0); - mode = 'r'; - validate_setMode(); - countIncrease(); - if (id == "") - { - ID = "vec2d_" + std::to_string(vec2d_object_counter); - } - else - { - ID = id; - } - //countShow(); -} - -inline Vector2D::Vector2D(char _mode, string id) -{ - x = static_cast(0.0); - y = static_cast(0.0); - magnitude = static_cast( 0.0); - angle = static_cast(0.0); - calculate_arcLength(); - revolutionAngle_inDegrees = 0; - mode = _mode; - validate_setMode(); - countIncrease(); - if (id == "") - { - ID = "vec2d_" + std::to_string(vec2d_object_counter); - } - else - { - ID = id; - } - //countShow(); -} -/*______________________________________________________________________________ - the third argument is the mode setting. - Use 'r'/'R' for rectangular components, 'p'/'P' for polar components -*/ -inline Vector2D::Vector2D(long double xMag, long double yAng, char _mode, string id) -{ - revolutionAngle_inDegrees = static_cast(0.0); - ID = id; - magnitude = static_cast(0.0); - angle = static_cast(0.0); - mode = _mode; - validate_setMode(); - x = xMag; - y = yAng; - set_coordinates(x, y, _mode); - countIncrease(); - if (id == "") - { - ID = "vec2d_" + std::to_string(vec2d_object_counter); - } - else - { - ID = id; - } - - -} -inline Vector2D::Vector2D(const Vector2D &v, string id) -{ - - ID = id; - revolutionAngle_inDegrees = v.revolutionAngle_inDegrees; - magnitude = v.magnitude; - angle = v.angle; - mode = v.mode; - validate_setMode(); - x = v.x; - y = v.y; - set_coordinates(x, y, mode); - countIncrease(); - if (id == "") - { - ID = "vec2d_" + std::to_string(vec2d_object_counter); - } - else - { - ID = id; - } -} -inline void Vector2D::displayAllData(const std::string& label)const -{ - std::cout << ((label.empty()) ? ID : label) << ":"; - showUnitVector(label); - showRectCord(label); - showPolarCord(label); - showRevolutionAngle(label); - show_arcLength(); - std::cout << std::endl; -} -inline void Vector2D::display(const std::string& label)const -{ - if (mode == 'r' || mode == 'R') { - showRectCord(label); - } - else { - showPolarCord(label); - } -} - -void Vector2D::showUnitVector(const std::string& label)const { - // display as a unit vector with ihat and jhat - std::cout << ((label.empty()) ? ID : label) << ":"; - std::cout << 1.0/magnitude << "*" << "(" << x << "i ," << y << "j)"; -} - -inline void Vector2D::showRectCord(const std::string& label)const -{ - cout << setprecision(6); - cout<< "\n" <<((label.empty()) ? ID : label) << ":(x,y) = "; - if(x < 0 && x > -1 ){ - cout << setiosflags(ios::fixed); - cout << fixed << "(" << x << "," - << resetiosflags(ios::fixed); - } - else{ - cout << "(" << x << ","; - } - if(y<0 && y>-1){ - cout << setiosflags(ios::fixed); - cout << y << ")" <= 0 && angle >= 0){ - cout << ": = <" << magnitude << "," << angle << ">"; - } - else{ - cout << setiosflags(ios::fixed); - cout << ": = <" << magnitude << "," << angle << ">"; - cout << resetiosflags(ios::fixed) << endl; - } -} -inline void Vector2D::showRevolutionAngle(const std::string& label)const -{ - cout<< "\n" << ((label.empty()) ? ID : label) << ":rev\xE9\xF8 = " - << revolutionAngle_inDegrees <<"\xF8"; -} -inline void Vector2D::show_x() const -{ - cout << "\nx: " << x << endl; -} -inline void Vector2D::show_y() const -{ - cout << "\ny: " << y << endl; -} -inline void Vector2D::show_mag() const -{ - cout << "\nr: " << magnitude << endl; -} -inline void Vector2D::show_angle() const -{ - cout << "\n\xE9: " << angle << "\xF8" << endl; -} -inline void Vector2D::show_mode()const -{ - if (mode == 'p' || mode == 'P') { - cout << "\nmode: Polar" << endl; - } - else - cout << "\nmode: Rectangular" << endl; -} -inline void Vector2D::show_arcLength() const -{ - cout << setprecision(4); - cout << "\narc length: " << arcLength << endl; -} -inline long double Vector2D::getX() const -{ - return x; -} -inline long double Vector2D::getY()const -{ - return y; -} -inline long double Vector2D::return_mag()const -{ - return magnitude; -} -inline long double Vector2D::return_angle()const -{ - return angle; -} -inline long double Vector2D::return_arcLength() const -{ - return arcLength; -} -inline char Vector2D::return_mode()const -{ - return mode; -} -/** - *method: set_coordinates(long double xMag, long double yAng, char _mode) -* arguments: x, y mode = 'r' or 'p' .by default is 'r'ectangular, 'p'= polar. -* Use 'r'/'R' for rectangular components, 'p'/'P' for polar components -*/ -inline void Vector2D::set_coordinates(long double xMag, long double yAng, char _mode) -{ - validate_setMode(); - - if (tolower(_mode) == 'r') { - set_rectCord(xMag, yAng); - } - else{ - set_polarCord(static_cast(xMag), yAng); - } - calculate_angle(); - adjust_angle(); - calculate_arcLength(); -} -inline void Vector2D::set_rectCord(long double _x, long double _y) -{ - x = _x; - y = _y; - mode = 'r'; - calculate_polar(); - revolutionAngle_inDegrees = angle; -} -inline void Vector2D::set_polarCord(long double mag, long double ang) -{ - magnitude = mag; - angle =ang; - revolutionAngle_inDegrees = ang; - mode = 'p'; - calculate_rectangular(); - calculate_angle(); - adjust_angle(); - calculate_arcLength(); -} -inline void Vector2D::set_x(long double _x) -{ - x = _x; - calculate_polar(); -} -inline void Vector2D::set_y(long double _y) -{ - y = _y; - calculate_polar(); -} -inline void Vector2D::set_mag(long double mag) -{ - magnitude = mag; - calculate_rectangular(); - calculate_arcLength(); -} - -inline void Vector2D::set_mode(char _mode) -{ - mode = _mode; - validate_setMode(); -} -inline Vector2D Vector2D::projection(Vector2D& v) -{ - const long double xx = dot_product(v) / v.dot_product(v); - return Vector2D(xx*v.x , xx*v.y, this->mode); -} -inline Vector2D Vector2D::projection(Vector2D& v) const -{ - const Vector2D temp(this->x, this->y); - const auto dotProd = this->dot_product(v); - const auto dpdevisor = this->dot_product(temp); - const auto scalar = dotProd / dpdevisor; - Vector2D resultant = temp * scalar; - return resultant; -} -inline long double Vector2D::angle_between_vectors(Vector2D& v) const -{ - return acos((x*v.x+y*v.y) / (sqrt(x*x+y*y)* - sqrt(v.x*v.x+v.y*v.y))) * DEGREE; -} -inline long double Vector2D::square() const { - return static_cast( x * x + y * y); -} -inline long double Vector2D::dot_product(const Vector2D& vec)const -{ - return x * vec.x + vec.y * y; -} -inline long double Vector2D::distance(const Vector2D& vec)const -{ - long double x1, x2, y1, y2, t1, t2; - x1 = this->x; - x2 = vec.x; - y1 = this->y; - y2 = vec.y; - t1 = x2 - x1; - t2 = y2 - y1; - return sqrt(pow(t1, 2) + pow(t2, 2)); -} -inline long double Vector2D::cross_product(const Vector2D& v)const -{ - return (x * v.y) - (y * v.x); -} -inline Vector2D Vector2D::normalize_Vector2D() -{ - assert(find_magnitude() != 0); // NOLINT(clang-diagnostic-float-equal) - const auto length = sqrt((this->x * this->x) + (this->y * this->y)); - this->x /= length; - this->y /= length; - calculate_polar(); - calculate_angle(); - adjust_angle(); - calculate_arcLength(); - return *this; -} - -Vector2D Vector2D::getUnitVector() const { - Vector2D unitVector(this->x, this->y); - unitVector.normalize_Vector2D(); - return unitVector; -} - -inline bool Vector2D::isOrthogonalWith(Vector2D& v) const -{ - return this->dot_product(v) == 0; -} -inline long double Vector2D::find_magnitude() const { - return sqrt(square()); -} -/* -void Vector2D::setPolarCurve() -{ - cout << "\nEnter the Polar Curve to convert to Cartesian equation\n>"; - cin >> Curve.r; - Curve.x = sqrt(pow(Curve.r, 2) + pow(Curve.y, 2)); - Curve.theta = atan(y / x); -} -*/ -inline void Vector2D::validate_setMode() -{ - do{ - if (tolower(mode) == 'r' || tolower(mode) == 'p') { - break; - } - else { - cout << "\nEnter a valid mode, r/R for rectangular\n" - << "or p/P or polar components\n>"; - cin >> mode; - cin.clear(); - cin.ignore(100, '\n'); - } - }while(!cin || tolower(mode) != 'r' || tolower(mode) != 'p'); -} - -inline void Vector2D::calculate_magnitude() -{ - magnitude = static_cast( sqrt(x * x + y * y)); -} -inline void Vector2D::calculate_angle() -{ - angle = atan2(y, x) * DEGREE; -} -inline void Vector2D::adjust_angle() -{ - if(angle == -360 || angle == -720 || angle == -1080 || angle == -1440){ // NOLINT(clang-diagnostic-float-equal) - angle = 0; - } - if (angle >= 360){ - const int rev_degrees = static_cast(angle) / 360; - const int to_subtract = rev_degrees *360; - const long double new_angle = angle - to_subtract; - angle = new_angle; - }else if (angle < 0 && angle > -360){ - angle += 360; - }else if(angle < -360){ - const int rev_degrees = static_cast(angle) /360; - const int to_subtract = rev_degrees *360; - const long double newAngle = angle - to_subtract + 360; - angle = newAngle; - } -} -inline void Vector2D::calculate_rectangular() -{ - x = magnitude* cos(angle*RADIAN); - y = magnitude* sin(angle*RADIAN); -} -inline void Vector2D::calculate_polar() -{ - magnitude = static_cast( sqrt(x * x + y * y)); - if (x == 0.0 && y == 0.0) - angle = 0.0; - else - angle = atan2(y, x)*DEGREE; - - adjust_angle(); - calculate_arcLength(); - revolutionAngle_inDegrees = angle; -} -inline void Vector2D::calculate_arcLength() -{ - adjust_angle(); - arcLength = (_PI_ * (magnitude*2.0)) * - (angle / 360.0); -} - -inline bool Vector2D::operator<(const Vector2D &v) const -{ - return magnitude < v.magnitude; -} -inline bool Vector2D::operator<=(const Vector2D& v) const -{ - return magnitude <= v.magnitude; -} -inline bool Vector2D::operator>(const Vector2D & v)const -{ - return magnitude > v.magnitude; -} -inline bool Vector2D::operator>=(const Vector2D& v) const -{ - return magnitude >= v.magnitude; -} -inline bool Vector2D::operator==(const Vector2D & v)const -{ - return magnitude == v.magnitude && angle == v.angle; -} -inline bool Vector2D::operator!=(const Vector2D& v) const -{ - return !(magnitude == v.magnitude && angle == v.angle); -} -inline Vector2D Vector2D::operator+(const long double n)const -{ - //cout << "in Vector2D::operator+(const long double n)const"<x; - y = vec->y; - calculate_polar(); - calculate_arcLength(); - return *this; -} -inline Vector2D& Vector2D::operator=(Vector2D&& right)noexcept -{ - if (this != &right) - { - swap(x, right.x); - swap(y, right.y); - this->calculate_polar(); - } - return *this; -} -inline Vector2D::Vector2D(Vector2D&& temp) noexcept -{ - x = temp.x; - y = temp.y; - mode = temp.mode; - calculate_polar(); - calculate_arcLength(); - revolutionAngle_inDegrees = Vector2D::return_angle(); - angle = Vector2D::return_angle(); - magnitude = Vector2D::return_mag(); - arcLength = Vector2D::return_arcLength(); - calculate_arcLength(); -} - -inline Vector2D Vector2D::operator*(const long double scalar)const -{ - Vector2D results(x*scalar, y*scalar); - results.mode = mode; - return results; -} -inline Vector2D operator*(long double s, Vector2D& v) -{ - return v * s; -} - -inline Vector2D operator*(Vector2D& v, Vector2D& s) -{ - Vector2D results(v.x*s.x, v.y*s.y, v.mode); - return results; -} -inline ostream& operator<<(ostream& os, const Vector2D& v) -{ - if(v.mode == 'R' || v.mode == 'r'){ - v.showRectCord(); - } - else{ - v.showPolarCord(); - } - return os; -} -inline istream& operator>>(istream& is, Vector2D& v) -{ - std::string id = v.getID(); - std::cout << "please enter the x y values of " << id << "\n>>"; - if(v.mode == 'R' || v.mode == 'r'){ - is>> v.x >> v.y; - v.calculate_polar(); - } - else{ - is>> v.magnitude >> v.angle; - v.calculate_rectangular(); - } - return is; -} -inline Vector2D::~Vector2D() -{ - countDecrease(); -} - -inline void Vector2D::typeOfAngleBetween(const Vector2D& v)const -{ - if(dot_product(v) < 0) - { - std::cout << "vectors are obtuse\n"; - } - else if(dot_product(v) > 0) - { - std::cout << "vectors are acute\n"; - } - else if(dot_product(v) == 0) - { - std::cout << "vectors are right"; - } -} - -template -inline long double Vector2D::distance_to_line(T a, T b, T c) -{ - auto top = abs(((a * x) + (b * y) + c)); - auto bot = sqrt((a * a) + (b * b)); - return top / bot; -} - - -#endif //PHYSICSFORMULA_VECTOR2D_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_VECTOR2D_H +#define PHYSICSFORMULA_VECTOR2D_H +/** + * @class Vector2D + * @details class for operating with 2D vectors + * @author Ryan Zurrin + * dateBuilt 11/22/2020 + * lastEdit 2/5/2022 + */ +#ifndef Vector2D_H +#define Vector2D_H + +#include +#include +#include +#include +#include + +using namespace std; + + +constexpr auto _PI_ = 3.141592653589793238462643383; +constexpr auto DEGREE = 180/_PI_; +constexpr auto RADIAN = _PI_/180; +constexpr auto _Ga_ = 9.81; +static int vec2d_object_counter = 0; + +class Vector2D +{ + friend class Vector3D; + string ID; + long double x; + long double y; + long double magnitude; + long double angle; + long double arcLength; + long double revolutionAngle_inDegrees; + static void countShow() { std::cout << "Vector2D count: " + << vec2d_object_counter << std::endl; } + //void calculate_parametric_equation(); + void validate_setMode(); + void calculate_magnitude(); + void calculate_angle(); + void adjust_angle(); + void calculate_rectangular(); + void calculate_polar(); + void calculate_arcLength(); + static void countIncrease() { vec2d_object_counter += 1; } + static void countDecrease() { vec2d_object_counter -= 1; } + +public: + char mode; //sets mode to Polar w/ 'p' or Rectangular w/ 'r' + Vector2D(string id = ""); //default constructor + Vector2D(char, string id = "");//mode select, defaults to 0, in rectangular, constructor + Vector2D(long double, long double, char _mode = 'r', string id = ""); //constructor takes both coordinates and mode + Vector2D(const Vector2D &, string id = ""); //copy constructor + virtual void displayAllData(const std::string& label = "")const; //virtual so any derived classes must redefine + virtual void display(const std::string& label = "")const; + virtual void showUnitVector(const std::string& label = "")const; + virtual void showRectCord(const std::string& label = "")const; + void showPolarCord(const std::string& label = "")const; + void showRevolutionAngle(const std::string& label = "")const; + void show_x()const; + void show_y()const; + void show_mag()const; + void show_angle()const; + void show_mode()const; + void show_arcLength()const; + std::string getID() const { return ID; } + long double getX()const; + long double getY()const; + virtual long double return_mag()const; + virtual long double return_angle()const; + virtual long double return_arcLength()const; + virtual char return_mode()const; + static int return_objectCount(){return vec2d_object_counter;} + void set_coordinates(long double, long double, char _mode = 'r'); + void set_rectCord(long double, long double); + void set_polarCord(long double, long double); + void set_x(long double); + void set_y(long double); + void set_mag(long double); + void set_mode(char); + Vector2D projection(Vector2D& v); + Vector2D projection(Vector2D&)const; + long double angle_between_vectors(Vector2D&)const; + /// + /// Distance from a point(vector head) to a line is equal to length of the + /// perpendicular distance from the point to the line. If Ax + By + C = 0, + /// 2D line equation, then distance between point V(x, y) and line can be + /// found using the following formula d = (|a·x + b·y + c|)/(√a^2 + b^2) + /// + /// coefficient a in ax + by + c = 0. + /// coefficient b in ax + by + c = 0. + /// coefficient c in ax + by + c = 0. + /// distance from the vector head to line with given equations + /// coefficients + template + long double distance_to_line(T a, T b, T c); + virtual long double square() const; //gives square olong double the Vector2D + virtual long double find_magnitude() const; //magnitude olong double the Vector2D + [[nodiscard]] long double dot_product(const Vector2D&)const; //scalar dot_product + [[nodiscard]] long double distance(const Vector2D&)const; //gives distance between two Vector2Ds + [[nodiscard]] long double cross_product(const Vector2D&)const; //cross_product + Vector2D normalize_Vector2D(); //normalized Vector2D + Vector2D getUnitVector()const; + bool isOrthogonalWith(Vector2D& v)const; + void typeOfAngleBetween(const Vector2D& v)const; + static void show_objectCount() { std::cout << "\n vector2D object count: " + << vec2d_object_counter << std::endl; } + static int get_objectCount() { return vec2d_object_counter; } + bool operator>(const Vector2D &)const; + bool operator>=(const Vector2D&)const; + bool operator<(const Vector2D &)const; + bool operator<=(const Vector2D&)const; + bool operator==(const Vector2D &)const; + bool operator!=(const Vector2D&)const; + bool operator>(const long double& n)const { return magnitude > n; } + bool operator>=(const long double& n)const { return magnitude >= n; } + bool operator<(const long double& n)const { return magnitude < n; } + bool operator<=(const long double& n)const { return magnitude <= n; } + bool operator==(const long double& n)const { return magnitude == n; } + bool operator!=(const long double& n)const { return !(magnitude == n); } + + Vector2D operator+(const Vector2D &)const; + Vector2D operator+(long double number)const; + Vector2D &operator+=(const Vector2D &); + Vector2D operator+()const; + Vector2D operator++(); + Vector2D operator++(int); + Vector2D operator-(const Vector2D&) const; + Vector2D operator-(const long double number)const; + Vector2D operator-()const; + Vector2D operator--(); + Vector2D operator--(int); + Vector2D& operator=(const Vector2D &); + Vector2D &operator=(const Vector2D *); + Vector2D &operator=(Vector2D&& right)noexcept; + Vector2D(Vector2D&& temp)noexcept; + + Vector2D operator*(long double)const; + + friend Vector2D operator*(long double s, Vector2D& v); + friend Vector2D operator*(Vector2D& v, Vector2D& s); + friend Vector2D operator-(long double s, Vector2D& v); + friend Vector2D operator+(long double s, Vector2D& v); + friend ostream& operator<<(ostream&, const Vector2D&); + friend istream& operator>>(istream&, Vector2D&); + + virtual ~Vector2D(); + + +}; +#endif +//============================================================================= +//in-line class Implementation + +inline Vector2D::Vector2D(string id) +{ + x = static_cast(0.0); + y = static_cast(0.0); + magnitude = static_cast( 0.0); + angle = static_cast(0.0); + calculate_arcLength(); + arcLength = static_cast(0.0); + revolutionAngle_inDegrees = static_cast(0.0); + mode = 'r'; + validate_setMode(); + countIncrease(); + if (id == "") + { + ID = "vec2d_" + std::to_string(vec2d_object_counter); + } + else + { + ID = id; + } + //countShow(); +} + +inline Vector2D::Vector2D(char _mode, string id) +{ + x = static_cast(0.0); + y = static_cast(0.0); + magnitude = static_cast( 0.0); + angle = static_cast(0.0); + calculate_arcLength(); + revolutionAngle_inDegrees = 0; + mode = _mode; + validate_setMode(); + countIncrease(); + if (id == "") + { + ID = "vec2d_" + std::to_string(vec2d_object_counter); + } + else + { + ID = id; + } + //countShow(); +} +/*______________________________________________________________________________ + the third argument is the mode setting. + Use 'r'/'R' for rectangular components, 'p'/'P' for polar components +*/ +inline Vector2D::Vector2D(long double xMag, long double yAng, char _mode, string id) +{ + revolutionAngle_inDegrees = static_cast(0.0); + ID = id; + magnitude = static_cast(0.0); + angle = static_cast(0.0); + mode = _mode; + validate_setMode(); + x = xMag; + y = yAng; + set_coordinates(x, y, _mode); + countIncrease(); + if (id == "") + { + ID = "vec2d_" + std::to_string(vec2d_object_counter); + } + else + { + ID = id; + } + + +} +inline Vector2D::Vector2D(const Vector2D &v, string id) +{ + + ID = id; + revolutionAngle_inDegrees = v.revolutionAngle_inDegrees; + magnitude = v.magnitude; + angle = v.angle; + mode = v.mode; + validate_setMode(); + x = v.x; + y = v.y; + set_coordinates(x, y, mode); + countIncrease(); + if (id == "") + { + ID = "vec2d_" + std::to_string(vec2d_object_counter); + } + else + { + ID = id; + } +} +inline void Vector2D::displayAllData(const std::string& label)const +{ + std::cout << ((label.empty()) ? ID : label) << ":"; + showUnitVector(label); + showRectCord(label); + showPolarCord(label); + showRevolutionAngle(label); + show_arcLength(); + std::cout << std::endl; +} +inline void Vector2D::display(const std::string& label)const +{ + if (mode == 'r' || mode == 'R') { + showRectCord(label); + } + else { + showPolarCord(label); + } +} + +void Vector2D::showUnitVector(const std::string& label)const { + // display as a unit vector with ihat and jhat + std::cout << ((label.empty()) ? ID : label) << ":"; + std::cout << 1.0/magnitude << "*" << "(" << x << "i ," << y << "j)"; +} + +inline void Vector2D::showRectCord(const std::string& label)const +{ + cout << setprecision(6); + cout<< "\n" <<((label.empty()) ? ID : label) << ":(x,y) = "; + if(x < 0 && x > -1 ){ + cout << setiosflags(ios::fixed); + cout << fixed << "(" << x << "," + << resetiosflags(ios::fixed); + } + else{ + cout << "(" << x << ","; + } + if(y<0 && y>-1){ + cout << setiosflags(ios::fixed); + cout << y << ")" <= 0 && angle >= 0){ + cout << ": = <" << magnitude << "," << angle << ">"; + } + else{ + cout << setiosflags(ios::fixed); + cout << ": = <" << magnitude << "," << angle << ">"; + cout << resetiosflags(ios::fixed) << endl; + } +} +inline void Vector2D::showRevolutionAngle(const std::string& label)const +{ + cout<< "\n" << ((label.empty()) ? ID : label) << ":rev\xE9\xF8 = " + << revolutionAngle_inDegrees <<"\xF8"; +} +inline void Vector2D::show_x() const +{ + cout << "\nx: " << x << endl; +} +inline void Vector2D::show_y() const +{ + cout << "\ny: " << y << endl; +} +inline void Vector2D::show_mag() const +{ + cout << "\nr: " << magnitude << endl; +} +inline void Vector2D::show_angle() const +{ + cout << "\n\xE9: " << angle << "\xF8" << endl; +} +inline void Vector2D::show_mode()const +{ + if (mode == 'p' || mode == 'P') { + cout << "\nmode: Polar" << endl; + } + else + cout << "\nmode: Rectangular" << endl; +} +inline void Vector2D::show_arcLength() const +{ + cout << setprecision(4); + cout << "\narc length: " << arcLength << endl; +} +inline long double Vector2D::getX() const +{ + return x; +} +inline long double Vector2D::getY()const +{ + return y; +} +inline long double Vector2D::return_mag()const +{ + return magnitude; +} +inline long double Vector2D::return_angle()const +{ + return angle; +} +inline long double Vector2D::return_arcLength() const +{ + return arcLength; +} +inline char Vector2D::return_mode()const +{ + return mode; +} +/** + *method: set_coordinates(long double xMag, long double yAng, char _mode) +* arguments: x, y mode = 'r' or 'p' .by default is 'r'ectangular, 'p'= polar. +* Use 'r'/'R' for rectangular components, 'p'/'P' for polar components +*/ +inline void Vector2D::set_coordinates(long double xMag, long double yAng, char _mode) +{ + validate_setMode(); + + if (tolower(_mode) == 'r') { + set_rectCord(xMag, yAng); + } + else{ + set_polarCord(static_cast(xMag), yAng); + } + calculate_angle(); + adjust_angle(); + calculate_arcLength(); +} +inline void Vector2D::set_rectCord(long double _x, long double _y) +{ + x = _x; + y = _y; + mode = 'r'; + calculate_polar(); + revolutionAngle_inDegrees = angle; +} +inline void Vector2D::set_polarCord(long double mag, long double ang) +{ + magnitude = mag; + angle =ang; + revolutionAngle_inDegrees = ang; + mode = 'p'; + calculate_rectangular(); + calculate_angle(); + adjust_angle(); + calculate_arcLength(); +} +inline void Vector2D::set_x(long double _x) +{ + x = _x; + calculate_polar(); +} +inline void Vector2D::set_y(long double _y) +{ + y = _y; + calculate_polar(); +} +inline void Vector2D::set_mag(long double mag) +{ + magnitude = mag; + calculate_rectangular(); + calculate_arcLength(); +} + +inline void Vector2D::set_mode(char _mode) +{ + mode = _mode; + validate_setMode(); +} +inline Vector2D Vector2D::projection(Vector2D& v) +{ + const long double xx = dot_product(v) / v.dot_product(v); + return Vector2D(xx*v.x , xx*v.y, this->mode); +} +inline Vector2D Vector2D::projection(Vector2D& v) const +{ + const Vector2D temp(this->x, this->y); + const auto dotProd = this->dot_product(v); + const auto dpdevisor = this->dot_product(temp); + const auto scalar = dotProd / dpdevisor; + Vector2D resultant = temp * scalar; + return resultant; +} +inline long double Vector2D::angle_between_vectors(Vector2D& v) const +{ + return acos((x*v.x+y*v.y) / (sqrt(x*x+y*y)* + sqrt(v.x*v.x+v.y*v.y))) * DEGREE; +} +inline long double Vector2D::square() const { + return static_cast( x * x + y * y); +} +inline long double Vector2D::dot_product(const Vector2D& vec)const +{ + return x * vec.x + vec.y * y; +} +inline long double Vector2D::distance(const Vector2D& vec)const +{ + long double x1, x2, y1, y2, t1, t2; + x1 = this->x; + x2 = vec.x; + y1 = this->y; + y2 = vec.y; + t1 = x2 - x1; + t2 = y2 - y1; + return sqrt(pow(t1, 2) + pow(t2, 2)); +} +inline long double Vector2D::cross_product(const Vector2D& v)const +{ + return (x * v.y) - (y * v.x); +} +inline Vector2D Vector2D::normalize_Vector2D() +{ + assert(find_magnitude() != 0); // NOLINT(clang-diagnostic-float-equal) + const auto length = sqrt((this->x * this->x) + (this->y * this->y)); + this->x /= length; + this->y /= length; + calculate_polar(); + calculate_angle(); + adjust_angle(); + calculate_arcLength(); + return *this; +} + +Vector2D Vector2D::getUnitVector() const { + Vector2D unitVector(this->x, this->y); + unitVector.normalize_Vector2D(); + return unitVector; +} + +inline bool Vector2D::isOrthogonalWith(Vector2D& v) const +{ + return this->dot_product(v) == 0; +} +inline long double Vector2D::find_magnitude() const { + return sqrt(square()); +} +/* +void Vector2D::setPolarCurve() +{ + cout << "\nEnter the Polar Curve to convert to Cartesian equation\n>"; + cin >> Curve.r; + Curve.x = sqrt(pow(Curve.r, 2) + pow(Curve.y, 2)); + Curve.theta = atan(y / x); +} +*/ +inline void Vector2D::validate_setMode() +{ + do{ + if (tolower(mode) == 'r' || tolower(mode) == 'p') { + break; + } + else { + cout << "\nEnter a valid mode, r/R for rectangular\n" + << "or p/P or polar components\n>"; + cin >> mode; + cin.clear(); + cin.ignore(100, '\n'); + } + }while(!cin || tolower(mode) != 'r' || tolower(mode) != 'p'); +} + +inline void Vector2D::calculate_magnitude() +{ + magnitude = static_cast( sqrt(x * x + y * y)); +} +inline void Vector2D::calculate_angle() +{ + angle = atan2(y, x) * DEGREE; +} +inline void Vector2D::adjust_angle() +{ + if(angle == -360 || angle == -720 || angle == -1080 || angle == -1440){ // NOLINT(clang-diagnostic-float-equal) + angle = 0; + } + if (angle >= 360){ + const int rev_degrees = static_cast(angle) / 360; + const int to_subtract = rev_degrees *360; + const long double new_angle = angle - to_subtract; + angle = new_angle; + }else if (angle < 0 && angle > -360){ + angle += 360; + }else if(angle < -360){ + const int rev_degrees = static_cast(angle) /360; + const int to_subtract = rev_degrees *360; + const long double newAngle = angle - to_subtract + 360; + angle = newAngle; + } +} +inline void Vector2D::calculate_rectangular() +{ + x = magnitude* cos(angle*RADIAN); + y = magnitude* sin(angle*RADIAN); +} +inline void Vector2D::calculate_polar() +{ + magnitude = static_cast( sqrt(x * x + y * y)); + if (x == 0.0 && y == 0.0) + angle = 0.0; + else + angle = atan2(y, x)*DEGREE; + + adjust_angle(); + calculate_arcLength(); + revolutionAngle_inDegrees = angle; +} +inline void Vector2D::calculate_arcLength() +{ + adjust_angle(); + arcLength = (_PI_ * (magnitude*2.0)) * + (angle / 360.0); +} + +inline bool Vector2D::operator<(const Vector2D &v) const +{ + return magnitude < v.magnitude; +} +inline bool Vector2D::operator<=(const Vector2D& v) const +{ + return magnitude <= v.magnitude; +} +inline bool Vector2D::operator>(const Vector2D & v)const +{ + return magnitude > v.magnitude; +} +inline bool Vector2D::operator>=(const Vector2D& v) const +{ + return magnitude >= v.magnitude; +} +inline bool Vector2D::operator==(const Vector2D & v)const +{ + return magnitude == v.magnitude && angle == v.angle; +} +inline bool Vector2D::operator!=(const Vector2D& v) const +{ + return !(magnitude == v.magnitude && angle == v.angle); +} +inline Vector2D Vector2D::operator+(const long double n)const +{ + //cout << "in Vector2D::operator+(const long double n)const"<x; + y = vec->y; + calculate_polar(); + calculate_arcLength(); + return *this; +} +inline Vector2D& Vector2D::operator=(Vector2D&& right)noexcept +{ + if (this != &right) + { + swap(x, right.x); + swap(y, right.y); + this->calculate_polar(); + } + return *this; +} +inline Vector2D::Vector2D(Vector2D&& temp) noexcept +{ + x = temp.x; + y = temp.y; + mode = temp.mode; + calculate_polar(); + calculate_arcLength(); + revolutionAngle_inDegrees = Vector2D::return_angle(); + angle = Vector2D::return_angle(); + magnitude = Vector2D::return_mag(); + arcLength = Vector2D::return_arcLength(); + calculate_arcLength(); +} + +inline Vector2D Vector2D::operator*(const long double scalar)const +{ + Vector2D results(x*scalar, y*scalar); + results.mode = mode; + return results; +} +inline Vector2D operator*(long double s, Vector2D& v) +{ + return v * s; +} + +inline Vector2D operator*(Vector2D& v, Vector2D& s) +{ + Vector2D results(v.x*s.x, v.y*s.y, v.mode); + return results; +} +inline ostream& operator<<(ostream& os, const Vector2D& v) +{ + if(v.mode == 'R' || v.mode == 'r'){ + v.showRectCord(); + } + else{ + v.showPolarCord(); + } + return os; +} +inline istream& operator>>(istream& is, Vector2D& v) +{ + std::string id = v.getID(); + std::cout << "please enter the x y values of " << id << "\n>>"; + if(v.mode == 'R' || v.mode == 'r'){ + is>> v.x >> v.y; + v.calculate_polar(); + } + else{ + is>> v.magnitude >> v.angle; + v.calculate_rectangular(); + } + return is; +} +inline Vector2D::~Vector2D() +{ + countDecrease(); +} + +inline void Vector2D::typeOfAngleBetween(const Vector2D& v)const +{ + if(dot_product(v) < 0) + { + std::cout << "vectors are obtuse\n"; + } + else if(dot_product(v) > 0) + { + std::cout << "vectors are acute\n"; + } + else if(dot_product(v) == 0) + { + std::cout << "vectors are right"; + } +} + +template +inline long double Vector2D::distance_to_line(T a, T b, T c) +{ + auto top = abs(((a * x) + (b * y) + c)); + auto bot = sqrt((a * a) + (b * b)); + return top / bot; +} + + +#endif //PHYSICSFORMULA_VECTOR2D_H diff --git a/Vector3D.h b/Vector3D.h index 9ff65b8..6004c21 100644 --- a/Vector3D.h +++ b/Vector3D.h @@ -1,570 +1,570 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_VECTOR3D_H -#define PHYSICSFORMULA_VECTOR3D_H - -/** - * @class Vector3D - * @details class for operating with 3D vectors - * @author Ryan Zurrin - * dateBuilt 11/22/2020 - * lastEdit 9/5/2021 - */ -#ifndef VECTOR3D_H -#define VECTOR3D_H -#include "Vector2D.h" -static int vec3d_objectCount = 0; - - - -class Vector3D : public Vector2D -{ - long double z, xAngle, yAngle, zAngle,radius, inclination, azimuth; - void setRadius(); - void setInclination(); - void setAzimuth(); - void calculate_spherical(); - void set_allAngles(); - void set_magnitude(); - void updateVector(); - static void countIncrease() { vec3d_objectCount += 1; } - static void countDecrease() { vec3d_objectCount -= 1; } -public: - Vector3D(string id = ""); //constructor - Vector3D(long double, long double, long double, string id = ""); //initializing object with values. - Vector3D(const Vector3D &vec, string id = ""); //copy constructor - void setX(long double); - void setY(long double); - void setZ(long double); - void set_coordinates(long double, long double, long double); - void displayAllData(const std::string& label = "")const override; - void showRectCord(const std::string& label = "")const override; - void showSphericalCoordinates(const std::string& label = "")const; - void showAllAngles(const std::string& label = "")const; - void display(const std::string& label = "")const override; //display value of vector - static int return_objectCount(){return vec3d_objectCount;} - [[nodiscard]] long double return_z()const; //return z - [[nodiscard]] long double return_xAngle()const; //return x angle - [[nodiscard]] long double return_yAngle()const; //return y angle - [[nodiscard]] long double return_zAngle()const; //return z angle - [[nodiscard]] long double return_mag()const override; - [[nodiscard]] long double return_angle()const override; - [[nodiscard]] long double return_arcLength()const override; - [[nodiscard]] char return_mode()const override; - - /// - /// gives the projection of v onto this - /// - /// The vector being projected. - /// 3D vector of v onto this - Vector3D projection(Vector3D& v)const; - - long double angle_between_vectors(Vector3D& v)const; - /// - /// The distance from a point(vector head) to a plane is equal to length of the perpendicular - /// lowered from a point on a plane. If Ax + By + Cz + D = 0 is a plane equation, - /// then distance from point M(Mx, My, Mz) to plane can be found using the - /// following formula d = (|A·Mx + B·My + C·Mz + D))/(√A2 + B2 + C2) - /// - /// a. - /// The b. - /// The c. - /// The d. - /// distance from the vector head to plane with given equations - /// coefficients - template - long double distance_to_plane(T a, T b, T c, T d); - [[nodiscard]] long double square() const override; //gives square of the vector - [[nodiscard]] long double dot_product(const Vector3D &vec) const; //scalar dot_product - [[nodiscard]] static long double dot_product(const long double uMag, const long double vMag, const long double angleBetween); - [[nodiscard]] long double distance(const Vector3D &vec)const; //gives distance between two vectors - [[nodiscard]] long double find_magnitude()const override; //magnitude of the vector - [[nodiscard]] Vector3D cross_product(const Vector3D &vec)const; //cross_product - [[nodiscard]] long double scaler_triple_product(Vector3D& b, Vector3D& c) const; - Vector3D normalize_vector(); //normalized vector - bool isOrthogonalWith(Vector3D& v)const; - void typeOfAngleBetween(const Vector3D& v)const; - static void show_objectCount() { std::cout << "\n vector3D object count: " - << vec3d_objectCount << std::endl; } - static int get_objectCount() { return vec3d_objectCount; } - bool operator==(const Vector3D& v)const; - bool operator!=(const Vector3D& v)const; - bool operator>(const Vector3D& v)const; - bool operator>=(const Vector3D& v)const; - bool operator<(const Vector3D& v)const; - bool operator<=(const Vector3D& v)const; - Vector3D operator+(const Vector3D &vec)const; //addition - Vector3D operator+(Vector3D &vec)const; - Vector3D &operator+=(const Vector3D &vec); ////assigning new result to the vector - Vector3D operator-(const Vector3D &vec)const; //subtraction - Vector3D operator-(const long double number)const; - Vector3D operator-()const; - Vector3D operator--(); - Vector3D operator--(int); - Vector3D &operator-=(const Vector3D &vec); //assigning new result to the vector - Vector3D operator*(long double value)const; //multiplication - Vector3D &operator*=(long double value); //assigning new result to the vector. - Vector3D &operator=(const Vector3D &vec); - friend ostream& operator<<(ostream&, const Vector3D&); - friend istream& operator>>(istream&, Vector3D&); - - - ~Vector3D()override; - -}; -#endif - - -inline Vector3D::Vector3D(string id) //constructor -{ - x=0; - y=0; - z=0; - xAngle = 0.0; - yAngle = 0.0; - zAngle = 0.0; - magnitude = static_cast(0.0); - radius = 0.0; - inclination = 0.0; - azimuth = 0.0; - countIncrease(); - if (id == "") - { - ID = "vec3d_" + std::to_string(vec3d_objectCount); - } - else - { - ID = id; - } - //cout<< object_counter << ": " <<"in the 3dVector default constructor"<-1) { - cout << setiosflags(ios::fixed); - cout << y << ","; - cout << resetiosflags(ios::fixed); - } - else { - cout << y << ","; - } - if (z<0 && z>-1) { - cout << setiosflags(ios::fixed); - cout << z << ")" << endl; - cout << resetiosflags(ios::fixed); - } - else { - cout << z << ")"; - } - std::cout << std::endl; -} -inline void Vector3D::showSphericalCoordinates(const std::string& label)const -{ - cout<<((label.empty()) ? ID : label) << setprecision(6) - << ": = <" << radius - << ", " << inclination << ", " << azimuth << ">"<x * this->x) + (this->y * this->y) + (this->z * this->z)); -} -inline void Vector3D::setInclination() -{ - inclination = acos(z / radius)*DEGREE; -} -inline void Vector3D::setAzimuth() -{ - azimuth = atan(y / x)*DEGREE; -} -inline void Vector3D::calculate_spherical() -{ - setRadius(); - setInclination(); - setAzimuth(); -} -inline void Vector3D::set_allAngles() -{ - xAngle = return_xAngle(); - yAngle = return_yAngle(); - zAngle = return_zAngle(); - //angle = -} - -inline void Vector3D::set_magnitude() -{ - magnitude = find_magnitude(); -} - -inline void Vector3D::updateVector() -{ - set_magnitude(); - set_allAngles(); - calculate_spherical(); -} - -//addition -inline Vector3D Vector3D::operator+(const Vector3D &vec)const -{ - return Vector3D(x+vec.x,y+vec.y,z+vec.z); -} -inline Vector3D Vector3D::operator+(Vector3D &vec)const -{ - return Vector3D(x+vec.x,y+vec.y,z); -} - -inline Vector3D &Vector3D::operator+=(const Vector3D &vec) -{ - x+=vec.x; - y+=vec.y; - z+=vec.z; - updateVector(); - return *this; -} - -//subtraction// -inline Vector3D Vector3D::operator-(const Vector3D &vec)const -{ - return Vector3D(x-vec.x,y-vec.y,z-vec.z); -} -inline Vector3D Vector3D::operator-(const long double n) const -{ - return Vector3D(x-n, y-n, z-n); -} -inline Vector3D Vector3D::operator-() const -{ - return Vector3D(-x, -y, -z); -} -inline Vector3D Vector3D::operator--() -{ - return Vector3D(--x, --y, --z); -} -inline Vector3D Vector3D::operator--(int) -{ - return Vector3D(x--, y--, z--); -} -inline Vector3D &Vector3D::operator-=(const Vector3D &vec) -{ - x-=vec.x; - y-=vec.y; - z-=vec.z; - updateVector(); - return *this; -} - -//scalar multiplication -inline Vector3D Vector3D::operator*(long double value)const -{ - return Vector3D(x*value,y*value,z*value); -} -inline Vector3D &Vector3D::operator*=(long double value) -{ - x*=value; - y*=value; - z*=value; - set_allAngles(); - return *this; -} - - -inline Vector3D& Vector3D::operator=(const Vector3D& vec) -{ - x = vec.x; - y = vec.y; - z = vec.z; - set_allAngles(); - - return *this; -} - -inline ostream& operator<<(ostream& os, const Vector3D & v) -{ - if(v.mode == 'R' || v.mode == 'r'){ - v.showRectCord(); - } - else{ - v.showPolarCord(); - } - return os; -} - -inline istream& operator>>(istream& is, Vector3D& v) -{ - long double x_, y_, z_; - std::string id = v.getID(); - std::cout << "please enter the x y z values of " << id << "\n>>"; - is >> x_ >> y_ >> z_; - v.setX(x_); v.setY(y_); v.setZ(z_); - return is; -} - - -//Dot product -inline long double Vector3D::dot_product(const Vector3D &vec) const -{ - return x * vec.x + vec.y * y + vec.z * z; -} -inline long double Vector3D::dot_product(const long double uMag, const long double vMag, const long double angleBetween) -{ - return uMag * vMag * cos(angleBetween*RADIAN); -} -//cross product -inline Vector3D Vector3D::cross_product(const Vector3D &vec)const -{ - long double ni=y*vec.z-z*vec.y; - long double nj=z*vec.x-x*vec.z; - long double nk=x*vec.y-y*vec.x; - return Vector3D(ni,nj,nk); -} -inline long double Vector3D::scaler_triple_product(Vector3D& b, Vector3D& c) const -{ - return this->dot_product(b.cross_product(c)); -} -inline long double Vector3D::find_magnitude()const -{ - return static_cast( sqrt(square())); -} -inline long double Vector3D::square()const -{ - return static_cast( x*x+y*y+z*z); -} - -inline Vector3D Vector3D::normalize_vector() -{ - //assert(find_magnitude()!=0); - const auto length = sqrt((this->x * this->x) + (this->y * this->y) + (this->z * this->z)); - this->x /= length; - this->y /= length; - this->z /= length; - calculate_spherical(); - set_allAngles(); - return *this; -} - -inline bool Vector3D::isOrthogonalWith(Vector3D& v)const -{ - return this->dot_product(v) == 0.0; -} - -inline void Vector3D::typeOfAngleBetween(const Vector3D& v) const -{ - if (dot_product(v) < 0) - { - std::cout << "vectors are obtuse\n"; - } - else if (dot_product(v) > 0) - { - std::cout << "vectors are acute\n"; - } - else if (dot_product(v) == 0) - { - std::cout << "vectors are right"; - } - -} - -inline bool Vector3D::operator==(const Vector3D& v) const -{ - return std::make_tuple(this->x, this->y, this->z) == - std::make_tuple(v.x, v.y, v.z); -} - -inline bool Vector3D::operator!=(const Vector3D& v) const -{ - return std::make_tuple(this->x, this->y, this->z) != - std::make_tuple(v.x, v.y, v.z); -} - -inline bool Vector3D::operator>(const Vector3D& v) const -{ - return std::make_tuple(this->x, this->y, this->z) > - std::make_tuple(v.x, v.y, v.z); -} - -inline bool Vector3D::operator>=(const Vector3D& v) const -{ - return std::make_tuple(this->x, this->y, this->z) >= - std::make_tuple(v.x, v.y, v.z); -} - -inline bool Vector3D::operator<(const Vector3D& v) const -{ - return std::make_tuple(this->x, this->y, this->z) < - std::make_tuple(v.x, v.y, v.z); -} - -inline bool Vector3D::operator<=(const Vector3D& v) const -{ - return std::make_tuple(this->x, this->y, this->z) <= - std::make_tuple(v.x, v.y, v.z); -} - - -inline long double Vector3D::distance(const Vector3D &vec)const -{ - long double x1, x2, y1, y2, z1, z2; - x1 = this->x; - x2 = vec.x; - y1 = this->y; - y2 = vec.y; - z1 = this->z; - z2 = vec.z; - return sqrt((pow(x2 - x1, 2) + pow(y2 - y1, 2) + pow(z2 - z1, 2))); -} - -inline long double Vector3D::return_z()const -{ - return z; -} -inline long double Vector3D::return_xAngle()const -{ - return atan2(sqrt(y * y + z * z), x) * DEGREE; -} -inline long double Vector3D::return_yAngle()const -{ - return atan2(sqrt(x * x + z * z), y) * DEGREE; -} -inline long double Vector3D::return_zAngle()const -{ - return atan2(sqrt(x * x + y * y), z) * DEGREE; -} -inline long double Vector3D::return_mag() const -{ - return static_cast(sqrt(x * x + y * y + z * z)); -} -inline long double Vector3D::return_angle() const -{ - std::cout << "there is no one angle in a 3d vector class so this" - << " returns the sum of the three angles instead\n"; - return return_xAngle()+return_yAngle()+ return_zAngle(); -} -inline long double Vector3D::return_arcLength() const -{ - return return_mag()*return_angle()*RADIAN; -} -inline char Vector3D::return_mode() const -{ - return 0; -} - -inline Vector3D Vector3D::projection(Vector3D& v) const -{ - const Vector3D temp(this->x, this->y, this->z); - const auto dotProd = this->dot_product(v); - const auto dpdevisor = this->dot_product(temp); - const auto scalar = dotProd / dpdevisor; - Vector3D resultant = temp * scalar; - return resultant; - //const auto Θ = this->angle_between_vectors(v); - //return this->magnitude * cos(Θ * RADIAN); -} -inline long double Vector3D::angle_between_vectors(Vector3D& v)const -{ - return acos((x*v.x+y*v.y+z*v.z) / (sqrt(x*x+y*y+z*z)* - sqrt(v.x*v.x+v.y*v.y+v.z*v.z))) * DEGREE; -} -inline void Vector3D::display(const std::string& label)const -{ - std::cout << ((label.empty()) ? ID : label) - <<": = "<<"<"<"< -inline long double Vector3D::distance_to_plane(T a, T b, T c, T d) -{ - auto top = abs(((a * x) + (b * y) + (c * z) + d)); - auto bot = sqrt((a * a) + (b * b) + (c * c)); - return top/bot; -} - -#endif //PHYSICSFORMULA_VECTOR3D_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_VECTOR3D_H +#define PHYSICSFORMULA_VECTOR3D_H + +/** + * @class Vector3D + * @details class for operating with 3D vectors + * @author Ryan Zurrin + * dateBuilt 11/22/2020 + * lastEdit 9/5/2021 + */ +#ifndef VECTOR3D_H +#define VECTOR3D_H +#include "Vector2D.h" +static int vec3d_objectCount = 0; + + + +class Vector3D : public Vector2D +{ + long double z, xAngle, yAngle, zAngle,radius, inclination, azimuth; + void setRadius(); + void setInclination(); + void setAzimuth(); + void calculate_spherical(); + void set_allAngles(); + void set_magnitude(); + void updateVector(); + static void countIncrease() { vec3d_objectCount += 1; } + static void countDecrease() { vec3d_objectCount -= 1; } +public: + Vector3D(string id = ""); //constructor + Vector3D(long double, long double, long double, string id = ""); //initializing object with values. + Vector3D(const Vector3D &vec, string id = ""); //copy constructor + void setX(long double); + void setY(long double); + void setZ(long double); + void set_coordinates(long double, long double, long double); + void displayAllData(const std::string& label = "")const override; + void showRectCord(const std::string& label = "")const override; + void showSphericalCoordinates(const std::string& label = "")const; + void showAllAngles(const std::string& label = "")const; + void display(const std::string& label = "")const override; //display value of vector + static int return_objectCount(){return vec3d_objectCount;} + [[nodiscard]] long double return_z()const; //return z + [[nodiscard]] long double return_xAngle()const; //return x angle + [[nodiscard]] long double return_yAngle()const; //return y angle + [[nodiscard]] long double return_zAngle()const; //return z angle + [[nodiscard]] long double return_mag()const override; + [[nodiscard]] long double return_angle()const override; + [[nodiscard]] long double return_arcLength()const override; + [[nodiscard]] char return_mode()const override; + + /// + /// gives the projection of v onto this + /// + /// The vector being projected. + /// 3D vector of v onto this + Vector3D projection(Vector3D& v)const; + + long double angle_between_vectors(Vector3D& v)const; + /// + /// The distance from a point(vector head) to a plane is equal to length of the perpendicular + /// lowered from a point on a plane. If Ax + By + Cz + D = 0 is a plane equation, + /// then distance from point M(Mx, My, Mz) to plane can be found using the + /// following formula d = (|A·Mx + B·My + C·Mz + D))/(√A2 + B2 + C2) + /// + /// a. + /// The b. + /// The c. + /// The d. + /// distance from the vector head to plane with given equations + /// coefficients + template + long double distance_to_plane(T a, T b, T c, T d); + [[nodiscard]] long double square() const override; //gives square of the vector + [[nodiscard]] long double dot_product(const Vector3D &vec) const; //scalar dot_product + [[nodiscard]] static long double dot_product(const long double uMag, const long double vMag, const long double angleBetween); + [[nodiscard]] long double distance(const Vector3D &vec)const; //gives distance between two vectors + [[nodiscard]] long double find_magnitude()const override; //magnitude of the vector + [[nodiscard]] Vector3D cross_product(const Vector3D &vec)const; //cross_product + [[nodiscard]] long double scaler_triple_product(Vector3D& b, Vector3D& c) const; + Vector3D normalize_vector(); //normalized vector + bool isOrthogonalWith(Vector3D& v)const; + void typeOfAngleBetween(const Vector3D& v)const; + static void show_objectCount() { std::cout << "\n vector3D object count: " + << vec3d_objectCount << std::endl; } + static int get_objectCount() { return vec3d_objectCount; } + bool operator==(const Vector3D& v)const; + bool operator!=(const Vector3D& v)const; + bool operator>(const Vector3D& v)const; + bool operator>=(const Vector3D& v)const; + bool operator<(const Vector3D& v)const; + bool operator<=(const Vector3D& v)const; + Vector3D operator+(const Vector3D &vec)const; //addition + Vector3D operator+(Vector3D &vec)const; + Vector3D &operator+=(const Vector3D &vec); ////assigning new result to the vector + Vector3D operator-(const Vector3D &vec)const; //subtraction + Vector3D operator-(const long double number)const; + Vector3D operator-()const; + Vector3D operator--(); + Vector3D operator--(int); + Vector3D &operator-=(const Vector3D &vec); //assigning new result to the vector + Vector3D operator*(long double value)const; //multiplication + Vector3D &operator*=(long double value); //assigning new result to the vector. + Vector3D &operator=(const Vector3D &vec); + friend ostream& operator<<(ostream&, const Vector3D&); + friend istream& operator>>(istream&, Vector3D&); + + + ~Vector3D()override; + +}; +#endif + + +inline Vector3D::Vector3D(string id) //constructor +{ + x=0; + y=0; + z=0; + xAngle = 0.0; + yAngle = 0.0; + zAngle = 0.0; + magnitude = static_cast(0.0); + radius = 0.0; + inclination = 0.0; + azimuth = 0.0; + countIncrease(); + if (id == "") + { + ID = "vec3d_" + std::to_string(vec3d_objectCount); + } + else + { + ID = id; + } + //cout<< object_counter << ": " <<"in the 3dVector default constructor"<-1) { + cout << setiosflags(ios::fixed); + cout << y << ","; + cout << resetiosflags(ios::fixed); + } + else { + cout << y << ","; + } + if (z<0 && z>-1) { + cout << setiosflags(ios::fixed); + cout << z << ")" << endl; + cout << resetiosflags(ios::fixed); + } + else { + cout << z << ")"; + } + std::cout << std::endl; +} +inline void Vector3D::showSphericalCoordinates(const std::string& label)const +{ + cout<<((label.empty()) ? ID : label) << setprecision(6) + << ": = <" << radius + << ", " << inclination << ", " << azimuth << ">"<x * this->x) + (this->y * this->y) + (this->z * this->z)); +} +inline void Vector3D::setInclination() +{ + inclination = acos(z / radius)*DEGREE; +} +inline void Vector3D::setAzimuth() +{ + azimuth = atan(y / x)*DEGREE; +} +inline void Vector3D::calculate_spherical() +{ + setRadius(); + setInclination(); + setAzimuth(); +} +inline void Vector3D::set_allAngles() +{ + xAngle = return_xAngle(); + yAngle = return_yAngle(); + zAngle = return_zAngle(); + //angle = +} + +inline void Vector3D::set_magnitude() +{ + magnitude = find_magnitude(); +} + +inline void Vector3D::updateVector() +{ + set_magnitude(); + set_allAngles(); + calculate_spherical(); +} + +//addition +inline Vector3D Vector3D::operator+(const Vector3D &vec)const +{ + return Vector3D(x+vec.x,y+vec.y,z+vec.z); +} +inline Vector3D Vector3D::operator+(Vector3D &vec)const +{ + return Vector3D(x+vec.x,y+vec.y,z); +} + +inline Vector3D &Vector3D::operator+=(const Vector3D &vec) +{ + x+=vec.x; + y+=vec.y; + z+=vec.z; + updateVector(); + return *this; +} + +//subtraction// +inline Vector3D Vector3D::operator-(const Vector3D &vec)const +{ + return Vector3D(x-vec.x,y-vec.y,z-vec.z); +} +inline Vector3D Vector3D::operator-(const long double n) const +{ + return Vector3D(x-n, y-n, z-n); +} +inline Vector3D Vector3D::operator-() const +{ + return Vector3D(-x, -y, -z); +} +inline Vector3D Vector3D::operator--() +{ + return Vector3D(--x, --y, --z); +} +inline Vector3D Vector3D::operator--(int) +{ + return Vector3D(x--, y--, z--); +} +inline Vector3D &Vector3D::operator-=(const Vector3D &vec) +{ + x-=vec.x; + y-=vec.y; + z-=vec.z; + updateVector(); + return *this; +} + +//scalar multiplication +inline Vector3D Vector3D::operator*(long double value)const +{ + return Vector3D(x*value,y*value,z*value); +} +inline Vector3D &Vector3D::operator*=(long double value) +{ + x*=value; + y*=value; + z*=value; + set_allAngles(); + return *this; +} + + +inline Vector3D& Vector3D::operator=(const Vector3D& vec) +{ + x = vec.x; + y = vec.y; + z = vec.z; + set_allAngles(); + + return *this; +} + +inline ostream& operator<<(ostream& os, const Vector3D & v) +{ + if(v.mode == 'R' || v.mode == 'r'){ + v.showRectCord(); + } + else{ + v.showPolarCord(); + } + return os; +} + +inline istream& operator>>(istream& is, Vector3D& v) +{ + long double x_, y_, z_; + std::string id = v.getID(); + std::cout << "please enter the x y z values of " << id << "\n>>"; + is >> x_ >> y_ >> z_; + v.setX(x_); v.setY(y_); v.setZ(z_); + return is; +} + + +//Dot product +inline long double Vector3D::dot_product(const Vector3D &vec) const +{ + return x * vec.x + vec.y * y + vec.z * z; +} +inline long double Vector3D::dot_product(const long double uMag, const long double vMag, const long double angleBetween) +{ + return uMag * vMag * cos(angleBetween*RADIAN); +} +//cross product +inline Vector3D Vector3D::cross_product(const Vector3D &vec)const +{ + long double ni=y*vec.z-z*vec.y; + long double nj=z*vec.x-x*vec.z; + long double nk=x*vec.y-y*vec.x; + return Vector3D(ni,nj,nk); +} +inline long double Vector3D::scaler_triple_product(Vector3D& b, Vector3D& c) const +{ + return this->dot_product(b.cross_product(c)); +} +inline long double Vector3D::find_magnitude()const +{ + return static_cast( sqrt(square())); +} +inline long double Vector3D::square()const +{ + return static_cast( x*x+y*y+z*z); +} + +inline Vector3D Vector3D::normalize_vector() +{ + //assert(find_magnitude()!=0); + const auto length = sqrt((this->x * this->x) + (this->y * this->y) + (this->z * this->z)); + this->x /= length; + this->y /= length; + this->z /= length; + calculate_spherical(); + set_allAngles(); + return *this; +} + +inline bool Vector3D::isOrthogonalWith(Vector3D& v)const +{ + return this->dot_product(v) == 0.0; +} + +inline void Vector3D::typeOfAngleBetween(const Vector3D& v) const +{ + if (dot_product(v) < 0) + { + std::cout << "vectors are obtuse\n"; + } + else if (dot_product(v) > 0) + { + std::cout << "vectors are acute\n"; + } + else if (dot_product(v) == 0) + { + std::cout << "vectors are right"; + } + +} + +inline bool Vector3D::operator==(const Vector3D& v) const +{ + return std::make_tuple(this->x, this->y, this->z) == + std::make_tuple(v.x, v.y, v.z); +} + +inline bool Vector3D::operator!=(const Vector3D& v) const +{ + return std::make_tuple(this->x, this->y, this->z) != + std::make_tuple(v.x, v.y, v.z); +} + +inline bool Vector3D::operator>(const Vector3D& v) const +{ + return std::make_tuple(this->x, this->y, this->z) > + std::make_tuple(v.x, v.y, v.z); +} + +inline bool Vector3D::operator>=(const Vector3D& v) const +{ + return std::make_tuple(this->x, this->y, this->z) >= + std::make_tuple(v.x, v.y, v.z); +} + +inline bool Vector3D::operator<(const Vector3D& v) const +{ + return std::make_tuple(this->x, this->y, this->z) < + std::make_tuple(v.x, v.y, v.z); +} + +inline bool Vector3D::operator<=(const Vector3D& v) const +{ + return std::make_tuple(this->x, this->y, this->z) <= + std::make_tuple(v.x, v.y, v.z); +} + + +inline long double Vector3D::distance(const Vector3D &vec)const +{ + long double x1, x2, y1, y2, z1, z2; + x1 = this->x; + x2 = vec.x; + y1 = this->y; + y2 = vec.y; + z1 = this->z; + z2 = vec.z; + return sqrt((pow(x2 - x1, 2) + pow(y2 - y1, 2) + pow(z2 - z1, 2))); +} + +inline long double Vector3D::return_z()const +{ + return z; +} +inline long double Vector3D::return_xAngle()const +{ + return atan2(sqrt(y * y + z * z), x) * DEGREE; +} +inline long double Vector3D::return_yAngle()const +{ + return atan2(sqrt(x * x + z * z), y) * DEGREE; +} +inline long double Vector3D::return_zAngle()const +{ + return atan2(sqrt(x * x + y * y), z) * DEGREE; +} +inline long double Vector3D::return_mag() const +{ + return static_cast(sqrt(x * x + y * y + z * z)); +} +inline long double Vector3D::return_angle() const +{ + std::cout << "there is no one angle in a 3d vector class so this" + << " returns the sum of the three angles instead\n"; + return return_xAngle()+return_yAngle()+ return_zAngle(); +} +inline long double Vector3D::return_arcLength() const +{ + return return_mag()*return_angle()*RADIAN; +} +inline char Vector3D::return_mode() const +{ + return 0; +} + +inline Vector3D Vector3D::projection(Vector3D& v) const +{ + const Vector3D temp(this->x, this->y, this->z); + const auto dotProd = this->dot_product(v); + const auto dpdevisor = this->dot_product(temp); + const auto scalar = dotProd / dpdevisor; + Vector3D resultant = temp * scalar; + return resultant; + //const auto Θ = this->angle_between_vectors(v); + //return this->magnitude * cos(Θ * RADIAN); +} +inline long double Vector3D::angle_between_vectors(Vector3D& v)const +{ + return acos((x*v.x+y*v.y+z*v.z) / (sqrt(x*x+y*y+z*z)* + sqrt(v.x*v.x+v.y*v.y+v.z*v.z))) * DEGREE; +} +inline void Vector3D::display(const std::string& label)const +{ + std::cout << ((label.empty()) ? ID : label) + <<": = "<<"<"<"< +inline long double Vector3D::distance_to_plane(T a, T b, T c, T d) +{ + auto top = abs(((a * x) + (b * y) + (c * z) + d)); + auto bot = sqrt((a * a) + (b * b) + (c * c)); + return top/bot; +} + +#endif //PHYSICSFORMULA_VECTOR3D_H diff --git a/VectorND.h b/VectorND.h index 004524b..5d0f5ca 100644 --- a/VectorND.h +++ b/VectorND.h @@ -1,698 +1,698 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_VECTORND_H -#define PHYSICSFORMULA_VECTORND_H -/** - * @class VectorND - * @details class of static methods that relate to chapter 29 of the open stax - * college physics text book. - * @author Ryan Zurrin - * dateBuilt 5/22/2021 - * lastEdit 5/26/2021 - */ - -#ifndef VECTOR_ND_H -#define VECTOR_ND_H -#include -#include -#include -#include -#include "Vector3D.h" -using namespace std; -#define ull unsigned long long -#define lld long double - -//α=224,ß=225,π=227,Σ=228,σ=229,µ=230,τ=231,Φ=232,Θ=233 -//Ω=234,δ=235,∞=236,φ=237,ε=238,∩=239,≡=240,Γ=226,γ, σ, ϑ, Å, Ώ, λ, γ - - -static int vecNd_objCounter = 0; -using namespace std; - -template -void display_vector(T& v) -{ - // Declare iterator - typename T::iterator ptr; - for (ptr = v.begin(); ptr != v.end(); ++ptr) { - cout << *ptr << ' '; - } - cout << '\n'; -} - -// Template class to create vector of -// different data_type -template -class VectorND { - - -public: - explicit VectorND(ull = 4); - VectorND(VectorND&& v)noexcept - { - countIncrease(); - ID = "vecNd_" + std::to_string(vecNd_objCounter); - this->capacity = v.capacity; - this->arr = v.arr; - this->length = 0; - for (auto i = 0; i < v.length; i++) - { - this->push_back(v.arr[i]); - } - magnitude = calculateMagnitude(); - }; - - VectorND(const VectorND& v) - { - countIncrease(); - ID = "vecNd_" + std::to_string(vecNd_objCounter); - this->capacity = v.capacity; - this->arr = v.arr; - this->length = 0; - for (int i = 0; i < v.length; i++) - { - this->push_back(v.arr[i]); - } - magnitude = calculateMagnitude(); - } - - template - explicit VectorND(const T& first, const Args&... args); - - // Function that returns the number of - // elements in array after pushing the data - ull push_back(T); - - // function that returns the popped element - T pop_back(); - - - template - void addValuesToVector(const T& first, const Args&... args); - - void display_vector(std::string label = "")const; - void display_eigen(std::string label = "")const; - void show_magnitude(std::string label = "")const; - - // Function that return the size of vector - ull size() const; - T& operator[](ull); - - // Iterator Class - class iterator { - - public: - explicit iterator() - : ptr(nullptr) - { - } - explicit iterator(T* p) - : ptr(p) - { - } - bool operator==(const iterator& rhs) const - { - return ptr == rhs.ptr; - } - bool operator!=(const iterator& rhs) const - { - return !(*this == rhs); - } - T operator*() const - { - return *ptr; - } - iterator& operator++() - { - ++ptr; - return *this; - } - iterator operator++(int) - { - iterator temp(*this); - ++*this; - return temp; - } - private: - // Dynamic array using pointers - T* ptr; - - }; - - // Begin iterator - iterator begin() const; - - // End iterator - iterator end() const; - - static void show_objectCount() { std::cout << "\nvectorND object count: " - << vecNd_objCounter << std::endl; } - static int get_objectCount() { return vecNd_objCounter; } - - //VectorNd(VectorNd&& temp)noexcept; - bool operator==(const VectorND& v); - bool operator!=(const VectorND& v); - bool operator>(const VectorND& v)const; - bool operator>=(const VectorND& v)const; - bool operator<(const VectorND& v)const; - bool operator<=(const VectorND& v)const; - VectorND operator+(const VectorND &vec)const; //addition - VectorND operator+(VectorND &vec)const; - VectorND &operator+=(const VectorND &vec); ////assigning new result to the vector - VectorND operator-(const VectorND &vec); //subtraction - VectorND operator-(const T number)const; - VectorND operator-()const; - VectorND operator--(); - VectorND operator--(int); - VectorND &operator-=(const VectorND &vec); //assigning new result to the vector - - VectorND &operator*=(T value); //assigning new result to the vector. - VectorND &operator=(const VectorND &vec); - VectorND &operator=(const VectorND *v); - VectorND &operator=(VectorND&& right)noexcept; - VectorND operator*(T); - - friend VectorND operator*(T s, VectorND& v) - { - return v*s; - } - friend VectorND operator*(VectorND& v, VectorND& s) - { - VectorND temp(v.length); - temp.vec = v.vec; - temp.length = 0; - for (int i = 0; i < v.length; i++) - { - temp.push_back(v.arr[i] * s.arr[i]); - } - return temp; - } - - [[nodiscard]] double dot_product(const VectorND& v)const; - [[nodiscard]] VectorND cross_product(const VectorND& v)const; - [[nodiscard]] double distance(const VectorND& v)const; - [[nodiscard]] double angle_between_vectors(VectorND& v)const; - int getSize() const; - bool isOrthogonalWith(VectorND& v)const; - void typeOfAngleBetween(const VectorND& v)const; - -private: - T* arr; - - // Variable to store the current capacity - // of the vector - ull capacity; - - // Variable to store the length of the - // vector - ull length; - - //Variable to store the magnitude of all the elements - ull magnitude; - - //Variable to store the vector name - string ID; - - - - ull calculateMagnitude(); - - bool isEqual(VectorND rhs); - - static void countIncrease() { vecNd_objCounter += 1; } - static void countDecrease() { vecNd_objCounter -= 1; } - -public: - ~VectorND(); - - void set(int i, VectorND nd); - - int get(int i); -}; -#endif - -// Template class to return the size of -// vector of different data_type -template -VectorND::VectorND(ull n) - : arr(new T[n]), - capacity(n), - length(0), - magnitude(0), - ID("") -{ - magnitude = calculateMagnitude(); - countIncrease(); - ID = "vecNd_" + std::to_string(vecNd_objCounter); -} - -template -template -inline VectorND::VectorND(const T& first, const Args & ...args) -{ - countIncrease(); - ID = "vecNd_" + std::to_string(vecNd_objCounter); - arr = new T[100]; - capacity = 100; - length = 0; - vector container; - container.push_back(first); - int dummy[] = { 0, (container.push_back(args), 0)... }; - (void)dummy; - - for (const auto& i : container) - { - this->push_back(i); - } - magnitude = calculateMagnitude(); -} - -template -template -inline void VectorND::addValuesToVector(const T& first, const Args & ...args) -{ - vector container; - container.push_back(first); - int dummy[] = { 0, (container.push_back(args), 0)... }; - (void)dummy; - - for (const auto &i : container) - { - this->push_back(i); - } - magnitude = calculateMagnitude(); -} - - - - -// Template class to insert the element -// in vector -template -ull VectorND::push_back(T data) -{ - if (length == capacity) { - T* old = arr; - arr = new T[capacity = capacity * 2]; - copy(old, old + length, arr); - delete[] old; - } - arr[length++] = data; - - magnitude = calculateMagnitude(); - return length; -} - -// Template class to return the popped element -// in vector -template -T VectorND::pop_back() -{ - auto temp = arr[length-- - 1]; - magnitude = calculateMagnitude(); - return temp; -} - -template -inline void VectorND::display_vector(std::string label)const -{ - std::cout << ((label == "") ? ID : label)<<": "; - for (typename VectorND::iterator ptr = this->begin(); ptr != this->end(); ++ptr) { - cout << *ptr << ' '; - } - show_magnitude(label); - cout << '\n'; - -} - -template -void VectorND::show_magnitude(std::string label) const -{ - std::cout<< "\n" << ((label.empty()) ? ID : label)<<":"; - std::cout << " Magnitude: " << magnitude << endl; -} - -// Template class to return the size of -// vector -template -ull VectorND::size() const -{ - return length; -} - -// Template class to return the element of -// vector at given index -template -T& VectorND::operator[](ull index) -{ - if (index >= length&&index>capacity) { - cout << "Error: Array index out of bound"; - exit(0); - } - return *(arr + index); -} - - -// Template class to return begin iterator -template -typename VectorND::iterator -VectorND::begin() const -{ - return iterator(arr); -} - -// Template class to return end iterator -template -typename VectorND::iterator -VectorND::end() const -{ - return iterator(arr + length); -} - -template -ull VectorND::calculateMagnitude() -{ - ull total = static_cast(0.0); - for (size_t i = 0; i < length; i++) - { - total = total + static_cast(arr[i] * arr[i]); - } - total = static_cast(sqrt(total)); - return total; -} - -template -bool VectorND::isEqual(VectorND rhs) -{ - if (this->length != rhs.length) - return false; - - /* Compare elements of the array */ - for (int i = 0; i < rhs.length; i++) - if (arr[i] != rhs.arr[i]) - return false; /* Elements are not same */ - - /* All elements are same */ - return true; -} - - -template -bool VectorND::operator==(const VectorND& v) -{ - return this->isEqual(v); -} - -template -bool VectorND::operator!=(const VectorND& v) -{ - return !(this->isEqual(v)); -} - -template -bool VectorND::operator>(const VectorND& v) const -{ - return this->magnitude > v.magnitude; -} - -template -bool VectorND::operator>=(const VectorND& v) const -{ - return this->magnitude >= v.magnitude; -} - -template -bool VectorND::operator<(const VectorND& v) const -{ - return this->magnitude < v.magnitude; -} - -template -bool VectorND::operator<=(const VectorND& v) const -{ - return this->magnitude <= v.magnitude; -} - -template -VectorND VectorND::operator+(const VectorND& vec) const -{ - VectorND temp; - for (size_t i = 0; i < vec.length; i++) - { - temp.push_back(this->arr[i] + vec.arr[i]); - } - magnitude = calculateMagnitude(); - return temp; -} - -template -VectorND VectorND::operator+(VectorND& vec) const -{ - VectorND temp; - for (size_t i = 0; i < vec.length; i++) - { - temp.push_back(this->arr[i] + vec.arr[i]); - } - magnitude = calculateMagnitude(); - return temp; -} - -template -VectorND& VectorND::operator+=(const VectorND& vec) -{ - for (size_t i = 0; i < length; i++) - { - this->arr[i] += vec.arr[i]; - } - magnitude = calculateMagnitude(); - return *this; -} - -template -VectorND VectorND::operator-(const VectorND& vec) -{ - VectorND temp; - for (size_t i = 0; i < length; i++) - { - temp.arr[i] = this->arr[i] - vec.arr[i]; - } - magnitude = calculateMagnitude(); - return temp; -} - -template -VectorND VectorND::operator-(const T number) const -{ - VectorND temp; - for (size_t i = 0; i < length; i++) - { - temp = this->arr[i] - number; - } - magnitude = calculateMagnitude(); - return temp; -} - -template -VectorND VectorND::operator-() const -{ - VectorND temp; - for (size_t i = 0; i < length; i++) - { - temp.arr[i] = this->arr[-i]; - } - magnitude = calculateMagnitude(); - return temp; -} - -template -VectorND VectorND::operator--() -{ - VectorND temp; - for (size_t i = 0; i < length; i++) - { - temp.arr[i] = this->arr[--i]; - } - magnitude = calculateMagnitude(); - return temp; -} - -template -VectorND VectorND::operator--(int) -{ - VectorND temp; - for (int i = 0; i < length; i++) - { - temp.arr[i] = this->arr[i--]; - } - magnitude = calculateMagnitude(); - return temp; -} - -template -VectorND& VectorND::operator-=(const VectorND& vec) -{ - for (int i = 0; i < length; i++) - { - this->arr[i] -= vec.arr[i]; - } - magnitude = calculateMagnitude(); - return *this; -} - -template -VectorND& VectorND::operator*=(T value) -{ - for (auto i = 0; i < length; i++) - { - arr[i] *= value; - } - magnitude = calculateMagnitude(); - return *this; -} - -template -VectorND& VectorND::operator=(const VectorND& v) -{ - this->length = v.length; - this->capacity = v.capacity; - for (int i = 0; i < length; i++) - { - this->arr[i] = v.arr[i]; - } - magnitude = calculateMagnitude(); - return *this; -} - -template -VectorND& VectorND::operator=(const VectorND* v) -{ - this->capacity = v->capacity; - this->length = v->length; - for (size_t i = 0; i < v->size(); i++) - { - this->arr[i] = v->arr[i]; - } - magnitude = calculateMagnitude(); - return *this; -} - -template -VectorND& VectorND::operator=(VectorND&& right) noexcept -{ - if (this != &right) - { - swap(this->capacity, right.capacity); - swap(this->length, right.length); - swap(this->vec, right.vec); - swap(this->magnitude, right.magnitude); - } - return *this; -} - -template -VectorND VectorND::operator*(T s) -{ - VectorND temp; - for (auto i = 0; i < length; i++) - { - temp.push_back(arr[i] * s); - } - magnitude = calculateMagnitude(); - return temp; -} - -template -inline double VectorND::dot_product(const VectorND& v) const -{ - auto total = 0; - for (int i = 0; i < length; i++) - { - total += arr[i] * v.arr[i]; - } - return total; -} - -template -inline VectorND VectorND::cross_product(const VectorND& v) const -{ - if (length != 3) - { - std::cout << "cross product can only be used on vectors of length 3."; - return this; - } - long double ni = arr[1] * arr[2] - arr[2] * arr[1]; - long double nj = arr[2] * arr[0] - arr[0] * arr[2]; - long double nk = arr[0] * arr[1] - arr[1] * arr[0]; - return VectorND(ni, nj, nk); -} - -template -inline double VectorND::distance(const VectorND& v) const -{ - double sum = 0.0; - for (int i = 0; i < v.length; i++) { - sum += pow(arr[i] - v.arr[i], 2); - } - return sqrt(sum); -} - -template -inline double VectorND::angle_between_vectors(VectorND& v) const -{ - auto dotProd = dot_product(v); - auto divisor = magnitude * v.magnitude; - auto temp = dotProd / divisor; - return acos(temp)*DEGREE; -} - -template -inline bool VectorND::isOrthogonalWith(VectorND& v) const -{ - return dot_product(v) == 0.0; -} - -template -inline void VectorND::typeOfAngleBetween(const VectorND& v) const -{ - if (dot_product(v) < 0) - { - std::cout << "vectors are obtuse\n"; - } - else if (dot_product(v) > 0) - { - std::cout << "vectors are acute\n"; - } - else if (dot_product(v) == 0) - { - std::cout << "vectors are right\n"; - } -} - - - -template -VectorND::~VectorND() -{ - countDecrease(); -} - -template -int VectorND::getSize() const { - return length; -} - -template -void VectorND::set(int i, VectorND nd) { - arr[i] = nd; -} - -template -int VectorND::get(int i) { - return arr[i]; -} -// Template class to display element in -// vector - -#endif //PHYSICSFORMULA_VECTORND_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_VECTORND_H +#define PHYSICSFORMULA_VECTORND_H +/** + * @class VectorND + * @details class of static methods that relate to chapter 29 of the open stax + * college physics text book. + * @author Ryan Zurrin + * dateBuilt 5/22/2021 + * lastEdit 5/26/2021 + */ + +#ifndef VECTOR_ND_H +#define VECTOR_ND_H +#include +#include +#include +#include +#include "Vector3D.h" +using namespace std; +#define ull unsigned long long +#define lld long double + +//α=224,ß=225,π=227,Σ=228,σ=229,µ=230,τ=231,Φ=232,Θ=233 +//Ω=234,δ=235,∞=236,φ=237,ε=238,∩=239,≡=240,Γ=226,γ, σ, ϑ, Å, Ώ, λ, γ + + +static int vecNd_objCounter = 0; +using namespace std; + +template +void display_vector(T& v) +{ + // Declare iterator + typename T::iterator ptr; + for (ptr = v.begin(); ptr != v.end(); ++ptr) { + cout << *ptr << ' '; + } + cout << '\n'; +} + +// Template class to create vector of +// different data_type +template +class VectorND { + + +public: + explicit VectorND(ull = 4); + VectorND(VectorND&& v)noexcept + { + countIncrease(); + ID = "vecNd_" + std::to_string(vecNd_objCounter); + this->capacity = v.capacity; + this->arr = v.arr; + this->length = 0; + for (auto i = 0; i < v.length; i++) + { + this->push_back(v.arr[i]); + } + magnitude = calculateMagnitude(); + }; + + VectorND(const VectorND& v) + { + countIncrease(); + ID = "vecNd_" + std::to_string(vecNd_objCounter); + this->capacity = v.capacity; + this->arr = v.arr; + this->length = 0; + for (int i = 0; i < v.length; i++) + { + this->push_back(v.arr[i]); + } + magnitude = calculateMagnitude(); + } + + template + explicit VectorND(const T& first, const Args&... args); + + // Function that returns the number of + // elements in array after pushing the data + ull push_back(T); + + // function that returns the popped element + T pop_back(); + + + template + void addValuesToVector(const T& first, const Args&... args); + + void display_vector(std::string label = "")const; + void display_eigen(std::string label = "")const; + void show_magnitude(std::string label = "")const; + + // Function that return the size of vector + ull size() const; + T& operator[](ull); + + // Iterator Class + class iterator { + + public: + explicit iterator() + : ptr(nullptr) + { + } + explicit iterator(T* p) + : ptr(p) + { + } + bool operator==(const iterator& rhs) const + { + return ptr == rhs.ptr; + } + bool operator!=(const iterator& rhs) const + { + return !(*this == rhs); + } + T operator*() const + { + return *ptr; + } + iterator& operator++() + { + ++ptr; + return *this; + } + iterator operator++(int) + { + iterator temp(*this); + ++*this; + return temp; + } + private: + // Dynamic array using pointers + T* ptr; + + }; + + // Begin iterator + iterator begin() const; + + // End iterator + iterator end() const; + + static void show_objectCount() { std::cout << "\nvectorND object count: " + << vecNd_objCounter << std::endl; } + static int get_objectCount() { return vecNd_objCounter; } + + //VectorNd(VectorNd&& temp)noexcept; + bool operator==(const VectorND& v); + bool operator!=(const VectorND& v); + bool operator>(const VectorND& v)const; + bool operator>=(const VectorND& v)const; + bool operator<(const VectorND& v)const; + bool operator<=(const VectorND& v)const; + VectorND operator+(const VectorND &vec)const; //addition + VectorND operator+(VectorND &vec)const; + VectorND &operator+=(const VectorND &vec); ////assigning new result to the vector + VectorND operator-(const VectorND &vec); //subtraction + VectorND operator-(const T number)const; + VectorND operator-()const; + VectorND operator--(); + VectorND operator--(int); + VectorND &operator-=(const VectorND &vec); //assigning new result to the vector + + VectorND &operator*=(T value); //assigning new result to the vector. + VectorND &operator=(const VectorND &vec); + VectorND &operator=(const VectorND *v); + VectorND &operator=(VectorND&& right)noexcept; + VectorND operator*(T); + + friend VectorND operator*(T s, VectorND& v) + { + return v*s; + } + friend VectorND operator*(VectorND& v, VectorND& s) + { + VectorND temp(v.length); + temp.vec = v.vec; + temp.length = 0; + for (int i = 0; i < v.length; i++) + { + temp.push_back(v.arr[i] * s.arr[i]); + } + return temp; + } + + [[nodiscard]] double dot_product(const VectorND& v)const; + [[nodiscard]] VectorND cross_product(const VectorND& v)const; + [[nodiscard]] double distance(const VectorND& v)const; + [[nodiscard]] double angle_between_vectors(VectorND& v)const; + int getSize() const; + bool isOrthogonalWith(VectorND& v)const; + void typeOfAngleBetween(const VectorND& v)const; + +private: + T* arr; + + // Variable to store the current capacity + // of the vector + ull capacity; + + // Variable to store the length of the + // vector + ull length; + + //Variable to store the magnitude of all the elements + ull magnitude; + + //Variable to store the vector name + string ID; + + + + ull calculateMagnitude(); + + bool isEqual(VectorND rhs); + + static void countIncrease() { vecNd_objCounter += 1; } + static void countDecrease() { vecNd_objCounter -= 1; } + +public: + ~VectorND(); + + void set(int i, VectorND nd); + + int get(int i); +}; +#endif + +// Template class to return the size of +// vector of different data_type +template +VectorND::VectorND(ull n) + : arr(new T[n]), + capacity(n), + length(0), + magnitude(0), + ID("") +{ + magnitude = calculateMagnitude(); + countIncrease(); + ID = "vecNd_" + std::to_string(vecNd_objCounter); +} + +template +template +inline VectorND::VectorND(const T& first, const Args & ...args) +{ + countIncrease(); + ID = "vecNd_" + std::to_string(vecNd_objCounter); + arr = new T[100]; + capacity = 100; + length = 0; + vector container; + container.push_back(first); + int dummy[] = { 0, (container.push_back(args), 0)... }; + (void)dummy; + + for (const auto& i : container) + { + this->push_back(i); + } + magnitude = calculateMagnitude(); +} + +template +template +inline void VectorND::addValuesToVector(const T& first, const Args & ...args) +{ + vector container; + container.push_back(first); + int dummy[] = { 0, (container.push_back(args), 0)... }; + (void)dummy; + + for (const auto &i : container) + { + this->push_back(i); + } + magnitude = calculateMagnitude(); +} + + + + +// Template class to insert the element +// in vector +template +ull VectorND::push_back(T data) +{ + if (length == capacity) { + T* old = arr; + arr = new T[capacity = capacity * 2]; + copy(old, old + length, arr); + delete[] old; + } + arr[length++] = data; + + magnitude = calculateMagnitude(); + return length; +} + +// Template class to return the popped element +// in vector +template +T VectorND::pop_back() +{ + auto temp = arr[length-- - 1]; + magnitude = calculateMagnitude(); + return temp; +} + +template +inline void VectorND::display_vector(std::string label)const +{ + std::cout << ((label == "") ? ID : label)<<": "; + for (typename VectorND::iterator ptr = this->begin(); ptr != this->end(); ++ptr) { + cout << *ptr << ' '; + } + show_magnitude(label); + cout << '\n'; + +} + +template +void VectorND::show_magnitude(std::string label) const +{ + std::cout<< "\n" << ((label.empty()) ? ID : label)<<":"; + std::cout << " Magnitude: " << magnitude << endl; +} + +// Template class to return the size of +// vector +template +ull VectorND::size() const +{ + return length; +} + +// Template class to return the element of +// vector at given index +template +T& VectorND::operator[](ull index) +{ + if (index >= length&&index>capacity) { + cout << "Error: Array index out of bound"; + exit(0); + } + return *(arr + index); +} + + +// Template class to return begin iterator +template +typename VectorND::iterator +VectorND::begin() const +{ + return iterator(arr); +} + +// Template class to return end iterator +template +typename VectorND::iterator +VectorND::end() const +{ + return iterator(arr + length); +} + +template +ull VectorND::calculateMagnitude() +{ + ull total = static_cast(0.0); + for (size_t i = 0; i < length; i++) + { + total = total + static_cast(arr[i] * arr[i]); + } + total = static_cast(sqrt(total)); + return total; +} + +template +bool VectorND::isEqual(VectorND rhs) +{ + if (this->length != rhs.length) + return false; + + /* Compare elements of the array */ + for (int i = 0; i < rhs.length; i++) + if (arr[i] != rhs.arr[i]) + return false; /* Elements are not same */ + + /* All elements are same */ + return true; +} + + +template +bool VectorND::operator==(const VectorND& v) +{ + return this->isEqual(v); +} + +template +bool VectorND::operator!=(const VectorND& v) +{ + return !(this->isEqual(v)); +} + +template +bool VectorND::operator>(const VectorND& v) const +{ + return this->magnitude > v.magnitude; +} + +template +bool VectorND::operator>=(const VectorND& v) const +{ + return this->magnitude >= v.magnitude; +} + +template +bool VectorND::operator<(const VectorND& v) const +{ + return this->magnitude < v.magnitude; +} + +template +bool VectorND::operator<=(const VectorND& v) const +{ + return this->magnitude <= v.magnitude; +} + +template +VectorND VectorND::operator+(const VectorND& vec) const +{ + VectorND temp; + for (size_t i = 0; i < vec.length; i++) + { + temp.push_back(this->arr[i] + vec.arr[i]); + } + magnitude = calculateMagnitude(); + return temp; +} + +template +VectorND VectorND::operator+(VectorND& vec) const +{ + VectorND temp; + for (size_t i = 0; i < vec.length; i++) + { + temp.push_back(this->arr[i] + vec.arr[i]); + } + magnitude = calculateMagnitude(); + return temp; +} + +template +VectorND& VectorND::operator+=(const VectorND& vec) +{ + for (size_t i = 0; i < length; i++) + { + this->arr[i] += vec.arr[i]; + } + magnitude = calculateMagnitude(); + return *this; +} + +template +VectorND VectorND::operator-(const VectorND& vec) +{ + VectorND temp; + for (size_t i = 0; i < length; i++) + { + temp.arr[i] = this->arr[i] - vec.arr[i]; + } + magnitude = calculateMagnitude(); + return temp; +} + +template +VectorND VectorND::operator-(const T number) const +{ + VectorND temp; + for (size_t i = 0; i < length; i++) + { + temp = this->arr[i] - number; + } + magnitude = calculateMagnitude(); + return temp; +} + +template +VectorND VectorND::operator-() const +{ + VectorND temp; + for (size_t i = 0; i < length; i++) + { + temp.arr[i] = this->arr[-i]; + } + magnitude = calculateMagnitude(); + return temp; +} + +template +VectorND VectorND::operator--() +{ + VectorND temp; + for (size_t i = 0; i < length; i++) + { + temp.arr[i] = this->arr[--i]; + } + magnitude = calculateMagnitude(); + return temp; +} + +template +VectorND VectorND::operator--(int) +{ + VectorND temp; + for (int i = 0; i < length; i++) + { + temp.arr[i] = this->arr[i--]; + } + magnitude = calculateMagnitude(); + return temp; +} + +template +VectorND& VectorND::operator-=(const VectorND& vec) +{ + for (int i = 0; i < length; i++) + { + this->arr[i] -= vec.arr[i]; + } + magnitude = calculateMagnitude(); + return *this; +} + +template +VectorND& VectorND::operator*=(T value) +{ + for (auto i = 0; i < length; i++) + { + arr[i] *= value; + } + magnitude = calculateMagnitude(); + return *this; +} + +template +VectorND& VectorND::operator=(const VectorND& v) +{ + this->length = v.length; + this->capacity = v.capacity; + for (int i = 0; i < length; i++) + { + this->arr[i] = v.arr[i]; + } + magnitude = calculateMagnitude(); + return *this; +} + +template +VectorND& VectorND::operator=(const VectorND* v) +{ + this->capacity = v->capacity; + this->length = v->length; + for (size_t i = 0; i < v->size(); i++) + { + this->arr[i] = v->arr[i]; + } + magnitude = calculateMagnitude(); + return *this; +} + +template +VectorND& VectorND::operator=(VectorND&& right) noexcept +{ + if (this != &right) + { + swap(this->capacity, right.capacity); + swap(this->length, right.length); + swap(this->vec, right.vec); + swap(this->magnitude, right.magnitude); + } + return *this; +} + +template +VectorND VectorND::operator*(T s) +{ + VectorND temp; + for (auto i = 0; i < length; i++) + { + temp.push_back(arr[i] * s); + } + magnitude = calculateMagnitude(); + return temp; +} + +template +inline double VectorND::dot_product(const VectorND& v) const +{ + auto total = 0; + for (int i = 0; i < length; i++) + { + total += arr[i] * v.arr[i]; + } + return total; +} + +template +inline VectorND VectorND::cross_product(const VectorND& v) const +{ + if (length != 3) + { + std::cout << "cross product can only be used on vectors of length 3."; + return this; + } + long double ni = arr[1] * arr[2] - arr[2] * arr[1]; + long double nj = arr[2] * arr[0] - arr[0] * arr[2]; + long double nk = arr[0] * arr[1] - arr[1] * arr[0]; + return VectorND(ni, nj, nk); +} + +template +inline double VectorND::distance(const VectorND& v) const +{ + double sum = 0.0; + for (int i = 0; i < v.length; i++) { + sum += pow(arr[i] - v.arr[i], 2); + } + return sqrt(sum); +} + +template +inline double VectorND::angle_between_vectors(VectorND& v) const +{ + auto dotProd = dot_product(v); + auto divisor = magnitude * v.magnitude; + auto temp = dotProd / divisor; + return acos(temp)*DEGREE; +} + +template +inline bool VectorND::isOrthogonalWith(VectorND& v) const +{ + return dot_product(v) == 0.0; +} + +template +inline void VectorND::typeOfAngleBetween(const VectorND& v) const +{ + if (dot_product(v) < 0) + { + std::cout << "vectors are obtuse\n"; + } + else if (dot_product(v) > 0) + { + std::cout << "vectors are acute\n"; + } + else if (dot_product(v) == 0) + { + std::cout << "vectors are right\n"; + } +} + + + +template +VectorND::~VectorND() +{ + countDecrease(); +} + +template +int VectorND::getSize() const { + return length; +} + +template +void VectorND::set(int i, VectorND nd) { + arr[i] = nd; +} + +template +int VectorND::get(int i) { + return arr[i]; +} +// Template class to display element in +// vector + +#endif //PHYSICSFORMULA_VECTORND_H diff --git a/VisionOpticalInstruments.h b/VisionOpticalInstruments.h index 8810bd6..00daac1 100644 --- a/VisionOpticalInstruments.h +++ b/VisionOpticalInstruments.h @@ -1,542 +1,542 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_VISIONOPTICALINSTRUMENTS_H -#define PHYSICSFORMULA_VISIONOPTICALINSTRUMENTS_H -#include "WaveOptics.h" - -static auto visionOpticInstrument_objectCount = 0; - -/// -/// -/// -/// -class VisionOpticalInstruments : - public WaveOptics -{ - -public: - VisionOpticalInstruments* _visOpticPtr; - - VisionOpticalInstruments() - { - _visOpticPtr = nullptr; - visOpticInstVar = 0.0; - countIncrease(); - } - - /** - * @brief copy constructor - */ - VisionOpticalInstruments(const VisionOpticalInstruments& t) - { - _visOpticPtr = t._visOpticPtr; - visOpticInstVar = t.visOpticInstVar; - countIncrease(); - } - /** - * #brief move constructor - */ - VisionOpticalInstruments(VisionOpticalInstruments&& t) noexcept - { - _visOpticPtr = t._visOpticPtr; - visOpticInstVar = t.visOpticInstVar; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - VisionOpticalInstruments& operator=(const VisionOpticalInstruments& t) - { - if (this != &t) - { - _visOpticPtr = t._visOpticPtr; - visOpticInstVar = t.visOpticInstVar; - countIncrease(); - } - return *this; - } - - /// - /// Shows the object count. - /// - /// - static auto show_objectCount() { - std::cout << "\n visOptInstrument object count: " - << visionOpticInstrument_objectCount << std::endl; } - /// - /// Gets the object count. - /// - /// - static auto get_objectCount() { return visionOpticInstrument_objectCount; } - - - /// - /// Finalizes an instance of the class. - /// - ~VisionOpticalInstruments() - { - delete _visOpticPtr; - } - /// - /// Sets the template variable. - /// - /// The variable. - void setTemplateVar(ld var) { visOpticInstVar = var; } - /// - /// Gets the template variable. - /// - /// - ld getTemplateVar() const { return visOpticInstVar; } - - /// - /// Calculates the power of the eye when viewing an object d_o units away and - /// with an image distance d_i units away. (this chapter uses the value of - /// 2.00 cm for all the d_i values when dealing with problems relating to - /// the eye) - /// - /// The object distance. - /// The image distance(default at 2.0*10^-2). - /// the power of the eye in diopters(D) - template - static auto powerOfEye(const T d_o, const T d_i = 2.0*SU.CENTI); - - /// - /// The print in many books averages h_o units in height. Calculate How high - /// the image of the print on the retina when the book is held d_o units from - /// the eye. - /// - /// The object height. - /// The object distance. - /// The image distance(default at 2.0*10^-2). - /// image height - template - static auto imageHeight( const T h_o, const T d_o, const T d_i = 2.0*SU.CENTI); - - /// - /// Suppose a certain person’s visual acuity is such that he can see objects - /// clearly that form an image h_i units high on his retina. Calculate the maximum - /// distance at which he can read the h_o units high letters on the side of - /// an airplane? - /// - /// The object height. - /// The image height. - /// The image distance(default at 2.0*10^-2). - /// object distance - template - static auto objectDistance(const T h_o, const T h_i, const T d_i = 2.0 * SU.CENTI); - - /// - /// Calculate the far point of a person whose eyes have a relaxed - /// power of P_ (D). - /// - /// The power of the eye. - /// The image distance(default at 2.0*10^-2). - /// object distance - template - static auto objectDistance_usingPower(const T P_, const T d_i = 2.00 * SU.CENTI); - - /// - /// A severely myopic patient has a far point of d_o units. Calculate how many - /// diopters the power of their eye should be reduced in laser vision - /// correction to obtain normal distant vision. - /// - /// The d object distance. - /// The image distance(default at 2.0*10^-2). - /// power reduction in eye - template - static auto eyePowerReductionLaserSurgery(const T d_o, const T d_i = 2.00 * SU.CENTI); - - /// - /// A young woman with normal distant vision(d_i = default) has a percentCanAccommodate% - /// ability to accommodate (that is, increase) the power of her eyes. What is - /// the closest object she can see clearly? - /// - /// The percent can accommodate. - /// The image distance(default at 2.0*10^-2) - /// closest clear sight - template - static auto closestObjectDistance_accommodatedPower(const T percentCanAccommodate); - - /// - /// The far point of a myopic administrator is d_o Units. If they have the - /// normal percentCanAccom% ability to accommodate, Calculate what the closest - /// object they can see clearly. - /// - /// The far point or object distance. - /// The percent can accommodate. - /// The image distance(default at 2.0*10^-2) - /// - template - static auto closestObjectDistance_accomodateFarPoint(const T d_o, const T percentCanAccom, const T d_i = 2.00 * SU.CENTI); - - /// - /// A very myopic man has a far point of d_o units. Calculate what power of - /// contact lens(when on the eye) will correct his distant vision? - /// - /// The d object distance(far point). - /// lens power - template - static auto powerOfLensToCorrectMyopicVision(const T d_o); - - /// - /// A very myopic person has a far point of d_o units. Calculate what power eyeglasses, - /// positioned posGlasses units from their eyes, will correct their - /// distant vision. - /// - /// The object distance, far point. - /// The position of glasses to eye. - /// lens power of glasses - template - static auto powerOfLensToCorrectMyopicVision(const T d_o, const T posGlasses); - - /// - /// A myopic person sees that their contact lens prescription is lensPower D. - /// Calculate what their far point is. - /// - /// The lens power. - /// d_o, far point or object distance - template - static auto farPoint_fromLensPowerPrescription(const T lensPower); - - /// - /// A myopic person sees that her eyeglasses prescription is lensPower D, - /// for eyeglasses positioned posGlasses units from her eyes. - /// Calculate her far point? - /// - /// The lens power. - /// The position glasses. - /// the far point, d_o - template - static auto farPoint_fromLensPowerPrescription(const T lensPower, const T posGlasses); - - /// - /// A microscope with an overall magnification of m and has an objective - /// that magnifies by m_o. Calculate the magnification of the eyepiece. - /// - /// The overall magnification. - /// The objective magnification. - /// magnification of eyepiece, m_e - template - static auto magnificationEyepiece(const T m, const T m_o); - - /// - /// A microscope with an objective magnification of m_o has an eyepiece - /// that magnifies by m_e. Calculate the overall magnification. - /// - /// The objective magnification. - /// The eyepiece magnification. - /// the overall magnification, m - template - static auto magnificationMicroscope(const T m_o, const T m_e); - - /// - /// Calculates the images distance with a object distance of d_o and a focal - /// length of f. - /// - /// The focal length. - /// The object distance. - /// image distance, d_i - template - static auto imageDistance(const T f, const K d_o); - - /// - /// What magnification is produced by a f units focal length microscope - /// objective that is d_o units from the object being viewed? - /// - /// The object distance. - /// The focal length. - /// magnification - template - static auto magnification_objective(const ld d_o, const ld f); - - /// - /// Calculates the magnification of a microscope having a image distance of - /// d_i and a object distance of d_o. - /// - /// The d image distance. - /// The d object distance. - /// magnification - template - static auto magnification_dido(const T d_i, const T d_o); - - /// - /// Calculate the angular magnification of a telescope that has a f_o units - /// focal length objective and a f_e units focal length eyepiece. - /// - /// The objective focal length. - /// The eyepiece focal length. - /// angular magnification - template - static auto angularMagnification(const T f_o, const K f_e); - - /// - /// A large reflecting telescope has an objective mirror with a - /// R m radius of curvature. Calculate the angular magnification it - /// produces when a f_e units focal length eyepiece is used? - /// - /// The radius of curvature. - /// The eyepiece focal length. - /// angular magnification - template - static auto angular_magnification(const T R_, const K f_e); - - - /// - /// When you hold an insect at the near point of your eye it subtends an - /// angle of theta rad. Calculate the angular size (magnitude only) - /// of the insect when viewed through a microscope that has an angular - /// magnification with a magnitude of m. - /// - /// The f e. - /// The m e. - /// - template - static auto angularMagnitude_objectThroughMicroscope(const T theta, const K m); - - - /// - /// Where does an object need to be placed relative to a microscope for - /// its f units focal length objective to produce a magnification of –m - /// - /// The focal length. - /// The object magnification. - /// object distance - template - static auto object_Distance(const T f, const K m_o); - - /// - /// Where should the f_e units focal length eyepiece be placed to produce - /// a further (m_e)x magnification - /// - /// The eyepiece focal length. - /// The magnification xM example:(4X magnification) - /// would be a m_e of 4.0. - /// object distance - template - static auto object_distance(const T f_e, const K m_e); - - /// - /// Calculate what a 1.40NA 60x oil immersion objective - /// lens would have for acceptance angles. n = 1.51 for oil, substitute this - /// for whatever you are looking to calculate in place. n is the index of - /// refraction for a medium. - /// - /// The numerical aperture value. - /// The index of refraction. - /// the acceptance angle, the larger this is the more resolution - /// - template - static auto acceptanceAngle(const T NA, const K n); - - /// - /// The lens-to-retina distance of a person is d_r units, and the relaxed - /// power of her eye is P (D). Calculate the far point? - /// - /// The relaxed power. - /// The lens-to-retina distance. - /// far point - template - static auto farPoint(const T P, const T d_r); - - /// - /// The lens-to-retina distance of a woman is LensToRetina units, and the relaxed power - /// of her eye is P D. What eyeglass power will allow her to see distant - /// objects clearly, if her glasses are glassesFromEyes units from her eyes? - /// - /// The lens to retina. - /// The relaxed power. - /// The glasses from eyes. - /// eyeglass power - template - static auto eyeglassPower(const T lensToRetina, const T P, const T glassesFromEyes); - - /// - /// Your physics TA has a far point of 0.663 m from her eyes and is able to see distant objects in focus when wearing glasses with a refractive power of - ///−1.55 D. Determine the distance between her glasses and eyes. - /// - /// The far point. - /// The power. - /// - template - static auto distanceBetweenGlassesAndEyes(const T f_p, const T P); - - - - - - - - -private: - ld visOpticInstVar; - static void countIncrease() { visionOpticInstrument_objectCount += 1; } - static void countDecrease() { visionOpticInstrument_objectCount -= 1; } -}; - -#endif //PHYSICSFORMULA_VISIONOPTICALINSTRUMENTS_H - -template -inline auto VisionOpticalInstruments::powerOfEye(const T d_o, const T d_i) -{ - return (1.0 / d_o) + (1 / d_i);//(D) -} - -template -inline auto VisionOpticalInstruments::imageHeight(const T h_o, const T d_o, const T d_i) -{ - return -(d_i * h_o) / d_o; -} - -template -inline auto VisionOpticalInstruments::objectDistance(const T h_o, const T h_i, const T d_i) -{ - return -(d_i * h_o) / h_i; -} - -template -inline auto VisionOpticalInstruments::objectDistance_usingPower(const T P_, const T d_i) -{ - return 1.0 / (P_ - (1.0 / d_i)); -} - -template -inline auto VisionOpticalInstruments::eyePowerReductionLaserSurgery(const T d_o, const T d_i) -{ - return (1.0 / d_i) - ((1.0 / d_o) + (1.0 / d_i)); -} - -template -inline auto VisionOpticalInstruments::closestObjectDistance_accommodatedPower(const T percentCanAccommodate) -{ - const auto d_i = 2.00 * SU.CENTI; - const auto decimal = percentCanAccommodate / 100.0; - const auto increased = 1.0 + decimal; - const auto pMax = increased * (1.0 / d_i); - return 1.0 / (pMax - (1.0 / d_i)); -} - -template -inline auto VisionOpticalInstruments::closestObjectDistance_accomodateFarPoint(const T d_o, const T percentCanAccom, const T d_i) -{ - const auto decimal = percentCanAccom / 100.0; - const auto pFar = (1.0 / d_o) + (1.0 / d_i); - const auto pClose = (1.0 + decimal) * pFar; - return 1.00 / (pClose - (1.0 / d_i)); -} - -template -inline auto VisionOpticalInstruments::powerOfLensToCorrectMyopicVision(const T d_o) -{ - return static_cast(-1.00) / d_o; -} - -template -inline auto VisionOpticalInstruments::powerOfLensToCorrectMyopicVision(const T d_o, const T posGlasses) -{ - const auto d_i = d_o - posGlasses; - return static_cast(-1.00) / d_i; -} - -template -inline auto VisionOpticalInstruments::farPoint_fromLensPowerPrescription(const T lensPower) -{ - return static_cast(-1.00) / lensPower; -} - -template -inline auto VisionOpticalInstruments::farPoint_fromLensPowerPrescription(const T lensPower, const T posGlasses) -{ - const auto d_i = 1.00 / lensPower; - return -(d_i)+posGlasses; -} - -template -inline auto VisionOpticalInstruments::magnificationEyepiece(const T m, const T m_o) -{ - return m / m_o; -} - -template -inline auto VisionOpticalInstruments::magnificationMicroscope(const T m_o, const T m_e) -{ - return m_o * m_e; -} - -template -inline auto VisionOpticalInstruments::imageDistance(const T f, const K d_o) -{ - return (f * d_o) / (d_o - f); -} - -template -inline auto VisionOpticalInstruments::magnification_objective(const ld d_o, const ld f) -{ - return -(f / (d_o - f)); -} - -template -inline auto VisionOpticalInstruments::magnification_dido(const T d_i, const T d_o) -{ - return -(d_i / d_o); -} - -template -inline auto VisionOpticalInstruments::angularMagnification(const T f_o, const K f_e) -{ - return -(f_o / f_e); -} - -template -inline auto VisionOpticalInstruments::angular_magnification(const T R_, const K f_e) -{ - return -(R_ / 2.0) * (1.0 / f_e); -} - -template -inline auto VisionOpticalInstruments::angularMagnitude_objectThroughMicroscope(const T theta, const K m) -{ - return m * theta; -} - -template -inline auto VisionOpticalInstruments::object_Distance(const T f, const K m_o) -{ - return f - (f / m_o); -} - -template -inline auto VisionOpticalInstruments::object_distance(const T f_e, const K m_e) -{ - return f_e * (1 - (1.0 / m_e)); -} - -template -inline auto VisionOpticalInstruments::acceptanceAngle(const T NA, const K n) -{ - return 2 * asin(NA / n) * DEGREE; -} - -template -inline auto VisionOpticalInstruments::farPoint(const T P, const T d_r) -{ - return 1.0 / (P - (1.0 / d_r)); -} - -template -inline auto VisionOpticalInstruments::eyeglassPower(const T lensToRetina, const T P, const T glassesFromEyes) -{ - const auto fp = farPoint(P, lensToRetina); - return -1.0 / (fp - glassesFromEyes); -} - -template -inline auto VisionOpticalInstruments::distanceBetweenGlassesAndEyes(const T f_p, const T P) -{ - return f_p + (1.0 / P); -} - - - - +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_VISIONOPTICALINSTRUMENTS_H +#define PHYSICSFORMULA_VISIONOPTICALINSTRUMENTS_H +#include "WaveOptics.h" + +static auto visionOpticInstrument_objectCount = 0; + +/// +/// +/// +/// +class VisionOpticalInstruments : + public WaveOptics +{ + +public: + VisionOpticalInstruments* _visOpticPtr; + + VisionOpticalInstruments() + { + _visOpticPtr = nullptr; + visOpticInstVar = 0.0; + countIncrease(); + } + + /** + * @brief copy constructor + */ + VisionOpticalInstruments(const VisionOpticalInstruments& t) + { + _visOpticPtr = t._visOpticPtr; + visOpticInstVar = t.visOpticInstVar; + countIncrease(); + } + /** + * #brief move constructor + */ + VisionOpticalInstruments(VisionOpticalInstruments&& t) noexcept + { + _visOpticPtr = t._visOpticPtr; + visOpticInstVar = t.visOpticInstVar; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + VisionOpticalInstruments& operator=(const VisionOpticalInstruments& t) + { + if (this != &t) + { + _visOpticPtr = t._visOpticPtr; + visOpticInstVar = t.visOpticInstVar; + countIncrease(); + } + return *this; + } + + /// + /// Shows the object count. + /// + /// + static auto show_objectCount() { + std::cout << "\n visOptInstrument object count: " + << visionOpticInstrument_objectCount << std::endl; } + /// + /// Gets the object count. + /// + /// + static auto get_objectCount() { return visionOpticInstrument_objectCount; } + + + /// + /// Finalizes an instance of the class. + /// + ~VisionOpticalInstruments() + { + delete _visOpticPtr; + } + /// + /// Sets the template variable. + /// + /// The variable. + void setTemplateVar(ld var) { visOpticInstVar = var; } + /// + /// Gets the template variable. + /// + /// + ld getTemplateVar() const { return visOpticInstVar; } + + /// + /// Calculates the power of the eye when viewing an object d_o units away and + /// with an image distance d_i units away. (this chapter uses the value of + /// 2.00 cm for all the d_i values when dealing with problems relating to + /// the eye) + /// + /// The object distance. + /// The image distance(default at 2.0*10^-2). + /// the power of the eye in diopters(D) + template + static auto powerOfEye(const T d_o, const T d_i = 2.0*SU.CENTI); + + /// + /// The print in many books averages h_o units in height. Calculate How high + /// the image of the print on the retina when the book is held d_o units from + /// the eye. + /// + /// The object height. + /// The object distance. + /// The image distance(default at 2.0*10^-2). + /// image height + template + static auto imageHeight( const T h_o, const T d_o, const T d_i = 2.0*SU.CENTI); + + /// + /// Suppose a certain person’s visual acuity is such that he can see objects + /// clearly that form an image h_i units high on his retina. Calculate the maximum + /// distance at which he can read the h_o units high letters on the side of + /// an airplane? + /// + /// The object height. + /// The image height. + /// The image distance(default at 2.0*10^-2). + /// object distance + template + static auto objectDistance(const T h_o, const T h_i, const T d_i = 2.0 * SU.CENTI); + + /// + /// Calculate the far point of a person whose eyes have a relaxed + /// power of P_ (D). + /// + /// The power of the eye. + /// The image distance(default at 2.0*10^-2). + /// object distance + template + static auto objectDistance_usingPower(const T P_, const T d_i = 2.00 * SU.CENTI); + + /// + /// A severely myopic patient has a far point of d_o units. Calculate how many + /// diopters the power of their eye should be reduced in laser vision + /// correction to obtain normal distant vision. + /// + /// The d object distance. + /// The image distance(default at 2.0*10^-2). + /// power reduction in eye + template + static auto eyePowerReductionLaserSurgery(const T d_o, const T d_i = 2.00 * SU.CENTI); + + /// + /// A young woman with normal distant vision(d_i = default) has a percentCanAccommodate% + /// ability to accommodate (that is, increase) the power of her eyes. What is + /// the closest object she can see clearly? + /// + /// The percent can accommodate. + /// The image distance(default at 2.0*10^-2) + /// closest clear sight + template + static auto closestObjectDistance_accommodatedPower(const T percentCanAccommodate); + + /// + /// The far point of a myopic administrator is d_o Units. If they have the + /// normal percentCanAccom% ability to accommodate, Calculate what the closest + /// object they can see clearly. + /// + /// The far point or object distance. + /// The percent can accommodate. + /// The image distance(default at 2.0*10^-2) + /// + template + static auto closestObjectDistance_accomodateFarPoint(const T d_o, const T percentCanAccom, const T d_i = 2.00 * SU.CENTI); + + /// + /// A very myopic man has a far point of d_o units. Calculate what power of + /// contact lens(when on the eye) will correct his distant vision? + /// + /// The d object distance(far point). + /// lens power + template + static auto powerOfLensToCorrectMyopicVision(const T d_o); + + /// + /// A very myopic person has a far point of d_o units. Calculate what power eyeglasses, + /// positioned posGlasses units from their eyes, will correct their + /// distant vision. + /// + /// The object distance, far point. + /// The position of glasses to eye. + /// lens power of glasses + template + static auto powerOfLensToCorrectMyopicVision(const T d_o, const T posGlasses); + + /// + /// A myopic person sees that their contact lens prescription is lensPower D. + /// Calculate what their far point is. + /// + /// The lens power. + /// d_o, far point or object distance + template + static auto farPoint_fromLensPowerPrescription(const T lensPower); + + /// + /// A myopic person sees that her eyeglasses prescription is lensPower D, + /// for eyeglasses positioned posGlasses units from her eyes. + /// Calculate her far point? + /// + /// The lens power. + /// The position glasses. + /// the far point, d_o + template + static auto farPoint_fromLensPowerPrescription(const T lensPower, const T posGlasses); + + /// + /// A microscope with an overall magnification of m and has an objective + /// that magnifies by m_o. Calculate the magnification of the eyepiece. + /// + /// The overall magnification. + /// The objective magnification. + /// magnification of eyepiece, m_e + template + static auto magnificationEyepiece(const T m, const T m_o); + + /// + /// A microscope with an objective magnification of m_o has an eyepiece + /// that magnifies by m_e. Calculate the overall magnification. + /// + /// The objective magnification. + /// The eyepiece magnification. + /// the overall magnification, m + template + static auto magnificationMicroscope(const T m_o, const T m_e); + + /// + /// Calculates the images distance with a object distance of d_o and a focal + /// length of f. + /// + /// The focal length. + /// The object distance. + /// image distance, d_i + template + static auto imageDistance(const T f, const K d_o); + + /// + /// What magnification is produced by a f units focal length microscope + /// objective that is d_o units from the object being viewed? + /// + /// The object distance. + /// The focal length. + /// magnification + template + static auto magnification_objective(const ld d_o, const ld f); + + /// + /// Calculates the magnification of a microscope having a image distance of + /// d_i and a object distance of d_o. + /// + /// The d image distance. + /// The d object distance. + /// magnification + template + static auto magnification_dido(const T d_i, const T d_o); + + /// + /// Calculate the angular magnification of a telescope that has a f_o units + /// focal length objective and a f_e units focal length eyepiece. + /// + /// The objective focal length. + /// The eyepiece focal length. + /// angular magnification + template + static auto angularMagnification(const T f_o, const K f_e); + + /// + /// A large reflecting telescope has an objective mirror with a + /// R m radius of curvature. Calculate the angular magnification it + /// produces when a f_e units focal length eyepiece is used? + /// + /// The radius of curvature. + /// The eyepiece focal length. + /// angular magnification + template + static auto angular_magnification(const T R_, const K f_e); + + + /// + /// When you hold an insect at the near point of your eye it subtends an + /// angle of theta rad. Calculate the angular size (magnitude only) + /// of the insect when viewed through a microscope that has an angular + /// magnification with a magnitude of m. + /// + /// The f e. + /// The m e. + /// + template + static auto angularMagnitude_objectThroughMicroscope(const T theta, const K m); + + + /// + /// Where does an object need to be placed relative to a microscope for + /// its f units focal length objective to produce a magnification of –m + /// + /// The focal length. + /// The object magnification. + /// object distance + template + static auto object_Distance(const T f, const K m_o); + + /// + /// Where should the f_e units focal length eyepiece be placed to produce + /// a further (m_e)x magnification + /// + /// The eyepiece focal length. + /// The magnification xM example:(4X magnification) + /// would be a m_e of 4.0. + /// object distance + template + static auto object_distance(const T f_e, const K m_e); + + /// + /// Calculate what a 1.40NA 60x oil immersion objective + /// lens would have for acceptance angles. n = 1.51 for oil, substitute this + /// for whatever you are looking to calculate in place. n is the index of + /// refraction for a medium. + /// + /// The numerical aperture value. + /// The index of refraction. + /// the acceptance angle, the larger this is the more resolution + /// + template + static auto acceptanceAngle(const T NA, const K n); + + /// + /// The lens-to-retina distance of a person is d_r units, and the relaxed + /// power of her eye is P (D). Calculate the far point? + /// + /// The relaxed power. + /// The lens-to-retina distance. + /// far point + template + static auto farPoint(const T P, const T d_r); + + /// + /// The lens-to-retina distance of a woman is LensToRetina units, and the relaxed power + /// of her eye is P D. What eyeglass power will allow her to see distant + /// objects clearly, if her glasses are glassesFromEyes units from her eyes? + /// + /// The lens to retina. + /// The relaxed power. + /// The glasses from eyes. + /// eyeglass power + template + static auto eyeglassPower(const T lensToRetina, const T P, const T glassesFromEyes); + + /// + /// Your physics TA has a far point of 0.663 m from her eyes and is able to see distant objects in focus when wearing glasses with a refractive power of + ///−1.55 D. Determine the distance between her glasses and eyes. + /// + /// The far point. + /// The power. + /// + template + static auto distanceBetweenGlassesAndEyes(const T f_p, const T P); + + + + + + + + +private: + ld visOpticInstVar; + static void countIncrease() { visionOpticInstrument_objectCount += 1; } + static void countDecrease() { visionOpticInstrument_objectCount -= 1; } +}; + +#endif //PHYSICSFORMULA_VISIONOPTICALINSTRUMENTS_H + +template +inline auto VisionOpticalInstruments::powerOfEye(const T d_o, const T d_i) +{ + return (1.0 / d_o) + (1 / d_i);//(D) +} + +template +inline auto VisionOpticalInstruments::imageHeight(const T h_o, const T d_o, const T d_i) +{ + return -(d_i * h_o) / d_o; +} + +template +inline auto VisionOpticalInstruments::objectDistance(const T h_o, const T h_i, const T d_i) +{ + return -(d_i * h_o) / h_i; +} + +template +inline auto VisionOpticalInstruments::objectDistance_usingPower(const T P_, const T d_i) +{ + return 1.0 / (P_ - (1.0 / d_i)); +} + +template +inline auto VisionOpticalInstruments::eyePowerReductionLaserSurgery(const T d_o, const T d_i) +{ + return (1.0 / d_i) - ((1.0 / d_o) + (1.0 / d_i)); +} + +template +inline auto VisionOpticalInstruments::closestObjectDistance_accommodatedPower(const T percentCanAccommodate) +{ + const auto d_i = 2.00 * SU.CENTI; + const auto decimal = percentCanAccommodate / 100.0; + const auto increased = 1.0 + decimal; + const auto pMax = increased * (1.0 / d_i); + return 1.0 / (pMax - (1.0 / d_i)); +} + +template +inline auto VisionOpticalInstruments::closestObjectDistance_accomodateFarPoint(const T d_o, const T percentCanAccom, const T d_i) +{ + const auto decimal = percentCanAccom / 100.0; + const auto pFar = (1.0 / d_o) + (1.0 / d_i); + const auto pClose = (1.0 + decimal) * pFar; + return 1.00 / (pClose - (1.0 / d_i)); +} + +template +inline auto VisionOpticalInstruments::powerOfLensToCorrectMyopicVision(const T d_o) +{ + return static_cast(-1.00) / d_o; +} + +template +inline auto VisionOpticalInstruments::powerOfLensToCorrectMyopicVision(const T d_o, const T posGlasses) +{ + const auto d_i = d_o - posGlasses; + return static_cast(-1.00) / d_i; +} + +template +inline auto VisionOpticalInstruments::farPoint_fromLensPowerPrescription(const T lensPower) +{ + return static_cast(-1.00) / lensPower; +} + +template +inline auto VisionOpticalInstruments::farPoint_fromLensPowerPrescription(const T lensPower, const T posGlasses) +{ + const auto d_i = 1.00 / lensPower; + return -(d_i)+posGlasses; +} + +template +inline auto VisionOpticalInstruments::magnificationEyepiece(const T m, const T m_o) +{ + return m / m_o; +} + +template +inline auto VisionOpticalInstruments::magnificationMicroscope(const T m_o, const T m_e) +{ + return m_o * m_e; +} + +template +inline auto VisionOpticalInstruments::imageDistance(const T f, const K d_o) +{ + return (f * d_o) / (d_o - f); +} + +template +inline auto VisionOpticalInstruments::magnification_objective(const ld d_o, const ld f) +{ + return -(f / (d_o - f)); +} + +template +inline auto VisionOpticalInstruments::magnification_dido(const T d_i, const T d_o) +{ + return -(d_i / d_o); +} + +template +inline auto VisionOpticalInstruments::angularMagnification(const T f_o, const K f_e) +{ + return -(f_o / f_e); +} + +template +inline auto VisionOpticalInstruments::angular_magnification(const T R_, const K f_e) +{ + return -(R_ / 2.0) * (1.0 / f_e); +} + +template +inline auto VisionOpticalInstruments::angularMagnitude_objectThroughMicroscope(const T theta, const K m) +{ + return m * theta; +} + +template +inline auto VisionOpticalInstruments::object_Distance(const T f, const K m_o) +{ + return f - (f / m_o); +} + +template +inline auto VisionOpticalInstruments::object_distance(const T f_e, const K m_e) +{ + return f_e * (1 - (1.0 / m_e)); +} + +template +inline auto VisionOpticalInstruments::acceptanceAngle(const T NA, const K n) +{ + return 2 * asin(NA / n) * DEGREE; +} + +template +inline auto VisionOpticalInstruments::farPoint(const T P, const T d_r) +{ + return 1.0 / (P - (1.0 / d_r)); +} + +template +inline auto VisionOpticalInstruments::eyeglassPower(const T lensToRetina, const T P, const T glassesFromEyes) +{ + const auto fp = farPoint(P, lensToRetina); + return -1.0 / (fp - glassesFromEyes); +} + +template +inline auto VisionOpticalInstruments::distanceBetweenGlassesAndEyes(const T f_p, const T P) +{ + return f_p + (1.0 / P); +} + + + + diff --git a/Voronoi.cpp b/Voronoi.cpp index 75febd8..0bbad29 100644 --- a/Voronoi.cpp +++ b/Voronoi.cpp @@ -1,553 +1,553 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#include "Voronoi.h" - -#include -#include -#include -#include -#include "Line.h" -#include "Segment.h" -#include "Intersection.h" -#include "Distance.h" - -using namespace rez; - -enum class EVENT_TYPE { - SITE, - CIRCLE -}; - -enum class BEACH_ITEM_TYPE { - ARC, - EDGE -}; - -struct Event; - -typedef Line2d EdgeItem; - -struct BeachLineItem { - std::vector events; - Point2d site; - BEACH_ITEM_TYPE type; - - BeachLineItem* next_arc = nullptr; - BeachLineItem* prev_arc = nullptr; - BeachLineItem* next_edge = nullptr; - BeachLineItem* prev_edge = nullptr; - - EdgeItem edge; // For edge items - bool is_completed_edge = false; -}; - -struct Event { - EVENT_TYPE type; - Point2d site; - Point2d* intersetion_point; // For circle events - BeachLineItem* arc; - bool valid = true; -}; - -struct EventComparator { - bool operator()(const Event* e1, const Event* e2) - { - Point2d point = e1->site; - Point2d other = e2->site; - - if (point[Y] < other[Y]) - return true; - else if (isEqualD(point[Y], other[Y]) && point[X] < other[X]) - { - return true; - } - - return false; - } -}; - -std::priority_queue< Event*, std::vector, EventComparator> p_queue; - -std::vector segments; -std::list beach_line; -typedef std::list::iterator BeachLineItr; - -void add_outer_edge(BeachLineItem* item, BoundRectangle& bound, std::vector& _edges) -{ - EdgeItem edge = item->edge; - Point2d p_start = edge.point(); - Vector2f dir = edge.direction(); - - Point2d p_end; - - //Check edge start with in bounds - if (p_start[X] >= bound.left_x && p_start[X] <= bound.right_x && - p_start[Y] >= bound.bot_y && p_start[Y] <= bound.top_y) - { - if (dir[X] > 0 && dir[Y] > 0) - { - //Direction vector is point in first quadrant - auto t = (bound.right_x - p_start[X]) / dir[X]; - auto y = p_start[Y] + t * dir[Y]; - - if (y <= bound.top_y) - { - p_end.assign(X, bound.right_x); - p_end.assign(Y, y); - } - else - { - auto s = (bound.top_y - p_start[Y]) / dir[Y]; - auto x = p_start[X] + s * dir[X]; - p_end.assign(X, x); - p_end.assign(Y, bound.top_y); - } - } - else if (dir[X] < 0 && dir[Y] > 0) - { - auto t = (bound.left_x - p_start[X]) / dir[X]; - auto y = p_start[Y] + t * dir[Y]; - - if (y <= bound.top_y) - { - p_end.assign(X, bound.left_x); - p_end.assign(Y, y); - } - else - { - auto s = (bound.top_y - p_start[Y]) / dir[Y]; - auto x = p_start[X] + s * dir[X]; - p_end.assign(X, x); - p_end.assign(Y, bound.top_y); - } - } - else if (dir[X] < 0 && dir[Y] < 0) - { - //Direction vector is point in third quadrant - auto t = (bound.left_x - p_start[X]) / dir[X]; - auto y = p_start[Y] + t * dir[Y]; - - if (y >= bound.bot_y) - { - p_end.assign(X, bound.left_x); - p_end.assign(Y, y); - } - else - { - auto s = (bound.bot_y - p_start[Y]) / dir[Y]; - auto x = p_start[X] + s * dir[X]; - p_end.assign(X, x); - p_end.assign(Y, bound.bot_y); - } - } - else - { - //Direction vector is point in furth quadrant - auto t = (bound.right_x - p_start[X]) / dir[X]; - auto y = p_start[Y] + t * dir[Y]; - - if (y >= bound.bot_y) - { - p_end.assign(X, bound.right_x); - p_end.assign(Y, y); - } - else - { - auto s = (bound.bot_y - p_start[Y]) / dir[Y]; - auto x = p_start[X] + s * dir[X]; - p_end.assign(X, x); - p_end.assign(Y, bound.bot_y); - } - } - - Edge2dSimple new_edge(p_start, p_end); - new_edge.fp1 = DEFAULT_POINT_2D; - new_edge.fp2 = DEFAULT_POINT_2D; - - _edges.push_back(new_edge); - } -} - -double computeArcY(Point2d& _arc_site, Point2d& _current_point) -{ - double yf = _arc_site[Y]; - double yd = _current_point[Y]; - double xf = _arc_site[X]; - double xd = _current_point[X]; - - if (isEqualD(yf, yd)) - return 0.0; - - if (isEqualD(xf, xd)) - return (yf + yd) / 2; - - ////return the y value of arc at this point - //auto s1 = (xd - xf) * (xd - xf); - //auto d1 = 1 / (2 * (yf - yd)); - //auto s2 = yf + yd; - // - //return s1 / d1 + s2 / 2; - - double dp = 2 * (yf - yd); - double a1 = 1 / dp; - double b1 = -2 * xf / dp; - double c1 = yd + dp / 4 + xf * xf / dp; - - return(a1 * xd * xd + b1 * xd + c1); -} - -BeachLineItr getArcAbove(Point2d& _point) -{ - // Segments of same arc can repeat in the beach line. We need to consider this as well. - BeachLineItr current_arc_itr = beach_line.begin(); - double current_arc_y = DBL_MAX; - BeachLineItr itr = current_arc_itr; - bool found_arc_with_greater_x = false; - - while (itr != beach_line.end()) - { - if ((*itr)->type == BEACH_ITEM_TYPE::ARC) - { - // TODO There is a fault in this implementation when two different arcs have almost same distance - // This fault is due to part of computeArcY implementation and other part due to precision. - double arc_y = computeArcY((*itr)->site, _point); - bool condition = arc_y < current_arc_y; - if (condition - || (isEqualD(arc_y, current_arc_y) && - (!found_arc_with_greater_x))) - { - current_arc_itr = itr; - current_arc_y = arc_y; - found_arc_with_greater_x = false; - } - else - { - if ((*itr)->site[X] > _point[X]) - found_arc_with_greater_x = true; - } - } - itr++; - } - - return current_arc_itr; -} - -BeachLineItr addNewArc(BeachLineItr& itr, Point2d& site) -{ - BeachLineItem* arc_to_replace = *itr; - BeachLineItem* prev_left_arc = arc_to_replace->prev_arc; - BeachLineItem* prev_right_arc = arc_to_replace->next_arc; - - //afl,el,an,er,afr - BeachLineItem* left_arc = new BeachLineItem(); - left_arc->type = BEACH_ITEM_TYPE::ARC; - left_arc->site = arc_to_replace->site; - - BeachLineItem* new_arc = new BeachLineItem(); - new_arc->type = BEACH_ITEM_TYPE::ARC; - new_arc->site = site; - - BeachLineItem* right_arc = new BeachLineItem(); - right_arc->type = BEACH_ITEM_TYPE::ARC; - right_arc->site = arc_to_replace->site; - - //Start point of the edges is - auto arc_y = computeArcY((*itr)->site, site); - Point2d start_point(site[X], arc_y); - - // Direction vectors for the two edges are prependicular to the vector between the two focuses - // - focus of new_arc and arc_to_replace - Vector2f fnfo = new_arc->site - arc_to_replace->site; // Direction vector from new site to arc_to_replace->site - Vector2f dir = prependicluar(fnfo); // Prependicular vector to fnfo - Vector2f neg_dir(-dir[X], -dir[Y]); - EdgeItem l_edge(start_point, dir); - EdgeItem r_edge(start_point, neg_dir); - - BeachLineItem* left_edge = new BeachLineItem(); - left_edge->type = BEACH_ITEM_TYPE::EDGE; - left_edge->edge = l_edge; - - BeachLineItem* right_edge = new BeachLineItem(); - right_edge->type = BEACH_ITEM_TYPE::EDGE; - right_edge->edge = r_edge; - - left_arc->prev_arc = arc_to_replace->prev_arc; - left_arc->next_arc = new_arc; - right_arc->prev_arc = new_arc; - right_arc->next_arc = arc_to_replace->next_arc; - new_arc->prev_arc = left_arc; - new_arc->next_arc = right_arc; - - left_arc->next_edge = left_edge; - left_arc->prev_edge = arc_to_replace->prev_edge; - new_arc->prev_edge = left_edge; - new_arc->next_edge = right_edge; - right_arc->prev_edge = right_edge; - right_arc->next_edge = arc_to_replace->next_edge; - - if (prev_left_arc) - prev_left_arc->next_arc = left_arc; - - if (prev_right_arc) - prev_right_arc->prev_arc = right_arc; - - // Add the new itms in order. Add the last one first, then the second to last and so on - // -as list::insert add element before the position. - beach_line.insert(itr, left_arc); - beach_line.insert(itr, left_edge); - beach_line.insert(itr, new_arc); - beach_line.insert(itr, right_edge); - beach_line.insert(itr, right_arc); - - // delete the original arc finally. We do it finally here to take care the degenerate case of - // having only one arc. If we delete it first then the iterator is going to invalid - // As we add 5 new elements, we need to delete the element 5 position higher than the initial iterator. - - BeachLineItr new_Itr = itr; - std::advance(new_Itr, -3); - - //if ((*itr)->events && (*itr)->event->type == EVENT_TYPE::CIRCLE) - // (*itr)->event->valid = false; - for (auto event : (*itr)->events) - { - if (event->type == EVENT_TYPE::CIRCLE) - event->valid = false; - } - - beach_line.erase(itr); - - //decrement the iterator 3 position to point to the newly added arc. - return new_Itr; -} - -BeachLineItr getItr(BeachLineItem* item) -{ - BeachLineItr itr = beach_line.begin(); - while (itr != beach_line.end() && *itr != item) - { - itr++; - } - return itr; -} - -void addCircleEvents(BeachLineItem* middle_arc) -{ - // Check 3 arcs sequence ending current arc circle event - if (middle_arc != nullptr && middle_arc->prev_arc != nullptr && middle_arc->next_arc != nullptr) - { - // Check the intersection of 2 edges separating above arcs - BeachLineItem* edg1 = middle_arc->prev_edge; - BeachLineItem* edg2 = middle_arc->next_edge; - Point2d* intersection_point = new Point2d(); - - bool is_intersect = intersect(edg1->edge, edg2->edge, *intersection_point); - bool has_higher_cycle_events = false; - - if (is_intersect) - { - //Finding the circle event Y. which is (intersection.y - circle.radius) - float circle_radius = distance(*intersection_point, middle_arc->site); - float circle_event_y = (*intersection_point)[Y] - circle_radius; - - // If there is already a circle event for this arc, check the y coordinates. - // If already exsisting event's y coordinate is lower we can replace the circle event with the new one - - //if (middle_arc->event) - //{ - // // Make previous circle event invalid one from queue - // if (middle_arc->event->site[Y] > circle_event_y) - // middle_arc->event->valid = false; - // else - // return; // If the previous circle event's y coordinate is higher we keep that event - //} - - for (auto event : middle_arc->events) - { - if (event->site[Y] < circle_event_y) - event->valid = false; - else - has_higher_cycle_events = true; - } - - if (!has_higher_cycle_events) - { - Event* circle_event = new Event(); - circle_event->type = EVENT_TYPE::CIRCLE; - circle_event->arc = middle_arc; - circle_event->site = Point2d((*intersection_point)[X], circle_event_y); - circle_event->intersetion_point = intersection_point; - p_queue.push(circle_event); - - middle_arc->events.push_back(circle_event); - } - } - } -} - -void handleSiteEvent(Event* event) -{ - // In site events new arcs is going to form - if (beach_line.empty()) - { - // Beach line is emptry. So add the item(Arc) and return - BeachLineItem* item = new BeachLineItem(); - item->type = BEACH_ITEM_TYPE::ARC; - item->site = event->site; - beach_line.push_back(item); - return; - } - else - { - // Need to find the Arc directly above this site - BeachLineItr arc_above_itr = getArcAbove(event->site); - BeachLineItr new_arc_itr = addNewArc(arc_above_itr, event->site); - - addCircleEvents((*new_arc_itr)->prev_arc); - addCircleEvents((*new_arc_itr)->next_arc); - } -} - -void handleCircleEvent(Event* event, std::vector& _edges) -{ - // In circle events, exsisting arcs are going to shrink to a point - // Delete el,an,er related to current circle event - BeachLineItem* arc_to_remove = event->arc; - BeachLineItr itr = getItr(arc_to_remove); - - Point2d left_point = arc_to_remove->prev_edge->edge.point(); - Point2d right_point = arc_to_remove->next_edge->edge.point(); - arc_to_remove->prev_edge->is_completed_edge = true; - arc_to_remove->next_edge->is_completed_edge = true; - - Edge2dSimple edg1(left_point, *event->intersetion_point); - Edge2dSimple edg2(right_point, *event->intersetion_point); - edg1.fp1 = arc_to_remove->prev_arc->site; - edg1.fp2 = arc_to_remove->site; - edg2.fp1 = arc_to_remove->site; - edg2.fp2 = arc_to_remove->next_arc->site; - - // Add two completed edges - _edges.push_back(edg1); - _edges.push_back(edg2); - - // Remove the arc and add new edge for arc left and right to circle event arc. - Point2d* start_point = event->intersetion_point; - - float dir_x = 0.0; - float dir_y = 0.0; - - BeachLineItem* left_arc = arc_to_remove->prev_arc; - BeachLineItem* right_arc = arc_to_remove->next_arc; - - if (left_arc && right_arc) - { - Vector2f fnfo = right_arc->site - left_arc->site; // Direction vector from new site to arc_to_replace->site - dir_x = fnfo[Y]; - dir_y = -fnfo[X]; - } - else - { - dir_y = -1; - } - - Vector2f dir(dir_x, dir_y); // Prependicular vector to fnfo - EdgeItem edge(*start_point, dir); - - BeachLineItem* new_edge = new BeachLineItem(); - new_edge->type = BEACH_ITEM_TYPE::EDGE; - new_edge->edge = edge; - - if (left_arc) - { - left_arc->next_arc = right_arc; - left_arc->next_edge = new_edge; - } - - if (right_arc) - { - right_arc->prev_arc = left_arc; - right_arc->prev_edge = new_edge; - } - - itr--; // go to the previous edge itr - BeachLineItr itr3 = itr; - std::advance(itr3, 3); - - BeachLineItr itr1 = itr; - itr1++; - //if ((*itr1)->event && (*itr1)->event->type == EVENT_TYPE::CIRCLE) - // (*itr1)->event->valid = false; - - for (auto event : (*itr1)->events) - { - if (event->type == EVENT_TYPE::CIRCLE) - event->valid = false; - } - - beach_line.erase(itr, itr3); - beach_line.insert(itr3, new_edge); - - // Clean up the memory - //if(arc_to_remove->prev_edge) - // delete arc_to_remove->prev_edge; - //if (arc_to_remove->next_edge) - // delete arc_to_remove->next_edge; - //delete arc_to_remove; - - // Need to check for circle event due to this change in beach line - // two checks, one as left arc as middle and second as right arc as circle event - addCircleEvents(left_arc); - addCircleEvents(right_arc); -} - -void rez::constructVoronoiDiagram_fortunes(std::vector& _points_list, std::vector& _edges, - BoundRectangle& rect) -{ - // We need a unique list of points. - std::sort(_points_list.begin(), _points_list.end(), sort2DTBLR); - std::unique(_points_list.begin(), _points_list.end()); - - for (Point2d& point : _points_list) - { - Event* event = new Event(); - event->site = point; - p_queue.push(event); - } - - int count = 0; - - while (!p_queue.empty()) - { - Event* event = p_queue.top(); - p_queue.pop(); - - //std::cout << "iteration " << ++count << " Queue size " << p_queue.size() << std::endl; - - if (event->valid) - { - if (event->type == EVENT_TYPE::SITE) - handleSiteEvent(event); - else - handleCircleEvent(event, _edges); - } - } - - // Need to process the remaining edges in beach line inorder to construct edges extending outwards - // the center of points - - int x = 0; - - for (BeachLineItem* item : beach_line) - { - if (item->type == BEACH_ITEM_TYPE::EDGE) - { - x++; - add_outer_edge(item, rect, _edges); - - //if(x==2) - // break; - } - } +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#include "Voronoi.h" + +#include +#include +#include +#include +#include "Line.h" +#include "Segment.h" +#include "Intersection.h" +#include "Distance.h" + +using namespace rez; + +enum class EVENT_TYPE { + SITE, + CIRCLE +}; + +enum class BEACH_ITEM_TYPE { + ARC, + EDGE +}; + +struct Event; + +typedef Line2d EdgeItem; + +struct BeachLineItem { + std::vector events; + Point2d site; + BEACH_ITEM_TYPE type; + + BeachLineItem* next_arc = nullptr; + BeachLineItem* prev_arc = nullptr; + BeachLineItem* next_edge = nullptr; + BeachLineItem* prev_edge = nullptr; + + EdgeItem edge; // For edge items + bool is_completed_edge = false; +}; + +struct Event { + EVENT_TYPE type; + Point2d site; + Point2d* intersetion_point; // For circle events + BeachLineItem* arc; + bool valid = true; +}; + +struct EventComparator { + bool operator()(const Event* e1, const Event* e2) + { + Point2d point = e1->site; + Point2d other = e2->site; + + if (point[Y] < other[Y]) + return true; + else if (isEqualD(point[Y], other[Y]) && point[X] < other[X]) + { + return true; + } + + return false; + } +}; + +std::priority_queue< Event*, std::vector, EventComparator> p_queue; + +std::vector segments; +std::list beach_line; +typedef std::list::iterator BeachLineItr; + +void add_outer_edge(BeachLineItem* item, BoundRectangle& bound, std::vector& _edges) +{ + EdgeItem edge = item->edge; + Point2d p_start = edge.point(); + Vector2f dir = edge.direction(); + + Point2d p_end; + + //Check edge start with in bounds + if (p_start[X] >= bound.left_x && p_start[X] <= bound.right_x && + p_start[Y] >= bound.bot_y && p_start[Y] <= bound.top_y) + { + if (dir[X] > 0 && dir[Y] > 0) + { + //Direction vector is point in first quadrant + auto t = (bound.right_x - p_start[X]) / dir[X]; + auto y = p_start[Y] + t * dir[Y]; + + if (y <= bound.top_y) + { + p_end.assign(X, bound.right_x); + p_end.assign(Y, y); + } + else + { + auto s = (bound.top_y - p_start[Y]) / dir[Y]; + auto x = p_start[X] + s * dir[X]; + p_end.assign(X, x); + p_end.assign(Y, bound.top_y); + } + } + else if (dir[X] < 0 && dir[Y] > 0) + { + auto t = (bound.left_x - p_start[X]) / dir[X]; + auto y = p_start[Y] + t * dir[Y]; + + if (y <= bound.top_y) + { + p_end.assign(X, bound.left_x); + p_end.assign(Y, y); + } + else + { + auto s = (bound.top_y - p_start[Y]) / dir[Y]; + auto x = p_start[X] + s * dir[X]; + p_end.assign(X, x); + p_end.assign(Y, bound.top_y); + } + } + else if (dir[X] < 0 && dir[Y] < 0) + { + //Direction vector is point in third quadrant + auto t = (bound.left_x - p_start[X]) / dir[X]; + auto y = p_start[Y] + t * dir[Y]; + + if (y >= bound.bot_y) + { + p_end.assign(X, bound.left_x); + p_end.assign(Y, y); + } + else + { + auto s = (bound.bot_y - p_start[Y]) / dir[Y]; + auto x = p_start[X] + s * dir[X]; + p_end.assign(X, x); + p_end.assign(Y, bound.bot_y); + } + } + else + { + //Direction vector is point in furth quadrant + auto t = (bound.right_x - p_start[X]) / dir[X]; + auto y = p_start[Y] + t * dir[Y]; + + if (y >= bound.bot_y) + { + p_end.assign(X, bound.right_x); + p_end.assign(Y, y); + } + else + { + auto s = (bound.bot_y - p_start[Y]) / dir[Y]; + auto x = p_start[X] + s * dir[X]; + p_end.assign(X, x); + p_end.assign(Y, bound.bot_y); + } + } + + Edge2dSimple new_edge(p_start, p_end); + new_edge.fp1 = DEFAULT_POINT_2D; + new_edge.fp2 = DEFAULT_POINT_2D; + + _edges.push_back(new_edge); + } +} + +double computeArcY(Point2d& _arc_site, Point2d& _current_point) +{ + double yf = _arc_site[Y]; + double yd = _current_point[Y]; + double xf = _arc_site[X]; + double xd = _current_point[X]; + + if (isEqualD(yf, yd)) + return 0.0; + + if (isEqualD(xf, xd)) + return (yf + yd) / 2; + + ////return the y value of arc at this point + //auto s1 = (xd - xf) * (xd - xf); + //auto d1 = 1 / (2 * (yf - yd)); + //auto s2 = yf + yd; + // + //return s1 / d1 + s2 / 2; + + double dp = 2 * (yf - yd); + double a1 = 1 / dp; + double b1 = -2 * xf / dp; + double c1 = yd + dp / 4 + xf * xf / dp; + + return(a1 * xd * xd + b1 * xd + c1); +} + +BeachLineItr getArcAbove(Point2d& _point) +{ + // Segments of same arc can repeat in the beach line. We need to consider this as well. + BeachLineItr current_arc_itr = beach_line.begin(); + double current_arc_y = DBL_MAX; + BeachLineItr itr = current_arc_itr; + bool found_arc_with_greater_x = false; + + while (itr != beach_line.end()) + { + if ((*itr)->type == BEACH_ITEM_TYPE::ARC) + { + // TODO There is a fault in this implementation when two different arcs have almost same distance + // This fault is due to part of computeArcY implementation and other part due to precision. + double arc_y = computeArcY((*itr)->site, _point); + bool condition = arc_y < current_arc_y; + if (condition + || (isEqualD(arc_y, current_arc_y) && + (!found_arc_with_greater_x))) + { + current_arc_itr = itr; + current_arc_y = arc_y; + found_arc_with_greater_x = false; + } + else + { + if ((*itr)->site[X] > _point[X]) + found_arc_with_greater_x = true; + } + } + itr++; + } + + return current_arc_itr; +} + +BeachLineItr addNewArc(BeachLineItr& itr, Point2d& site) +{ + BeachLineItem* arc_to_replace = *itr; + BeachLineItem* prev_left_arc = arc_to_replace->prev_arc; + BeachLineItem* prev_right_arc = arc_to_replace->next_arc; + + //afl,el,an,er,afr + BeachLineItem* left_arc = new BeachLineItem(); + left_arc->type = BEACH_ITEM_TYPE::ARC; + left_arc->site = arc_to_replace->site; + + BeachLineItem* new_arc = new BeachLineItem(); + new_arc->type = BEACH_ITEM_TYPE::ARC; + new_arc->site = site; + + BeachLineItem* right_arc = new BeachLineItem(); + right_arc->type = BEACH_ITEM_TYPE::ARC; + right_arc->site = arc_to_replace->site; + + //Start point of the edges is + auto arc_y = computeArcY((*itr)->site, site); + Point2d start_point(site[X], arc_y); + + // Direction vectors for the two edges are prependicular to the vector between the two focuses + // - focus of new_arc and arc_to_replace + Vector2f fnfo = new_arc->site - arc_to_replace->site; // Direction vector from new site to arc_to_replace->site + Vector2f dir = prependicluar(fnfo); // Prependicular vector to fnfo + Vector2f neg_dir(-dir[X], -dir[Y]); + EdgeItem l_edge(start_point, dir); + EdgeItem r_edge(start_point, neg_dir); + + BeachLineItem* left_edge = new BeachLineItem(); + left_edge->type = BEACH_ITEM_TYPE::EDGE; + left_edge->edge = l_edge; + + BeachLineItem* right_edge = new BeachLineItem(); + right_edge->type = BEACH_ITEM_TYPE::EDGE; + right_edge->edge = r_edge; + + left_arc->prev_arc = arc_to_replace->prev_arc; + left_arc->next_arc = new_arc; + right_arc->prev_arc = new_arc; + right_arc->next_arc = arc_to_replace->next_arc; + new_arc->prev_arc = left_arc; + new_arc->next_arc = right_arc; + + left_arc->next_edge = left_edge; + left_arc->prev_edge = arc_to_replace->prev_edge; + new_arc->prev_edge = left_edge; + new_arc->next_edge = right_edge; + right_arc->prev_edge = right_edge; + right_arc->next_edge = arc_to_replace->next_edge; + + if (prev_left_arc) + prev_left_arc->next_arc = left_arc; + + if (prev_right_arc) + prev_right_arc->prev_arc = right_arc; + + // Add the new itms in order. Add the last one first, then the second to last and so on + // -as list::insert add element before the position. + beach_line.insert(itr, left_arc); + beach_line.insert(itr, left_edge); + beach_line.insert(itr, new_arc); + beach_line.insert(itr, right_edge); + beach_line.insert(itr, right_arc); + + // delete the original arc finally. We do it finally here to take care the degenerate case of + // having only one arc. If we delete it first then the iterator is going to invalid + // As we add 5 new elements, we need to delete the element 5 position higher than the initial iterator. + + BeachLineItr new_Itr = itr; + std::advance(new_Itr, -3); + + //if ((*itr)->events && (*itr)->event->type == EVENT_TYPE::CIRCLE) + // (*itr)->event->valid = false; + for (auto event : (*itr)->events) + { + if (event->type == EVENT_TYPE::CIRCLE) + event->valid = false; + } + + beach_line.erase(itr); + + //decrement the iterator 3 position to point to the newly added arc. + return new_Itr; +} + +BeachLineItr getItr(BeachLineItem* item) +{ + BeachLineItr itr = beach_line.begin(); + while (itr != beach_line.end() && *itr != item) + { + itr++; + } + return itr; +} + +void addCircleEvents(BeachLineItem* middle_arc) +{ + // Check 3 arcs sequence ending current arc circle event + if (middle_arc != nullptr && middle_arc->prev_arc != nullptr && middle_arc->next_arc != nullptr) + { + // Check the intersection of 2 edges separating above arcs + BeachLineItem* edg1 = middle_arc->prev_edge; + BeachLineItem* edg2 = middle_arc->next_edge; + Point2d* intersection_point = new Point2d(); + + bool is_intersect = intersect(edg1->edge, edg2->edge, *intersection_point); + bool has_higher_cycle_events = false; + + if (is_intersect) + { + //Finding the circle event Y. which is (intersection.y - circle.radius) + float circle_radius = distance(*intersection_point, middle_arc->site); + float circle_event_y = (*intersection_point)[Y] - circle_radius; + + // If there is already a circle event for this arc, check the y coordinates. + // If already exsisting event's y coordinate is lower we can replace the circle event with the new one + + //if (middle_arc->event) + //{ + // // Make previous circle event invalid one from queue + // if (middle_arc->event->site[Y] > circle_event_y) + // middle_arc->event->valid = false; + // else + // return; // If the previous circle event's y coordinate is higher we keep that event + //} + + for (auto event : middle_arc->events) + { + if (event->site[Y] < circle_event_y) + event->valid = false; + else + has_higher_cycle_events = true; + } + + if (!has_higher_cycle_events) + { + Event* circle_event = new Event(); + circle_event->type = EVENT_TYPE::CIRCLE; + circle_event->arc = middle_arc; + circle_event->site = Point2d((*intersection_point)[X], circle_event_y); + circle_event->intersetion_point = intersection_point; + p_queue.push(circle_event); + + middle_arc->events.push_back(circle_event); + } + } + } +} + +void handleSiteEvent(Event* event) +{ + // In site events new arcs is going to form + if (beach_line.empty()) + { + // Beach line is emptry. So add the item(Arc) and return + BeachLineItem* item = new BeachLineItem(); + item->type = BEACH_ITEM_TYPE::ARC; + item->site = event->site; + beach_line.push_back(item); + return; + } + else + { + // Need to find the Arc directly above this site + BeachLineItr arc_above_itr = getArcAbove(event->site); + BeachLineItr new_arc_itr = addNewArc(arc_above_itr, event->site); + + addCircleEvents((*new_arc_itr)->prev_arc); + addCircleEvents((*new_arc_itr)->next_arc); + } +} + +void handleCircleEvent(Event* event, std::vector& _edges) +{ + // In circle events, exsisting arcs are going to shrink to a point + // Delete el,an,er related to current circle event + BeachLineItem* arc_to_remove = event->arc; + BeachLineItr itr = getItr(arc_to_remove); + + Point2d left_point = arc_to_remove->prev_edge->edge.point(); + Point2d right_point = arc_to_remove->next_edge->edge.point(); + arc_to_remove->prev_edge->is_completed_edge = true; + arc_to_remove->next_edge->is_completed_edge = true; + + Edge2dSimple edg1(left_point, *event->intersetion_point); + Edge2dSimple edg2(right_point, *event->intersetion_point); + edg1.fp1 = arc_to_remove->prev_arc->site; + edg1.fp2 = arc_to_remove->site; + edg2.fp1 = arc_to_remove->site; + edg2.fp2 = arc_to_remove->next_arc->site; + + // Add two completed edges + _edges.push_back(edg1); + _edges.push_back(edg2); + + // Remove the arc and add new edge for arc left and right to circle event arc. + Point2d* start_point = event->intersetion_point; + + float dir_x = 0.0; + float dir_y = 0.0; + + BeachLineItem* left_arc = arc_to_remove->prev_arc; + BeachLineItem* right_arc = arc_to_remove->next_arc; + + if (left_arc && right_arc) + { + Vector2f fnfo = right_arc->site - left_arc->site; // Direction vector from new site to arc_to_replace->site + dir_x = fnfo[Y]; + dir_y = -fnfo[X]; + } + else + { + dir_y = -1; + } + + Vector2f dir(dir_x, dir_y); // Prependicular vector to fnfo + EdgeItem edge(*start_point, dir); + + BeachLineItem* new_edge = new BeachLineItem(); + new_edge->type = BEACH_ITEM_TYPE::EDGE; + new_edge->edge = edge; + + if (left_arc) + { + left_arc->next_arc = right_arc; + left_arc->next_edge = new_edge; + } + + if (right_arc) + { + right_arc->prev_arc = left_arc; + right_arc->prev_edge = new_edge; + } + + itr--; // go to the previous edge itr + BeachLineItr itr3 = itr; + std::advance(itr3, 3); + + BeachLineItr itr1 = itr; + itr1++; + //if ((*itr1)->event && (*itr1)->event->type == EVENT_TYPE::CIRCLE) + // (*itr1)->event->valid = false; + + for (auto event : (*itr1)->events) + { + if (event->type == EVENT_TYPE::CIRCLE) + event->valid = false; + } + + beach_line.erase(itr, itr3); + beach_line.insert(itr3, new_edge); + + // Clean up the memory + //if(arc_to_remove->prev_edge) + // delete arc_to_remove->prev_edge; + //if (arc_to_remove->next_edge) + // delete arc_to_remove->next_edge; + //delete arc_to_remove; + + // Need to check for circle event due to this change in beach line + // two checks, one as left arc as middle and second as right arc as circle event + addCircleEvents(left_arc); + addCircleEvents(right_arc); +} + +void rez::constructVoronoiDiagram_fortunes(std::vector& _points_list, std::vector& _edges, + BoundRectangle& rect) +{ + // We need a unique list of points. + std::sort(_points_list.begin(), _points_list.end(), sort2DTBLR); + std::unique(_points_list.begin(), _points_list.end()); + + for (Point2d& point : _points_list) + { + Event* event = new Event(); + event->site = point; + p_queue.push(event); + } + + int count = 0; + + while (!p_queue.empty()) + { + Event* event = p_queue.top(); + p_queue.pop(); + + //std::cout << "iteration " << ++count << " Queue size " << p_queue.size() << std::endl; + + if (event->valid) + { + if (event->type == EVENT_TYPE::SITE) + handleSiteEvent(event); + else + handleCircleEvent(event, _edges); + } + } + + // Need to process the remaining edges in beach line inorder to construct edges extending outwards + // the center of points + + int x = 0; + + for (BeachLineItem* item : beach_line) + { + if (item->type == BEACH_ITEM_TYPE::EDGE) + { + x++; + add_outer_edge(item, rect, _edges); + + //if(x==2) + // break; + } + } } \ No newline at end of file diff --git a/Voronoi.h b/Voronoi.h index 37e1e56..0a75ad8 100644 --- a/Voronoi.h +++ b/Voronoi.h @@ -1,21 +1,21 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_VORONOI_H -#define PHYSICSFORMULA_VORONOI_H -#include -#include "Point.h" -#include "Polygon.h" -#include "Bounds.h" - -// Implementation of Voronoi diagram calculation and related utility functions. -namespace rez -{ - // Compute the voronoi diagram nively using halfplane intersection - void constructVoronoiDiagram_halfplaneIntersection(std::vector&); - - // Compute the voronoi diagram using fortune's algorithm - void constructVoronoiDiagram_fortunes(std::vector&, std::vector&, BoundRectangle& rect); -} -#endif //PHYSICSFORMULA_VORONOI_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_VORONOI_H +#define PHYSICSFORMULA_VORONOI_H +#include +#include "Point.h" +#include "Polygon.h" +#include "Bounds.h" + +// Implementation of Voronoi diagram calculation and related utility functions. +namespace rez +{ + // Compute the voronoi diagram nively using halfplane intersection + void constructVoronoiDiagram_halfplaneIntersection(std::vector&); + + // Compute the voronoi diagram using fortune's algorithm + void constructVoronoiDiagram_fortunes(std::vector&, std::vector&, BoundRectangle& rect); +} +#endif //PHYSICSFORMULA_VORONOI_H diff --git a/WaveOptics.h b/WaveOptics.h index ceb7659..2e5e8d7 100644 --- a/WaveOptics.h +++ b/WaveOptics.h @@ -1,943 +1,943 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_WAVEOPTICS_H -#define PHYSICSFORMULA_WAVEOPTICS_H -#include "GeometricOptics.h" -#include -#include -//α=224,ß=225,π=227,Σ=228,σ=229,µ=230,τ=231,Φ=232,theta=233 -//Ω=234,delta=235,∞=236,φ=237,ε=238,∩=239,≡=240,Γ=226,γ, σ, theta, Å, Ώ, lambda, γ -/** - * @class WaveOptics - * @details class of static methods that relate to chapter 27 of the open-stax - * college physics text book. - * @author Ryan Zurrin - * dateBuilt 5/15/2021 - * lastEdit 5/15/2021 - */ -static int waveOptics_objectCount = 0; - -class WaveOptics : - public GeometricOptics -{ - -public: - WaveOptics* _waveOpticPtr; - - WaveOptics() - { - _waveOpticPtr = nullptr; - waveOpticsVar = 0.0; - countIncrease(); - } - - /** - * @brief copy constructor - */ - WaveOptics(const WaveOptics& t) - { - _waveOpticPtr = t._waveOpticPtr; - waveOpticsVar = t.waveOpticsVar; - countIncrease(); - } - /** - * #brief move constructor - */ - WaveOptics(WaveOptics&& t) noexcept - { - _waveOpticPtr = t._waveOpticPtr; - waveOpticsVar = t.waveOpticsVar; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - WaveOptics& operator=(const WaveOptics& t) - { - if (this != &t) - { - _waveOpticPtr = t._waveOpticPtr; - waveOpticsVar = t.waveOpticsVar; - countIncrease(); - } - return *this; - } - - static void show_objectCount() { std::cout <<"\n wave optics object count: " - << waveOptics_objectCount << std::endl; } - static int get_objectCount() { return waveOptics_objectCount; } - - - ~WaveOptics() - { - delete _waveOpticPtr; - } - void setGeometricOpticsVar(ld var) { waveOpticsVar = var; } - ld getGeometricOpticsVar() const { return waveOpticsVar; } - - - /// - /// Calculates the wavelength in a medium when the lamda in a vacuum is lamda and - /// the index of refraction of the medium is n. - /// - /// The wavelength in a vacuum. - /// The index of refraction. - /// the wavelength in a medium - static auto wavelengthInMedium(const ld lamda, const ld n); - - /// - /// Calculates the wavelength of medium. - /// - /// The index of refraction of medium. - /// The frequency. - /// the wavelength of medium (Hz) - static auto wavelengthOfMedium(const ld n, const ld f); - - /// - /// Show that when light passes from nTop to nBottom, its wavelength changes - /// to some value times its original value. - /// - /// The index of refraction of medium in. - /// The index of refraction medium moving too. - /// ratio of wavelengths - static auto wavelength_ratioOf2IndexOfRefractions(const ld nTop, const ld nBottom); - - /// - /// Distances traveled by a wave front. - /// - /// The wave speed. - /// The time. - /// - static auto distanceTraveledByWaveFront(const ld v, const ld t); - - /// - /// Calculates the index of refraction of a material for which the wavelength - /// of light is xTimes its value in a vacuum? prints out medium if found - /// - /// The x times. - /// index of refraction - static auto indexOfRefractionFromRatioPrintMedium(const ld xTimes); - - /// - /// Analysis of an interference effect in a clear solid shows that the - /// wavelength of light in the solid is 329 nm. Knowing this light comes - /// from a He-Ne laser and has a wavelength of 633 nm in air, is the - /// substance zircon or diamond? - /// - /// The w l medium. - /// The w l2. - /// - static auto indexOfRefractionFromWavelengths(const ld lambdaMid, const ld lambda2); - - /// - /// Calculates the angle of the n order of maximum for lambda wavelength - /// of light falling on double slits separated by d (m)? - /// - /// The order of interference: 0, 1, -1, 2, -2..... - /// The wavelength. - /// The distance between slits. - /// the angle theta - static auto angleOf_nOrderOfInterference_doubleSlit(int m, const ld lambda, const ld d); - - /// - ///Calculates the separation between two slits for which a wavelength of lambda - /// light has its first maximum at an angle of theta∘. - /// - /// The order of interference: 0, 1, -1, 2, -2..... - /// The wavelength. - /// The angle theta. - /// separation between slits (units) - static auto separationBetweenSlits_doubleSlit(const int m, const ld lambda, const ld theta); - - /// - /// Calculates the distance between two slits that produces the first minimum - /// for lambda(m) of light at an angle of theta∘ - /// - /// The order of interference: 0, 1, -1, 2, -2.... - /// The w l. - /// The theta. - /// - static auto separationBetweenSlits_destructive(const int m, const ld lambda, const ld theta); - - /// - /// Calculates the wavelength of light that has its m minimum at an - /// angle of theta∘ when falling on double slits separated by d(units). - /// - /// The minimum. - /// The distance between slits. - /// The angle theta. - /// the wavelength (units) - static auto wavelengthAt_nMinimum_doubleSlit(const int m, const ld d, const ld theta); - - /// - /// Calculates the wavelength of light falling on double slits separated by - /// d units, if the nM maximum is at an angle of theta∘. - /// - /// The order of maximum. - /// The distance between slits. - /// The angle theta. - /// wavelength - static auto wavelengthAt_nOrderMaximum_doubleSlit(const ld nM, const ld d, const ld theta); - - /// - /// Calculates the wavelength of light that has its m minimum at an angle - /// of theta∘ when it falls on a single slit of width D units. - /// - /// The order of minimum. - /// The width of slit. - /// The angle theta. - /// wavelength - static auto wavelength_nMinSingleSlit(const ld m, const ld D, const ld theta); - - /// - /// Calculates the wavelength of light that has its m-order maximum at angle theta, - /// when falling on a diffraction grating that has a total of s slits per centimeter. - /// - /// The order of interference - /// The angle theta. - /// The number of slits per cm. - /// the wavelength - static auto wavelengthOfLight_nOrderMaxGrating(const ld m, const ld theta, const ld s); - - /// - /// What is the highest-order maximum for light with a wavelength of lambda - /// falling on double slits separated by d units. - /// - /// The distance of separation between slits. - /// The wavelength. - /// The angle theta is default at 90 degrees which - /// would be thrush hold angle that would cause a maximum order. - /// m= order of interference - static auto highestOrderMaximum(const ld d, const ld lambda, const ld theta); - - /// - /// Calculates angle at nM order maximum, if the first-order maximum for pure-wavelength light - /// falling on a double slit is at an angle of theta∘ - /// nM-order maximum - /// - /// The n m. - /// The theta. - /// angle of theta at nM maximum - static auto angleOf_nOrderMaximum(const ld nM, const ld theta); - - /// - /// Calculates the angle of the nMim minimum, if the first-order minimum - /// for pure-wavelength light falling on a double slit is at an angle of theta∘ - /// - /// The n minimum. - /// The theta. - /// angle theta at n minimum - static auto angleOf_nMinimum(const ld nMin, const ld theta); - - /// - /// Calculates the highest order maximum, If the first-order maximum for pure-wavelength - /// light falling on a double slit at an angle of theta. - /// - /// The first order maximum theta. - /// highest order of maximum - static auto highestOrderMaximum(const ld theta); - - /// - /// Using deltay=x*lambda*d, calculate the distance between fringes for 633-nm light - /// falling on double slits separated by 0.0800 mm, located 3.00 m from a - /// screen as in Figure - /// - /// The x. - /// The w l. - /// The d. - /// - static auto distanceBetweenFringes(const ld x, const ld lambda, const ld d); - - /// - /// Calculate the wavelength of light that produces fringes deltay units - /// apart on a screen x units from double slits separated by d units. - /// - /// The x. - /// The deltay. - /// The d. - /// distance between fringes on screen - static auto wavelengthFromFringes(const ld x, const ld deltay, const ld d); - - /// - /// Waves the length at n order m fringe. - /// - /// The m. - /// The y. - /// The x. - /// The d. - /// - static auto waveLengthAt_nOrderMFringe(const ld m, const ld y, const ld x, const ld d); - - /// - /// Young's double slit experiment is one of the quintessential experiments - /// in physics. The availability of low cost lasers in recent years allows - /// us to perform the double slit experiment rather easily in class. - /// Your professor shines a green laser (lambda units) on a double slit with a - /// separation of d units. The diffraction pattern shines on the classroom - /// wall x units away. Calculate the fringe separation between the m order - /// and central fringe. - /// - /// The m. - /// The x. - /// The lambda. - /// The d. - /// - static auto fringeSeparationAt_nOrderMFromCenterDS(const ld m, const ld x, const ld lambda, const ld d); - - /// - /// Distances the between grating slits. - /// - /// The slits. - /// The total length in meters. - /// distance between the slits in meters - static ld distanceBetweenGratingSlits(const ld slits, const ld totalLength); - - /// - /// Calculates the distance between lines on a diffraction grating that - /// produces a m-order maximum for lambda-nm light at an angle of theta∘. - /// - /// The order of interference. - /// The wavelength lambda. - /// The angle theta. - /// distance between lines in a diffraction grating - static auto separationBetweenSlitsDiffractionGrating(const ld m, const ld lambda, const ld theta); - - /// - /// Calculates how many lines per centimeter are there on a diffraction - /// grating that gives a m-order maximum for lambda-m light at an angle of theta. - /// - /// The order of interference. - /// The wavelength lambda. - /// The angle theta. - /// how many lines per centimeter in a diffraction grating - static auto linesPer_cmDefractionGrating(const ld m, const ld lambda, const ld theta); - - /// - /// Calculates the value of theta with a order m interference. - /// - /// The order of interference. - /// The distance between slits. - /// The wavelength . - /// the angle of theta - static auto thetaAtOrderOfInterference(const ld m, const ld d, const ld lambda); - - /// - /// Calculates the distance from a desired wave length to the central location - /// - /// The x-direction distance. - /// The angle theta. - /// the length from the center to the where a wavelength fringe - /// intersects on the screen - static auto yDistanceApart(const ld x, const ld theta); - - /// - /// Calculates the width of a single slit. - /// - /// The wavelength lambda. - /// The order of interference m. - /// The angle theta theta. - /// width of slit - static auto singleSlitWidth(const ld lambda, const ld m, const ld theta); - - /// - /// Uses the Rayleigh criterion to solve for the minimum resolvable angle. - /// between two objects where lambda is the wavelength of light and D is the - /// diameter of aperture. - /// - /// The wavelength lambda. - /// The diameter of aperture. - /// the minimum angle between two objects that produce a resolvable - /// image - static auto rayleighEquation(const ld lambda, const ld D); - - /// - /// A telescope can be used to enlarge the diameter of a laser beam and - /// limit diffraction spreading. The laser beam is sent through the telescope - /// in opposite the normal direction and can then be projected onto a - /// satellite or the Moon. If this is done with the - /// telescope, producing a D-m-diameter beam of lambda-nm light, neglecting atmospheric - /// effects, calculate is the size of the spot this beam would make on the Moon, - /// assuming a distance of x m? - /// - /// The wave length lambda. - /// The diameter of beam. - /// The distance away. - /// the total diffraction spreading of beam on object - static auto diffractionSpreadingTotal(const ld lambda, const ld D, const ld x); - - /// - /// calculates the distance s between two object a distance r away and - /// separated by an angle theta. - /// - /// The distance away in any units. - /// The angle theta. - /// distance the two objects are apart - static auto s_distance2Obj_rApart(const ld r, const ld theta); - - /// - /// What is the minimum diameter mirror on a looking scope that would allow - /// you to see details as small as y units apart on a object some x units - /// away? Assume an average wavelength of lambda units for the light received. - /// - /// The separation between objects being viewed. - /// The distance away. - /// The wavelength. - /// size of mirror in looking device - static auto minimumMirrorDiameter(const ld y, const ld x, const ld lambda); - - /// - /// Uses the Rayleigh criterion to calculate where resolution is still possible - /// looking through a microscope for which the minimum angular separation where - /// d is the distance between the specimen and the objective lens, and we have used the small - /// angle approximation assuming that x is much smaller then d, so that - /// that tantheta = sin theta == theta. so x is the resolving power from the resolving - /// power equation. - /// - /// The resolving power. - /// The distance between the specimen and the - /// objective lens. - /// the minimum angular separation where two point objects can - /// be resolved - static auto minimumAngularSeparation(const ld x, const ld d); - - /// - /// Calculates the resolving power of a microscope - /// - /// The wavelength lambda. - /// The distance between the specimen and the - /// objective lens. - /// The diameter of aperture. - /// resolving power - static auto resolvingPower(const ld lambda, const ld d, const ld D); - - /// - /// Calculates the resolving power for a microscope lens. - /// - /// The wavelength lambda. - /// The index of refraction between the lens and the object - /// . - /// The Numerical Aperture. - /// - static auto resolvingPower_microscopeLens(const ld lambda, const ld n, const ld NA); - - /// - /// Calculates the thinnest thickness of a non reflective lens coating. - /// - /// The lambda. - /// The index of refraction of film. - /// thinnest thickness of coating - static auto thicknessOfNonReflectiveLensCoating(const ld lambda, const ld n); - - /// - /// Suppose you have a lens(n= 1.52) system that is to be used primarily for lambda-nm - /// light. What is the second thinnest coating of (n)fluorite(n=1.38) - /// (magnesium fluoride) that would be non- reflective for this wavelength? - /// this uses the fact that there are two lambda/2 phase shifts as the light - /// travels from air91.00) into the fluorite(1.38) then to glass lens(1.52), - /// with the second phase shift having an additional distance to travel as - /// well being a total of lambda/2 + ((2*thickness)/lambda_n)*lambda = lambda/2 + 2*t*n after - /// substituting in lambda_n = lambda/n which we will multiply instead because its - /// being divided in the originally so this allows us to cancel the lambda out - /// of the formula completely. - /// - /// The wave length of light trying to be blocked - /// The index of refraction of the coating. - /// The multiple integers of interference that cause - /// a destructive interference. - /// - static auto thicknessOfThinnestCoating(const ld lambda, const ld n, const ld m); - - /// - /// To save money on making military aircraft invisible to radar, an inventor - /// decides to coat them with a non-reflective material having an index of - /// refraction of 1.20, which is between that of air and the surface of the - /// plane. This, he reasons, should be much cheaper than designing Stealth - /// bombers. Calculates What thickness should the coating be to inhibit the - /// reflection of 4.00-cm wavelength radar. - /// - /// The lambda. - /// The n. - /// The m. - /// thickness - static auto thicknessOfCoating(const ld lambda, const ld n, const ld m); - - /// - /// Malus's law used to calculate the intensity of a polarized wave after - /// passing through a filter. Where Io is the incident wave and theta is the angle - /// between the direction of polarization and the axis of a filter. - /// - /// The intensity of polarized wave. - /// The theta. - /// intensity of wave - static auto intensityOfTransmittedWave(const ld Io, const ld theta); - - /// - /// A soap bubble is t units thick and illuminated by white light incident - /// perpendicular to its surface. What wavelength and color of visible light - /// is most constructively reflected, assuming the same index of refraction - /// as water? - /// - /// The thickness. - /// The index of refraction. - /// wavelength - static auto constructivelyReflectedWavelength(const ld t, const ld n); - - /// - /// An oil slick on water is 120 nm(t) thick and illuminated by white light - /// incident perpendicular to its surface. What color does the oil appear - /// (Calculate the most constructively reflected wavelength), given its index - /// of refraction is 1.40(n), using constant multiples of m to find the first - /// visible wavelength. - /// - /// The thickness. - /// The index of refraction. - /// The constant multiple integers of order of - /// interference.. - /// wavelength - static auto constructivelyReflectedWavelength(const ld t, const ld n, const ld m); - - /// - /// A soap bubble is t units thick and illuminated by white light incident - /// at a 45∘ to its surface. What wavelength and color of visible light is - /// most constructively reflected, assuming the same index of refraction as - /// water? - /// - /// The thickness. - /// The index of refraction. - /// The constant multiple of mOrder of interference. - /// wavelength - static auto mostConstructivelyReflectedWavelength(const ld t, const ld n, const ld m); - /// - /// Waves the amplitude. - /// - /// The electric field amplitude. - /// The theta. - /// - static auto waveAmplitude(const ld E, const ld theta); - - /// - /// Calculates what angle is needed between the direction of polarized light - /// and the axis of a polarizing filter to reduce its intensity by a specified - /// percent. Use the percent value such as 90% you would enter 90 as the - /// method argument and not .90. - /// - /// The percent reduction. - /// the angle the polarizing filter needs to be to filter - /// out polarizing light waves. - static auto angleForIntensityReductionByPolarizingFilter(const ld percentReduction); - - /// - /// The building engineer installs new double paned polarizing sky lights - /// to reduce the intensity of sunlight, which is non-polarized, - /// calculate what angle the polarizing axis of the second pane of the window - /// will make with the polarizing axis of the first pane of the window in order - /// to reduce the intensity of the sunlight to percentReduction of the - /// original value - /// The percent reduction. - /// angle of second filter in relation to first - static auto anglePolarizingAxis2ndFilter(const ld percentReduction); - - /// - /// Calculates the angle using Brewster's law. tantheta = n2/n1 - /// - /// The index of refraction for incident. - /// The index of refraction for the medium of reflection. - /// - /// - static auto angleByBrewstersLaw(const ld n1, const ld n2); - - /// - /// Calculates index of refraction using Brewster's law solved for n1. - /// - /// The index of refraction for the medium of reflection. - /// - /// The angle theta. - /// The index of refraction for incident medium. - static auto n1FromBrewstersLaw(const ld n2, const ld theta); - - /// - /// Calculates index of refraction using Brewster's law solved for n2. - /// - /// The index of refraction for the incident medium. - /// The angle theta. - /// The index of refraction for the reflected medium. - static auto n2FromBrewstersLaw(const ld n1, const ld theta); - - /// - /// Calculates the angle theta when the distance of x and height of y is - /// known. - /// - /// Length of the x. - /// Height of the y. - /// angle theta - static auto theta_toa_yx(const ld x_len, const ld y_height); - - /// - /// light waves averaging lambda units in wavelength falls on a single slit of - /// width D units. Calculate the highest-order minimum produced. - /// - /// The d. - /// The lambda. - /// - static auto highestOrderMinimum_singleSlit(const ld D, const ld lambda); - - /// - /// If a single slit produces a first minimum at theta∘, Calculate at what - /// angle the m order minimum is. - /// - /// The m-order minimum. - /// The angle theta of first order minimum. - /// angle at order m minimum - static auto angleAt_nOrderMin(const ld m, const ld theta); - - /// - /// Angles at n order minimum single slit. - /// - /// The m. - /// The d. - /// The lambda. - /// - static auto angleAt_nOrderMinimum_singleSlit(const ld m, const ld D, const ld lambda); - - /// - /// t = ((m+1/2)*lambda)/(2*n) - /// Working on your car you spill oil (index of refraction = 1.55) on the - /// ground into a puddle of water (n = 1.33). You notice a rainbow pattern - /// appear across the oil slick.Recalling the lessons you learned in physics - /// class, you realize you can calculate where constructive - /// interference occurs based on the thickness of the oil slick. - /// (Assume that the average wavelength is 584 nm.) - /// - /// The index of refraction. - /// The m starting of constructive interference. - /// The m end. - /// The wavelength lambda. - /// a map of values of where constructive interference occurs - static map constructiveInterferenceRange(const ld n, const int mStart, const int mEnd, const ld lambda); - - /// - /// t = (m*lambda)/(2*n) - /// Working on your car you spill oil (index of refraction = 1.55) on the - /// ground into a puddle of water (n = 1.33). You notice a rainbow pattern - /// appear across the oil slick.Recalling the lessons you learned in physics - /// class, you realize you can calculate where destructive - /// interference occurs based on the thickness of the oil slick. - /// (Assume that the average wavelength is 584 nm.) - /// - /// The n. - /// The m start. - /// The m end. - /// The lambda. - /// - static map destructiveInterferenceRange(const ld n, const int mStart, const int mEnd, const ld lambda); - - - - -private: - ld waveOpticsVar; - static void countIncrease() { waveOptics_objectCount += 1; } - static void countDecrease() { waveOptics_objectCount -= 1; } - -}; - -#endif //PHYSICSFORMULA_WAVEOPTICS_H -//============================================================================= -//in-line class Implementation - - -inline auto WaveOptics::wavelengthInMedium(const ld lamda, const ld n) -{ - return lamda / n;//Hz -} - -inline auto WaveOptics::wavelengthOfMedium(const ld n, const ld f) -{ - return _C_ / (n * f); -} - -inline auto WaveOptics::wavelength_ratioOf2IndexOfRefractions(const ld nTop, const ld nBottom) -{ - return nTop / nBottom; -} - -inline auto WaveOptics::distanceTraveledByWaveFront(const ld v, const ld t) -{ - return v * t; -} - -inline auto WaveOptics::indexOfRefractionFromRatioPrintMedium(const ld xTimes) -{ - const auto val = 1.0 / xTimes; - const auto scale = 0.001; - const auto val2 = floor(val / scale + .5) * scale; - printMedium(refractions, val2); - return val2; -} - -inline auto WaveOptics::indexOfRefractionFromWavelengths(const ld lambdaMid, const ld lambda2) -{ - const auto temp = lambda2 / lambdaMid; - const auto scale = 0.001; - const auto n = floor(temp / scale + .5) * scale; - printMedium(refractions, n); - return n; -} - -inline auto WaveOptics::angleOf_nOrderOfInterference_doubleSlit(int m, const ld lambda, const ld d) -{ - return asin((static_cast(m) * lambda) / d) * DEGREE; -} - -inline auto WaveOptics::separationBetweenSlits_doubleSlit(const int m, const ld lambda, const ld theta) -{ - return (static_cast(m) * lambda) / sin(theta * RADIAN); -} - -inline auto WaveOptics::separationBetweenSlits_destructive(const int m, const ld lambda, const ld theta) -{ - return (((static_cast(m)-1) + (1 / 2)) * lambda) / sin(theta*RADIAN); -} - -inline auto WaveOptics::wavelengthAt_nMinimum_doubleSlit(const int m, const ld d, const ld theta) -{ - return (d * sin(theta * RADIAN)) / ((m - 1.0) + (1 / 2)); -} - -inline auto WaveOptics::wavelengthAt_nOrderMaximum_doubleSlit(const ld nM, const ld d, const ld theta) -{ - return (d * sin(theta * RADIAN)) / nM; -} - -inline auto WaveOptics::wavelength_nMinSingleSlit(const ld m, const ld D, const ld theta) -{ - return (D * sin(theta * RADIAN)) / m; -} - -inline auto WaveOptics::wavelengthOfLight_nOrderMaxGrating(const ld m, const ld theta, const ld s) -{ - const ld d = distanceBetweenGratingSlits(s, 1.0 * SU.CENTI); - return (d * sin(theta*RADIAN)) / m; -} - -inline auto WaveOptics::highestOrderMaximum(const ld d, const ld lambda, const ld theta = 90) -{ - return floor( (d * sin(theta * RADIAN)) / lambda); -} - -inline auto WaveOptics::angleOf_nOrderMaximum(const ld nM, const ld theta) -{ - return asin(nM * sin(theta * RADIAN))*DEGREE; -} - -inline auto WaveOptics::angleOf_nMinimum(const ld nMin, const ld theta) -{ - return asin(((nMin - 1.0) + (1.0 / 2.0)) * sin(theta * RADIAN)); -} - -inline auto WaveOptics::highestOrderMaximum(const ld theta) -{ - return floor(1.0 / sin(theta * RADIAN)); -} - -inline auto WaveOptics::distanceBetweenFringes(const ld x, const ld lambda, const ld d) -{ - return (x * lambda) / d; -} - -inline auto WaveOptics::wavelengthFromFringes(const ld x, const ld deltay, const ld d) -{ - return (deltay * d) / x; -} - -inline auto WaveOptics::waveLengthAt_nOrderMFringe(const ld m, const ld y, const ld x, const ld d) -{ - return (y * d) / (m * x); -} - -inline auto WaveOptics::fringeSeparationAt_nOrderMFromCenterDS(const ld m, const ld x, const ld lambda, const ld d) -{ - return (m * x * lambda) / d; -} - - -inline ld WaveOptics::distanceBetweenGratingSlits(const ld slits, const ld totalLength) -{ - return totalLength / slits; -} - -inline auto WaveOptics::separationBetweenSlitsDiffractionGrating(const ld m, const ld lambda, const ld theta) -{ - return (m * lambda) / sin(theta*RADIAN); -} - -inline auto WaveOptics::linesPer_cmDefractionGrating(const ld m, const ld lambda, const ld theta) -{ - return floor(1.0/((m * lambda) / sin(theta * RADIAN))*(1.0/100.0)); -} - -inline auto WaveOptics::thetaAtOrderOfInterference(const ld m, const ld d, const ld lambda) -{ - return asin((m * lambda) / d)*DEGREE; -} - -inline auto WaveOptics::yDistanceApart(const ld x, const ld theta) -{ - return x * tan(theta*RADIAN); -} - -inline auto WaveOptics::singleSlitWidth(const ld lambda, const ld m, const ld theta) -{ - return (m * lambda) / sin(theta*RADIAN); -} - -inline auto WaveOptics::rayleighEquation(const ld lambda, const ld D) -{ - return 1.22 * (lambda / D); -} - -inline auto WaveOptics::diffractionSpreadingTotal(const ld lambda, const ld D, const ld x) -{ - const auto d = 1.22 * (lambda / D); - return D + (2 * x) * tan(d); -} - -inline auto WaveOptics::s_distance2Obj_rApart(const ld r, const ld theta) -{ - - return r * theta; -} - -inline auto WaveOptics::minimumMirrorDiameter(const ld y, const ld x, const ld lambda) -{ - const auto theta = atan(y / x); - return 1.22 * (lambda / theta); -} - -inline auto WaveOptics::minimumAngularSeparation(const ld x, const ld d) -{ - return x / d; -} - -inline auto WaveOptics::resolvingPower(const ld lambda, const ld d, const ld D) -{ - return 1.22 * ((lambda * d) / D); -} - -inline auto WaveOptics::resolvingPower_microscopeLens(const ld lambda, const ld n, const ld NA) -{ - return .61 * ((lambda * n) / NA); -} - -inline auto WaveOptics::thicknessOfNonReflectiveLensCoating(const ld lambda, const ld n) -{ - return ((lambda / n) / 4.0); -} - -inline auto WaveOptics::thicknessOfThinnestCoating(const ld lambda, const ld n, const ld m) -{ - return (lambda / (4.0 * n)) * (2.0 * m - 1.0); -} - -inline auto WaveOptics::thicknessOfCoating(const ld lambda, const ld n, const ld m) -{ - return (lambda * (2.0 * m - 1)) / (4.0 * n); -} - -inline auto WaveOptics::intensityOfTransmittedWave(const ld Io, const ld theta) -{ - return Io * pow(cos(theta), 2); -} - -inline auto WaveOptics::constructivelyReflectedWavelength(const ld t, const ld n) -{ - return 4.0 * t * n; -} - -inline auto WaveOptics::constructivelyReflectedWavelength(const ld t, const ld n, const ld m) -{ - return (4.0 * t * n) / (2.0 * (m)-1); -} - -inline auto WaveOptics::mostConstructivelyReflectedWavelength(const ld t, const ld n, const ld m) -{ - return (4.0 * sqrt( (2.0) * t * n) / (2.0 * m - 1.0)); -} - -inline auto WaveOptics::waveAmplitude(const ld E, const ld theta) -{ - return E * cos(theta); -} - -inline auto WaveOptics::angleForIntensityReductionByPolarizingFilter(const ld percentReduction) -{ - const ld I = (1.00 - (percentReduction / 100)); - return acos(sqrt(I / 1.0)) * DEGREE; -} - -inline auto WaveOptics::anglePolarizingAxis2ndFilter(const ld percentReduction) -{ - const auto dec = percentReduction / 100.0; - const auto temp = sqrt(2.0 * dec); - return acos(temp) * DEGREE; -} - -inline auto WaveOptics::angleByBrewstersLaw(const ld n1, const ld n2) -{ - return atan(n2 / n1)*DEGREE; -} - -inline auto WaveOptics::n1FromBrewstersLaw(const ld n2, const ld theta) -{ - return n2 / tan(theta*RADIAN); -} - -inline auto WaveOptics::n2FromBrewstersLaw(const ld n1, const ld theta) -{ - return tan(theta * RADIAN) * n1; -} - -inline auto WaveOptics::theta_toa_yx(const ld x_len, const ld y_height) -{ - return atan(y_height / x_len); -} - -inline auto WaveOptics::highestOrderMinimum_singleSlit(const ld D, const ld lambda) -{ - return floor(D / lambda); -} - -inline auto WaveOptics::angleAt_nOrderMin(const ld m, const ld theta) -{ - const auto ratio = sin(theta * RADIAN)/1.0; - return asin(m * ratio) * DEGREE; -} - -inline auto WaveOptics::angleAt_nOrderMinimum_singleSlit(const ld m, const ld D, const ld lambda) -{ - return asin((m * lambda) / D) * DEGREE; -} - -inline map WaveOptics::constructiveInterferenceRange(const ld n, const int mStart, const int mEnd, const ld lambda) -{ - map results; - for (int i = mStart, j = 1; i < mEnd; i++, j++) - { - auto val = ((i + .5) * lambda / (2.0 * n)); - results[j] = val; - } - return results; -} - -inline map WaveOptics::destructiveInterferenceRange(const ld n, const int mStart, const int mEnd, const ld lambda) -{ - map results; - for (int i = mStart, j = 1; i < mEnd; i++, j++) - { - auto val = ((i ) * lambda / (2.0 * n)); - results[j] = val; - } - return results; +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_WAVEOPTICS_H +#define PHYSICSFORMULA_WAVEOPTICS_H +#include "GeometricOptics.h" +#include +#include +//α=224,ß=225,π=227,Σ=228,σ=229,µ=230,τ=231,Φ=232,theta=233 +//Ω=234,delta=235,∞=236,φ=237,ε=238,∩=239,≡=240,Γ=226,γ, σ, theta, Å, Ώ, lambda, γ +/** + * @class WaveOptics + * @details class of static methods that relate to chapter 27 of the open-stax + * college physics text book. + * @author Ryan Zurrin + * dateBuilt 5/15/2021 + * lastEdit 5/15/2021 + */ +static int waveOptics_objectCount = 0; + +class WaveOptics : + public GeometricOptics +{ + +public: + WaveOptics* _waveOpticPtr; + + WaveOptics() + { + _waveOpticPtr = nullptr; + waveOpticsVar = 0.0; + countIncrease(); + } + + /** + * @brief copy constructor + */ + WaveOptics(const WaveOptics& t) + { + _waveOpticPtr = t._waveOpticPtr; + waveOpticsVar = t.waveOpticsVar; + countIncrease(); + } + /** + * #brief move constructor + */ + WaveOptics(WaveOptics&& t) noexcept + { + _waveOpticPtr = t._waveOpticPtr; + waveOpticsVar = t.waveOpticsVar; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + WaveOptics& operator=(const WaveOptics& t) + { + if (this != &t) + { + _waveOpticPtr = t._waveOpticPtr; + waveOpticsVar = t.waveOpticsVar; + countIncrease(); + } + return *this; + } + + static void show_objectCount() { std::cout <<"\n wave optics object count: " + << waveOptics_objectCount << std::endl; } + static int get_objectCount() { return waveOptics_objectCount; } + + + ~WaveOptics() + { + delete _waveOpticPtr; + } + void setGeometricOpticsVar(ld var) { waveOpticsVar = var; } + ld getGeometricOpticsVar() const { return waveOpticsVar; } + + + /// + /// Calculates the wavelength in a medium when the lamda in a vacuum is lamda and + /// the index of refraction of the medium is n. + /// + /// The wavelength in a vacuum. + /// The index of refraction. + /// the wavelength in a medium + static auto wavelengthInMedium(const ld lamda, const ld n); + + /// + /// Calculates the wavelength of medium. + /// + /// The index of refraction of medium. + /// The frequency. + /// the wavelength of medium (Hz) + static auto wavelengthOfMedium(const ld n, const ld f); + + /// + /// Show that when light passes from nTop to nBottom, its wavelength changes + /// to some value times its original value. + /// + /// The index of refraction of medium in. + /// The index of refraction medium moving too. + /// ratio of wavelengths + static auto wavelength_ratioOf2IndexOfRefractions(const ld nTop, const ld nBottom); + + /// + /// Distances traveled by a wave front. + /// + /// The wave speed. + /// The time. + /// + static auto distanceTraveledByWaveFront(const ld v, const ld t); + + /// + /// Calculates the index of refraction of a material for which the wavelength + /// of light is xTimes its value in a vacuum? prints out medium if found + /// + /// The x times. + /// index of refraction + static auto indexOfRefractionFromRatioPrintMedium(const ld xTimes); + + /// + /// Analysis of an interference effect in a clear solid shows that the + /// wavelength of light in the solid is 329 nm. Knowing this light comes + /// from a He-Ne laser and has a wavelength of 633 nm in air, is the + /// substance zircon or diamond? + /// + /// The w l medium. + /// The w l2. + /// + static auto indexOfRefractionFromWavelengths(const ld lambdaMid, const ld lambda2); + + /// + /// Calculates the angle of the n order of maximum for lambda wavelength + /// of light falling on double slits separated by d (m)? + /// + /// The order of interference: 0, 1, -1, 2, -2..... + /// The wavelength. + /// The distance between slits. + /// the angle theta + static auto angleOf_nOrderOfInterference_doubleSlit(int m, const ld lambda, const ld d); + + /// + ///Calculates the separation between two slits for which a wavelength of lambda + /// light has its first maximum at an angle of theta∘. + /// + /// The order of interference: 0, 1, -1, 2, -2..... + /// The wavelength. + /// The angle theta. + /// separation between slits (units) + static auto separationBetweenSlits_doubleSlit(const int m, const ld lambda, const ld theta); + + /// + /// Calculates the distance between two slits that produces the first minimum + /// for lambda(m) of light at an angle of theta∘ + /// + /// The order of interference: 0, 1, -1, 2, -2.... + /// The w l. + /// The theta. + /// + static auto separationBetweenSlits_destructive(const int m, const ld lambda, const ld theta); + + /// + /// Calculates the wavelength of light that has its m minimum at an + /// angle of theta∘ when falling on double slits separated by d(units). + /// + /// The minimum. + /// The distance between slits. + /// The angle theta. + /// the wavelength (units) + static auto wavelengthAt_nMinimum_doubleSlit(const int m, const ld d, const ld theta); + + /// + /// Calculates the wavelength of light falling on double slits separated by + /// d units, if the nM maximum is at an angle of theta∘. + /// + /// The order of maximum. + /// The distance between slits. + /// The angle theta. + /// wavelength + static auto wavelengthAt_nOrderMaximum_doubleSlit(const ld nM, const ld d, const ld theta); + + /// + /// Calculates the wavelength of light that has its m minimum at an angle + /// of theta∘ when it falls on a single slit of width D units. + /// + /// The order of minimum. + /// The width of slit. + /// The angle theta. + /// wavelength + static auto wavelength_nMinSingleSlit(const ld m, const ld D, const ld theta); + + /// + /// Calculates the wavelength of light that has its m-order maximum at angle theta, + /// when falling on a diffraction grating that has a total of s slits per centimeter. + /// + /// The order of interference + /// The angle theta. + /// The number of slits per cm. + /// the wavelength + static auto wavelengthOfLight_nOrderMaxGrating(const ld m, const ld theta, const ld s); + + /// + /// What is the highest-order maximum for light with a wavelength of lambda + /// falling on double slits separated by d units. + /// + /// The distance of separation between slits. + /// The wavelength. + /// The angle theta is default at 90 degrees which + /// would be thrush hold angle that would cause a maximum order. + /// m= order of interference + static auto highestOrderMaximum(const ld d, const ld lambda, const ld theta); + + /// + /// Calculates angle at nM order maximum, if the first-order maximum for pure-wavelength light + /// falling on a double slit is at an angle of theta∘ + /// nM-order maximum + /// + /// The n m. + /// The theta. + /// angle of theta at nM maximum + static auto angleOf_nOrderMaximum(const ld nM, const ld theta); + + /// + /// Calculates the angle of the nMim minimum, if the first-order minimum + /// for pure-wavelength light falling on a double slit is at an angle of theta∘ + /// + /// The n minimum. + /// The theta. + /// angle theta at n minimum + static auto angleOf_nMinimum(const ld nMin, const ld theta); + + /// + /// Calculates the highest order maximum, If the first-order maximum for pure-wavelength + /// light falling on a double slit at an angle of theta. + /// + /// The first order maximum theta. + /// highest order of maximum + static auto highestOrderMaximum(const ld theta); + + /// + /// Using deltay=x*lambda*d, calculate the distance between fringes for 633-nm light + /// falling on double slits separated by 0.0800 mm, located 3.00 m from a + /// screen as in Figure + /// + /// The x. + /// The w l. + /// The d. + /// + static auto distanceBetweenFringes(const ld x, const ld lambda, const ld d); + + /// + /// Calculate the wavelength of light that produces fringes deltay units + /// apart on a screen x units from double slits separated by d units. + /// + /// The x. + /// The deltay. + /// The d. + /// distance between fringes on screen + static auto wavelengthFromFringes(const ld x, const ld deltay, const ld d); + + /// + /// Waves the length at n order m fringe. + /// + /// The m. + /// The y. + /// The x. + /// The d. + /// + static auto waveLengthAt_nOrderMFringe(const ld m, const ld y, const ld x, const ld d); + + /// + /// Young's double slit experiment is one of the quintessential experiments + /// in physics. The availability of low cost lasers in recent years allows + /// us to perform the double slit experiment rather easily in class. + /// Your professor shines a green laser (lambda units) on a double slit with a + /// separation of d units. The diffraction pattern shines on the classroom + /// wall x units away. Calculate the fringe separation between the m order + /// and central fringe. + /// + /// The m. + /// The x. + /// The lambda. + /// The d. + /// + static auto fringeSeparationAt_nOrderMFromCenterDS(const ld m, const ld x, const ld lambda, const ld d); + + /// + /// Distances the between grating slits. + /// + /// The slits. + /// The total length in meters. + /// distance between the slits in meters + static ld distanceBetweenGratingSlits(const ld slits, const ld totalLength); + + /// + /// Calculates the distance between lines on a diffraction grating that + /// produces a m-order maximum for lambda-nm light at an angle of theta∘. + /// + /// The order of interference. + /// The wavelength lambda. + /// The angle theta. + /// distance between lines in a diffraction grating + static auto separationBetweenSlitsDiffractionGrating(const ld m, const ld lambda, const ld theta); + + /// + /// Calculates how many lines per centimeter are there on a diffraction + /// grating that gives a m-order maximum for lambda-m light at an angle of theta. + /// + /// The order of interference. + /// The wavelength lambda. + /// The angle theta. + /// how many lines per centimeter in a diffraction grating + static auto linesPer_cmDefractionGrating(const ld m, const ld lambda, const ld theta); + + /// + /// Calculates the value of theta with a order m interference. + /// + /// The order of interference. + /// The distance between slits. + /// The wavelength . + /// the angle of theta + static auto thetaAtOrderOfInterference(const ld m, const ld d, const ld lambda); + + /// + /// Calculates the distance from a desired wave length to the central location + /// + /// The x-direction distance. + /// The angle theta. + /// the length from the center to the where a wavelength fringe + /// intersects on the screen + static auto yDistanceApart(const ld x, const ld theta); + + /// + /// Calculates the width of a single slit. + /// + /// The wavelength lambda. + /// The order of interference m. + /// The angle theta theta. + /// width of slit + static auto singleSlitWidth(const ld lambda, const ld m, const ld theta); + + /// + /// Uses the Rayleigh criterion to solve for the minimum resolvable angle. + /// between two objects where lambda is the wavelength of light and D is the + /// diameter of aperture. + /// + /// The wavelength lambda. + /// The diameter of aperture. + /// the minimum angle between two objects that produce a resolvable + /// image + static auto rayleighEquation(const ld lambda, const ld D); + + /// + /// A telescope can be used to enlarge the diameter of a laser beam and + /// limit diffraction spreading. The laser beam is sent through the telescope + /// in opposite the normal direction and can then be projected onto a + /// satellite or the Moon. If this is done with the + /// telescope, producing a D-m-diameter beam of lambda-nm light, neglecting atmospheric + /// effects, calculate is the size of the spot this beam would make on the Moon, + /// assuming a distance of x m? + /// + /// The wave length lambda. + /// The diameter of beam. + /// The distance away. + /// the total diffraction spreading of beam on object + static auto diffractionSpreadingTotal(const ld lambda, const ld D, const ld x); + + /// + /// calculates the distance s between two object a distance r away and + /// separated by an angle theta. + /// + /// The distance away in any units. + /// The angle theta. + /// distance the two objects are apart + static auto s_distance2Obj_rApart(const ld r, const ld theta); + + /// + /// What is the minimum diameter mirror on a looking scope that would allow + /// you to see details as small as y units apart on a object some x units + /// away? Assume an average wavelength of lambda units for the light received. + /// + /// The separation between objects being viewed. + /// The distance away. + /// The wavelength. + /// size of mirror in looking device + static auto minimumMirrorDiameter(const ld y, const ld x, const ld lambda); + + /// + /// Uses the Rayleigh criterion to calculate where resolution is still possible + /// looking through a microscope for which the minimum angular separation where + /// d is the distance between the specimen and the objective lens, and we have used the small + /// angle approximation assuming that x is much smaller then d, so that + /// that tantheta = sin theta == theta. so x is the resolving power from the resolving + /// power equation. + /// + /// The resolving power. + /// The distance between the specimen and the + /// objective lens. + /// the minimum angular separation where two point objects can + /// be resolved + static auto minimumAngularSeparation(const ld x, const ld d); + + /// + /// Calculates the resolving power of a microscope + /// + /// The wavelength lambda. + /// The distance between the specimen and the + /// objective lens. + /// The diameter of aperture. + /// resolving power + static auto resolvingPower(const ld lambda, const ld d, const ld D); + + /// + /// Calculates the resolving power for a microscope lens. + /// + /// The wavelength lambda. + /// The index of refraction between the lens and the object + /// . + /// The Numerical Aperture. + /// + static auto resolvingPower_microscopeLens(const ld lambda, const ld n, const ld NA); + + /// + /// Calculates the thinnest thickness of a non reflective lens coating. + /// + /// The lambda. + /// The index of refraction of film. + /// thinnest thickness of coating + static auto thicknessOfNonReflectiveLensCoating(const ld lambda, const ld n); + + /// + /// Suppose you have a lens(n= 1.52) system that is to be used primarily for lambda-nm + /// light. What is the second thinnest coating of (n)fluorite(n=1.38) + /// (magnesium fluoride) that would be non- reflective for this wavelength? + /// this uses the fact that there are two lambda/2 phase shifts as the light + /// travels from air91.00) into the fluorite(1.38) then to glass lens(1.52), + /// with the second phase shift having an additional distance to travel as + /// well being a total of lambda/2 + ((2*thickness)/lambda_n)*lambda = lambda/2 + 2*t*n after + /// substituting in lambda_n = lambda/n which we will multiply instead because its + /// being divided in the originally so this allows us to cancel the lambda out + /// of the formula completely. + /// + /// The wave length of light trying to be blocked + /// The index of refraction of the coating. + /// The multiple integers of interference that cause + /// a destructive interference. + /// + static auto thicknessOfThinnestCoating(const ld lambda, const ld n, const ld m); + + /// + /// To save money on making military aircraft invisible to radar, an inventor + /// decides to coat them with a non-reflective material having an index of + /// refraction of 1.20, which is between that of air and the surface of the + /// plane. This, he reasons, should be much cheaper than designing Stealth + /// bombers. Calculates What thickness should the coating be to inhibit the + /// reflection of 4.00-cm wavelength radar. + /// + /// The lambda. + /// The n. + /// The m. + /// thickness + static auto thicknessOfCoating(const ld lambda, const ld n, const ld m); + + /// + /// Malus's law used to calculate the intensity of a polarized wave after + /// passing through a filter. Where Io is the incident wave and theta is the angle + /// between the direction of polarization and the axis of a filter. + /// + /// The intensity of polarized wave. + /// The theta. + /// intensity of wave + static auto intensityOfTransmittedWave(const ld Io, const ld theta); + + /// + /// A soap bubble is t units thick and illuminated by white light incident + /// perpendicular to its surface. What wavelength and color of visible light + /// is most constructively reflected, assuming the same index of refraction + /// as water? + /// + /// The thickness. + /// The index of refraction. + /// wavelength + static auto constructivelyReflectedWavelength(const ld t, const ld n); + + /// + /// An oil slick on water is 120 nm(t) thick and illuminated by white light + /// incident perpendicular to its surface. What color does the oil appear + /// (Calculate the most constructively reflected wavelength), given its index + /// of refraction is 1.40(n), using constant multiples of m to find the first + /// visible wavelength. + /// + /// The thickness. + /// The index of refraction. + /// The constant multiple integers of order of + /// interference.. + /// wavelength + static auto constructivelyReflectedWavelength(const ld t, const ld n, const ld m); + + /// + /// A soap bubble is t units thick and illuminated by white light incident + /// at a 45∘ to its surface. What wavelength and color of visible light is + /// most constructively reflected, assuming the same index of refraction as + /// water? + /// + /// The thickness. + /// The index of refraction. + /// The constant multiple of mOrder of interference. + /// wavelength + static auto mostConstructivelyReflectedWavelength(const ld t, const ld n, const ld m); + /// + /// Waves the amplitude. + /// + /// The electric field amplitude. + /// The theta. + /// + static auto waveAmplitude(const ld E, const ld theta); + + /// + /// Calculates what angle is needed between the direction of polarized light + /// and the axis of a polarizing filter to reduce its intensity by a specified + /// percent. Use the percent value such as 90% you would enter 90 as the + /// method argument and not .90. + /// + /// The percent reduction. + /// the angle the polarizing filter needs to be to filter + /// out polarizing light waves. + static auto angleForIntensityReductionByPolarizingFilter(const ld percentReduction); + + /// + /// The building engineer installs new double paned polarizing sky lights + /// to reduce the intensity of sunlight, which is non-polarized, + /// calculate what angle the polarizing axis of the second pane of the window + /// will make with the polarizing axis of the first pane of the window in order + /// to reduce the intensity of the sunlight to percentReduction of the + /// original value + /// The percent reduction. + /// angle of second filter in relation to first + static auto anglePolarizingAxis2ndFilter(const ld percentReduction); + + /// + /// Calculates the angle using Brewster's law. tantheta = n2/n1 + /// + /// The index of refraction for incident. + /// The index of refraction for the medium of reflection. + /// + /// + static auto angleByBrewstersLaw(const ld n1, const ld n2); + + /// + /// Calculates index of refraction using Brewster's law solved for n1. + /// + /// The index of refraction for the medium of reflection. + /// + /// The angle theta. + /// The index of refraction for incident medium. + static auto n1FromBrewstersLaw(const ld n2, const ld theta); + + /// + /// Calculates index of refraction using Brewster's law solved for n2. + /// + /// The index of refraction for the incident medium. + /// The angle theta. + /// The index of refraction for the reflected medium. + static auto n2FromBrewstersLaw(const ld n1, const ld theta); + + /// + /// Calculates the angle theta when the distance of x and height of y is + /// known. + /// + /// Length of the x. + /// Height of the y. + /// angle theta + static auto theta_toa_yx(const ld x_len, const ld y_height); + + /// + /// light waves averaging lambda units in wavelength falls on a single slit of + /// width D units. Calculate the highest-order minimum produced. + /// + /// The d. + /// The lambda. + /// + static auto highestOrderMinimum_singleSlit(const ld D, const ld lambda); + + /// + /// If a single slit produces a first minimum at theta∘, Calculate at what + /// angle the m order minimum is. + /// + /// The m-order minimum. + /// The angle theta of first order minimum. + /// angle at order m minimum + static auto angleAt_nOrderMin(const ld m, const ld theta); + + /// + /// Angles at n order minimum single slit. + /// + /// The m. + /// The d. + /// The lambda. + /// + static auto angleAt_nOrderMinimum_singleSlit(const ld m, const ld D, const ld lambda); + + /// + /// t = ((m+1/2)*lambda)/(2*n) + /// Working on your car you spill oil (index of refraction = 1.55) on the + /// ground into a puddle of water (n = 1.33). You notice a rainbow pattern + /// appear across the oil slick.Recalling the lessons you learned in physics + /// class, you realize you can calculate where constructive + /// interference occurs based on the thickness of the oil slick. + /// (Assume that the average wavelength is 584 nm.) + /// + /// The index of refraction. + /// The m starting of constructive interference. + /// The m end. + /// The wavelength lambda. + /// a map of values of where constructive interference occurs + static map constructiveInterferenceRange(const ld n, const int mStart, const int mEnd, const ld lambda); + + /// + /// t = (m*lambda)/(2*n) + /// Working on your car you spill oil (index of refraction = 1.55) on the + /// ground into a puddle of water (n = 1.33). You notice a rainbow pattern + /// appear across the oil slick.Recalling the lessons you learned in physics + /// class, you realize you can calculate where destructive + /// interference occurs based on the thickness of the oil slick. + /// (Assume that the average wavelength is 584 nm.) + /// + /// The n. + /// The m start. + /// The m end. + /// The lambda. + /// + static map destructiveInterferenceRange(const ld n, const int mStart, const int mEnd, const ld lambda); + + + + +private: + ld waveOpticsVar; + static void countIncrease() { waveOptics_objectCount += 1; } + static void countDecrease() { waveOptics_objectCount -= 1; } + +}; + +#endif //PHYSICSFORMULA_WAVEOPTICS_H +//============================================================================= +//in-line class Implementation + + +inline auto WaveOptics::wavelengthInMedium(const ld lamda, const ld n) +{ + return lamda / n;//Hz +} + +inline auto WaveOptics::wavelengthOfMedium(const ld n, const ld f) +{ + return _C_ / (n * f); +} + +inline auto WaveOptics::wavelength_ratioOf2IndexOfRefractions(const ld nTop, const ld nBottom) +{ + return nTop / nBottom; +} + +inline auto WaveOptics::distanceTraveledByWaveFront(const ld v, const ld t) +{ + return v * t; +} + +inline auto WaveOptics::indexOfRefractionFromRatioPrintMedium(const ld xTimes) +{ + const auto val = 1.0 / xTimes; + const auto scale = 0.001; + const auto val2 = floor(val / scale + .5) * scale; + printMedium(refractions, val2); + return val2; +} + +inline auto WaveOptics::indexOfRefractionFromWavelengths(const ld lambdaMid, const ld lambda2) +{ + const auto temp = lambda2 / lambdaMid; + const auto scale = 0.001; + const auto n = floor(temp / scale + .5) * scale; + printMedium(refractions, n); + return n; +} + +inline auto WaveOptics::angleOf_nOrderOfInterference_doubleSlit(int m, const ld lambda, const ld d) +{ + return asin((static_cast(m) * lambda) / d) * DEGREE; +} + +inline auto WaveOptics::separationBetweenSlits_doubleSlit(const int m, const ld lambda, const ld theta) +{ + return (static_cast(m) * lambda) / sin(theta * RADIAN); +} + +inline auto WaveOptics::separationBetweenSlits_destructive(const int m, const ld lambda, const ld theta) +{ + return (((static_cast(m)-1) + (1 / 2)) * lambda) / sin(theta*RADIAN); +} + +inline auto WaveOptics::wavelengthAt_nMinimum_doubleSlit(const int m, const ld d, const ld theta) +{ + return (d * sin(theta * RADIAN)) / ((m - 1.0) + (1 / 2)); +} + +inline auto WaveOptics::wavelengthAt_nOrderMaximum_doubleSlit(const ld nM, const ld d, const ld theta) +{ + return (d * sin(theta * RADIAN)) / nM; +} + +inline auto WaveOptics::wavelength_nMinSingleSlit(const ld m, const ld D, const ld theta) +{ + return (D * sin(theta * RADIAN)) / m; +} + +inline auto WaveOptics::wavelengthOfLight_nOrderMaxGrating(const ld m, const ld theta, const ld s) +{ + const ld d = distanceBetweenGratingSlits(s, 1.0 * SU.CENTI); + return (d * sin(theta*RADIAN)) / m; +} + +inline auto WaveOptics::highestOrderMaximum(const ld d, const ld lambda, const ld theta = 90) +{ + return floor( (d * sin(theta * RADIAN)) / lambda); +} + +inline auto WaveOptics::angleOf_nOrderMaximum(const ld nM, const ld theta) +{ + return asin(nM * sin(theta * RADIAN))*DEGREE; +} + +inline auto WaveOptics::angleOf_nMinimum(const ld nMin, const ld theta) +{ + return asin(((nMin - 1.0) + (1.0 / 2.0)) * sin(theta * RADIAN)); +} + +inline auto WaveOptics::highestOrderMaximum(const ld theta) +{ + return floor(1.0 / sin(theta * RADIAN)); +} + +inline auto WaveOptics::distanceBetweenFringes(const ld x, const ld lambda, const ld d) +{ + return (x * lambda) / d; +} + +inline auto WaveOptics::wavelengthFromFringes(const ld x, const ld deltay, const ld d) +{ + return (deltay * d) / x; +} + +inline auto WaveOptics::waveLengthAt_nOrderMFringe(const ld m, const ld y, const ld x, const ld d) +{ + return (y * d) / (m * x); +} + +inline auto WaveOptics::fringeSeparationAt_nOrderMFromCenterDS(const ld m, const ld x, const ld lambda, const ld d) +{ + return (m * x * lambda) / d; +} + + +inline ld WaveOptics::distanceBetweenGratingSlits(const ld slits, const ld totalLength) +{ + return totalLength / slits; +} + +inline auto WaveOptics::separationBetweenSlitsDiffractionGrating(const ld m, const ld lambda, const ld theta) +{ + return (m * lambda) / sin(theta*RADIAN); +} + +inline auto WaveOptics::linesPer_cmDefractionGrating(const ld m, const ld lambda, const ld theta) +{ + return floor(1.0/((m * lambda) / sin(theta * RADIAN))*(1.0/100.0)); +} + +inline auto WaveOptics::thetaAtOrderOfInterference(const ld m, const ld d, const ld lambda) +{ + return asin((m * lambda) / d)*DEGREE; +} + +inline auto WaveOptics::yDistanceApart(const ld x, const ld theta) +{ + return x * tan(theta*RADIAN); +} + +inline auto WaveOptics::singleSlitWidth(const ld lambda, const ld m, const ld theta) +{ + return (m * lambda) / sin(theta*RADIAN); +} + +inline auto WaveOptics::rayleighEquation(const ld lambda, const ld D) +{ + return 1.22 * (lambda / D); +} + +inline auto WaveOptics::diffractionSpreadingTotal(const ld lambda, const ld D, const ld x) +{ + const auto d = 1.22 * (lambda / D); + return D + (2 * x) * tan(d); +} + +inline auto WaveOptics::s_distance2Obj_rApart(const ld r, const ld theta) +{ + + return r * theta; +} + +inline auto WaveOptics::minimumMirrorDiameter(const ld y, const ld x, const ld lambda) +{ + const auto theta = atan(y / x); + return 1.22 * (lambda / theta); +} + +inline auto WaveOptics::minimumAngularSeparation(const ld x, const ld d) +{ + return x / d; +} + +inline auto WaveOptics::resolvingPower(const ld lambda, const ld d, const ld D) +{ + return 1.22 * ((lambda * d) / D); +} + +inline auto WaveOptics::resolvingPower_microscopeLens(const ld lambda, const ld n, const ld NA) +{ + return .61 * ((lambda * n) / NA); +} + +inline auto WaveOptics::thicknessOfNonReflectiveLensCoating(const ld lambda, const ld n) +{ + return ((lambda / n) / 4.0); +} + +inline auto WaveOptics::thicknessOfThinnestCoating(const ld lambda, const ld n, const ld m) +{ + return (lambda / (4.0 * n)) * (2.0 * m - 1.0); +} + +inline auto WaveOptics::thicknessOfCoating(const ld lambda, const ld n, const ld m) +{ + return (lambda * (2.0 * m - 1)) / (4.0 * n); +} + +inline auto WaveOptics::intensityOfTransmittedWave(const ld Io, const ld theta) +{ + return Io * pow(cos(theta), 2); +} + +inline auto WaveOptics::constructivelyReflectedWavelength(const ld t, const ld n) +{ + return 4.0 * t * n; +} + +inline auto WaveOptics::constructivelyReflectedWavelength(const ld t, const ld n, const ld m) +{ + return (4.0 * t * n) / (2.0 * (m)-1); +} + +inline auto WaveOptics::mostConstructivelyReflectedWavelength(const ld t, const ld n, const ld m) +{ + return (4.0 * sqrt( (2.0) * t * n) / (2.0 * m - 1.0)); +} + +inline auto WaveOptics::waveAmplitude(const ld E, const ld theta) +{ + return E * cos(theta); +} + +inline auto WaveOptics::angleForIntensityReductionByPolarizingFilter(const ld percentReduction) +{ + const ld I = (1.00 - (percentReduction / 100)); + return acos(sqrt(I / 1.0)) * DEGREE; +} + +inline auto WaveOptics::anglePolarizingAxis2ndFilter(const ld percentReduction) +{ + const auto dec = percentReduction / 100.0; + const auto temp = sqrt(2.0 * dec); + return acos(temp) * DEGREE; +} + +inline auto WaveOptics::angleByBrewstersLaw(const ld n1, const ld n2) +{ + return atan(n2 / n1)*DEGREE; +} + +inline auto WaveOptics::n1FromBrewstersLaw(const ld n2, const ld theta) +{ + return n2 / tan(theta*RADIAN); +} + +inline auto WaveOptics::n2FromBrewstersLaw(const ld n1, const ld theta) +{ + return tan(theta * RADIAN) * n1; +} + +inline auto WaveOptics::theta_toa_yx(const ld x_len, const ld y_height) +{ + return atan(y_height / x_len); +} + +inline auto WaveOptics::highestOrderMinimum_singleSlit(const ld D, const ld lambda) +{ + return floor(D / lambda); +} + +inline auto WaveOptics::angleAt_nOrderMin(const ld m, const ld theta) +{ + const auto ratio = sin(theta * RADIAN)/1.0; + return asin(m * ratio) * DEGREE; +} + +inline auto WaveOptics::angleAt_nOrderMinimum_singleSlit(const ld m, const ld D, const ld lambda) +{ + return asin((m * lambda) / D) * DEGREE; +} + +inline map WaveOptics::constructiveInterferenceRange(const ld n, const int mStart, const int mEnd, const ld lambda) +{ + map results; + for (int i = mStart, j = 1; i < mEnd; i++, j++) + { + auto val = ((i + .5) * lambda / (2.0 * n)); + results[j] = val; + } + return results; +} + +inline map WaveOptics::destructiveInterferenceRange(const ld n, const int mStart, const int mEnd, const ld lambda) +{ + map results; + for (int i = mStart, j = 1; i < mEnd; i++, j++) + { + auto val = ((i ) * lambda / (2.0 * n)); + results[j] = val; + } + return results; } \ No newline at end of file diff --git a/Waves.h b/Waves.h index 2d1c998..209c36b 100644 --- a/Waves.h +++ b/Waves.h @@ -1,711 +1,711 @@ -// -// Created by Ryan.Zurrin001 on 12/16/2021. -// - -#ifndef PHYSICSFORMULA_WAVES_H -#define PHYSICSFORMULA_WAVES_H -#define GA 9.81 // gravitational acceleration in m/s^2 -#include -#include "Elasticity.h" -#include "Energy.h" -#include "FluidDynamics.h" -//α=224,ß=225,π=227,Σ=228,σ=229,µ=230,τ=231,Φ=232,Θ=233 -//Ω=234,δ=235,∞=236,φ=237,ε=238,∩=239,≡=240,Γ=226,γ, σ, ϑ, Å, Ώ, λ, γ -/** - * @class Waves - * @details class of static methods that relate to chapter 16 of the open-stax - * college physics text book. - * @author Ryan Zurrin - * dateBuilt 12/20/2020 - * lastEdit 12/26/2020 - */ - -static int waves_objectCount = 0; - -/// -/// Quadratics equation. -/// -/// a. -/// b. -/// c. -/// vector with the two results from calculation -static vector quadraticEquation(const ld a, const ld b, const ld c) -{ - vector result = { 0.0, 0.0 }; - result[0] = (-b - sqrt((b * b) - 4.0 * a * c)) / (2.0 * a); - result[1] = (-b + sqrt((b * b) - 4.0 * a * c)) / (2.0 * a); - return result; -} -/// -/// Quadratic equation only plus. -/// -/// a. -/// b. -/// c. -/// answer to the plus calculation of quadratic -static ld quadraticEquation_Plus(const ld a, const ld b, const ld c) -{ - return (-b + sqrt((b * b) - 4.0 * a * c)) / (2.0 * a); -} -/// -/// Quadratic equation only minus. -/// -/// a. -/// b. -/// c. -/// answer to minus calculation of quadratic -static ld quadraticEquation_minus(const ld a, const ld b, const ld c) -{ - return (-b - sqrt((b * b) - 4.0 * a * c)) / (2.0 * a); -} - -class Waves : - public Elasticity, Energy -{ -private: - static void countIncrease() { waves_objectCount += 1; } - static void countDecrease() { waves_objectCount -= 1; } -public: - Waves* _wavePtr; - /** - * @brief no argument constructor initiates the _wavePtr to nullptr - */ - Waves() - { - _wavePtr = nullptr; - countIncrease(); - } - - /** - * @brief copy constructor - */ - Waves(const Waves& t) - { - _wavePtr = t._wavePtr; - countIncrease(); - } - /** - * #brief move constructor - */ - Waves(Waves&& t) noexcept - { - _wavePtr = t._wavePtr; - countIncrease(); - } - /** - * @brief copy assignment operator - */ - Waves& operator=(const Waves& t) - { - if (this != &t) - { - _wavePtr = t._wavePtr; - countIncrease(); - } - return *this; - } - - static void show_objectCount() { std::cout << "\n waves object count: " - << waves_objectCount << std::endl; } - static int get_objectCount() { return waves_objectCount; } - - - /// - /// calculates the energy stored in a deformed system that obey's - /// Hook's law.\n PE_elastic = .5 * (k * pow(x, 2)) - /// - /// The force constant. - /// The displacement from equilibrium. - /// PE, stored potential energy - static ld potentialEnergy_Elastic(const ld k, const ld x) - { - return .5 * (k * pow(x, 2)); - } - - /// - /// Calculates the applied force on a system obeying hooks law.\n F_app = k * x - /// - /// The force constant. - /// The total displacement from the equilibrium. - /// Force, applied - static ld forceCompressSpring_hooksLaw(const ld k, const ld x) - { - return k * x; - } - - /// - /// calculates the restoring force.\n F_res = -k * x - /// - /// The force constant. - /// The total displacement from equilibrium. - /// Force, restoring - static ld forceRestoreSpring_hooksLaw(const ld k, const ld x) - { - return -k * x; - } - - /// - /// finds the length of a spring when at equilibrium - /// \n L = abs (((m * GA) + (k * l)) / k); - /// - /// The spring constant. - /// The mass. - /// The length. - /// length of spring at equilibrium - static ld equilibriumLength(const ld k, const ld m, const ld l) - { - return abs (((m * GA) + (k * l)) / k); - } - - /// - /// Calculates the spring force constant (k). - /// - /// The force being applied in newtons.\n - /// if you use F = ma, where a = 9.8m/s^2 due to gravity then be sure - /// to get total before or run full F=ma function as argument. - /// The displacement from equilibrium position. - /// force constant, k - static ld springConstant_hooksLaw(const ld F, const ld x) - { - return -(F / x); - } - - /// - /// Calculates the spring force constant (k) using the relationship of - /// KE = PE, 1/2mv^2 = 1/2kx^2, multiply both sides by 2/x^2 to end up with - /// spring constant k = mv^2/x^2 - /// - /// The mass. - /// The velocity. - /// The total compression distance. - /// spring constant (k) - static ld springConstant_velocity(const ld m, const ld v, const ld x) - { - return (m * (v * v)) / (x * x); - } - - /// - /// calculates the spring constant from two masses and two lengths - /// - /// The mass of weight 1. - /// The length weight 1 distorts spring. - /// The mass of weight 2. - /// The length weight 2 distorts the spring. - /// spring constant (k) - static ld springConstant_2masses(const ld m1, const ld l1, const ld m2, const ld l2) - { - return (_Ga_ * (m2 - m1)) / (l1 - l2); - } - - /// - /// Calculates the spring constant of object moving in simple - /// harmonic motion.\n k = (4.0 * (Pi_ * Pi_) * m) / (T * T) - /// - /// The mass in kg. - /// The period T. - /// spring constant (k) - static ld springConstant_harmonicMotion(const ld m, const ld T) - { - return (4.0 * (Pi_ * Pi_) * m) / (T * T); - } - - /// - /// calculates the spring constant using mass. - /// - /// The mass. - /// The distance spring compressed. - /// spring constant (k) - static ld springConstant_HangingMass(const ld m, const ld x) - { - return (-m * GA) / -x; - } - - /// - /// calculates the spring constant for each spring in a system of springs - /// - /// The spring constant total. - /// The total springs. - /// spring constant each spring - static ld springConstant_forEachSpring(const ld k, const ld numSprings) - { - return k / numSprings; - } - - /// - /// calculates teh mass of an object hanging vertically from a spring with - /// a know spring constant. - /// - /// The spring constant. - /// The displacement from equilibrium. - /// The acceleration, default is GA(9.8m/s^2). - /// mass in kg - static ld mass(const ld k, const ld x, const ld acl = GA) - { - return (-k * x) / acl; - } - - /// - /// Calculates the Mass the of a pendulum. - /// - /// The period T. - /// The spring force constant. - /// mass of the pendulum - static ld massOfPendulum(const ld T, const ld k) - { - return ((T * T) * k) / (4.0 * (Pi_ * Pi_)); - } - - /// - /// calculates the distance the marks are apart at a given mass interval. - /// - /// The spring constant. - /// The mass. - /// The acceleration from gravity, default GA(9.8). - /// distance m - static ld depressionDistanceMarksApart(const ld k, const ld m, const ld g = GA) - { - return (-m * g) / k; - } - - /// - /// calculates the projectile speed of a spring loaded gun. - /// - /// The elastic Potential Energy (J). - /// The mass of projectile (kg). - /// speed in m/s,converted from equivalent (J/kg)^.5 - static ld projectileSpeedSpringLoadedGun(const ld PEel, const ld m) - { - return pow((2.0 * PEel) / m, 1 / 2); - } - - /// - /// calculates the frequency for periodic motion which is the number - /// of oscillation per unit time. - /// - /// The period T. - /// Frequency (Hz); 1 cycle per sec; 1/s - static ld frequency(const ld T) - { - return 1.0 / T; - } - - /// - /// calculates the frequencies of a simple harmonic oscillator. - /// - /// The mass in kg. - /// The force constant. - /// frequency (Hz) - static ld frequency_simpleHarmonicOscillator(const ld m, const ld k) - { - return (1.0 / (2.0 * Pi_)) * sqrt(k / m); - } - - /// - /// calculates teh period T from the know frequency. - /// - /// The frequency in Hz. - /// time per period - static ld period(const ld f) - { - return 1.0 / f; - } - - /// - /// Calculates the period of a object moving in simple harmonic motion. - /// - /// The mass. - /// The spring constant. - /// period T - static ld period_simpleHarmonicOscillator(const ld m, const ld k) - { - return (2.0 * Pi_) * sqrt(m / k); - } - - /// - /// Calculates the displacements as a function of time(t). - /// - /// The Amplitude. - /// The total time. - /// The period T of the oscillation. - /// displacement - static ld displacement_functionOfTime(const ld X, const ld t, const ld T) - { - return X * cos(((2.0 * Pi_ * t) / T) * RADIAN); - } - - /// - /// When the block passes through the equilibrium position, all of the - /// spring's potential is now kinetic energy of the block. This may be - /// written as - /// kxi^2/2 = mv^2/2 - /// - /// The spring constant. - /// The mass. - /// The distance of compression or stretch from equilibrium. - /// velocity of a oscillator wave - static ld speedThroughEquilibrium_oscillatingMass(const ld k, const ld m, const ld x) - { - return (pow(k/m,.5) * x); - } - - /// - /// Calculates the velocities of a oscillator. - /// - /// The vMax. - /// The x. - /// The . - /// velocity of a oscillator wave - static ld velocity_oscillator(const ld vMax, const ld x, const ld X) - { - return vMax * sqrt(1.0 - ((x * x) / (X * X))); - } - - /// - /// Calculates the velocity as a function of time. - /// - /// The v maximum is a function of Amplitude and - /// period T. - /// The total time. - /// The period T. - /// velocity - static ld velocity_functionOfTime(const ld vMax, const ld t, const ld T) - { - return -vMax * sin(((2.0 * Pi_ * t) / T) * RADIAN); - } - - static ld velocity_T(const ld waveLength, const ld T) - { - return waveLength / T; - } - - static ld velocity_f(const ld waveLength, const ld f) - { - return waveLength * f; - } - - /// - /// calculates the velocity max. - /// - /// the amplitude - /// The spring constant. - /// The mass. - /// - static ld vMax(const ld A, const ld k, const ld m) - { - return sqrt((k / m)) * A; - } - - /// - /// calculates the velocity max using amplitude and period. - /// - /// a. - /// The t. - /// - static ld vMax(const ld A, const ld T) - { - return (2.0 * Pi_ * A) / T; - } - - /// - /// Calculates the velocities of a vibrating string. - /// - /// The force. - /// The mass. - /// The length. - /// speed of vibrating string - static ld velocityString(const ld F, const ld m, const ld L) - { - return sqrt(F / (m / L)); - } - - /// - /// calculates the velocities of a pendulum. - /// - /// The maximum. - /// The l. - /// The theta maximum. - /// - static ld velocity_pendulum(const ld wMax, const ld L, const ld thetaMax) - { - return sqrt((_Ga_) / (L)) * thetaMax; - } - - /// - /// Calculates the acceleration as a function of time. - /// - /// The force constant. - /// The amplitude. - /// The mass. - /// The time. - /// The period T. - /// acceleration - static ld acceleration_functionOfTime - (const ld k, const ld X, const ld m, const ld t, const ld T) - { - return -((k * X) / m) * cos(((2.0 * Pi_ * t) / T) * RADIAN); - } - - /// - /// Calculates the speed of a engine. - /// - /// sound every ___ revolutions of engine. - /// The freq hz, or pops per second sound. - /// The revolutions per kilometer. - /// how many cylinders are making sounds per - /// every se__r. - /// speed of car in km/s - static ld speedOfEngine(const ld se__r, const ld freqHz, const ld revPerK, const ld cylinders) - { - return (1.0 / revPerK) - * (freqHz / 1.0) - * (se__r / 1.0) - * (1.0 / cylinders); - } - - /// - /// calculates the mass to add to a spring to change from one period T1 - /// to period T2.\n m2 = m1 * (pow(T2 / T1, 2.0) - 1.0) - /// - /// The initial mass. - /// The initial period T. - /// The new period we are calculating the mass for - /// The add mass to the spring - static ld massToAddToSpringToChangePeriod(const ld m1, const ld T1, const ld T2) - { - return m1 * (pow(T2 / T1, 2.0) - 1.0); - } - - /// - /// Calculates by how much leeway there would be in the selection of - /// the masses added to a spring oscillating if you did not wish the new - /// period to be greater than Tu in s or less than Tl in s. - /// \n massLeeway = (m1 / (T1 * T1)) * ((Tu * Tu) - (Tl * Tl)) - /// - /// The mass initially. - /// The period T initially. - /// The period T upper limit. - /// The period T lower limit. - /// the leeway in mass to keep within limits - static ld differenceBetweenUpperLowerMasses(const ld m1, const ld T1, const ld Tu, const ld Tl) - { - return (m1 / (T1 * T1)) * ((Tu * Tu) - (Tl * Tl)); - } - - /// - /// calculates the amplitudes of oscillations.\n A =(m * g) / k - /// - /// The mass. - /// The spring constant. - /// acceleration from gravity, default is GA(9.8). - /// amplitude (A) - static ld amplitudeOfOscillation(const ld m, const ld k, const ld g = GA) - { - return (m * g) / k; - } - - /// - /// A diver on a diving board is undergoing simple harmonic motion. - /// Her mass is m1 kg and the period of her motion is T1 s. - /// The next diver is a male whose period of simple harmonic oscillation - /// is T2 s. What is his mass if the mass of the board is negligible? - /// \n m2 = pow((T2 / T1), 2.0) * m1 - /// - /// The female diver mass. - /// The period of her harmonic motion. - /// The period of his harmonic motion. - /// the male divers mass - static ld massDiver2(const ld m1, const ld T1, const ld T2) - { - return pow((T2 / T1), 2.0) * m1; - } - - /// - /// Suppose a diving board with no one on it bounces up and down in a - /// simple harmonic motion with a frequency of f1. The board has an - /// effective mass of m1 kg. What is the frequency of the simple harmonic - /// motion of a m2-kg diver on the board? - /// \n f2 = f1 * sqrt(m1 / (m1 + m2)) - /// - /// The frequency initially. - /// The mass of board. - /// The mass of diver. - /// frequency of simple harmonic motion - static ld frequency2_harmonicMotion(const ld f1, const ld m1, const ld m2) - { - return f1 * sqrt(m1 / (m1 + m2)); - } - - /// - /// A skydiver of mass m1 is hanging from a parachute bounces up and down - /// with a period of T1 s. What is the new period T2 of oscillation when a - /// second skydiver, whose mass is m2, hangs from the legs of the first. - /// \n T2 = T1 * sqrt((m1 + m2) / m1) - /// - /// The mass of first skydiver. - /// The period T with one skydiver. - /// The mass of the second skydiver. - /// the period T with both skydivers - static ld period_T2(const ld m1, const ld T1, const ld m2) - { - return T1 * sqrt((m1 + m2) / m1); - } - - /// - /// calculates the period T of a simple pendulum. for angles < 15 degrees - /// \n T = 2.0 * Pi_ * sqrt((L / GA)) - /// - /// The length of the pendulum. - /// the period T - static ld period_simplePendulum(const ld L) - { - return 2.0 * Pi_ * sqrt((L / GA)); - } - - /// - /// Calculates the length of a simple pendulum. - /// \n L = ((T * T) * g) / (4.0 * (Pi_ * Pi_)) - /// - /// The period T. - /// the acceleration due to gravity - /// length of the pendulum - static ld length_simplePendulum(const ld T, const ld g = GA) - { - return ((T * T) * g) / (4.0 * (Pi_ * Pi_)); - } - - /// - /// Calculates the Frequency of a simple pendulum. - /// \n f =(1.0 / (2.0 * Pi_)) * sqrt(GA / L) - /// - /// The length of pendulum. - /// frequency (Hz) - static ld frequency_simplePendulum(const ld L) - { - return (1.0 / (2.0 * Pi_)) * sqrt(_Ga_ / L); - } - - /// - /// calculates the periods T of system obeying hooks law. - /// - /// The mass. - /// The spring force constant. - /// the period T - static ld period_T(const ld m, const ld k) - { - return 2.0 * Pi_ * sqrt(m / k); - } - - /// - /// A pendulum that has a period of T1s and that is located where - /// the acceleration due to gravity is g1 m/s2 is moved to a location - /// where it the acceleration due to gravity is g2 m/s2. What is its - /// new period? - /// - /// The initial period T. - /// The gravity at location one. - /// The gravity at location two. - /// period T of pendulum at second location - static ld period_T2_pendulum_gravityChange(const ld T1, const ld g1, const ld g2) - { - return T1 * sqrt(g1 / g2); - } - - /// - /// A pendulum with a period of T1 s in one location with acceleration due - /// to gravity g1 and is moved to a new location where the period is now - /// T2. What is the acceleration due to gravity at its new location? - /// - /// The initial period T. - /// The gravity at initial location. - /// The period T of the new location. - /// the acceleration due to gravity - static ld gravity_pendulum(const ld T1, const ld g1, const ld T2) - { - return g1 * pow(T1 / T2, 2); - } - - /// - /// Ropes the stretch. - /// - /// The k. - /// The m. - /// The dist fall. - /// - static ld ropeStretch(const ld k, const ld m, const ld distFall) - { - ld a = .5 * k; - cout << "a: " << a << endl; - ld b = -m * GA; - cout << "b: " << b << endl; - ld c = distFall * b; - cout << "c: " << c << endl; - - return quadraticEquation_Plus(a, b, c); - } - - /// - /// calculates the intensity. - /// - /// The power(work/time). - /// amplitude. - /// - static ld intensity(const ld P, const ld A) - { - return P / A; - } - - /// - /// calculates the wavelength. - /// - /// The velocity. - /// The period T. - /// wavelength - static ld wavelength_T(const ld v, const ld T) - { - return v * T; - } - - /// - /// calculates the wavelength - /// - /// The wave velocity. - /// The frequency. - /// wavelength - static ld wavelength_f(const ld v, const ld f) - { - return v/f; - } - - /// - /// calculates the total energy caused by a wave of intensity I, over an - /// area of A, for a time of t - /// - /// The Intensity. - /// the area the wave is acting on. - /// The time of measurement. - /// Energy of wave in joules - static ld energyWave(const ld I, const ld A, const ld t) - { - return I * A * t; - } - - - /// - /// Times the between waves. - /// - /// The v w. - /// The lamda. - /// - static ld timeBetweenWaves(const ld v_w, const ld lamda) - { - return lamda / v_w; - } - - - ~Waves() - { - delete _wavePtr; - } - -}; -#endif //PHYSICSFORMULA_WAVES_H +// +// Created by Ryan.Zurrin001 on 12/16/2021. +// + +#ifndef PHYSICSFORMULA_WAVES_H +#define PHYSICSFORMULA_WAVES_H +#define GA 9.81 // gravitational acceleration in m/s^2 +#include +#include "Elasticity.h" +#include "Energy.h" +#include "FluidDynamics.h" +//α=224,ß=225,π=227,Σ=228,σ=229,µ=230,τ=231,Φ=232,Θ=233 +//Ω=234,δ=235,∞=236,φ=237,ε=238,∩=239,≡=240,Γ=226,γ, σ, ϑ, Å, Ώ, λ, γ +/** + * @class Waves + * @details class of static methods that relate to chapter 16 of the open-stax + * college physics text book. + * @author Ryan Zurrin + * dateBuilt 12/20/2020 + * lastEdit 12/26/2020 + */ + +static int waves_objectCount = 0; + +/// +/// Quadratics equation. +/// +/// a. +/// b. +/// c. +/// vector with the two results from calculation +static vector quadraticEquation(const ld a, const ld b, const ld c) +{ + vector result = { 0.0, 0.0 }; + result[0] = (-b - sqrt((b * b) - 4.0 * a * c)) / (2.0 * a); + result[1] = (-b + sqrt((b * b) - 4.0 * a * c)) / (2.0 * a); + return result; +} +/// +/// Quadratic equation only plus. +/// +/// a. +/// b. +/// c. +/// answer to the plus calculation of quadratic +static ld quadraticEquation_Plus(const ld a, const ld b, const ld c) +{ + return (-b + sqrt((b * b) - 4.0 * a * c)) / (2.0 * a); +} +/// +/// Quadratic equation only minus. +/// +/// a. +/// b. +/// c. +/// answer to minus calculation of quadratic +static ld quadraticEquation_minus(const ld a, const ld b, const ld c) +{ + return (-b - sqrt((b * b) - 4.0 * a * c)) / (2.0 * a); +} + +class Waves : + public Elasticity, Energy +{ +private: + static void countIncrease() { waves_objectCount += 1; } + static void countDecrease() { waves_objectCount -= 1; } +public: + Waves* _wavePtr; + /** + * @brief no argument constructor initiates the _wavePtr to nullptr + */ + Waves() + { + _wavePtr = nullptr; + countIncrease(); + } + + /** + * @brief copy constructor + */ + Waves(const Waves& t) + { + _wavePtr = t._wavePtr; + countIncrease(); + } + /** + * #brief move constructor + */ + Waves(Waves&& t) noexcept + { + _wavePtr = t._wavePtr; + countIncrease(); + } + /** + * @brief copy assignment operator + */ + Waves& operator=(const Waves& t) + { + if (this != &t) + { + _wavePtr = t._wavePtr; + countIncrease(); + } + return *this; + } + + static void show_objectCount() { std::cout << "\n waves object count: " + << waves_objectCount << std::endl; } + static int get_objectCount() { return waves_objectCount; } + + + /// + /// calculates the energy stored in a deformed system that obey's + /// Hook's law.\n PE_elastic = .5 * (k * pow(x, 2)) + /// + /// The force constant. + /// The displacement from equilibrium. + /// PE, stored potential energy + static ld potentialEnergy_Elastic(const ld k, const ld x) + { + return .5 * (k * pow(x, 2)); + } + + /// + /// Calculates the applied force on a system obeying hooks law.\n F_app = k * x + /// + /// The force constant. + /// The total displacement from the equilibrium. + /// Force, applied + static ld forceCompressSpring_hooksLaw(const ld k, const ld x) + { + return k * x; + } + + /// + /// calculates the restoring force.\n F_res = -k * x + /// + /// The force constant. + /// The total displacement from equilibrium. + /// Force, restoring + static ld forceRestoreSpring_hooksLaw(const ld k, const ld x) + { + return -k * x; + } + + /// + /// finds the length of a spring when at equilibrium + /// \n L = abs (((m * GA) + (k * l)) / k); + /// + /// The spring constant. + /// The mass. + /// The length. + /// length of spring at equilibrium + static ld equilibriumLength(const ld k, const ld m, const ld l) + { + return abs (((m * GA) + (k * l)) / k); + } + + /// + /// Calculates the spring force constant (k). + /// + /// The force being applied in newtons.\n + /// if you use F = ma, where a = 9.8m/s^2 due to gravity then be sure + /// to get total before or run full F=ma function as argument. + /// The displacement from equilibrium position. + /// force constant, k + static ld springConstant_hooksLaw(const ld F, const ld x) + { + return -(F / x); + } + + /// + /// Calculates the spring force constant (k) using the relationship of + /// KE = PE, 1/2mv^2 = 1/2kx^2, multiply both sides by 2/x^2 to end up with + /// spring constant k = mv^2/x^2 + /// + /// The mass. + /// The velocity. + /// The total compression distance. + /// spring constant (k) + static ld springConstant_velocity(const ld m, const ld v, const ld x) + { + return (m * (v * v)) / (x * x); + } + + /// + /// calculates the spring constant from two masses and two lengths + /// + /// The mass of weight 1. + /// The length weight 1 distorts spring. + /// The mass of weight 2. + /// The length weight 2 distorts the spring. + /// spring constant (k) + static ld springConstant_2masses(const ld m1, const ld l1, const ld m2, const ld l2) + { + return (_Ga_ * (m2 - m1)) / (l1 - l2); + } + + /// + /// Calculates the spring constant of object moving in simple + /// harmonic motion.\n k = (4.0 * (Pi_ * Pi_) * m) / (T * T) + /// + /// The mass in kg. + /// The period T. + /// spring constant (k) + static ld springConstant_harmonicMotion(const ld m, const ld T) + { + return (4.0 * (Pi_ * Pi_) * m) / (T * T); + } + + /// + /// calculates the spring constant using mass. + /// + /// The mass. + /// The distance spring compressed. + /// spring constant (k) + static ld springConstant_HangingMass(const ld m, const ld x) + { + return (-m * GA) / -x; + } + + /// + /// calculates the spring constant for each spring in a system of springs + /// + /// The spring constant total. + /// The total springs. + /// spring constant each spring + static ld springConstant_forEachSpring(const ld k, const ld numSprings) + { + return k / numSprings; + } + + /// + /// calculates teh mass of an object hanging vertically from a spring with + /// a know spring constant. + /// + /// The spring constant. + /// The displacement from equilibrium. + /// The acceleration, default is GA(9.8m/s^2). + /// mass in kg + static ld mass(const ld k, const ld x, const ld acl = GA) + { + return (-k * x) / acl; + } + + /// + /// Calculates the Mass the of a pendulum. + /// + /// The period T. + /// The spring force constant. + /// mass of the pendulum + static ld massOfPendulum(const ld T, const ld k) + { + return ((T * T) * k) / (4.0 * (Pi_ * Pi_)); + } + + /// + /// calculates the distance the marks are apart at a given mass interval. + /// + /// The spring constant. + /// The mass. + /// The acceleration from gravity, default GA(9.8). + /// distance m + static ld depressionDistanceMarksApart(const ld k, const ld m, const ld g = GA) + { + return (-m * g) / k; + } + + /// + /// calculates the projectile speed of a spring loaded gun. + /// + /// The elastic Potential Energy (J). + /// The mass of projectile (kg). + /// speed in m/s,converted from equivalent (J/kg)^.5 + static ld projectileSpeedSpringLoadedGun(const ld PEel, const ld m) + { + return pow((2.0 * PEel) / m, 1 / 2); + } + + /// + /// calculates the frequency for periodic motion which is the number + /// of oscillation per unit time. + /// + /// The period T. + /// Frequency (Hz); 1 cycle per sec; 1/s + static ld frequency(const ld T) + { + return 1.0 / T; + } + + /// + /// calculates the frequencies of a simple harmonic oscillator. + /// + /// The mass in kg. + /// The force constant. + /// frequency (Hz) + static ld frequency_simpleHarmonicOscillator(const ld m, const ld k) + { + return (1.0 / (2.0 * Pi_)) * sqrt(k / m); + } + + /// + /// calculates teh period T from the know frequency. + /// + /// The frequency in Hz. + /// time per period + static ld period(const ld f) + { + return 1.0 / f; + } + + /// + /// Calculates the period of a object moving in simple harmonic motion. + /// + /// The mass. + /// The spring constant. + /// period T + static ld period_simpleHarmonicOscillator(const ld m, const ld k) + { + return (2.0 * Pi_) * sqrt(m / k); + } + + /// + /// Calculates the displacements as a function of time(t). + /// + /// The Amplitude. + /// The total time. + /// The period T of the oscillation. + /// displacement + static ld displacement_functionOfTime(const ld X, const ld t, const ld T) + { + return X * cos(((2.0 * Pi_ * t) / T) * RADIAN); + } + + /// + /// When the block passes through the equilibrium position, all of the + /// spring's potential is now kinetic energy of the block. This may be + /// written as + /// kxi^2/2 = mv^2/2 + /// + /// The spring constant. + /// The mass. + /// The distance of compression or stretch from equilibrium. + /// velocity of a oscillator wave + static ld speedThroughEquilibrium_oscillatingMass(const ld k, const ld m, const ld x) + { + return (pow(k/m,.5) * x); + } + + /// + /// Calculates the velocities of a oscillator. + /// + /// The vMax. + /// The x. + /// The . + /// velocity of a oscillator wave + static ld velocity_oscillator(const ld vMax, const ld x, const ld X) + { + return vMax * sqrt(1.0 - ((x * x) / (X * X))); + } + + /// + /// Calculates the velocity as a function of time. + /// + /// The v maximum is a function of Amplitude and + /// period T. + /// The total time. + /// The period T. + /// velocity + static ld velocity_functionOfTime(const ld vMax, const ld t, const ld T) + { + return -vMax * sin(((2.0 * Pi_ * t) / T) * RADIAN); + } + + static ld velocity_T(const ld waveLength, const ld T) + { + return waveLength / T; + } + + static ld velocity_f(const ld waveLength, const ld f) + { + return waveLength * f; + } + + /// + /// calculates the velocity max. + /// + /// the amplitude + /// The spring constant. + /// The mass. + /// + static ld vMax(const ld A, const ld k, const ld m) + { + return sqrt((k / m)) * A; + } + + /// + /// calculates the velocity max using amplitude and period. + /// + /// a. + /// The t. + /// + static ld vMax(const ld A, const ld T) + { + return (2.0 * Pi_ * A) / T; + } + + /// + /// Calculates the velocities of a vibrating string. + /// + /// The force. + /// The mass. + /// The length. + /// speed of vibrating string + static ld velocityString(const ld F, const ld m, const ld L) + { + return sqrt(F / (m / L)); + } + + /// + /// calculates the velocities of a pendulum. + /// + /// The maximum. + /// The l. + /// The theta maximum. + /// + static ld velocity_pendulum(const ld wMax, const ld L, const ld thetaMax) + { + return sqrt((_Ga_) / (L)) * thetaMax; + } + + /// + /// Calculates the acceleration as a function of time. + /// + /// The force constant. + /// The amplitude. + /// The mass. + /// The time. + /// The period T. + /// acceleration + static ld acceleration_functionOfTime + (const ld k, const ld X, const ld m, const ld t, const ld T) + { + return -((k * X) / m) * cos(((2.0 * Pi_ * t) / T) * RADIAN); + } + + /// + /// Calculates the speed of a engine. + /// + /// sound every ___ revolutions of engine. + /// The freq hz, or pops per second sound. + /// The revolutions per kilometer. + /// how many cylinders are making sounds per + /// every se__r. + /// speed of car in km/s + static ld speedOfEngine(const ld se__r, const ld freqHz, const ld revPerK, const ld cylinders) + { + return (1.0 / revPerK) + * (freqHz / 1.0) + * (se__r / 1.0) + * (1.0 / cylinders); + } + + /// + /// calculates the mass to add to a spring to change from one period T1 + /// to period T2.\n m2 = m1 * (pow(T2 / T1, 2.0) - 1.0) + /// + /// The initial mass. + /// The initial period T. + /// The new period we are calculating the mass for + /// The add mass to the spring + static ld massToAddToSpringToChangePeriod(const ld m1, const ld T1, const ld T2) + { + return m1 * (pow(T2 / T1, 2.0) - 1.0); + } + + /// + /// Calculates by how much leeway there would be in the selection of + /// the masses added to a spring oscillating if you did not wish the new + /// period to be greater than Tu in s or less than Tl in s. + /// \n massLeeway = (m1 / (T1 * T1)) * ((Tu * Tu) - (Tl * Tl)) + /// + /// The mass initially. + /// The period T initially. + /// The period T upper limit. + /// The period T lower limit. + /// the leeway in mass to keep within limits + static ld differenceBetweenUpperLowerMasses(const ld m1, const ld T1, const ld Tu, const ld Tl) + { + return (m1 / (T1 * T1)) * ((Tu * Tu) - (Tl * Tl)); + } + + /// + /// calculates the amplitudes of oscillations.\n A =(m * g) / k + /// + /// The mass. + /// The spring constant. + /// acceleration from gravity, default is GA(9.8). + /// amplitude (A) + static ld amplitudeOfOscillation(const ld m, const ld k, const ld g = GA) + { + return (m * g) / k; + } + + /// + /// A diver on a diving board is undergoing simple harmonic motion. + /// Her mass is m1 kg and the period of her motion is T1 s. + /// The next diver is a male whose period of simple harmonic oscillation + /// is T2 s. What is his mass if the mass of the board is negligible? + /// \n m2 = pow((T2 / T1), 2.0) * m1 + /// + /// The female diver mass. + /// The period of her harmonic motion. + /// The period of his harmonic motion. + /// the male divers mass + static ld massDiver2(const ld m1, const ld T1, const ld T2) + { + return pow((T2 / T1), 2.0) * m1; + } + + /// + /// Suppose a diving board with no one on it bounces up and down in a + /// simple harmonic motion with a frequency of f1. The board has an + /// effective mass of m1 kg. What is the frequency of the simple harmonic + /// motion of a m2-kg diver on the board? + /// \n f2 = f1 * sqrt(m1 / (m1 + m2)) + /// + /// The frequency initially. + /// The mass of board. + /// The mass of diver. + /// frequency of simple harmonic motion + static ld frequency2_harmonicMotion(const ld f1, const ld m1, const ld m2) + { + return f1 * sqrt(m1 / (m1 + m2)); + } + + /// + /// A skydiver of mass m1 is hanging from a parachute bounces up and down + /// with a period of T1 s. What is the new period T2 of oscillation when a + /// second skydiver, whose mass is m2, hangs from the legs of the first. + /// \n T2 = T1 * sqrt((m1 + m2) / m1) + /// + /// The mass of first skydiver. + /// The period T with one skydiver. + /// The mass of the second skydiver. + /// the period T with both skydivers + static ld period_T2(const ld m1, const ld T1, const ld m2) + { + return T1 * sqrt((m1 + m2) / m1); + } + + /// + /// calculates the period T of a simple pendulum. for angles < 15 degrees + /// \n T = 2.0 * Pi_ * sqrt((L / GA)) + /// + /// The length of the pendulum. + /// the period T + static ld period_simplePendulum(const ld L) + { + return 2.0 * Pi_ * sqrt((L / GA)); + } + + /// + /// Calculates the length of a simple pendulum. + /// \n L = ((T * T) * g) / (4.0 * (Pi_ * Pi_)) + /// + /// The period T. + /// the acceleration due to gravity + /// length of the pendulum + static ld length_simplePendulum(const ld T, const ld g = GA) + { + return ((T * T) * g) / (4.0 * (Pi_ * Pi_)); + } + + /// + /// Calculates the Frequency of a simple pendulum. + /// \n f =(1.0 / (2.0 * Pi_)) * sqrt(GA / L) + /// + /// The length of pendulum. + /// frequency (Hz) + static ld frequency_simplePendulum(const ld L) + { + return (1.0 / (2.0 * Pi_)) * sqrt(_Ga_ / L); + } + + /// + /// calculates the periods T of system obeying hooks law. + /// + /// The mass. + /// The spring force constant. + /// the period T + static ld period_T(const ld m, const ld k) + { + return 2.0 * Pi_ * sqrt(m / k); + } + + /// + /// A pendulum that has a period of T1s and that is located where + /// the acceleration due to gravity is g1 m/s2 is moved to a location + /// where it the acceleration due to gravity is g2 m/s2. What is its + /// new period? + /// + /// The initial period T. + /// The gravity at location one. + /// The gravity at location two. + /// period T of pendulum at second location + static ld period_T2_pendulum_gravityChange(const ld T1, const ld g1, const ld g2) + { + return T1 * sqrt(g1 / g2); + } + + /// + /// A pendulum with a period of T1 s in one location with acceleration due + /// to gravity g1 and is moved to a new location where the period is now + /// T2. What is the acceleration due to gravity at its new location? + /// + /// The initial period T. + /// The gravity at initial location. + /// The period T of the new location. + /// the acceleration due to gravity + static ld gravity_pendulum(const ld T1, const ld g1, const ld T2) + { + return g1 * pow(T1 / T2, 2); + } + + /// + /// Ropes the stretch. + /// + /// The k. + /// The m. + /// The dist fall. + /// + static ld ropeStretch(const ld k, const ld m, const ld distFall) + { + ld a = .5 * k; + cout << "a: " << a << endl; + ld b = -m * GA; + cout << "b: " << b << endl; + ld c = distFall * b; + cout << "c: " << c << endl; + + return quadraticEquation_Plus(a, b, c); + } + + /// + /// calculates the intensity. + /// + /// The power(work/time). + /// amplitude. + /// + static ld intensity(const ld P, const ld A) + { + return P / A; + } + + /// + /// calculates the wavelength. + /// + /// The velocity. + /// The period T. + /// wavelength + static ld wavelength_T(const ld v, const ld T) + { + return v * T; + } + + /// + /// calculates the wavelength + /// + /// The wave velocity. + /// The frequency. + /// wavelength + static ld wavelength_f(const ld v, const ld f) + { + return v/f; + } + + /// + /// calculates the total energy caused by a wave of intensity I, over an + /// area of A, for a time of t + /// + /// The Intensity. + /// the area the wave is acting on. + /// The time of measurement. + /// Energy of wave in joules + static ld energyWave(const ld I, const ld A, const ld t) + { + return I * A * t; + } + + + /// + /// Times the between waves. + /// + /// The v w. + /// The lamda. + /// + static ld timeBetweenWaves(const ld v_w, const ld lamda) + { + return lamda / v_w; + } + + + ~Waves() + { + delete _wavePtr; + } + +}; +#endif //PHYSICSFORMULA_WAVES_H diff --git a/cmake-build-debug-wsl/CMakeCache.txt b/cmake-build-debug-wsl/CMakeCache.txt new file mode 100644 index 0000000..a7feebf --- /dev/null +++ b/cmake-build-debug-wsl/CMakeCache.txt @@ -0,0 +1,395 @@ +# This is the CMakeCache file. +# For build in directory: /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl +# It was generated by CMake: /usr/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/usr/bin/addr2line + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Debug + +//Id string of the compiler for the CodeBlocks IDE. Automatically +// detected when left empty +CMAKE_CODEBLOCKS_COMPILER_ID:STRING= + +//The CodeBlocks executable +CMAKE_CODEBLOCKS_EXECUTABLE:FILEPATH=CMAKE_CODEBLOCKS_EXECUTABLE-NOTFOUND + +//Additional command line arguments when CodeBlocks invokes make. +// Enter e.g. -j to get parallel builds +CMAKE_CODEBLOCKS_MAKE_ARGUMENTS:STRING=-j6 + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler +CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ + +//A wrapper around 'ar' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_CXX_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar-9 + +//A wrapper around 'ranlib' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib-9 + +//Flags used by the CXX compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the CXX compiler during DEBUG builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the CXX compiler during RELEASE builds. +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//C compiler +CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc + +//A wrapper around 'ar' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_C_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar-9 + +//A wrapper around 'ranlib' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_C_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib-9 + +//Flags used by the C compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the C compiler during DEBUG builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the C compiler during RELEASE builds. +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND + +//Flags used by the linker during all build types. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make + +//Flags used by the linker during the creation of modules during +// all build types. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=PhysicsFormula + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/usr/bin/readelf + +//Flags used by the linker during the creation of shared libraries +// during all build types. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +PhysicsFormula_BINARY_DIR:STATIC=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl + +//Value Computed by CMake +PhysicsFormula_SOURCE_DIR:STATIC=/home/ryazur/src/PhysicsFormula + +//Path to a program. +ProcessorCount_cmd_nproc:FILEPATH=/usr/bin/nproc + +//Path to a program. +ProcessorCount_cmd_sysctl:FILEPATH=/usr/sbin/sysctl + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=16 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=3 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL=CodeBlocks +//CXX compiler system defined macros +CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS:INTERNAL=__STDC__;1;__STDC_VERSION__;201710L;__STDC_UTF_16__;1;__STDC_UTF_32__;1;__STDC_HOSTED__;1;__GNUC__;9;__GNUC_MINOR__;4;__GNUC_PATCHLEVEL__;0;__VERSION__;"9.4.0";__ATOMIC_RELAXED;0;__ATOMIC_SEQ_CST;5;__ATOMIC_ACQUIRE;2;__ATOMIC_RELEASE;3;__ATOMIC_ACQ_REL;4;__ATOMIC_CONSUME;1;__pic__;2;__PIC__;2;__pie__;2;__PIE__;2;__FINITE_MATH_ONLY__;0;_LP64;1;__LP64__;1;__SIZEOF_INT__;4;__SIZEOF_LONG__;8;__SIZEOF_LONG_LONG__;8;__SIZEOF_SHORT__;2;__SIZEOF_FLOAT__;4;__SIZEOF_DOUBLE__;8;__SIZEOF_LONG_DOUBLE__;16;__SIZEOF_SIZE_T__;8;__CHAR_BIT__;8;__BIGGEST_ALIGNMENT__;16;__ORDER_LITTLE_ENDIAN__;1234;__ORDER_BIG_ENDIAN__;4321;__ORDER_PDP_ENDIAN__;3412;__BYTE_ORDER__;__ORDER_LITTLE_ENDIAN__;__FLOAT_WORD_ORDER__;__ORDER_LITTLE_ENDIAN__;__SIZEOF_POINTER__;8;__SIZE_TYPE__;long unsigned int;__PTRDIFF_TYPE__;long int;__WCHAR_TYPE__;int;__WINT_TYPE__;unsigned int;__INTMAX_TYPE__;long int;__UINTMAX_TYPE__;long unsigned int;__CHAR16_TYPE__;short unsigned int;__CHAR32_TYPE__;unsigned int;__SIG_ATOMIC_TYPE__;int;__INT8_TYPE__;signed char;__INT16_TYPE__;short int;__INT32_TYPE__;int;__INT64_TYPE__;long int;__UINT8_TYPE__;unsigned char;__UINT16_TYPE__;short unsigned int;__UINT32_TYPE__;unsigned int;__UINT64_TYPE__;long unsigned int;__INT_LEAST8_TYPE__;signed char;__INT_LEAST16_TYPE__;short int;__INT_LEAST32_TYPE__;int;__INT_LEAST64_TYPE__;long int;__UINT_LEAST8_TYPE__;unsigned char;__UINT_LEAST16_TYPE__;short unsigned int;__UINT_LEAST32_TYPE__;unsigned int;__UINT_LEAST64_TYPE__;long unsigned int;__INT_FAST8_TYPE__;signed char;__INT_FAST16_TYPE__;long int;__INT_FAST32_TYPE__;long int;__INT_FAST64_TYPE__;long int;__UINT_FAST8_TYPE__;unsigned char;__UINT_FAST16_TYPE__;long unsigned int;__UINT_FAST32_TYPE__;long unsigned int;__UINT_FAST64_TYPE__;long unsigned int;__INTPTR_TYPE__;long int;__UINTPTR_TYPE__;long unsigned int;__has_include(STR);__has_include__(STR);__has_include_next(STR);__has_include_next__(STR);__GXX_ABI_VERSION;1013;__SCHAR_MAX__;0x7f;__SHRT_MAX__;0x7fff;__INT_MAX__;0x7fffffff;__LONG_MAX__;0x7fffffffffffffffL;__LONG_LONG_MAX__;0x7fffffffffffffffLL;__WCHAR_MAX__;0x7fffffff;__WCHAR_MIN__;(-__WCHAR_MAX__ - 1);__WINT_MAX__;0xffffffffU;__WINT_MIN__;0U;__PTRDIFF_MAX__;0x7fffffffffffffffL;__SIZE_MAX__;0xffffffffffffffffUL;__SCHAR_WIDTH__;8;__SHRT_WIDTH__;16;__INT_WIDTH__;32;__LONG_WIDTH__;64;__LONG_LONG_WIDTH__;64;__WCHAR_WIDTH__;32;__WINT_WIDTH__;32;__PTRDIFF_WIDTH__;64;__SIZE_WIDTH__;64;__INTMAX_MAX__;0x7fffffffffffffffL;__INTMAX_C(c);c ## L;__UINTMAX_MAX__;0xffffffffffffffffUL;__UINTMAX_C(c);c ## UL;__INTMAX_WIDTH__;64;__SIG_ATOMIC_MAX__;0x7fffffff;__SIG_ATOMIC_MIN__;(-__SIG_ATOMIC_MAX__ - 1);__SIG_ATOMIC_WIDTH__;32;__INT8_MAX__;0x7f;__INT16_MAX__;0x7fff;__INT32_MAX__;0x7fffffff;__INT64_MAX__;0x7fffffffffffffffL;__UINT8_MAX__;0xff;__UINT16_MAX__;0xffff;__UINT32_MAX__;0xffffffffU;__UINT64_MAX__;0xffffffffffffffffUL;__INT_LEAST8_MAX__;0x7f;__INT8_C(c);c;__INT_LEAST8_WIDTH__;8;__INT_LEAST16_MAX__;0x7fff;__INT16_C(c);c;__INT_LEAST16_WIDTH__;16;__INT_LEAST32_MAX__;0x7fffffff;__INT32_C(c);c;__INT_LEAST32_WIDTH__;32;__INT_LEAST64_MAX__;0x7fffffffffffffffL;__INT64_C(c);c ## L;__INT_LEAST64_WIDTH__;64;__UINT_LEAST8_MAX__;0xff;__UINT8_C(c);c;__UINT_LEAST16_MAX__;0xffff;__UINT16_C(c);c;__UINT_LEAST32_MAX__;0xffffffffU;__UINT32_C(c);c ## U;__UINT_LEAST64_MAX__;0xffffffffffffffffUL;__UINT64_C(c);c ## UL;__INT_FAST8_MAX__;0x7f;__INT_FAST8_WIDTH__;8;__INT_FAST16_MAX__;0x7fffffffffffffffL;__INT_FAST16_WIDTH__;64;__INT_FAST32_MAX__;0x7fffffffffffffffL;__INT_FAST32_WIDTH__;64;__INT_FAST64_MAX__;0x7fffffffffffffffL;__INT_FAST64_WIDTH__;64;__UINT_FAST8_MAX__;0xff;__UINT_FAST16_MAX__;0xffffffffffffffffUL;__UINT_FAST32_MAX__;0xffffffffffffffffUL;__UINT_FAST64_MAX__;0xffffffffffffffffUL;__INTPTR_MAX__;0x7fffffffffffffffL;__INTPTR_WIDTH__;64;__UINTPTR_MAX__;0xffffffffffffffffUL;__GCC_IEC_559;2;__GCC_IEC_559_COMPLEX;2;__FLT_EVAL_METHOD__;0;__FLT_EVAL_METHOD_TS_18661_3__;0;__DEC_EVAL_METHOD__;2;__FLT_RADIX__;2;__FLT_MANT_DIG__;24;__FLT_DIG__;6;__FLT_MIN_EXP__;(-125);__FLT_MIN_10_EXP__;(-37);__FLT_MAX_EXP__;128;__FLT_MAX_10_EXP__;38;__FLT_DECIMAL_DIG__;9;__FLT_MAX__;3.40282346638528859811704183484516925e+38F;__FLT_MIN__;1.17549435082228750796873653722224568e-38F;__FLT_EPSILON__;1.19209289550781250000000000000000000e-7F;__FLT_DENORM_MIN__;1.40129846432481707092372958328991613e-45F;__FLT_HAS_DENORM__;1;__FLT_HAS_INFINITY__;1;__FLT_HAS_QUIET_NAN__;1;__DBL_MANT_DIG__;53;__DBL_DIG__;15;__DBL_MIN_EXP__;(-1021);__DBL_MIN_10_EXP__;(-307);__DBL_MAX_EXP__;1024;__DBL_MAX_10_EXP__;308;__DBL_DECIMAL_DIG__;17;__DBL_MAX__;((double)1.79769313486231570814527423731704357e+308L);__DBL_MIN__;((double)2.22507385850720138309023271733240406e-308L);__DBL_EPSILON__;((double)2.22044604925031308084726333618164062e-16L);__DBL_DENORM_MIN__;((double)4.94065645841246544176568792868221372e-324L);__DBL_HAS_DENORM__;1;__DBL_HAS_INFINITY__;1;__DBL_HAS_QUIET_NAN__;1;__LDBL_MANT_DIG__;64;__LDBL_DIG__;18;__LDBL_MIN_EXP__;(-16381);__LDBL_MIN_10_EXP__;(-4931);__LDBL_MAX_EXP__;16384;__LDBL_MAX_10_EXP__;4932;__DECIMAL_DIG__;21;__LDBL_DECIMAL_DIG__;21;__LDBL_MAX__;1.18973149535723176502126385303097021e+4932L;__LDBL_MIN__;3.36210314311209350626267781732175260e-4932L;__LDBL_EPSILON__;1.08420217248550443400745280086994171e-19L;__LDBL_DENORM_MIN__;3.64519953188247460252840593361941982e-4951L;__LDBL_HAS_DENORM__;1;__LDBL_HAS_INFINITY__;1;__LDBL_HAS_QUIET_NAN__;1;__FLT32_MANT_DIG__;24;__FLT32_DIG__;6;__FLT32_MIN_EXP__;(-125);__FLT32_MIN_10_EXP__;(-37);__FLT32_MAX_EXP__;128;__FLT32_MAX_10_EXP__;38;__FLT32_DECIMAL_DIG__;9;__FLT32_MAX__;3.40282346638528859811704183484516925e+38F32;__FLT32_MIN__;1.17549435082228750796873653722224568e-38F32;__FLT32_EPSILON__;1.19209289550781250000000000000000000e-7F32;__FLT32_DENORM_MIN__;1.40129846432481707092372958328991613e-45F32;__FLT32_HAS_DENORM__;1;__FLT32_HAS_INFINITY__;1;__FLT32_HAS_QUIET_NAN__;1;__FLT64_MANT_DIG__;53;__FLT64_DIG__;15;__FLT64_MIN_EXP__;(-1021);__FLT64_MIN_10_EXP__;(-307);__FLT64_MAX_EXP__;1024;__FLT64_MAX_10_EXP__;308;__FLT64_DECIMAL_DIG__;17;__FLT64_MAX__;1.79769313486231570814527423731704357e+308F64;__FLT64_MIN__;2.22507385850720138309023271733240406e-308F64;__FLT64_EPSILON__;2.22044604925031308084726333618164062e-16F64;__FLT64_DENORM_MIN__;4.94065645841246544176568792868221372e-324F64;__FLT64_HAS_DENORM__;1;__FLT64_HAS_INFINITY__;1;__FLT64_HAS_QUIET_NAN__;1;__FLT128_MANT_DIG__;113;__FLT128_DIG__;33;__FLT128_MIN_EXP__;(-16381);__FLT128_MIN_10_EXP__;(-4931);__FLT128_MAX_EXP__;16384;__FLT128_MAX_10_EXP__;4932;__FLT128_DECIMAL_DIG__;36;__FLT128_MAX__;1.18973149535723176508575932662800702e+4932F128;__FLT128_MIN__;3.36210314311209350626267781732175260e-4932F128;__FLT128_EPSILON__;1.92592994438723585305597794258492732e-34F128;__FLT128_DENORM_MIN__;6.47517511943802511092443895822764655e-4966F128;__FLT128_HAS_DENORM__;1;__FLT128_HAS_INFINITY__;1;__FLT128_HAS_QUIET_NAN__;1;__FLT32X_MANT_DIG__;53;__FLT32X_DIG__;15;__FLT32X_MIN_EXP__;(-1021);__FLT32X_MIN_10_EXP__;(-307);__FLT32X_MAX_EXP__;1024;__FLT32X_MAX_10_EXP__;308;__FLT32X_DECIMAL_DIG__;17;__FLT32X_MAX__;1.79769313486231570814527423731704357e+308F32x;__FLT32X_MIN__;2.22507385850720138309023271733240406e-308F32x;__FLT32X_EPSILON__;2.22044604925031308084726333618164062e-16F32x;__FLT32X_DENORM_MIN__;4.94065645841246544176568792868221372e-324F32x;__FLT32X_HAS_DENORM__;1;__FLT32X_HAS_INFINITY__;1;__FLT32X_HAS_QUIET_NAN__;1;__FLT64X_MANT_DIG__;64;__FLT64X_DIG__;18;__FLT64X_MIN_EXP__;(-16381);__FLT64X_MIN_10_EXP__;(-4931);__FLT64X_MAX_EXP__;16384;__FLT64X_MAX_10_EXP__;4932;__FLT64X_DECIMAL_DIG__;21;__FLT64X_MAX__;1.18973149535723176502126385303097021e+4932F64x;__FLT64X_MIN__;3.36210314311209350626267781732175260e-4932F64x;__FLT64X_EPSILON__;1.08420217248550443400745280086994171e-19F64x;__FLT64X_DENORM_MIN__;3.64519953188247460252840593361941982e-4951F64x;__FLT64X_HAS_DENORM__;1;__FLT64X_HAS_INFINITY__;1;__FLT64X_HAS_QUIET_NAN__;1;__DEC32_MANT_DIG__;7;__DEC32_MIN_EXP__;(-94);__DEC32_MAX_EXP__;97;__DEC32_MIN__;1E-95DF;__DEC32_MAX__;9.999999E96DF;__DEC32_EPSILON__;1E-6DF;__DEC32_SUBNORMAL_MIN__;0.000001E-95DF;__DEC64_MANT_DIG__;16;__DEC64_MIN_EXP__;(-382);__DEC64_MAX_EXP__;385;__DEC64_MIN__;1E-383DD;__DEC64_MAX__;9.999999999999999E384DD;__DEC64_EPSILON__;1E-15DD;__DEC64_SUBNORMAL_MIN__;0.000000000000001E-383DD;__DEC128_MANT_DIG__;34;__DEC128_MIN_EXP__;(-6142);__DEC128_MAX_EXP__;6145;__DEC128_MIN__;1E-6143DL;__DEC128_MAX__;9.999999999999999999999999999999999E6144DL;__DEC128_EPSILON__;1E-33DL;__DEC128_SUBNORMAL_MIN__;0.000000000000000000000000000000001E-6143DL;__REGISTER_PREFIX__; ;__USER_LABEL_PREFIX__; ;__GNUC_STDC_INLINE__;1;__NO_INLINE__;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8;1;__GCC_ATOMIC_BOOL_LOCK_FREE;2;__GCC_ATOMIC_CHAR_LOCK_FREE;2;__GCC_ATOMIC_CHAR16_T_LOCK_FREE;2;__GCC_ATOMIC_CHAR32_T_LOCK_FREE;2;__GCC_ATOMIC_WCHAR_T_LOCK_FREE;2;__GCC_ATOMIC_SHORT_LOCK_FREE;2;__GCC_ATOMIC_INT_LOCK_FREE;2;__GCC_ATOMIC_LONG_LOCK_FREE;2;__GCC_ATOMIC_LLONG_LOCK_FREE;2;__GCC_ATOMIC_TEST_AND_SET_TRUEVAL;1;__GCC_ATOMIC_POINTER_LOCK_FREE;2;__HAVE_SPECULATION_SAFE_VALUE;1;__GCC_HAVE_DWARF2_CFI_ASM;1;__PRAGMA_REDEFINE_EXTNAME;1;__SSP_STRONG__;3;__SIZEOF_INT128__;16;__SIZEOF_WCHAR_T__;4;__SIZEOF_WINT_T__;4;__SIZEOF_PTRDIFF_T__;8;__amd64;1;__amd64__;1;__x86_64;1;__x86_64__;1;__SIZEOF_FLOAT80__;16;__SIZEOF_FLOAT128__;16;__ATOMIC_HLE_ACQUIRE;65536;__ATOMIC_HLE_RELEASE;131072;__GCC_ASM_FLAG_OUTPUTS__;1;__k8;1;__k8__;1;__code_model_small__;1;__MMX__;1;__SSE__;1;__SSE2__;1;__FXSR__;1;__SSE_MATH__;1;__SSE2_MATH__;1;__SEG_FS;1;__SEG_GS;1;__CET__;3;__gnu_linux__;1;__linux;1;__linux__;1;linux;1;__unix;1;__unix__;1;unix;1;__ELF__;1;__DECIMAL_BID_FORMAT__;1;_STDC_PREDEF_H;1;__STDC_IEC_559__;1;__STDC_IEC_559_COMPLEX__;1;__STDC_ISO_10646__;201706L;__STDC__;1;__cplusplus;201402L;__STDC_UTF_16__;1;__STDC_UTF_32__;1;__STDC_HOSTED__;1;__GNUC__;9;__GNUC_MINOR__;4;__GNUC_PATCHLEVEL__;0;__VERSION__;"9.4.0";__ATOMIC_RELAXED;0;__ATOMIC_SEQ_CST;5;__ATOMIC_ACQUIRE;2;__ATOMIC_RELEASE;3;__ATOMIC_ACQ_REL;4;__ATOMIC_CONSUME;1;__pic__;2;__PIC__;2;__pie__;2;__PIE__;2;__FINITE_MATH_ONLY__;0;_LP64;1;__LP64__;1;__SIZEOF_INT__;4;__SIZEOF_LONG__;8;__SIZEOF_LONG_LONG__;8;__SIZEOF_SHORT__;2;__SIZEOF_FLOAT__;4;__SIZEOF_DOUBLE__;8;__SIZEOF_LONG_DOUBLE__;16;__SIZEOF_SIZE_T__;8;__CHAR_BIT__;8;__BIGGEST_ALIGNMENT__;16;__ORDER_LITTLE_ENDIAN__;1234;__ORDER_BIG_ENDIAN__;4321;__ORDER_PDP_ENDIAN__;3412;__BYTE_ORDER__;__ORDER_LITTLE_ENDIAN__;__FLOAT_WORD_ORDER__;__ORDER_LITTLE_ENDIAN__;__SIZEOF_POINTER__;8;__GNUG__;9;__SIZE_TYPE__;long unsigned int;__PTRDIFF_TYPE__;long int;__WCHAR_TYPE__;int;__WINT_TYPE__;unsigned int;__INTMAX_TYPE__;long int;__UINTMAX_TYPE__;long unsigned int;__CHAR16_TYPE__;short unsigned int;__CHAR32_TYPE__;unsigned int;__SIG_ATOMIC_TYPE__;int;__INT8_TYPE__;signed char;__INT16_TYPE__;short int;__INT32_TYPE__;int;__INT64_TYPE__;long int;__UINT8_TYPE__;unsigned char;__UINT16_TYPE__;short unsigned int;__UINT32_TYPE__;unsigned int;__UINT64_TYPE__;long unsigned int;__INT_LEAST8_TYPE__;signed char;__INT_LEAST16_TYPE__;short int;__INT_LEAST32_TYPE__;int;__INT_LEAST64_TYPE__;long int;__UINT_LEAST8_TYPE__;unsigned char;__UINT_LEAST16_TYPE__;short unsigned int;__UINT_LEAST32_TYPE__;unsigned int;__UINT_LEAST64_TYPE__;long unsigned int;__INT_FAST8_TYPE__;signed char;__INT_FAST16_TYPE__;long int;__INT_FAST32_TYPE__;long int;__INT_FAST64_TYPE__;long int;__UINT_FAST8_TYPE__;unsigned char;__UINT_FAST16_TYPE__;long unsigned int;__UINT_FAST32_TYPE__;long unsigned int;__UINT_FAST64_TYPE__;long unsigned int;__INTPTR_TYPE__;long int;__UINTPTR_TYPE__;long unsigned int;__has_include(STR);__has_include__(STR);__has_include_next(STR);__has_include_next__(STR);__GXX_WEAK__;1;__DEPRECATED;1;__GXX_RTTI;1;__cpp_rtti;199711;__GXX_EXPERIMENTAL_CXX0X__;1;__cpp_binary_literals;201304;__cpp_hex_float;201603;__cpp_runtime_arrays;198712;__cpp_unicode_characters;200704;__cpp_raw_strings;200710;__cpp_unicode_literals;200710;__cpp_user_defined_literals;200809;__cpp_lambdas;200907;__cpp_range_based_for;200907;__cpp_static_assert;200410;__cpp_decltype;200707;__cpp_attributes;200809;__cpp_rvalue_reference;200610;__cpp_rvalue_references;200610;__cpp_variadic_templates;200704;__cpp_initializer_lists;200806;__cpp_delegating_constructors;200604;__cpp_nsdmi;200809;__cpp_inheriting_constructors;201511;__cpp_ref_qualifiers;200710;__cpp_alias_templates;200704;__cpp_return_type_deduction;201304;__cpp_init_captures;201304;__cpp_generic_lambdas;201304;__cpp_constexpr;201304;__cpp_decltype_auto;201304;__cpp_aggregate_nsdmi;201304;__cpp_variable_templates;201304;__cpp_digit_separators;201309;__cpp_sized_deallocation;201309;__cpp_threadsafe_static_init;200806;__EXCEPTIONS;1;__cpp_exceptions;199711;__GXX_ABI_VERSION;1013;__SCHAR_MAX__;0x7f;__SHRT_MAX__;0x7fff;__INT_MAX__;0x7fffffff;__LONG_MAX__;0x7fffffffffffffffL;__LONG_LONG_MAX__;0x7fffffffffffffffLL;__WCHAR_MAX__;0x7fffffff;__WCHAR_MIN__;(-__WCHAR_MAX__ - 1);__WINT_MAX__;0xffffffffU;__WINT_MIN__;0U;__PTRDIFF_MAX__;0x7fffffffffffffffL;__SIZE_MAX__;0xffffffffffffffffUL;__SCHAR_WIDTH__;8;__SHRT_WIDTH__;16;__INT_WIDTH__;32;__LONG_WIDTH__;64;__LONG_LONG_WIDTH__;64;__WCHAR_WIDTH__;32;__WINT_WIDTH__;32;__PTRDIFF_WIDTH__;64;__SIZE_WIDTH__;64;__GLIBCXX_TYPE_INT_N_0;__int128;__GLIBCXX_BITSIZE_INT_N_0;128;__INTMAX_MAX__;0x7fffffffffffffffL;__INTMAX_C(c);c ## L;__UINTMAX_MAX__;0xffffffffffffffffUL;__UINTMAX_C(c);c ## UL;__INTMAX_WIDTH__;64;__SIG_ATOMIC_MAX__;0x7fffffff;__SIG_ATOMIC_MIN__;(-__SIG_ATOMIC_MAX__ - 1);__SIG_ATOMIC_WIDTH__;32;__INT8_MAX__;0x7f;__INT16_MAX__;0x7fff;__INT32_MAX__;0x7fffffff;__INT64_MAX__;0x7fffffffffffffffL;__UINT8_MAX__;0xff;__UINT16_MAX__;0xffff;__UINT32_MAX__;0xffffffffU;__UINT64_MAX__;0xffffffffffffffffUL;__INT_LEAST8_MAX__;0x7f;__INT8_C(c);c;__INT_LEAST8_WIDTH__;8;__INT_LEAST16_MAX__;0x7fff;__INT16_C(c);c;__INT_LEAST16_WIDTH__;16;__INT_LEAST32_MAX__;0x7fffffff;__INT32_C(c);c;__INT_LEAST32_WIDTH__;32;__INT_LEAST64_MAX__;0x7fffffffffffffffL;__INT64_C(c);c ## L;__INT_LEAST64_WIDTH__;64;__UINT_LEAST8_MAX__;0xff;__UINT8_C(c);c;__UINT_LEAST16_MAX__;0xffff;__UINT16_C(c);c;__UINT_LEAST32_MAX__;0xffffffffU;__UINT32_C(c);c ## U;__UINT_LEAST64_MAX__;0xffffffffffffffffUL;__UINT64_C(c);c ## UL;__INT_FAST8_MAX__;0x7f;__INT_FAST8_WIDTH__;8;__INT_FAST16_MAX__;0x7fffffffffffffffL;__INT_FAST16_WIDTH__;64;__INT_FAST32_MAX__;0x7fffffffffffffffL;__INT_FAST32_WIDTH__;64;__INT_FAST64_MAX__;0x7fffffffffffffffL;__INT_FAST64_WIDTH__;64;__UINT_FAST8_MAX__;0xff;__UINT_FAST16_MAX__;0xffffffffffffffffUL;__UINT_FAST32_MAX__;0xffffffffffffffffUL;__UINT_FAST64_MAX__;0xffffffffffffffffUL;__INTPTR_MAX__;0x7fffffffffffffffL;__INTPTR_WIDTH__;64;__UINTPTR_MAX__;0xffffffffffffffffUL;__GCC_IEC_559;2;__GCC_IEC_559_COMPLEX;2;__FLT_EVAL_METHOD__;0;__FLT_EVAL_METHOD_TS_18661_3__;0;__DEC_EVAL_METHOD__;2;__FLT_RADIX__;2;__FLT_MANT_DIG__;24;__FLT_DIG__;6;__FLT_MIN_EXP__;(-125);__FLT_MIN_10_EXP__;(-37);__FLT_MAX_EXP__;128;__FLT_MAX_10_EXP__;38;__FLT_DECIMAL_DIG__;9;__FLT_MAX__;3.40282346638528859811704183484516925e+38F;__FLT_MIN__;1.17549435082228750796873653722224568e-38F;__FLT_EPSILON__;1.19209289550781250000000000000000000e-7F;__FLT_DENORM_MIN__;1.40129846432481707092372958328991613e-45F;__FLT_HAS_DENORM__;1;__FLT_HAS_INFINITY__;1;__FLT_HAS_QUIET_NAN__;1;__DBL_MANT_DIG__;53;__DBL_DIG__;15;__DBL_MIN_EXP__;(-1021);__DBL_MIN_10_EXP__;(-307);__DBL_MAX_EXP__;1024;__DBL_MAX_10_EXP__;308;__DBL_DECIMAL_DIG__;17;__DBL_MAX__;double(1.79769313486231570814527423731704357e+308L);__DBL_MIN__;double(2.22507385850720138309023271733240406e-308L);__DBL_EPSILON__;double(2.22044604925031308084726333618164062e-16L);__DBL_DENORM_MIN__;double(4.94065645841246544176568792868221372e-324L);__DBL_HAS_DENORM__;1;__DBL_HAS_INFINITY__;1;__DBL_HAS_QUIET_NAN__;1;__LDBL_MANT_DIG__;64;__LDBL_DIG__;18;__LDBL_MIN_EXP__;(-16381);__LDBL_MIN_10_EXP__;(-4931);__LDBL_MAX_EXP__;16384;__LDBL_MAX_10_EXP__;4932;__DECIMAL_DIG__;21;__LDBL_DECIMAL_DIG__;21;__LDBL_MAX__;1.18973149535723176502126385303097021e+4932L;__LDBL_MIN__;3.36210314311209350626267781732175260e-4932L;__LDBL_EPSILON__;1.08420217248550443400745280086994171e-19L;__LDBL_DENORM_MIN__;3.64519953188247460252840593361941982e-4951L;__LDBL_HAS_DENORM__;1;__LDBL_HAS_INFINITY__;1;__LDBL_HAS_QUIET_NAN__;1;__FLT32_MANT_DIG__;24;__FLT32_DIG__;6;__FLT32_MIN_EXP__;(-125);__FLT32_MIN_10_EXP__;(-37);__FLT32_MAX_EXP__;128;__FLT32_MAX_10_EXP__;38;__FLT32_DECIMAL_DIG__;9;__FLT32_MAX__;3.40282346638528859811704183484516925e+38F32;__FLT32_MIN__;1.17549435082228750796873653722224568e-38F32;__FLT32_EPSILON__;1.19209289550781250000000000000000000e-7F32;__FLT32_DENORM_MIN__;1.40129846432481707092372958328991613e-45F32;__FLT32_HAS_DENORM__;1;__FLT32_HAS_INFINITY__;1;__FLT32_HAS_QUIET_NAN__;1;__FLT64_MANT_DIG__;53;__FLT64_DIG__;15;__FLT64_MIN_EXP__;(-1021);__FLT64_MIN_10_EXP__;(-307);__FLT64_MAX_EXP__;1024;__FLT64_MAX_10_EXP__;308;__FLT64_DECIMAL_DIG__;17;__FLT64_MAX__;1.79769313486231570814527423731704357e+308F64;__FLT64_MIN__;2.22507385850720138309023271733240406e-308F64;__FLT64_EPSILON__;2.22044604925031308084726333618164062e-16F64;__FLT64_DENORM_MIN__;4.94065645841246544176568792868221372e-324F64;__FLT64_HAS_DENORM__;1;__FLT64_HAS_INFINITY__;1;__FLT64_HAS_QUIET_NAN__;1;__FLT128_MANT_DIG__;113;__FLT128_DIG__;33;__FLT128_MIN_EXP__;(-16381);__FLT128_MIN_10_EXP__;(-4931);__FLT128_MAX_EXP__;16384;__FLT128_MAX_10_EXP__;4932;__FLT128_DECIMAL_DIG__;36;__FLT128_MAX__;1.18973149535723176508575932662800702e+4932F128;__FLT128_MIN__;3.36210314311209350626267781732175260e-4932F128;__FLT128_EPSILON__;1.92592994438723585305597794258492732e-34F128;__FLT128_DENORM_MIN__;6.47517511943802511092443895822764655e-4966F128;__FLT128_HAS_DENORM__;1;__FLT128_HAS_INFINITY__;1;__FLT128_HAS_QUIET_NAN__;1;__FLT32X_MANT_DIG__;53;__FLT32X_DIG__;15;__FLT32X_MIN_EXP__;(-1021);__FLT32X_MIN_10_EXP__;(-307);__FLT32X_MAX_EXP__;1024;__FLT32X_MAX_10_EXP__;308;__FLT32X_DECIMAL_DIG__;17;__FLT32X_MAX__;1.79769313486231570814527423731704357e+308F32x;__FLT32X_MIN__;2.22507385850720138309023271733240406e-308F32x;__FLT32X_EPSILON__;2.22044604925031308084726333618164062e-16F32x;__FLT32X_DENORM_MIN__;4.94065645841246544176568792868221372e-324F32x;__FLT32X_HAS_DENORM__;1;__FLT32X_HAS_INFINITY__;1;__FLT32X_HAS_QUIET_NAN__;1;__FLT64X_MANT_DIG__;64;__FLT64X_DIG__;18;__FLT64X_MIN_EXP__;(-16381);__FLT64X_MIN_10_EXP__;(-4931);__FLT64X_MAX_EXP__;16384;__FLT64X_MAX_10_EXP__;4932;__FLT64X_DECIMAL_DIG__;21;__FLT64X_MAX__;1.18973149535723176502126385303097021e+4932F64x;__FLT64X_MIN__;3.36210314311209350626267781732175260e-4932F64x;__FLT64X_EPSILON__;1.08420217248550443400745280086994171e-19F64x;__FLT64X_DENORM_MIN__;3.64519953188247460252840593361941982e-4951F64x;__FLT64X_HAS_DENORM__;1;__FLT64X_HAS_INFINITY__;1;__FLT64X_HAS_QUIET_NAN__;1;__DEC32_MANT_DIG__;7;__DEC32_MIN_EXP__;(-94);__DEC32_MAX_EXP__;97;__DEC32_MIN__;1E-95DF;__DEC32_MAX__;9.999999E96DF;__DEC32_EPSILON__;1E-6DF;__DEC32_SUBNORMAL_MIN__;0.000001E-95DF;__DEC64_MANT_DIG__;16;__DEC64_MIN_EXP__;(-382);__DEC64_MAX_EXP__;385;__DEC64_MIN__;1E-383DD;__DEC64_MAX__;9.999999999999999E384DD;__DEC64_EPSILON__;1E-15DD;__DEC64_SUBNORMAL_MIN__;0.000000000000001E-383DD;__DEC128_MANT_DIG__;34;__DEC128_MIN_EXP__;(-6142);__DEC128_MAX_EXP__;6145;__DEC128_MIN__;1E-6143DL;__DEC128_MAX__;9.999999999999999999999999999999999E6144DL;__DEC128_EPSILON__;1E-33DL;__DEC128_SUBNORMAL_MIN__;0.000000000000000000000000000000001E-6143DL;__REGISTER_PREFIX__; ;__USER_LABEL_PREFIX__; ;__GNUC_STDC_INLINE__;1;__NO_INLINE__;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8;1;__GCC_ATOMIC_BOOL_LOCK_FREE;2;__GCC_ATOMIC_CHAR_LOCK_FREE;2;__GCC_ATOMIC_CHAR16_T_LOCK_FREE;2;__GCC_ATOMIC_CHAR32_T_LOCK_FREE;2;__GCC_ATOMIC_WCHAR_T_LOCK_FREE;2;__GCC_ATOMIC_SHORT_LOCK_FREE;2;__GCC_ATOMIC_INT_LOCK_FREE;2;__GCC_ATOMIC_LONG_LOCK_FREE;2;__GCC_ATOMIC_LLONG_LOCK_FREE;2;__GCC_ATOMIC_TEST_AND_SET_TRUEVAL;1;__GCC_ATOMIC_POINTER_LOCK_FREE;2;__HAVE_SPECULATION_SAFE_VALUE;1;__GCC_HAVE_DWARF2_CFI_ASM;1;__PRAGMA_REDEFINE_EXTNAME;1;__SSP_STRONG__;3;__SIZEOF_INT128__;16;__SIZEOF_WCHAR_T__;4;__SIZEOF_WINT_T__;4;__SIZEOF_PTRDIFF_T__;8;__amd64;1;__amd64__;1;__x86_64;1;__x86_64__;1;__SIZEOF_FLOAT80__;16;__SIZEOF_FLOAT128__;16;__ATOMIC_HLE_ACQUIRE;65536;__ATOMIC_HLE_RELEASE;131072;__GCC_ASM_FLAG_OUTPUTS__;1;__k8;1;__k8__;1;__code_model_small__;1;__MMX__;1;__SSE__;1;__SSE2__;1;__FXSR__;1;__SSE_MATH__;1;__SSE2_MATH__;1;__SEG_FS;1;__SEG_GS;1;__CET__;3;__gnu_linux__;1;__linux;1;__linux__;1;linux;1;__unix;1;__unix__;1;unix;1;__ELF__;1;__DECIMAL_BID_FORMAT__;1;_GNU_SOURCE;1;_STDC_PREDEF_H;1;__STDC_IEC_559__;1;__STDC_IEC_559_COMPLEX__;1;__STDC_ISO_10646__;201706L +//CXX compiler system include directories +CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_INCLUDE_DIRS:INTERNAL=/usr/include/c++/9;/usr/include/x86_64-linux-gnu/c++/9;/usr/include/c++/9/backward;/usr/lib/gcc/x86_64-linux-gnu/9/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include +//C compiler system defined macros +CMAKE_EXTRA_GENERATOR_C_SYSTEM_DEFINED_MACROS:INTERNAL=__STDC__;1;__STDC_VERSION__;201710L;__STDC_UTF_16__;1;__STDC_UTF_32__;1;__STDC_HOSTED__;1;__GNUC__;9;__GNUC_MINOR__;4;__GNUC_PATCHLEVEL__;0;__VERSION__;"9.4.0";__ATOMIC_RELAXED;0;__ATOMIC_SEQ_CST;5;__ATOMIC_ACQUIRE;2;__ATOMIC_RELEASE;3;__ATOMIC_ACQ_REL;4;__ATOMIC_CONSUME;1;__pic__;2;__PIC__;2;__pie__;2;__PIE__;2;__FINITE_MATH_ONLY__;0;_LP64;1;__LP64__;1;__SIZEOF_INT__;4;__SIZEOF_LONG__;8;__SIZEOF_LONG_LONG__;8;__SIZEOF_SHORT__;2;__SIZEOF_FLOAT__;4;__SIZEOF_DOUBLE__;8;__SIZEOF_LONG_DOUBLE__;16;__SIZEOF_SIZE_T__;8;__CHAR_BIT__;8;__BIGGEST_ALIGNMENT__;16;__ORDER_LITTLE_ENDIAN__;1234;__ORDER_BIG_ENDIAN__;4321;__ORDER_PDP_ENDIAN__;3412;__BYTE_ORDER__;__ORDER_LITTLE_ENDIAN__;__FLOAT_WORD_ORDER__;__ORDER_LITTLE_ENDIAN__;__SIZEOF_POINTER__;8;__SIZE_TYPE__;long unsigned int;__PTRDIFF_TYPE__;long int;__WCHAR_TYPE__;int;__WINT_TYPE__;unsigned int;__INTMAX_TYPE__;long int;__UINTMAX_TYPE__;long unsigned int;__CHAR16_TYPE__;short unsigned int;__CHAR32_TYPE__;unsigned int;__SIG_ATOMIC_TYPE__;int;__INT8_TYPE__;signed char;__INT16_TYPE__;short int;__INT32_TYPE__;int;__INT64_TYPE__;long int;__UINT8_TYPE__;unsigned char;__UINT16_TYPE__;short unsigned int;__UINT32_TYPE__;unsigned int;__UINT64_TYPE__;long unsigned int;__INT_LEAST8_TYPE__;signed char;__INT_LEAST16_TYPE__;short int;__INT_LEAST32_TYPE__;int;__INT_LEAST64_TYPE__;long int;__UINT_LEAST8_TYPE__;unsigned char;__UINT_LEAST16_TYPE__;short unsigned int;__UINT_LEAST32_TYPE__;unsigned int;__UINT_LEAST64_TYPE__;long unsigned int;__INT_FAST8_TYPE__;signed char;__INT_FAST16_TYPE__;long int;__INT_FAST32_TYPE__;long int;__INT_FAST64_TYPE__;long int;__UINT_FAST8_TYPE__;unsigned char;__UINT_FAST16_TYPE__;long unsigned int;__UINT_FAST32_TYPE__;long unsigned int;__UINT_FAST64_TYPE__;long unsigned int;__INTPTR_TYPE__;long int;__UINTPTR_TYPE__;long unsigned int;__has_include(STR);__has_include__(STR);__has_include_next(STR);__has_include_next__(STR);__GXX_ABI_VERSION;1013;__SCHAR_MAX__;0x7f;__SHRT_MAX__;0x7fff;__INT_MAX__;0x7fffffff;__LONG_MAX__;0x7fffffffffffffffL;__LONG_LONG_MAX__;0x7fffffffffffffffLL;__WCHAR_MAX__;0x7fffffff;__WCHAR_MIN__;(-__WCHAR_MAX__ - 1);__WINT_MAX__;0xffffffffU;__WINT_MIN__;0U;__PTRDIFF_MAX__;0x7fffffffffffffffL;__SIZE_MAX__;0xffffffffffffffffUL;__SCHAR_WIDTH__;8;__SHRT_WIDTH__;16;__INT_WIDTH__;32;__LONG_WIDTH__;64;__LONG_LONG_WIDTH__;64;__WCHAR_WIDTH__;32;__WINT_WIDTH__;32;__PTRDIFF_WIDTH__;64;__SIZE_WIDTH__;64;__INTMAX_MAX__;0x7fffffffffffffffL;__INTMAX_C(c);c ## L;__UINTMAX_MAX__;0xffffffffffffffffUL;__UINTMAX_C(c);c ## UL;__INTMAX_WIDTH__;64;__SIG_ATOMIC_MAX__;0x7fffffff;__SIG_ATOMIC_MIN__;(-__SIG_ATOMIC_MAX__ - 1);__SIG_ATOMIC_WIDTH__;32;__INT8_MAX__;0x7f;__INT16_MAX__;0x7fff;__INT32_MAX__;0x7fffffff;__INT64_MAX__;0x7fffffffffffffffL;__UINT8_MAX__;0xff;__UINT16_MAX__;0xffff;__UINT32_MAX__;0xffffffffU;__UINT64_MAX__;0xffffffffffffffffUL;__INT_LEAST8_MAX__;0x7f;__INT8_C(c);c;__INT_LEAST8_WIDTH__;8;__INT_LEAST16_MAX__;0x7fff;__INT16_C(c);c;__INT_LEAST16_WIDTH__;16;__INT_LEAST32_MAX__;0x7fffffff;__INT32_C(c);c;__INT_LEAST32_WIDTH__;32;__INT_LEAST64_MAX__;0x7fffffffffffffffL;__INT64_C(c);c ## L;__INT_LEAST64_WIDTH__;64;__UINT_LEAST8_MAX__;0xff;__UINT8_C(c);c;__UINT_LEAST16_MAX__;0xffff;__UINT16_C(c);c;__UINT_LEAST32_MAX__;0xffffffffU;__UINT32_C(c);c ## U;__UINT_LEAST64_MAX__;0xffffffffffffffffUL;__UINT64_C(c);c ## UL;__INT_FAST8_MAX__;0x7f;__INT_FAST8_WIDTH__;8;__INT_FAST16_MAX__;0x7fffffffffffffffL;__INT_FAST16_WIDTH__;64;__INT_FAST32_MAX__;0x7fffffffffffffffL;__INT_FAST32_WIDTH__;64;__INT_FAST64_MAX__;0x7fffffffffffffffL;__INT_FAST64_WIDTH__;64;__UINT_FAST8_MAX__;0xff;__UINT_FAST16_MAX__;0xffffffffffffffffUL;__UINT_FAST32_MAX__;0xffffffffffffffffUL;__UINT_FAST64_MAX__;0xffffffffffffffffUL;__INTPTR_MAX__;0x7fffffffffffffffL;__INTPTR_WIDTH__;64;__UINTPTR_MAX__;0xffffffffffffffffUL;__GCC_IEC_559;2;__GCC_IEC_559_COMPLEX;2;__FLT_EVAL_METHOD__;0;__FLT_EVAL_METHOD_TS_18661_3__;0;__DEC_EVAL_METHOD__;2;__FLT_RADIX__;2;__FLT_MANT_DIG__;24;__FLT_DIG__;6;__FLT_MIN_EXP__;(-125);__FLT_MIN_10_EXP__;(-37);__FLT_MAX_EXP__;128;__FLT_MAX_10_EXP__;38;__FLT_DECIMAL_DIG__;9;__FLT_MAX__;3.40282346638528859811704183484516925e+38F;__FLT_MIN__;1.17549435082228750796873653722224568e-38F;__FLT_EPSILON__;1.19209289550781250000000000000000000e-7F;__FLT_DENORM_MIN__;1.40129846432481707092372958328991613e-45F;__FLT_HAS_DENORM__;1;__FLT_HAS_INFINITY__;1;__FLT_HAS_QUIET_NAN__;1;__DBL_MANT_DIG__;53;__DBL_DIG__;15;__DBL_MIN_EXP__;(-1021);__DBL_MIN_10_EXP__;(-307);__DBL_MAX_EXP__;1024;__DBL_MAX_10_EXP__;308;__DBL_DECIMAL_DIG__;17;__DBL_MAX__;((double)1.79769313486231570814527423731704357e+308L);__DBL_MIN__;((double)2.22507385850720138309023271733240406e-308L);__DBL_EPSILON__;((double)2.22044604925031308084726333618164062e-16L);__DBL_DENORM_MIN__;((double)4.94065645841246544176568792868221372e-324L);__DBL_HAS_DENORM__;1;__DBL_HAS_INFINITY__;1;__DBL_HAS_QUIET_NAN__;1;__LDBL_MANT_DIG__;64;__LDBL_DIG__;18;__LDBL_MIN_EXP__;(-16381);__LDBL_MIN_10_EXP__;(-4931);__LDBL_MAX_EXP__;16384;__LDBL_MAX_10_EXP__;4932;__DECIMAL_DIG__;21;__LDBL_DECIMAL_DIG__;21;__LDBL_MAX__;1.18973149535723176502126385303097021e+4932L;__LDBL_MIN__;3.36210314311209350626267781732175260e-4932L;__LDBL_EPSILON__;1.08420217248550443400745280086994171e-19L;__LDBL_DENORM_MIN__;3.64519953188247460252840593361941982e-4951L;__LDBL_HAS_DENORM__;1;__LDBL_HAS_INFINITY__;1;__LDBL_HAS_QUIET_NAN__;1;__FLT32_MANT_DIG__;24;__FLT32_DIG__;6;__FLT32_MIN_EXP__;(-125);__FLT32_MIN_10_EXP__;(-37);__FLT32_MAX_EXP__;128;__FLT32_MAX_10_EXP__;38;__FLT32_DECIMAL_DIG__;9;__FLT32_MAX__;3.40282346638528859811704183484516925e+38F32;__FLT32_MIN__;1.17549435082228750796873653722224568e-38F32;__FLT32_EPSILON__;1.19209289550781250000000000000000000e-7F32;__FLT32_DENORM_MIN__;1.40129846432481707092372958328991613e-45F32;__FLT32_HAS_DENORM__;1;__FLT32_HAS_INFINITY__;1;__FLT32_HAS_QUIET_NAN__;1;__FLT64_MANT_DIG__;53;__FLT64_DIG__;15;__FLT64_MIN_EXP__;(-1021);__FLT64_MIN_10_EXP__;(-307);__FLT64_MAX_EXP__;1024;__FLT64_MAX_10_EXP__;308;__FLT64_DECIMAL_DIG__;17;__FLT64_MAX__;1.79769313486231570814527423731704357e+308F64;__FLT64_MIN__;2.22507385850720138309023271733240406e-308F64;__FLT64_EPSILON__;2.22044604925031308084726333618164062e-16F64;__FLT64_DENORM_MIN__;4.94065645841246544176568792868221372e-324F64;__FLT64_HAS_DENORM__;1;__FLT64_HAS_INFINITY__;1;__FLT64_HAS_QUIET_NAN__;1;__FLT128_MANT_DIG__;113;__FLT128_DIG__;33;__FLT128_MIN_EXP__;(-16381);__FLT128_MIN_10_EXP__;(-4931);__FLT128_MAX_EXP__;16384;__FLT128_MAX_10_EXP__;4932;__FLT128_DECIMAL_DIG__;36;__FLT128_MAX__;1.18973149535723176508575932662800702e+4932F128;__FLT128_MIN__;3.36210314311209350626267781732175260e-4932F128;__FLT128_EPSILON__;1.92592994438723585305597794258492732e-34F128;__FLT128_DENORM_MIN__;6.47517511943802511092443895822764655e-4966F128;__FLT128_HAS_DENORM__;1;__FLT128_HAS_INFINITY__;1;__FLT128_HAS_QUIET_NAN__;1;__FLT32X_MANT_DIG__;53;__FLT32X_DIG__;15;__FLT32X_MIN_EXP__;(-1021);__FLT32X_MIN_10_EXP__;(-307);__FLT32X_MAX_EXP__;1024;__FLT32X_MAX_10_EXP__;308;__FLT32X_DECIMAL_DIG__;17;__FLT32X_MAX__;1.79769313486231570814527423731704357e+308F32x;__FLT32X_MIN__;2.22507385850720138309023271733240406e-308F32x;__FLT32X_EPSILON__;2.22044604925031308084726333618164062e-16F32x;__FLT32X_DENORM_MIN__;4.94065645841246544176568792868221372e-324F32x;__FLT32X_HAS_DENORM__;1;__FLT32X_HAS_INFINITY__;1;__FLT32X_HAS_QUIET_NAN__;1;__FLT64X_MANT_DIG__;64;__FLT64X_DIG__;18;__FLT64X_MIN_EXP__;(-16381);__FLT64X_MIN_10_EXP__;(-4931);__FLT64X_MAX_EXP__;16384;__FLT64X_MAX_10_EXP__;4932;__FLT64X_DECIMAL_DIG__;21;__FLT64X_MAX__;1.18973149535723176502126385303097021e+4932F64x;__FLT64X_MIN__;3.36210314311209350626267781732175260e-4932F64x;__FLT64X_EPSILON__;1.08420217248550443400745280086994171e-19F64x;__FLT64X_DENORM_MIN__;3.64519953188247460252840593361941982e-4951F64x;__FLT64X_HAS_DENORM__;1;__FLT64X_HAS_INFINITY__;1;__FLT64X_HAS_QUIET_NAN__;1;__DEC32_MANT_DIG__;7;__DEC32_MIN_EXP__;(-94);__DEC32_MAX_EXP__;97;__DEC32_MIN__;1E-95DF;__DEC32_MAX__;9.999999E96DF;__DEC32_EPSILON__;1E-6DF;__DEC32_SUBNORMAL_MIN__;0.000001E-95DF;__DEC64_MANT_DIG__;16;__DEC64_MIN_EXP__;(-382);__DEC64_MAX_EXP__;385;__DEC64_MIN__;1E-383DD;__DEC64_MAX__;9.999999999999999E384DD;__DEC64_EPSILON__;1E-15DD;__DEC64_SUBNORMAL_MIN__;0.000000000000001E-383DD;__DEC128_MANT_DIG__;34;__DEC128_MIN_EXP__;(-6142);__DEC128_MAX_EXP__;6145;__DEC128_MIN__;1E-6143DL;__DEC128_MAX__;9.999999999999999999999999999999999E6144DL;__DEC128_EPSILON__;1E-33DL;__DEC128_SUBNORMAL_MIN__;0.000000000000000000000000000000001E-6143DL;__REGISTER_PREFIX__; ;__USER_LABEL_PREFIX__; ;__GNUC_STDC_INLINE__;1;__NO_INLINE__;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;1;__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8;1;__GCC_ATOMIC_BOOL_LOCK_FREE;2;__GCC_ATOMIC_CHAR_LOCK_FREE;2;__GCC_ATOMIC_CHAR16_T_LOCK_FREE;2;__GCC_ATOMIC_CHAR32_T_LOCK_FREE;2;__GCC_ATOMIC_WCHAR_T_LOCK_FREE;2;__GCC_ATOMIC_SHORT_LOCK_FREE;2;__GCC_ATOMIC_INT_LOCK_FREE;2;__GCC_ATOMIC_LONG_LOCK_FREE;2;__GCC_ATOMIC_LLONG_LOCK_FREE;2;__GCC_ATOMIC_TEST_AND_SET_TRUEVAL;1;__GCC_ATOMIC_POINTER_LOCK_FREE;2;__HAVE_SPECULATION_SAFE_VALUE;1;__GCC_HAVE_DWARF2_CFI_ASM;1;__PRAGMA_REDEFINE_EXTNAME;1;__SSP_STRONG__;3;__SIZEOF_INT128__;16;__SIZEOF_WCHAR_T__;4;__SIZEOF_WINT_T__;4;__SIZEOF_PTRDIFF_T__;8;__amd64;1;__amd64__;1;__x86_64;1;__x86_64__;1;__SIZEOF_FLOAT80__;16;__SIZEOF_FLOAT128__;16;__ATOMIC_HLE_ACQUIRE;65536;__ATOMIC_HLE_RELEASE;131072;__GCC_ASM_FLAG_OUTPUTS__;1;__k8;1;__k8__;1;__code_model_small__;1;__MMX__;1;__SSE__;1;__SSE2__;1;__FXSR__;1;__SSE_MATH__;1;__SSE2_MATH__;1;__SEG_FS;1;__SEG_GS;1;__CET__;3;__gnu_linux__;1;__linux;1;__linux__;1;linux;1;__unix;1;__unix__;1;unix;1;__ELF__;1;__DECIMAL_BID_FORMAT__;1;_STDC_PREDEF_H;1;__STDC_IEC_559__;1;__STDC_IEC_559_COMPLEX__;1;__STDC_ISO_10646__;201706L +//C compiler system include directories +CMAKE_EXTRA_GENERATOR_C_SYSTEM_INCLUDE_DIRS:INTERNAL=/usr/lib/gcc/x86_64-linux-gnu/9/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/ryazur/src/PhysicsFormula +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/share/cmake-3.16 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: ProcessorCount_cmd_nproc +ProcessorCount_cmd_nproc-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: ProcessorCount_cmd_sysctl +ProcessorCount_cmd_sysctl-ADVANCED:INTERNAL=1 + diff --git a/cmake-build-debug-wsl/CMakeFiles/3.16.3/CMakeCCompiler.cmake b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CMakeCCompiler.cmake new file mode 100644 index 0000000..c5ece7b --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CMakeCCompiler.cmake @@ -0,0 +1,76 @@ +set(CMAKE_C_COMPILER "/usr/bin/cc") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "GNU") +set(CMAKE_C_COMPILER_VERSION "9.4.0") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "11") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "") +set(CMAKE_C_SIMULATE_VERSION "") + + + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_C_COMPILER_AR "/usr/bin/gcc-ar-9") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_C_COMPILER_RANLIB "/usr/bin/gcc-ranlib-9") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_MT "") +set(CMAKE_COMPILER_IS_GNUCC 1) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/9/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "gcc;gcc_s;c;gcc;gcc_s") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/9;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/cmake-build-debug-wsl/CMakeFiles/3.16.3/CMakeCXXCompiler.cmake b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..278ef39 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CMakeCXXCompiler.cmake @@ -0,0 +1,88 @@ +set(CMAKE_CXX_COMPILER "/usr/bin/c++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "GNU") +set(CMAKE_CXX_COMPILER_VERSION "9.4.0") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "14") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_CXX_COMPILER_AR "/usr/bin/gcc-ar-9") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/usr/bin/gcc-ranlib-9") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_MT "") +set(CMAKE_COMPILER_IS_GNUCXX 1) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;CPP) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/usr/include/c++/9;/usr/include/x86_64-linux-gnu/c++/9;/usr/include/c++/9/backward;/usr/lib/gcc/x86_64-linux-gnu/9/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;gcc_s;gcc;c;gcc_s;gcc") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/9;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/cmake-build-debug-wsl/CMakeFiles/3.16.3/CMakeDetermineCompilerABI_C.bin b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CMakeDetermineCompilerABI_C.bin new file mode 100644 index 0000000..f7ba302 Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CMakeDetermineCompilerABI_C.bin differ diff --git a/cmake-build-debug-wsl/CMakeFiles/3.16.3/CMakeDetermineCompilerABI_CXX.bin b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CMakeDetermineCompilerABI_CXX.bin new file mode 100644 index 0000000..417f72f Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CMakeDetermineCompilerABI_CXX.bin differ diff --git a/cmake-build-debug-wsl/CMakeFiles/3.16.3/CMakeSystem.cmake b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CMakeSystem.cmake new file mode 100644 index 0000000..bdaf3a0 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Linux-4.4.0-19041-Microsoft") +set(CMAKE_HOST_SYSTEM_NAME "Linux") +set(CMAKE_HOST_SYSTEM_VERSION "4.4.0-19041-Microsoft") +set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + + + +set(CMAKE_SYSTEM "Linux-4.4.0-19041-Microsoft") +set(CMAKE_SYSTEM_NAME "Linux") +set(CMAKE_SYSTEM_VERSION "4.4.0-19041-Microsoft") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "FALSE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/cmake-build-debug-wsl/CMakeFiles/3.16.3/CompilerIdC/CMakeCCompilerId.c b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..d884b50 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,671 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +#if !defined(__STDC__) +# if (defined(_MSC_VER) && !defined(__clang__)) \ + || (defined(__ibmxl__) || defined(__IBMC__)) +# define C_DIALECT "90" +# else +# define C_DIALECT +# endif +#elif __STDC_VERSION__ >= 201000L +# define C_DIALECT "11" +#elif __STDC_VERSION__ >= 199901L +# define C_DIALECT "99" +#else +# define C_DIALECT "90" +#endif +const char* info_language_dialect_default = + "INFO" ":" "dialect_default[" C_DIALECT "]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/cmake-build-debug-wsl/CMakeFiles/3.16.3/CompilerIdC/a.out b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CompilerIdC/a.out new file mode 100644 index 0000000..5da3fdd Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CompilerIdC/a.out differ diff --git a/cmake-build-debug-wsl/CMakeFiles/3.16.3/CompilerIdCXX/CMakeCXXCompilerId.cpp b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..69cfdba --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,660 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__COMO__) +# define COMPILER_ID "Comeau" + /* __COMO_VERSION__ = VRR */ +# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100) +# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100) + +#elif defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L +# if defined(__INTEL_CXX11_MODE__) +# if defined(__cpp_aggregate_nsdmi) +# define CXX_STD 201402L +# else +# define CXX_STD 201103L +# endif +# else +# define CXX_STD 199711L +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# define CXX_STD _MSVC_LANG +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_dialect_default = "INFO" ":" "dialect_default[" +#if CXX_STD > 201703L + "20" +#elif CXX_STD >= 201703L + "17" +#elif CXX_STD >= 201402L + "14" +#elif CXX_STD >= 201103L + "11" +#else + "98" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} diff --git a/cmake-build-debug-wsl/CMakeFiles/3.16.3/CompilerIdCXX/a.out b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CompilerIdCXX/a.out new file mode 100644 index 0000000..13528b3 Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/3.16.3/CompilerIdCXX/a.out differ diff --git a/cmake-build-debug-wsl/CMakeFiles/CMakeDirectoryInformation.cmake b/cmake-build-debug-wsl/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..40ba4eb --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.16 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/ryazur/src/PhysicsFormula") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/cmake-build-debug-wsl/CMakeFiles/CMakeOutput.log b/cmake-build-debug-wsl/CMakeFiles/CMakeOutput.log new file mode 100644 index 0000000..1cc2b93 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/CMakeOutput.log @@ -0,0 +1,461 @@ +The system is: Linux - 4.4.0-19041-Microsoft - x86_64 +Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. +Compiler: /usr/bin/cc +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" + +The C compiler identification is GNU, found in "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/3.16.3/CompilerIdC/a.out" + +Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. +Compiler: /usr/bin/c++ +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" + +The CXX compiler identification is GNU, found in "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/3.16.3/CompilerIdCXX/a.out" + +Determining if the C compiler works passed with the following output: +Change Dir: /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp + +Run Build Command(s):/usr/bin/make cmTC_30392/fast && /usr/bin/make -f CMakeFiles/cmTC_30392.dir/build.make CMakeFiles/cmTC_30392.dir/build +make[1]: Entering directory '/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_30392.dir/testCCompiler.c.o +/usr/bin/cc -o CMakeFiles/cmTC_30392.dir/testCCompiler.c.o -c /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp/testCCompiler.c +Linking C executable cmTC_30392 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_30392.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_30392.dir/testCCompiler.c.o -o cmTC_30392 +make[1]: Leaving directory '/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp' + + + +Detecting C compiler ABI info compiled with the following output: +Change Dir: /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp + +Run Build Command(s):/usr/bin/make cmTC_4a5d6/fast && /usr/bin/make -f CMakeFiles/cmTC_4a5d6.dir/build.make CMakeFiles/cmTC_4a5d6.dir/build +make[1]: Entering directory '/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o +/usr/bin/cc -v -o CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.16/Modules/CMakeCCompilerABI.c +Using built-in specs. +COLLECT_GCC=/usr/bin/cc +OFFLOAD_TARGET_NAMES=nvptx-none:hsa +OFFLOAD_TARGET_DEFAULT=1 +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-yTrUTS/gcc-9-9.4.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04) +COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' + /usr/lib/gcc/x86_64-linux-gnu/9/cc1 -quiet -v -imultiarch x86_64-linux-gnu /usr/share/cmake-3.16/Modules/CMakeCCompilerABI.c -quiet -dumpbase CMakeCCompilerABI.c -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccsAgrPk.s +GNU C17 (Ubuntu 9.4.0-1ubuntu1~20.04) version 9.4.0 (x86_64-linux-gnu) + compiled by GNU C version 9.4.0, GMP version 6.2.0, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.22.1-GMP + +GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 +ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" +ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed" +ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/../../../../x86_64-linux-gnu/include" +#include "..." search starts here: +#include <...> search starts here: + /usr/lib/gcc/x86_64-linux-gnu/9/include + /usr/local/include + /usr/include/x86_64-linux-gnu + /usr/include +End of search list. +GNU C17 (Ubuntu 9.4.0-1ubuntu1~20.04) version 9.4.0 (x86_64-linux-gnu) + compiled by GNU C version 9.4.0, GMP version 6.2.0, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.22.1-GMP + +GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 +Compiler executable checksum: 0fa2a01b1ef16377fce6a0bcb60fb82d +COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' + as -v --64 -o CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o /tmp/ccsAgrPk.s +GNU assembler version 2.34 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.34 +COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' +Linking C executable cmTC_4a5d6 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_4a5d6.dir/link.txt --verbose=1 +/usr/bin/cc -v CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o -o cmTC_4a5d6 +Using built-in specs. +COLLECT_GCC=/usr/bin/cc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper +OFFLOAD_TARGET_NAMES=nvptx-none:hsa +OFFLOAD_TARGET_DEFAULT=1 +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-yTrUTS/gcc-9-9.4.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04) +COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_4a5d6' '-mtune=generic' '-march=x86-64' + /usr/lib/gcc/x86_64-linux-gnu/9/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper -plugin-opt=-fresolution=/tmp/ccJ2m6vw.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_4a5d6 /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/9/../../.. CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_4a5d6' '-mtune=generic' '-march=x86-64' +make[1]: Leaving directory '/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp' + + + +Parsed C implicit include dir info from above output: rv=done + found start of include info + found start of implicit include info + add: [/usr/lib/gcc/x86_64-linux-gnu/9/include] + add: [/usr/local/include] + add: [/usr/include/x86_64-linux-gnu] + add: [/usr/include] + end of search list found + collapse include dir [/usr/lib/gcc/x86_64-linux-gnu/9/include] ==> [/usr/lib/gcc/x86_64-linux-gnu/9/include] + collapse include dir [/usr/local/include] ==> [/usr/local/include] + collapse include dir [/usr/include/x86_64-linux-gnu] ==> [/usr/include/x86_64-linux-gnu] + collapse include dir [/usr/include] ==> [/usr/include] + implicit include dirs: [/usr/lib/gcc/x86_64-linux-gnu/9/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include] + + +Parsed C implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command(s):/usr/bin/make cmTC_4a5d6/fast && /usr/bin/make -f CMakeFiles/cmTC_4a5d6.dir/build.make CMakeFiles/cmTC_4a5d6.dir/build] + ignore line: [make[1]: Entering directory '/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp'] + ignore line: [Building C object CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o] + ignore line: [/usr/bin/cc -v -o CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.16/Modules/CMakeCCompilerABI.c] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/cc] + ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:hsa] + ignore line: [OFFLOAD_TARGET_DEFAULT=1] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c ada c++ go brig d fortran objc obj-c++ gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-yTrUTS/gcc-9-9.4.0/debian/tmp-nvptx/usr hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] + ignore line: [Thread model: posix] + ignore line: [gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04) ] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64'] + ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/9/cc1 -quiet -v -imultiarch x86_64-linux-gnu /usr/share/cmake-3.16/Modules/CMakeCCompilerABI.c -quiet -dumpbase CMakeCCompilerABI.c -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccsAgrPk.s] + ignore line: [GNU C17 (Ubuntu 9.4.0-1ubuntu1~20.04) version 9.4.0 (x86_64-linux-gnu)] + ignore line: [ compiled by GNU C version 9.4.0 GMP version 6.2.0 MPFR version 4.0.2 MPC version 1.1.0 isl version isl-0.22.1-GMP] + ignore line: [] + ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] + ignore line: [ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/../../../../x86_64-linux-gnu/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/9/include] + ignore line: [ /usr/local/include] + ignore line: [ /usr/include/x86_64-linux-gnu] + ignore line: [ /usr/include] + ignore line: [End of search list.] + ignore line: [GNU C17 (Ubuntu 9.4.0-1ubuntu1~20.04) version 9.4.0 (x86_64-linux-gnu)] + ignore line: [ compiled by GNU C version 9.4.0 GMP version 6.2.0 MPFR version 4.0.2 MPC version 1.1.0 isl version isl-0.22.1-GMP] + ignore line: [] + ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] + ignore line: [Compiler executable checksum: 0fa2a01b1ef16377fce6a0bcb60fb82d] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64'] + ignore line: [ as -v --64 -o CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o /tmp/ccsAgrPk.s] + ignore line: [GNU assembler version 2.34 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.34] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64'] + ignore line: [Linking C executable cmTC_4a5d6] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_4a5d6.dir/link.txt --verbose=1] + ignore line: [/usr/bin/cc -v CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o -o cmTC_4a5d6 ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/cc] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper] + ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:hsa] + ignore line: [OFFLOAD_TARGET_DEFAULT=1] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c ada c++ go brig d fortran objc obj-c++ gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-yTrUTS/gcc-9-9.4.0/debian/tmp-nvptx/usr hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] + ignore line: [Thread model: posix] + ignore line: [gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_4a5d6' '-mtune=generic' '-march=x86-64'] + link line: [ /usr/lib/gcc/x86_64-linux-gnu/9/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper -plugin-opt=-fresolution=/tmp/ccJ2m6vw.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_4a5d6 /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/9/../../.. CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/9/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/ccJ2m6vw.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-pie] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTC_4a5d6] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-linux-gnu/9] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/9/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../..] + arg [CMakeFiles/cmTC_4a5d6.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [-lgcc] ==> lib [gcc] + arg [--push-state] ==> ignore + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--pop-state] ==> ignore + arg [-lc] ==> lib [c] + arg [-lgcc] ==> lib [gcc] + arg [--push-state] ==> ignore + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--pop-state] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o] ==> ignore + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9] ==> [/usr/lib/gcc/x86_64-linux-gnu/9] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../..] ==> [/usr/lib] + implicit libs: [gcc;gcc_s;c;gcc;gcc_s] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/9;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + +Determining if the CXX compiler works passed with the following output: +Change Dir: /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp + +Run Build Command(s):/usr/bin/make cmTC_796f0/fast && /usr/bin/make -f CMakeFiles/cmTC_796f0.dir/build.make CMakeFiles/cmTC_796f0.dir/build +make[1]: Entering directory '/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_796f0.dir/testCXXCompiler.cxx.o +/usr/bin/c++ -o CMakeFiles/cmTC_796f0.dir/testCXXCompiler.cxx.o -c /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp/testCXXCompiler.cxx +Linking CXX executable cmTC_796f0 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_796f0.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_796f0.dir/testCXXCompiler.cxx.o -o cmTC_796f0 +make[1]: Leaving directory '/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp' + + + +Detecting CXX compiler ABI info compiled with the following output: +Change Dir: /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp + +Run Build Command(s):/usr/bin/make cmTC_4df18/fast && /usr/bin/make -f CMakeFiles/cmTC_4df18.dir/build.make CMakeFiles/cmTC_4df18.dir/build +make[1]: Entering directory '/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o +/usr/bin/c++ -v -o CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.16/Modules/CMakeCXXCompilerABI.cpp +Using built-in specs. +COLLECT_GCC=/usr/bin/c++ +OFFLOAD_TARGET_NAMES=nvptx-none:hsa +OFFLOAD_TARGET_DEFAULT=1 +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-yTrUTS/gcc-9-9.4.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04) +COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' + /usr/lib/gcc/x86_64-linux-gnu/9/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE /usr/share/cmake-3.16/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpbase CMakeCXXCompilerABI.cpp -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccMjRFW5.s +GNU C++14 (Ubuntu 9.4.0-1ubuntu1~20.04) version 9.4.0 (x86_64-linux-gnu) + compiled by GNU C version 9.4.0, GMP version 6.2.0, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.22.1-GMP + +GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 +ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/9" +ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" +ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed" +ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/../../../../x86_64-linux-gnu/include" +#include "..." search starts here: +#include <...> search starts here: + /usr/include/c++/9 + /usr/include/x86_64-linux-gnu/c++/9 + /usr/include/c++/9/backward + /usr/lib/gcc/x86_64-linux-gnu/9/include + /usr/local/include + /usr/include/x86_64-linux-gnu + /usr/include +End of search list. +GNU C++14 (Ubuntu 9.4.0-1ubuntu1~20.04) version 9.4.0 (x86_64-linux-gnu) + compiled by GNU C version 9.4.0, GMP version 6.2.0, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.22.1-GMP + +GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 +Compiler executable checksum: de81ae2094cd619a4e4415514e80087d +COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' + as -v --64 -o CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccMjRFW5.s +GNU assembler version 2.34 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.34 +COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' +Linking CXX executable cmTC_4df18 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_4df18.dir/link.txt --verbose=1 +/usr/bin/c++ -v CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_4df18 +Using built-in specs. +COLLECT_GCC=/usr/bin/c++ +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper +OFFLOAD_TARGET_NAMES=nvptx-none:hsa +OFFLOAD_TARGET_DEFAULT=1 +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-yTrUTS/gcc-9-9.4.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04) +COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_4df18' '-shared-libgcc' '-mtune=generic' '-march=x86-64' + /usr/lib/gcc/x86_64-linux-gnu/9/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper -plugin-opt=-fresolution=/tmp/ccrhR308.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_4df18 /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/9/../../.. CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_4df18' '-shared-libgcc' '-mtune=generic' '-march=x86-64' +make[1]: Leaving directory '/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp' + + + +Parsed CXX implicit include dir info from above output: rv=done + found start of include info + found start of implicit include info + add: [/usr/include/c++/9] + add: [/usr/include/x86_64-linux-gnu/c++/9] + add: [/usr/include/c++/9/backward] + add: [/usr/lib/gcc/x86_64-linux-gnu/9/include] + add: [/usr/local/include] + add: [/usr/include/x86_64-linux-gnu] + add: [/usr/include] + end of search list found + collapse include dir [/usr/include/c++/9] ==> [/usr/include/c++/9] + collapse include dir [/usr/include/x86_64-linux-gnu/c++/9] ==> [/usr/include/x86_64-linux-gnu/c++/9] + collapse include dir [/usr/include/c++/9/backward] ==> [/usr/include/c++/9/backward] + collapse include dir [/usr/lib/gcc/x86_64-linux-gnu/9/include] ==> [/usr/lib/gcc/x86_64-linux-gnu/9/include] + collapse include dir [/usr/local/include] ==> [/usr/local/include] + collapse include dir [/usr/include/x86_64-linux-gnu] ==> [/usr/include/x86_64-linux-gnu] + collapse include dir [/usr/include] ==> [/usr/include] + implicit include dirs: [/usr/include/c++/9;/usr/include/x86_64-linux-gnu/c++/9;/usr/include/c++/9/backward;/usr/lib/gcc/x86_64-linux-gnu/9/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include] + + +Parsed CXX implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command(s):/usr/bin/make cmTC_4df18/fast && /usr/bin/make -f CMakeFiles/cmTC_4df18.dir/build.make CMakeFiles/cmTC_4df18.dir/build] + ignore line: [make[1]: Entering directory '/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/CMakeTmp'] + ignore line: [Building CXX object CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o] + ignore line: [/usr/bin/c++ -v -o CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.16/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:hsa] + ignore line: [OFFLOAD_TARGET_DEFAULT=1] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c ada c++ go brig d fortran objc obj-c++ gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-yTrUTS/gcc-9-9.4.0/debian/tmp-nvptx/usr hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] + ignore line: [Thread model: posix] + ignore line: [gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04) ] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] + ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/9/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE /usr/share/cmake-3.16/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpbase CMakeCXXCompilerABI.cpp -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccMjRFW5.s] + ignore line: [GNU C++14 (Ubuntu 9.4.0-1ubuntu1~20.04) version 9.4.0 (x86_64-linux-gnu)] + ignore line: [ compiled by GNU C version 9.4.0 GMP version 6.2.0 MPFR version 4.0.2 MPC version 1.1.0 isl version isl-0.22.1-GMP] + ignore line: [] + ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] + ignore line: [ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/9"] + ignore line: [ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/../../../../x86_64-linux-gnu/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /usr/include/c++/9] + ignore line: [ /usr/include/x86_64-linux-gnu/c++/9] + ignore line: [ /usr/include/c++/9/backward] + ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/9/include] + ignore line: [ /usr/local/include] + ignore line: [ /usr/include/x86_64-linux-gnu] + ignore line: [ /usr/include] + ignore line: [End of search list.] + ignore line: [GNU C++14 (Ubuntu 9.4.0-1ubuntu1~20.04) version 9.4.0 (x86_64-linux-gnu)] + ignore line: [ compiled by GNU C version 9.4.0 GMP version 6.2.0 MPFR version 4.0.2 MPC version 1.1.0 isl version isl-0.22.1-GMP] + ignore line: [] + ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] + ignore line: [Compiler executable checksum: de81ae2094cd619a4e4415514e80087d] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] + ignore line: [ as -v --64 -o CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccMjRFW5.s] + ignore line: [GNU assembler version 2.34 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.34] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] + ignore line: [Linking CXX executable cmTC_4df18] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_4df18.dir/link.txt --verbose=1] + ignore line: [/usr/bin/c++ -v CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_4df18 ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper] + ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:hsa] + ignore line: [OFFLOAD_TARGET_DEFAULT=1] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c ada c++ go brig d fortran objc obj-c++ gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-yTrUTS/gcc-9-9.4.0/debian/tmp-nvptx/usr hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] + ignore line: [Thread model: posix] + ignore line: [gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_4df18' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] + link line: [ /usr/lib/gcc/x86_64-linux-gnu/9/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper -plugin-opt=-fresolution=/tmp/ccrhR308.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_4df18 /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/9/../../.. CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/9/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/ccrhR308.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-pie] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTC_4df18] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-linux-gnu/9] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/9/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../..] + arg [CMakeFiles/cmTC_4df18.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-lstdc++] ==> lib [stdc++] + arg [-lm] ==> lib [m] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-lc] ==> lib [c] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [/usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o] ==> ignore + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9] ==> [/usr/lib/gcc/x86_64-linux-gnu/9] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../..] ==> [/usr/lib] + implicit libs: [stdc++;m;gcc_s;gcc;c;gcc_s;gcc] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/9;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + diff --git a/cmake-build-debug-wsl/CMakeFiles/Makefile.cmake b/cmake-build-debug-wsl/CMakeFiles/Makefile.cmake new file mode 100644 index 0000000..db60a83 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/Makefile.cmake @@ -0,0 +1,123 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.16 + +# The generator used is: +set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") + +# The top level Makefile was generated from the following files: +set(CMAKE_MAKEFILE_DEPENDS + "CMakeCache.txt" + "../CMakeLists.txt" + "CMakeFiles/3.16.3/CMakeCCompiler.cmake" + "CMakeFiles/3.16.3/CMakeCXXCompiler.cmake" + "CMakeFiles/3.16.3/CMakeSystem.cmake" + "/usr/share/cmake-3.16/Modules/CMakeCCompiler.cmake.in" + "/usr/share/cmake-3.16/Modules/CMakeCCompilerABI.c" + "/usr/share/cmake-3.16/Modules/CMakeCInformation.cmake" + "/usr/share/cmake-3.16/Modules/CMakeCXXCompiler.cmake.in" + "/usr/share/cmake-3.16/Modules/CMakeCXXCompilerABI.cpp" + "/usr/share/cmake-3.16/Modules/CMakeCXXInformation.cmake" + "/usr/share/cmake-3.16/Modules/CMakeCheckCompilerFlagCommonPatterns.cmake" + "/usr/share/cmake-3.16/Modules/CMakeCommonLanguageInclude.cmake" + "/usr/share/cmake-3.16/Modules/CMakeCompilerIdDetection.cmake" + "/usr/share/cmake-3.16/Modules/CMakeDetermineCCompiler.cmake" + "/usr/share/cmake-3.16/Modules/CMakeDetermineCXXCompiler.cmake" + "/usr/share/cmake-3.16/Modules/CMakeDetermineCompileFeatures.cmake" + "/usr/share/cmake-3.16/Modules/CMakeDetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/CMakeDetermineCompilerABI.cmake" + "/usr/share/cmake-3.16/Modules/CMakeDetermineCompilerId.cmake" + "/usr/share/cmake-3.16/Modules/CMakeDetermineSystem.cmake" + "/usr/share/cmake-3.16/Modules/CMakeExtraGeneratorDetermineCompilerMacrosAndIncludeDirs.cmake" + "/usr/share/cmake-3.16/Modules/CMakeFindBinUtils.cmake" + "/usr/share/cmake-3.16/Modules/CMakeFindCodeBlocks.cmake" + "/usr/share/cmake-3.16/Modules/CMakeGenericSystem.cmake" + "/usr/share/cmake-3.16/Modules/CMakeInitializeConfigs.cmake" + "/usr/share/cmake-3.16/Modules/CMakeLanguageInformation.cmake" + "/usr/share/cmake-3.16/Modules/CMakeParseImplicitIncludeInfo.cmake" + "/usr/share/cmake-3.16/Modules/CMakeParseImplicitLinkInfo.cmake" + "/usr/share/cmake-3.16/Modules/CMakeSystem.cmake.in" + "/usr/share/cmake-3.16/Modules/CMakeSystemSpecificInformation.cmake" + "/usr/share/cmake-3.16/Modules/CMakeSystemSpecificInitialize.cmake" + "/usr/share/cmake-3.16/Modules/CMakeTestCCompiler.cmake" + "/usr/share/cmake-3.16/Modules/CMakeTestCXXCompiler.cmake" + "/usr/share/cmake-3.16/Modules/CMakeTestCompilerCommon.cmake" + "/usr/share/cmake-3.16/Modules/CMakeUnixFindMake.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/ADSP-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/Borland-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/Clang-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/Cray-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/GHS-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/GNU-C.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/GNU-CXX.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/GNU-FindBinUtils.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/GNU.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/HP-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/IAR-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/Intel-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/MSVC-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/PGI-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/PathScale-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/SCO-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/TI-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/Watcom-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/XL-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.16/Modules/Internal/CMakeCheckCompilerFlag.cmake" + "/usr/share/cmake-3.16/Modules/Internal/FeatureTesting.cmake" + "/usr/share/cmake-3.16/Modules/Platform/Linux-Determine-CXX.cmake" + "/usr/share/cmake-3.16/Modules/Platform/Linux-GNU-C.cmake" + "/usr/share/cmake-3.16/Modules/Platform/Linux-GNU-CXX.cmake" + "/usr/share/cmake-3.16/Modules/Platform/Linux-GNU.cmake" + "/usr/share/cmake-3.16/Modules/Platform/Linux.cmake" + "/usr/share/cmake-3.16/Modules/Platform/UnixPaths.cmake" + "/usr/share/cmake-3.16/Modules/ProcessorCount.cmake" + ) + +# The corresponding makefile is: +set(CMAKE_MAKEFILE_OUTPUTS + "Makefile" + "CMakeFiles/cmake.check_cache" + ) + +# Byproducts of CMake generate step: +set(CMAKE_MAKEFILE_PRODUCTS + "CMakeFiles/3.16.3/CMakeSystem.cmake" + "CMakeFiles/3.16.3/CMakeCCompiler.cmake" + "CMakeFiles/3.16.3/CMakeCXXCompiler.cmake" + "CMakeFiles/3.16.3/CMakeCCompiler.cmake" + "CMakeFiles/3.16.3/CMakeCXXCompiler.cmake" + "CMakeFiles/CMakeDirectoryInformation.cmake" + ) + +# Dependency information for all targets: +set(CMAKE_DEPEND_INFO_FILES + "CMakeFiles/PhysicsFormula.dir/DependInfo.cmake" + ) diff --git a/cmake-build-debug-wsl/CMakeFiles/Makefile2 b/cmake-build-debug-wsl/CMakeFiles/Makefile2 new file mode 100644 index 0000000..5a39d40 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/Makefile2 @@ -0,0 +1,106 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.16 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/ryazur/src/PhysicsFormula + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl + +#============================================================================= +# Directory level rules for the build root directory + +# The main recursive "all" target. +all: CMakeFiles/PhysicsFormula.dir/all + +.PHONY : all + +# The main recursive "preinstall" target. +preinstall: + +.PHONY : preinstall + +# The main recursive "clean" target. +clean: CMakeFiles/PhysicsFormula.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/PhysicsFormula.dir + +# All Build rule for target. +CMakeFiles/PhysicsFormula.dir/all: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/depend + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 "Built target PhysicsFormula" +.PHONY : CMakeFiles/PhysicsFormula.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/PhysicsFormula.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles 18 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/PhysicsFormula.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles 0 +.PHONY : CMakeFiles/PhysicsFormula.dir/rule + +# Convenience name for target. +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/rule + +.PHONY : PhysicsFormula + +# clean rule for target. +CMakeFiles/PhysicsFormula.dir/clean: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/clean +.PHONY : CMakeFiles/PhysicsFormula.dir/clean + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Angle.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Angle.cpp.o new file mode 100644 index 0000000..b9ed9f5 Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Angle.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/CXX.includecache b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/CXX.includecache new file mode 100644 index 0000000..b0cb572 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/CXX.includecache @@ -0,0 +1,856 @@ +#IncludeRegexLine: ^[ ]*[#%][ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +/home/ryazur/src/PhysicsFormula/Angle.cpp +cmath +- +Angle.h +/home/ryazur/src/PhysicsFormula/Angle.h + +/home/ryazur/src/PhysicsFormula/Angle.h +Line.h +/home/ryazur/src/PhysicsFormula/Line.h +Plane.h +/home/ryazur/src/PhysicsFormula/Plane.h + +/home/ryazur/src/PhysicsFormula/AtomicPhysics.h +ElectricCharge.h +/home/ryazur/src/PhysicsFormula/ElectricCharge.h +PeriodicElements.h +/home/ryazur/src/PhysicsFormula/PeriodicElements.h + +/home/ryazur/src/PhysicsFormula/BinarySearchTree.h +list +- +functional +- +algorithm +- +iostream +- + +/home/ryazur/src/PhysicsFormula/Boundries.h +Point.h +/home/ryazur/src/PhysicsFormula/Point.h + +/home/ryazur/src/PhysicsFormula/Bounds.h + +/home/ryazur/src/PhysicsFormula/Circle.h +iostream +- +cmath +- + +/home/ryazur/src/PhysicsFormula/Circuits.h +iostream +- +ElectricCurrent.h +/home/ryazur/src/PhysicsFormula/ElectricCurrent.h + +/home/ryazur/src/PhysicsFormula/Cone.h +iostream +- +cmath +- + +/home/ryazur/src/PhysicsFormula/Convexhull.cpp +Convexhull.h +/home/ryazur/src/PhysicsFormula/Convexhull.h +GeoUtils.h +/home/ryazur/src/PhysicsFormula/GeoUtils.h +Distance.h +/home/ryazur/src/PhysicsFormula/Distance.h +Inclusion.h +/home/ryazur/src/PhysicsFormula/Inclusion.h +algorithm +- +list +- + +/home/ryazur/src/PhysicsFormula/Convexhull.h +vector +- +iostream +- +Point.h +/home/ryazur/src/PhysicsFormula/Point.h +Polygon.h +/home/ryazur/src/PhysicsFormula/Polygon.h +Polyhedron.h +/home/ryazur/src/PhysicsFormula/Polyhedron.h + +/home/ryazur/src/PhysicsFormula/Core.h +math.h +- + +/home/ryazur/src/PhysicsFormula/Cube.h +iostream +- +cmath +- + +/home/ryazur/src/PhysicsFormula/Cylinder.h +iostream +- + +/home/ryazur/src/PhysicsFormula/Distance.cpp +Distance.h +/home/ryazur/src/PhysicsFormula/Distance.h + +/home/ryazur/src/PhysicsFormula/Distance.h +Point.h +/home/ryazur/src/PhysicsFormula/Point.h +Line.h +/home/ryazur/src/PhysicsFormula/Line.h +Plane.h +/home/ryazur/src/PhysicsFormula/Plane.h + +/home/ryazur/src/PhysicsFormula/Drag.h +algorithm +- +iostream +- +Friction.h +/home/ryazur/src/PhysicsFormula/Friction.h +Vector2D.h +/home/ryazur/src/PhysicsFormula/Vector2D.h + +/home/ryazur/src/PhysicsFormula/ETL.h +iostream +- +fstream +- +cstdlib +- +utility +- +vector +- +cmath +- +MatrixND.h +/home/ryazur/src/PhysicsFormula/MatrixND.h + +/home/ryazur/src/PhysicsFormula/Elasticity.h +iostream +- +vector +- +cmath +- + +/home/ryazur/src/PhysicsFormula/ElectricCharge.h +iostream +- +vector +- +Vector2D.h +/home/ryazur/src/PhysicsFormula/Vector2D.h + +/home/ryazur/src/PhysicsFormula/ElectricCurrent.h +ElectricPotential.h +/home/ryazur/src/PhysicsFormula/ElectricPotential.h +iostream +- + +/home/ryazur/src/PhysicsFormula/ElectricPotential.h +Heat.h +/home/ryazur/src/PhysicsFormula/Heat.h +iostream +- + +/home/ryazur/src/PhysicsFormula/ElectroMagneticInduction.h +iostream +- +Magnetism.h +/home/ryazur/src/PhysicsFormula/Magnetism.h +string +- + +/home/ryazur/src/PhysicsFormula/ElectroMagneticWaves.h + +/home/ryazur/src/PhysicsFormula/Energy.h +iostream +- +Vector2D.h +/home/ryazur/src/PhysicsFormula/Vector2D.h +cmath +- + +/home/ryazur/src/PhysicsFormula/FluidDynamics.h +iostream +- +cmath +- + +/home/ryazur/src/PhysicsFormula/FluidStatics.h +iostream +- +Friction.h +/home/ryazur/src/PhysicsFormula/Friction.h + +/home/ryazur/src/PhysicsFormula/Forces.h +iostream +- +vector +- +Vector2D.h +/home/ryazur/src/PhysicsFormula/Vector2D.h + +/home/ryazur/src/PhysicsFormula/Friction.h +iostream +- +cmath +- + +/home/ryazur/src/PhysicsFormula/GeoUtils.cpp +GeoUtils.h +/home/ryazur/src/PhysicsFormula/GeoUtils.h +math.h +- +set +- +map +- +algorithm +- +list +- +Intersection.h +/home/ryazur/src/PhysicsFormula/Intersection.h + +/home/ryazur/src/PhysicsFormula/GeoUtils.h +vector +- +Intersection.h +/home/ryazur/src/PhysicsFormula/Intersection.h +Point.h +/home/ryazur/src/PhysicsFormula/Point.h +Line.h +/home/ryazur/src/PhysicsFormula/Line.h +Plane.h +/home/ryazur/src/PhysicsFormula/Plane.h +Segment.h +/home/ryazur/src/PhysicsFormula/Segment.h +Polygon.h +/home/ryazur/src/PhysicsFormula/Polygon.h +Polyhedron.h +/home/ryazur/src/PhysicsFormula/Polyhedron.h +PolygonDCEL.h +/home/ryazur/src/PhysicsFormula/PolygonDCEL.h + +/home/ryazur/src/PhysicsFormula/GeometricOptics.h +map +- +iostream +- + +/home/ryazur/src/PhysicsFormula/Hearing.h +Waves.h +/home/ryazur/src/PhysicsFormula/Waves.h +iostream +- + +/home/ryazur/src/PhysicsFormula/Heat.h +iostream +- +string +- +vector +- +cmath +- +Temperature.h +/home/ryazur/src/PhysicsFormula/Temperature.h + +/home/ryazur/src/PhysicsFormula/Inclusion.cpp +Inclusion.h +/home/ryazur/src/PhysicsFormula/Inclusion.h + +/home/ryazur/src/PhysicsFormula/Inclusion.h +Point.h +/home/ryazur/src/PhysicsFormula/Point.h + +/home/ryazur/src/PhysicsFormula/Intersection.cpp +Core.h +/home/ryazur/src/PhysicsFormula/Core.h +Intersection.h +/home/ryazur/src/PhysicsFormula/Intersection.h +GeoUtils.h +/home/ryazur/src/PhysicsFormula/GeoUtils.h + +/home/ryazur/src/PhysicsFormula/Intersection.h +Point.h +/home/ryazur/src/PhysicsFormula/Point.h +Line.h +/home/ryazur/src/PhysicsFormula/Line.h +Plane.h +/home/ryazur/src/PhysicsFormula/Plane.h +Segment.h +/home/ryazur/src/PhysicsFormula/Segment.h +Polygon.h +/home/ryazur/src/PhysicsFormula/Polygon.h +Polyhedron.h +/home/ryazur/src/PhysicsFormula/Polyhedron.h + +/home/ryazur/src/PhysicsFormula/KDTree.cpp +KDTree.h +/home/ryazur/src/PhysicsFormula/KDTree.h + +/home/ryazur/src/PhysicsFormula/KDTree.h +Core.h +/home/ryazur/src/PhysicsFormula/Core.h +Vector.h +/home/ryazur/src/PhysicsFormula/Vector.h +Point.h +/home/ryazur/src/PhysicsFormula/Point.h +list +- +vector +- +algorithm +- + +/home/ryazur/src/PhysicsFormula/Kinematics.h +VectorND.h +/home/ryazur/src/PhysicsFormula/VectorND.h +iostream +- +string +- +vector +- + +/home/ryazur/src/PhysicsFormula/Line.cpp +Line.h +/home/ryazur/src/PhysicsFormula/Line.h + +/home/ryazur/src/PhysicsFormula/Line.h +Vector.h +/home/ryazur/src/PhysicsFormula/Vector.h +Point.h +/home/ryazur/src/PhysicsFormula/Point.h + +/home/ryazur/src/PhysicsFormula/LinearAlgebra.h + +/home/ryazur/src/PhysicsFormula/LinearRegression.h +iostream +- +ETL.h +/home/ryazur/src/PhysicsFormula/ETL.h + +/home/ryazur/src/PhysicsFormula/LogisticRegression.h +LinearRegression.h +/home/ryazur/src/PhysicsFormula/LinearRegression.h +list +- +iostream +- + +/home/ryazur/src/PhysicsFormula/Magnetism.h +ElectricCurrent.h +/home/ryazur/src/PhysicsFormula/ElectricCurrent.h + +/home/ryazur/src/PhysicsFormula/MathFx.h +cmath +- + +/home/ryazur/src/PhysicsFormula/MatrixND.h +algorithm +- +cstddef +- +cassert +- +vector +- +iostream +- +iomanip +- +cstdlib +- +ctime +- +random +- +VectorND.h +/home/ryazur/src/PhysicsFormula/VectorND.h + +/home/ryazur/src/PhysicsFormula/Momentum.h +iostream +- +cmath +- +vector +- +VectorND.h +/home/ryazur/src/PhysicsFormula/VectorND.h + +/home/ryazur/src/PhysicsFormula/MonotonePartition.cpp +MonotonePartition.h +/home/ryazur/src/PhysicsFormula/MonotonePartition.h +set +- +map +- +algorithm +- + +/home/ryazur/src/PhysicsFormula/MonotonePartition.h +vector +- +Vector.h +/home/ryazur/src/PhysicsFormula/Vector.h +PolygonDCEL.h +/home/ryazur/src/PhysicsFormula/PolygonDCEL.h +GeoUtils.h +/home/ryazur/src/PhysicsFormula/GeoUtils.h + +/home/ryazur/src/PhysicsFormula/Parallelogram.h +cassert +- +iostream +- +cmath +- + +/home/ryazur/src/PhysicsFormula/PeriodicElements.h +cmath +- + +/home/ryazur/src/PhysicsFormula/Physics_World.h +iostream +- +Testing.h +/home/ryazur/src/PhysicsFormula/Testing.h +StringHelper.h +/home/ryazur/src/PhysicsFormula/StringHelper.h +RegexHelper.h +/home/ryazur/src/PhysicsFormula/RegexHelper.h +AtomicPhysics.h +/home/ryazur/src/PhysicsFormula/AtomicPhysics.h +TemplateBST.h +/home/ryazur/src/PhysicsFormula/TemplateBST.h +Circuits.h +/home/ryazur/src/PhysicsFormula/Circuits.h +Cone.h +/home/ryazur/src/PhysicsFormula/Cone.h +Cylinder.h +/home/ryazur/src/PhysicsFormula/Cylinder.h +Cube.h +/home/ryazur/src/PhysicsFormula/Cube.h +Drag.h +/home/ryazur/src/PhysicsFormula/Drag.h +Forces.h +/home/ryazur/src/PhysicsFormula/Forces.h +Elasticity.h +/home/ryazur/src/PhysicsFormula/Elasticity.h +ElectroMagneticInduction.h +/home/ryazur/src/PhysicsFormula/ElectroMagneticInduction.h +ElectroMagneticWaves.h +/home/ryazur/src/PhysicsFormula/ElectroMagneticWaves.h +FluidStatics.h +/home/ryazur/src/PhysicsFormula/FluidStatics.h +Hearing.h +/home/ryazur/src/PhysicsFormula/Hearing.h +Kinematics.h +/home/ryazur/src/PhysicsFormula/Kinematics.h +LinearAlgebra.h +/home/ryazur/src/PhysicsFormula/LinearAlgebra.h +LogisticRegression.h +/home/ryazur/src/PhysicsFormula/LogisticRegression.h +MathFx.h +/home/ryazur/src/PhysicsFormula/MathFx.h +Momentum.h +/home/ryazur/src/PhysicsFormula/Momentum.h +Parallelogram.h +/home/ryazur/src/PhysicsFormula/Parallelogram.h +PeriodicElements.h +/home/ryazur/src/PhysicsFormula/PeriodicElements.h +Point2D.h +/home/ryazur/src/PhysicsFormula/Point2D.h +Pyramid.h +/home/ryazur/src/PhysicsFormula/Pyramid.h +RandomNumbers.h +/home/ryazur/src/PhysicsFormula/RandomNumbers.h +Rectangle.h +/home/ryazur/src/PhysicsFormula/Rectangle.h +RectangularPrism.h +/home/ryazur/src/PhysicsFormula/RectangularPrism.h +RotationalMotion.h +/home/ryazur/src/PhysicsFormula/RotationalMotion.h +Sphere.h +/home/ryazur/src/PhysicsFormula/Sphere.h +Statics.h +/home/ryazur/src/PhysicsFormula/Statics.h +templateGraph.h +/home/ryazur/src/PhysicsFormula/templateGraph.h +Thermodynamics.h +/home/ryazur/src/PhysicsFormula/Thermodynamics.h +Torque.h +/home/ryazur/src/PhysicsFormula/Torque.h +TransitiveClosure.h +/home/ryazur/src/PhysicsFormula/TransitiveClosure.h +TriangleSolver.h +/home/ryazur/src/PhysicsFormula/TriangleSolver.h +Vector.h +/home/ryazur/src/PhysicsFormula/Vector.h +VisionOpticalInstruments.h +/home/ryazur/src/PhysicsFormula/VisionOpticalInstruments.h +Square.h +/home/ryazur/src/PhysicsFormula/Square.h +QuantumPhysics.h +/home/ryazur/src/PhysicsFormula/QuantumPhysics.h + +/home/ryazur/src/PhysicsFormula/Plane.h +Vector.h +/home/ryazur/src/PhysicsFormula/Vector.h +Point.h +/home/ryazur/src/PhysicsFormula/Point.h +iostream +- + +/home/ryazur/src/PhysicsFormula/Point.cpp +Point.h +/home/ryazur/src/PhysicsFormula/Point.h + +/home/ryazur/src/PhysicsFormula/Point.h +Vector.h +/home/ryazur/src/PhysicsFormula/Vector.h +float.h +- + +/home/ryazur/src/PhysicsFormula/Point2D.h +Vector2D.h +/home/ryazur/src/PhysicsFormula/Vector2D.h +iostream +- + +/home/ryazur/src/PhysicsFormula/Polygon.cpp +Polygon.h +/home/ryazur/src/PhysicsFormula/Polygon.h +GeoUtils.h +/home/ryazur/src/PhysicsFormula/GeoUtils.h + +/home/ryazur/src/PhysicsFormula/Polygon.h +vector +- +Point.h +/home/ryazur/src/PhysicsFormula/Point.h + +/home/ryazur/src/PhysicsFormula/PolygonDCEL.h +vector +- +iostream +- +Point.h +/home/ryazur/src/PhysicsFormula/Point.h + +/home/ryazur/src/PhysicsFormula/Polyhedron.h +vector +- +Polygon.h +/home/ryazur/src/PhysicsFormula/Polygon.h +Plane.h +/home/ryazur/src/PhysicsFormula/Plane.h + +/home/ryazur/src/PhysicsFormula/Pyramid.h +iostream +- +cmath +- + +/home/ryazur/src/PhysicsFormula/QuadTree.cpp +QuadTree.h +/home/ryazur/src/PhysicsFormula/QuadTree.h + +/home/ryazur/src/PhysicsFormula/QuadTree.h +Point.h +/home/ryazur/src/PhysicsFormula/Point.h +Segment.h +/home/ryazur/src/PhysicsFormula/Segment.h +Boundries.h +/home/ryazur/src/PhysicsFormula/Boundries.h +vector +- + +/home/ryazur/src/PhysicsFormula/QuantumPhysics.h +SpecialRelativity.h +/home/ryazur/src/PhysicsFormula/SpecialRelativity.h +iostream +- + +/home/ryazur/src/PhysicsFormula/RandomNumbers.h +functional +- +iomanip +- +random +- +iostream +- +algorithm +- +random +- + +/home/ryazur/src/PhysicsFormula/Rectangle.h +iostream +- + +/home/ryazur/src/PhysicsFormula/RectangularPrism.h +iostream +- + +/home/ryazur/src/PhysicsFormula/RegexHelper.h +iomanip +- +regex +- + +/home/ryazur/src/PhysicsFormula/RotationalMotion.h +UniformCircularMotion.h +/home/ryazur/src/PhysicsFormula/UniformCircularMotion.h + +/home/ryazur/src/PhysicsFormula/RunTimer.h +chrono +- +iostream +- + +/home/ryazur/src/PhysicsFormula/Segment.h +Point.h +/home/ryazur/src/PhysicsFormula/Point.h + +/home/ryazur/src/PhysicsFormula/SpecialRelativity.h +iostream +- + +/home/ryazur/src/PhysicsFormula/Sphere.h +iostream +- + +/home/ryazur/src/PhysicsFormula/Square.h +iostream +- + +/home/ryazur/src/PhysicsFormula/Statics.h + +/home/ryazur/src/PhysicsFormula/StringHelper.h +iostream +- +string +- +algorithm +- + +/home/ryazur/src/PhysicsFormula/Temperature.h +iostream +- + +/home/ryazur/src/PhysicsFormula/TemplateBST.h +iomanip +- +iostream +- +queue +- + +/home/ryazur/src/PhysicsFormula/Testing.h +iostream +- +any +- +chrono +- +iomanip +- +cmath +- +set +- + +/home/ryazur/src/PhysicsFormula/Thermodynamics.h +Heat.h +/home/ryazur/src/PhysicsFormula/Heat.h +Energy.h +/home/ryazur/src/PhysicsFormula/Energy.h + +/home/ryazur/src/PhysicsFormula/Torque.h +VectorND.h +/home/ryazur/src/PhysicsFormula/VectorND.h + +/home/ryazur/src/PhysicsFormula/TransitiveClosure.h +cstdio +- +cstring +- +iostream +- +list +- + +/home/ryazur/src/PhysicsFormula/TriangleSolver.h +cmath +- +string +- +utility +- +iostream +- +vector +- +algorithm +- +Vector2D.h +/home/ryazur/src/PhysicsFormula/Vector2D.h + +/home/ryazur/src/PhysicsFormula/Triangulation.cpp +Triangulation.h +/home/ryazur/src/PhysicsFormula/Triangulation.h +algorithm +- +stack +- +map +- +GeoUtils.h +/home/ryazur/src/PhysicsFormula/GeoUtils.h + +/home/ryazur/src/PhysicsFormula/Triangulation.h +vector +- +iostream +- +Point.h +/home/ryazur/src/PhysicsFormula/Point.h +PolygonDCEL.h +/home/ryazur/src/PhysicsFormula/PolygonDCEL.h +MonotonePartition.h +/home/ryazur/src/PhysicsFormula/MonotonePartition.h + +/home/ryazur/src/PhysicsFormula/UniformCircularMotion.h +cmath +- +VectorND.h +/home/ryazur/src/PhysicsFormula/VectorND.h +Circle.h +/home/ryazur/src/PhysicsFormula/Circle.h + +/home/ryazur/src/PhysicsFormula/Vector.cpp +Vector.h +/home/ryazur/src/PhysicsFormula/Vector.h + +/home/ryazur/src/PhysicsFormula/Vector.h +array +- +iostream +- +Core.h +/home/ryazur/src/PhysicsFormula/Core.h +float.h +- + +/home/ryazur/src/PhysicsFormula/Vector2D.h +iostream +- +iomanip +- +cmath +- +complex +- +cassert +- + +/home/ryazur/src/PhysicsFormula/Vector3D.h +Vector2D.h +/home/ryazur/src/PhysicsFormula/Vector2D.h + +/home/ryazur/src/PhysicsFormula/VectorND.h +cstdarg +- +cmath +- +iostream +- +vector +- +Vector3D.h +/home/ryazur/src/PhysicsFormula/Vector3D.h + +/home/ryazur/src/PhysicsFormula/VisionOpticalInstruments.h +WaveOptics.h +/home/ryazur/src/PhysicsFormula/WaveOptics.h + +/home/ryazur/src/PhysicsFormula/Voronoi.cpp +Voronoi.h +/home/ryazur/src/PhysicsFormula/Voronoi.h +algorithm +- +queue +- +list +- +iterator +- +Line.h +/home/ryazur/src/PhysicsFormula/Line.h +Segment.h +/home/ryazur/src/PhysicsFormula/Segment.h +Intersection.h +/home/ryazur/src/PhysicsFormula/Intersection.h +Distance.h +/home/ryazur/src/PhysicsFormula/Distance.h + +/home/ryazur/src/PhysicsFormula/Voronoi.h +vector +- +Point.h +/home/ryazur/src/PhysicsFormula/Point.h +Polygon.h +/home/ryazur/src/PhysicsFormula/Polygon.h +Bounds.h +/home/ryazur/src/PhysicsFormula/Bounds.h + +/home/ryazur/src/PhysicsFormula/WaveOptics.h +GeometricOptics.h +/home/ryazur/src/PhysicsFormula/GeometricOptics.h +cmath +- +iostream +- + +/home/ryazur/src/PhysicsFormula/Waves.h +iostream +- +Elasticity.h +/home/ryazur/src/PhysicsFormula/Elasticity.h +Energy.h +/home/ryazur/src/PhysicsFormula/Energy.h +FluidDynamics.h +/home/ryazur/src/PhysicsFormula/FluidDynamics.h + +/home/ryazur/src/PhysicsFormula/templateGraph.cpp +templateGraph.h +/home/ryazur/src/PhysicsFormula/templateGraph.h + +/home/ryazur/src/PhysicsFormula/templateGraph.h + +/home/ryazur/src/PhysicsFormula/testFactore.cpp +Physics_World.h +/home/ryazur/src/PhysicsFormula/Physics_World.h +GeoUtils.h +/home/ryazur/src/PhysicsFormula/GeoUtils.h +RunTimer.h +/home/ryazur/src/PhysicsFormula/RunTimer.h +BinarySearchTree.h +/home/ryazur/src/PhysicsFormula/BinarySearchTree.h + diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o new file mode 100644 index 0000000..999f6d5 Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/DependInfo.cmake b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/DependInfo.cmake new file mode 100644 index 0000000..828d6a2 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/DependInfo.cmake @@ -0,0 +1,36 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/ryazur/src/PhysicsFormula/Angle.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Angle.cpp.o" + "/home/ryazur/src/PhysicsFormula/Convexhull.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o" + "/home/ryazur/src/PhysicsFormula/Distance.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Distance.cpp.o" + "/home/ryazur/src/PhysicsFormula/GeoUtils.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o" + "/home/ryazur/src/PhysicsFormula/Inclusion.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o" + "/home/ryazur/src/PhysicsFormula/Intersection.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o" + "/home/ryazur/src/PhysicsFormula/KDTree.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o" + "/home/ryazur/src/PhysicsFormula/Line.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Line.cpp.o" + "/home/ryazur/src/PhysicsFormula/MonotonePartition.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o" + "/home/ryazur/src/PhysicsFormula/Point.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Point.cpp.o" + "/home/ryazur/src/PhysicsFormula/Polygon.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o" + "/home/ryazur/src/PhysicsFormula/QuadTree.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o" + "/home/ryazur/src/PhysicsFormula/Triangulation.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o" + "/home/ryazur/src/PhysicsFormula/Vector.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Vector.cpp.o" + "/home/ryazur/src/PhysicsFormula/Voronoi.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o" + "/home/ryazur/src/PhysicsFormula/templateGraph.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o" + "/home/ryazur/src/PhysicsFormula/testFactore.cpp" "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Distance.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Distance.cpp.o new file mode 100644 index 0000000..f0e1721 Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Distance.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o new file mode 100644 index 0000000..5145abc Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o new file mode 100644 index 0000000..6c2d9e6 Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o new file mode 100644 index 0000000..3d74535 Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o new file mode 100644 index 0000000..7846d87 Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Line.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Line.cpp.o new file mode 100644 index 0000000..cf76ff7 Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Line.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o new file mode 100644 index 0000000..51dc337 Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Point.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Point.cpp.o new file mode 100644 index 0000000..d33f5a4 Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Point.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o new file mode 100644 index 0000000..57033b8 Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o new file mode 100644 index 0000000..e27fc22 Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o new file mode 100644 index 0000000..9d7d1c1 Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Vector.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Vector.cpp.o new file mode 100644 index 0000000..635083e Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Vector.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o new file mode 100644 index 0000000..8f23fbe Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/build.make b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/build.make new file mode 100644 index 0000000..b5bc719 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/build.make @@ -0,0 +1,338 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.16 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/ryazur/src/PhysicsFormula + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl + +# Include any dependencies generated for this target. +include CMakeFiles/PhysicsFormula.dir/depend.make + +# Include the progress variables for this target. +include CMakeFiles/PhysicsFormula.dir/progress.make + +# Include the compile flags for this target's objects. +include CMakeFiles/PhysicsFormula.dir/flags.make + +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../testFactore.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o -c /home/ryazur/src/PhysicsFormula/testFactore.cpp + +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/testFactore.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/testFactore.cpp > CMakeFiles/PhysicsFormula.dir/testFactore.cpp.i + +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/testFactore.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/testFactore.cpp -o CMakeFiles/PhysicsFormula.dir/testFactore.cpp.s + +CMakeFiles/PhysicsFormula.dir/Angle.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/Angle.cpp.o: ../Angle.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object CMakeFiles/PhysicsFormula.dir/Angle.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/Angle.cpp.o -c /home/ryazur/src/PhysicsFormula/Angle.cpp + +CMakeFiles/PhysicsFormula.dir/Angle.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/Angle.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/Angle.cpp > CMakeFiles/PhysicsFormula.dir/Angle.cpp.i + +CMakeFiles/PhysicsFormula.dir/Angle.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/Angle.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/Angle.cpp -o CMakeFiles/PhysicsFormula.dir/Angle.cpp.s + +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../Convexhull.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o -c /home/ryazur/src/PhysicsFormula/Convexhull.cpp + +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/Convexhull.cpp > CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.i + +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/Convexhull.cpp -o CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.s + +CMakeFiles/PhysicsFormula.dir/Distance.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/Distance.cpp.o: ../Distance.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object CMakeFiles/PhysicsFormula.dir/Distance.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/Distance.cpp.o -c /home/ryazur/src/PhysicsFormula/Distance.cpp + +CMakeFiles/PhysicsFormula.dir/Distance.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/Distance.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/Distance.cpp > CMakeFiles/PhysicsFormula.dir/Distance.cpp.i + +CMakeFiles/PhysicsFormula.dir/Distance.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/Distance.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/Distance.cpp -o CMakeFiles/PhysicsFormula.dir/Distance.cpp.s + +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o: ../GeoUtils.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o -c /home/ryazur/src/PhysicsFormula/GeoUtils.cpp + +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/GeoUtils.cpp > CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.i + +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/GeoUtils.cpp -o CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.s + +CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o: ../Inclusion.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o -c /home/ryazur/src/PhysicsFormula/Inclusion.cpp + +CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/Inclusion.cpp > CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.i + +CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/Inclusion.cpp -o CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.s + +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o: ../Intersection.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o -c /home/ryazur/src/PhysicsFormula/Intersection.cpp + +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/Intersection.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/Intersection.cpp > CMakeFiles/PhysicsFormula.dir/Intersection.cpp.i + +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/Intersection.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/Intersection.cpp -o CMakeFiles/PhysicsFormula.dir/Intersection.cpp.s + +CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o: ../KDTree.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building CXX object CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o -c /home/ryazur/src/PhysicsFormula/KDTree.cpp + +CMakeFiles/PhysicsFormula.dir/KDTree.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/KDTree.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/KDTree.cpp > CMakeFiles/PhysicsFormula.dir/KDTree.cpp.i + +CMakeFiles/PhysicsFormula.dir/KDTree.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/KDTree.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/KDTree.cpp -o CMakeFiles/PhysicsFormula.dir/KDTree.cpp.s + +CMakeFiles/PhysicsFormula.dir/Line.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/Line.cpp.o: ../Line.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building CXX object CMakeFiles/PhysicsFormula.dir/Line.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/Line.cpp.o -c /home/ryazur/src/PhysicsFormula/Line.cpp + +CMakeFiles/PhysicsFormula.dir/Line.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/Line.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/Line.cpp > CMakeFiles/PhysicsFormula.dir/Line.cpp.i + +CMakeFiles/PhysicsFormula.dir/Line.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/Line.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/Line.cpp -o CMakeFiles/PhysicsFormula.dir/Line.cpp.s + +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o: ../MonotonePartition.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building CXX object CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o -c /home/ryazur/src/PhysicsFormula/MonotonePartition.cpp + +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/MonotonePartition.cpp > CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.i + +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/MonotonePartition.cpp -o CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.s + +CMakeFiles/PhysicsFormula.dir/Point.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/Point.cpp.o: ../Point.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Building CXX object CMakeFiles/PhysicsFormula.dir/Point.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/Point.cpp.o -c /home/ryazur/src/PhysicsFormula/Point.cpp + +CMakeFiles/PhysicsFormula.dir/Point.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/Point.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/Point.cpp > CMakeFiles/PhysicsFormula.dir/Point.cpp.i + +CMakeFiles/PhysicsFormula.dir/Point.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/Point.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/Point.cpp -o CMakeFiles/PhysicsFormula.dir/Point.cpp.s + +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o: ../Polygon.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Building CXX object CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o -c /home/ryazur/src/PhysicsFormula/Polygon.cpp + +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/Polygon.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/Polygon.cpp > CMakeFiles/PhysicsFormula.dir/Polygon.cpp.i + +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/Polygon.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/Polygon.cpp -o CMakeFiles/PhysicsFormula.dir/Polygon.cpp.s + +CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o: ../QuadTree.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_13) "Building CXX object CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o -c /home/ryazur/src/PhysicsFormula/QuadTree.cpp + +CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/QuadTree.cpp > CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.i + +CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/QuadTree.cpp -o CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.s + +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: ../Triangulation.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_14) "Building CXX object CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o -c /home/ryazur/src/PhysicsFormula/Triangulation.cpp + +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/Triangulation.cpp > CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.i + +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/Triangulation.cpp -o CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.s + +CMakeFiles/PhysicsFormula.dir/Vector.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/Vector.cpp.o: ../Vector.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_15) "Building CXX object CMakeFiles/PhysicsFormula.dir/Vector.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/Vector.cpp.o -c /home/ryazur/src/PhysicsFormula/Vector.cpp + +CMakeFiles/PhysicsFormula.dir/Vector.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/Vector.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/Vector.cpp > CMakeFiles/PhysicsFormula.dir/Vector.cpp.i + +CMakeFiles/PhysicsFormula.dir/Vector.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/Vector.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/Vector.cpp -o CMakeFiles/PhysicsFormula.dir/Vector.cpp.s + +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o: ../Voronoi.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_16) "Building CXX object CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o -c /home/ryazur/src/PhysicsFormula/Voronoi.cpp + +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/Voronoi.cpp > CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.i + +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/Voronoi.cpp -o CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.s + +CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o: CMakeFiles/PhysicsFormula.dir/flags.make +CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o: ../templateGraph.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_17) "Building CXX object CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o -c /home/ryazur/src/PhysicsFormula/templateGraph.cpp + +CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ryazur/src/PhysicsFormula/templateGraph.cpp > CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.i + +CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ryazur/src/PhysicsFormula/templateGraph.cpp -o CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.s + +# Object files for target PhysicsFormula +PhysicsFormula_OBJECTS = \ +"CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/Angle.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/Distance.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/Line.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/Point.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/Vector.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o" \ +"CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o" + +# External object files for target PhysicsFormula +PhysicsFormula_EXTERNAL_OBJECTS = + +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/Angle.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/Distance.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/Line.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/Point.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/Vector.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/build.make +PhysicsFormula: CMakeFiles/PhysicsFormula.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles --progress-num=$(CMAKE_PROGRESS_18) "Linking CXX executable PhysicsFormula" + $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/PhysicsFormula.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +CMakeFiles/PhysicsFormula.dir/build: PhysicsFormula + +.PHONY : CMakeFiles/PhysicsFormula.dir/build + +CMakeFiles/PhysicsFormula.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/PhysicsFormula.dir/cmake_clean.cmake +.PHONY : CMakeFiles/PhysicsFormula.dir/clean + +CMakeFiles/PhysicsFormula.dir/depend: + cd /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/ryazur/src/PhysicsFormula /home/ryazur/src/PhysicsFormula /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/PhysicsFormula.dir/depend + diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/cmake_clean.cmake b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/cmake_clean.cmake new file mode 100644 index 0000000..30a081d --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/cmake_clean.cmake @@ -0,0 +1,26 @@ +file(REMOVE_RECURSE + "CMakeFiles/PhysicsFormula.dir/Angle.cpp.o" + "CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o" + "CMakeFiles/PhysicsFormula.dir/Distance.cpp.o" + "CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o" + "CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o" + "CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o" + "CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o" + "CMakeFiles/PhysicsFormula.dir/Line.cpp.o" + "CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o" + "CMakeFiles/PhysicsFormula.dir/Point.cpp.o" + "CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o" + "CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o" + "CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o" + "CMakeFiles/PhysicsFormula.dir/Vector.cpp.o" + "CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o" + "CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o" + "CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o" + "PhysicsFormula" + "PhysicsFormula.pdb" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/PhysicsFormula.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/depend.internal b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/depend.internal new file mode 100644 index 0000000..d1afc26 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/depend.internal @@ -0,0 +1,231 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.16 + +CMakeFiles/PhysicsFormula.dir/Angle.cpp.o + /home/ryazur/src/PhysicsFormula/Angle.cpp + /home/ryazur/src/PhysicsFormula/Angle.h + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/Line.h + /home/ryazur/src/PhysicsFormula/Plane.h + /home/ryazur/src/PhysicsFormula/Point.h + /home/ryazur/src/PhysicsFormula/Vector.h +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o + /home/ryazur/src/PhysicsFormula/Convexhull.cpp + /home/ryazur/src/PhysicsFormula/Convexhull.h + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/Distance.h + /home/ryazur/src/PhysicsFormula/GeoUtils.h + /home/ryazur/src/PhysicsFormula/Inclusion.h + /home/ryazur/src/PhysicsFormula/Intersection.h + /home/ryazur/src/PhysicsFormula/Line.h + /home/ryazur/src/PhysicsFormula/Plane.h + /home/ryazur/src/PhysicsFormula/Point.h + /home/ryazur/src/PhysicsFormula/Polygon.h + /home/ryazur/src/PhysicsFormula/PolygonDCEL.h + /home/ryazur/src/PhysicsFormula/Polyhedron.h + /home/ryazur/src/PhysicsFormula/Segment.h + /home/ryazur/src/PhysicsFormula/Vector.h +CMakeFiles/PhysicsFormula.dir/Distance.cpp.o + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/Distance.cpp + /home/ryazur/src/PhysicsFormula/Distance.h + /home/ryazur/src/PhysicsFormula/Line.h + /home/ryazur/src/PhysicsFormula/Plane.h + /home/ryazur/src/PhysicsFormula/Point.h + /home/ryazur/src/PhysicsFormula/Vector.h +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/GeoUtils.cpp + /home/ryazur/src/PhysicsFormula/GeoUtils.h + /home/ryazur/src/PhysicsFormula/Intersection.h + /home/ryazur/src/PhysicsFormula/Line.h + /home/ryazur/src/PhysicsFormula/Plane.h + /home/ryazur/src/PhysicsFormula/Point.h + /home/ryazur/src/PhysicsFormula/Polygon.h + /home/ryazur/src/PhysicsFormula/PolygonDCEL.h + /home/ryazur/src/PhysicsFormula/Polyhedron.h + /home/ryazur/src/PhysicsFormula/Segment.h + /home/ryazur/src/PhysicsFormula/Vector.h +CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/Inclusion.cpp + /home/ryazur/src/PhysicsFormula/Inclusion.h + /home/ryazur/src/PhysicsFormula/Point.h + /home/ryazur/src/PhysicsFormula/Vector.h +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/GeoUtils.h + /home/ryazur/src/PhysicsFormula/Intersection.cpp + /home/ryazur/src/PhysicsFormula/Intersection.h + /home/ryazur/src/PhysicsFormula/Line.h + /home/ryazur/src/PhysicsFormula/Plane.h + /home/ryazur/src/PhysicsFormula/Point.h + /home/ryazur/src/PhysicsFormula/Polygon.h + /home/ryazur/src/PhysicsFormula/PolygonDCEL.h + /home/ryazur/src/PhysicsFormula/Polyhedron.h + /home/ryazur/src/PhysicsFormula/Segment.h + /home/ryazur/src/PhysicsFormula/Vector.h +CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/KDTree.cpp + /home/ryazur/src/PhysicsFormula/KDTree.h + /home/ryazur/src/PhysicsFormula/Point.h + /home/ryazur/src/PhysicsFormula/Vector.h +CMakeFiles/PhysicsFormula.dir/Line.cpp.o + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/Line.cpp + /home/ryazur/src/PhysicsFormula/Line.h + /home/ryazur/src/PhysicsFormula/Point.h + /home/ryazur/src/PhysicsFormula/Vector.h +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/GeoUtils.h + /home/ryazur/src/PhysicsFormula/Intersection.h + /home/ryazur/src/PhysicsFormula/Line.h + /home/ryazur/src/PhysicsFormula/MonotonePartition.cpp + /home/ryazur/src/PhysicsFormula/MonotonePartition.h + /home/ryazur/src/PhysicsFormula/Plane.h + /home/ryazur/src/PhysicsFormula/Point.h + /home/ryazur/src/PhysicsFormula/Polygon.h + /home/ryazur/src/PhysicsFormula/PolygonDCEL.h + /home/ryazur/src/PhysicsFormula/Polyhedron.h + /home/ryazur/src/PhysicsFormula/Segment.h + /home/ryazur/src/PhysicsFormula/Vector.h +CMakeFiles/PhysicsFormula.dir/Point.cpp.o + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/Point.cpp + /home/ryazur/src/PhysicsFormula/Point.h + /home/ryazur/src/PhysicsFormula/Vector.h +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/GeoUtils.h + /home/ryazur/src/PhysicsFormula/Intersection.h + /home/ryazur/src/PhysicsFormula/Line.h + /home/ryazur/src/PhysicsFormula/Plane.h + /home/ryazur/src/PhysicsFormula/Point.h + /home/ryazur/src/PhysicsFormula/Polygon.cpp + /home/ryazur/src/PhysicsFormula/Polygon.h + /home/ryazur/src/PhysicsFormula/PolygonDCEL.h + /home/ryazur/src/PhysicsFormula/Polyhedron.h + /home/ryazur/src/PhysicsFormula/Segment.h + /home/ryazur/src/PhysicsFormula/Vector.h +CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o + /home/ryazur/src/PhysicsFormula/Boundries.h + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/Point.h + /home/ryazur/src/PhysicsFormula/QuadTree.cpp + /home/ryazur/src/PhysicsFormula/QuadTree.h + /home/ryazur/src/PhysicsFormula/Segment.h + /home/ryazur/src/PhysicsFormula/Vector.h +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/GeoUtils.h + /home/ryazur/src/PhysicsFormula/Intersection.h + /home/ryazur/src/PhysicsFormula/Line.h + /home/ryazur/src/PhysicsFormula/MonotonePartition.h + /home/ryazur/src/PhysicsFormula/Plane.h + /home/ryazur/src/PhysicsFormula/Point.h + /home/ryazur/src/PhysicsFormula/Polygon.h + /home/ryazur/src/PhysicsFormula/PolygonDCEL.h + /home/ryazur/src/PhysicsFormula/Polyhedron.h + /home/ryazur/src/PhysicsFormula/Segment.h + /home/ryazur/src/PhysicsFormula/Triangulation.cpp + /home/ryazur/src/PhysicsFormula/Triangulation.h + /home/ryazur/src/PhysicsFormula/Vector.h +CMakeFiles/PhysicsFormula.dir/Vector.cpp.o + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/Vector.cpp + /home/ryazur/src/PhysicsFormula/Vector.h +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o + /home/ryazur/src/PhysicsFormula/Bounds.h + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/Distance.h + /home/ryazur/src/PhysicsFormula/Intersection.h + /home/ryazur/src/PhysicsFormula/Line.h + /home/ryazur/src/PhysicsFormula/Plane.h + /home/ryazur/src/PhysicsFormula/Point.h + /home/ryazur/src/PhysicsFormula/Polygon.h + /home/ryazur/src/PhysicsFormula/Polyhedron.h + /home/ryazur/src/PhysicsFormula/Segment.h + /home/ryazur/src/PhysicsFormula/Vector.h + /home/ryazur/src/PhysicsFormula/Voronoi.cpp + /home/ryazur/src/PhysicsFormula/Voronoi.h +CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o + /home/ryazur/src/PhysicsFormula/templateGraph.cpp + /home/ryazur/src/PhysicsFormula/templateGraph.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o + /home/ryazur/src/PhysicsFormula/AtomicPhysics.h + /home/ryazur/src/PhysicsFormula/BinarySearchTree.h + /home/ryazur/src/PhysicsFormula/Circle.h + /home/ryazur/src/PhysicsFormula/Circuits.h + /home/ryazur/src/PhysicsFormula/Cone.h + /home/ryazur/src/PhysicsFormula/Core.h + /home/ryazur/src/PhysicsFormula/Cube.h + /home/ryazur/src/PhysicsFormula/Cylinder.h + /home/ryazur/src/PhysicsFormula/Drag.h + /home/ryazur/src/PhysicsFormula/ETL.h + /home/ryazur/src/PhysicsFormula/Elasticity.h + /home/ryazur/src/PhysicsFormula/ElectricCharge.h + /home/ryazur/src/PhysicsFormula/ElectricCurrent.h + /home/ryazur/src/PhysicsFormula/ElectricPotential.h + /home/ryazur/src/PhysicsFormula/ElectroMagneticInduction.h + /home/ryazur/src/PhysicsFormula/ElectroMagneticWaves.h + /home/ryazur/src/PhysicsFormula/Energy.h + /home/ryazur/src/PhysicsFormula/FluidDynamics.h + /home/ryazur/src/PhysicsFormula/FluidStatics.h + /home/ryazur/src/PhysicsFormula/Forces.h + /home/ryazur/src/PhysicsFormula/Friction.h + /home/ryazur/src/PhysicsFormula/GeoUtils.h + /home/ryazur/src/PhysicsFormula/GeometricOptics.h + /home/ryazur/src/PhysicsFormula/Hearing.h + /home/ryazur/src/PhysicsFormula/Heat.h + /home/ryazur/src/PhysicsFormula/Intersection.h + /home/ryazur/src/PhysicsFormula/Kinematics.h + /home/ryazur/src/PhysicsFormula/Line.h + /home/ryazur/src/PhysicsFormula/LinearAlgebra.h + /home/ryazur/src/PhysicsFormula/LinearRegression.h + /home/ryazur/src/PhysicsFormula/LogisticRegression.h + /home/ryazur/src/PhysicsFormula/Magnetism.h + /home/ryazur/src/PhysicsFormula/MathFx.h + /home/ryazur/src/PhysicsFormula/MatrixND.h + /home/ryazur/src/PhysicsFormula/Momentum.h + /home/ryazur/src/PhysicsFormula/Parallelogram.h + /home/ryazur/src/PhysicsFormula/PeriodicElements.h + /home/ryazur/src/PhysicsFormula/Physics_World.h + /home/ryazur/src/PhysicsFormula/Plane.h + /home/ryazur/src/PhysicsFormula/Point.h + /home/ryazur/src/PhysicsFormula/Point2D.h + /home/ryazur/src/PhysicsFormula/Polygon.h + /home/ryazur/src/PhysicsFormula/PolygonDCEL.h + /home/ryazur/src/PhysicsFormula/Polyhedron.h + /home/ryazur/src/PhysicsFormula/Pyramid.h + /home/ryazur/src/PhysicsFormula/QuantumPhysics.h + /home/ryazur/src/PhysicsFormula/RandomNumbers.h + /home/ryazur/src/PhysicsFormula/Rectangle.h + /home/ryazur/src/PhysicsFormula/RectangularPrism.h + /home/ryazur/src/PhysicsFormula/RegexHelper.h + /home/ryazur/src/PhysicsFormula/RotationalMotion.h + /home/ryazur/src/PhysicsFormula/RunTimer.h + /home/ryazur/src/PhysicsFormula/Segment.h + /home/ryazur/src/PhysicsFormula/SpecialRelativity.h + /home/ryazur/src/PhysicsFormula/Sphere.h + /home/ryazur/src/PhysicsFormula/Square.h + /home/ryazur/src/PhysicsFormula/Statics.h + /home/ryazur/src/PhysicsFormula/StringHelper.h + /home/ryazur/src/PhysicsFormula/Temperature.h + /home/ryazur/src/PhysicsFormula/TemplateBST.h + /home/ryazur/src/PhysicsFormula/Testing.h + /home/ryazur/src/PhysicsFormula/Thermodynamics.h + /home/ryazur/src/PhysicsFormula/Torque.h + /home/ryazur/src/PhysicsFormula/TransitiveClosure.h + /home/ryazur/src/PhysicsFormula/TriangleSolver.h + /home/ryazur/src/PhysicsFormula/UniformCircularMotion.h + /home/ryazur/src/PhysicsFormula/Vector.h + /home/ryazur/src/PhysicsFormula/Vector2D.h + /home/ryazur/src/PhysicsFormula/Vector3D.h + /home/ryazur/src/PhysicsFormula/VectorND.h + /home/ryazur/src/PhysicsFormula/VisionOpticalInstruments.h + /home/ryazur/src/PhysicsFormula/WaveOptics.h + /home/ryazur/src/PhysicsFormula/Waves.h + /home/ryazur/src/PhysicsFormula/templateGraph.h + /home/ryazur/src/PhysicsFormula/testFactore.cpp diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/depend.make b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/depend.make new file mode 100644 index 0000000..138d6a4 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/depend.make @@ -0,0 +1,231 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.16 + +CMakeFiles/PhysicsFormula.dir/Angle.cpp.o: ../Angle.cpp +CMakeFiles/PhysicsFormula.dir/Angle.cpp.o: ../Angle.h +CMakeFiles/PhysicsFormula.dir/Angle.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/Angle.cpp.o: ../Line.h +CMakeFiles/PhysicsFormula.dir/Angle.cpp.o: ../Plane.h +CMakeFiles/PhysicsFormula.dir/Angle.cpp.o: ../Point.h +CMakeFiles/PhysicsFormula.dir/Angle.cpp.o: ../Vector.h + +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../Convexhull.cpp +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../Convexhull.h +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../Distance.h +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../GeoUtils.h +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../Inclusion.h +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../Intersection.h +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../Line.h +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../Plane.h +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../Point.h +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../Polygon.h +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../PolygonDCEL.h +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../Polyhedron.h +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../Segment.h +CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o: ../Vector.h + +CMakeFiles/PhysicsFormula.dir/Distance.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/Distance.cpp.o: ../Distance.cpp +CMakeFiles/PhysicsFormula.dir/Distance.cpp.o: ../Distance.h +CMakeFiles/PhysicsFormula.dir/Distance.cpp.o: ../Line.h +CMakeFiles/PhysicsFormula.dir/Distance.cpp.o: ../Plane.h +CMakeFiles/PhysicsFormula.dir/Distance.cpp.o: ../Point.h +CMakeFiles/PhysicsFormula.dir/Distance.cpp.o: ../Vector.h + +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o: ../GeoUtils.cpp +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o: ../GeoUtils.h +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o: ../Intersection.h +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o: ../Line.h +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o: ../Plane.h +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o: ../Point.h +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o: ../Polygon.h +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o: ../PolygonDCEL.h +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o: ../Polyhedron.h +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o: ../Segment.h +CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o: ../Vector.h + +CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o: ../Inclusion.cpp +CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o: ../Inclusion.h +CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o: ../Point.h +CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o: ../Vector.h + +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o: ../GeoUtils.h +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o: ../Intersection.cpp +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o: ../Intersection.h +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o: ../Line.h +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o: ../Plane.h +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o: ../Point.h +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o: ../Polygon.h +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o: ../PolygonDCEL.h +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o: ../Polyhedron.h +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o: ../Segment.h +CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o: ../Vector.h + +CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o: ../KDTree.cpp +CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o: ../KDTree.h +CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o: ../Point.h +CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o: ../Vector.h + +CMakeFiles/PhysicsFormula.dir/Line.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/Line.cpp.o: ../Line.cpp +CMakeFiles/PhysicsFormula.dir/Line.cpp.o: ../Line.h +CMakeFiles/PhysicsFormula.dir/Line.cpp.o: ../Point.h +CMakeFiles/PhysicsFormula.dir/Line.cpp.o: ../Vector.h + +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o: ../GeoUtils.h +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o: ../Intersection.h +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o: ../Line.h +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o: ../MonotonePartition.cpp +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o: ../MonotonePartition.h +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o: ../Plane.h +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o: ../Point.h +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o: ../Polygon.h +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o: ../PolygonDCEL.h +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o: ../Polyhedron.h +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o: ../Segment.h +CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o: ../Vector.h + +CMakeFiles/PhysicsFormula.dir/Point.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/Point.cpp.o: ../Point.cpp +CMakeFiles/PhysicsFormula.dir/Point.cpp.o: ../Point.h +CMakeFiles/PhysicsFormula.dir/Point.cpp.o: ../Vector.h + +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o: ../GeoUtils.h +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o: ../Intersection.h +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o: ../Line.h +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o: ../Plane.h +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o: ../Point.h +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o: ../Polygon.cpp +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o: ../Polygon.h +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o: ../PolygonDCEL.h +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o: ../Polyhedron.h +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o: ../Segment.h +CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o: ../Vector.h + +CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o: ../Boundries.h +CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o: ../Point.h +CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o: ../QuadTree.cpp +CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o: ../QuadTree.h +CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o: ../Segment.h +CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o: ../Vector.h + +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: ../GeoUtils.h +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: ../Intersection.h +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: ../Line.h +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: ../MonotonePartition.h +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: ../Plane.h +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: ../Point.h +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: ../Polygon.h +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: ../PolygonDCEL.h +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: ../Polyhedron.h +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: ../Segment.h +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: ../Triangulation.cpp +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: ../Triangulation.h +CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o: ../Vector.h + +CMakeFiles/PhysicsFormula.dir/Vector.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/Vector.cpp.o: ../Vector.cpp +CMakeFiles/PhysicsFormula.dir/Vector.cpp.o: ../Vector.h + +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o: ../Bounds.h +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o: ../Distance.h +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o: ../Intersection.h +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o: ../Line.h +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o: ../Plane.h +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o: ../Point.h +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o: ../Polygon.h +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o: ../Polyhedron.h +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o: ../Segment.h +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o: ../Vector.h +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o: ../Voronoi.cpp +CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o: ../Voronoi.h + +CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o: ../templateGraph.cpp +CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o: ../templateGraph.h + +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../AtomicPhysics.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../BinarySearchTree.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Circle.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Circuits.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Cone.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Core.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Cube.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Cylinder.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Drag.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../ETL.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Elasticity.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../ElectricCharge.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../ElectricCurrent.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../ElectricPotential.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../ElectroMagneticInduction.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../ElectroMagneticWaves.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Energy.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../FluidDynamics.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../FluidStatics.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Forces.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Friction.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../GeoUtils.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../GeometricOptics.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Hearing.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Heat.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Intersection.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Kinematics.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Line.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../LinearAlgebra.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../LinearRegression.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../LogisticRegression.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Magnetism.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../MathFx.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../MatrixND.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Momentum.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Parallelogram.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../PeriodicElements.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Physics_World.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Plane.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Point.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Point2D.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Polygon.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../PolygonDCEL.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Polyhedron.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Pyramid.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../QuantumPhysics.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../RandomNumbers.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Rectangle.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../RectangularPrism.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../RegexHelper.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../RotationalMotion.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../RunTimer.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Segment.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../SpecialRelativity.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Sphere.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Square.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Statics.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../StringHelper.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Temperature.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../TemplateBST.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Testing.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Thermodynamics.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Torque.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../TransitiveClosure.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../TriangleSolver.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../UniformCircularMotion.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Vector.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Vector2D.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Vector3D.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../VectorND.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../VisionOpticalInstruments.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../WaveOptics.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../Waves.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../templateGraph.h +CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o: ../testFactore.cpp + diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/flags.make b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/flags.make new file mode 100644 index 0000000..f1e8e17 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.16 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -g -std=gnu++2a + +CXX_DEFINES = + +CXX_INCLUDES = + diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/link.txt b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/link.txt new file mode 100644 index 0000000..e725ad5 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -g CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o CMakeFiles/PhysicsFormula.dir/Angle.cpp.o CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o CMakeFiles/PhysicsFormula.dir/Distance.cpp.o CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o CMakeFiles/PhysicsFormula.dir/Line.cpp.o CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o CMakeFiles/PhysicsFormula.dir/Point.cpp.o CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o CMakeFiles/PhysicsFormula.dir/Vector.cpp.o CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o -o PhysicsFormula diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/progress.make b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/progress.make new file mode 100644 index 0000000..4f47425 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/progress.make @@ -0,0 +1,19 @@ +CMAKE_PROGRESS_1 = 1 +CMAKE_PROGRESS_2 = 2 +CMAKE_PROGRESS_3 = 3 +CMAKE_PROGRESS_4 = 4 +CMAKE_PROGRESS_5 = 5 +CMAKE_PROGRESS_6 = 6 +CMAKE_PROGRESS_7 = 7 +CMAKE_PROGRESS_8 = 8 +CMAKE_PROGRESS_9 = 9 +CMAKE_PROGRESS_10 = 10 +CMAKE_PROGRESS_11 = 11 +CMAKE_PROGRESS_12 = 12 +CMAKE_PROGRESS_13 = 13 +CMAKE_PROGRESS_14 = 14 +CMAKE_PROGRESS_15 = 15 +CMAKE_PROGRESS_16 = 16 +CMAKE_PROGRESS_17 = 17 +CMAKE_PROGRESS_18 = 18 + diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o new file mode 100644 index 0000000..120c176 Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o new file mode 100644 index 0000000..9b7d50a Binary files /dev/null and b/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o differ diff --git a/cmake-build-debug-wsl/CMakeFiles/TargetDirectories.txt b/cmake-build-debug-wsl/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..2a177c2 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,3 @@ +/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/rebuild_cache.dir +/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/edit_cache.dir +/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/PhysicsFormula.dir diff --git a/cmake-build-debug-wsl/CMakeFiles/clion-environment.txt b/cmake-build-debug-wsl/CMakeFiles/clion-environment.txt new file mode 100644 index 0000000..a47f11a --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/clion-environment.txt @@ -0,0 +1,3 @@ +ToolSet: Ubuntu 20.04.4 LTS (local)Options: + +Options: \ No newline at end of file diff --git a/cmake-build-debug-wsl/CMakeFiles/clion-log.txt b/cmake-build-debug-wsl/CMakeFiles/clion-log.txt new file mode 100644 index 0000000..c62732b --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/clion-log.txt @@ -0,0 +1,18 @@ +C:\Windows\system32\wsl.exe --distribution Ubuntu --exec /bin/bash -c "export CLION_IDE=TRUE && export JETBRAINS_IDE=TRUE && cd /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl && /usr/bin/cmake -DCMAKE_BUILD_TYPE=Debug -G 'CodeBlocks - Unix Makefiles' /home/ryazur/src/PhysicsFormula; exitcode=$?; sleep 0.001; (exit $exitcode)" +-- The C compiler identification is GNU 9.4.0 +-- The CXX compiler identification is GNU 9.4.0 +-- Check for working C compiler: /usr/bin/cc +-- Check for working C compiler: /usr/bin/cc -- works +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Detecting C compile features +-- Detecting C compile features - done +-- Check for working CXX compiler: /usr/bin/c++ +-- Check for working CXX compiler: /usr/bin/c++ -- works +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Configuring done +-- Generating done +-- Build files have been written to: /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl diff --git a/cmake-build-debug-wsl/CMakeFiles/cmake.check_cache b/cmake-build-debug-wsl/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/cmake-build-debug-wsl/CMakeFiles/progress.marks b/cmake-build-debug-wsl/CMakeFiles/progress.marks new file mode 100644 index 0000000..3c03207 --- /dev/null +++ b/cmake-build-debug-wsl/CMakeFiles/progress.marks @@ -0,0 +1 @@ +18 diff --git a/cmake-build-debug-wsl/Makefile b/cmake-build-debug-wsl/Makefile new file mode 100644 index 0000000..815a943 --- /dev/null +++ b/cmake-build-debug-wsl/Makefile @@ -0,0 +1,658 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.16 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/ryazur/src/PhysicsFormula + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named PhysicsFormula + +# Build rule for target. +PhysicsFormula: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 PhysicsFormula +.PHONY : PhysicsFormula + +# fast build rule for target. +PhysicsFormula/fast: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/build +.PHONY : PhysicsFormula/fast + +Angle.o: Angle.cpp.o + +.PHONY : Angle.o + +# target to build an object file +Angle.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Angle.cpp.o +.PHONY : Angle.cpp.o + +Angle.i: Angle.cpp.i + +.PHONY : Angle.i + +# target to preprocess a source file +Angle.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Angle.cpp.i +.PHONY : Angle.cpp.i + +Angle.s: Angle.cpp.s + +.PHONY : Angle.s + +# target to generate assembly for a file +Angle.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Angle.cpp.s +.PHONY : Angle.cpp.s + +Convexhull.o: Convexhull.cpp.o + +.PHONY : Convexhull.o + +# target to build an object file +Convexhull.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.o +.PHONY : Convexhull.cpp.o + +Convexhull.i: Convexhull.cpp.i + +.PHONY : Convexhull.i + +# target to preprocess a source file +Convexhull.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.i +.PHONY : Convexhull.cpp.i + +Convexhull.s: Convexhull.cpp.s + +.PHONY : Convexhull.s + +# target to generate assembly for a file +Convexhull.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Convexhull.cpp.s +.PHONY : Convexhull.cpp.s + +Distance.o: Distance.cpp.o + +.PHONY : Distance.o + +# target to build an object file +Distance.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Distance.cpp.o +.PHONY : Distance.cpp.o + +Distance.i: Distance.cpp.i + +.PHONY : Distance.i + +# target to preprocess a source file +Distance.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Distance.cpp.i +.PHONY : Distance.cpp.i + +Distance.s: Distance.cpp.s + +.PHONY : Distance.s + +# target to generate assembly for a file +Distance.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Distance.cpp.s +.PHONY : Distance.cpp.s + +GeoUtils.o: GeoUtils.cpp.o + +.PHONY : GeoUtils.o + +# target to build an object file +GeoUtils.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.o +.PHONY : GeoUtils.cpp.o + +GeoUtils.i: GeoUtils.cpp.i + +.PHONY : GeoUtils.i + +# target to preprocess a source file +GeoUtils.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.i +.PHONY : GeoUtils.cpp.i + +GeoUtils.s: GeoUtils.cpp.s + +.PHONY : GeoUtils.s + +# target to generate assembly for a file +GeoUtils.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/GeoUtils.cpp.s +.PHONY : GeoUtils.cpp.s + +Inclusion.o: Inclusion.cpp.o + +.PHONY : Inclusion.o + +# target to build an object file +Inclusion.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.o +.PHONY : Inclusion.cpp.o + +Inclusion.i: Inclusion.cpp.i + +.PHONY : Inclusion.i + +# target to preprocess a source file +Inclusion.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.i +.PHONY : Inclusion.cpp.i + +Inclusion.s: Inclusion.cpp.s + +.PHONY : Inclusion.s + +# target to generate assembly for a file +Inclusion.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Inclusion.cpp.s +.PHONY : Inclusion.cpp.s + +Intersection.o: Intersection.cpp.o + +.PHONY : Intersection.o + +# target to build an object file +Intersection.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Intersection.cpp.o +.PHONY : Intersection.cpp.o + +Intersection.i: Intersection.cpp.i + +.PHONY : Intersection.i + +# target to preprocess a source file +Intersection.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Intersection.cpp.i +.PHONY : Intersection.cpp.i + +Intersection.s: Intersection.cpp.s + +.PHONY : Intersection.s + +# target to generate assembly for a file +Intersection.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Intersection.cpp.s +.PHONY : Intersection.cpp.s + +KDTree.o: KDTree.cpp.o + +.PHONY : KDTree.o + +# target to build an object file +KDTree.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/KDTree.cpp.o +.PHONY : KDTree.cpp.o + +KDTree.i: KDTree.cpp.i + +.PHONY : KDTree.i + +# target to preprocess a source file +KDTree.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/KDTree.cpp.i +.PHONY : KDTree.cpp.i + +KDTree.s: KDTree.cpp.s + +.PHONY : KDTree.s + +# target to generate assembly for a file +KDTree.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/KDTree.cpp.s +.PHONY : KDTree.cpp.s + +Line.o: Line.cpp.o + +.PHONY : Line.o + +# target to build an object file +Line.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Line.cpp.o +.PHONY : Line.cpp.o + +Line.i: Line.cpp.i + +.PHONY : Line.i + +# target to preprocess a source file +Line.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Line.cpp.i +.PHONY : Line.cpp.i + +Line.s: Line.cpp.s + +.PHONY : Line.s + +# target to generate assembly for a file +Line.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Line.cpp.s +.PHONY : Line.cpp.s + +MonotonePartition.o: MonotonePartition.cpp.o + +.PHONY : MonotonePartition.o + +# target to build an object file +MonotonePartition.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.o +.PHONY : MonotonePartition.cpp.o + +MonotonePartition.i: MonotonePartition.cpp.i + +.PHONY : MonotonePartition.i + +# target to preprocess a source file +MonotonePartition.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.i +.PHONY : MonotonePartition.cpp.i + +MonotonePartition.s: MonotonePartition.cpp.s + +.PHONY : MonotonePartition.s + +# target to generate assembly for a file +MonotonePartition.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/MonotonePartition.cpp.s +.PHONY : MonotonePartition.cpp.s + +Point.o: Point.cpp.o + +.PHONY : Point.o + +# target to build an object file +Point.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Point.cpp.o +.PHONY : Point.cpp.o + +Point.i: Point.cpp.i + +.PHONY : Point.i + +# target to preprocess a source file +Point.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Point.cpp.i +.PHONY : Point.cpp.i + +Point.s: Point.cpp.s + +.PHONY : Point.s + +# target to generate assembly for a file +Point.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Point.cpp.s +.PHONY : Point.cpp.s + +Polygon.o: Polygon.cpp.o + +.PHONY : Polygon.o + +# target to build an object file +Polygon.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Polygon.cpp.o +.PHONY : Polygon.cpp.o + +Polygon.i: Polygon.cpp.i + +.PHONY : Polygon.i + +# target to preprocess a source file +Polygon.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Polygon.cpp.i +.PHONY : Polygon.cpp.i + +Polygon.s: Polygon.cpp.s + +.PHONY : Polygon.s + +# target to generate assembly for a file +Polygon.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Polygon.cpp.s +.PHONY : Polygon.cpp.s + +QuadTree.o: QuadTree.cpp.o + +.PHONY : QuadTree.o + +# target to build an object file +QuadTree.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.o +.PHONY : QuadTree.cpp.o + +QuadTree.i: QuadTree.cpp.i + +.PHONY : QuadTree.i + +# target to preprocess a source file +QuadTree.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.i +.PHONY : QuadTree.cpp.i + +QuadTree.s: QuadTree.cpp.s + +.PHONY : QuadTree.s + +# target to generate assembly for a file +QuadTree.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/QuadTree.cpp.s +.PHONY : QuadTree.cpp.s + +Triangulation.o: Triangulation.cpp.o + +.PHONY : Triangulation.o + +# target to build an object file +Triangulation.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.o +.PHONY : Triangulation.cpp.o + +Triangulation.i: Triangulation.cpp.i + +.PHONY : Triangulation.i + +# target to preprocess a source file +Triangulation.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.i +.PHONY : Triangulation.cpp.i + +Triangulation.s: Triangulation.cpp.s + +.PHONY : Triangulation.s + +# target to generate assembly for a file +Triangulation.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Triangulation.cpp.s +.PHONY : Triangulation.cpp.s + +Vector.o: Vector.cpp.o + +.PHONY : Vector.o + +# target to build an object file +Vector.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Vector.cpp.o +.PHONY : Vector.cpp.o + +Vector.i: Vector.cpp.i + +.PHONY : Vector.i + +# target to preprocess a source file +Vector.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Vector.cpp.i +.PHONY : Vector.cpp.i + +Vector.s: Vector.cpp.s + +.PHONY : Vector.s + +# target to generate assembly for a file +Vector.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Vector.cpp.s +.PHONY : Vector.cpp.s + +Voronoi.o: Voronoi.cpp.o + +.PHONY : Voronoi.o + +# target to build an object file +Voronoi.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.o +.PHONY : Voronoi.cpp.o + +Voronoi.i: Voronoi.cpp.i + +.PHONY : Voronoi.i + +# target to preprocess a source file +Voronoi.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.i +.PHONY : Voronoi.cpp.i + +Voronoi.s: Voronoi.cpp.s + +.PHONY : Voronoi.s + +# target to generate assembly for a file +Voronoi.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/Voronoi.cpp.s +.PHONY : Voronoi.cpp.s + +templateGraph.o: templateGraph.cpp.o + +.PHONY : templateGraph.o + +# target to build an object file +templateGraph.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.o +.PHONY : templateGraph.cpp.o + +templateGraph.i: templateGraph.cpp.i + +.PHONY : templateGraph.i + +# target to preprocess a source file +templateGraph.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.i +.PHONY : templateGraph.cpp.i + +templateGraph.s: templateGraph.cpp.s + +.PHONY : templateGraph.s + +# target to generate assembly for a file +templateGraph.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/templateGraph.cpp.s +.PHONY : templateGraph.cpp.s + +testFactore.o: testFactore.cpp.o + +.PHONY : testFactore.o + +# target to build an object file +testFactore.cpp.o: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/testFactore.cpp.o +.PHONY : testFactore.cpp.o + +testFactore.i: testFactore.cpp.i + +.PHONY : testFactore.i + +# target to preprocess a source file +testFactore.cpp.i: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/testFactore.cpp.i +.PHONY : testFactore.cpp.i + +testFactore.s: testFactore.cpp.s + +.PHONY : testFactore.s + +# target to generate assembly for a file +testFactore.cpp.s: + $(MAKE) -f CMakeFiles/PhysicsFormula.dir/build.make CMakeFiles/PhysicsFormula.dir/testFactore.cpp.s +.PHONY : testFactore.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... rebuild_cache" + @echo "... edit_cache" + @echo "... PhysicsFormula" + @echo "... Angle.o" + @echo "... Angle.i" + @echo "... Angle.s" + @echo "... Convexhull.o" + @echo "... Convexhull.i" + @echo "... Convexhull.s" + @echo "... Distance.o" + @echo "... Distance.i" + @echo "... Distance.s" + @echo "... GeoUtils.o" + @echo "... GeoUtils.i" + @echo "... GeoUtils.s" + @echo "... Inclusion.o" + @echo "... Inclusion.i" + @echo "... Inclusion.s" + @echo "... Intersection.o" + @echo "... Intersection.i" + @echo "... Intersection.s" + @echo "... KDTree.o" + @echo "... KDTree.i" + @echo "... KDTree.s" + @echo "... Line.o" + @echo "... Line.i" + @echo "... Line.s" + @echo "... MonotonePartition.o" + @echo "... MonotonePartition.i" + @echo "... MonotonePartition.s" + @echo "... Point.o" + @echo "... Point.i" + @echo "... Point.s" + @echo "... Polygon.o" + @echo "... Polygon.i" + @echo "... Polygon.s" + @echo "... QuadTree.o" + @echo "... QuadTree.i" + @echo "... QuadTree.s" + @echo "... Triangulation.o" + @echo "... Triangulation.i" + @echo "... Triangulation.s" + @echo "... Vector.o" + @echo "... Vector.i" + @echo "... Vector.s" + @echo "... Voronoi.o" + @echo "... Voronoi.i" + @echo "... Voronoi.s" + @echo "... templateGraph.o" + @echo "... templateGraph.i" + @echo "... templateGraph.s" + @echo "... testFactore.o" + @echo "... testFactore.i" + @echo "... testFactore.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/cmake-build-debug-wsl/PhysicsFormula b/cmake-build-debug-wsl/PhysicsFormula new file mode 100644 index 0000000..8c4b923 Binary files /dev/null and b/cmake-build-debug-wsl/PhysicsFormula differ diff --git a/cmake-build-debug-wsl/PhysicsFormula.cbp b/cmake-build-debug-wsl/PhysicsFormula.cbp new file mode 100644 index 0000000..b823cb3 --- /dev/null +++ b/cmake-build-debug-wsl/PhysicsFormula.cbp @@ -0,0 +1,410 @@ + + + + + + diff --git a/cmake-build-debug-wsl/Testing/Temporary/LastTest.log b/cmake-build-debug-wsl/Testing/Temporary/LastTest.log new file mode 100644 index 0000000..d58b4e0 --- /dev/null +++ b/cmake-build-debug-wsl/Testing/Temporary/LastTest.log @@ -0,0 +1,3 @@ +Start testing: Mar 22 01:10 EDT +---------------------------------------------------------- +End testing: Mar 22 01:10 EDT diff --git a/cmake-build-debug-wsl/adult_data.csv b/cmake-build-debug-wsl/adult_data.csv new file mode 100644 index 0000000..3265afe --- /dev/null +++ b/cmake-build-debug-wsl/adult_data.csv @@ -0,0 +1,30162 @@ +39,0,77516,0,13,0,0,0,0,0,2174,0,40,0,0 +50,1,83311,0,13,1,1,1,0,0,0,0,13,0,0 +38,2,215646,1,9,2,2,0,0,0,0,0,40,0,0 +53,2,234721,2,7,1,2,1,1,0,0,0,40,0,0 +28,2,338409,0,13,1,3,2,1,1,0,0,40,1,0 +37,2,284582,3,14,1,1,2,0,1,0,0,40,0,0 +49,2,160187,4,5,3,4,0,1,1,0,0,16,2,0 +52,1,209642,1,9,1,1,1,0,0,0,0,45,0,1 +31,2,45781,3,14,0,3,0,0,1,14084,0,50,0,1 +42,2,159449,0,13,1,1,1,0,0,5178,0,40,0,1 +37,2,280464,5,10,1,1,1,1,0,0,0,80,0,1 +30,0,141297,0,13,1,3,1,2,0,0,0,40,3,1 +23,2,122272,0,13,0,0,3,0,1,0,0,30,0,0 +32,2,205019,6,12,0,5,0,1,0,0,0,50,0,0 +34,2,245487,7,4,1,6,1,3,0,0,0,45,4,0 +25,1,176756,1,9,0,7,3,0,0,0,0,35,0,0 +32,2,186824,1,9,0,8,4,0,0,0,0,40,0,0 +38,2,28887,2,7,1,5,1,0,0,0,0,50,0,0 +43,1,292175,3,14,2,1,4,0,1,0,0,45,0,1 +40,2,193524,8,16,1,3,1,0,0,0,0,60,0,1 +54,2,302146,1,9,4,4,4,1,1,0,0,20,0,0 +35,3,76845,4,5,1,7,1,1,0,0,0,40,0,0 +43,2,117037,2,7,1,6,1,0,0,0,2042,40,0,0 +59,2,109015,1,9,2,9,4,0,1,0,0,40,0,0 +56,4,216851,0,13,1,9,1,0,0,0,0,40,0,1 +19,2,168294,1,9,0,10,3,0,0,0,0,40,0,0 +39,2,367260,1,9,2,1,0,0,0,0,0,80,0,0 +49,2,193366,1,9,1,10,1,0,0,0,0,40,0,0 +23,4,190709,6,12,0,11,0,0,0,0,0,52,0,0 +20,2,266015,5,10,0,5,3,1,0,0,0,44,0,0 +45,2,386940,0,13,2,1,3,0,0,0,1408,40,0,0 +30,3,59951,5,10,1,0,3,0,0,0,0,40,0,0 +22,0,311512,5,10,1,4,1,1,0,0,0,15,0,0 +48,2,242406,2,7,0,8,4,0,0,0,0,40,5,0 +21,2,197200,5,10,0,8,3,0,0,0,0,40,0,0 +19,2,544091,1,9,5,0,2,0,1,0,0,25,0,0 +48,1,265477,6,12,1,3,1,0,0,0,0,40,0,0 +31,2,507875,4,5,1,8,1,0,0,0,0,43,0,0 +53,1,88506,0,13,1,3,1,0,0,0,0,40,0,0 +24,2,172987,0,13,1,9,1,0,0,0,0,50,0,0 +49,2,94638,1,9,4,0,4,0,1,0,0,40,0,0 +25,2,289980,1,9,0,2,0,0,0,0,0,35,0,0 +57,3,337895,0,13,1,3,1,1,0,0,0,40,0,1 +53,2,144361,1,9,1,8,1,0,0,0,0,38,0,0 +44,2,128354,3,14,2,1,4,0,1,0,0,40,0,0 +41,0,101603,9,11,1,10,1,0,0,0,0,40,0,0 +29,2,271466,9,11,0,3,0,0,0,0,0,43,0,0 +25,2,32275,5,10,1,1,2,4,1,0,0,40,0,0 +47,2,51835,10,15,1,3,2,0,1,0,1902,60,6,1 +50,3,251585,0,13,2,1,0,0,0,0,0,55,0,1 +47,5,109832,1,9,2,1,0,0,0,0,0,60,0,0 +43,2,237993,5,10,1,9,1,0,0,0,0,40,0,1 +46,2,216666,11,3,1,8,1,0,0,0,0,40,4,0 +35,2,56352,9,11,1,4,1,0,0,0,0,40,5,0 +41,2,147372,1,9,1,0,1,0,0,0,0,48,0,0 +30,2,188146,1,9,1,8,1,0,0,5013,0,40,0,0 +30,2,59496,0,13,1,5,1,0,0,2407,0,40,0,0 +48,2,149640,1,9,1,6,1,0,0,0,0,40,0,0 +42,2,116632,8,16,1,3,1,0,0,0,0,45,0,1 +29,2,105598,5,10,2,9,0,0,0,0,0,58,0,0 +36,2,155537,1,9,1,10,1,0,0,0,0,40,0,0 +28,2,183175,5,10,2,0,0,0,1,0,0,40,0,0 +53,2,169846,1,9,1,0,2,0,1,0,0,40,0,1 +49,5,191681,5,10,1,1,1,0,0,0,0,50,0,1 +19,2,101509,5,10,0,3,3,0,0,0,0,32,0,0 +31,2,309974,0,13,4,5,3,1,1,0,0,40,0,0 +29,1,162298,0,13,1,5,1,0,0,0,0,70,0,1 +23,2,211678,5,10,0,8,0,0,0,0,0,40,0,0 +79,2,124744,5,10,1,3,5,0,0,0,0,20,0,0 +27,2,213921,1,9,0,4,3,0,0,0,0,40,4,0 +40,2,32214,6,12,1,0,1,0,0,0,0,40,0,0 +18,2,309634,2,7,0,4,3,0,1,0,0,22,0,0 +31,4,125927,7,4,1,7,1,0,0,0,0,40,0,0 +18,2,446839,1,9,0,5,0,0,0,0,0,30,0,0 +52,2,276515,0,13,1,4,1,0,0,0,0,40,1,0 +46,2,51618,1,9,1,4,2,0,1,0,0,40,0,0 +59,2,159937,1,9,1,5,1,0,0,0,0,48,0,0 +44,2,343591,1,9,2,10,0,0,1,14344,0,40,0,1 +53,2,346253,1,9,2,5,3,0,1,0,0,35,0,0 +49,4,268234,1,9,1,11,1,0,0,0,0,40,0,1 +33,2,202051,3,14,1,3,1,0,0,0,0,50,0,0 +30,2,54334,4,5,0,5,0,0,0,0,0,40,0,0 +43,3,410867,8,16,0,3,0,0,1,0,0,50,0,1 +57,2,249977,9,11,1,3,1,0,0,0,0,40,0,0 +37,2,286730,5,10,2,10,4,0,1,0,0,40,0,0 +28,2,212563,5,10,2,8,4,1,1,0,0,25,0,0 +34,4,226296,0,13,1,11,1,0,0,0,0,40,0,1 +29,4,115585,5,10,0,2,0,0,0,0,0,50,0,0 +48,1,191277,8,16,1,3,1,0,0,0,1902,60,0,1 +37,2,202683,5,10,1,5,1,0,0,0,0,48,0,1 +48,2,171095,6,12,2,1,4,0,1,0,0,40,7,0 +32,3,249409,1,9,0,4,3,1,0,0,0,40,0,0 +76,2,124191,3,14,1,1,1,0,0,0,0,40,0,1 +44,2,198282,0,13,1,1,1,0,0,15024,0,60,0,1 +47,1,149116,3,14,0,3,0,0,1,0,0,50,0,0 +20,2,188300,5,10,0,9,3,0,1,0,0,40,0,0 +29,2,103432,1,9,0,10,0,0,0,0,0,40,0,0 +32,5,317660,1,9,1,10,1,0,0,7688,0,40,0,1 +30,2,194901,2,7,0,2,3,0,0,0,0,40,0,0 +31,4,189265,1,9,0,0,0,0,1,0,0,40,0,0 +42,2,124692,1,9,1,2,1,0,0,0,0,40,0,0 +24,2,432376,0,13,0,5,5,0,0,0,0,40,0,0 +38,2,65324,10,15,1,3,1,0,0,0,0,40,0,1 +56,1,335605,1,9,1,4,1,0,0,0,1887,50,8,1 +28,2,377869,5,10,1,5,2,0,1,4064,0,25,0,0 +36,2,102864,1,9,0,8,3,0,1,0,0,40,0,0 +53,2,95647,4,5,1,2,1,0,0,0,0,50,0,0 +56,5,303090,5,10,1,5,1,0,0,0,0,50,0,0 +49,4,197371,9,11,1,10,1,1,0,0,0,40,0,1 +55,2,247552,5,10,1,5,1,0,0,0,0,56,0,0 +22,2,102632,1,9,0,10,0,0,0,0,0,41,0,0 +21,2,199915,5,10,0,4,3,0,1,0,0,40,0,0 +40,2,118853,0,13,1,1,1,0,0,0,0,60,0,0 +30,2,77143,0,13,0,1,3,1,0,0,0,40,9,0 +29,0,267989,0,13,1,3,1,0,0,0,0,50,0,1 +19,2,301606,5,10,0,4,3,1,0,0,0,35,0,0 +47,2,287828,0,13,1,1,2,0,1,0,0,40,0,1 +20,2,111697,5,10,0,0,3,0,1,0,1719,28,0,0 +31,2,114937,6,12,1,0,1,0,0,0,0,40,0,1 +39,2,365739,5,10,2,10,0,0,0,0,0,40,0,0 +28,2,69621,6,12,0,5,0,0,1,0,0,60,0,0 +24,2,43323,1,9,0,4,0,0,1,0,1762,40,0,0 +38,1,120985,1,9,1,10,1,0,0,4386,0,35,0,0 +37,2,254202,0,13,1,5,1,0,0,0,0,50,0,0 +46,2,146195,6,12,2,9,0,1,1,0,0,36,0,0 +38,3,125933,3,14,1,3,1,0,0,0,0,40,10,1 +43,1,56920,1,9,1,10,1,0,0,0,0,60,0,0 +27,2,163127,9,11,1,0,2,0,1,0,0,35,0,0 +20,2,34310,5,10,0,5,3,0,0,0,0,20,0,0 +49,2,81973,5,10,1,10,1,2,0,0,0,40,0,1 +61,5,66614,1,9,1,10,1,0,0,0,0,40,0,0 +27,2,232782,5,10,0,5,3,0,1,0,0,40,0,0 +19,2,316868,5,10,0,4,3,0,0,0,0,30,4,0 +45,2,196584,9,11,0,3,0,0,1,0,1564,40,0,1 +70,2,105376,5,10,0,9,5,0,0,0,0,40,0,0 +31,2,185814,1,9,0,6,4,1,1,0,0,30,0,0 +22,2,175374,5,10,1,4,1,0,0,0,0,24,0,0 +36,2,108293,1,9,6,4,4,0,1,0,0,24,0,0 +64,2,181232,2,7,1,10,1,0,0,0,2179,40,0,0 +47,4,186009,5,10,2,0,4,0,1,0,0,38,4,0 +34,2,198183,1,9,0,0,0,0,1,0,0,40,0,0 +33,2,163003,0,13,0,1,5,2,1,0,0,40,11,0 +21,2,296158,1,9,0,10,3,0,0,0,0,35,0,0 +48,2,187715,1,9,1,10,1,0,0,0,0,46,0,0 +23,2,214542,0,13,0,2,0,0,0,0,0,40,0,0 +71,1,494223,5,10,4,5,4,1,0,0,1816,2,0,0 +29,2,191535,1,9,2,10,0,0,0,0,0,60,0,0 +42,2,228456,0,13,4,4,5,1,0,0,0,50,0,0 +25,2,252752,1,9,0,4,4,0,1,0,0,40,0,0 +44,5,78374,3,14,2,1,4,2,1,0,0,40,0,0 +28,2,88419,1,9,0,1,0,2,1,0,0,40,7,0 +45,1,201080,3,14,1,5,1,0,0,0,0,40,0,1 +36,2,207157,5,10,2,4,4,0,1,0,0,40,4,0 +39,3,235485,6,12,0,1,0,0,0,0,0,42,0,0 +46,0,102628,3,14,6,11,4,0,0,0,0,40,0,0 +18,2,25828,2,7,0,2,3,0,0,0,0,16,0,0 +66,4,54826,9,11,6,3,0,0,1,0,0,20,0,0 +27,2,124953,1,9,0,4,0,0,0,0,1980,40,0,0 +28,0,175325,1,9,1,11,1,0,0,0,0,40,0,0 +51,2,96062,5,10,1,5,1,0,0,0,1977,40,0,1 +27,2,428030,0,13,0,10,0,0,0,0,0,50,0,0 +28,0,149624,0,13,1,3,1,0,0,0,0,40,0,1 +27,2,253814,1,9,3,5,4,0,1,0,0,25,0,0 +21,2,312956,1,9,0,10,3,1,0,0,0,40,0,0 +34,2,483777,1,9,0,2,0,1,0,0,0,40,0,0 +18,2,183930,1,9,0,4,3,0,0,0,0,12,0,0 +33,2,37274,0,13,1,3,1,0,0,0,0,65,0,0 +44,4,181344,5,10,1,1,1,1,0,0,0,38,0,1 +43,2,114580,5,10,2,0,0,0,1,0,0,40,0,0 +30,2,633742,5,10,0,10,0,1,0,0,0,45,0,0 +40,2,286370,7,4,1,8,1,0,0,0,0,40,4,1 +37,3,29054,5,10,1,0,1,0,0,0,0,42,0,1 +34,2,304030,1,9,1,0,1,1,0,0,0,40,0,0 +41,1,143129,0,13,2,1,0,0,1,0,0,40,0,0 +31,2,99928,3,14,1,3,2,0,1,0,0,50,0,0 +58,0,109567,8,16,1,3,1,0,0,0,0,1,0,1 +38,2,155222,5,10,2,8,0,1,1,0,0,28,0,0 +24,2,159567,5,10,1,8,1,0,0,0,0,40,0,0 +41,4,523910,0,13,1,10,1,1,0,0,0,40,0,0 +47,2,120939,5,10,1,9,1,0,0,0,0,45,0,0 +41,3,130760,0,13,1,9,1,0,0,0,0,24,0,0 +23,2,197387,11,3,1,6,5,0,0,0,0,40,4,0 +36,2,99374,5,10,2,10,0,0,0,0,0,40,0,0 +40,3,56795,3,14,0,1,0,0,1,14084,0,55,0,1 +35,2,138992,3,14,1,3,5,0,0,7298,0,40,0,1 +24,1,32921,1,9,0,5,0,0,0,0,0,40,0,0 +26,2,397317,3,14,0,3,0,0,1,0,1876,40,0,0 +51,2,259323,0,13,1,1,1,0,0,0,0,50,0,1 +42,4,254817,5,10,0,3,0,0,1,0,1340,40,0,0 +37,0,48211,1,9,2,0,4,0,1,0,0,35,0,0 +18,2,140164,2,7,0,5,3,0,1,0,0,40,0,0 +36,2,128757,0,13,1,4,1,1,0,7298,0,36,0,1 +35,2,36270,1,9,2,10,0,0,0,0,0,60,0,0 +58,5,210563,1,9,1,5,2,0,1,15024,0,35,0,1 +17,2,65368,2,7,0,5,3,0,1,0,0,12,0,0 +44,4,160943,1,9,1,6,1,1,0,0,0,40,0,0 +37,2,208358,1,9,1,10,1,0,0,0,0,40,0,1 +35,2,153790,5,10,0,5,0,3,1,0,0,40,0,0 +60,2,85815,1,9,1,10,1,2,0,0,0,40,0,0 +54,5,125417,7,4,1,8,1,0,0,0,0,40,0,1 +37,2,635913,0,13,0,1,0,1,0,0,0,60,0,1 +50,2,313321,6,12,2,5,0,0,1,0,0,40,0,0 +38,2,182609,0,13,1,5,1,0,0,0,0,50,12,0 +45,2,109434,0,13,1,3,1,0,0,0,0,55,0,0 +25,2,255004,12,6,0,10,0,0,0,0,0,40,0,0 +31,2,197860,5,10,1,2,1,0,0,0,0,40,0,0 +90,2,51744,1,9,0,4,0,1,0,0,2206,40,0,0 +54,2,176681,1,9,1,0,1,1,0,0,0,20,0,0 +53,4,140359,13,1,0,8,0,0,1,0,0,35,0,0 +18,2,243313,1,9,0,5,3,0,1,0,0,40,0,0 +66,1,167687,1,9,1,7,1,0,0,1409,0,50,0,0 +75,2,314209,9,11,6,0,0,0,1,0,0,20,13,0 +65,2,176796,1,9,2,0,0,0,1,0,0,40,0,0 +35,2,538583,2,7,4,6,0,1,0,3674,0,40,0,0 +41,2,130408,1,9,2,5,4,1,1,0,0,38,0,0 +25,2,159732,5,10,0,0,0,0,0,0,0,42,0,0 +33,2,110978,5,10,2,10,5,4,1,0,0,40,0,0 +28,2,76714,10,15,0,3,0,0,0,0,0,55,0,1 +59,0,268700,1,9,1,4,1,0,0,0,0,40,0,0 +40,0,170525,5,10,0,0,0,0,1,0,0,38,0,0 +41,2,180138,0,13,1,1,1,0,0,0,0,50,10,1 +38,4,115076,3,14,1,1,1,0,0,0,0,70,0,1 +23,2,115458,1,9,0,6,3,0,0,0,0,40,0,0 +40,2,347890,0,13,1,3,1,0,0,0,0,40,0,1 +41,1,196001,1,9,1,4,2,0,1,0,0,20,0,0 +24,0,273905,6,12,1,11,1,0,0,0,0,50,0,0 +38,2,179488,5,10,2,10,0,0,0,0,1741,40,0,0 +58,2,236596,1,9,1,0,1,0,0,0,0,45,0,1 +32,2,183916,1,9,0,4,0,0,1,0,0,34,0,0 +40,2,207578,6,12,1,9,1,0,0,0,1977,60,0,1 +41,2,112763,10,15,1,3,2,0,1,0,0,40,0,1 +42,2,390781,0,13,1,0,2,1,1,0,0,40,0,0 +59,4,171328,12,6,6,4,4,1,1,0,0,30,0,0 +19,4,27382,5,10,0,0,3,0,0,0,0,40,0,0 +58,2,259014,5,10,0,6,0,0,0,0,0,20,0,0 +42,1,303044,1,9,1,7,1,2,0,0,0,40,14,1 +20,2,117789,1,9,0,4,3,0,1,0,0,40,0,0 +32,2,172579,1,9,4,4,0,0,1,0,0,30,0,0 +45,2,187666,9,11,6,1,0,0,1,0,0,45,0,0 +50,2,204518,7,4,2,10,0,0,0,0,0,40,0,0 +36,2,150042,0,13,2,3,3,0,1,0,0,40,0,0 +45,2,98092,1,9,1,5,1,0,0,0,0,60,0,0 +17,2,245918,2,7,0,4,3,0,0,0,0,12,0,0 +59,2,146013,5,10,1,5,1,0,0,4064,0,40,0,0 +26,2,378322,2,7,1,10,1,0,0,0,0,40,0,0 +37,5,257295,5,10,1,1,1,2,0,0,0,75,15,1 +64,2,21174,1,9,1,1,1,0,0,0,0,40,0,1 +33,2,185480,0,13,0,3,0,0,1,0,0,45,0,0 +33,2,222205,1,9,1,10,2,0,1,0,0,40,0,1 +61,2,69867,1,9,1,1,1,0,0,0,0,40,0,1 +17,2,191260,4,5,0,4,3,0,0,1055,0,24,0,0 +50,1,30653,3,14,1,7,1,0,0,2407,0,98,0,0 +27,4,209109,3,14,0,3,3,0,0,0,0,35,0,0 +30,2,70377,1,9,2,3,3,0,1,0,0,40,0,0 +43,2,477983,1,9,1,2,1,1,0,0,0,40,0,0 +44,2,170924,5,10,1,10,1,0,0,7298,0,40,0,1 +35,2,190174,5,10,0,1,0,0,1,0,0,40,0,0 +25,2,193787,5,10,0,9,3,0,1,0,0,40,0,0 +24,2,279472,5,10,1,8,2,0,1,7298,0,48,0,1 +22,2,34918,0,13,0,3,0,0,1,0,0,15,9,0 +42,4,97688,5,10,1,10,1,0,0,5178,0,40,0,1 +34,2,175413,6,12,2,5,4,1,1,0,0,45,0,0 +60,2,173960,0,13,2,3,0,0,1,0,0,42,0,0 +21,2,205759,1,9,0,2,3,0,0,0,0,40,0,0 +57,3,425161,3,14,1,5,1,0,0,15024,0,40,0,1 +41,2,220531,10,15,1,3,1,0,0,0,0,60,0,1 +50,2,176609,5,10,2,4,0,0,0,0,0,45,0,0 +25,2,371987,0,13,0,1,0,0,1,0,0,40,0,0 +50,2,193884,7,4,1,10,1,0,0,0,0,40,16,0 +36,2,200352,0,13,1,3,1,0,0,0,0,45,0,0 +31,2,127595,1,9,2,3,0,0,1,0,0,40,0,0 +29,4,220419,0,13,0,11,0,0,0,0,0,56,0,0 +21,2,231931,5,10,0,5,3,0,0,0,0,45,0,0 +27,2,248402,0,13,0,9,4,1,1,0,0,40,0,0 +65,2,111095,1,9,1,6,1,0,0,0,0,16,0,0 +37,5,57424,0,13,2,5,0,0,1,0,0,60,0,0 +24,2,278130,1,9,0,10,3,0,0,0,0,40,0,0 +38,2,169469,1,9,2,5,0,0,0,0,0,80,0,0 +48,2,146268,0,13,1,0,1,0,0,7688,0,40,0,1 +21,2,153718,5,10,0,4,0,2,1,0,0,25,0,0 +31,2,217460,1,9,1,6,1,0,0,0,0,45,0,1 +55,2,238638,1,9,1,5,1,0,0,4386,0,40,0,1 +24,2,303296,5,10,1,0,2,2,1,0,0,40,17,0 +43,2,173321,1,9,2,0,0,0,1,0,0,40,0,0 +26,2,193945,6,12,0,9,0,0,0,0,0,45,0,0 +46,2,83082,6,12,0,3,0,0,1,0,0,33,0,0 +35,2,193815,6,12,1,0,1,0,0,0,0,40,0,1 +41,5,34987,5,10,1,7,1,0,0,0,0,54,0,1 +26,2,59306,0,13,0,5,0,0,0,0,0,40,0,0 +34,2,142897,3,14,1,1,1,2,0,7298,0,35,18,1 +36,1,205607,0,13,2,3,0,1,1,0,0,40,0,1 +22,2,199698,5,10,0,5,3,0,0,0,0,15,0,0 +24,2,191954,5,10,0,8,0,0,0,0,0,40,0,0 +77,1,138714,5,10,1,5,1,0,0,0,0,40,0,0 +22,2,399087,11,3,1,8,5,0,1,0,0,40,4,0 +29,2,423158,5,10,0,9,0,0,1,0,0,40,0,0 +62,2,159841,1,9,6,4,0,0,1,0,0,24,0,0 +39,1,174308,1,9,1,1,1,0,0,0,0,40,0,0 +43,2,50356,5,10,1,10,1,0,0,0,1485,50,0,0 +35,2,186110,1,9,2,6,0,0,0,0,0,45,0,0 +29,2,200381,2,7,0,1,0,0,1,0,0,40,0,0 +76,1,174309,3,14,1,10,1,0,0,0,0,10,0,0 +63,1,78383,1,9,1,7,1,0,0,0,0,45,0,0 +43,2,187728,5,10,1,3,2,0,1,0,1887,50,0,1 +58,1,321171,1,9,1,2,1,0,0,0,0,40,0,0 +66,2,127921,1,9,0,6,0,0,0,2050,0,55,0,0 +41,2,206565,5,10,0,10,0,1,0,0,0,45,0,0 +26,2,224563,0,13,0,0,0,0,0,0,0,40,0,0 +47,2,178686,9,11,0,4,0,0,0,0,0,40,0,0 +55,4,98545,12,6,1,0,1,0,0,0,0,40,0,0 +53,2,242606,1,9,1,6,1,0,0,0,0,40,0,0 +17,2,270942,11,3,0,4,5,0,0,0,0,48,4,0 +30,2,94235,1,9,0,10,5,0,0,0,0,40,0,0 +49,2,71195,3,14,0,3,0,0,0,0,0,60,0,0 +19,2,104112,1,9,0,5,4,1,0,0,0,30,19,0 +45,2,261192,1,9,1,4,1,1,0,0,0,40,0,0 +26,2,94936,6,12,0,5,0,0,0,0,0,40,0,0 +38,2,296478,9,11,1,10,1,0,0,7298,0,40,0,1 +36,0,119272,1,9,1,11,1,0,0,7298,0,40,0,1 +33,2,85043,1,9,0,7,0,0,0,0,0,20,0,0 +22,0,293364,5,10,0,11,3,1,1,0,0,40,0,0 +43,1,241895,0,13,0,5,0,0,0,0,0,42,0,0 +56,2,101128,6,12,3,4,0,0,0,0,0,25,10,0 +31,2,156464,0,13,0,3,3,0,0,0,0,25,0,0 +33,2,117963,0,13,1,1,1,0,0,0,0,40,0,1 +26,2,192262,1,9,1,4,1,0,0,0,0,40,0,0 +33,2,111363,0,13,1,1,1,0,0,0,0,40,0,1 +46,4,329752,2,7,1,6,1,0,0,0,0,30,0,0 +38,3,95432,1,9,1,0,1,0,0,0,0,40,0,1 +65,2,161400,2,7,6,4,4,4,0,0,0,40,0,0 +40,2,96129,9,11,1,9,1,0,0,0,0,40,0,1 +42,2,111949,1,9,1,0,2,0,1,0,0,35,0,0 +26,1,117125,4,5,1,10,1,0,0,0,0,40,20,0 +36,2,348022,12,6,1,4,2,0,1,0,0,24,0,0 +62,2,270092,3,14,1,3,1,0,0,0,0,40,0,1 +43,2,180609,0,13,1,6,1,0,0,0,0,45,0,0 +43,2,174575,0,13,2,1,0,0,0,0,1564,45,0,1 +22,2,410439,1,9,3,5,0,0,0,0,0,55,0,0 +28,2,92262,1,9,1,10,1,0,0,0,0,40,0,0 +56,1,183081,5,10,1,5,1,0,0,0,0,45,0,0 +22,2,362589,6,12,0,5,0,0,1,0,0,15,0,0 +57,2,212448,0,13,2,1,0,0,1,0,0,45,0,1 +39,2,481060,1,9,2,5,4,0,1,0,0,40,0,0 +26,3,185885,5,10,0,0,4,0,1,0,0,15,0,0 +17,2,89821,2,7,0,4,3,0,0,0,0,10,0,0 +40,0,184018,9,11,1,8,1,0,0,0,0,38,0,1 +45,2,256649,1,9,1,8,1,1,0,0,0,40,0,0 +44,2,160323,1,9,0,10,0,1,0,0,0,40,0,0 +20,4,350845,5,10,0,0,3,0,1,0,0,10,0,0 +33,2,267404,1,9,1,10,2,0,1,0,0,40,0,0 +23,2,35633,5,10,0,5,0,0,0,0,0,40,0,0 +46,1,80914,3,14,2,1,0,0,0,0,0,30,0,0 +38,2,172927,1,9,1,5,1,0,0,0,0,50,0,0 +54,2,174319,1,9,2,6,0,0,0,0,0,40,0,0 +46,2,214955,11,3,2,10,0,0,1,0,2339,45,0,0 +25,2,344991,5,10,1,10,1,0,0,0,0,40,0,0 +46,2,108699,5,10,2,5,0,0,1,0,0,40,0,0 +36,4,117312,5,10,1,6,2,0,1,0,0,40,0,0 +23,2,396099,1,9,0,4,0,0,1,0,0,25,0,0 +29,2,134152,1,9,4,8,0,0,0,0,0,40,0,0 +44,2,162028,5,10,1,0,2,0,1,0,2415,6,0,1 +19,2,25429,5,10,0,0,3,0,1,0,0,16,0,0 +19,2,232392,1,9,0,4,5,0,1,0,0,40,0,0 +35,2,220098,1,9,1,4,2,0,1,0,0,40,0,1 +27,2,301302,0,13,0,10,0,0,0,0,0,50,0,0 +46,1,277946,6,12,4,10,0,0,0,0,0,40,0,0 +34,2,196164,1,9,0,4,0,0,1,0,0,35,0,0 +44,2,115562,5,10,1,9,1,0,0,0,0,40,0,0 +45,2,96975,5,10,2,2,4,0,1,0,0,40,0,0 +25,2,86872,0,13,1,1,1,0,0,0,0,55,0,1 +52,5,132178,0,13,1,1,1,0,0,0,0,50,0,1 +20,2,416103,5,10,0,2,3,0,0,0,0,40,0,0 +28,2,108574,5,10,0,4,0,0,1,0,0,40,0,0 +50,0,288353,0,13,1,11,1,0,0,0,0,40,0,1 +34,2,227689,9,11,2,9,0,0,1,0,0,64,0,0 +28,2,166481,7,4,1,2,1,4,0,0,2179,40,5,0 +41,2,445382,3,14,1,1,1,0,0,0,1977,65,0,1 +28,2,110145,1,9,1,0,1,0,0,0,0,40,0,0 +46,1,317253,1,9,1,10,1,0,0,0,0,25,0,0 +32,2,364657,5,10,1,1,1,0,0,0,0,50,0,0 +41,4,42346,5,10,2,4,0,1,1,0,0,24,0,0 +24,2,241951,1,9,0,2,4,1,1,0,0,40,0,0 +33,2,118500,5,10,2,1,4,0,1,0,0,40,0,0 +46,2,188386,8,16,1,1,1,0,0,15024,0,60,0,1 +31,0,1033222,5,10,1,8,1,0,0,0,0,40,0,0 +35,2,92440,14,8,2,10,0,0,0,0,0,50,0,1 +52,2,190762,15,2,1,8,1,0,0,0,0,40,4,0 +30,2,426017,2,7,0,4,3,0,1,0,0,19,0,0 +34,4,243867,2,7,4,8,0,1,0,0,0,40,0,0 +34,0,240283,1,9,2,6,4,0,1,0,0,40,0,0 +20,2,61777,5,10,1,5,1,0,0,0,0,30,0,0 +17,2,175024,2,7,0,2,3,0,0,2176,0,18,0,0 +32,0,92003,0,13,1,1,2,0,1,0,0,40,0,1 +29,2,188401,1,9,2,7,0,0,0,0,0,40,0,0 +33,2,228528,12,6,0,10,4,0,1,0,0,35,0,0 +25,2,133373,1,9,1,6,1,0,0,0,0,60,0,0 +36,3,255191,3,14,0,3,0,0,0,0,1408,40,0,0 +23,2,204653,1,9,0,2,0,0,0,0,0,72,21,0 +63,5,222289,1,9,1,1,1,0,0,0,0,40,0,1 +47,4,287480,3,14,1,3,1,0,0,0,0,40,0,0 +40,1,204116,0,13,3,3,0,0,1,2174,0,40,0,0 +30,2,29662,6,12,1,4,2,0,1,0,0,25,0,1 +27,2,116358,5,10,0,10,3,2,0,0,1980,40,11,0 +33,2,208405,3,14,1,3,1,0,0,0,0,50,0,1 +34,4,284843,1,9,0,7,0,1,0,594,0,60,0,0 +34,4,117018,5,10,0,11,0,0,1,0,0,40,0,0 +23,2,81281,5,10,1,0,1,0,0,0,0,40,0,0 +42,4,340148,5,10,1,0,2,0,1,0,0,40,0,0 +29,2,363425,0,13,0,3,0,0,0,0,0,40,0,0 +45,2,45857,1,9,2,0,0,0,1,0,0,28,0,0 +24,3,191073,1,9,0,12,3,0,0,0,0,40,0,0 +44,2,116632,5,10,1,3,1,0,0,0,0,40,0,1 +27,2,405855,4,5,0,10,5,0,0,0,0,40,4,0 +20,2,298227,5,10,0,5,0,0,0,0,0,35,0,0 +44,2,290521,1,9,6,1,4,1,1,0,0,40,0,0 +51,2,56915,1,9,1,10,1,3,0,0,0,40,0,0 +20,2,146538,1,9,1,8,1,0,0,0,0,40,0,0 +19,2,206399,1,9,0,8,3,1,1,0,0,40,0,0 +45,5,197332,5,10,1,10,1,0,0,0,0,55,0,1 +60,2,245062,1,9,1,10,1,0,0,0,0,40,0,1 +44,1,234885,1,9,1,5,2,0,1,0,0,40,0,1 +40,2,72887,9,11,1,8,1,2,0,0,0,40,0,1 +30,2,180374,1,9,1,1,2,0,1,0,0,40,0,0 +38,2,351299,5,10,1,6,1,1,0,0,0,50,0,0 +23,2,54012,1,9,1,6,1,0,0,0,0,60,0,0 +44,2,116632,6,12,0,7,3,0,0,0,0,40,0,0 +54,4,288825,1,9,1,6,1,1,0,0,0,40,0,0 +32,2,132601,0,13,1,3,1,0,0,0,0,50,0,0 +50,2,193374,15,2,3,10,4,0,0,0,0,40,0,0 +24,2,170070,0,13,0,9,0,0,1,0,0,20,0,0 +37,2,126708,1,9,1,0,2,0,1,0,0,60,0,0 +52,2,35598,1,9,2,6,4,0,0,0,0,40,0,0 +38,2,33983,5,10,1,6,1,0,0,0,0,40,0,0 +49,2,192776,3,14,1,1,1,0,0,0,1977,45,0,1 +30,2,118551,0,13,1,9,2,0,1,0,0,16,0,1 +60,2,201965,5,10,0,3,4,0,0,0,0,40,0,1 +35,2,285020,1,9,0,10,0,0,0,0,0,40,0,0 +30,2,303990,1,9,0,6,0,0,0,0,0,60,0,0 +67,2,49401,9,11,2,4,0,0,1,0,0,24,0,0 +46,2,279196,0,13,0,10,0,0,1,0,0,40,0,0 +17,2,211870,4,5,0,4,0,0,0,0,0,6,0,0 +22,2,281432,5,10,0,2,3,0,0,0,0,30,0,0 +27,2,161155,12,6,0,4,0,0,0,0,0,40,0,0 +23,2,197904,1,9,0,4,4,0,1,0,0,35,0,0 +33,2,111746,6,12,1,10,1,0,0,0,0,45,20,0 +43,1,170721,5,10,1,10,1,0,0,0,0,20,0,0 +28,0,70100,0,13,0,3,0,0,0,0,0,20,0,0 +41,2,193626,1,9,3,10,4,0,1,0,0,40,0,0 +25,2,189775,5,10,3,0,3,1,1,0,0,20,0,0 +59,4,286967,1,9,1,6,1,0,0,0,0,45,0,0 +45,4,164427,0,13,2,3,4,0,1,0,0,40,0,0 +38,2,91039,0,13,1,5,1,0,0,15024,0,60,0,1 +40,2,347934,1,9,0,4,0,0,1,0,0,35,0,0 +46,3,371373,1,9,2,0,0,0,0,0,0,40,0,0 +35,2,32220,6,12,0,1,0,0,1,0,0,60,0,0 +34,2,187251,1,9,2,3,4,0,1,0,0,25,0,0 +33,2,178107,0,13,0,10,3,0,0,0,0,20,0,0 +41,2,343121,1,9,2,0,4,0,1,0,0,36,0,0 +20,2,262749,5,10,0,8,3,0,0,0,0,40,0,0 +23,2,403107,11,3,0,4,3,0,0,0,0,40,22,0 +26,2,64293,5,10,0,3,0,0,1,0,0,35,0,0 +23,4,324960,1,9,0,7,0,0,0,0,0,40,12,0 +62,4,114060,1,9,1,6,1,0,0,0,0,40,0,0 +52,2,48925,5,10,1,0,1,0,0,0,0,40,0,0 +58,2,180980,5,10,2,4,4,0,1,0,0,42,23,0 +25,2,181054,0,13,0,5,0,0,1,0,0,40,0,0 +24,2,388093,0,13,0,1,0,1,0,0,0,40,0,0 +19,2,249609,5,10,0,11,3,0,0,0,0,8,0,0 +43,2,112131,5,10,1,1,1,0,0,0,0,40,0,0 +47,4,543162,1,9,4,0,4,1,1,0,0,40,0,0 +39,2,91996,1,9,2,4,4,0,1,0,0,40,0,0 +49,2,141944,9,11,3,2,4,0,0,0,1380,42,0,0 +32,2,37070,9,11,0,10,0,0,0,0,0,45,0,0 +34,2,337587,5,10,1,3,1,0,0,0,0,50,0,1 +28,2,189346,1,9,2,10,0,0,0,0,0,45,0,0 +25,2,267044,5,10,0,0,0,3,1,0,0,20,0,0 +34,2,108116,0,13,1,3,1,0,0,0,0,50,0,1 +38,5,99146,0,13,1,1,1,0,0,15024,0,80,0,1 +50,2,196232,1,9,1,1,1,0,0,7688,0,50,0,1 +24,4,248344,5,10,2,2,0,1,0,0,0,50,0,0 +37,4,186035,5,10,1,9,1,0,0,0,0,45,0,1 +44,2,177905,5,10,2,8,4,0,0,0,0,58,0,1 +28,2,85812,5,10,1,5,2,0,1,0,0,40,0,0 +42,2,221172,0,13,1,1,1,0,0,0,0,40,0,1 +74,2,99183,5,10,2,0,0,0,1,0,0,9,0,0 +38,1,190387,1,9,1,10,1,0,0,0,0,50,0,0 +44,1,202692,3,14,1,3,1,0,0,0,0,40,0,0 +44,2,109339,2,7,2,8,4,4,1,0,0,46,5,0 +26,2,108658,1,9,0,8,0,0,0,0,0,40,0,0 +36,2,197202,1,9,1,4,1,1,0,0,0,40,0,0 +41,2,101739,6,12,1,1,2,0,1,0,0,50,0,1 +67,2,231559,10,15,1,3,1,0,0,20051,0,48,0,1 +39,4,207853,14,8,1,9,1,0,0,0,0,50,0,0 +57,2,190942,15,2,6,13,0,1,1,0,0,30,0,0 +29,2,102345,9,11,4,10,0,0,0,0,0,40,0,0 +31,5,41493,0,13,0,7,0,0,1,0,0,45,0,0 +44,2,210525,5,10,1,6,1,0,0,0,0,40,0,0 +29,2,133937,8,16,0,3,3,0,0,0,0,40,0,0 +30,2,237903,5,10,0,2,4,0,1,0,0,40,0,0 +27,2,163862,1,9,0,6,0,0,0,0,0,40,0,0 +27,2,201872,5,10,1,5,1,0,0,0,0,50,0,0 +32,2,84179,1,9,0,2,0,0,1,0,0,45,0,0 +58,2,51662,12,6,1,4,2,0,1,0,0,8,0,0 +35,4,233327,5,10,1,11,1,0,0,0,0,40,0,0 +21,2,259510,1,9,0,2,3,0,0,0,0,36,0,0 +28,2,184831,5,10,0,10,4,0,0,0,0,40,0,0 +46,1,245724,5,10,2,1,0,0,0,0,0,50,0,0 +36,1,27053,1,9,4,4,4,0,1,0,0,40,0,0 +72,2,205343,2,7,6,0,4,0,1,0,0,40,0,0 +35,2,229328,1,9,1,8,2,1,1,0,0,40,0,0 +33,3,319560,9,11,2,10,4,1,1,0,0,40,0,1 +69,2,136218,2,7,0,8,0,0,1,0,0,40,0,0 +35,2,54576,1,9,1,8,1,0,0,0,0,40,0,0 +34,2,148291,1,9,1,9,2,0,1,0,0,32,0,0 +30,2,152453,2,7,1,4,1,0,0,0,0,40,4,0 +28,2,114053,0,13,0,6,0,0,0,0,0,55,0,0 +54,2,212960,0,13,1,5,1,0,0,0,0,35,0,1 +47,2,264052,5,10,1,3,1,0,0,0,0,50,0,1 +24,2,82804,1,9,0,2,4,1,1,0,0,40,0,0 +52,1,334273,0,13,1,3,1,0,0,0,0,60,0,1 +20,2,27337,1,9,0,2,3,3,0,0,0,48,0,0 +43,5,188436,3,14,1,1,1,0,0,5013,0,45,0,0 +45,2,433665,7,4,4,4,4,0,1,0,0,40,4,0 +29,1,110663,1,9,4,10,0,0,0,0,0,35,0,0 +47,2,87490,3,14,2,1,4,0,0,0,0,42,0,0 +24,2,354351,1,9,0,10,3,0,0,0,0,40,0,0 +51,2,95469,1,9,1,3,1,0,0,0,0,40,0,0 +17,2,242718,2,7,0,5,3,0,0,0,0,12,0,0 +37,2,22463,9,11,1,10,1,0,0,0,1977,40,0,1 +27,2,158156,8,16,0,3,0,0,1,0,0,70,0,0 +29,2,350162,0,13,1,1,2,0,0,0,0,40,0,1 +36,1,28738,6,12,2,5,4,0,1,0,0,35,0,0 +58,4,283635,0,13,0,3,0,0,1,0,0,40,0,0 +26,1,86646,5,10,1,10,1,0,0,0,0,45,0,0 +57,2,69884,1,9,1,5,1,0,0,0,0,40,0,1 +59,2,199713,1,9,1,10,1,0,0,0,0,40,0,0 +27,2,181659,1,9,1,8,1,0,0,0,0,40,0,0 +31,1,340939,0,13,0,9,0,0,0,0,0,40,0,0 +21,2,197747,5,10,0,5,3,0,1,0,0,24,0,0 +29,2,34292,5,10,0,0,0,0,0,0,0,60,0,0 +18,2,156764,2,7,0,4,3,0,0,0,0,40,0,0 +52,2,25826,12,6,1,10,1,0,0,0,1887,47,0,1 +57,5,103948,0,13,2,3,0,0,0,0,0,80,0,0 +60,2,39352,7,4,0,6,0,0,0,0,0,48,0,1 +31,2,168387,0,13,1,3,1,0,0,7688,0,40,8,1 +23,2,117789,0,13,0,0,3,0,1,0,0,40,0,0 +27,2,267147,1,9,0,5,3,0,0,0,0,40,0,0 +42,1,214242,10,15,1,3,1,0,0,0,1902,50,0,1 +25,2,200408,5,10,0,9,0,0,0,2174,0,40,0,0 +49,2,136455,0,13,0,3,0,0,1,0,0,45,0,0 +32,2,239824,0,13,0,9,0,0,0,0,0,40,0,0 +19,2,217039,5,10,0,0,3,0,0,0,0,28,0,0 +60,2,51290,7,4,2,4,0,0,1,0,0,40,0,0 +42,4,175674,4,5,1,4,1,0,0,0,0,40,0,0 +35,1,194404,6,12,0,7,0,0,0,0,0,40,0,0 +48,2,45612,1,9,0,0,4,1,1,0,0,37,0,0 +51,2,410114,3,14,1,10,1,0,0,0,0,40,0,1 +29,2,182521,1,9,0,10,0,3,0,0,0,40,0,0 +36,4,339772,1,9,4,1,0,1,0,0,0,40,0,0 +17,2,169658,12,6,0,4,3,0,1,0,0,21,0,0 +52,2,200853,3,14,2,3,0,0,1,6849,0,60,0,0 +24,2,247564,1,9,0,10,0,0,0,0,0,40,0,0 +24,2,249909,1,9,1,2,1,0,0,0,0,50,0,0 +26,4,208122,0,13,0,3,3,0,0,1055,0,40,0,0 +27,2,109881,0,13,0,4,3,0,1,0,0,20,0,0 +39,2,207824,1,9,0,2,3,0,0,0,0,60,0,0 +30,2,369027,1,9,1,6,1,1,0,0,0,45,0,0 +50,1,114117,1,9,1,1,1,0,0,0,0,32,0,0 +52,5,51048,0,13,1,5,1,0,0,0,0,55,0,0 +46,2,102388,10,15,1,3,1,0,0,15024,0,45,0,1 +23,2,190483,0,13,0,5,3,0,1,0,0,20,0,0 +45,2,462440,2,7,6,4,0,1,1,0,0,20,0,0 +65,2,109351,4,5,6,13,4,1,1,0,0,24,0,0 +29,2,34383,9,11,1,6,1,0,0,0,0,55,0,0 +47,2,241832,4,5,3,2,4,0,0,0,0,40,22,0 +30,2,124187,1,9,0,7,3,1,0,0,0,60,0,0 +34,2,153614,1,9,1,5,1,0,0,0,0,45,0,1 +38,1,267556,1,9,1,5,1,0,0,0,0,64,0,0 +33,2,205469,5,10,1,1,1,0,0,0,0,40,0,1 +49,2,268090,0,13,1,5,1,0,0,0,0,26,0,1 +47,1,165039,5,10,0,4,4,1,1,0,0,40,0,0 +49,4,120451,12,6,4,4,4,1,1,0,0,40,0,0 +43,2,154374,5,10,1,10,1,0,0,15024,0,60,0,1 +30,2,103649,0,13,1,0,2,1,1,0,0,40,0,1 +58,1,35723,1,9,1,10,1,0,0,0,0,60,0,0 +19,2,262601,1,9,0,4,3,0,1,0,0,14,0,0 +21,2,226181,0,13,0,2,0,0,0,0,0,40,0,0 +33,2,175697,0,13,1,1,1,0,0,15024,0,60,0,1 +47,5,248145,11,3,1,6,1,0,0,0,0,50,1,0 +52,1,289436,8,16,1,3,1,0,0,0,0,60,0,1 +26,2,75654,1,9,2,10,0,0,0,0,0,55,0,0 +60,2,199378,1,9,1,10,1,0,0,0,0,40,0,0 +21,2,160968,5,10,0,2,3,0,0,0,0,40,0,0 +36,2,188563,5,10,1,5,1,0,0,5178,0,50,0,1 +31,2,55849,5,10,1,10,1,0,0,0,0,45,0,0 +50,5,195322,8,16,4,3,0,0,0,0,0,40,0,1 +31,4,402089,1,9,2,0,4,0,1,0,0,40,0,0 +71,2,78277,1,9,1,10,1,0,0,0,0,15,0,0 +30,0,169496,0,13,1,9,1,0,0,0,0,40,0,1 +20,2,130959,5,10,0,4,3,0,0,0,0,20,0,0 +24,2,556660,1,9,0,1,5,0,0,4101,0,50,0,0 +35,2,292472,8,16,1,3,1,2,0,0,0,40,18,1 +38,0,143774,5,10,4,1,0,0,1,0,0,45,0,0 +27,2,288341,1,9,0,8,3,0,1,0,0,32,0,0 +29,0,71592,5,10,0,0,4,2,1,0,0,40,11,0 +34,2,106742,1,9,1,10,1,0,0,0,0,45,0,0 +44,2,219288,7,4,1,10,1,0,0,0,0,35,0,0 +43,2,174524,1,9,1,8,1,0,0,0,0,40,0,1 +44,1,335183,14,8,1,2,1,1,0,0,0,40,0,1 +35,2,261293,3,14,0,5,0,0,0,0,0,60,0,0 +27,2,111900,5,10,0,3,0,0,0,0,0,40,0,0 +43,4,194360,3,14,0,3,0,0,0,0,0,38,0,0 +20,2,81145,5,10,0,5,0,0,1,0,0,25,0,0 +42,2,341204,6,12,2,3,4,0,1,8614,0,40,0,1 +27,0,249362,5,10,1,6,1,0,0,3411,0,40,0,0 +42,2,247019,1,9,1,10,1,1,0,0,0,40,0,1 +24,2,172146,4,5,0,8,0,0,0,0,1721,40,0,0 +48,3,110457,5,10,2,1,0,0,0,0,0,40,0,0 +17,1,368700,2,7,0,7,3,0,0,0,0,10,0,0 +33,2,182556,0,13,1,1,1,0,0,0,0,40,0,1 +50,5,219420,1,9,1,5,1,0,0,0,0,50,0,1 +22,2,240817,1,9,0,5,3,0,1,2597,0,40,0,0 +17,2,102726,14,8,0,4,3,0,0,0,0,16,0,0 +32,2,226267,5,10,1,0,1,0,0,0,0,40,4,0 +31,2,125457,1,9,0,10,0,0,0,0,0,45,0,0 +58,1,204021,1,9,6,1,0,0,0,0,0,50,0,0 +29,4,92262,1,9,0,11,3,0,0,0,0,48,0,0 +37,2,161141,9,11,1,10,1,0,0,0,0,40,20,1 +34,1,190290,1,9,1,10,1,0,0,0,0,40,0,1 +23,4,430828,5,10,4,1,4,1,0,0,0,40,0,0 +18,0,59342,2,7,0,0,3,0,1,0,0,5,0,0 +34,2,136721,1,9,2,1,0,0,1,0,0,40,0,0 +45,4,86644,0,13,1,3,2,0,1,0,0,55,0,0 +41,2,195124,3,14,0,1,0,0,0,0,0,35,21,0 +26,2,167350,1,9,0,4,5,0,0,0,0,30,0,0 +54,4,113000,5,10,1,7,1,0,0,0,0,40,0,0 +24,2,140027,5,10,0,8,3,1,1,0,0,45,0,0 +42,2,262425,5,10,1,3,1,0,0,0,0,50,0,0 +20,2,316702,5,10,0,3,3,0,0,0,0,20,0,0 +23,0,335453,0,13,0,9,0,0,1,0,0,20,0,0 +35,2,203628,3,14,0,3,0,0,0,0,0,60,0,1 +31,2,118710,3,14,1,9,1,0,0,0,1902,40,0,1 +30,2,189620,0,13,0,3,3,0,1,0,0,40,12,0 +19,2,475028,1,9,0,5,3,0,1,0,0,20,0,0 +36,4,110866,0,13,0,3,0,0,0,0,0,50,0,0 +31,2,243605,0,13,6,5,4,0,1,0,1380,40,1,0 +21,2,163870,5,10,0,2,3,0,0,0,0,30,0,0 +31,1,80145,5,10,1,10,1,0,0,0,0,40,0,0 +46,2,295566,8,16,2,3,4,0,1,25236,0,65,0,1 +44,2,63042,0,13,2,1,3,0,1,0,0,50,0,1 +40,2,229148,14,8,1,4,1,1,0,0,0,40,2,0 +45,2,242552,5,10,0,5,0,1,0,0,0,40,0,0 +60,2,177665,1,9,1,10,1,0,0,0,0,35,0,0 +18,2,208103,2,7,0,4,5,0,0,0,0,25,0,0 +28,2,296450,0,13,1,3,1,0,0,0,0,40,0,0 +36,2,70282,5,10,2,0,4,1,1,0,0,40,0,0 +40,2,144995,9,11,1,9,1,0,0,4386,0,40,0,0 +36,4,382635,0,13,2,0,4,0,1,0,0,35,6,0 +31,2,295697,1,9,4,4,4,1,1,0,0,40,0,0 +33,2,194141,1,9,1,8,1,0,0,0,0,40,0,0 +19,0,378418,1,9,0,9,3,0,1,0,0,40,0,0 +22,2,214399,5,10,0,5,3,0,1,0,0,15,0,0 +34,2,217460,0,13,1,1,1,0,0,0,0,45,0,1 +33,2,182556,1,9,0,4,0,0,0,0,0,40,0,0 +41,2,125831,1,9,1,10,1,0,0,0,2051,60,0,0 +29,2,271328,0,13,0,3,0,0,0,4650,0,40,0,0 +50,4,50459,1,9,1,1,1,0,0,0,0,42,0,1 +42,2,162140,0,13,1,1,1,0,0,7298,0,45,0,1 +44,2,111502,1,9,1,5,2,0,1,0,0,40,0,0 +20,2,299047,5,10,0,4,0,0,1,0,0,20,0,0 +31,2,223212,1,9,1,4,1,0,0,0,0,40,4,0 +23,2,352139,5,10,0,4,0,0,1,0,0,24,0,0 +55,2,173093,5,10,2,0,0,2,1,0,0,40,0,0 +26,2,181655,9,11,1,0,1,0,0,0,2377,45,0,0 +25,2,332702,9,11,0,4,3,0,1,0,0,15,0,0 +35,2,234901,5,10,1,10,1,0,0,2407,0,40,0,0 +36,2,131414,5,10,0,5,0,1,1,0,0,36,0,0 +43,0,260960,0,13,1,3,1,0,0,0,0,50,0,0 +56,2,156052,1,9,6,4,4,1,1,594,0,20,0,0 +42,2,279914,0,13,1,9,1,0,0,0,0,40,0,1 +19,2,192453,5,10,0,4,5,0,1,0,0,25,0,0 +55,1,200939,1,9,1,6,1,0,0,0,0,72,0,0 +42,2,151408,3,14,0,1,0,0,1,14084,0,50,0,1 +26,2,112847,9,11,0,9,3,0,0,0,0,40,0,0 +17,2,316929,14,8,0,2,3,0,0,0,0,20,0,0 +42,4,126319,0,13,1,3,2,0,1,0,0,40,0,1 +55,2,197422,1,9,1,6,1,0,0,7688,0,40,0,1 +32,2,267736,5,10,0,0,3,1,1,0,0,40,0,0 +29,2,267034,2,7,0,10,3,1,0,0,0,40,19,0 +46,0,193047,0,13,1,3,1,0,0,0,0,37,0,0 +29,0,356089,0,13,1,1,1,0,0,7688,0,40,0,1 +22,2,223515,0,13,0,3,4,0,0,0,0,20,0,0 +58,1,87510,12,6,1,10,1,0,0,0,0,40,0,0 +23,2,145111,1,9,0,6,4,0,0,0,0,50,0,0 +39,2,48093,1,9,0,2,0,0,0,0,0,40,0,0 +27,2,31757,9,11,0,10,3,0,0,0,0,38,0,0 +54,2,285854,1,9,1,6,1,0,0,0,0,40,0,1 +33,4,120064,0,13,0,3,0,0,1,0,0,45,0,0 +46,3,167381,1,9,1,0,2,0,1,0,0,40,0,1 +37,2,103408,1,9,0,7,0,1,0,0,0,40,0,0 +36,2,101460,1,9,0,4,0,0,1,0,0,18,0,0 +59,4,420537,1,9,1,0,2,0,1,0,0,38,0,1 +34,4,119411,1,9,2,11,4,0,0,0,0,40,20,0 +53,5,128272,8,16,1,1,1,0,0,0,0,70,0,1 +51,2,386773,0,13,0,5,0,0,0,0,0,55,0,1 +32,2,283268,12,6,4,4,4,0,1,0,0,42,0,0 +31,0,301526,5,10,3,4,5,0,0,0,0,40,0,0 +22,2,151790,5,10,1,5,2,0,1,0,0,30,9,0 +47,1,106252,0,13,2,5,0,0,1,0,0,50,0,0 +32,2,188557,1,9,0,8,0,0,0,0,0,40,0,0 +26,2,171114,5,10,0,7,0,0,1,0,0,38,0,0 +37,2,327323,11,3,4,7,0,0,0,0,0,32,24,0 +31,2,244147,1,9,2,10,4,0,0,0,0,55,0,0 +37,2,280282,9,11,1,9,2,0,1,0,0,24,0,1 +55,2,116442,1,9,0,5,0,0,0,0,0,38,0,0 +23,4,282579,9,11,2,9,0,0,0,0,0,56,0,0 +36,2,51838,5,10,2,0,4,0,1,0,0,40,0,0 +43,2,226902,0,13,1,5,1,0,0,0,0,50,0,1 +54,2,279129,5,10,0,9,0,0,0,0,0,40,0,0 +28,2,196690,9,11,0,8,0,0,1,0,1669,42,0,0 +40,2,130760,9,11,1,1,1,0,0,0,0,50,0,1 +41,1,49572,5,10,1,1,1,0,0,0,0,60,0,0 +40,2,237601,0,13,0,5,0,4,1,0,0,55,0,1 +42,2,169628,5,10,2,0,0,1,1,0,0,38,0,0 +61,1,36671,1,9,1,7,1,0,0,0,2352,50,0,0 +18,2,231193,14,8,0,8,3,0,0,0,0,30,0,0 +48,2,102102,9,11,1,9,1,0,0,0,0,50,0,1 +41,5,32185,0,13,1,9,1,0,0,0,0,40,0,0 +23,2,211046,1,9,0,5,0,0,1,2463,0,40,0,0 +60,2,31577,1,9,1,6,1,0,0,0,0,60,0,1 +22,2,162343,5,10,0,4,5,1,0,0,0,20,0,0 +61,2,128831,1,9,1,8,1,0,0,0,0,40,0,0 +25,2,316688,1,9,0,8,0,1,0,0,0,40,0,0 +46,2,90758,3,14,0,9,0,0,0,0,0,35,0,1 +43,2,274363,0,13,1,1,1,0,0,0,1902,40,7,1 +43,2,154538,6,12,2,10,0,0,0,0,0,40,0,0 +24,2,106085,1,9,0,4,3,1,0,0,1721,30,0,0 +68,1,315859,2,7,0,7,4,0,0,0,0,20,0,0 +31,2,51471,1,9,2,0,4,0,1,0,0,38,0,0 +17,2,193830,2,7,0,5,3,0,1,0,0,20,0,0 +32,2,231043,1,9,1,10,1,0,0,5178,0,48,0,1 +33,2,169879,0,13,1,3,1,0,0,3103,0,47,0,1 +64,2,270333,0,13,1,3,1,0,0,0,0,40,0,1 +20,2,138768,1,9,0,6,3,0,0,0,0,30,0,0 +30,2,191571,1,9,4,4,3,0,1,0,0,36,0,0 +43,2,94113,5,10,2,1,0,0,0,0,0,45,0,0 +22,2,137510,5,10,0,0,3,0,0,0,0,40,0,0 +17,2,32607,12,6,0,7,3,0,0,0,0,20,0,0 +47,1,93208,1,9,1,4,2,0,1,0,0,75,25,0 +41,2,254440,9,11,0,3,0,0,1,0,0,60,0,0 +56,2,186556,5,10,1,10,1,0,0,0,0,50,0,1 +64,2,169871,1,9,1,6,1,0,0,0,0,45,0,0 +47,2,191277,1,9,1,6,1,0,0,0,0,50,0,1 +48,2,167159,9,11,0,0,4,0,0,0,0,40,0,0 +31,2,171871,3,14,0,3,0,0,1,0,0,46,0,0 +29,2,154411,9,11,0,9,3,0,0,0,0,40,0,0 +30,2,129227,1,9,6,0,0,0,1,0,0,40,0,0 +32,2,110331,1,9,1,1,1,0,0,0,1672,60,0,0 +57,2,34269,1,9,6,6,4,0,0,0,653,42,0,1 +62,2,174355,1,9,6,4,0,0,1,0,0,40,0,0 +39,2,680390,1,9,4,8,4,0,1,0,0,24,0,0 +43,2,233130,5,10,0,0,0,0,0,0,0,25,0,0 +24,5,165474,0,13,0,5,3,0,0,0,0,40,0,0 +53,2,194259,5,10,1,0,2,0,1,4386,0,40,0,1 +26,2,280093,5,10,0,2,3,0,0,0,0,40,0,0 +73,1,177387,1,9,1,1,1,0,0,0,0,40,0,0 +55,2,105304,1,9,1,8,1,0,0,0,0,40,0,0 +25,2,499233,1,9,2,0,0,0,0,0,0,40,0,0 +41,2,180572,0,13,2,3,0,0,1,0,0,50,0,1 +24,2,321435,0,13,0,1,0,0,0,0,0,50,0,0 +63,2,86108,1,9,6,7,0,0,0,0,0,6,0,0 +17,2,198124,2,7,0,5,3,0,0,0,0,20,0,0 +35,2,135162,5,10,1,10,1,0,0,0,0,50,0,0 +51,2,146813,5,10,1,3,1,0,0,0,0,40,0,1 +62,4,291175,0,13,6,3,0,0,1,0,0,48,0,0 +55,2,387569,1,9,1,10,1,0,0,4386,0,40,0,1 +43,2,102895,5,10,2,3,0,0,0,0,0,40,0,0 +40,4,33274,1,9,2,4,0,0,1,0,0,50,0,0 +37,2,86551,0,13,1,1,1,0,0,0,0,45,0,1 +39,2,138192,0,13,1,10,1,0,0,0,0,40,0,0 +31,2,118966,1,9,0,10,3,0,0,0,0,18,0,0 +61,2,99784,3,14,6,3,0,0,1,0,0,40,0,1 +26,2,90980,9,11,2,0,0,0,1,0,0,55,0,0 +46,1,177407,1,9,1,5,1,0,0,0,0,50,0,0 +26,2,96467,0,13,0,3,0,0,1,0,0,40,0,0 +48,0,327886,8,16,2,3,3,0,0,0,0,50,0,1 +34,2,111567,1,9,0,6,3,0,0,0,0,40,0,0 +34,4,166545,1,9,0,0,3,0,1,0,0,40,0,0 +59,2,142182,1,9,1,4,1,0,0,0,0,40,0,1 +34,2,188798,0,13,0,3,3,0,1,0,0,40,0,0 +49,2,38563,0,13,0,1,0,0,1,0,0,56,0,1 +18,2,216284,2,7,0,0,3,0,1,0,0,20,0,0 +43,2,191547,1,9,1,7,1,0,0,0,0,40,4,0 +48,2,285335,2,7,1,1,1,0,0,0,0,50,0,0 +28,5,142712,5,10,1,1,1,0,0,0,0,70,0,0 +33,2,80945,1,9,1,8,1,0,0,0,0,40,0,0 +24,2,309055,5,10,0,5,0,0,1,0,0,15,0,0 +21,2,62339,12,6,0,2,0,0,0,0,0,40,0,0 +17,2,368700,2,7,0,5,3,0,0,0,0,28,0,0 +39,2,176186,5,10,1,7,1,0,0,0,0,50,0,1 +29,1,266855,0,13,4,3,3,0,0,0,0,40,0,0 +44,2,48087,0,13,1,1,1,0,0,0,0,40,0,1 +24,2,121313,5,10,0,6,3,0,0,0,0,50,0,0 +71,1,143437,3,14,1,5,1,0,0,10605,0,40,0,1 +51,1,160724,0,13,1,5,1,2,0,0,2415,40,26,1 +55,2,282753,11,3,2,4,4,1,0,0,0,25,0,0 +41,2,194636,0,13,1,1,1,0,0,0,0,60,0,1 +23,2,153044,1,9,0,2,4,1,1,0,0,7,0,0 +38,2,411797,9,11,2,0,4,0,1,0,0,40,0,0 +39,2,117683,1,9,1,6,1,0,0,0,0,40,0,1 +19,2,376540,1,9,0,0,0,0,1,0,0,30,0,0 +49,2,72393,4,5,2,8,0,0,1,0,0,40,0,0 +32,2,270335,0,13,1,0,5,0,0,0,0,40,11,1 +27,2,96226,1,9,1,10,1,0,0,0,0,70,0,0 +38,2,95336,0,13,1,5,1,0,0,0,0,50,0,1 +33,2,258498,5,10,1,10,2,0,1,0,0,60,0,0 +23,2,205865,0,13,0,1,3,0,0,0,0,28,0,0 +54,1,406468,1,9,1,5,1,1,0,0,0,40,0,0 +29,2,177119,9,11,2,9,0,0,1,2174,0,45,0,0 +35,1,372525,0,13,0,1,0,0,0,0,0,40,0,0 +28,2,164170,9,11,1,0,2,2,1,0,0,40,3,0 +37,2,183800,0,13,1,3,1,0,0,7688,0,50,0,1 +42,1,177307,10,15,1,7,1,0,0,0,0,65,0,1 +40,2,170108,3,14,1,3,1,0,0,0,0,40,0,0 +47,2,341995,5,10,2,5,3,0,0,0,0,55,0,0 +22,2,226508,0,13,0,1,3,0,1,0,0,50,0,0 +30,2,87418,0,13,1,1,1,0,0,0,0,45,0,1 +28,2,109165,1,9,1,9,1,0,0,0,0,40,0,0 +63,4,28856,7,4,1,4,1,0,0,0,0,55,0,0 +51,1,175897,4,5,1,10,1,0,0,0,0,20,0,0 +22,2,99697,1,9,0,2,3,0,1,0,0,40,0,0 +35,2,152375,1,9,0,5,0,0,0,0,0,45,0,0 +46,2,171550,1,9,2,8,0,0,1,0,0,38,0,0 +37,2,211154,5,10,2,8,0,0,0,0,0,52,0,0 +24,2,202570,0,13,0,3,3,1,0,0,0,15,0,0 +37,1,168496,1,9,2,2,3,0,0,0,0,10,0,0 +53,2,68898,5,10,1,9,1,0,0,0,0,40,0,0 +27,2,93235,1,9,0,5,0,0,0,0,0,30,0,0 +38,2,278924,5,10,2,10,0,0,0,0,0,44,0,0 +53,1,311020,12,6,1,7,1,0,0,0,0,60,0,0 +34,2,175878,5,10,0,10,0,0,0,0,0,40,0,0 +23,2,543028,1,9,0,5,3,1,0,0,0,40,0,0 +39,2,202027,0,13,1,1,1,0,0,15024,0,45,0,1 +43,2,158926,3,14,1,3,2,2,1,0,0,50,27,0 +67,5,76860,1,9,1,1,1,2,0,0,0,40,0,1 +81,1,136063,1,9,1,1,1,0,0,0,0,30,0,0 +21,2,186648,5,10,0,4,3,0,0,0,0,20,0,0 +23,2,257509,5,10,0,5,0,0,0,0,0,25,0,0 +25,2,98155,5,10,0,6,4,0,0,0,0,40,0,0 +42,2,274198,11,3,1,8,2,0,1,0,0,38,4,0 +38,2,97083,5,10,1,0,2,1,1,0,0,40,0,0 +32,2,262153,1,9,1,8,1,0,0,0,0,40,0,0 +37,2,214738,1,9,1,8,1,0,0,0,0,40,0,0 +51,2,138022,3,14,1,1,1,0,0,0,0,60,0,1 +22,2,91842,5,10,0,5,0,0,1,0,0,42,0,0 +33,2,373662,15,2,3,13,0,0,1,0,0,40,24,0 +42,2,162003,1,9,2,8,0,0,0,0,0,55,0,0 +51,4,241843,13,1,1,4,1,0,0,0,0,40,0,0 +23,2,375871,1,9,1,0,2,0,1,0,0,40,4,0 +37,2,186934,2,7,1,8,1,0,0,3103,0,44,0,1 +37,2,176900,1,9,1,10,1,0,0,0,0,99,0,1 +47,2,21906,3,14,0,3,0,0,1,0,0,25,0,0 +41,2,132222,10,15,1,3,1,0,0,0,2415,40,0,1 +33,2,143653,1,9,1,10,1,0,0,0,0,30,0,0 +31,2,111567,0,13,0,5,0,0,0,0,0,40,0,1 +31,2,78602,6,12,2,4,4,3,1,0,0,40,0,0 +35,2,465507,1,9,1,8,1,1,0,0,0,40,0,0 +38,5,196373,1,9,1,1,1,0,0,0,0,40,0,1 +18,2,293227,1,9,0,4,0,0,1,0,0,45,0,0 +20,2,241752,1,9,1,8,1,0,0,0,0,40,0,0 +54,4,166398,5,10,2,1,4,1,1,0,0,35,0,0 +40,2,184682,5,10,2,0,4,0,1,0,0,40,0,0 +36,5,108293,0,13,1,1,2,0,1,0,1977,45,0,1 +43,2,250802,5,10,2,10,4,0,0,0,0,35,0,0 +44,1,325159,5,10,2,7,4,0,0,0,0,40,0,0 +44,0,174675,1,9,1,3,2,0,1,0,0,40,0,1 +43,2,227065,3,14,1,1,1,0,0,0,0,43,0,1 +51,2,269080,7,4,6,4,4,1,1,0,0,40,0,0 +18,2,177722,1,9,0,4,3,0,1,0,0,20,0,0 +51,2,133461,5,10,1,1,1,0,0,0,0,40,0,0 +44,5,398473,5,10,1,5,1,0,0,0,0,70,0,1 +33,4,298785,12,6,2,6,0,0,0,0,0,40,0,0 +33,1,123424,0,13,1,1,1,0,0,0,0,40,0,1 +42,2,176286,6,12,1,1,1,0,0,0,0,40,0,1 +25,2,150062,5,10,1,3,1,0,0,0,0,45,0,0 +32,2,169240,1,9,2,8,0,0,1,0,0,38,0,0 +32,2,288273,0,13,1,10,1,0,0,0,0,70,4,0 +36,2,526968,12,6,2,1,4,0,1,0,0,40,0,0 +28,2,57066,1,9,1,6,1,0,0,0,0,40,0,0 +20,2,323573,1,9,0,4,3,0,1,0,0,20,0,0 +35,5,368825,5,10,1,5,1,0,0,0,0,60,0,1 +55,1,189721,1,9,1,10,1,0,0,0,0,20,0,0 +48,2,164966,0,13,1,1,1,2,0,0,0,40,3,1 +34,2,202046,1,9,1,10,1,0,0,0,0,35,0,1 +28,2,161538,0,13,0,9,0,0,1,0,0,35,0,0 +67,2,105252,0,13,6,1,0,0,0,0,2392,40,0,1 +37,2,200153,1,9,1,10,1,0,0,0,0,40,0,0 +44,2,32185,1,9,0,6,4,0,0,0,0,70,0,0 +25,2,178326,5,10,0,5,0,0,1,0,0,40,0,0 +21,2,255957,5,10,0,1,0,0,1,4101,0,40,0,0 +40,0,188693,3,14,1,3,1,0,0,0,0,35,0,1 +78,2,182977,1,9,6,4,0,1,1,2964,0,40,0,0 +34,2,159929,1,9,2,2,3,0,0,0,0,40,0,0 +49,2,123207,1,9,0,0,0,0,1,0,0,44,0,0 +22,2,284317,6,12,0,0,0,0,1,0,0,40,0,0 +60,1,154474,1,9,0,7,4,0,0,0,0,42,0,0 +45,4,318280,1,9,6,11,0,0,0,0,0,40,0,1 +63,2,254907,9,11,2,4,0,0,1,0,0,20,0,0 +41,2,349221,1,9,0,10,3,1,1,0,0,35,0,0 +47,2,335973,1,9,2,0,4,0,1,0,0,40,0,0 +44,2,126701,1,9,2,10,4,0,0,0,0,40,0,0 +51,2,122159,5,10,6,3,0,0,1,3325,0,40,0,0 +46,2,187370,0,13,0,5,0,0,0,0,1504,40,0,0 +41,2,194636,9,11,1,8,1,0,0,0,0,40,0,0 +50,1,124793,1,9,1,10,1,0,0,0,0,30,0,0 +47,2,192835,1,9,1,0,1,0,0,0,0,50,0,1 +35,2,290226,1,9,0,1,0,0,0,0,0,45,0,0 +56,2,112840,1,9,1,1,1,0,0,0,0,55,0,1 +45,2,89325,3,14,2,3,0,0,0,0,0,45,0,0 +48,3,33109,0,13,2,1,4,0,0,0,0,58,0,1 +40,2,82465,5,10,1,8,1,0,0,2580,0,40,0,0 +39,5,329980,0,13,1,1,1,0,0,15024,0,50,0,1 +20,2,148294,5,10,0,4,3,0,0,0,0,40,0,0 +50,2,168212,8,16,1,3,1,0,0,0,1902,65,0,1 +38,0,343642,1,9,1,3,2,0,1,0,0,40,0,1 +23,4,115244,0,13,0,3,3,0,1,0,0,60,0,0 +31,2,162572,1,9,0,4,3,0,0,0,0,16,0,0 +58,2,356067,0,13,1,0,1,0,0,0,0,40,0,0 +66,2,271567,1,9,4,8,0,1,0,0,0,40,0,0 +39,5,180804,1,9,1,1,1,0,0,0,0,40,0,1 +54,1,123011,1,9,1,10,1,0,0,15024,0,52,0,1 +26,2,109186,5,10,1,5,1,0,0,0,0,50,9,0 +51,2,220537,1,9,2,8,0,0,1,0,0,40,0,0 +34,2,124827,9,11,0,6,3,0,0,0,0,40,0,0 +50,2,767403,1,9,1,8,1,0,0,3103,0,40,0,1 +42,2,118494,5,10,1,3,1,0,0,0,0,44,0,1 +38,2,173208,3,14,1,3,1,0,0,0,0,25,0,0 +48,2,107373,7,4,1,2,1,0,0,0,0,40,0,0 +33,2,26973,9,11,1,9,2,0,1,0,0,40,0,1 +51,2,191965,1,9,6,4,4,0,1,0,0,32,0,0 +22,2,122346,1,9,2,10,0,0,0,0,0,40,0,0 +41,2,198316,5,10,0,10,0,0,0,0,0,50,28,0 +48,4,123075,3,14,1,3,1,0,0,0,0,35,0,1 +42,2,209370,1,9,4,5,0,0,1,0,0,30,0,0 +34,2,33117,5,10,1,4,1,0,0,0,0,40,0,0 +23,2,129042,1,9,0,8,4,1,1,0,0,40,0,0 +56,2,169133,1,9,1,4,1,0,0,0,0,50,29,0 +45,2,368561,1,9,1,1,1,0,0,0,0,55,0,1 +48,2,207848,12,6,1,0,2,0,1,0,0,40,0,0 +48,5,138370,3,14,3,5,0,2,0,0,0,50,3,0 +31,2,93106,9,11,0,0,0,0,1,0,0,40,0,0 +20,0,223515,6,12,0,4,3,0,0,0,1719,20,0,0 +27,2,389713,5,10,0,5,0,0,0,0,0,40,0,0 +32,2,206365,1,9,0,4,0,1,1,0,0,40,0,0 +37,2,123785,1,9,0,4,0,0,0,0,0,75,0,0 +34,2,289984,1,9,2,13,4,1,1,0,0,30,0,0 +90,2,137018,1,9,0,4,0,0,1,0,0,40,0,0 +23,2,137994,5,10,0,8,3,1,1,0,0,40,0,0 +43,2,341204,5,10,2,0,0,0,1,0,0,40,0,0 +44,2,167005,0,13,1,1,1,0,0,7688,0,60,0,1 +24,2,34446,5,10,0,9,0,0,1,0,0,37,0,0 +28,2,187160,10,15,2,3,4,0,0,0,0,55,0,0 +23,2,217961,5,10,1,4,1,0,0,0,0,40,0,0 +20,2,74631,5,10,0,5,0,0,1,0,0,50,0,0 +36,2,156667,0,13,1,3,1,0,0,0,1902,50,0,1 +61,2,125155,1,9,1,8,1,0,0,0,0,40,0,0 +53,1,263925,0,13,1,5,1,0,0,0,0,40,8,1 +30,2,296453,0,13,1,0,1,0,0,7298,0,40,0,1 +52,1,44728,5,10,1,5,1,0,0,0,0,55,0,1 +38,2,193026,5,10,2,10,0,0,0,0,0,40,10,0 +32,2,87643,0,13,1,5,1,0,0,0,0,40,0,0 +30,1,106742,14,8,1,6,1,0,0,0,0,75,0,0 +41,2,302122,9,11,2,10,0,0,1,0,0,40,0,0 +49,4,193960,3,14,1,3,1,0,0,0,1902,40,0,1 +45,2,185385,1,9,1,10,1,0,0,0,0,47,0,1 +43,1,277647,1,9,1,1,1,0,0,0,0,35,0,0 +61,2,128848,1,9,1,8,1,0,0,3471,0,40,0,0 +54,2,377701,1,9,1,4,1,0,0,0,0,32,4,0 +34,2,157886,6,12,4,4,4,0,1,0,0,40,0,0 +49,2,175958,5,10,1,5,1,0,0,0,0,80,0,1 +38,2,223004,5,10,0,4,3,0,0,0,0,40,0,0 +35,2,199352,10,15,1,3,1,0,0,0,1977,80,0,1 +36,2,29984,14,8,1,6,1,0,0,0,0,40,0,0 +30,2,181651,0,13,1,1,1,0,0,0,0,50,0,0 +36,2,117312,6,12,2,9,0,0,1,0,0,60,0,0 +22,4,34029,0,13,0,3,3,0,1,0,0,20,0,0 +38,2,132879,1,9,1,10,1,0,0,0,1902,40,0,1 +37,2,215310,1,9,1,10,1,0,0,0,0,50,0,1 +48,0,55863,8,16,1,3,2,0,1,0,1902,46,0,1 +17,2,220384,2,7,0,0,3,0,0,0,0,15,0,0 +19,1,36012,5,10,0,10,3,0,0,0,0,20,0,0 +27,2,137645,0,13,0,5,0,1,1,0,1590,40,0,0 +22,2,191342,0,13,0,5,3,2,0,0,0,50,18,0 +49,2,31339,1,9,1,10,1,0,0,0,0,40,0,0 +43,0,227910,9,11,1,3,2,0,1,0,0,40,0,1 +43,2,173728,0,13,4,3,4,0,1,0,0,40,0,0 +19,4,167816,1,9,2,1,0,0,1,0,0,35,0,0 +58,1,81642,1,9,1,7,1,0,0,0,0,60,0,0 +41,4,195258,5,10,1,11,1,0,0,0,0,40,0,1 +31,2,232475,5,10,1,0,1,0,0,0,0,40,0,0 +30,2,241259,9,11,1,6,1,0,0,0,0,40,0,0 +32,2,118161,1,9,1,11,1,0,0,0,0,40,0,0 +29,2,201954,0,13,0,1,0,0,0,0,0,35,0,0 +42,2,150533,5,10,1,1,1,0,0,7298,0,52,0,1 +38,2,412296,1,9,2,10,3,0,0,0,0,28,0,0 +41,3,133060,6,12,1,3,1,0,0,0,0,40,0,1 +44,1,120539,0,13,0,5,0,0,0,0,0,50,0,1 +31,2,196025,8,16,3,3,0,2,0,0,0,60,26,0 +34,2,107793,1,9,2,10,0,0,0,0,0,40,0,0 +21,2,163870,5,10,0,0,3,0,0,0,0,40,0,0 +22,1,361280,0,13,0,3,3,2,0,0,0,20,3,0 +62,2,92178,12,6,1,8,1,0,0,0,0,40,0,0 +29,5,260729,1,9,1,5,2,0,1,0,1977,25,0,1 +43,2,182254,5,10,2,3,4,0,1,0,0,40,0,0 +45,5,149865,0,13,1,8,1,0,0,0,0,60,0,1 +39,5,218184,4,5,1,1,1,0,0,0,1651,40,4,0 +41,2,118619,0,13,1,1,1,1,0,0,0,50,0,0 +34,1,196791,6,12,1,3,2,0,1,0,0,25,0,1 +34,4,167999,1,9,2,0,4,0,1,0,0,33,0,0 +31,2,51259,0,13,0,3,0,0,0,0,0,47,0,0 +29,2,131088,1,9,0,2,3,0,0,0,0,25,0,0 +41,2,118212,0,13,1,10,1,0,0,3103,0,40,0,1 +41,2,293791,9,11,1,6,1,0,0,0,0,55,0,0 +35,5,289430,3,14,1,5,1,0,0,0,0,45,4,1 +33,2,35378,0,13,1,5,2,0,1,0,0,45,0,1 +37,0,60227,0,13,0,0,0,0,0,0,0,38,0,0 +69,2,168139,1,9,1,5,2,0,1,0,0,40,0,0 +34,2,290763,1,9,2,2,3,0,1,0,0,40,0,0 +36,2,51100,5,10,1,10,1,0,0,0,0,40,0,0 +41,2,227644,1,9,1,6,1,0,0,0,0,50,0,0 +58,4,205267,0,13,1,3,2,0,1,0,0,40,0,1 +53,2,288020,0,13,1,3,1,2,0,0,0,40,28,0 +29,2,140863,5,10,1,9,1,0,0,0,0,40,0,0 +45,3,170915,1,9,2,9,0,0,1,4865,0,40,0,0 +34,0,50178,5,10,1,1,1,0,0,0,0,38,0,0 +36,2,112497,0,13,1,9,1,0,0,0,0,40,0,0 +48,2,95244,5,10,2,4,4,1,1,0,0,35,0,0 +20,2,117606,9,11,0,0,3,0,1,0,0,40,0,0 +35,2,89508,1,9,1,6,1,0,0,0,0,50,0,1 +63,3,124244,1,9,6,2,0,1,0,0,0,40,0,0 +41,1,154374,5,10,2,4,4,0,0,0,0,45,0,0 +28,2,294936,0,13,1,3,1,0,0,0,0,45,0,0 +30,2,347132,5,10,0,8,0,1,1,0,0,40,0,0 +31,2,316672,1,9,0,4,4,0,1,0,0,40,4,0 +37,2,189382,9,11,0,0,3,0,1,0,0,38,0,0 +31,2,184307,5,10,1,1,1,0,0,0,0,50,2,1 +46,1,246212,3,14,1,1,1,0,0,0,0,45,0,1 +35,3,250504,1,9,1,0,1,1,0,0,0,60,0,1 +27,2,138705,1,9,1,10,1,0,0,0,0,53,0,0 +41,2,328447,15,2,1,10,1,0,0,0,0,35,4,0 +19,2,194608,5,10,0,4,3,0,1,0,0,20,0,0 +20,2,230891,5,10,0,5,0,0,0,0,0,45,0,0 +59,3,212448,1,9,6,5,4,0,1,0,0,40,9,0 +40,2,214010,0,13,0,4,0,0,0,0,0,37,0,0 +56,1,200235,5,10,1,5,1,0,0,0,0,60,0,0 +33,2,354573,3,14,1,3,1,0,0,15024,0,44,0,1 +30,5,205733,5,10,0,1,0,0,1,0,0,60,0,0 +46,2,185041,1,9,1,8,1,0,0,0,0,50,0,0 +61,5,84409,1,9,1,1,1,0,0,0,0,35,0,1 +50,5,293196,1,9,1,1,1,0,0,7298,0,40,0,1 +25,2,241626,1,9,0,4,3,0,0,0,0,30,0,0 +40,2,520586,5,10,2,0,4,0,1,0,0,39,0,0 +51,2,302847,1,9,1,10,1,0,0,0,0,54,0,0 +43,0,165309,1,9,1,11,1,0,0,0,0,40,0,0 +34,2,117529,5,10,1,7,1,0,0,0,0,54,4,0 +46,2,106092,1,9,1,1,1,0,0,0,0,45,0,1 +28,0,445824,3,14,1,3,2,0,1,0,0,50,0,1 +20,2,275691,1,9,0,2,3,0,0,0,0,28,0,0 +44,2,193459,9,11,1,10,1,0,0,3411,0,40,0,0 +51,2,284329,1,9,6,6,4,0,0,0,0,40,0,0 +33,2,114691,0,13,1,5,1,0,0,0,0,60,0,1 +54,2,96062,6,12,1,9,1,0,0,0,0,40,0,1 +50,2,133963,0,13,1,3,2,0,1,0,1977,40,0,1 +33,2,178506,1,9,2,0,0,1,1,0,0,40,0,0 +65,2,350498,0,13,1,0,1,0,0,10605,0,20,0,1 +88,1,206291,10,15,1,3,1,0,0,0,0,40,0,0 +40,2,182302,1,9,2,6,0,0,0,0,0,40,0,0 +51,2,241346,1,9,2,0,0,0,1,0,0,43,0,0 +50,2,157043,2,7,2,4,0,1,1,0,0,40,0,0 +25,2,404616,3,14,1,7,0,0,0,0,0,99,0,1 +20,2,411862,9,11,0,4,0,0,0,0,0,30,0,0 +47,2,183013,1,9,1,4,1,0,0,0,0,40,0,0 +22,2,188544,9,11,0,0,3,0,1,0,0,30,0,0 +50,0,356619,1,9,1,3,1,0,0,0,0,48,0,1 +47,2,45857,1,9,0,0,4,0,1,0,0,40,0,0 +24,4,289886,2,7,0,4,0,2,0,0,0,45,0,0 +40,2,216237,0,13,2,1,0,0,1,0,0,45,0,1 +36,2,416745,0,13,1,3,1,0,0,0,0,40,0,0 +32,2,202952,1,9,1,0,1,0,0,0,0,40,0,0 +44,2,167725,1,9,1,10,1,0,0,0,0,40,0,0 +59,3,43280,5,10,0,1,3,1,1,0,0,40,0,0 +65,2,118779,1,9,1,10,1,0,0,0,0,30,0,0 +24,0,191269,0,13,0,0,0,0,1,0,0,65,0,0 +27,4,247507,0,13,0,3,3,0,0,0,0,35,0,0 +51,2,239155,9,11,2,4,0,0,0,0,0,40,0,0 +48,2,182862,5,10,1,10,1,0,0,0,0,40,0,1 +39,2,33886,1,9,1,6,1,0,0,0,0,60,0,0 +28,2,444304,0,13,1,9,1,0,0,0,0,40,0,0 +19,2,187161,5,10,0,4,3,0,1,0,0,25,0,0 +49,4,116892,0,13,2,3,0,1,1,0,0,40,0,0 +51,4,176813,6,12,1,3,1,0,0,0,0,60,0,0 +59,2,151616,3,14,1,3,1,0,0,0,0,55,0,0 +18,2,240747,1,9,0,8,3,0,1,0,0,40,21,0 +45,3,320818,1,9,1,0,1,1,0,0,0,80,0,1 +30,4,235271,0,13,1,3,1,0,0,0,0,50,0,1 +37,2,166497,0,13,2,10,0,0,0,0,0,35,0,0 +44,2,344060,0,13,0,4,0,0,0,0,0,40,0,1 +33,2,221196,5,10,1,10,1,1,0,0,0,40,0,0 +61,5,113544,3,14,1,5,1,0,0,0,0,40,0,1 +61,4,321117,1,9,1,11,1,0,0,0,0,40,0,0 +38,2,79619,0,13,1,5,1,0,0,0,0,42,0,1 +36,2,135289,1,9,1,8,1,0,0,0,0,45,0,0 +44,5,320984,5,10,1,5,1,0,0,5178,0,60,0,1 +37,2,203070,5,10,4,0,3,0,0,0,0,62,0,0 +31,2,32406,5,10,2,10,4,0,1,0,0,20,0,0 +54,2,99185,8,16,1,3,1,0,0,15024,0,45,0,1 +20,2,205839,5,10,0,4,3,0,0,0,0,16,0,0 +48,1,243631,5,10,1,10,1,3,0,7688,0,40,0,1 +31,2,231263,0,13,2,1,0,0,0,4650,0,45,0,0 +38,2,200818,10,15,1,3,1,0,0,0,0,40,0,1 +45,1,247379,1,9,1,10,1,0,0,0,0,40,0,1 +48,2,349151,1,9,1,10,1,0,0,0,0,40,0,0 +53,2,22154,5,10,1,10,1,0,0,0,0,40,0,0 +55,2,176317,1,9,6,0,3,0,1,0,0,40,0,0 +29,2,236436,1,9,0,0,0,0,1,0,0,40,0,0 +36,2,354078,0,13,1,3,1,0,0,0,0,60,0,1 +42,1,166813,5,10,1,7,1,0,0,0,0,60,0,0 +50,2,358740,1,9,2,0,4,0,1,0,0,40,7,0 +75,1,208426,10,15,1,3,1,0,0,0,0,35,0,0 +46,2,265266,0,13,1,3,1,0,0,0,1902,40,0,1 +52,3,31838,1,9,2,0,4,0,1,0,0,40,0,0 +27,2,175034,0,13,0,0,0,0,1,0,0,40,0,0 +43,2,413297,1,9,1,10,1,0,0,0,0,45,0,0 +31,2,106347,2,7,4,4,0,1,1,0,0,42,0,0 +23,2,174754,5,10,0,5,0,0,1,0,0,30,0,0 +34,2,441454,1,9,0,5,0,0,1,0,0,24,0,0 +41,1,209344,1,9,1,5,5,0,1,0,0,40,1,0 +31,2,185732,1,9,0,4,3,0,1,0,0,30,0,0 +42,2,65372,5,10,0,0,3,0,1,0,0,40,0,0 +35,2,33975,3,14,0,3,0,0,0,0,0,45,0,1 +55,2,326297,1,9,4,0,0,0,1,0,0,25,0,0 +36,0,194630,1,9,6,1,0,0,1,0,0,40,0,0 +65,1,167414,1,9,1,1,1,0,0,0,0,59,0,1 +38,4,165799,5,10,0,4,0,0,0,0,0,12,0,0 +62,2,192866,5,10,6,4,0,0,1,0,0,20,0,0 +54,5,166459,10,15,1,3,1,0,0,99999,0,60,0,1 +49,2,148995,1,9,2,0,0,0,0,0,0,40,0,0 +34,2,190040,1,9,1,0,2,0,1,0,0,40,0,0 +32,2,209432,1,9,0,2,3,0,1,0,0,40,0,0 +51,5,229465,3,14,1,1,1,0,0,15024,0,50,0,1 +48,1,397466,5,10,1,1,1,0,0,0,0,60,0,0 +52,3,202452,1,9,2,0,0,0,1,0,0,43,0,0 +28,1,218555,5,10,0,6,0,0,0,0,1762,40,0,0 +29,2,128604,1,9,1,10,1,2,0,0,0,40,0,0 +38,2,65466,0,13,0,0,0,0,1,0,0,50,0,0 +57,2,141326,1,9,1,5,1,0,0,0,0,50,0,1 +43,3,369468,0,13,1,3,1,0,0,0,0,40,0,1 +37,0,136137,5,10,4,0,0,0,0,0,0,40,0,0 +30,2,236770,1,9,1,10,1,0,0,0,0,40,0,0 +53,2,89534,1,9,1,6,1,0,0,0,0,48,0,1 +73,2,29778,1,9,6,4,0,0,1,0,0,37,0,0 +22,5,153516,5,10,0,10,3,0,0,0,0,35,0,0 +31,2,163594,1,9,0,5,0,0,1,0,0,45,0,0 +38,2,189623,0,13,1,3,1,0,0,0,1887,40,0,1 +50,1,343748,5,10,1,10,1,0,0,0,0,35,0,0 +37,2,387430,5,10,1,0,1,0,0,0,0,37,0,0 +44,4,409505,0,13,2,11,0,0,0,0,0,40,0,0 +47,2,200734,0,13,0,1,4,1,1,0,0,45,0,0 +27,2,115831,5,10,1,4,1,0,0,0,0,40,0,0 +28,2,150296,6,12,0,4,0,0,1,0,0,80,0,0 +25,2,323545,1,9,0,9,0,1,1,0,0,40,0,0 +20,2,232577,5,10,0,4,4,0,1,0,0,40,0,0 +51,4,152754,0,13,1,0,1,0,0,0,0,40,0,1 +46,2,129007,0,13,1,5,1,0,0,0,1977,40,0,1 +67,2,171584,0,13,1,11,1,0,0,6514,0,7,0,1 +47,2,386136,1,9,1,6,1,0,0,0,0,35,0,0 +42,2,342865,1,9,1,5,1,0,0,0,0,40,0,0 +52,2,186785,1,9,0,5,0,0,0,0,1876,50,0,0 +42,3,158926,6,12,2,3,4,2,1,0,0,40,11,1 +21,2,164019,5,10,0,7,3,1,0,0,0,10,0,0 +50,2,88926,1,9,1,0,2,0,1,5178,0,40,0,1 +46,2,188861,5,10,1,6,1,0,0,0,0,40,0,0 +47,1,370119,0,13,1,5,1,0,0,15024,0,50,0,1 +57,2,182062,12,6,1,4,1,0,0,0,0,40,0,0 +37,2,37238,0,13,0,1,0,0,0,0,0,45,0,0 +50,2,421132,1,9,1,10,1,0,0,0,0,40,0,0 +63,1,795830,15,2,6,4,4,0,1,0,0,30,22,0 +39,2,278403,1,9,1,6,1,0,0,0,0,65,0,0 +46,2,279661,3,14,1,3,1,1,0,0,0,35,0,0 +36,2,113397,1,9,1,2,1,0,0,0,0,40,0,0 +26,2,280093,11,3,1,10,1,0,0,0,1628,50,0,0 +21,2,236696,5,10,0,4,0,0,0,0,0,57,0,0 +41,2,265266,6,12,1,9,1,0,0,0,0,40,0,0 +44,4,34935,5,10,0,4,3,1,0,0,0,40,0,0 +22,2,58222,1,9,1,10,1,0,0,0,0,40,0,0 +29,3,301010,5,10,0,12,0,1,0,0,0,60,0,0 +29,2,419721,1,9,0,4,4,1,1,0,0,40,28,0 +58,5,186791,5,10,1,6,2,0,1,0,0,40,0,1 +36,1,180686,10,15,1,3,1,0,0,0,0,50,0,0 +30,2,209103,9,11,1,1,1,0,0,0,0,48,0,0 +37,2,32668,0,13,1,8,1,0,0,0,0,43,0,1 +29,2,256956,9,11,0,8,0,0,0,0,0,40,0,0 +26,2,202203,11,3,0,0,3,0,1,0,0,40,4,0 +43,2,85995,1,9,1,5,1,0,0,0,0,45,0,0 +49,2,125421,1,9,1,10,2,0,1,0,0,40,0,1 +45,3,283037,0,13,1,1,1,0,0,0,0,40,0,0 +28,2,192932,0,13,0,3,0,0,1,0,0,40,0,0 +51,2,179646,1,9,2,0,4,0,1,0,0,40,0,0 +32,2,509350,5,10,1,2,1,0,0,0,0,50,8,1 +24,2,96279,1,9,0,8,3,0,1,0,0,40,0,0 +35,2,119098,8,16,1,3,1,0,0,7298,0,40,0,1 +41,0,144928,0,13,1,3,1,0,0,0,0,40,0,1 +48,2,55237,0,13,1,10,1,0,0,0,0,45,0,1 +61,4,101265,1,9,6,0,4,0,1,1471,0,35,0,0 +20,2,114874,5,10,0,0,3,0,0,0,0,30,0,0 +27,2,190525,1,9,0,5,0,0,0,0,0,50,0,1 +55,2,121912,5,10,1,6,1,0,0,0,0,24,0,1 +39,2,83893,1,9,1,0,1,0,0,0,0,40,0,1 +52,2,168381,1,9,6,4,4,2,1,0,0,40,3,1 +24,2,293579,1,9,0,5,3,1,1,0,0,20,0,0 +29,2,285290,2,7,0,4,4,1,1,0,0,40,0,0 +25,2,188488,1,9,0,8,5,0,0,0,0,40,0,0 +20,2,324469,5,10,0,8,0,0,1,0,0,40,0,0 +23,2,275244,1,9,0,8,0,1,0,0,0,35,0,0 +57,2,265099,10,15,1,3,1,0,0,0,0,60,0,0 +51,2,146767,9,11,1,3,1,0,0,0,0,40,0,1 +33,2,40681,5,10,0,3,0,0,1,3674,0,16,0,0 +39,2,174938,0,13,0,3,0,0,0,0,0,40,0,0 +40,2,240124,1,9,1,1,1,0,0,0,0,40,0,1 +71,2,269708,0,13,2,9,3,0,1,2329,0,16,0,0 +38,0,34180,5,10,1,1,1,0,0,0,0,40,0,0 +28,0,225904,10,15,0,3,4,0,0,0,0,40,0,0 +57,2,89392,3,14,3,3,0,0,1,0,0,40,0,0 +47,2,46857,5,10,2,0,0,0,0,0,0,40,0,0 +59,0,105363,1,9,0,0,3,0,0,0,0,40,0,0 +26,2,195105,1,9,0,5,0,4,0,0,0,40,0,0 +35,2,184117,0,13,0,0,3,0,1,0,0,40,0,0 +61,5,134768,0,13,1,1,1,0,0,0,0,50,9,1 +34,2,467108,5,10,0,3,0,0,0,0,0,50,0,1 +32,5,199765,0,13,1,10,1,0,0,7688,0,50,0,1 +42,2,173938,1,9,4,5,3,0,1,0,0,40,0,0 +39,2,191161,5,10,1,10,1,0,0,0,0,40,0,0 +58,2,132606,11,3,2,8,0,1,0,0,0,40,0,0 +61,1,30073,1,9,1,7,1,0,0,0,1848,60,0,1 +40,2,155190,12,6,0,10,5,1,0,0,0,55,0,0 +31,2,42900,0,13,0,9,0,0,0,0,0,37,0,0 +36,2,191161,1,9,0,5,0,0,0,0,0,50,0,0 +23,2,181820,5,10,0,8,3,0,0,0,0,40,0,0 +33,2,105974,1,9,0,10,0,0,0,0,0,41,0,0 +52,2,146378,1,9,1,10,1,0,0,0,0,40,0,1 +22,2,103440,1,9,0,4,0,0,1,0,0,24,0,0 +51,2,203435,5,10,2,5,4,0,1,0,0,40,25,0 +31,3,168312,9,11,0,1,0,0,1,0,0,40,0,0 +49,5,257764,1,9,2,1,4,0,1,0,0,40,0,0 +49,2,171301,1,9,1,8,2,1,1,0,0,40,0,0 +53,3,225339,5,10,6,0,0,1,1,0,0,40,0,0 +52,2,152234,1,9,1,1,1,2,0,99999,0,40,28,1 +20,2,444554,12,6,0,2,3,0,0,0,0,40,0,0 +26,2,403788,6,12,0,4,3,1,0,0,0,40,0,0 +43,2,221550,3,14,0,4,0,0,1,0,0,30,12,0 +46,5,98929,0,13,1,5,1,0,0,0,0,52,0,0 +43,4,169203,9,11,0,0,0,0,1,0,0,35,0,0 +41,2,102332,1,9,2,5,4,1,1,0,0,40,0,0 +44,1,230684,1,9,1,6,1,0,0,0,0,55,0,0 +54,2,449257,1,9,1,7,1,0,0,0,0,40,0,0 +65,2,198766,3,14,1,5,1,0,0,20051,0,40,0,1 +32,2,97429,0,13,2,1,4,0,1,0,0,40,8,0 +25,2,208999,5,10,4,0,3,0,0,0,0,40,0,0 +23,2,37072,0,13,0,5,0,0,0,0,0,50,0,0 +25,4,163101,0,13,0,3,0,0,0,0,0,45,0,0 +19,2,119075,5,10,0,2,3,0,0,0,0,50,0,0 +37,1,137314,1,9,1,1,1,0,0,0,0,60,0,0 +45,2,127303,5,10,0,8,3,0,0,0,0,45,0,0 +37,2,349116,1,9,0,5,0,1,0,0,0,44,0,0 +40,1,266324,5,10,2,1,5,0,0,0,1564,70,10,1 +17,2,46496,2,7,0,4,3,0,0,0,0,5,0,0 +27,2,29904,0,13,0,9,0,0,1,0,0,40,0,0 +59,2,226922,1,9,2,5,4,0,1,0,1762,30,0,0 +19,3,234151,1,9,0,0,4,1,1,0,0,40,0,0 +43,2,238287,12,6,0,8,0,1,0,0,0,40,0,0 +42,2,230624,12,6,0,6,4,0,0,0,0,40,0,1 +54,2,398212,1,9,1,6,1,1,0,5013,0,40,0,0 +54,1,114758,3,14,1,5,1,0,0,0,0,50,0,0 +51,2,246519,12,6,1,2,1,0,0,2105,0,45,0,0 +50,2,137815,1,9,1,6,1,0,0,0,0,60,0,1 +40,2,260696,1,9,0,0,0,0,1,0,0,40,0,0 +55,2,325007,6,12,1,9,1,0,0,0,0,25,0,0 +50,2,113176,1,9,2,0,0,0,1,0,0,40,0,0 +31,2,66815,1,9,1,10,1,0,0,0,0,50,0,0 +24,2,241523,1,9,1,4,1,0,0,0,0,45,0,1 +30,2,30226,2,7,2,5,3,0,0,0,0,40,0,0 +39,4,352628,6,12,1,10,2,0,1,0,0,50,0,1 +37,2,143912,1,9,2,6,0,0,0,0,0,50,0,0 +33,2,130021,1,9,1,6,1,0,0,0,0,40,0,0 +48,2,329778,1,9,6,4,4,0,1,0,0,40,0,0 +43,5,196945,1,9,1,4,1,2,0,0,0,78,15,0 +39,2,24342,0,13,1,3,1,0,0,0,0,40,0,1 +53,2,34368,5,10,1,1,1,0,0,0,0,45,0,1 +52,1,173839,12,6,1,1,1,0,0,0,0,60,0,0 +28,0,73211,5,10,1,0,1,2,0,0,0,20,0,0 +32,2,86723,1,9,0,4,0,0,0,0,0,52,0,0 +31,2,179186,0,13,1,5,1,1,0,0,0,90,0,1 +31,2,127610,0,13,1,3,2,0,1,0,0,40,0,1 +47,2,115070,5,10,0,0,0,0,1,0,0,40,0,0 +40,2,256202,9,11,1,2,1,1,0,0,0,40,0,0 +40,2,202872,6,12,0,0,3,0,1,0,0,45,0,0 +41,2,184102,2,7,2,4,0,0,0,0,0,40,0,0 +53,3,130703,1,9,1,0,1,1,0,0,0,40,0,0 +46,2,134727,2,7,2,8,4,3,0,0,0,43,9,0 +45,5,36228,0,13,1,7,1,0,0,4386,0,35,0,1 +39,2,297847,4,5,1,4,2,1,1,3411,0,34,0,0 +19,2,213644,1,9,0,8,0,0,0,0,0,40,0,0 +57,2,173796,1,9,1,6,1,0,0,0,1887,40,0,1 +49,2,147322,9,11,1,8,2,0,1,0,0,40,30,0 +59,2,296253,1,9,2,1,0,0,1,0,0,40,0,0 +32,2,180871,9,11,2,5,0,0,0,0,0,50,0,1 +35,0,211115,5,10,0,11,0,1,0,0,0,40,0,0 +58,5,183870,12,6,1,6,2,0,1,0,0,40,0,0 +28,2,441620,0,13,0,4,0,0,0,0,0,43,4,0 +36,3,218542,6,12,1,0,2,0,1,0,0,40,0,1 +41,1,141327,3,14,2,3,4,0,1,0,0,35,0,0 +47,2,67716,1,9,1,5,1,0,0,0,0,40,0,1 +50,5,175339,1,9,1,10,1,0,0,0,1672,60,0,0 +36,2,336595,1,9,1,1,1,0,0,0,0,50,0,1 +38,2,27997,9,11,2,10,0,0,0,0,0,40,0,0 +56,1,145574,1,9,1,4,1,0,0,0,1902,60,0,1 +50,2,30447,9,11,1,6,1,0,0,0,0,45,0,0 +45,1,256866,5,10,1,5,1,0,0,5013,0,40,0,0 +44,1,120837,1,9,1,1,1,0,0,0,0,66,0,0 +51,2,185283,5,10,1,1,1,0,0,0,0,45,0,1 +44,5,229466,5,10,1,1,1,0,0,0,0,50,0,1 +25,2,298225,1,9,2,10,0,0,0,0,0,50,0,0 +60,2,185749,2,7,6,6,4,1,0,0,0,40,0,0 +49,5,125892,3,14,1,1,1,0,0,0,0,50,0,1 +46,2,563883,1,9,1,10,1,1,0,0,0,60,0,1 +56,2,311249,1,9,6,0,4,1,1,0,0,38,0,0 +25,2,221757,1,9,2,10,0,0,0,3325,0,45,0,0 +22,2,310152,5,10,0,6,0,0,0,0,0,40,0,0 +41,5,94113,10,15,1,3,1,0,0,0,0,60,0,1 +48,5,192945,1,9,1,1,1,0,0,7688,0,40,0,1 +46,2,161508,12,6,0,8,0,1,0,0,0,40,0,0 +30,2,177675,5,10,0,10,0,0,0,0,0,40,0,1 +39,2,51100,1,9,1,6,1,0,0,0,0,40,0,1 +40,2,100584,12,6,2,10,0,3,0,0,0,40,0,0 +70,3,163003,1,9,1,0,1,1,0,0,0,40,0,0 +35,2,67728,5,10,1,10,1,0,0,0,2051,45,0,0 +49,2,101320,3,14,2,1,0,0,1,0,0,75,0,0 +24,2,42706,9,11,0,11,0,0,0,0,0,60,0,0 +40,2,228535,6,12,1,3,1,0,0,7298,0,36,0,1 +61,2,120939,10,15,1,6,1,0,0,0,0,5,0,1 +25,2,98283,0,13,0,3,3,2,0,0,0,40,0,0 +28,4,216481,0,13,0,3,0,0,1,0,0,40,0,0 +69,0,208869,3,14,1,3,1,0,0,0,0,11,0,0 +22,2,207940,5,10,0,2,3,0,1,0,0,36,0,0 +47,2,34248,1,9,1,0,1,0,0,0,0,38,0,0 +38,2,83727,1,9,2,4,4,0,1,0,0,48,0,0 +26,2,183077,9,11,0,0,3,0,1,0,0,40,0,0 +17,2,197850,2,7,0,0,3,2,1,0,0,24,0,0 +33,1,235271,5,10,0,4,0,0,0,0,0,35,0,0 +43,1,35236,1,9,3,10,0,0,0,0,0,40,0,0 +58,2,255822,9,11,1,10,1,0,0,0,0,40,0,1 +53,5,263925,1,9,1,5,1,0,0,99999,0,40,0,1 +26,2,256263,1,9,0,10,0,0,0,0,0,25,0,0 +43,4,293535,0,13,1,3,1,1,0,0,0,40,0,1 +31,2,209448,12,6,1,7,1,0,0,2105,0,40,4,0 +30,2,57651,1,9,0,0,4,0,0,0,2001,42,0,0 +25,2,174592,1,9,0,4,3,0,1,0,0,25,0,0 +57,3,278763,1,9,2,0,4,0,1,0,0,40,0,0 +37,2,175232,3,14,2,1,4,0,0,0,0,60,0,1 +32,2,402812,5,10,1,5,1,0,0,0,0,48,0,0 +26,2,101150,1,9,2,1,0,0,1,0,0,41,0,0 +45,2,103538,1,9,1,0,1,0,0,0,0,40,0,1 +53,0,156877,1,9,1,0,1,0,0,15024,0,35,0,1 +27,2,23940,1,9,0,2,5,3,0,0,0,40,0,0 +28,5,210295,2,7,1,10,1,0,0,0,0,50,0,1 +32,2,80058,2,7,2,5,0,0,0,0,0,43,0,1 +35,2,187119,0,13,2,5,0,0,1,0,1980,65,0,0 +36,1,105021,5,10,1,1,1,0,0,0,0,55,0,1 +19,2,225775,5,10,0,0,0,0,0,0,0,40,0,0 +37,5,395831,0,13,1,1,1,0,0,0,0,80,0,1 +49,2,50282,5,10,2,8,0,0,0,3325,0,45,0,0 +20,2,32732,5,10,0,4,0,0,0,0,0,45,0,0 +64,5,179436,0,13,1,1,1,0,0,15024,0,55,0,1 +32,2,123253,6,12,1,10,1,0,0,0,0,42,0,0 +58,0,48433,1,9,1,1,1,0,0,0,0,40,0,0 +42,2,245317,1,9,1,5,1,0,0,0,0,50,0,0 +20,2,431745,5,10,0,0,0,1,1,0,0,14,0,0 +42,0,436006,5,10,1,0,1,1,0,0,0,40,0,0 +25,2,224943,5,10,3,3,4,1,0,0,0,40,0,0 +30,1,167990,9,11,1,3,1,0,0,15024,0,65,0,1 +37,5,217054,0,13,1,3,1,0,0,0,0,35,0,1 +66,1,298834,9,11,1,3,1,0,0,0,0,50,0,0 +59,5,125000,0,13,1,1,1,0,0,0,0,40,7,1 +44,2,123983,0,13,2,4,0,2,0,0,0,40,26,0 +46,2,155489,1,9,1,0,1,0,0,0,0,58,0,1 +59,2,284834,0,13,1,0,2,0,1,2885,0,30,0,0 +25,2,212495,0,13,0,1,3,0,0,0,1340,40,0,0 +17,4,32124,4,5,0,4,3,1,0,0,0,9,0,0 +47,4,246891,0,13,1,11,1,0,0,0,0,40,0,0 +47,0,141483,4,5,2,4,0,0,1,0,0,40,0,0 +30,2,31985,5,10,2,1,4,0,1,0,0,40,0,0 +20,2,170800,5,10,0,7,3,0,1,0,0,40,0,0 +26,4,166295,0,13,0,3,0,0,0,0,2339,55,0,0 +20,2,231286,5,10,0,2,0,1,0,0,0,15,0,0 +33,2,159322,1,9,2,4,4,0,0,0,0,40,0,0 +48,2,176026,1,9,1,8,1,0,0,0,0,40,0,0 +52,2,118025,0,13,1,1,1,0,0,99999,0,50,0,1 +37,2,26898,1,9,2,1,4,0,1,0,0,12,0,0 +47,2,232628,1,9,1,10,1,1,0,0,0,40,0,0 +40,2,85995,12,6,1,8,1,0,0,0,0,40,0,1 +48,2,125421,3,14,2,1,4,0,1,0,0,40,0,1 +49,2,245305,12,6,1,6,1,1,0,0,0,42,0,1 +50,2,73493,5,10,2,4,0,0,1,0,0,40,0,0 +30,2,197058,6,12,0,3,0,0,1,0,0,40,0,0 +34,2,122116,5,10,1,1,1,0,0,0,0,40,0,0 +43,2,75742,1,9,1,8,1,0,0,0,0,40,0,0 +22,2,214731,12,6,1,8,2,0,1,0,0,40,0,0 +35,2,265954,1,9,4,4,0,1,0,0,0,40,0,0 +26,0,197156,1,9,2,0,3,0,1,0,0,30,0,0 +62,2,162245,10,15,1,3,1,0,0,0,1628,70,0,0 +39,4,203070,1,9,4,11,0,0,0,0,0,40,0,0 +59,4,165695,5,10,1,10,1,0,0,0,0,40,0,0 +27,2,168107,0,13,1,10,1,0,0,0,0,40,0,0 +17,2,163494,12,6,0,5,3,0,0,0,0,30,0,0 +38,2,180342,0,13,1,0,1,0,0,0,0,40,0,0 +41,2,122381,5,10,1,10,1,0,0,0,1887,50,0,1 +27,2,148069,12,6,0,8,4,0,1,0,0,40,0,0 +23,2,200973,1,9,0,0,3,0,1,0,0,40,0,0 +17,2,130806,12,6,0,2,3,0,0,0,0,24,0,0 +56,2,117148,7,4,2,8,0,0,1,0,0,40,0,0 +24,2,213977,5,10,0,0,0,0,1,0,0,40,0,0 +44,2,139338,14,8,2,6,4,1,0,0,0,40,0,0 +23,2,315877,0,13,0,0,0,0,0,0,0,30,0,0 +25,2,352057,1,9,0,6,0,0,0,0,0,65,0,0 +21,2,236684,5,10,0,4,5,1,1,0,0,8,0,0 +18,2,208447,14,8,0,2,3,0,0,0,0,6,0,0 +45,2,149640,5,10,1,10,1,0,0,0,0,40,0,0 +51,2,154342,7,4,1,11,1,0,0,0,0,40,0,0 +42,3,141459,1,9,4,4,5,1,1,0,0,40,0,0 +47,2,111797,5,10,0,4,0,1,1,0,0,35,31,0 +29,2,111900,5,10,1,7,1,0,0,0,0,40,0,0 +33,2,78707,2,7,0,4,0,1,0,0,0,40,0,0 +43,4,160574,0,13,1,10,1,0,0,0,0,40,0,0 +44,2,216907,6,12,1,10,1,0,0,0,1848,40,0,1 +24,2,198148,5,10,0,4,3,0,0,0,0,30,0,0 +19,2,124265,5,10,0,2,3,0,0,0,0,40,0,0 +52,2,208137,9,11,1,0,1,0,0,0,0,40,0,0 +38,1,257250,1,9,0,7,0,0,0,0,0,52,0,0 +24,0,147253,5,10,0,9,0,0,0,0,0,50,0,0 +32,4,244268,0,13,0,3,0,0,0,0,0,50,0,0 +26,2,266912,1,9,1,5,1,0,0,0,0,50,0,1 +29,2,200511,0,13,1,5,1,0,0,0,0,50,0,0 +39,2,128715,1,9,2,0,0,0,0,10520,0,40,0,1 +48,1,65535,1,9,1,7,1,0,0,0,0,50,0,0 +40,2,103395,5,10,1,10,1,0,0,0,0,45,0,1 +51,2,71046,5,10,2,1,4,0,0,0,0,45,32,0 +28,1,125442,1,9,2,10,3,0,0,0,0,40,0,0 +22,2,169188,1,9,0,1,3,0,1,0,0,20,0,0 +23,2,121471,0,13,0,0,0,0,1,0,0,40,0,0 +65,2,207281,5,10,1,11,1,0,0,0,0,16,0,0 +26,4,46097,0,13,1,3,1,0,0,0,0,40,0,0 +38,1,322143,0,13,1,4,1,0,0,0,0,10,0,0 +33,2,149184,1,9,0,3,0,0,0,0,0,60,0,1 +33,4,119829,1,9,1,0,2,0,1,0,0,60,0,0 +37,2,910398,0,13,0,5,0,1,1,0,0,40,0,0 +19,2,176570,2,7,0,8,3,0,0,0,0,60,0,0 +24,2,216129,0,13,0,5,0,0,0,0,0,50,0,0 +30,2,27207,2,7,1,10,1,0,0,0,0,45,0,0 +57,0,68830,1,9,2,1,0,0,1,0,0,50,0,0 +22,0,178818,5,10,0,3,3,0,1,0,0,20,0,0 +57,2,236944,1,9,1,8,1,1,0,0,0,40,0,1 +46,0,273771,1,9,1,9,1,0,0,0,0,40,0,0 +67,2,318533,1,9,1,0,1,0,0,0,0,35,0,0 +47,2,102318,1,9,4,10,3,0,0,0,0,40,0,0 +39,2,379350,12,6,1,10,1,0,0,0,0,40,0,0 +50,2,21095,5,10,2,4,4,2,0,0,0,40,11,0 +58,1,211547,14,8,2,5,0,0,1,0,0,52,0,0 +36,2,85272,6,12,1,3,2,0,1,0,0,30,0,1 +45,2,46406,3,14,1,3,1,0,0,0,0,36,7,1 +54,2,53833,1,9,1,8,1,0,0,0,0,40,0,1 +26,2,161007,0,13,0,0,3,0,0,0,0,30,0,0 +60,2,53707,1,9,1,3,1,0,0,0,0,40,0,1 +46,2,370119,10,15,1,3,1,0,0,99999,0,60,0,1 +26,2,310907,5,10,1,1,2,0,1,0,0,35,0,0 +32,2,375833,2,7,0,10,5,0,0,0,0,40,0,0 +38,4,107513,1,9,1,6,1,0,0,0,0,40,0,0 +48,1,58683,5,10,1,5,1,0,0,0,0,70,0,1 +44,1,179557,1,9,1,1,1,0,0,0,1977,45,0,1 +37,2,70240,1,9,0,4,3,2,1,0,0,40,11,0 +44,2,147206,5,10,1,1,1,0,0,0,0,40,0,0 +31,2,175548,1,9,0,4,0,4,1,0,0,35,0,0 +61,1,163174,10,15,1,3,1,0,0,0,0,35,0,1 +51,2,126010,1,9,1,10,1,0,0,0,0,40,0,0 +52,2,147876,0,13,1,5,2,0,1,15024,0,60,0,1 +45,2,428350,1,9,1,8,2,0,1,0,1740,40,0,0 +39,2,328466,2,7,1,4,1,0,0,2407,0,70,4,0 +67,4,258973,1,9,2,4,0,0,1,0,0,24,0,0 +40,0,345969,6,12,1,0,1,0,0,0,0,40,0,1 +27,2,127796,11,3,0,7,0,0,0,0,0,35,4,0 +37,2,405723,15,2,1,8,1,0,0,0,0,40,4,0 +57,2,175942,5,10,1,1,1,0,0,0,0,50,0,1 +27,2,284196,12,6,2,4,0,0,1,0,0,40,0,0 +28,2,89718,1,9,0,5,0,0,1,2202,0,48,0,0 +34,5,175761,0,13,1,3,1,0,0,0,0,60,0,1 +54,2,206369,1,9,1,8,1,0,0,5178,0,50,0,1 +52,2,158993,1,9,2,4,5,1,1,0,0,38,0,0 +42,2,285066,0,13,1,3,1,0,0,0,0,45,0,1 +48,2,126754,3,14,1,3,1,0,0,15024,0,40,0,1 +65,0,209280,3,14,1,3,1,0,0,6514,0,35,0,1 +55,1,52888,10,15,1,3,2,0,1,0,0,10,0,0 +71,5,133821,1,9,1,0,2,0,1,0,0,20,0,1 +33,2,240763,5,10,1,8,1,1,0,0,0,40,0,0 +30,2,39054,1,9,1,5,1,0,0,0,0,40,0,0 +35,2,119272,0,13,1,1,1,0,0,0,0,55,0,1 +59,2,143372,12,6,2,0,0,1,1,0,0,40,0,0 +19,2,323421,5,10,0,2,3,0,0,0,0,20,0,0 +36,1,136028,4,5,1,10,1,0,0,0,0,30,0,0 +26,1,163189,1,9,0,5,3,0,0,0,0,40,0,0 +34,4,202729,1,9,1,11,1,0,0,0,0,40,0,0 +41,2,421871,1,9,1,10,1,1,0,0,0,40,0,1 +44,2,120277,0,13,1,3,1,0,0,15024,0,50,25,1 +47,2,198901,1,9,1,10,1,0,0,0,0,48,0,0 +18,2,214617,5,10,0,5,3,0,0,0,0,16,0,0 +55,1,179715,12,6,1,10,1,0,0,0,0,18,0,0 +49,4,107231,1,9,1,10,1,0,0,0,2002,40,0,0 +44,2,110355,0,13,1,1,1,0,0,0,0,40,0,1 +43,2,184378,0,13,0,3,0,0,0,0,0,40,0,0 +62,2,273454,7,4,1,11,1,0,0,0,0,40,1,0 +44,2,443040,1,9,1,2,1,1,0,0,0,40,0,0 +50,5,160151,5,10,1,5,1,0,0,0,0,60,0,1 +35,2,107991,2,7,0,5,0,0,0,0,0,45,0,0 +52,2,94391,1,9,1,0,1,0,0,0,0,40,0,0 +46,2,99835,10,15,1,3,1,0,0,0,0,60,0,1 +44,2,43711,6,12,1,5,1,0,0,7688,0,40,0,1 +43,2,83756,5,10,0,1,4,0,0,0,0,50,0,0 +51,2,120914,7,4,1,10,1,0,0,2961,0,40,0,0 +20,2,180052,5,10,0,5,3,0,0,0,0,20,0,0 +47,2,170846,6,12,1,0,2,0,1,0,0,40,25,1 +43,2,37937,3,14,2,1,4,0,0,0,0,50,0,0 +24,2,38455,5,10,0,10,0,0,0,0,0,40,0,0 +27,3,128059,5,10,1,10,1,0,0,0,0,50,0,0 +32,2,420895,1,9,1,6,1,0,0,0,0,40,0,0 +37,2,166744,1,9,2,4,4,0,1,0,0,12,0,0 +26,2,238768,1,9,1,8,1,0,0,0,0,60,0,0 +43,2,176270,0,13,1,1,1,0,0,99999,0,60,0,1 +50,2,140592,1,9,1,8,2,0,1,0,0,40,0,0 +20,1,211466,1,9,0,6,3,0,0,0,0,80,0,0 +37,2,188540,1,9,1,1,1,0,0,0,1902,45,0,1 +43,2,39581,1,9,0,4,0,1,1,0,0,45,0,0 +37,2,171150,1,9,1,1,1,0,0,0,1887,50,0,1 +53,2,117496,4,5,2,4,0,0,1,0,0,36,8,0 +44,2,145160,8,16,1,3,1,0,0,0,0,40,0,1 +25,2,28520,1,9,0,4,0,0,1,0,0,40,0,0 +17,2,103851,2,7,0,0,3,0,1,1055,0,20,0,0 +19,2,375077,1,9,0,5,3,0,0,0,0,50,0,0 +53,0,281590,1,9,1,1,2,0,1,15024,0,40,0,1 +44,2,151504,5,10,1,5,1,0,0,0,0,50,0,0 +51,2,415287,1,9,1,8,1,1,0,0,1902,40,0,1 +49,2,32212,1,9,1,1,2,0,1,0,0,43,0,0 +35,2,123606,5,10,1,2,1,0,0,0,0,40,0,0 +44,2,202565,1,9,2,10,0,0,0,0,0,45,0,0 +54,2,177927,3,14,1,3,1,0,0,0,0,60,0,0 +37,2,256723,5,10,2,0,4,1,1,0,0,35,0,0 +18,2,46247,5,10,0,4,3,0,1,0,0,15,0,0 +24,2,266926,5,10,1,2,1,0,0,0,0,40,0,0 +29,2,112031,1,9,2,10,0,0,1,0,0,50,0,0 +35,2,168817,1,9,0,8,0,0,0,0,0,40,0,0 +56,2,187487,1,9,1,10,1,0,0,0,0,48,0,1 +24,2,67222,0,13,0,8,0,2,0,0,0,45,26,0 +43,2,201723,3,14,1,1,1,0,0,0,1902,40,0,1 +73,2,267408,1,9,6,5,5,0,1,0,0,15,0,0 +49,2,105444,14,8,1,8,1,0,0,0,0,39,0,0 +38,2,156728,0,13,1,5,1,0,0,0,0,40,0,1 +31,2,148600,1,9,1,8,1,1,0,0,0,40,0,0 +39,2,19914,5,10,2,0,4,3,1,0,0,40,0,0 +42,2,190767,0,13,2,0,0,0,1,0,0,40,0,0 +41,2,233955,3,14,1,3,1,2,0,0,0,45,26,1 +35,2,30381,0,13,1,5,1,0,0,0,0,45,0,1 +38,2,187069,1,9,1,6,1,0,0,0,0,45,0,0 +31,2,367314,1,9,2,0,0,0,1,0,0,40,0,0 +51,4,101119,1,9,1,11,1,0,0,0,0,70,0,0 +38,2,86551,0,13,2,5,0,0,0,0,0,48,0,1 +40,4,218995,5,10,1,1,1,0,0,0,0,42,0,1 +21,2,57711,1,9,0,4,0,0,1,0,0,30,0,0 +44,2,303521,5,10,2,10,0,0,0,0,0,40,0,0 +55,2,199067,1,9,1,10,1,0,0,0,0,40,0,1 +29,2,247445,1,9,2,5,0,0,0,0,0,45,0,0 +49,2,186078,3,14,1,3,2,0,1,0,0,50,0,1 +31,2,77634,9,11,1,4,1,0,0,0,0,42,0,0 +24,2,180060,3,14,0,1,3,0,0,6849,0,90,0,0 +46,2,56482,5,10,0,1,0,1,0,0,0,40,0,0 +26,2,314177,1,9,0,5,0,1,0,0,0,40,0,0 +35,2,239755,0,13,0,4,0,0,0,0,0,38,0,0 +27,2,377680,9,11,0,5,0,0,0,0,0,50,0,0 +64,1,134960,0,13,1,1,1,0,0,15024,0,35,0,1 +26,2,294493,0,13,0,10,5,0,0,0,0,40,0,0 +21,2,32616,1,9,0,4,0,0,1,0,1719,16,0,0 +57,4,52267,1,9,1,6,1,0,0,0,0,72,0,0 +30,2,117963,0,13,1,0,1,0,0,0,0,40,0,1 +45,2,98881,2,7,1,4,2,0,1,0,0,32,0,0 +50,2,196963,7,4,2,10,0,0,1,0,0,30,0,0 +38,2,166988,0,13,0,0,3,0,1,0,0,40,0,0 +43,1,193459,5,10,1,10,1,0,0,0,0,60,0,0 +42,2,182342,5,10,6,1,0,0,1,0,0,55,0,0 +32,2,496743,0,13,0,3,3,0,0,0,0,40,0,0 +20,2,154781,1,9,0,0,0,0,1,0,0,40,0,0 +27,2,219371,1,9,0,4,0,0,1,0,0,35,0,0 +45,2,99179,2,7,6,0,4,0,1,0,0,40,0,0 +40,2,224910,1,9,0,8,0,0,1,0,0,40,0,0 +38,2,304651,1,9,2,6,0,0,0,0,0,60,0,0 +37,2,349689,1,9,2,0,4,0,1,0,0,40,0,0 +60,2,106850,12,6,2,8,0,0,1,0,0,40,0,0 +53,1,196328,1,9,1,1,1,1,0,0,0,45,0,1 +25,2,169323,0,13,1,1,3,0,1,0,0,40,0,0 +47,1,162924,0,13,2,1,0,2,0,0,0,60,28,0 +40,1,34037,1,9,0,7,0,0,0,0,0,70,0,0 +19,2,197384,5,10,0,4,3,0,1,0,0,10,0,0 +42,2,251795,5,10,1,3,2,0,1,0,0,50,0,1 +41,2,165309,0,13,2,0,4,0,1,0,0,40,0,0 +28,2,215873,12,6,0,8,3,1,0,0,0,45,0,0 +46,2,133938,3,14,2,1,0,0,1,27828,0,50,0,1 +49,2,159816,0,13,1,3,2,0,1,99999,0,20,0,1 +24,2,228424,1,9,0,2,5,1,0,0,0,40,0,0 +32,2,195576,2,7,1,8,1,0,0,0,0,40,0,0 +71,2,105200,1,9,1,11,1,0,0,6767,0,20,0,0 +26,2,167350,5,10,1,9,1,0,0,3103,0,40,0,1 +29,2,52199,1,9,3,11,0,0,0,0,0,40,0,0 +50,2,171338,5,10,1,1,1,0,0,99999,0,50,0,1 +51,2,120173,9,11,1,10,1,0,0,3103,0,50,0,1 +49,2,169818,1,9,1,4,2,1,1,0,0,40,0,1 +31,2,288419,12,6,1,8,1,0,0,0,0,40,0,0 +23,2,207546,2,7,1,8,1,0,0,0,0,40,0,0 +59,4,147707,1,9,6,7,4,0,0,0,2339,40,0,0 +43,2,193882,5,10,1,5,1,0,0,7688,0,40,0,1 +38,2,31033,0,13,1,5,1,0,0,7298,0,40,0,1 +37,2,272950,1,9,1,1,1,0,0,0,0,40,0,0 +29,2,183523,12,6,0,4,3,0,0,0,0,40,0,0 +39,2,238415,0,13,1,1,1,0,0,0,0,50,0,1 +31,2,19302,6,12,0,0,0,0,0,2202,0,38,0,0 +42,4,339671,0,13,3,3,0,0,1,8614,0,45,0,1 +35,4,103260,3,14,1,3,2,0,1,0,0,35,0,1 +39,2,79331,3,14,1,1,1,2,0,15024,0,40,0,1 +40,2,135056,6,12,2,0,4,0,1,0,0,40,0,0 +66,2,142723,11,3,3,2,4,0,1,0,0,40,5,0 +30,3,188569,4,5,1,9,1,0,0,0,0,40,0,0 +43,2,57322,6,12,2,10,0,0,0,0,0,40,0,0 +47,2,178309,4,5,0,4,4,0,1,0,0,50,0,0 +45,2,166107,3,14,0,0,0,2,1,0,0,40,11,0 +31,2,53042,5,10,1,8,1,1,0,0,0,40,33,0 +33,2,155343,1,9,1,5,1,0,0,3103,0,40,0,1 +32,2,35595,0,13,0,0,0,0,0,0,0,40,0,0 +28,2,429507,6,12,1,2,1,1,0,0,0,40,0,0 +50,3,159670,1,9,1,0,1,0,0,0,0,40,0,1 +63,2,151210,7,4,2,5,0,0,1,0,0,40,0,0 +28,2,186792,0,13,1,0,1,0,0,0,0,40,0,0 +38,2,204640,5,10,6,0,4,1,1,0,0,40,0,0 +52,2,87205,1,9,2,4,0,0,1,0,0,38,0,0 +38,5,112847,10,15,1,3,1,2,0,0,0,40,0,1 +41,2,107306,1,9,0,1,0,0,0,2174,0,40,0,0 +50,0,211319,3,14,0,3,0,0,0,0,0,38,0,0 +59,2,183606,2,7,1,8,1,0,0,0,0,40,0,0 +32,2,205390,1,9,1,5,1,0,0,0,0,49,0,0 +73,4,232871,7,4,1,11,1,0,0,2228,0,10,0,0 +52,5,101017,1,9,2,1,4,0,0,0,0,38,0,0 +57,2,114495,1,9,1,1,1,0,0,0,0,60,0,0 +35,2,183898,9,11,1,1,1,0,0,7298,0,50,0,1 +51,2,163921,0,13,1,6,1,0,0,0,0,56,0,1 +22,2,311764,2,7,6,5,3,1,1,0,0,35,0,0 +49,2,188330,1,9,1,5,1,0,0,0,0,40,0,1 +22,2,267174,1,9,0,2,3,1,0,0,0,40,0,0 +46,4,36228,1,9,1,10,1,0,0,0,1902,40,0,0 +48,2,199739,1,9,2,10,4,0,1,0,0,40,0,0 +43,0,206139,0,13,1,0,1,0,0,0,0,50,0,1 +25,2,282063,7,4,1,2,1,0,0,0,0,40,4,0 +31,2,332379,7,4,0,10,0,0,0,0,0,40,0,0 +19,2,418324,5,10,0,5,3,0,0,0,0,36,0,0 +51,2,158948,1,9,1,6,1,0,0,0,0,84,0,1 +51,2,221532,0,13,2,1,4,0,0,0,0,40,0,1 +22,1,202920,1,9,0,3,4,0,1,99999,0,40,21,1 +37,4,118909,1,9,2,0,4,1,1,0,0,35,0,0 +19,2,286469,5,10,0,5,3,0,1,0,0,30,0,0 +45,2,191914,1,9,2,6,4,0,1,0,0,55,0,0 +21,0,142766,5,10,0,4,3,0,0,0,0,10,0,0 +52,2,198744,1,9,6,5,0,0,1,0,0,40,0,0 +46,4,272780,5,10,1,3,1,0,0,0,0,24,0,0 +42,0,219553,3,14,2,3,0,0,1,0,0,38,0,0 +56,2,261232,1,9,0,10,0,0,0,0,0,40,0,0 +23,2,64292,1,9,0,0,0,0,1,0,0,40,0,0 +58,2,312131,3,14,1,5,1,0,0,0,0,40,0,0 +70,2,30713,1,9,1,7,1,0,0,0,0,30,0,0 +30,2,246439,5,10,2,0,4,0,0,0,0,40,0,0 +45,2,338105,0,13,1,0,1,2,0,0,0,40,11,0 +23,2,228243,5,10,0,10,0,0,0,0,0,44,0,0 +34,4,62463,5,10,1,6,1,0,0,0,1579,40,0,0 +38,2,31603,0,13,1,10,2,0,1,0,0,40,0,0 +24,2,165054,9,11,1,10,1,0,0,0,0,40,0,0 +53,2,121618,7,4,0,6,0,3,0,0,0,40,0,0 +45,3,273194,1,9,0,6,0,1,0,3325,0,40,0,0 +21,2,538319,5,10,0,4,3,0,1,0,0,40,5,0 +34,2,238246,0,13,0,3,0,0,1,0,0,40,0,0 +32,5,244665,1,9,1,10,1,0,0,5178,0,45,0,1 +21,2,131811,1,9,1,2,1,0,0,0,0,40,0,0 +23,2,156807,4,5,0,2,3,1,0,0,0,36,0,0 +28,2,236861,0,13,2,10,4,0,0,0,0,50,0,0 +29,1,229842,1,9,0,6,4,1,0,0,0,45,0,0 +25,4,190057,0,13,0,3,3,0,1,0,0,40,0,0 +44,0,55076,3,14,0,3,0,0,1,0,0,60,0,0 +18,2,152545,1,9,0,4,3,0,1,0,0,8,0,0 +26,2,153434,1,9,0,4,3,0,0,0,0,24,0,0 +47,4,171095,6,12,1,0,2,0,1,0,0,35,0,1 +23,2,239322,1,9,2,5,0,0,0,0,0,40,0,0 +46,2,138999,5,10,1,8,1,0,0,0,0,40,0,0 +61,4,95450,0,13,1,1,1,0,0,5178,0,50,0,1 +25,2,176520,1,9,0,10,5,0,0,0,0,40,0,0 +38,4,72338,1,9,1,11,1,2,0,0,0,54,0,1 +23,2,235722,5,10,0,4,0,0,0,0,0,20,0,0 +36,3,128884,1,9,2,0,0,0,1,0,0,48,0,0 +46,2,187226,4,5,2,4,0,0,0,0,0,25,0,0 +32,1,298332,0,13,1,3,1,0,0,0,0,45,0,1 +40,2,173607,12,6,1,6,1,0,0,0,0,40,0,0 +31,2,226756,1,9,0,0,3,1,0,0,0,40,0,0 +31,2,157887,5,10,1,1,1,0,0,0,0,65,0,1 +32,0,171111,0,13,0,0,0,0,0,0,0,37,0,0 +21,2,126314,5,10,0,4,3,0,0,0,0,10,0,0 +63,2,174018,5,10,1,5,1,1,0,0,0,40,0,1 +44,2,144778,5,10,4,1,0,0,0,0,0,45,0,1 +42,1,201522,0,13,1,5,1,0,0,0,0,60,0,0 +30,2,399088,5,10,2,0,0,0,1,0,0,45,0,0 +24,2,282202,1,9,0,4,4,0,0,0,0,40,22,0 +42,2,102606,0,13,1,9,1,0,0,0,0,40,0,1 +44,1,246862,1,9,1,3,2,0,1,0,0,40,25,1 +27,3,508336,0,13,0,1,0,1,0,0,0,48,0,0 +27,4,263431,5,10,0,1,4,0,0,0,0,40,0,0 +22,2,235733,1,9,0,4,0,0,1,0,0,45,0,0 +68,2,107910,1,9,0,5,0,0,1,0,0,40,0,0 +55,1,184425,5,10,1,7,1,0,0,0,0,99,0,1 +22,1,143062,1,9,0,4,3,0,0,0,0,40,34,0 +25,2,199545,5,10,1,1,2,0,1,0,0,15,0,0 +68,1,197015,1,9,1,7,1,0,0,0,0,45,0,0 +62,2,149617,5,10,6,1,0,0,1,0,0,16,0,0 +26,2,33610,1,9,2,4,5,0,0,0,0,40,0,0 +34,2,192002,3,14,1,3,1,0,0,0,0,55,0,1 +68,2,67791,5,10,6,5,0,0,0,0,0,40,0,0 +42,4,445382,0,13,4,1,0,0,0,0,0,45,0,1 +45,2,112283,0,13,1,5,1,0,0,0,0,55,0,0 +26,2,157249,2,7,0,6,0,0,0,0,0,40,0,0 +25,2,109872,1,9,1,8,1,0,0,0,0,45,0,0 +23,2,119838,0,13,0,3,3,0,0,0,0,50,0,0 +65,6,27012,7,4,6,7,4,0,1,0,0,50,0,0 +31,2,91666,1,9,0,6,0,0,0,0,0,50,0,0 +26,2,270276,1,9,0,0,0,0,1,0,0,40,0,0 +39,2,179271,5,10,1,10,1,0,0,0,0,50,0,1 +44,2,161819,1,9,1,8,1,0,0,0,0,40,0,1 +45,4,339681,3,14,2,3,4,0,1,1506,0,45,0,0 +26,1,219897,3,14,0,3,0,0,1,0,0,50,0,0 +26,2,91683,12,6,1,6,1,0,0,0,0,35,0,0 +36,2,188834,4,5,1,6,1,0,0,0,0,50,0,0 +38,2,187046,2,7,1,10,1,0,0,0,0,45,0,0 +39,2,191807,1,9,0,8,4,0,0,0,0,48,0,0 +52,5,179951,10,15,1,1,1,0,0,0,0,40,0,0 +39,2,324420,15,2,1,10,1,0,0,0,0,45,4,0 +41,1,66632,5,10,2,10,0,0,0,0,0,40,0,0 +42,4,121718,3,14,1,1,1,0,0,0,1902,60,0,1 +47,2,162034,0,13,1,5,1,0,0,0,0,70,0,0 +28,4,218990,9,11,1,11,1,1,0,0,0,46,0,0 +25,4,125863,0,13,0,3,3,0,0,0,0,35,0,0 +35,2,225330,0,13,0,0,0,0,1,0,0,40,0,0 +32,2,120426,1,9,4,0,4,0,1,0,0,40,0,0 +38,2,119741,3,14,1,10,1,1,0,0,0,40,0,1 +44,2,32000,5,10,1,9,1,0,0,0,0,18,0,1 +27,2,278581,0,13,0,5,3,0,1,0,0,40,0,0 +30,2,230224,0,13,0,1,0,0,0,0,0,55,0,1 +30,2,204374,0,13,0,5,0,0,0,0,1741,48,0,0 +45,2,188386,1,9,1,2,1,0,0,0,1628,45,0,0 +20,2,164922,1,9,0,10,3,0,0,0,0,40,0,0 +57,2,195176,3,14,0,3,0,0,0,0,0,80,0,0 +43,2,166740,5,10,2,0,0,0,0,0,0,48,0,0 +28,2,162551,7,4,1,8,5,2,1,0,0,48,26,0 +25,2,211231,1,9,1,9,5,0,1,0,0,48,0,1 +25,2,169990,1,9,1,5,1,0,0,0,0,40,0,0 +90,2,221832,0,13,1,1,1,0,0,0,0,45,0,0 +38,4,255454,0,13,4,3,4,1,0,0,0,40,0,0 +35,2,28160,0,13,3,1,4,0,1,0,0,40,0,0 +50,0,159219,0,13,1,1,1,0,0,0,0,40,8,1 +26,4,103148,1,9,0,0,0,0,1,0,0,40,0,0 +39,2,165186,5,10,1,7,1,0,0,0,0,45,0,0 +56,2,31782,12,6,1,5,1,0,0,0,0,40,0,0 +24,4,249101,1,9,2,11,4,1,1,0,0,40,0,0 +46,2,243190,1,9,1,0,2,0,1,7688,0,40,0,1 +18,4,153405,2,7,0,0,5,0,1,0,0,25,0,0 +37,2,329980,3,14,1,1,1,0,0,0,2415,60,0,1 +57,2,176079,3,14,2,3,0,0,1,0,0,40,0,0 +43,0,218542,1,9,0,0,4,1,1,0,0,40,0,0 +29,0,303446,0,13,1,3,1,0,0,0,0,25,35,0 +40,2,102606,3,14,1,1,1,0,0,0,0,40,0,1 +44,1,483201,0,13,1,1,1,0,0,0,0,40,0,0 +77,4,144608,1,9,1,1,1,0,0,0,0,6,0,0 +30,2,226013,0,13,0,3,0,1,0,0,0,40,0,0 +21,2,165475,1,9,1,8,1,0,0,0,0,40,0,0 +66,2,263637,12,6,1,11,1,0,0,0,0,40,0,0 +40,2,201495,2,7,0,6,3,0,0,0,0,35,0,0 +68,2,213720,1,9,1,5,1,0,0,0,0,40,0,0 +64,2,170483,1,9,6,4,0,0,1,0,0,38,0,0 +26,2,214303,0,13,0,3,0,0,1,0,0,50,0,0 +32,2,190511,5,10,1,1,1,0,0,0,0,40,0,1 +32,2,242150,1,9,0,0,3,0,0,0,0,38,0,0 +51,4,159755,3,14,1,3,1,0,0,0,0,40,0,1 +50,2,147629,3,14,1,3,1,0,0,15024,0,45,0,1 +49,2,268022,0,13,1,5,1,0,0,0,0,50,0,1 +28,2,188711,0,13,0,6,4,0,0,0,0,20,0,0 +29,2,452205,1,9,2,4,4,0,1,0,0,36,0,0 +21,2,260847,5,10,0,5,3,0,0,0,0,30,0,0 +28,2,291374,1,9,0,0,4,1,1,0,0,40,0,0 +55,2,189933,12,6,1,10,1,0,0,0,0,40,0,0 +45,1,133969,1,9,1,5,1,2,0,0,0,50,27,1 +35,2,330664,5,10,0,5,0,0,0,0,0,40,0,0 +26,2,122999,3,14,0,3,0,0,0,8614,0,40,0,1 +30,2,111415,1,9,1,4,1,0,0,0,0,55,9,0 +33,2,217235,1,9,1,5,1,0,0,0,0,20,0,0 +40,2,121956,0,13,3,3,0,2,0,13550,0,40,14,1 +23,2,120172,0,13,0,1,0,0,0,0,0,40,0,0 +35,2,343403,5,10,0,5,0,0,1,0,0,40,0,0 +48,1,104790,2,7,1,7,1,0,0,0,0,50,0,1 +39,4,473547,12,6,2,2,3,1,0,0,0,40,0,0 +53,4,260106,10,15,2,3,0,0,1,0,0,50,0,0 +49,3,168232,1,9,1,0,1,0,0,0,0,40,0,1 +31,2,348491,0,13,0,1,0,1,1,0,0,40,0,0 +36,2,24106,1,9,1,10,1,0,0,3103,0,40,0,1 +60,5,197553,5,10,1,1,1,0,0,7688,0,50,0,1 +29,2,421065,1,9,0,8,0,0,0,0,0,48,0,0 +54,5,138852,5,10,1,5,1,0,0,0,0,45,0,1 +34,2,379412,1,9,1,10,1,0,0,0,0,50,0,0 +30,2,181992,5,10,0,5,0,1,1,0,0,35,0,0 +26,2,236564,1,9,0,2,0,0,0,0,0,40,0,0 +47,2,363418,5,10,0,5,0,0,0,0,0,70,0,1 +50,2,112351,1,9,2,1,4,0,0,0,0,38,0,0 +30,2,204704,0,13,0,1,4,0,1,0,0,45,0,1 +44,2,54611,5,10,2,8,0,0,0,0,0,50,0,0 +49,2,128132,1,9,1,5,1,0,0,0,0,60,0,1 +75,1,30599,3,14,3,3,0,0,1,0,0,50,0,0 +37,2,379522,0,13,1,5,1,0,0,0,0,55,0,1 +51,0,196504,1,9,2,10,4,0,0,0,0,38,0,0 +35,2,82552,1,9,0,10,4,0,0,0,0,35,0,0 +28,2,104024,5,10,0,5,5,0,1,0,0,40,0,0 +66,1,293114,1,9,1,7,1,0,0,1409,0,40,0,0 +72,2,74141,4,5,1,1,2,2,1,0,0,48,0,1 +39,2,192337,0,13,4,5,0,0,0,0,0,50,0,0 +27,2,262478,1,9,0,7,3,1,0,0,0,30,0,0 +57,2,185072,5,10,0,0,5,1,1,0,0,40,2,0 +24,2,296045,7,4,1,10,1,0,0,2635,0,38,0,0 +28,2,246595,1,9,0,10,3,0,0,0,0,70,0,0 +23,2,54472,5,10,3,4,0,0,1,0,0,50,0,0 +31,2,331065,0,13,0,1,0,0,1,0,1408,40,0,0 +23,2,161708,5,10,0,4,3,0,1,0,0,20,0,0 +31,2,264936,5,10,0,4,0,0,1,0,0,40,0,0 +27,4,113545,0,13,0,3,0,0,1,0,0,40,0,0 +30,2,212237,0,13,1,3,1,0,0,0,1740,45,0,0 +34,2,173806,3,14,0,3,0,0,0,4865,0,60,0,0 +57,3,370890,1,9,0,0,0,0,0,0,2258,40,0,0 +39,2,505119,3,14,1,1,1,0,0,0,0,40,1,1 +23,2,193089,2,7,0,10,3,0,0,0,0,40,0,0 +24,4,33432,6,12,1,4,2,0,1,0,0,40,0,0 +36,2,103110,8,16,0,3,0,0,0,0,0,40,7,0 +32,2,160362,5,10,2,4,5,0,0,0,0,40,35,0 +35,2,204621,6,12,2,4,3,0,1,0,0,40,0,0 +36,2,35309,0,13,1,1,1,0,0,0,0,40,0,0 +47,2,194772,9,11,1,8,1,0,0,0,0,40,0,1 +35,2,154410,1,9,0,2,0,0,0,0,0,40,0,0 +44,3,220563,5,10,1,9,1,0,0,0,0,40,0,0 +32,0,253354,3,14,1,3,1,0,0,0,0,50,0,0 +32,2,211699,6,12,1,1,2,0,1,0,1485,40,0,1 +63,1,167501,5,10,1,3,2,0,1,20051,0,10,0,1 +34,2,229732,9,11,1,10,1,0,0,0,0,40,0,0 +47,2,185465,1,9,1,10,1,1,0,0,0,40,0,0 +27,2,335764,2,7,1,5,3,1,0,0,0,35,0,0 +23,2,460046,1,9,4,1,4,0,1,0,0,42,0,0 +50,2,176924,12,6,1,10,1,0,0,0,0,38,0,0 +49,0,213307,5,10,1,3,1,0,0,0,0,40,0,0 +36,2,83893,5,10,1,1,1,0,0,0,0,40,0,1 +23,2,194102,0,13,0,1,4,0,0,0,0,40,0,0 +61,2,238611,7,4,6,4,4,1,1,0,0,38,0,0 +41,2,113597,5,10,1,7,1,0,0,0,0,16,0,0 +27,1,208406,0,13,1,1,1,0,0,0,0,60,0,1 +53,2,274528,0,13,2,1,0,0,0,0,0,70,0,0 +17,1,60116,12,6,0,0,3,0,0,0,0,10,0,0 +53,2,166368,5,10,0,10,0,0,0,0,0,40,0,0 +28,2,303954,1,9,1,10,1,0,0,0,1848,42,0,1 +24,2,99386,0,13,3,3,3,0,1,0,0,40,0,0 +22,2,188569,5,10,0,0,0,0,1,0,0,20,0,0 +53,2,302868,0,13,1,5,1,0,0,0,0,50,0,1 +18,2,283342,2,7,0,4,5,1,0,0,0,20,0,0 +24,2,233777,5,10,0,5,4,0,0,0,0,50,4,0 +20,2,170038,1,9,0,5,0,0,1,0,0,40,0,0 +30,4,261319,7,4,1,6,1,0,0,0,0,40,0,0 +37,0,367237,9,11,0,3,0,0,0,8614,0,40,0,1 +34,2,126838,1,9,1,6,1,0,0,0,0,40,0,0 +19,2,354104,1,9,0,2,3,0,0,0,0,30,0,0 +20,2,176321,14,8,0,0,3,0,1,0,0,40,4,0 +47,2,85129,1,9,2,4,0,2,1,0,0,40,0,0 +22,2,62507,0,13,0,3,3,0,1,0,0,40,0,0 +42,4,111252,3,14,1,1,1,0,0,0,1977,40,0,1 +60,2,156889,5,10,2,0,0,0,1,0,0,40,0,0 +32,2,549430,1,9,0,13,4,0,1,0,0,40,4,0 +46,2,29696,1,9,1,1,1,0,0,0,0,40,0,1 +66,2,98837,1,9,6,0,0,0,1,0,0,40,0,0 +37,2,86150,0,13,1,4,2,2,1,0,0,30,0,1 +34,2,204991,5,10,2,1,3,0,0,0,0,44,0,0 +45,2,371886,0,13,0,3,0,0,0,0,0,46,0,0 +35,2,103605,2,7,1,7,1,0,0,0,0,40,0,0 +51,4,133050,5,10,1,1,1,1,0,0,0,40,0,1 +36,4,126569,5,10,1,11,1,0,0,0,0,40,0,1 +25,3,144259,1,9,0,0,3,1,0,0,0,40,0,0 +51,2,161482,1,9,2,4,4,0,1,0,0,38,0,0 +25,1,305449,5,10,0,8,3,0,0,0,0,40,0,0 +19,2,125010,1,9,0,7,3,0,0,0,0,45,0,0 +47,2,304133,5,10,1,1,1,0,0,0,0,45,0,0 +59,4,120617,1,9,4,11,4,1,1,0,0,40,0,0 +34,2,157747,0,13,1,1,1,0,0,0,0,40,0,1 +40,2,297396,5,10,4,1,4,0,1,0,0,60,0,0 +42,2,121287,1,9,2,8,0,0,0,0,0,45,0,0 +37,2,49115,3,14,1,1,1,0,0,0,0,60,0,1 +51,5,208302,6,12,1,5,1,0,0,0,0,38,0,1 +25,2,304032,1,9,0,0,3,0,0,0,0,36,0,0 +31,3,207301,1,9,1,0,2,0,1,0,0,40,0,1 +37,2,123211,1,9,1,4,1,0,0,0,0,44,0,1 +42,2,33521,6,12,1,5,1,0,0,0,0,45,0,1 +35,2,410034,5,10,2,5,0,0,0,0,0,50,0,0 +51,2,175339,0,13,1,5,1,0,0,0,0,47,0,1 +49,2,168211,5,10,1,10,1,0,0,0,1485,40,0,1 +26,2,125680,0,13,0,3,0,2,0,0,0,16,28,0 +56,4,160829,1,9,2,0,0,0,1,0,0,46,0,0 +52,2,266529,5,10,1,3,1,0,0,0,0,45,0,1 +47,0,224149,0,13,2,1,0,0,1,0,0,40,0,1 +52,2,150930,9,11,1,10,1,0,0,0,0,40,0,0 +30,2,343699,1,9,2,10,4,0,1,0,0,40,0,0 +43,5,172826,5,10,1,5,1,0,0,99999,0,55,0,1 +42,2,213821,1,9,1,10,1,0,0,0,1887,40,0,1 +26,2,211265,5,10,3,10,5,1,1,0,0,35,21,0 +58,4,160586,1,9,1,7,1,0,0,0,0,40,0,0 +66,2,146454,5,10,1,5,1,0,0,5556,0,40,0,1 +30,2,203277,1,9,1,11,1,0,0,0,0,60,0,1 +46,2,309895,5,10,4,0,4,0,1,0,0,40,0,0 +45,2,26522,5,10,1,0,2,0,1,0,1902,35,0,1 +57,2,103809,1,9,0,5,4,0,1,0,0,40,0,0 +25,2,90291,0,13,0,1,3,0,0,0,0,40,0,0 +21,0,181761,5,10,0,9,3,0,1,0,0,10,0,0 +37,2,35330,1,9,2,10,0,0,0,0,1669,55,0,0 +45,4,135776,3,14,2,3,0,0,1,0,0,30,0,0 +39,2,179579,1,9,0,10,3,0,0,0,0,40,0,0 +42,2,193626,1,9,1,0,2,0,1,0,0,53,0,0 +20,2,108887,1,9,0,8,3,0,1,0,0,40,0,0 +23,2,199070,1,9,0,11,3,1,0,0,0,16,0,0 +25,2,441591,0,13,0,9,3,0,0,0,0,40,0,0 +47,2,185254,11,3,0,13,3,0,1,0,0,40,22,0 +24,2,109307,1,9,0,5,3,0,0,0,0,45,0,0 +35,2,23621,1,9,0,10,0,0,0,0,0,70,0,0 +44,4,145178,1,9,1,4,2,1,1,0,0,38,2,1 +47,0,30575,5,10,1,3,1,0,0,0,0,50,0,0 +28,0,130620,2,7,4,0,4,2,1,0,0,40,3,0 +41,4,22155,3,14,2,3,4,0,1,0,0,60,0,0 +31,2,106437,1,9,0,0,0,0,1,0,0,40,0,0 +27,2,79787,3,14,0,1,0,0,1,0,0,25,0,0 +47,2,326857,9,11,1,10,1,0,0,5013,0,40,0,0 +44,2,81853,1,9,0,5,0,2,1,0,0,40,0,0 +61,2,120933,5,10,0,13,0,0,1,0,0,40,0,0 +42,3,153143,5,10,2,0,5,0,1,0,0,40,5,0 +46,2,27669,1,9,0,4,0,0,1,0,0,28,0,0 +46,2,105444,0,13,1,1,1,0,0,0,0,50,0,1 +54,4,169785,3,14,6,3,4,0,1,0,0,38,0,0 +49,2,122493,1,9,6,9,4,0,0,0,0,40,0,0 +56,4,242670,5,10,6,0,4,0,1,0,0,40,0,0 +52,2,54933,3,14,2,3,3,0,1,0,0,40,0,0 +34,2,209317,1,9,1,6,1,0,0,0,0,40,5,0 +25,1,282631,1,9,1,10,1,0,0,0,0,40,0,0 +18,2,98044,2,7,0,3,3,0,1,0,0,40,0,0 +58,2,187487,1,9,1,8,1,0,0,0,0,40,0,0 +31,0,60186,0,13,2,3,0,0,0,0,0,40,0,0 +29,2,75648,5,10,1,10,1,0,0,0,0,55,0,0 +28,2,201175,2,7,0,8,0,1,0,0,0,40,0,0 +30,2,19302,5,10,0,0,0,0,0,0,0,48,0,0 +44,2,146659,3,14,1,3,1,0,0,0,1887,35,0,1 +75,2,101887,12,6,6,13,0,0,1,0,0,70,0,0 +26,2,60726,5,10,1,10,1,1,0,0,0,40,0,0 +33,5,201763,0,13,1,5,1,0,0,0,0,50,0,1 +57,5,119253,3,14,1,5,1,0,0,15024,0,65,0,1 +47,1,121124,11,3,1,5,1,0,0,0,0,55,25,1 +41,2,220132,1,9,1,1,1,0,0,7298,0,40,0,1 +21,2,60639,5,10,0,4,0,0,1,0,0,37,0,0 +17,2,195262,2,7,0,10,3,0,0,0,0,17,0,0 +22,2,100587,5,10,0,4,3,1,1,0,0,15,0,0 +47,2,298130,1,9,1,5,1,0,0,0,0,40,0,0 +45,2,242391,0,13,1,1,1,0,0,0,0,40,0,1 +32,1,197867,9,11,2,5,4,0,0,0,0,50,0,0 +59,2,151977,12,6,4,13,0,1,1,0,0,30,0,0 +38,2,277347,1,9,1,10,1,0,0,0,0,50,0,0 +33,2,125249,1,9,4,11,3,0,1,0,0,40,0,0 +41,2,222142,1,9,1,8,1,0,0,0,0,40,0,0 +51,2,270194,4,5,1,6,1,0,0,0,0,40,0,0 +42,2,169995,1,9,1,5,1,0,0,0,0,48,0,0 +27,2,359155,0,13,1,3,2,0,1,0,0,40,0,1 +60,2,123992,5,10,1,10,1,0,0,0,0,45,0,0 +64,4,266080,1,9,2,0,0,0,1,0,0,35,0,0 +37,2,201531,6,12,1,8,1,0,0,0,0,40,0,1 +54,1,179704,0,13,1,1,1,0,0,0,0,45,0,1 +36,2,393673,6,12,1,1,2,0,1,0,0,50,0,1 +41,1,438696,3,14,2,5,4,0,0,0,0,5,0,1 +35,1,207568,7,4,1,7,1,0,0,0,0,75,0,0 +63,5,54052,3,14,1,5,1,0,0,0,0,68,0,1 +46,2,187581,1,9,2,10,5,0,0,0,0,40,0,0 +47,1,77102,3,14,2,3,0,0,0,0,0,40,0,0 +24,2,353010,0,13,0,8,0,0,0,0,0,65,0,0 +29,2,54131,5,10,0,5,0,0,0,0,0,30,0,0 +74,3,39890,5,10,6,6,0,0,1,0,0,18,0,0 +50,2,156877,2,7,1,6,1,0,0,0,0,70,0,1 +22,2,355686,5,10,0,0,0,0,1,0,0,40,0,0 +48,2,300168,14,8,4,0,3,1,1,0,0,40,0,0 +30,2,488720,4,5,1,2,5,0,0,0,0,40,4,0 +32,2,157287,0,13,1,5,1,0,0,0,0,40,0,0 +39,2,184659,1,9,1,8,1,0,0,0,0,40,0,0 +49,2,214169,5,10,1,10,1,0,0,0,0,40,0,1 +25,2,192149,0,13,0,0,3,0,1,0,0,40,0,0 +50,2,137253,0,13,1,0,2,0,1,0,0,40,0,1 +44,2,373050,1,9,1,6,1,0,0,0,0,40,0,0 +65,2,90377,9,11,1,7,1,0,0,6767,0,60,0,0 +28,3,183151,6,12,1,0,1,0,0,0,0,60,0,0 +55,2,227158,0,13,6,0,4,0,1,0,0,40,0,0 +49,4,34021,0,13,0,3,3,0,1,0,0,50,0,0 +31,2,165148,1,9,4,1,4,0,1,0,0,12,0,0 +47,2,211668,1,9,1,8,2,1,1,0,0,40,0,1 +45,2,358886,1,9,1,6,1,0,0,0,0,40,0,1 +35,2,47707,1,9,0,4,0,1,1,0,0,40,0,0 +34,1,306982,0,13,1,5,1,2,0,0,0,60,27,0 +49,4,52590,1,9,6,11,0,1,0,0,0,40,0,0 +27,2,158156,1,9,0,4,0,0,1,0,0,42,0,0 +42,2,70055,1,9,1,2,1,0,0,0,0,40,0,0 +64,1,177825,1,9,0,4,0,0,0,1055,0,40,0,0 +33,2,127215,5,10,1,5,1,0,0,0,0,48,0,1 +23,2,175183,5,10,0,0,0,0,1,0,0,40,0,0 +45,2,142287,3,14,1,1,1,0,0,0,0,50,0,1 +34,2,221324,1,9,0,8,4,1,1,0,0,40,0,0 +53,2,227602,1,9,2,5,0,0,1,0,0,37,4,0 +22,2,228452,12,6,0,10,0,0,0,0,0,30,0,0 +57,0,39380,1,9,4,4,0,0,1,0,0,35,0,0 +23,2,336360,7,4,0,10,3,1,0,0,0,40,0,0 +31,2,257644,2,7,0,6,4,0,0,0,0,40,0,0 +23,0,235853,0,13,0,9,0,0,0,0,0,22,0,0 +30,2,270577,1,9,4,0,4,0,1,0,0,40,0,0 +32,4,222900,0,13,4,3,0,0,1,0,0,50,0,1 +42,2,99254,6,12,1,0,2,1,1,0,0,40,0,1 +51,2,224763,7,4,1,6,1,0,0,0,0,40,1,0 +59,1,174056,0,13,1,5,1,0,0,15024,0,40,0,1 +36,2,127306,0,13,0,1,3,0,1,0,0,40,0,0 +45,2,339506,1,9,0,5,0,1,0,0,0,40,0,0 +35,2,178322,9,11,1,5,1,0,0,0,0,50,9,1 +33,2,189843,7,4,1,8,1,0,0,0,0,40,0,0 +43,2,160815,9,11,2,3,4,0,1,0,0,40,0,0 +60,2,207665,1,9,1,9,2,0,1,0,0,40,0,1 +37,0,160402,0,13,1,3,1,0,0,0,0,55,0,1 +35,2,170263,5,10,0,9,4,0,1,0,0,40,0,0 +36,2,184659,5,10,1,0,1,0,0,0,0,52,0,0 +38,3,338320,10,15,1,3,1,0,0,0,1977,50,0,1 +54,2,101017,7,4,1,10,1,0,0,0,0,40,0,0 +51,2,204322,9,11,1,2,1,0,0,0,0,40,0,1 +45,2,241350,6,12,1,10,1,0,0,0,0,45,0,1 +63,3,217994,5,10,2,1,4,0,1,0,0,40,0,0 +51,2,128143,5,10,1,10,1,0,0,0,0,40,0,1 +58,1,164065,3,14,2,5,0,0,0,0,0,18,0,0 +64,4,78866,1,9,2,0,0,0,1,0,0,40,0,0 +20,2,236769,5,10,0,2,3,0,0,0,0,40,0,0 +44,3,239539,0,13,1,0,1,2,0,0,0,40,11,1 +39,2,34028,0,13,2,1,4,0,1,0,0,48,0,0 +45,0,207847,5,10,0,0,4,0,1,0,0,40,0,0 +44,2,175935,8,16,1,0,1,0,0,0,0,55,0,1 +22,3,218445,5,10,0,1,0,0,1,0,0,40,0,0 +63,5,215833,1,9,1,1,1,0,0,0,0,40,0,1 +26,2,156976,9,11,4,4,0,1,0,0,0,40,0,0 +42,1,220647,0,13,1,7,1,0,0,0,0,45,0,0 +20,2,218343,1,9,0,4,3,0,1,0,0,25,0,0 +29,2,241431,3,14,1,5,1,0,0,7298,0,40,0,1 +38,4,123983,0,13,0,1,4,2,0,0,1741,40,36,0 +25,2,73289,1,9,0,6,3,0,0,0,0,40,0,0 +27,2,408623,0,13,1,10,5,0,0,0,0,50,0,0 +46,2,169180,9,11,2,0,0,0,1,0,0,40,0,0 +31,2,54929,5,10,2,10,0,0,0,0,0,60,0,0 +24,2,306779,9,11,0,1,3,0,0,0,0,35,0,0 +43,2,159549,5,10,1,5,1,0,0,0,0,50,0,1 +23,2,482082,14,8,0,8,3,0,0,0,0,21,4,0 +32,4,286101,1,9,0,6,4,1,1,0,0,37,0,0 +44,2,167955,1,9,1,10,1,0,0,0,0,40,12,0 +40,1,209040,0,13,1,5,1,0,0,0,0,40,0,0 +38,2,105017,1,9,2,10,4,0,0,0,0,40,0,0 +23,2,27776,9,11,0,8,0,0,0,0,0,40,0,0 +19,2,242941,5,10,0,5,3,0,1,0,1602,10,0,0 +41,2,118853,5,10,1,5,1,0,0,0,0,40,0,0 +48,2,119565,1,9,1,10,1,0,0,0,0,40,0,0 +23,2,196827,5,10,1,8,1,0,0,0,1902,40,0,0 +47,2,275361,6,12,6,4,3,0,1,0,0,35,0,0 +42,2,225193,1,9,1,10,1,0,0,0,0,40,0,0 +17,2,329783,12,6,0,5,5,0,1,0,0,10,0,0 +29,4,107411,10,15,0,3,0,0,1,0,0,70,0,0 +21,0,258490,5,10,0,3,0,0,1,0,0,20,0,0 +31,2,219509,1,9,1,4,1,0,0,0,0,40,4,1 +27,4,29174,0,13,0,3,4,0,1,0,0,40,0,0 +29,2,40083,8,16,0,3,0,0,0,0,0,40,8,0 +23,2,87528,0,13,0,5,0,0,1,0,0,45,0,0 +41,2,116379,3,14,1,3,1,2,0,0,0,55,18,1 +46,4,216214,0,13,1,3,1,0,0,0,0,35,0,1 +34,2,268051,5,10,1,11,5,1,1,0,0,25,19,0 +42,1,121718,1,9,1,10,1,0,0,0,0,24,0,0 +18,2,201901,1,9,0,2,3,0,1,0,1719,15,0,0 +46,2,109089,1,9,2,10,0,0,0,0,0,37,0,0 +52,2,284129,5,10,1,10,1,0,0,0,0,40,0,1 +56,2,143030,1,9,2,10,4,0,1,0,0,40,0,0 +21,2,212619,9,11,0,8,3,0,0,0,0,40,0,0 +22,1,199011,1,9,0,10,5,0,0,0,0,20,0,0 +31,2,118901,0,13,2,0,4,0,1,0,0,45,0,0 +41,1,129865,1,9,1,4,1,0,0,0,0,60,0,0 +25,2,157900,5,10,4,0,4,0,1,0,0,40,0,0 +43,1,349341,0,13,2,1,0,0,0,0,0,60,0,0 +45,2,158685,1,9,4,5,0,0,1,0,0,40,0,0 +26,2,386585,5,10,2,9,0,0,0,0,0,60,0,0 +90,2,52386,5,10,0,4,0,2,0,0,0,35,0,0 +45,2,246891,0,13,1,5,1,0,0,0,1902,40,0,1 +30,2,190385,0,13,1,4,2,0,1,0,0,40,0,1 +42,2,37869,5,10,1,10,1,0,0,0,0,40,0,0 +20,2,217807,5,10,0,2,3,0,0,0,0,35,0,0 +53,2,149784,0,13,1,3,1,0,0,7688,0,40,0,1 +64,0,201293,1,9,6,0,0,0,1,0,0,38,0,0 +56,2,128764,7,4,6,6,0,0,0,0,0,20,0,0 +42,2,27444,5,10,3,3,0,0,0,0,0,40,0,1 +26,2,62438,0,13,1,5,2,0,1,0,0,40,0,1 +31,4,151726,6,12,0,0,3,3,1,0,0,40,0,0 +40,2,29841,0,13,1,0,2,0,1,0,0,40,0,0 +58,2,131608,5,10,6,10,0,0,0,0,0,40,0,0 +41,2,110562,0,13,1,1,1,0,0,0,0,40,0,0 +58,5,190541,1,9,0,5,0,0,0,0,0,47,0,0 +62,0,33142,3,14,1,3,1,0,0,0,0,60,0,1 +65,5,139272,0,13,1,5,1,0,0,99999,0,60,0,1 +40,2,234633,5,10,0,10,0,0,0,0,0,40,0,0 +45,4,238386,5,10,1,11,1,0,0,0,0,40,0,1 +22,2,460835,1,9,0,10,3,0,0,0,0,55,0,0 +63,3,97855,3,14,1,1,1,0,0,0,0,50,0,1 +39,2,77146,0,13,1,1,1,0,0,0,1887,50,0,1 +37,2,200863,5,10,6,10,4,0,0,0,0,40,0,0 +56,2,77415,2,7,1,7,1,0,0,0,0,50,0,0 +32,2,236770,5,10,2,5,0,0,0,0,0,50,0,0 +53,3,173093,5,10,1,1,2,2,1,0,1887,40,11,1 +32,2,235124,9,11,2,3,0,0,0,0,0,40,0,0 +23,1,282604,2,7,1,6,1,0,0,7688,0,60,0,1 +35,2,199288,2,7,4,6,0,0,0,0,0,90,0,0 +51,2,191659,5,10,1,1,1,0,0,0,1887,65,0,1 +19,2,43285,5,10,0,0,3,0,1,0,0,20,0,0 +41,2,160837,2,7,3,8,0,0,0,0,0,40,24,0 +22,2,230574,12,6,0,6,3,0,0,0,0,25,0,0 +23,2,176178,1,9,0,9,3,0,1,0,0,40,0,0 +36,2,116358,3,14,1,1,1,2,0,0,0,40,18,1 +45,2,107787,9,11,1,10,1,0,0,0,0,40,8,0 +23,1,519627,1,9,0,7,0,0,0,0,0,25,4,0 +21,2,191460,2,7,0,4,4,1,1,0,0,40,0,0 +44,2,198282,3,14,1,1,1,0,0,15024,0,40,0,1 +29,2,214858,0,13,1,5,1,0,0,0,0,40,0,1 +36,1,64875,9,11,1,9,1,0,0,0,0,60,0,0 +18,2,675421,4,5,0,2,3,0,0,594,0,40,0,0 +62,1,134768,14,8,1,10,1,0,0,0,0,40,0,1 +25,3,207342,5,10,0,1,0,1,0,0,0,40,0,0 +34,2,64830,6,12,2,1,0,0,1,0,0,45,0,0 +31,2,220066,0,13,0,1,0,0,1,14344,0,50,0,1 +37,2,82521,0,13,1,1,1,0,0,15024,0,40,0,1 +33,2,176711,0,13,1,7,1,0,0,0,0,40,7,0 +28,2,111900,6,12,1,5,1,0,0,0,0,30,0,0 +47,2,481987,1,9,1,4,1,0,0,0,0,40,0,1 +34,2,158420,0,13,1,1,1,0,0,0,0,70,0,0 +26,2,256000,10,15,1,3,1,0,0,99999,0,60,0,1 +36,2,183892,5,10,1,10,1,0,0,7298,0,44,0,1 +28,2,42734,1,9,0,2,3,0,0,0,0,40,0,0 +22,2,181773,1,9,0,6,3,1,0,0,0,40,0,0 +47,2,184945,5,10,4,4,0,1,1,0,0,35,0,0 +33,2,107248,9,11,0,0,0,0,0,0,0,45,0,0 +34,5,215382,3,14,4,3,0,0,1,4787,0,40,0,1 +25,2,122999,1,9,0,10,3,0,0,0,0,40,0,0 +37,2,758700,4,5,1,2,1,0,0,3781,0,50,4,0 +36,0,166606,1,9,1,11,1,0,0,0,0,40,0,0 +57,2,205708,5,10,1,10,1,0,0,0,0,40,12,0 +55,2,67450,8,16,0,3,0,0,0,0,0,40,7,0 +20,2,242077,1,9,2,5,0,1,1,0,0,40,0,0 +43,2,129573,1,9,0,5,0,1,1,0,0,44,0,0 +54,2,181132,1,9,1,8,1,0,0,0,0,40,7,1 +25,2,212302,5,10,4,0,4,0,1,0,0,40,0,0 +42,2,83411,5,10,2,1,0,0,0,0,1408,40,0,0 +17,2,317681,2,7,0,10,3,0,0,0,0,10,0,0 +63,2,30602,7,4,3,4,4,3,1,0,0,40,0,0 +19,2,172893,5,10,0,1,3,0,1,0,0,30,0,0 +56,5,211804,0,13,1,5,1,0,0,15024,0,50,0,1 +33,1,312055,0,13,1,5,1,0,0,0,0,45,0,1 +37,2,65390,0,13,1,7,1,0,0,0,0,50,0,0 +27,2,200500,7,4,1,6,1,0,0,0,0,45,0,0 +36,4,241962,0,13,1,0,1,0,0,0,0,40,0,0 +30,5,78530,1,9,1,1,1,0,0,0,0,65,8,1 +22,2,189950,0,13,0,3,0,0,0,0,0,55,0,0 +35,2,111387,5,10,1,2,1,0,0,0,1579,40,0,0 +20,2,241951,1,9,0,2,0,0,0,0,0,45,0,0 +18,2,343059,5,10,0,5,3,0,1,0,0,40,0,0 +25,2,302465,14,8,0,8,0,0,0,0,1741,40,0,0 +53,2,156843,3,14,0,3,0,0,1,0,1564,54,0,1 +19,2,55284,1,9,0,5,3,0,1,0,0,35,0,0 +34,2,509364,1,9,2,8,0,0,0,0,0,30,0,0 +32,0,117927,5,10,0,0,0,1,1,0,0,40,0,0 +20,2,137651,5,10,0,8,3,3,0,0,0,40,0,0 +70,2,131060,7,4,1,4,1,0,0,0,0,25,0,0 +57,2,346963,0,13,1,1,1,0,0,0,0,40,0,1 +54,2,183611,5,10,1,5,1,0,0,3137,0,50,0,0 +34,2,134737,9,11,1,8,1,0,0,0,0,40,0,0 +48,2,36503,5,10,1,1,1,0,0,0,0,40,0,1 +42,2,250121,2,7,1,4,2,0,1,0,0,40,0,0 +45,2,330535,1,9,0,0,0,0,0,3325,0,40,0,0 +27,2,387776,5,10,0,4,3,0,0,0,0,40,0,0 +51,2,41474,12,6,1,4,1,0,0,0,0,40,4,0 +36,4,318972,5,10,2,0,4,0,1,0,0,65,0,0 +33,2,86143,5,10,0,1,3,2,0,0,0,40,11,0 +50,2,181139,5,10,0,7,0,0,0,0,0,40,0,0 +44,2,326232,0,13,2,1,4,0,0,0,2547,50,0,1 +39,4,153976,3,14,1,3,1,0,0,0,0,40,0,1 +55,1,59469,4,5,1,7,1,0,0,0,0,25,0,0 +24,2,127139,5,10,0,0,3,0,1,0,0,40,0,0 +35,2,136343,1,9,0,5,0,0,0,0,0,40,0,0 +32,1,350624,14,8,1,10,1,0,0,0,0,40,0,0 +68,2,166149,1,9,6,0,0,0,1,0,2206,30,0,0 +29,2,121523,2,7,1,6,1,0,0,0,0,60,0,0 +24,1,267396,0,13,0,5,0,0,0,0,0,40,0,0 +61,2,83045,4,5,1,8,1,0,0,0,0,40,0,0 +34,2,160449,1,9,1,8,1,0,0,0,0,44,0,1 +55,5,124137,10,15,1,3,1,0,0,0,2415,35,34,1 +41,2,154194,1,9,0,5,3,0,1,0,0,40,0,0 +36,1,295127,1,9,1,7,1,0,0,0,0,84,0,0 +60,2,240521,1,9,1,10,1,0,0,7298,0,40,0,1 +61,1,244087,1,9,1,10,1,0,0,0,0,52,0,1 +35,2,356250,10,15,1,5,1,2,0,0,0,35,26,0 +42,0,293791,0,13,1,1,1,0,0,0,0,50,0,1 +26,2,44308,0,13,0,9,0,0,0,0,0,40,0,0 +44,4,210527,5,10,0,4,4,1,1,0,0,40,0,0 +31,0,151763,3,14,0,0,0,0,0,0,0,25,0,0 +39,0,267581,1,9,0,4,0,1,0,0,0,40,0,0 +20,2,100188,5,10,0,9,3,0,1,0,0,24,0,0 +32,5,111746,5,10,1,10,1,0,0,0,0,40,0,0 +32,1,171091,1,9,1,5,1,0,0,0,0,40,0,0 +61,2,355645,4,5,1,8,1,1,0,0,0,20,33,0 +54,4,137678,5,10,2,0,4,0,1,0,0,40,0,0 +23,2,70894,6,12,0,10,5,0,0,0,0,40,0,0 +19,2,171306,1,9,0,5,3,0,0,0,0,3,0,0 +31,2,100997,5,10,1,3,1,3,0,0,0,40,0,0 +35,2,63921,11,3,1,2,1,0,0,0,0,40,4,0 +29,2,32897,1,9,2,4,0,0,1,0,0,25,0,0 +29,4,251854,1,9,0,11,0,1,1,0,0,40,0,0 +25,2,345121,12,6,4,4,3,0,1,0,0,25,0,0 +46,2,86220,0,13,2,5,0,0,1,0,0,40,0,0 +35,2,172845,9,11,0,4,4,0,1,0,0,30,0,0 +20,2,171398,12,6,0,5,0,4,0,0,0,40,0,0 +24,1,174391,1,9,1,0,2,0,1,0,0,40,0,0 +48,2,207058,1,9,2,0,4,0,1,0,0,37,0,0 +37,2,291251,1,9,2,8,0,0,1,0,0,40,0,0 +60,1,224377,1,9,1,5,1,0,0,0,0,40,0,0 +39,2,105813,1,9,1,10,1,0,0,0,0,40,0,0 +29,4,180916,5,10,4,0,4,0,1,0,0,38,0,0 +31,1,122749,9,11,2,10,3,0,0,0,0,20,0,0 +38,2,31069,9,11,1,10,1,0,0,4386,0,40,0,1 +26,1,284343,6,12,0,10,0,0,0,0,0,40,0,0 +64,2,319371,0,13,1,1,1,0,0,15024,0,40,0,1 +46,2,174224,9,11,2,11,0,1,0,0,0,40,0,0 +39,2,127772,1,9,1,5,1,0,0,3103,0,44,0,1 +48,2,80651,1,9,2,8,0,0,1,0,0,55,0,0 +46,2,62793,1,9,2,5,5,0,1,0,0,40,0,0 +42,2,191712,0,13,2,5,0,0,0,0,1590,40,0,0 +39,1,237532,1,9,1,5,2,1,1,0,0,54,21,1 +50,3,20179,3,14,1,9,1,0,0,0,0,40,0,1 +24,2,311376,0,13,0,3,0,0,1,0,0,40,0,0 +30,2,432565,9,11,1,9,5,0,1,0,0,40,8,1 +39,5,329980,0,13,1,5,1,0,0,0,2415,60,0,1 +29,1,125190,1,9,1,10,1,0,0,0,0,40,0,0 +23,2,342946,2,7,0,6,3,0,1,0,0,38,0,0 +32,2,123429,12,6,4,10,0,0,0,0,0,40,0,0 +69,5,69209,0,13,1,8,1,0,0,3818,0,30,0,0 +55,2,66356,1,9,4,2,4,0,0,0,0,40,0,0 +41,2,195897,5,10,1,5,1,0,0,0,0,50,0,0 +44,5,153132,0,13,1,1,1,0,0,7688,0,52,0,1 +18,2,230875,2,7,0,0,0,0,0,0,0,40,0,0 +74,1,92298,0,13,1,1,1,0,0,0,0,10,0,0 +40,2,185145,8,16,1,3,1,0,0,0,0,40,0,1 +27,2,297296,1,9,1,10,1,0,0,0,0,40,0,0 +55,2,145214,1,9,2,0,0,0,1,0,0,40,0,0 +52,1,242341,7,4,1,10,1,3,0,0,0,40,0,0 +54,2,240542,5,10,2,5,4,0,1,0,0,48,0,0 +36,2,104772,1,9,2,10,4,0,0,0,0,48,0,0 +26,2,181666,1,9,0,2,3,0,1,0,0,40,0,0 +18,2,415520,2,7,0,10,3,0,0,0,0,20,0,0 +38,2,258761,1,9,2,1,0,0,0,0,0,50,0,0 +50,2,88842,0,13,1,6,1,0,0,7298,0,40,0,1 +32,2,158438,5,10,1,1,1,0,0,0,0,60,0,1 +57,2,206206,0,13,1,5,1,0,0,0,0,40,0,1 +20,2,51816,1,9,0,11,3,1,0,0,0,40,0,0 +27,2,253814,5,10,0,0,0,0,1,0,0,40,0,0 +31,1,161745,0,13,3,1,0,0,0,0,1980,60,0,0 +60,2,162947,11,3,2,8,0,0,1,0,0,40,5,0 +52,2,163027,1,9,2,10,4,0,1,0,0,50,0,0 +61,2,146788,7,4,1,6,1,0,0,0,0,40,0,0 +57,1,73309,1,9,6,10,0,0,0,0,0,55,0,1 +59,1,104216,10,15,1,5,1,0,0,0,0,25,0,0 +34,1,345705,1,9,0,10,0,0,0,0,0,45,0,1 +31,2,133770,6,12,1,10,0,2,0,0,0,50,0,1 +42,2,209392,1,9,2,11,0,1,0,0,0,35,0,0 +70,2,262345,5,10,0,0,0,0,1,0,0,6,0,0 +29,2,490332,5,10,1,6,1,0,0,0,0,45,0,1 +27,2,211570,2,7,0,2,5,1,0,0,0,40,0,0 +25,2,374918,14,8,1,4,2,0,1,0,0,40,0,0 +51,2,106728,0,13,1,1,1,0,0,5178,0,60,0,1 +35,2,174597,0,13,1,10,1,0,0,0,0,40,0,0 +36,1,233533,5,10,1,10,1,0,0,0,0,60,0,1 +46,2,133169,9,11,1,10,1,0,0,0,0,40,0,0 +52,2,198824,9,11,4,4,4,0,1,0,0,35,0,0 +65,2,174056,7,4,1,8,1,0,0,0,0,40,0,0 +43,2,188696,9,11,2,8,0,0,0,0,0,40,0,0 +41,4,90692,1,9,2,3,4,2,1,0,0,40,0,0 +34,2,271933,0,13,0,1,5,0,1,0,1741,45,0,0 +47,1,102359,0,13,1,1,1,0,0,0,0,30,0,0 +49,3,213668,3,14,0,1,0,0,0,0,0,56,0,1 +21,2,294789,5,10,0,4,0,0,1,0,0,25,0,0 +20,2,157599,5,10,0,4,0,0,1,0,0,25,0,0 +18,4,134935,14,8,0,11,3,0,0,0,0,40,0,0 +27,2,466224,5,10,0,5,0,1,0,0,0,40,0,0 +34,1,111985,1,9,1,10,1,0,0,0,0,50,0,0 +38,2,264627,5,10,2,0,4,0,1,0,0,40,0,0 +24,2,213427,1,9,0,0,0,0,0,0,0,40,0,0 +34,2,279015,5,10,0,5,0,0,0,0,0,65,0,0 +47,2,165937,1,9,1,8,1,0,0,0,0,50,0,1 +27,3,188343,1,9,4,1,4,1,1,0,0,40,0,0 +63,2,158609,9,11,6,0,4,0,1,0,0,8,0,0 +34,2,193036,5,10,1,0,1,1,0,0,0,40,0,1 +25,2,198632,5,10,3,5,0,0,0,0,0,50,0,0 +54,2,175912,1,9,6,8,4,0,0,914,0,40,0,0 +35,2,101387,1,9,2,5,0,0,1,0,0,50,0,0 +24,2,60783,5,10,1,6,1,0,0,0,0,70,0,1 +26,2,183224,5,10,0,0,3,2,1,0,0,35,0,0 +59,4,100776,9,11,2,0,0,0,1,0,0,40,0,0 +20,2,174063,5,10,0,4,3,0,1,0,0,40,0,0 +41,2,306495,1,9,1,7,1,0,0,0,0,40,0,0 +51,2,249741,5,10,1,5,1,0,0,0,0,40,0,0 +27,2,93021,1,9,0,0,4,4,1,0,0,40,0,0 +36,2,49626,1,9,1,1,1,0,0,0,0,40,0,0 +25,2,63062,5,10,0,7,3,0,0,0,0,60,0,0 +55,2,320835,0,13,1,5,1,0,0,0,0,50,0,1 +22,4,123727,5,10,0,3,0,0,1,0,0,21,0,0 +58,0,110517,8,16,1,3,1,2,0,4064,0,40,3,0 +43,2,149670,5,10,1,0,2,0,1,4064,0,15,0,0 +39,2,172425,9,11,1,0,2,0,1,0,0,20,0,1 +40,2,216116,4,5,0,8,4,1,1,0,0,40,19,0 +46,2,174209,1,9,2,1,0,0,0,0,0,45,0,0 +54,3,175083,1,9,0,0,4,0,1,0,0,20,0,0 +19,2,129059,5,10,0,5,3,1,0,0,0,30,0,0 +24,2,121313,1,9,1,0,1,0,0,0,0,40,0,0 +24,0,166851,3,14,0,3,0,0,0,0,0,13,0,0 +29,1,29616,1,9,0,7,3,0,0,0,0,65,0,0 +56,5,105582,5,10,1,1,1,0,0,7688,0,50,0,1 +56,2,117881,2,7,2,8,0,0,1,0,0,40,0,0 +34,2,203408,0,13,1,3,1,0,0,7688,0,50,0,1 +19,2,446219,12,6,0,5,4,1,1,0,0,40,0,0 +32,5,110331,1,9,1,5,1,0,0,0,0,65,0,1 +48,2,207946,1,9,2,0,4,0,1,0,0,52,0,0 +47,2,188330,1,9,1,6,1,0,0,0,0,25,0,0 +52,2,147629,1,9,1,6,1,0,0,0,0,60,0,1 +40,2,153799,15,2,3,8,4,0,1,0,0,40,21,0 +28,2,203776,12,6,1,10,1,0,0,0,0,50,0,0 +41,2,168071,0,13,1,1,1,0,0,7298,0,50,0,1 +57,2,348430,15,2,2,10,4,0,0,0,0,40,20,0 +51,2,103407,1,9,2,0,0,0,1,0,0,40,0,0 +33,2,326104,5,10,1,1,1,0,0,0,0,50,0,1 +46,2,238162,0,13,1,10,1,0,0,0,0,45,0,1 +50,2,221336,1,9,2,0,5,2,1,0,0,40,11,0 +77,1,145329,1,9,0,8,0,0,0,401,0,20,0,0 +39,2,315776,3,14,0,1,0,1,0,8614,0,52,0,1 +35,2,325802,6,12,2,2,4,0,1,0,0,24,0,0 +23,2,133985,12,6,0,10,3,1,1,0,0,40,0,0 +37,2,269329,9,11,2,3,0,0,1,8614,0,45,0,1 +41,2,183203,1,9,1,6,1,0,0,0,0,50,0,1 +60,2,76127,6,12,1,0,1,0,0,0,0,35,0,1 +32,2,195891,0,13,0,0,0,0,0,0,0,55,0,0 +56,3,162137,1,9,1,6,1,3,0,0,0,40,0,0 +45,0,37672,9,11,2,9,4,0,1,0,0,40,0,0 +24,2,161708,1,9,2,1,0,0,1,0,0,45,0,1 +18,2,80616,12,6,0,2,3,0,0,0,0,27,0,0 +31,2,209276,1,9,1,4,1,4,0,0,0,40,0,0 +45,2,192835,0,13,1,1,1,0,0,0,1977,55,0,1 +23,2,203240,5,10,0,4,0,0,1,0,0,40,0,0 +45,0,102308,5,10,1,1,1,0,0,0,0,40,0,0 +18,2,40829,2,7,0,5,5,3,1,0,0,25,0,0 +25,2,60726,1,9,1,6,1,1,0,0,0,30,0,0 +31,0,116677,1,9,1,5,1,0,0,0,0,40,0,0 +19,2,57067,1,9,0,8,5,0,0,0,0,45,0,0 +41,2,304906,0,13,1,1,1,0,0,0,0,40,0,1 +74,2,101590,10,15,6,0,0,1,1,0,0,20,0,0 +27,2,258102,11,3,0,6,0,0,0,0,0,40,4,0 +23,2,241185,1,9,0,0,0,0,1,0,0,40,0,0 +31,2,124827,9,11,1,5,1,0,0,0,0,40,0,1 +40,5,76625,1,9,1,2,1,0,0,0,0,40,0,0 +41,3,263339,1,9,1,6,1,0,0,0,0,40,0,1 +25,2,135645,3,14,0,5,0,0,0,0,0,20,0,0 +42,2,245626,1,9,1,10,1,3,0,0,0,60,0,0 +24,2,210781,0,13,0,10,0,0,1,0,0,40,0,0 +42,2,235786,6,12,1,10,1,0,0,0,0,50,0,1 +45,1,160167,12,6,1,10,1,0,0,0,0,70,0,0 +52,3,30731,1,9,1,1,1,0,0,7298,0,40,0,1 +34,2,314375,9,11,2,10,0,0,0,0,0,40,0,0 +32,2,81528,1,9,0,2,5,0,0,0,0,60,0,0 +54,2,182854,1,9,1,10,1,0,0,0,0,45,0,0 +42,3,296798,2,7,0,9,0,0,0,0,1340,40,0,0 +32,2,194426,0,13,1,9,1,0,0,15024,0,40,0,1 +55,5,141807,0,13,1,5,1,0,0,0,0,60,0,1 +52,0,71344,3,14,1,3,1,0,0,0,0,40,0,0 +21,0,341410,5,10,0,0,0,0,1,0,0,15,0,0 +33,2,118941,0,13,1,1,2,0,1,0,0,40,0,1 +27,1,229125,2,7,1,10,1,0,0,0,0,40,0,0 +42,4,142756,0,13,2,3,0,0,1,0,0,50,0,0 +27,5,243871,5,10,0,0,3,0,1,0,0,45,0,0 +47,2,213140,9,11,1,10,1,0,0,7688,0,40,0,1 +19,2,196857,1,9,0,4,0,0,1,0,0,40,0,0 +46,2,138626,5,10,1,10,1,0,0,0,0,40,0,0 +55,1,161334,1,9,6,4,0,0,1,0,0,25,35,0 +50,2,273536,7,4,1,5,1,4,0,0,0,49,21,0 +32,2,115631,5,10,0,0,0,0,1,4101,0,50,0,0 +28,2,185957,1,9,1,0,2,0,1,0,0,40,0,0 +23,2,334357,1,9,0,0,3,1,1,0,0,40,0,0 +43,2,96102,3,14,3,1,0,0,0,0,0,50,0,0 +34,2,213226,0,13,1,3,1,0,0,0,0,40,10,1 +19,2,115248,5,10,0,0,0,2,0,0,0,40,36,0 +37,2,185061,5,10,1,1,1,2,0,0,0,55,0,0 +27,2,147638,0,13,0,0,5,2,1,0,0,40,37,0 +18,2,280298,1,9,0,5,3,0,1,0,0,24,0,0 +31,2,163516,5,10,6,0,4,0,1,0,0,40,0,0 +49,2,277434,1,9,1,6,1,0,0,0,0,50,0,0 +26,3,206983,10,15,1,3,1,0,0,0,0,60,13,0 +48,2,108993,1,9,1,10,1,0,0,0,0,45,0,1 +39,2,288551,1,9,1,10,1,1,0,0,0,40,0,0 +41,2,176069,1,9,4,8,4,0,1,0,0,40,0,0 +48,0,183486,9,11,2,3,4,0,1,0,0,56,0,1 +40,2,163215,0,13,2,1,0,0,1,10520,0,40,0,1 +70,2,94692,0,13,1,5,1,0,0,0,0,70,0,1 +20,2,118462,1,9,0,2,3,0,0,0,0,43,0,0 +38,2,407068,11,3,1,4,1,0,0,0,0,75,4,0 +37,1,243587,5,10,4,4,3,0,1,0,0,40,1,0 +49,2,23074,5,10,6,1,0,0,1,0,0,40,0,1 +51,2,237735,1,9,1,2,1,0,0,3103,0,40,0,1 +43,2,188291,15,2,0,5,3,0,0,0,0,40,0,0 +38,2,284166,10,15,0,3,0,0,0,0,0,50,0,0 +23,2,287681,7,4,0,4,0,0,0,0,0,25,4,0 +34,2,509364,1,9,1,10,1,0,0,0,0,40,0,0 +33,2,91964,5,10,0,0,4,0,0,0,0,40,0,0 +31,2,117526,5,10,0,7,0,0,1,0,0,45,0,0 +64,2,91343,5,10,6,9,4,0,1,0,0,40,0,0 +26,4,336969,0,13,1,3,1,0,0,0,0,28,22,0 +55,2,255364,5,10,1,3,1,0,0,0,0,40,0,0 +61,4,167670,0,13,3,3,0,0,0,0,0,40,0,0 +37,2,211494,1,9,1,9,1,0,0,0,0,40,0,1 +78,4,136198,0,13,1,1,1,0,0,0,0,15,0,0 +27,3,409815,5,10,0,0,4,1,1,0,0,40,0,0 +49,2,188823,1,9,2,3,0,0,0,0,0,42,0,0 +55,0,146326,3,14,1,3,1,0,0,7688,0,45,0,1 +42,2,154374,0,13,1,6,1,0,0,0,0,58,0,0 +61,2,197286,4,5,1,10,1,0,0,0,0,40,0,0 +64,1,100722,0,13,1,0,1,0,0,0,0,5,0,0 +46,4,377622,1,9,1,4,1,0,0,0,0,40,0,0 +24,2,145964,0,13,0,1,0,0,0,0,0,40,0,0 +27,2,358636,5,10,1,10,1,0,0,2829,0,70,0,0 +47,2,155489,1,9,1,6,1,0,0,7688,0,55,0,1 +18,2,57413,5,10,2,4,3,0,0,0,0,15,0,0 +48,2,320421,1,9,1,5,1,0,0,0,0,50,0,0 +50,1,174752,1,9,2,7,0,0,0,0,0,40,0,0 +40,0,229364,3,14,2,3,0,0,1,0,0,45,0,0 +56,1,157486,12,6,2,5,3,0,0,0,0,40,0,0 +34,2,92682,1,9,0,0,0,0,1,4865,0,40,0,0 +56,3,101338,0,13,1,5,1,0,0,0,0,40,0,0 +18,2,132652,2,7,0,4,3,0,0,0,0,20,0,0 +21,2,34616,5,10,0,4,3,0,1,0,0,25,0,0 +40,2,218903,1,9,2,9,4,0,1,0,0,40,0,0 +27,4,204098,1,9,1,2,5,0,0,0,0,50,0,0 +52,1,64045,10,15,1,3,1,0,0,99999,0,45,0,1 +46,2,189763,1,9,2,5,0,0,1,0,0,30,0,0 +23,2,26248,1,9,0,0,3,0,1,0,0,40,0,0 +50,2,92079,5,10,1,9,1,0,0,0,0,45,0,1 +19,2,280071,5,10,0,8,5,0,0,0,0,50,0,0 +20,2,224059,1,9,0,4,0,0,0,0,0,40,0,0 +39,2,185520,5,10,2,1,0,0,1,8614,0,40,0,1 +24,2,265567,2,7,0,10,3,0,0,0,0,35,0,0 +72,2,106890,9,11,6,0,0,0,1,0,0,40,0,0 +42,0,39586,3,14,1,3,2,0,1,0,0,20,0,1 +51,2,209912,0,13,2,1,0,3,0,0,0,50,0,0 +39,2,144169,1,9,1,5,1,0,0,0,0,50,0,1 +40,4,50442,5,10,0,0,4,3,1,2977,0,35,0,0 +34,2,89644,5,10,1,5,1,0,0,0,0,55,0,1 +19,2,275889,2,7,0,2,3,0,0,0,0,40,4,0 +26,2,231638,1,9,0,1,3,0,1,0,0,40,0,0 +45,4,224474,0,13,2,3,4,0,1,4934,0,50,0,1 +28,2,355259,3,14,0,3,0,0,1,0,0,40,0,1 +30,3,68330,0,13,0,3,0,0,0,0,0,40,0,1 +32,2,185410,1,9,0,0,0,0,1,0,0,40,0,0 +19,2,87653,5,10,0,4,3,0,1,0,0,25,0,0 +21,2,286853,1,9,0,4,3,0,0,0,0,35,0,0 +54,2,96710,1,9,1,13,5,1,1,0,0,20,0,0 +62,2,160143,10,15,1,3,1,0,0,0,0,30,0,1 +25,2,186925,5,10,0,4,0,0,0,2597,0,48,0,0 +49,5,109705,5,10,2,1,4,0,1,0,0,32,0,0 +32,2,94235,1,9,1,10,1,0,0,0,0,40,0,1 +37,4,297449,1,9,1,11,1,0,0,0,0,40,0,1 +58,2,205896,1,9,2,5,5,0,1,0,0,40,0,0 +37,2,93717,5,10,1,0,2,0,1,7298,0,45,0,1 +41,2,194710,1,9,0,1,0,0,1,0,0,40,0,0 +38,2,236391,0,13,1,1,1,0,0,7688,0,40,0,1 +47,0,189123,1,9,1,4,1,0,0,0,0,40,0,0 +42,2,358677,1,9,2,4,4,1,0,0,0,35,0,0 +30,0,199539,1,9,1,0,1,0,0,0,1902,40,0,0 +43,2,128170,5,10,1,5,1,0,0,7688,0,40,0,1 +34,2,231238,1,9,1,8,1,1,0,0,0,40,0,0 +57,2,296152,5,10,2,1,5,0,1,594,0,10,0,0 +46,2,166003,2,7,1,8,1,0,0,0,0,40,0,0 +32,2,281437,5,10,1,6,1,0,0,0,0,55,0,0 +20,2,190231,4,5,0,8,3,0,1,0,0,11,35,0 +47,2,122026,9,11,2,5,0,0,0,0,0,50,0,0 +53,1,174102,7,4,1,1,1,0,0,4386,0,50,34,1 +43,2,125461,0,13,1,5,1,0,0,0,0,65,0,1 +80,1,184335,7,4,1,7,1,0,0,0,0,30,0,0 +24,2,211345,5,10,0,4,3,0,1,0,0,40,4,0 +43,4,147328,3,14,1,1,1,0,0,0,1977,60,0,1 +22,2,222993,1,9,0,2,3,0,0,0,0,40,0,0 +40,2,225978,5,10,4,1,0,1,0,0,0,40,0,0 +48,2,121124,1,9,1,1,1,0,0,0,0,50,0,1 +51,2,234057,1,9,1,10,1,0,0,0,0,45,0,1 +24,3,306515,1,9,0,0,0,0,1,0,0,40,0,0 +19,2,116562,1,9,0,4,3,0,1,0,0,40,0,0 +34,2,171159,5,10,2,0,4,0,1,0,0,30,0,0 +24,2,199011,1,9,0,10,3,0,0,0,0,40,0,0 +41,2,443508,0,13,1,6,1,0,0,0,0,48,8,1 +24,2,29810,1,9,2,5,0,0,1,0,0,38,0,0 +22,4,238831,5,10,0,11,3,0,0,0,0,40,0,0 +32,3,566117,5,10,2,0,4,0,1,0,0,40,0,0 +41,2,255044,0,13,2,1,0,0,1,0,0,55,0,0 +20,2,436253,5,10,0,4,3,0,0,0,0,35,0,0 +31,2,300687,1,9,0,4,0,1,0,0,0,40,0,0 +55,2,144071,0,13,1,9,1,0,0,0,0,18,0,1 +26,2,188767,0,13,0,5,3,0,0,0,0,40,0,0 +27,1,300777,1,9,2,6,0,0,0,0,0,70,0,0 +35,2,26987,1,9,4,0,0,0,1,0,0,40,0,0 +40,2,174395,1,9,2,4,0,0,0,0,0,60,34,0 +59,2,90290,5,10,1,3,1,0,0,0,0,34,0,0 +61,2,183735,5,10,1,5,1,0,0,0,0,45,0,1 +31,2,123273,1,9,0,5,3,1,1,0,0,40,0,0 +43,3,186916,3,14,2,11,0,0,0,0,0,60,0,1 +61,2,43554,11,3,0,2,0,1,0,0,2339,40,0,0 +54,2,178251,6,12,6,0,4,0,1,0,0,30,0,0 +30,2,255885,5,10,1,5,1,0,0,0,0,50,0,0 +20,2,64292,5,10,0,5,0,0,1,0,0,50,0,0 +27,0,194773,3,14,0,3,0,0,1,0,0,50,9,0 +44,5,133060,5,10,2,8,0,0,0,0,0,60,0,0 +64,2,258006,5,10,6,0,0,0,1,0,0,40,1,0 +55,2,92215,1,9,2,0,0,0,1,0,0,40,0,0 +34,2,33945,1,9,2,10,0,0,0,6849,0,55,0,0 +61,2,153048,1,9,6,5,0,0,1,0,0,35,0,0 +34,2,355571,1,9,2,8,4,1,1,0,0,40,0,0 +47,5,139268,10,15,1,3,1,0,0,0,1977,60,0,1 +26,2,34402,0,13,0,0,0,0,0,0,0,45,0,0 +35,2,25955,2,7,0,4,4,3,0,0,0,40,0,0 +36,2,209609,0,13,1,3,1,0,0,0,0,38,0,0 +47,2,168283,0,13,1,3,1,0,0,0,0,40,0,1 +17,2,295488,2,7,0,4,3,1,1,0,0,25,0,0 +35,2,190895,5,10,1,3,1,0,0,0,0,60,0,0 +33,2,164190,3,14,0,3,3,0,0,0,0,20,0,0 +25,2,216010,6,12,1,0,2,0,1,0,0,40,0,0 +18,2,387568,12,6,0,5,3,0,0,0,0,10,0,0 +47,0,188386,3,14,4,3,0,0,0,0,0,38,0,0 +44,2,174491,1,9,6,4,4,1,1,0,0,30,0,0 +41,2,31221,1,9,2,4,4,0,1,0,0,30,0,0 +30,2,272451,0,13,0,0,0,0,1,0,0,40,0,0 +53,1,152652,5,10,1,7,1,0,0,0,0,50,0,0 +53,2,104413,1,9,6,4,4,1,1,0,0,20,0,0 +40,2,105936,1,9,1,5,2,0,1,5013,0,20,0,0 +24,2,379066,5,10,0,0,0,0,0,0,2205,24,0,0 +27,2,214858,0,13,0,5,3,0,0,0,0,40,0,0 +50,2,237735,11,3,1,6,1,0,0,0,0,37,4,0 +36,2,158592,2,7,1,10,1,0,0,0,0,50,0,0 +41,2,237321,15,2,1,8,1,0,0,0,0,40,4,1 +41,2,23646,3,14,0,3,0,0,1,0,0,40,0,0 +31,2,169240,1,9,0,4,0,0,1,0,0,40,0,0 +32,3,454508,0,13,1,1,1,0,0,0,0,40,0,0 +22,2,130356,5,10,0,8,3,0,0,0,0,48,0,0 +22,2,427686,12,6,2,10,3,0,0,0,0,40,0,0 +18,4,36411,14,8,0,3,3,0,0,0,0,30,0,0 +39,2,548510,0,13,1,3,1,1,0,0,0,30,0,0 +38,2,187264,1,9,1,1,2,0,1,0,0,55,0,0 +35,0,140752,1,9,1,10,1,0,0,0,0,40,0,0 +23,2,325596,5,10,0,8,0,0,0,0,0,40,0,0 +54,1,175804,0,13,1,1,1,0,0,0,0,40,0,1 +36,2,107302,3,14,1,3,1,0,0,0,0,60,0,1 +63,4,41161,1,9,1,1,1,0,0,0,0,55,0,0 +39,2,401832,5,10,1,1,1,0,0,0,0,48,0,0 +57,1,353808,5,10,1,5,1,0,0,0,0,60,0,1 +58,5,349910,10,15,1,3,1,0,0,0,1977,50,0,1 +29,2,161478,0,13,0,0,0,2,1,0,0,40,28,0 +17,2,400225,2,7,0,5,3,0,1,0,0,20,0,0 +40,2,367533,1,9,2,10,0,0,0,0,0,40,0,0 +69,1,69306,5,10,1,4,2,0,1,0,0,15,0,0 +28,2,270366,12,6,2,5,0,0,1,0,0,40,0,0 +38,2,103751,4,5,1,10,1,0,0,0,0,40,0,0 +44,2,75227,10,15,0,3,0,0,0,14084,0,40,0,1 +45,4,132563,10,15,2,3,4,1,1,0,1726,40,0,0 +33,0,79580,0,13,1,0,1,1,0,0,0,40,0,0 +41,4,344624,5,10,1,4,1,0,0,0,1485,40,0,1 +37,5,186359,1,9,1,5,1,0,0,7688,0,60,0,1 +50,2,121685,5,10,1,5,1,0,0,0,0,45,0,1 +48,2,75104,0,13,1,3,1,0,0,0,0,50,0,0 +36,2,246449,5,10,1,1,1,0,0,0,0,60,0,1 +21,2,85088,5,10,0,4,3,0,1,0,0,37,0,0 +37,2,545483,6,12,1,7,1,0,0,0,0,40,0,0 +20,0,243986,5,10,0,3,3,0,1,0,0,20,0,0 +54,1,32778,1,9,1,5,2,0,1,0,0,30,0,0 +28,2,369114,1,9,4,5,5,0,1,0,0,40,0,0 +27,2,217200,5,10,0,3,0,0,0,0,0,40,0,0 +33,2,149220,9,11,0,4,4,1,1,0,0,40,0,0 +40,1,335549,10,15,0,3,0,0,0,0,2444,45,0,1 +47,2,102308,3,14,1,5,1,0,0,0,0,40,0,1 +44,2,367749,15,2,0,8,0,0,1,0,0,40,22,0 +25,2,98281,14,8,0,2,4,0,0,0,0,43,0,0 +35,2,115792,0,13,1,3,1,0,0,0,0,55,0,0 +29,2,277788,5,10,1,5,2,0,1,0,0,25,0,0 +30,2,103435,1,9,2,8,4,0,0,0,0,40,0,0 +30,2,37646,5,10,1,2,1,0,0,0,0,40,0,0 +56,1,385632,7,4,2,4,4,0,1,0,0,40,0,0 +25,1,210278,0,13,0,3,3,0,0,0,0,30,0,0 +28,2,335357,1,9,0,2,3,1,0,0,0,40,0,0 +43,1,272165,4,5,1,10,1,0,0,0,0,40,0,0 +47,4,148995,1,9,1,11,1,0,0,0,0,60,0,1 +46,1,113434,0,13,1,10,1,0,0,0,0,40,0,0 +41,0,132551,3,14,2,3,4,0,1,0,0,35,0,0 +38,3,115433,6,12,1,0,2,0,1,7688,0,33,0,1 +29,2,227890,1,9,0,11,5,1,0,0,0,40,0,0 +25,2,503012,11,3,0,10,0,0,0,0,0,40,4,0 +56,2,250873,2,7,1,10,1,0,0,0,0,45,0,0 +31,2,407930,7,4,1,2,1,0,0,0,0,40,0,0 +22,2,148187,2,7,0,4,5,0,0,0,0,40,0,0 +31,2,159322,1,9,0,2,5,0,0,0,0,40,0,0 +28,2,334368,5,10,4,0,0,0,1,0,0,40,0,0 +53,2,196328,0,13,1,1,1,1,0,0,0,40,0,0 +45,2,270842,3,14,2,1,0,0,1,0,0,50,0,1 +71,2,235079,13,1,6,10,4,1,0,0,0,10,0,0 +39,2,188391,1,9,1,10,1,0,0,7298,0,50,0,1 +19,3,30559,1,9,5,5,2,0,1,0,0,40,0,0 +34,4,255098,0,13,2,3,4,0,1,0,0,40,0,0 +36,2,248010,1,9,1,0,1,0,0,0,0,45,0,0 +40,2,174515,1,9,3,4,3,0,1,0,0,40,0,0 +90,2,171956,5,10,4,0,3,0,1,0,0,40,5,0 +56,2,193130,10,15,1,1,1,0,0,0,0,16,0,0 +21,2,108670,1,9,0,3,0,0,1,0,0,40,0,0 +48,2,186172,0,13,1,1,1,0,0,0,0,45,0,1 +45,2,348854,5,10,4,0,4,0,1,0,0,27,0,0 +46,2,271828,1,9,1,8,1,0,0,0,0,40,0,1 +64,2,148606,12,6,4,4,0,0,1,0,0,35,0,0 +29,4,123983,3,14,0,3,3,2,0,0,0,40,18,0 +22,2,24896,1,9,2,9,4,0,1,0,0,30,9,0 +47,2,573583,1,9,1,6,1,0,0,0,0,48,25,1 +67,5,106175,0,13,1,1,1,0,0,0,2392,75,0,1 +43,2,307767,1,9,1,2,1,0,0,0,0,40,0,0 +42,2,200574,5,10,1,5,1,0,0,0,0,40,0,0 +31,2,59083,5,10,1,4,1,0,0,0,1672,50,0,0 +53,2,358056,2,7,2,4,4,0,1,0,0,40,0,0 +81,2,114670,4,5,6,13,0,1,1,2062,0,5,0,0 +33,4,262042,1,9,2,0,3,0,1,0,1138,40,0,0 +17,2,206010,14,8,0,4,3,0,1,0,0,8,0,0 +28,2,159001,1,9,0,2,3,0,0,0,0,30,0,0 +24,2,155818,5,10,0,5,3,0,1,0,0,40,0,0 +40,2,96055,1,9,4,0,4,0,1,0,0,45,0,0 +30,4,131776,3,14,0,0,0,0,1,0,0,40,0,0 +24,2,228613,2,7,0,8,4,0,1,0,0,40,0,0 +26,2,198163,3,14,1,5,2,0,1,0,0,40,0,0 +38,2,37028,5,10,2,5,4,0,1,0,0,38,0,0 +30,2,177304,1,9,1,9,1,0,0,0,0,40,0,1 +33,2,144064,0,13,1,1,1,0,0,0,0,50,0,0 +40,2,146659,1,9,1,5,1,0,0,0,0,60,0,1 +63,1,26904,1,9,1,7,1,0,0,0,0,98,0,0 +23,2,238917,7,4,0,10,5,0,0,0,0,36,0,0 +56,2,170148,1,9,2,10,4,1,0,0,0,40,0,0 +42,1,27821,9,11,1,1,1,0,0,0,0,60,0,0 +40,2,220460,1,9,0,10,0,0,0,0,0,40,8,0 +49,2,101320,6,12,1,5,2,0,1,0,1902,40,0,1 +52,2,91048,1,9,2,8,3,1,1,0,0,35,0,0 +28,2,298696,0,13,0,0,3,0,1,0,0,40,0,0 +35,2,207202,12,6,1,6,1,0,0,0,0,70,0,0 +43,1,180599,1,9,0,10,0,0,0,0,0,35,0,0 +29,1,132686,10,15,0,3,3,0,0,0,0,50,25,1 +23,2,240063,0,13,0,8,3,0,0,0,0,25,0,0 +50,4,177705,5,10,1,0,1,0,0,0,1740,48,0,0 +34,2,511361,5,10,0,4,3,1,0,0,0,40,0,0 +19,2,89397,1,9,0,4,3,0,0,0,0,40,0,0 +47,2,239439,2,7,1,8,2,1,1,0,0,40,0,0 +37,1,36989,5,10,1,7,1,0,0,0,0,40,0,0 +25,2,76978,1,9,0,5,4,1,1,0,0,35,0,0 +75,2,200068,5,10,1,1,1,0,0,0,0,35,0,1 +24,2,454941,1,9,1,10,1,0,0,0,0,40,0,0 +28,0,107218,0,13,0,9,3,2,0,0,0,20,0,0 +17,4,182070,2,7,0,4,3,0,1,0,0,16,0,0 +31,2,176360,1,9,0,10,3,1,0,0,0,40,0,0 +31,2,452405,13,1,0,4,5,0,1,0,0,35,4,0 +45,2,84790,0,13,1,3,1,0,0,0,0,55,0,1 +31,2,186787,1,9,0,10,3,0,0,0,0,42,0,0 +27,2,169662,0,13,1,3,1,0,0,0,0,42,0,1 +48,2,125933,5,10,6,1,4,1,1,0,1669,38,0,0 +34,2,225548,0,13,1,11,1,1,0,0,0,30,0,0 +26,2,240842,1,9,0,8,4,1,1,0,0,40,0,0 +53,2,103931,5,10,1,3,1,0,0,0,0,40,0,0 +60,2,232618,0,13,1,1,1,0,0,0,0,35,0,1 +49,4,288548,3,14,4,3,4,0,1,0,0,50,0,0 +40,2,220609,5,10,2,1,0,0,1,0,0,40,0,0 +48,5,26145,12,6,1,7,1,0,0,0,0,80,0,0 +23,2,268525,0,13,0,3,0,0,0,0,0,50,0,0 +42,2,121264,9,11,1,3,1,0,0,0,0,40,0,1 +37,1,29814,1,9,0,7,3,0,0,0,0,85,0,0 +27,2,193701,1,9,0,10,3,0,1,0,0,45,0,0 +38,2,183279,5,10,1,1,1,0,0,0,0,44,0,1 +27,2,163942,1,9,0,10,0,0,0,0,0,35,38,0 +75,2,188612,1,9,6,0,0,0,1,0,0,40,0,0 +49,5,102771,0,13,1,5,1,0,0,0,0,52,0,1 +27,2,85625,5,10,0,5,0,0,0,0,0,20,0,0 +36,1,245090,0,13,0,7,0,0,0,0,0,50,4,0 +36,2,131239,0,13,1,3,1,0,0,3103,0,45,0,1 +35,2,182074,1,9,2,2,3,0,0,0,0,35,0,0 +36,2,187046,1,9,1,5,1,0,0,0,0,40,0,1 +53,2,90624,2,7,1,10,1,1,0,0,0,40,0,0 +27,2,37933,5,10,0,0,4,1,1,0,0,40,0,0 +34,2,182177,1,9,2,10,0,0,0,3325,0,35,0,0 +61,2,716416,5,10,1,5,1,0,0,0,0,44,0,1 +29,2,190562,1,9,2,8,4,0,0,0,0,56,0,0 +40,0,141583,5,10,2,0,4,1,1,0,0,35,0,0 +37,2,98941,3,14,0,1,0,0,0,0,0,40,0,1 +22,2,201729,4,5,0,2,5,0,0,0,0,30,0,0 +43,5,175485,5,10,1,1,1,0,0,0,0,40,0,0 +55,1,149168,1,9,1,7,1,0,0,0,0,30,0,0 +28,2,115971,5,10,2,0,4,0,1,0,0,40,0,0 +23,2,161708,0,13,0,4,3,0,1,0,0,30,0,0 +64,4,244903,2,7,1,10,1,1,0,0,0,40,0,1 +46,2,155664,5,10,0,2,0,0,0,0,0,40,0,0 +29,2,112754,5,10,0,10,3,0,0,0,0,40,0,0 +44,2,178385,3,14,1,1,1,2,0,0,0,48,3,0 +20,2,44064,5,10,0,3,3,0,0,0,0,25,0,0 +62,1,120939,5,10,2,5,0,0,0,0,0,40,0,0 +49,2,165134,9,11,0,1,4,0,1,0,0,35,13,0 +29,2,100405,12,6,1,7,2,3,1,0,0,40,0,0 +35,1,361888,0,13,1,5,1,0,0,0,0,60,28,0 +39,4,167864,2,7,1,6,1,0,0,0,0,30,0,0 +39,2,202950,0,13,0,1,0,0,0,0,0,45,0,0 +37,2,218188,1,9,2,8,5,0,1,0,0,32,0,0 +38,2,234962,1,9,1,2,1,0,0,2829,0,30,4,0 +31,2,259931,7,4,1,8,1,0,0,0,0,40,0,0 +55,2,189528,7,4,1,10,1,0,0,0,0,60,0,0 +38,2,34996,5,10,4,4,4,0,1,0,0,40,0,0 +33,2,112584,5,10,2,5,0,0,1,0,0,25,0,0 +25,2,117589,6,12,0,0,0,0,1,0,0,40,0,0 +37,2,267086,9,11,2,9,4,0,1,0,0,52,0,0 +49,2,44434,5,10,2,9,5,0,0,0,0,35,0,0 +26,2,96130,1,9,0,10,5,0,0,0,0,40,0,0 +35,2,181382,1,9,1,10,1,0,0,0,0,43,0,0 +44,5,168845,1,9,1,5,2,0,1,0,0,60,0,0 +37,2,271767,3,14,4,1,0,0,0,0,0,45,0,1 +42,2,194636,0,13,1,3,1,0,0,0,0,45,0,1 +64,0,194894,8,16,0,3,0,0,1,4787,0,40,0,1 +28,2,132686,1,9,1,2,1,0,0,0,0,40,0,1 +35,1,185848,1,9,0,1,0,0,0,4650,0,50,0,0 +40,0,184378,0,13,1,0,1,0,0,0,0,40,0,0 +55,3,270859,0,13,1,3,1,0,0,0,0,40,0,1 +21,2,231866,1,9,0,7,3,0,0,0,0,65,0,0 +49,2,36032,5,10,0,1,0,1,1,0,0,40,0,0 +51,0,172962,8,16,1,3,1,0,0,0,0,40,0,1 +57,2,98350,10,15,1,10,1,2,0,0,1902,40,11,1 +51,2,24185,0,13,1,10,1,0,0,0,0,40,0,1 +24,2,85088,1,9,0,5,3,0,1,0,1762,32,0,0 +45,1,94962,1,9,1,10,1,0,0,0,0,40,7,0 +28,2,480861,1,9,1,8,1,0,0,0,0,45,0,0 +42,5,187702,10,15,1,3,1,0,0,0,2415,60,0,1 +22,2,52262,5,10,0,4,0,0,0,0,0,40,0,0 +28,0,52636,3,14,1,1,1,0,0,0,0,40,0,0 +60,2,175273,1,9,6,8,4,0,1,0,0,40,0,0 +31,2,327825,1,9,4,8,4,0,1,0,2238,40,0,0 +47,2,125892,5,10,1,10,1,0,0,0,0,75,0,1 +30,2,398827,1,9,5,0,1,0,0,0,0,60,0,0 +61,2,208919,3,14,1,5,1,0,0,0,0,60,0,1 +71,4,365996,0,13,6,3,4,0,1,0,0,6,0,0 +42,2,307638,1,9,2,0,3,0,1,0,0,40,0,0 +44,4,33068,14,8,1,10,1,0,0,0,0,55,0,0 +46,1,254291,5,10,1,5,1,0,0,0,0,60,0,1 +50,4,125417,10,15,0,1,0,1,1,0,0,52,0,1 +27,0,28848,0,13,0,3,0,0,0,0,0,9,0,0 +21,2,194723,5,10,0,0,5,0,1,0,0,40,4,0 +25,2,195118,1,9,0,2,5,0,0,0,0,35,0,0 +61,2,123273,11,3,2,6,0,0,0,0,1876,56,0,0 +54,2,220115,5,10,2,0,0,0,0,0,0,30,0,0 +31,2,265706,0,13,0,5,0,0,0,0,0,40,0,0 +53,1,279129,5,10,1,7,1,0,0,0,0,30,0,0 +39,5,122742,6,12,1,1,1,0,0,15024,0,55,0,1 +57,5,172654,10,15,1,6,1,0,0,15024,0,50,0,1 +48,2,119199,0,13,2,5,4,0,1,0,0,44,0,0 +30,2,107793,5,10,1,6,1,0,0,0,0,56,0,1 +35,2,237943,1,9,1,2,1,0,0,0,0,60,0,0 +42,1,64632,1,9,1,1,1,0,0,0,0,50,0,0 +34,1,96245,1,9,1,8,1,0,0,0,0,40,0,0 +59,2,361494,1,9,1,5,1,0,0,0,0,40,0,1 +69,4,122850,12,6,1,1,1,0,0,0,0,20,0,0 +29,2,173652,5,10,0,0,3,0,1,0,0,40,0,0 +40,2,164663,1,9,1,6,1,0,0,0,0,40,0,0 +21,2,98678,5,10,0,4,3,0,0,0,0,15,0,0 +40,2,245529,6,12,2,3,0,0,1,0,0,40,0,0 +43,2,55294,5,10,1,10,1,0,0,0,0,40,0,0 +36,2,140583,1,9,2,2,0,0,0,0,0,40,0,0 +41,2,79797,1,9,3,3,0,2,0,0,0,40,28,1 +20,2,283499,5,10,0,6,3,0,0,0,0,30,0,0 +41,4,51111,0,13,6,0,0,0,1,0,0,40,0,0 +34,2,232475,5,10,2,1,0,0,0,0,0,50,0,0 +48,2,176140,2,7,2,4,4,1,1,0,0,40,0,0 +27,2,301654,1,9,0,1,3,0,1,0,0,40,0,0 +35,2,376455,5,10,1,1,1,0,0,15024,0,60,0,1 +27,2,229803,1,9,0,10,3,1,0,0,0,40,0,0 +20,2,337639,5,10,0,5,3,0,0,0,0,40,0,0 +18,2,130849,5,10,0,5,3,0,1,0,0,15,0,0 +32,2,296282,0,13,1,5,1,0,0,0,0,40,0,0 +38,2,266645,3,14,1,1,1,0,0,0,0,60,0,1 +23,0,110128,5,10,0,4,3,0,0,0,0,40,0,0 +28,2,90196,0,13,1,1,1,0,0,0,0,45,0,1 +40,0,40024,10,15,1,3,1,0,0,0,0,38,0,1 +35,2,144322,1,9,2,8,4,0,1,0,0,40,0,0 +74,5,162340,5,10,6,1,4,0,0,0,0,40,0,0 +28,2,169069,1,9,0,10,3,0,0,0,0,40,0,0 +23,2,113601,5,10,0,2,3,0,0,0,0,30,0,0 +20,1,157145,5,10,0,7,3,0,0,0,2258,10,0,0 +44,2,111275,1,9,2,8,4,1,1,0,0,56,0,0 +46,4,102076,1,9,2,0,4,0,1,0,0,25,0,0 +51,1,145409,0,13,1,5,1,0,0,15024,0,50,0,1 +40,2,190122,5,10,4,0,0,0,1,0,0,40,0,0 +48,2,331482,10,15,1,9,1,0,0,0,1977,40,0,1 +60,1,170114,4,5,1,7,1,0,0,0,1672,84,0,0 +48,5,193188,0,13,1,1,1,0,0,0,0,40,0,1 +46,4,267588,0,13,1,3,2,0,1,0,0,70,0,0 +48,5,200471,0,13,1,1,1,0,0,0,0,40,0,1 +24,4,322658,0,13,0,3,0,0,1,0,0,40,0,0 +45,0,263982,5,10,2,3,4,0,1,0,0,40,0,0 +18,2,266287,14,8,0,5,3,0,1,0,0,35,0,0 +39,2,278187,1,9,1,8,1,0,0,0,0,40,0,0 +65,5,81413,1,9,1,7,1,0,0,0,2352,65,0,0 +22,2,221745,5,10,2,8,3,0,1,0,0,40,0,0 +20,2,140764,5,10,0,4,3,0,1,0,0,20,0,0 +28,2,206351,5,10,1,5,1,0,0,0,0,40,0,0 +46,2,176814,10,15,1,3,1,0,0,99999,0,50,0,1 +42,4,245307,0,13,1,1,1,0,0,0,1977,48,0,1 +28,2,119545,5,10,1,1,3,0,0,7688,0,50,0,1 +18,2,179203,5,10,0,5,3,0,1,0,0,20,0,0 +24,3,44075,0,13,0,3,0,2,0,0,0,40,0,0 +45,2,178319,8,16,1,3,1,0,0,0,0,56,0,1 +24,2,219754,1,9,0,0,3,0,0,0,0,40,0,0 +44,2,198316,0,13,1,1,1,0,0,15024,0,50,0,1 +20,2,168165,5,10,0,4,3,0,0,0,0,30,0,0 +35,2,356838,5,10,1,9,1,0,0,2829,0,55,12,0 +52,5,210736,0,13,1,5,1,0,0,0,0,60,0,0 +25,2,173212,6,12,0,7,0,0,0,2354,0,45,0,0 +19,2,130431,11,3,0,7,0,0,0,0,0,36,4,0 +54,2,197481,5,10,2,0,4,0,1,0,0,40,0,0 +21,2,155066,5,10,0,10,3,0,0,0,0,40,0,0 +26,2,31290,1,9,1,0,2,0,1,0,0,40,0,1 +42,2,54102,9,11,2,0,4,0,1,0,0,40,0,0 +19,2,181546,5,10,0,0,3,0,1,0,0,40,0,0 +55,2,153484,3,14,1,1,1,0,0,0,1977,50,0,1 +44,0,351228,1,9,1,0,1,0,0,0,0,40,0,0 +25,2,131976,0,13,0,1,3,0,0,0,0,55,0,0 +26,2,200639,5,10,1,8,1,0,0,0,0,40,0,0 +64,3,267546,6,12,4,3,0,0,1,0,0,40,0,1 +41,2,179875,2,7,2,4,4,4,1,0,0,40,0,0 +43,2,300528,5,10,1,6,1,0,0,0,0,40,0,0 +45,2,67716,1,9,0,10,3,0,0,10520,0,48,0,1 +48,3,326048,0,13,1,3,1,0,0,0,0,44,0,1 +60,2,191188,1,9,1,6,1,0,0,0,0,40,0,0 +45,1,32172,5,10,0,7,0,0,0,0,0,50,0,0 +51,2,252903,12,6,1,5,1,0,0,0,1977,40,0,1 +37,3,334314,1,9,2,0,4,0,1,0,0,40,0,0 +22,2,83704,5,10,0,0,3,0,0,0,0,30,0,0 +44,2,160574,1,9,1,10,1,0,0,0,0,65,0,1 +27,2,203776,1,9,1,10,1,0,0,0,0,50,0,0 +47,4,328610,1,9,1,10,1,0,0,0,0,40,0,0 +32,2,295589,3,14,1,1,1,1,0,0,1977,40,0,1 +40,2,174373,0,13,1,1,1,0,0,0,0,50,0,1 +41,2,247752,1,9,1,5,1,0,0,0,0,40,0,0 +26,2,139992,0,13,0,3,0,0,1,0,0,40,0,0 +47,2,95680,5,10,1,1,1,2,0,0,0,40,0,0 +55,5,189933,1,9,1,1,1,0,0,0,0,45,0,0 +38,2,498785,1,9,1,2,1,0,0,0,0,40,0,0 +24,0,177526,0,13,0,3,0,0,0,0,0,15,0,0 +64,1,150121,8,16,1,1,1,0,0,0,0,25,0,1 +56,3,130454,0,13,1,3,1,0,0,0,0,40,0,1 +41,2,119079,1,9,1,5,1,0,0,0,0,49,0,1 +33,2,220939,1,9,1,5,1,0,0,7298,0,45,0,1 +33,2,94235,10,15,0,3,3,0,0,0,0,42,0,1 +21,2,305874,5,10,1,4,1,0,0,0,0,40,0,0 +59,4,62020,1,9,6,10,0,1,0,0,0,40,0,0 +58,2,235624,9,11,1,1,1,0,0,0,0,40,9,1 +43,4,247514,3,14,2,3,4,0,0,0,0,40,0,0 +21,2,275726,1,9,0,10,3,1,0,0,0,40,0,0 +45,2,72896,1,9,0,8,0,0,0,0,0,40,0,0 +53,4,110510,1,9,1,1,2,0,1,0,0,50,0,1 +27,2,200641,12,6,1,1,2,0,1,0,0,40,4,0 +38,2,242720,3,14,1,3,1,0,0,0,0,35,0,1 +31,2,111567,0,13,1,1,1,0,0,0,0,70,0,1 +41,2,179533,1,9,1,6,1,0,0,0,0,35,0,0 +22,0,334693,5,10,0,0,3,0,1,0,0,40,0,0 +43,1,198096,3,14,1,5,1,0,0,0,0,60,0,0 +41,0,355756,5,10,0,3,0,0,0,0,0,40,0,0 +27,2,19395,5,10,1,2,2,0,1,0,0,35,0,0 +41,4,242586,5,10,1,1,1,0,0,0,0,40,0,0 +36,2,208358,10,15,2,3,0,0,0,99999,0,45,0,1 +49,2,160647,0,13,1,0,2,0,1,0,0,40,0,1 +20,2,227943,1,9,0,2,3,0,0,0,0,45,0,0 +58,1,197665,1,9,3,4,4,0,1,0,0,45,0,0 +35,1,216129,14,8,0,4,0,1,1,0,0,40,33,0 +30,4,326104,1,9,1,11,1,0,0,0,0,40,0,1 +21,2,57211,1,9,0,10,3,0,0,0,0,40,0,0 +29,2,100219,6,12,0,8,4,0,0,0,0,45,0,0 +40,2,291192,1,9,6,5,0,0,1,0,0,40,0,0 +54,0,93415,0,13,0,3,4,2,1,0,0,40,0,1 +35,2,191502,0,13,1,5,1,0,0,0,0,60,0,1 +35,2,261382,0,13,1,5,1,0,0,0,0,50,0,0 +59,2,374924,1,9,4,5,4,1,1,0,0,40,0,0 +43,5,320984,5,10,1,8,1,0,0,0,0,50,0,0 +39,2,338320,12,6,1,10,1,0,0,0,0,60,0,1 +51,2,135190,7,4,4,8,0,1,1,0,0,30,0,0 +71,2,157909,5,10,0,4,0,0,1,2964,0,60,0,0 +33,2,637222,14,8,2,8,4,1,1,0,0,40,0,0 +28,2,430084,1,9,2,4,3,1,0,0,0,35,0,0 +30,2,125279,1,9,3,5,4,0,0,0,0,40,0,0 +20,2,221955,11,3,3,7,5,0,0,0,0,40,4,0 +51,5,180195,1,9,1,5,1,0,0,0,0,50,0,0 +39,2,208778,1,9,1,8,2,0,1,0,0,40,0,1 +62,2,81534,5,10,1,5,1,2,0,0,0,40,0,1 +28,2,142264,4,5,0,8,0,0,0,0,0,50,21,0 +23,2,128604,1,9,0,5,3,2,0,0,0,48,27,0 +39,2,277886,0,13,1,5,2,0,1,0,0,30,0,0 +50,5,100029,0,13,6,5,4,0,0,0,0,65,0,1 +31,2,169269,7,4,0,10,4,0,0,0,0,40,0,0 +45,4,160472,0,13,1,1,1,0,0,0,1977,50,0,1 +47,2,297884,12,6,6,8,0,0,0,0,0,40,0,0 +59,2,99131,1,9,6,3,0,0,1,0,0,18,0,0 +32,2,44392,6,12,1,2,1,0,0,0,0,40,0,0 +49,2,199029,0,13,1,5,1,0,0,0,2415,55,0,1 +74,3,181508,1,9,6,4,0,0,0,0,0,17,0,0 +22,2,190625,5,10,0,0,3,0,0,0,0,35,0,0 +32,2,194740,5,10,1,10,1,0,0,0,0,55,34,0 +34,2,27380,0,13,1,7,1,0,0,0,0,50,0,1 +59,2,160631,0,13,1,10,1,0,0,0,0,60,0,1 +36,2,224531,0,13,1,5,1,0,0,0,0,50,0,1 +59,2,283005,2,7,2,0,4,0,1,0,0,40,0,0 +47,5,101926,0,13,2,1,0,0,0,0,0,70,0,1 +53,4,135102,1,9,1,4,1,0,0,0,2002,45,0,0 +25,1,113436,5,10,0,10,4,0,0,0,0,35,0,0 +44,2,248973,0,13,2,0,0,1,0,0,0,65,0,0 +57,1,225334,10,15,1,5,2,0,1,15024,0,35,0,1 +42,1,157562,0,13,1,7,1,0,0,0,1902,80,0,1 +58,4,310085,12,6,1,6,1,0,0,0,0,40,0,0 +39,2,129597,0,13,1,5,1,0,0,3464,0,40,0,0 +45,2,204205,7,4,2,8,0,0,0,0,0,48,0,0 +47,2,169324,0,13,1,1,2,1,1,0,0,35,0,1 +52,2,141301,1,9,2,8,0,0,1,0,0,40,0,0 +34,2,235124,1,9,0,4,4,1,1,0,0,35,0,0 +36,1,367020,7,4,1,10,1,0,0,0,0,35,0,0 +41,2,149102,1,9,3,10,0,0,0,0,0,40,12,0 +30,2,423770,5,10,0,3,3,0,0,0,0,40,4,0 +44,2,211759,0,13,1,1,1,4,0,0,0,40,5,0 +34,2,56883,5,10,0,4,4,0,1,0,0,40,0,0 +41,2,223062,5,10,4,4,0,1,0,0,0,40,0,0 +29,2,406662,1,9,0,2,0,0,0,0,0,40,0,0 +25,2,206600,4,5,0,8,5,0,0,0,0,48,4,0 +42,4,147510,0,13,4,3,4,0,0,0,0,40,0,0 +48,2,235646,5,10,1,5,1,0,0,3103,0,40,0,1 +26,2,187577,9,11,0,5,0,0,0,0,0,55,0,0 +46,5,278322,0,13,1,5,1,0,0,0,0,45,0,0 +38,2,278924,0,13,1,1,1,0,0,0,1887,50,0,1 +49,0,203039,2,7,1,0,1,0,0,0,0,40,0,0 +23,2,145651,5,10,0,5,3,1,1,0,0,20,0,0 +46,4,144531,0,13,0,3,0,0,1,0,0,40,0,1 +30,2,91145,1,9,0,2,4,0,0,0,0,55,0,0 +49,1,211762,1,9,1,10,1,0,0,0,0,40,0,1 +31,2,207537,1,9,2,10,3,0,0,0,1669,50,0,0 +19,2,417657,1,9,0,2,3,0,0,0,0,50,0,0 +45,2,189890,6,12,2,3,4,0,1,5455,0,38,0,0 +34,2,223212,0,13,1,3,1,0,0,0,1848,40,30,1 +26,2,108658,1,9,0,10,0,0,0,0,0,40,0,0 +38,1,190023,1,9,1,6,1,0,0,0,0,40,0,1 +31,2,222130,5,10,0,0,0,0,1,0,0,43,0,0 +36,5,164866,6,12,4,1,0,0,0,0,0,50,0,0 +31,2,170983,0,13,1,1,1,0,0,0,0,60,0,1 +30,2,186269,0,13,1,9,1,0,0,0,0,40,0,0 +37,2,286026,1,9,1,3,1,0,0,0,0,40,0,1 +30,2,403433,0,13,0,3,0,1,0,0,0,50,0,1 +73,2,123160,12,6,6,4,0,0,1,0,0,10,0,0 +38,3,99527,3,14,1,1,1,0,0,0,0,40,0,1 +30,2,123178,12,6,0,10,0,0,0,0,0,50,0,0 +33,2,231043,1,9,1,10,1,0,0,0,0,50,0,1 +52,4,317733,0,13,1,3,1,0,0,7688,0,40,0,1 +58,2,241056,5,10,2,0,4,0,1,0,0,46,0,0 +34,4,220066,3,14,0,3,0,0,1,0,0,50,0,0 +35,2,180342,1,9,1,10,1,0,0,0,0,40,0,0 +59,3,31840,1,9,1,10,1,0,0,0,0,40,0,1 +45,2,183168,0,13,2,1,4,0,1,0,0,40,0,0 +27,2,386036,5,10,0,6,0,0,0,0,0,48,0,0 +31,4,446358,8,16,0,3,0,0,0,0,0,50,4,1 +45,2,28035,5,10,0,7,5,0,0,0,0,50,0,0 +40,2,282155,1,9,4,4,5,0,1,0,0,25,0,0 +27,2,192384,10,15,1,0,1,0,0,0,0,40,0,0 +19,2,383637,1,9,0,4,3,0,0,0,0,20,0,0 +29,2,457402,11,3,0,4,0,0,0,0,0,25,4,0 +34,5,80249,5,10,1,7,1,0,0,0,0,72,0,0 +32,0,159537,6,12,1,10,1,0,0,0,0,40,0,0 +49,2,240859,2,7,1,10,1,0,0,0,0,40,1,0 +33,2,83446,2,7,2,1,4,0,1,0,0,40,0,1 +62,2,185503,0,13,1,3,1,0,0,0,0,50,0,1 +39,1,68781,1,9,1,1,1,0,0,0,0,40,0,0 +43,2,220589,1,9,2,1,4,0,1,0,0,40,0,0 +22,2,51136,5,10,0,9,0,0,1,0,0,60,0,0 +24,2,54560,1,9,1,6,1,0,0,0,0,45,0,0 +25,2,201413,5,10,0,4,4,1,1,0,0,40,0,0 +19,2,40425,5,10,0,5,0,0,1,0,0,28,0,0 +31,2,189461,6,12,2,0,4,0,1,0,0,41,0,0 +53,2,200576,2,7,2,10,5,0,1,0,0,40,0,0 +61,2,92691,1,9,1,0,1,0,0,0,0,3,0,0 +47,2,664821,0,13,1,4,1,0,0,0,0,40,22,0 +37,2,175130,1,9,2,0,4,0,1,0,0,45,0,0 +50,1,391016,0,13,2,1,0,0,0,0,0,30,0,0 +27,2,249315,5,10,0,5,0,0,0,0,0,44,0,0 +58,2,111169,1,9,2,0,0,0,1,0,0,40,0,0 +43,2,334946,1,9,1,2,1,1,0,0,0,40,0,0 +39,2,352248,6,12,1,0,1,0,0,0,0,40,0,0 +36,2,173804,5,10,0,5,0,0,1,0,0,35,0,0 +56,2,155449,0,13,1,3,1,0,0,0,0,50,0,0 +26,2,73689,1,9,1,7,1,0,0,0,0,55,0,0 +23,2,227594,0,13,0,3,3,0,1,0,0,38,0,0 +47,2,161676,2,7,0,6,0,1,0,0,0,40,0,0 +68,2,75913,14,8,6,5,0,0,1,0,0,30,0,0 +47,4,242552,5,10,0,11,0,1,0,0,0,40,0,0 +45,3,352094,5,10,1,9,1,0,0,7688,0,40,24,1 +26,2,159732,5,10,1,1,1,0,0,0,0,60,0,0 +20,2,131230,1,9,0,8,3,0,0,0,1590,40,0,0 +46,2,180695,5,10,0,0,3,0,1,0,0,40,0,0 +37,2,189922,6,12,1,9,1,0,0,0,0,50,0,1 +37,2,409189,5,10,1,10,1,0,0,0,0,45,0,0 +43,2,111252,5,10,1,6,1,0,0,0,0,42,0,0 +59,2,294395,3,14,6,3,0,0,1,0,0,40,0,0 +39,2,172718,1,9,2,0,4,0,1,0,0,40,0,0 +32,2,43403,5,10,2,7,0,0,1,0,1590,54,0,0 +63,2,111963,5,10,1,3,1,0,0,0,0,16,0,0 +45,2,247869,0,13,1,3,1,0,0,0,0,60,0,1 +59,2,114032,0,13,2,0,4,0,1,0,0,40,0,0 +26,2,179633,1,9,0,9,5,0,0,0,0,40,0,0 +34,2,19847,1,9,2,0,4,0,1,0,0,40,0,0 +41,2,231689,1,9,1,10,1,0,0,0,0,40,0,1 +26,2,209942,1,9,0,2,3,1,0,0,0,40,0,0 +53,2,197492,1,9,2,8,0,0,1,0,0,40,0,0 +33,2,262439,1,9,1,0,2,0,1,0,0,35,0,1 +46,2,283037,0,13,1,1,1,0,0,0,0,50,0,1 +31,2,83446,1,9,6,10,4,0,1,0,0,40,0,0 +24,2,215443,1,9,4,4,0,0,0,0,0,40,0,0 +57,4,268252,1,9,2,0,4,0,1,0,0,62,0,0 +40,2,181015,1,9,4,4,4,0,1,0,0,47,0,0 +41,5,139916,9,11,1,5,1,4,0,0,2179,84,4,0 +20,2,195770,5,10,0,0,3,0,0,0,0,26,0,0 +45,2,125194,2,7,0,8,0,1,1,0,0,40,0,0 +27,2,58654,9,11,4,0,4,0,1,0,0,40,0,0 +36,2,252327,11,3,3,10,5,0,0,0,0,40,4,0 +30,2,116508,1,9,1,10,1,0,0,0,0,40,9,0 +36,2,166988,0,13,1,3,2,0,1,0,0,40,0,1 +25,2,374163,1,9,3,7,0,4,0,0,0,40,4,0 +31,2,196788,1,9,1,0,2,0,1,0,0,40,0,0 +49,2,186172,1,9,1,10,1,0,0,7688,0,45,0,1 +26,2,245628,2,7,0,2,4,0,0,0,0,20,0,0 +25,2,159732,0,13,0,3,0,0,0,0,0,40,0,0 +29,2,129856,9,11,0,0,3,0,1,0,0,40,0,0 +24,2,182812,5,10,0,0,3,0,1,3325,0,52,21,0 +41,2,314322,1,9,1,0,1,0,0,0,0,40,0,1 +35,2,102976,3,14,0,1,0,0,0,0,0,40,0,1 +57,5,42959,0,13,1,5,2,0,1,0,0,40,0,1 +21,2,256356,2,7,0,13,5,0,1,0,0,40,4,0 +29,2,136277,12,6,0,4,3,1,1,0,0,32,0,0 +36,2,284616,5,10,1,1,1,0,0,0,0,40,0,0 +20,2,185554,5,10,0,0,3,0,1,0,0,25,0,0 +51,2,138847,0,13,1,1,1,0,0,0,0,40,0,1 +39,2,33487,2,7,1,8,1,0,0,0,0,40,0,0 +36,2,84306,0,13,1,1,1,0,0,5013,0,50,0,0 +40,1,223881,10,15,1,3,1,0,0,99999,0,70,0,1 +61,2,149653,1,9,1,1,1,0,0,0,0,50,0,0 +38,2,348739,10,15,1,3,1,0,0,0,0,60,0,0 +21,2,34506,1,9,4,4,3,0,1,0,0,35,0,0 +40,2,346964,1,9,2,9,4,0,1,0,0,40,0,0 +46,2,192208,12,6,1,10,1,0,0,0,0,45,0,0 +21,2,305874,5,10,1,10,1,0,0,0,0,54,0,0 +35,1,462890,12,6,1,6,1,1,0,0,0,50,0,0 +39,2,89508,0,13,1,5,1,0,0,0,0,40,0,0 +38,1,200153,1,9,1,10,1,0,0,0,0,60,0,0 +30,2,179446,1,9,4,0,4,0,1,0,0,40,0,0 +28,2,208965,4,5,0,8,4,4,0,0,0,40,4,0 +32,2,40142,0,13,1,1,1,0,0,0,0,40,0,1 +46,1,57452,9,11,1,10,1,0,0,0,0,40,0,1 +40,2,327573,9,11,1,10,1,0,0,0,0,40,0,0 +47,2,151267,1,9,1,8,2,1,1,15024,0,40,0,1 +44,2,265266,12,6,1,6,1,0,0,0,0,40,0,0 +38,2,203836,1,9,1,5,1,0,0,3464,0,40,13,0 +46,1,28281,0,13,1,7,1,0,0,0,0,40,0,1 +51,2,293196,8,16,1,3,1,0,0,15024,0,60,10,1 +45,2,214627,8,16,6,3,4,0,0,15020,0,40,10,1 +20,2,368852,5,10,0,4,3,0,1,0,0,20,0,0 +44,2,353396,0,13,1,3,1,0,0,0,0,45,0,0 +33,2,161745,9,11,1,7,1,0,0,0,0,45,0,0 +18,2,97963,1,9,0,4,3,0,1,0,0,30,0,0 +61,5,156542,10,15,4,3,0,0,0,0,0,40,0,1 +50,0,198103,0,13,0,1,0,0,1,0,0,40,0,0 +47,3,55377,1,9,0,8,3,1,0,0,0,40,0,0 +34,2,173730,0,13,1,1,1,0,0,0,0,50,0,1 +53,2,374588,1,9,1,6,1,1,0,0,0,60,0,0 +39,1,174330,5,10,1,10,1,0,0,0,0,40,0,0 +58,2,78141,1,9,1,10,1,0,0,0,0,40,0,1 +26,2,31350,2,7,0,7,0,0,0,0,0,50,0,0 +41,2,243607,11,3,1,0,1,0,0,0,0,40,4,0 +47,4,134671,5,10,1,1,1,0,0,0,0,40,0,0 +31,2,197023,9,11,1,8,1,3,0,0,0,40,0,0 +52,2,117674,5,10,1,1,1,0,0,0,0,40,0,1 +29,2,169815,6,12,1,5,1,0,0,0,0,50,0,1 +43,2,598606,4,5,4,2,4,1,1,0,0,50,0,0 +42,3,122861,3,14,1,1,1,0,0,0,0,40,0,1 +35,2,166235,5,10,0,8,0,1,1,0,0,30,0,0 +41,2,187821,1,9,1,8,1,0,0,2885,0,40,0,0 +34,2,340940,0,13,1,5,1,0,0,7298,0,60,0,1 +52,1,194791,5,10,1,10,1,0,0,0,0,40,0,0 +61,2,231323,5,10,1,10,1,0,0,0,0,40,0,0 +39,4,305597,1,9,4,1,4,0,0,0,0,40,0,0 +19,2,25429,5,10,0,5,0,0,1,0,0,25,0,0 +46,0,192779,0,13,1,1,1,0,0,7688,0,40,0,1 +39,2,346478,5,10,0,1,0,0,0,0,0,45,0,0 +22,2,341368,5,10,0,4,0,0,0,0,0,50,0,0 +30,0,295612,1,9,4,0,0,0,1,0,0,40,0,0 +40,2,168936,9,11,2,4,0,0,1,0,0,32,0,0 +43,2,218558,0,13,3,3,0,0,0,3325,0,40,0,0 +37,2,336598,11,3,1,7,1,0,0,0,0,36,4,0 +23,2,308205,6,12,0,4,3,0,0,0,0,20,0,0 +39,4,357173,6,12,2,3,0,0,0,0,0,59,0,0 +54,2,457237,3,14,1,5,1,0,0,0,0,40,0,0 +46,5,284799,5,10,1,5,1,0,0,0,0,60,0,0 +20,2,179423,5,10,0,6,3,0,1,0,0,40,0,0 +50,1,363405,0,13,1,9,2,0,1,0,0,50,0,1 +17,2,139183,12,6,0,5,3,0,1,0,0,15,0,0 +36,2,203482,1,9,1,8,1,0,0,0,0,40,0,0 +37,2,112554,1,9,1,5,1,0,0,0,0,45,0,0 +53,2,99476,1,9,2,4,0,0,1,0,0,38,0,0 +50,2,93690,1,9,1,6,1,0,0,0,0,40,0,1 +38,2,220585,1,9,1,10,1,0,0,0,0,40,0,0 +63,1,194638,1,9,1,10,1,0,0,0,0,32,0,0 +53,2,154785,1,9,1,10,1,0,0,0,0,50,0,1 +23,5,214542,5,10,0,3,0,0,0,0,0,50,0,0 +20,2,161922,1,9,0,2,0,0,0,0,0,43,0,0 +46,2,207940,5,10,1,10,1,1,0,0,0,40,0,1 +28,2,259351,12,6,0,4,5,3,0,0,0,40,4,0 +59,2,208395,3,14,2,3,0,0,0,0,0,50,0,0 +41,2,116391,0,13,1,1,1,0,0,0,0,40,0,1 +33,2,239781,13,1,1,7,1,0,0,0,0,40,4,0 +56,2,174351,14,8,1,10,1,0,0,0,0,40,25,0 +50,1,44368,1,9,1,5,1,0,0,15024,0,55,22,1 +31,4,188798,0,13,0,1,0,0,1,0,0,50,0,0 +41,2,50122,9,11,2,5,3,0,0,0,0,50,0,0 +38,2,111398,0,13,1,3,2,0,1,7688,0,40,0,1 +25,0,152035,6,12,0,0,3,0,1,0,0,40,0,0 +49,4,249289,0,13,2,3,4,1,1,0,0,40,0,0 +39,2,257726,5,10,0,8,3,0,0,0,0,40,0,0 +21,2,151158,5,10,0,3,3,0,1,0,0,25,0,0 +35,2,465326,0,13,1,5,1,0,0,0,0,40,0,0 +38,2,364782,1,9,1,10,1,0,0,0,0,40,0,1 +31,2,329301,1,9,2,6,0,0,0,0,0,55,0,0 +17,5,254859,2,7,0,3,3,0,0,0,0,20,0,0 +31,2,203488,0,13,1,0,1,0,0,7298,0,50,0,1 +25,4,222800,0,13,0,3,0,0,0,0,0,40,0,0 +39,2,96452,3,14,1,1,1,0,0,0,0,55,0,1 +50,2,170050,7,4,1,8,1,0,0,0,0,40,0,0 +38,4,116580,0,13,1,3,2,0,1,0,0,20,0,1 +50,2,400004,5,10,1,5,1,0,0,0,0,60,0,0 +63,2,183608,12,6,1,1,1,0,0,0,0,40,0,0 +31,2,194055,1,9,1,6,1,0,0,0,0,50,0,0 +23,2,210443,0,13,0,3,3,0,1,0,0,40,0,0 +18,2,43272,5,10,0,4,3,0,0,0,0,20,0,0 +43,4,108945,0,13,2,3,4,0,1,0,0,48,0,0 +34,2,114691,5,10,1,1,1,0,0,0,0,50,0,1 +18,2,304169,2,7,0,5,3,0,0,0,0,35,0,0 +46,2,503923,1,9,1,8,1,1,0,4386,0,40,0,1 +35,2,340428,0,13,0,5,4,0,1,0,0,40,0,1 +46,0,106705,3,14,0,1,0,0,1,0,0,38,0,0 +59,2,146391,9,11,1,9,1,0,0,7298,0,40,0,1 +31,2,235389,7,4,0,2,0,0,1,0,0,30,20,0 +27,2,39665,1,9,2,5,4,0,1,0,0,37,0,0 +41,2,113823,3,14,1,3,1,0,0,0,0,40,7,0 +55,2,349304,0,13,1,1,1,0,0,0,0,40,0,1 +44,2,54507,1,9,0,8,0,0,1,0,0,40,0,0 +26,2,117833,0,13,0,1,0,0,1,0,1669,50,0,0 +36,2,163396,9,11,1,3,2,0,1,0,0,40,0,1 +69,2,88566,4,5,1,4,1,0,0,1424,0,35,0,0 +33,2,323619,5,10,0,0,4,0,1,0,0,40,0,0 +30,2,75755,9,11,1,3,1,0,0,0,0,40,0,0 +35,2,148903,1,9,1,4,2,0,1,0,0,16,0,1 +25,2,40915,0,13,0,1,0,0,1,0,0,40,0,1 +18,2,131033,2,7,0,4,5,1,0,0,0,15,0,0 +35,1,168475,5,10,1,10,1,0,0,0,0,60,0,1 +20,2,121568,1,9,1,2,1,0,0,0,0,50,0,0 +26,2,139098,3,14,1,3,1,0,0,5013,0,40,0,0 +46,2,357338,0,13,1,9,1,0,0,0,0,40,0,0 +31,2,283268,0,13,0,3,4,0,1,0,0,36,0,0 +40,2,572751,10,15,1,10,1,0,0,5178,0,40,4,1 +40,2,315321,1,9,2,1,4,0,1,0,625,52,0,0 +31,2,120461,0,13,0,1,0,0,1,0,0,40,0,0 +32,1,65278,8,16,1,1,1,0,0,0,0,40,0,0 +23,1,208503,5,10,2,0,3,0,0,0,0,40,0,0 +25,4,112835,3,14,0,11,0,0,0,0,0,40,0,0 +37,2,265038,5,10,1,6,1,0,0,0,0,50,0,0 +18,2,89478,5,10,0,5,3,0,1,0,0,20,0,0 +55,2,276229,1,9,6,5,0,0,1,0,0,38,0,0 +52,2,366232,4,5,2,10,4,0,1,0,0,40,1,0 +26,2,152035,1,9,0,0,3,0,1,0,0,40,0,0 +37,2,205339,5,10,0,9,0,0,0,0,0,40,0,1 +39,2,75995,1,9,2,1,4,0,1,0,0,45,0,0 +62,1,192236,0,13,2,3,0,0,1,0,0,40,0,1 +47,2,229737,1,9,1,10,1,0,0,0,0,45,0,1 +51,4,199688,0,13,1,11,1,0,0,0,0,40,0,1 +55,2,52953,1,9,2,4,4,0,1,0,0,40,0,0 +30,2,221043,1,9,1,10,1,0,0,0,0,35,0,0 +59,3,115389,5,10,1,10,1,0,0,0,0,36,0,0 +45,1,204205,12,6,1,10,1,0,0,0,0,65,0,0 +52,2,338816,5,10,1,1,1,0,0,15024,0,45,0,1 +21,2,197387,1,9,0,2,3,0,0,0,0,20,0,0 +31,2,42485,1,9,1,8,1,0,0,0,0,55,0,0 +29,2,367706,5,10,0,0,3,1,0,0,0,40,0,0 +24,2,102493,1,9,1,2,1,0,0,0,0,40,0,0 +17,2,263746,12,6,0,4,3,0,0,0,0,24,0,0 +47,2,115358,1,9,2,8,0,1,1,0,0,40,0,0 +46,2,189680,5,10,1,5,1,0,0,0,0,50,0,1 +63,2,230823,14,8,1,6,1,0,0,0,0,40,1,0 +21,2,300812,5,10,0,4,3,0,0,0,0,25,0,0 +18,2,174732,1,9,0,4,5,1,0,0,0,36,0,0 +49,0,183710,8,16,1,1,1,0,0,0,0,50,0,1 +81,1,137018,1,9,6,0,0,0,1,0,0,20,0,0 +36,5,213008,6,12,1,1,1,0,0,0,0,40,0,1 +47,2,357848,1,9,1,10,1,0,0,0,0,40,0,1 +36,2,165799,3,14,1,5,1,0,0,0,0,50,0,1 +39,1,188571,9,11,1,7,1,0,0,0,0,60,0,0 +46,2,97883,0,13,0,5,0,0,1,0,0,35,0,0 +43,4,105862,5,10,1,0,2,0,1,0,1902,40,0,1 +39,4,57424,0,13,2,0,4,0,1,0,0,35,0,0 +29,2,151476,5,10,4,5,0,0,1,0,0,40,0,0 +23,2,129583,1,9,0,2,3,1,1,0,0,16,0,0 +57,2,180920,12,6,1,10,1,0,0,0,0,43,0,0 +38,1,182416,1,9,0,5,4,1,1,0,0,42,0,0 +25,2,251915,0,13,0,5,3,0,1,0,0,40,0,0 +39,4,187127,5,10,1,1,1,0,0,0,0,40,0,0 +24,2,69045,5,10,0,5,0,1,0,0,0,40,2,0 +56,2,192869,3,14,1,10,1,0,0,0,1977,44,0,1 +39,2,74163,14,8,2,5,0,0,1,0,0,40,0,0 +23,2,60847,9,11,0,5,4,0,1,0,0,60,0,0 +67,1,116057,1,9,2,1,0,0,1,3273,0,16,0,0 +41,2,82393,0,13,0,0,0,2,0,0,0,50,0,0 +24,4,134181,0,13,0,3,3,0,1,0,0,50,0,0 +51,2,159910,0,13,2,1,0,1,0,10520,0,40,0,1 +30,5,117570,1,9,2,4,0,0,1,0,0,60,0,0 +47,5,214169,1,9,1,7,1,0,0,15024,0,40,0,1 +56,2,56331,1,9,0,8,0,0,0,0,0,32,0,0 +51,2,35576,1,9,2,10,0,0,0,0,0,38,0,0 +57,1,149168,5,10,1,1,1,0,0,0,0,55,0,0 +34,2,157165,5,10,2,4,4,0,1,0,0,40,0,0 +24,2,278130,0,13,0,3,0,0,0,0,0,40,0,0 +57,2,257200,1,9,1,8,1,0,0,0,0,40,0,0 +38,2,283122,1,9,1,8,1,0,0,0,0,40,0,1 +23,2,580248,1,9,0,9,0,0,1,0,0,40,0,0 +35,2,230054,7,4,1,8,1,0,0,0,0,40,4,0 +58,2,519006,1,9,1,10,1,0,0,0,0,52,0,0 +68,0,235882,8,16,1,3,1,0,0,0,2377,60,0,1 +43,2,336513,5,10,1,1,1,0,0,0,1902,40,0,1 +17,2,115551,2,7,0,4,3,0,1,0,0,20,0,0 +53,0,50048,8,16,1,3,1,0,0,7688,0,50,0,1 +37,5,382802,8,16,1,3,1,1,0,0,0,99,0,1 +63,2,106023,1,9,1,10,1,0,0,0,0,40,0,1 +31,2,332379,5,10,3,6,4,0,0,0,0,50,0,0 +29,2,95465,1,9,1,4,1,0,0,0,0,40,0,0 +43,4,96102,5,10,1,11,1,0,0,0,1887,40,0,1 +27,2,36440,10,15,0,3,0,0,1,0,0,65,0,1 +25,1,209384,1,9,0,4,5,0,0,0,0,32,0,0 +28,2,50814,1,9,0,3,0,0,1,0,0,40,0,0 +54,2,143865,1,9,2,5,4,0,1,0,0,35,0,0 +31,4,50442,5,10,0,1,3,3,1,0,0,32,0,0 +23,2,236601,5,10,0,9,0,0,0,0,0,48,0,0 +19,2,100999,0,13,0,3,3,0,1,0,0,30,0,0 +61,1,32423,1,9,1,7,2,0,1,22040,0,40,0,0 +27,5,153546,9,11,1,4,2,0,1,0,0,36,0,1 +19,2,182355,5,10,0,0,3,1,1,0,0,20,0,0 +25,4,44216,1,9,2,0,0,3,1,0,0,35,0,0 +40,2,97688,5,10,1,9,1,0,0,0,0,48,0,1 +53,2,209022,2,7,2,4,0,0,1,0,0,37,0,0 +32,2,96016,0,13,0,3,0,0,0,0,0,45,0,0 +72,1,52138,8,16,1,3,1,0,0,0,2392,25,0,1 +61,2,159046,7,4,1,6,1,0,0,0,0,40,0,0 +42,2,138634,1,9,1,5,1,0,0,0,0,40,0,0 +17,2,130125,12,6,0,4,3,3,1,1055,0,20,0,0 +73,2,247355,1,9,1,6,1,0,0,0,0,16,8,0 +41,1,227065,5,10,4,10,0,0,0,0,0,40,0,0 +23,2,244771,5,10,0,8,3,1,1,0,0,20,2,0 +23,2,215616,1,9,0,3,0,0,1,0,0,40,8,0 +65,2,386672,9,11,1,0,1,0,0,0,0,15,0,0 +45,5,177543,1,9,1,5,2,0,1,0,0,50,0,0 +52,3,617021,0,13,1,9,1,1,0,7688,0,40,0,1 +24,4,117109,0,13,0,0,3,1,1,0,0,27,0,0 +23,2,373550,9,11,1,10,1,0,0,0,0,40,0,0 +30,2,19847,5,10,2,9,3,0,1,0,0,40,0,0 +26,2,189590,0,13,0,1,0,0,0,0,0,40,0,0 +37,1,58343,1,9,2,7,4,0,0,0,0,56,0,0 +17,2,354201,1,9,0,4,3,0,0,0,0,40,0,0 +31,2,119422,1,9,1,5,1,0,0,0,0,40,0,0 +52,2,363405,1,9,4,0,5,0,1,0,0,40,0,0 +63,2,181863,0,13,0,5,0,0,0,0,0,27,0,0 +27,2,194472,1,9,0,13,0,0,1,0,0,60,0,0 +31,2,247328,4,5,1,8,1,0,0,3137,0,40,4,0 +71,1,130731,1,9,6,0,0,0,1,0,0,35,0,0 +35,2,236910,0,13,1,1,1,0,0,0,0,60,0,0 +44,2,378251,1,9,1,0,2,0,1,0,0,38,0,0 +36,2,120760,3,14,1,3,1,2,0,0,0,40,26,0 +22,2,203182,0,13,0,1,5,0,1,0,0,20,0,0 +32,2,130304,1,9,1,3,1,0,0,0,1485,48,0,0 +30,4,352542,0,13,2,3,4,0,1,0,0,40,0,0 +25,2,197728,5,10,0,0,3,0,1,0,0,40,0,0 +76,2,316185,7,4,6,11,0,0,1,0,0,12,0,0 +41,2,89226,1,9,2,10,0,0,0,0,0,40,0,0 +26,2,292353,7,4,1,8,1,4,0,0,0,40,0,0 +32,2,180296,5,10,2,0,4,0,1,0,0,40,0,0 +22,2,361487,1,9,0,10,0,0,0,0,0,40,0,0 +39,2,218490,0,13,1,5,1,0,0,0,1848,40,0,1 +63,1,231777,0,13,0,6,0,0,0,0,0,40,0,0 +23,2,189832,6,12,0,6,4,0,1,0,0,40,0,0 +61,2,232308,12,6,1,8,1,0,0,0,0,40,0,0 +31,0,33308,9,11,1,10,1,0,0,0,0,40,0,0 +25,2,333677,4,5,1,8,1,0,0,0,0,45,0,0 +33,2,170651,1,9,0,4,3,0,1,1055,0,40,0,0 +39,2,343403,1,9,1,5,2,0,1,0,0,36,0,0 +53,2,166386,0,13,1,8,2,2,1,0,0,40,26,0 +26,3,48099,0,13,0,1,0,0,1,0,0,40,0,0 +21,2,143062,5,10,0,4,3,0,0,0,0,32,0,0 +18,2,104704,1,9,0,0,3,1,0,0,0,40,0,0 +34,2,30497,0,13,1,1,1,0,0,15024,0,60,0,1 +44,0,174325,3,14,1,3,1,1,0,7688,0,40,0,1 +31,2,286675,1,9,2,10,3,0,0,0,0,50,0,0 +44,2,59474,1,9,1,6,1,0,0,0,0,40,0,1 +42,2,378384,10,15,1,3,1,0,0,0,1902,60,0,1 +43,2,245842,1,9,1,8,1,0,0,0,0,44,4,0 +33,2,274222,0,13,1,4,1,2,0,7688,0,38,0,1 +21,2,342575,5,10,0,5,3,1,1,0,0,30,0,0 +30,2,206051,1,9,1,2,1,0,0,0,0,40,0,1 +55,2,234213,1,9,1,6,1,0,0,0,0,60,0,0 +57,2,145189,5,10,0,0,0,0,1,0,0,40,0,0 +37,2,233490,1,9,0,7,0,0,0,0,0,50,0,0 +32,2,344129,1,9,1,8,1,0,0,0,0,40,0,1 +62,1,171315,0,13,1,3,1,0,0,0,0,60,0,1 +31,1,181485,0,13,0,5,0,1,0,0,0,40,0,1 +51,2,255412,0,13,1,1,1,0,0,0,0,50,23,1 +37,2,262409,3,14,2,1,4,0,1,0,213,45,0,0 +45,2,199590,11,3,1,6,1,0,0,0,0,38,4,0 +47,2,84726,5,10,1,8,1,0,0,0,0,40,0,0 +75,1,184335,2,7,1,1,1,0,0,0,0,30,0,0 +43,2,102025,3,14,1,3,1,4,0,0,0,50,0,0 +39,2,183898,6,12,1,10,1,0,0,7688,0,60,9,1 +30,2,55291,0,13,1,3,1,0,0,0,0,40,0,1 +27,2,150025,11,3,0,2,5,0,0,0,0,40,24,0 +44,2,100584,1,9,1,8,1,3,0,0,0,40,0,0 +53,4,181755,3,14,2,3,0,0,1,0,0,35,0,1 +40,2,150528,0,13,1,0,1,0,0,0,0,40,0,0 +18,2,107277,2,7,0,5,3,0,1,0,0,20,0,0 +33,2,247205,0,13,1,11,1,1,0,0,0,40,7,0 +20,2,291979,1,9,0,5,3,0,0,0,0,40,0,0 +38,2,270985,5,10,1,1,1,1,0,0,0,50,0,0 +48,2,62605,1,9,2,0,0,0,1,0,0,35,0,0 +46,1,176863,1,9,1,1,1,0,0,0,0,40,0,0 +51,2,53197,1,9,1,10,1,0,0,0,0,40,0,0 +35,1,267776,1,9,0,4,5,0,1,0,0,30,0,0 +24,2,308205,7,4,0,2,5,0,0,0,0,40,4,0 +30,2,306383,5,10,2,2,0,0,0,0,0,50,0,0 +70,2,35494,1,9,1,1,1,0,0,0,0,30,0,0 +26,2,291968,1,9,1,6,1,0,0,0,0,44,0,0 +34,2,80933,1,9,1,10,1,0,0,0,1672,40,0,0 +46,2,271828,1,9,1,10,1,0,0,0,0,40,0,1 +70,2,121993,1,9,1,0,2,0,1,0,0,5,0,0 +37,4,31023,5,10,1,4,1,0,0,0,0,40,0,0 +36,1,36425,5,10,2,5,4,0,1,0,0,35,0,0 +23,2,407684,4,5,0,8,5,0,1,0,0,40,4,0 +28,2,241895,1,9,1,5,1,0,0,0,1628,40,0,0 +44,1,158555,5,10,1,1,1,0,0,0,0,50,0,1 +58,2,140363,1,9,2,8,0,0,0,3325,0,30,0,0 +53,2,123429,5,10,1,1,1,0,0,0,0,60,0,1 +23,2,40060,5,10,1,2,1,0,0,0,0,40,0,0 +26,2,290286,1,9,0,10,0,1,0,0,0,40,0,0 +34,4,106169,3,14,2,3,0,0,1,0,0,50,0,0 +43,2,76487,2,7,1,10,1,0,0,0,0,40,0,0 +22,2,437994,5,10,0,4,5,1,0,0,0,20,0,0 +41,2,113555,5,10,1,10,1,3,0,7298,0,50,0,1 +36,2,160120,1,9,1,0,1,2,0,0,0,40,36,0 +41,4,343079,0,13,1,3,2,0,1,0,1740,20,0,0 +27,2,406662,1,9,0,0,0,0,0,4416,0,40,0,0 +42,1,37618,5,10,1,7,1,0,0,0,0,60,0,0 +27,2,114158,9,11,0,0,3,0,1,0,0,35,0,0 +41,2,115562,1,9,2,11,3,0,0,0,0,40,0,0 +32,2,353994,0,13,1,1,5,2,1,0,0,40,26,1 +21,2,344891,5,10,0,0,3,2,0,0,0,20,0,0 +44,2,286750,0,13,1,1,1,1,0,0,0,50,0,1 +29,2,194197,0,13,0,1,3,0,0,0,0,40,0,0 +19,1,206599,5,10,0,4,3,0,1,0,0,22,0,0 +21,4,596776,5,10,0,0,3,0,0,0,0,40,24,0 +46,2,56841,1,9,1,6,1,0,0,0,0,40,0,0 +38,2,112561,0,13,1,1,1,0,0,0,0,55,0,1 +43,2,147110,5,10,0,0,4,0,0,0,0,48,0,1 +54,5,175339,1,9,1,5,1,0,0,0,0,50,0,1 +38,2,234901,3,14,1,1,1,0,0,0,1977,60,0,1 +50,2,217083,1,9,1,0,2,0,1,0,0,40,0,1 +30,2,97757,9,11,1,3,2,0,1,0,0,36,0,1 +30,2,151868,4,5,1,10,1,0,0,0,0,40,0,0 +28,4,25864,1,9,0,1,4,3,1,0,0,35,0,0 +26,2,109419,9,11,0,0,0,0,1,0,0,45,0,0 +37,3,203070,5,10,1,10,1,0,0,0,0,43,0,0 +32,2,107843,1,9,1,8,1,0,0,5178,0,50,0,1 +64,0,264544,3,14,1,3,2,0,1,0,0,5,0,1 +18,2,148644,1,9,0,5,3,0,1,0,0,28,0,0 +30,2,125762,5,10,1,0,1,0,0,0,0,30,0,0 +18,2,193741,2,7,0,4,5,1,0,0,0,30,0,0 +27,2,588905,1,9,1,10,1,0,0,0,0,40,0,0 +49,2,115613,4,5,1,4,1,0,0,0,0,40,0,0 +46,0,222374,1,9,1,4,1,0,0,0,0,43,0,1 +37,2,185359,1,9,1,0,1,0,0,0,0,40,0,0 +30,2,173647,5,10,2,6,0,0,0,0,0,40,0,0 +29,2,31166,1,9,2,3,0,4,1,0,0,30,9,0 +25,1,189027,1,9,1,7,1,0,0,0,0,30,0,0 +38,2,296125,1,9,4,13,4,1,1,0,0,30,0,0 +35,2,334291,5,10,1,10,1,0,0,0,0,50,0,0 +56,2,318450,3,14,1,0,1,0,0,0,0,80,0,1 +29,2,174163,5,10,2,1,0,0,1,0,0,40,0,0 +41,2,119721,1,9,1,9,1,0,0,0,0,40,0,0 +47,2,142719,1,9,1,8,1,0,0,0,0,40,0,0 +23,2,162593,0,13,0,0,0,2,1,0,0,40,0,0 +46,1,236852,0,13,1,5,1,0,0,0,0,45,0,1 +28,4,154863,1,9,0,11,5,1,0,0,1876,40,0,0 +39,2,168894,0,13,2,0,4,0,1,0,0,20,0,0 +42,1,344920,5,10,1,7,2,0,1,0,0,50,0,0 +39,2,33355,1,9,1,6,1,0,0,7298,0,48,0,1 +37,5,291518,0,13,1,10,1,0,0,15024,0,55,0,1 +57,2,170244,10,15,0,3,0,0,1,0,0,40,0,0 +22,2,369549,5,10,0,4,0,1,1,0,0,30,0,0 +24,2,23438,9,11,0,0,0,0,0,0,0,30,0,1 +19,2,202673,5,10,0,2,3,0,0,0,0,50,0,0 +55,2,171780,6,12,2,5,4,1,1,0,0,30,0,0 +37,4,264503,1,9,1,11,1,0,0,0,0,40,0,0 +37,4,244341,5,10,0,0,4,1,1,0,0,40,0,0 +28,2,209109,0,13,1,4,1,0,0,0,0,50,0,0 +27,2,187392,1,9,0,4,0,0,1,0,0,40,0,0 +40,0,119578,0,13,0,3,4,0,1,0,0,20,0,0 +51,2,195105,1,9,2,13,3,0,1,0,0,40,0,0 +52,2,101752,9,11,1,6,1,0,0,0,0,56,0,0 +49,5,362654,5,10,1,1,1,0,0,15024,0,50,0,1 +40,3,77332,5,10,2,0,0,0,1,0,0,50,0,0 +80,2,87518,5,10,0,3,0,0,0,0,1816,60,0,0 +63,2,113324,5,10,1,11,1,0,0,0,0,40,0,0 +63,2,96299,1,9,2,6,4,0,0,0,0,45,0,1 +51,2,237729,5,10,2,0,4,0,1,0,0,40,0,0 +23,2,200973,1,9,0,0,0,0,1,0,0,40,0,0 +66,1,212456,1,9,6,10,0,0,0,0,0,20,0,0 +33,1,131568,1,9,1,5,1,0,0,0,0,66,0,0 +49,2,185859,1,9,1,10,1,0,0,0,0,43,0,0 +20,2,231981,5,10,0,6,0,0,0,0,0,32,0,0 +33,5,117963,6,12,1,1,1,0,0,0,1887,60,0,1 +26,2,78172,5,10,5,11,1,0,0,0,0,40,0,0 +52,2,164135,1,9,1,1,1,0,0,0,0,50,0,1 +33,2,171216,0,13,1,1,1,0,0,0,0,50,0,1 +47,2,140664,0,13,2,5,0,0,0,0,0,45,0,0 +23,2,249277,1,9,0,1,3,1,0,0,0,75,0,0 +53,3,117847,6,12,1,0,1,0,0,0,0,40,0,0 +19,2,52372,5,10,0,4,3,0,0,0,0,20,0,0 +26,3,95806,5,10,0,10,0,0,0,3325,0,40,0,0 +53,2,137428,7,4,1,6,1,0,0,0,0,60,0,1 +65,2,169047,1,9,0,8,0,0,0,0,0,10,0,0 +68,2,339168,0,13,1,6,1,0,0,0,0,30,0,0 +30,2,504725,12,6,0,5,5,0,0,0,0,18,24,0 +28,2,132870,2,7,1,10,1,0,0,0,0,45,0,0 +54,4,135840,12,6,1,11,1,0,0,0,0,45,0,0 +30,2,35644,1,9,0,4,3,0,0,0,0,10,0,0 +22,2,198148,5,10,0,0,3,0,0,0,0,50,0,0 +25,2,220098,1,9,0,4,3,0,0,0,0,30,0,0 +19,2,262515,2,7,0,4,5,0,0,0,0,20,0,0 +32,3,111567,10,15,1,3,1,0,0,0,0,40,0,1 +23,2,194096,0,13,0,1,3,0,1,0,0,40,0,0 +51,4,420917,0,13,1,3,1,0,0,0,0,45,0,0 +25,2,197871,5,10,1,5,1,0,0,0,0,44,0,1 +46,4,253116,0,13,0,3,0,1,1,0,0,40,0,0 +38,2,206535,5,10,2,9,4,0,1,0,0,50,0,0 +26,0,70447,1,9,1,11,1,2,0,0,0,40,0,1 +46,2,201217,1,9,2,3,0,0,1,0,0,40,0,0 +25,2,209970,0,13,0,3,0,0,1,0,0,40,0,0 +20,2,196745,5,10,0,4,3,0,1,594,0,16,0,0 +29,4,175262,3,14,1,3,5,0,0,0,0,35,0,0 +51,5,304955,3,14,1,1,1,0,0,0,0,50,0,1 +40,2,181265,5,10,1,10,1,0,0,0,0,52,0,0 +24,2,200973,5,10,0,0,0,0,1,0,0,40,0,0 +24,1,37440,0,13,0,7,4,0,0,0,0,50,0,0 +31,2,395170,9,11,1,4,2,3,1,0,0,24,4,0 +34,2,353213,6,12,4,10,0,0,0,0,0,60,0,0 +19,2,38619,5,10,0,7,3,0,0,0,0,66,0,0 +21,2,177711,1,9,0,6,3,1,0,0,0,40,0,0 +21,2,190761,12,6,1,7,1,0,0,0,0,70,0,0 +23,2,27776,5,10,1,6,1,0,0,0,0,24,0,0 +37,3,470663,5,10,0,10,0,0,0,0,0,40,0,0 +40,2,71738,3,14,1,1,1,0,0,0,0,46,0,1 +57,2,74156,1,9,1,4,1,0,0,0,0,30,0,0 +48,2,202467,0,13,1,3,1,0,0,0,1485,40,0,1 +24,2,123983,2,7,1,6,1,2,0,0,0,40,36,0 +43,2,193494,5,10,1,3,1,0,0,0,0,40,0,0 +40,2,130571,1,9,0,4,0,0,1,0,0,40,0,0 +52,5,90363,10,15,1,3,1,0,0,99999,0,35,0,1 +49,2,83444,1,9,2,1,0,0,0,0,0,40,0,0 +45,1,239093,5,10,1,1,1,3,0,3137,0,40,0,0 +62,4,151369,1,9,0,10,0,0,0,0,0,40,0,0 +29,2,56630,9,11,1,0,1,0,0,0,0,40,0,0 +49,2,117095,1,9,4,8,4,0,1,0,0,40,0,0 +55,3,189985,5,10,2,0,4,1,1,0,0,40,0,0 +37,5,126675,0,13,0,1,3,0,0,0,0,40,0,0 +43,0,199806,0,13,1,0,1,0,0,0,0,40,0,1 +29,2,57596,5,10,2,0,0,0,1,0,0,40,0,0 +44,2,103459,1,9,1,5,2,0,1,0,0,40,0,1 +28,2,282398,5,10,4,9,4,0,0,0,0,40,0,1 +38,2,298841,5,10,0,1,0,0,1,0,0,45,0,0 +45,2,33300,9,11,1,5,1,0,0,0,1977,50,0,1 +19,2,306467,5,10,0,4,3,0,1,0,0,20,0,0 +20,2,189888,14,8,0,4,0,0,0,0,0,40,0,0 +60,2,83861,1,9,1,2,1,0,0,0,0,40,0,0 +30,2,117393,1,9,0,5,0,0,1,0,0,40,0,0 +51,2,179010,5,10,2,5,0,0,1,0,0,60,0,0 +48,2,316101,1,9,2,1,4,0,1,0,0,40,0,0 +43,2,293305,0,13,1,5,1,0,0,0,1887,40,0,1 +51,4,175750,1,9,2,6,4,1,0,0,0,40,0,0 +41,2,121718,9,11,1,9,1,0,0,0,1848,48,0,1 +50,0,229272,1,9,1,10,1,1,0,0,0,40,0,1 +46,2,142828,1,9,1,5,2,0,1,0,0,40,0,1 +54,2,22743,5,10,1,6,1,0,0,15024,0,60,0,1 +68,2,76371,1,9,1,2,1,0,0,0,0,45,0,1 +23,1,216129,6,12,0,10,0,0,0,0,0,30,0,0 +49,2,107425,3,14,0,5,0,0,1,0,0,35,0,0 +24,2,611029,12,6,1,2,1,0,0,0,0,40,0,0 +30,4,363032,1,9,1,11,1,1,0,0,0,40,0,0 +38,2,170020,1,9,1,8,1,0,0,3137,0,45,0,0 +34,2,137900,1,9,0,5,0,0,1,0,0,35,0,0 +22,2,322674,5,10,0,1,3,0,0,0,0,40,0,0 +30,2,23778,7,4,4,2,0,0,0,0,0,40,0,0 +61,2,147845,7,4,1,6,1,0,0,0,0,31,0,0 +36,2,175759,1,9,2,1,4,0,0,0,0,40,0,0 +51,5,166459,9,11,1,1,1,0,0,0,0,40,0,0 +43,2,128212,11,3,1,8,2,2,1,0,0,40,36,1 +54,3,127455,5,10,1,11,1,0,0,0,0,48,0,1 +63,2,134699,1,9,6,3,0,0,1,0,0,25,0,0 +51,2,254230,5,10,1,1,1,0,0,0,0,40,0,1 +63,1,159715,12,6,1,8,1,0,0,0,0,40,0,0 +51,4,116286,3,14,1,3,1,0,0,0,0,60,0,1 +27,2,146719,1,9,2,5,3,0,1,0,0,35,0,0 +35,2,361888,6,12,1,9,1,0,0,0,0,40,0,1 +46,1,32825,1,9,4,10,4,0,0,0,0,40,0,0 +53,2,225768,9,11,1,10,1,1,0,0,0,40,0,1 +26,3,393728,5,10,2,0,3,0,0,0,0,24,0,0 +43,2,160369,1,9,0,8,3,0,0,0,0,40,0,0 +39,2,191807,1,9,1,5,1,0,0,15024,0,50,0,1 +50,3,176969,1,9,2,3,0,0,0,0,1590,40,0,0 +54,3,33863,1,9,1,0,1,0,0,0,0,40,0,1 +57,0,141459,5,10,2,3,4,0,1,0,0,40,0,0 +29,4,95393,1,9,0,4,3,0,0,0,0,20,0,0 +20,2,221095,1,9,0,10,5,1,0,0,0,40,0,0 +53,2,104501,0,13,1,1,1,0,0,0,1902,55,0,1 +23,2,495888,1,9,0,4,0,0,0,0,0,40,22,0 +69,2,185691,2,7,1,0,1,0,0,0,0,20,0,0 +56,2,201822,7,4,1,2,1,0,0,0,2002,40,0,0 +53,4,549341,0,13,1,3,1,1,0,0,0,35,0,0 +28,2,247445,1,9,0,0,0,0,0,0,0,40,0,0 +28,2,199566,0,13,1,4,1,1,0,0,0,40,0,0 +33,5,139057,1,9,1,1,1,2,0,0,0,84,18,1 +48,2,185039,1,9,2,5,4,0,1,0,0,30,0,0 +61,2,166124,1,9,1,10,1,0,0,0,0,40,0,1 +49,2,82649,0,13,1,3,1,0,0,5013,0,45,0,0 +48,2,109275,5,10,1,1,1,0,0,0,0,40,0,0 +32,2,408328,7,4,1,10,1,0,0,0,0,40,0,0 +51,2,186338,1,9,1,10,1,0,0,0,0,40,0,1 +19,2,251579,5,10,0,4,3,0,0,0,0,14,0,0 +47,2,76612,1,9,1,3,1,0,0,0,0,50,0,0 +25,2,22546,0,13,0,6,3,0,0,0,0,60,0,0 +72,2,53684,5,10,1,11,1,1,0,0,0,40,0,0 +29,2,183627,2,7,2,10,0,0,0,0,0,40,0,0 +22,2,73203,1,9,0,0,3,0,1,0,0,40,0,0 +57,2,108426,1,9,1,4,1,1,0,0,0,48,7,0 +50,2,116287,6,12,1,0,1,0,0,0,0,60,13,0 +45,5,145697,5,10,1,5,1,0,0,0,0,30,0,0 +52,2,326156,5,10,2,3,0,0,0,0,0,40,0,1 +53,2,201127,3,14,1,1,1,0,0,0,0,48,0,1 +36,2,250791,1,9,1,2,1,0,0,0,0,48,0,0 +46,2,328216,1,9,1,10,1,0,0,0,0,40,0,1 +20,2,400443,1,9,0,5,3,0,1,0,0,20,0,0 +75,2,95985,11,3,6,4,4,1,0,0,0,10,0,0 +32,4,127651,1,9,1,10,1,0,0,0,0,40,0,1 +28,2,250679,1,9,1,10,1,0,0,0,0,40,0,0 +53,2,103950,3,14,2,3,0,0,1,0,0,40,0,0 +17,2,200199,2,7,0,5,3,0,1,0,0,35,0,0 +46,0,295791,9,11,2,0,4,0,1,0,0,38,0,0 +39,2,191841,6,12,4,3,0,0,1,0,0,30,0,0 +38,2,82622,5,10,2,10,4,0,0,0,0,40,0,0 +36,2,160728,1,9,1,8,1,0,0,0,0,60,0,0 +63,4,109849,0,13,0,3,0,1,1,0,0,21,0,0 +28,2,339897,15,2,1,8,1,0,0,0,0,43,4,0 +49,2,371299,1,9,0,0,4,0,1,0,0,35,0,0 +43,2,421837,5,10,1,8,1,0,0,0,0,40,4,0 +38,2,29702,0,13,1,1,1,0,0,0,0,45,0,1 +39,2,117381,1,9,0,9,0,0,0,0,0,62,7,0 +40,2,338740,1,9,1,1,1,0,0,0,0,40,0,0 +24,3,314525,0,13,0,3,0,0,0,0,1741,45,0,0 +30,2,173005,5,10,1,9,1,0,0,0,0,50,0,1 +44,2,286750,5,10,1,6,1,1,0,0,0,40,0,0 +40,2,163985,1,9,1,5,1,0,0,0,0,24,0,0 +30,2,219318,1,9,0,8,5,0,1,0,0,35,5,0 +42,2,44121,3,14,2,3,0,0,1,0,1876,40,0,0 +52,1,103794,9,11,2,3,0,0,1,0,0,35,0,0 +42,2,310632,5,10,1,10,1,1,0,0,0,40,0,1 +39,2,153976,5,10,1,10,1,0,0,0,0,52,0,1 +43,2,174575,5,10,2,3,4,0,0,0,0,45,0,0 +62,1,82388,1,9,1,10,1,0,0,10566,0,40,0,0 +30,2,207253,9,11,1,10,1,0,0,0,0,40,7,0 +39,2,746786,0,13,1,3,1,0,0,0,0,55,0,1 +41,2,308296,1,9,1,6,2,0,1,0,0,20,0,0 +49,2,101825,3,14,1,3,2,0,1,0,1977,40,0,1 +25,2,109009,2,7,1,10,1,0,0,0,0,40,0,0 +48,2,413363,2,7,1,6,1,0,0,0,2002,40,0,0 +44,0,296326,0,13,0,0,0,0,0,0,0,40,0,0 +36,2,208358,4,5,2,2,0,0,0,4650,0,56,0,0 +40,2,120277,1,9,0,2,3,0,0,0,0,40,38,0 +21,2,193219,1,9,0,0,3,1,1,0,0,35,2,0 +41,2,86399,5,10,4,0,0,0,1,0,0,38,0,0 +24,2,215251,0,13,0,1,0,0,1,0,0,50,0,0 +67,1,124470,1,9,1,7,1,0,0,0,0,60,0,0 +24,2,228649,0,13,0,0,3,0,0,0,0,38,0,0 +50,1,386397,0,13,1,5,1,0,0,0,0,60,0,0 +48,2,96798,3,14,2,5,0,0,0,0,0,35,0,0 +29,2,159768,1,9,0,8,0,0,0,3325,0,40,16,0 +50,2,139464,0,13,2,3,4,0,1,0,0,36,38,0 +64,0,550848,12,6,1,1,1,0,0,0,0,40,0,1 +49,2,68505,4,5,2,4,0,1,0,0,0,37,0,0 +20,2,122215,1,9,0,4,3,1,0,0,0,52,0,0 +30,2,159442,1,9,4,0,0,0,1,0,0,40,0,0 +37,2,80638,0,13,1,4,1,2,0,0,0,30,26,0 +52,2,192390,1,9,1,8,1,0,0,0,0,40,0,1 +22,2,191324,5,10,0,11,3,0,0,0,0,25,0,0 +19,0,73009,5,10,0,0,3,0,0,0,0,15,0,0 +52,2,177858,1,9,2,10,5,0,0,0,0,55,0,1 +42,2,163003,0,13,3,9,3,2,1,0,0,40,0,0 +35,2,95551,1,9,4,1,0,0,1,0,0,36,0,0 +27,2,125298,5,10,0,0,4,0,1,0,0,50,0,0 +54,0,198186,1,9,0,4,0,1,1,0,0,38,0,0 +37,2,295949,1,9,1,10,1,0,0,0,1628,40,0,0 +37,2,182668,12,6,1,6,1,0,0,0,0,35,0,0 +28,2,124905,7,4,1,10,1,0,0,0,0,30,0,0 +63,2,171635,0,13,1,5,1,0,0,0,0,40,0,0 +19,2,376240,1,9,0,8,3,0,0,0,0,42,0,0 +28,2,157391,0,13,0,5,3,0,1,0,0,40,0,0 +44,2,178134,10,15,0,3,0,0,1,0,0,40,0,1 +31,2,207201,5,10,1,10,1,0,0,0,0,40,0,1 +64,2,102103,1,9,2,13,0,0,1,0,0,50,0,0 +40,2,92036,1,9,1,2,1,0,0,0,0,40,0,1 +59,4,236426,6,12,2,3,0,0,1,0,0,50,0,0 +22,2,400966,5,10,0,0,3,0,1,0,0,40,0,0 +40,2,404573,5,10,0,5,0,0,1,0,0,44,0,0 +35,2,227571,7,4,1,2,1,0,0,0,0,40,4,0 +20,2,145917,5,10,0,0,3,0,1,0,0,15,0,0 +35,4,190226,1,9,0,11,3,0,0,0,0,40,0,0 +28,2,356555,5,10,1,1,1,0,0,0,0,48,0,0 +28,2,66473,1,9,2,8,3,0,0,0,0,40,0,0 +25,5,163039,6,12,0,5,0,0,0,0,0,60,0,0 +37,2,89559,1,9,2,0,4,0,1,0,0,40,0,0 +31,2,163303,9,11,2,5,3,0,1,0,0,38,0,0 +41,2,192712,1,9,0,0,5,0,1,0,0,40,0,0 +31,2,381153,12,6,1,9,1,0,0,0,0,40,0,1 +44,2,222434,1,9,1,10,1,0,0,0,0,40,0,0 +20,2,34706,5,10,0,1,0,1,0,0,0,47,0,0 +57,1,47857,5,10,1,7,1,0,0,0,0,50,0,0 +26,2,195216,1,9,2,4,0,0,1,0,0,12,0,0 +44,5,103643,1,9,1,1,1,0,0,5013,0,60,34,0 +29,4,329426,1,9,0,11,0,0,0,0,0,40,0,0 +36,2,183612,1,9,1,3,1,0,0,0,1977,40,0,1 +40,2,184105,9,11,1,10,1,0,0,0,0,40,0,1 +21,2,211385,6,12,0,4,0,1,0,0,0,35,2,0 +21,2,61777,5,10,0,10,0,0,0,0,0,70,0,0 +34,1,320194,10,15,4,3,4,0,0,0,0,48,0,1 +24,2,199444,0,13,0,1,3,0,1,0,0,15,0,0 +28,2,312588,12,6,2,4,0,0,1,0,0,40,0,0 +35,2,168675,1,9,4,6,3,0,0,0,0,50,0,0 +35,2,87556,1,9,2,10,0,0,0,0,0,40,0,0 +38,0,220421,0,13,0,1,0,0,1,0,0,40,0,0 +44,3,404599,1,9,2,0,4,1,1,0,0,40,0,0 +39,2,99065,0,13,1,2,2,0,1,0,0,40,12,1 +57,4,109973,1,9,2,4,0,0,1,0,0,40,0,0 +19,2,246652,5,10,0,5,3,0,1,0,0,40,0,0 +29,2,57423,9,11,1,8,1,0,0,0,0,48,0,0 +23,2,291248,1,9,0,8,5,1,0,0,0,40,0,0 +50,2,163708,1,9,6,4,4,0,1,0,0,40,0,0 +51,1,240358,5,10,1,10,1,0,0,0,0,20,0,0 +28,2,25955,9,11,2,10,0,3,0,0,0,40,0,0 +44,2,101593,0,13,1,5,1,0,0,0,0,60,0,0 +29,1,227890,0,13,0,3,0,1,0,0,0,40,0,0 +31,2,225053,1,9,2,6,0,0,0,0,0,45,0,0 +27,2,228472,0,13,1,10,1,0,0,0,0,45,0,1 +34,2,245378,0,13,1,1,1,0,0,0,0,45,0,0 +50,5,156623,10,15,1,3,1,2,0,7688,0,50,11,1 +27,2,35032,5,10,1,2,1,0,0,0,0,40,0,1 +31,2,258849,9,11,0,0,4,1,1,0,0,40,0,0 +46,2,190115,6,12,1,10,1,0,0,0,0,40,0,1 +39,2,63910,5,10,0,0,3,2,1,0,0,40,0,0 +40,2,510072,0,13,1,5,1,0,0,0,0,55,0,1 +28,2,210867,2,7,2,5,3,0,0,0,0,40,0,0 +18,2,263024,1,9,0,5,3,0,1,0,0,40,0,0 +51,2,306785,1,9,2,0,0,0,1,0,0,40,0,0 +58,5,104333,1,9,2,5,0,0,0,0,0,50,0,0 +66,2,340734,1,9,1,5,1,0,0,0,0,40,0,0 +36,1,288585,1,9,1,4,2,2,1,0,0,20,27,0 +38,2,241765,2,7,2,2,0,0,1,0,0,60,0,0 +25,2,111058,6,12,0,1,3,0,0,0,0,40,0,0 +25,2,104662,1,9,0,4,4,0,1,0,0,22,0,0 +90,2,313986,2,7,0,2,3,0,0,0,0,40,0,0 +41,4,52037,5,10,2,0,4,0,1,0,0,40,0,0 +33,2,131776,0,13,2,3,4,0,1,914,0,40,9,0 +33,2,254221,1,9,0,0,0,0,1,0,0,40,0,0 +35,2,152909,0,13,1,1,1,0,0,0,1887,45,0,1 +39,1,211785,1,9,0,10,3,1,1,0,0,20,0,0 +59,2,160362,1,9,1,5,1,0,0,0,0,60,0,0 +19,2,387215,5,10,0,9,3,0,0,0,1719,16,0,0 +39,2,187046,1,9,1,5,1,0,0,4064,0,38,0,0 +27,2,169631,1,9,0,2,3,0,1,0,0,40,0,0 +52,2,202956,7,4,1,10,1,0,0,0,0,40,0,0 +59,1,80467,1,9,2,4,3,0,1,0,0,24,0,0 +28,2,407672,5,10,2,10,4,0,1,0,0,40,0,0 +37,2,243425,1,9,2,4,5,0,1,0,0,50,30,0 +36,2,347491,0,13,1,1,1,0,0,0,0,50,0,1 +34,2,146161,0,13,1,3,1,0,0,0,0,60,0,1 +23,2,449432,5,10,0,0,3,0,0,0,0,40,0,0 +33,2,288825,1,9,2,10,0,0,0,0,2258,84,0,0 +27,4,134813,3,14,0,3,3,0,0,0,0,52,0,0 +31,4,190401,3,14,1,3,1,0,0,0,0,40,0,0 +21,2,260617,12,6,1,8,1,0,0,0,0,36,0,0 +31,2,45604,1,9,1,1,1,0,0,0,0,54,0,0 +59,2,67841,1,9,1,2,1,0,0,0,0,40,0,1 +40,4,244522,3,14,1,3,1,0,0,0,1902,48,0,1 +19,2,430471,2,7,0,2,3,0,0,0,0,40,0,0 +47,2,194698,1,9,1,6,1,0,0,0,0,50,0,0 +34,2,94235,0,13,0,10,4,0,0,0,0,40,0,0 +57,2,188330,1,9,1,4,1,0,0,0,0,78,0,0 +51,4,146181,4,5,1,6,1,1,0,0,0,40,0,0 +21,2,177125,5,10,0,2,0,0,0,0,0,20,0,0 +30,5,68330,5,10,1,5,1,0,0,0,0,50,0,0 +46,2,95636,5,10,2,2,0,0,0,0,0,45,0,0 +40,2,238329,0,13,0,5,0,0,1,0,0,45,0,0 +52,2,416129,13,1,1,4,0,0,0,0,0,40,22,0 +23,2,285004,0,13,0,5,0,2,0,0,0,50,18,0 +25,2,186294,1,9,0,0,0,0,1,0,0,50,0,0 +43,2,188786,5,10,2,6,0,0,0,0,0,45,0,0 +38,0,31352,5,10,2,11,4,3,1,0,0,40,0,1 +22,2,197613,9,11,0,4,0,0,1,0,0,30,0,0 +33,4,161942,0,13,0,0,0,0,1,1055,0,40,0,0 +34,2,275438,5,10,1,3,1,0,0,5178,0,40,0,1 +65,2,361721,9,11,1,6,1,0,0,0,0,20,0,0 +50,2,144968,1,9,0,9,3,0,0,0,0,15,0,0 +29,2,190539,0,13,0,5,0,0,0,6849,0,48,0,0 +25,2,178037,1,9,1,6,1,0,0,0,0,40,0,0 +54,2,306985,5,10,2,0,0,0,1,0,0,40,0,0 +49,2,87928,1,9,1,0,1,0,0,0,0,40,0,1 +44,2,242619,5,10,1,8,1,0,0,0,0,40,0,0 +24,2,154165,4,5,2,4,3,0,1,0,0,40,0,0 +25,2,511331,0,13,0,5,0,0,0,0,0,38,0,0 +65,4,221026,1,9,1,6,1,0,0,0,0,20,0,0 +56,1,222182,1,9,1,1,1,1,0,0,0,45,0,0 +39,1,126569,10,15,1,3,1,0,0,15024,0,60,0,1 +23,2,202344,0,13,0,3,3,0,1,0,0,40,0,0 +20,2,190423,5,10,0,4,0,0,1,0,0,20,0,0 +24,2,238917,11,3,0,10,4,0,0,0,0,40,22,0 +41,2,221947,5,10,1,1,1,0,0,0,1887,50,0,1 +40,5,37997,5,10,1,7,1,0,0,0,0,50,0,0 +55,2,147098,1,9,1,10,1,0,0,0,0,50,0,1 +38,2,278253,1,9,2,0,4,0,1,0,0,48,0,0 +23,2,195411,1,9,0,0,4,1,1,0,0,40,0,0 +44,2,76196,0,13,1,1,1,0,0,0,0,50,0,0 +45,2,120131,5,10,1,10,1,0,0,0,1887,40,0,1 +20,1,186014,5,10,0,0,3,0,1,0,0,12,9,0 +29,2,205903,1,9,0,4,3,0,0,0,0,40,0,0 +43,0,125405,1,9,1,11,1,0,0,0,0,40,0,0 +30,2,219838,14,8,2,8,0,0,0,0,0,40,0,0 +28,0,19395,5,10,0,0,0,0,1,0,0,38,0,0 +31,2,223327,1,9,1,1,1,0,0,0,0,40,0,1 +52,2,114062,1,9,2,10,4,0,1,0,0,40,0,0 +36,2,95654,0,13,1,3,2,0,1,0,0,50,10,1 +38,2,177305,1,9,1,10,1,0,0,0,0,45,0,0 +63,1,117681,9,11,1,7,1,0,0,0,0,40,0,0 +21,2,237651,5,10,0,4,3,0,0,0,0,35,0,0 +33,0,150570,1,9,2,0,0,0,0,0,0,40,0,0 +46,0,106705,5,10,2,3,4,0,1,1506,0,50,0,0 +47,5,175958,0,13,0,5,0,0,0,3325,0,60,0,0 +33,2,144064,8,16,1,3,1,0,0,0,0,55,0,1 +28,2,152951,1,9,2,2,0,0,0,0,0,40,0,0 +46,2,190487,1,9,2,13,4,0,1,0,0,28,16,0 +25,2,306666,5,10,1,5,1,1,0,0,0,45,0,0 +37,2,195148,1,9,1,10,3,0,0,3137,0,40,0,0 +31,1,226624,4,5,1,10,1,0,0,0,0,60,0,0 +49,2,157569,1,9,1,10,1,0,0,0,0,40,0,0 +22,0,22966,5,10,3,9,4,0,0,0,0,20,0,0 +52,2,379682,9,11,1,4,2,0,1,0,0,20,0,1 +29,2,446559,6,12,1,1,2,0,1,0,0,50,0,0 +18,2,41794,2,7,0,4,3,0,1,0,0,20,0,0 +31,4,90409,5,10,1,1,1,0,0,0,0,35,0,0 +23,2,125491,5,10,0,4,0,2,1,0,0,35,36,0 +54,1,104748,12,6,1,5,1,0,0,0,0,65,0,0 +50,4,169182,1,9,2,4,4,0,1,0,0,49,21,0 +24,2,122272,0,13,0,7,3,0,1,0,0,40,0,0 +49,5,289707,1,9,4,4,0,0,0,0,0,45,0,0 +54,4,137691,1,9,1,10,1,0,0,0,0,40,0,1 +41,2,84610,0,13,1,1,1,0,0,0,1902,60,0,1 +49,2,166789,1,9,1,0,1,0,0,0,0,40,0,0 +36,4,348728,0,13,0,3,0,0,1,0,0,35,0,0 +23,2,348092,1,9,0,6,3,1,0,0,0,40,19,0 +63,2,154526,5,10,6,4,0,0,1,0,0,40,0,0 +67,2,288371,1,9,1,5,1,0,0,0,0,40,8,1 +23,2,182342,1,9,0,10,0,0,0,0,0,40,0,0 +22,2,244366,0,13,0,3,3,0,0,0,0,40,0,0 +66,2,102423,9,11,1,0,1,0,0,0,0,30,0,0 +25,2,259688,2,7,1,10,1,0,0,0,0,50,0,0 +30,2,98733,5,10,2,8,4,0,1,0,0,20,0,0 +35,2,174856,1,9,1,6,1,0,0,2885,0,40,0,0 +67,1,141797,7,4,1,1,1,0,0,0,0,40,0,0 +30,2,327202,14,8,0,10,0,1,0,0,0,40,0,0 +26,2,76996,5,10,0,8,0,1,1,0,0,38,0,0 +34,2,260560,1,9,1,8,1,0,0,0,0,40,0,0 +21,2,370990,5,10,0,5,3,0,0,0,0,40,0,0 +18,2,129010,14,8,0,10,3,0,0,0,0,10,0,0 +21,2,452640,1,9,0,10,0,0,0,0,0,40,0,0 +76,5,120796,4,5,1,3,1,0,0,0,0,40,0,0 +26,2,229523,1,9,1,8,2,0,1,0,0,56,0,0 +18,2,127388,14,8,0,4,0,0,1,0,0,25,0,0 +34,2,119422,9,11,1,8,1,0,0,0,1672,50,0,0 +59,2,193895,1,9,2,1,0,0,1,0,0,40,0,0 +55,2,163083,0,13,4,1,0,0,0,14084,0,45,0,1 +33,1,155343,5,10,0,7,0,0,0,0,0,72,0,0 +25,2,73895,1,9,0,4,3,0,1,0,0,10,0,0 +48,2,107682,1,9,6,8,0,0,1,0,0,10,0,0 +64,2,321166,0,13,2,5,0,0,1,0,0,5,0,0 +47,4,154940,3,14,0,3,0,0,1,0,0,45,0,1 +26,2,103700,5,10,0,9,3,0,1,0,0,40,0,0 +36,2,63509,6,12,1,3,1,0,0,0,0,48,0,1 +21,2,243842,1,9,1,7,1,0,0,0,0,40,0,0 +30,2,58597,1,9,0,8,3,0,0,0,0,44,0,0 +41,1,190290,1,9,2,10,0,0,0,0,0,40,0,0 +34,2,62165,5,10,0,5,5,1,0,0,0,30,0,0 +24,2,280134,12,6,0,5,0,0,0,0,0,49,22,0 +26,2,118736,0,13,0,3,0,0,1,0,0,20,0,0 +25,2,171114,1,9,0,0,0,0,1,0,0,48,0,0 +35,2,169638,5,10,2,5,4,0,1,0,0,36,0,0 +41,2,125461,5,10,2,10,0,0,0,0,0,40,0,1 +33,2,145434,2,7,0,10,3,0,0,0,0,40,0,0 +18,2,152182,5,10,0,4,3,0,1,0,0,25,0,0 +27,5,233724,1,9,4,0,0,0,0,0,0,38,0,0 +32,2,153963,1,9,2,4,4,0,1,0,0,35,0,0 +51,4,88120,1,9,0,4,0,1,0,0,0,40,0,0 +38,2,96330,9,11,2,0,4,1,1,0,0,40,0,0 +41,4,66118,5,10,1,6,2,0,1,0,0,25,0,0 +26,2,182178,5,10,1,10,1,0,0,2829,0,40,0,0 +38,1,53628,9,11,2,1,4,0,0,0,0,35,0,0 +54,2,174865,4,5,1,1,1,0,0,0,0,45,0,1 +30,2,66194,0,13,0,3,0,0,1,0,0,60,31,0 +31,2,73796,5,10,6,1,4,0,1,0,0,30,0,0 +26,0,28366,0,13,0,3,0,0,0,0,0,40,0,0 +75,1,231741,8,16,1,3,1,0,0,4931,0,3,0,0 +29,2,237865,3,14,0,6,3,1,0,0,0,40,0,0 +61,2,195453,1,9,1,1,1,0,0,0,0,50,0,1 +24,2,116934,5,10,4,5,4,0,1,0,0,45,0,0 +34,2,456399,6,12,0,3,0,0,0,0,0,40,0,0 +42,2,263608,5,10,2,10,3,0,0,0,0,40,0,0 +24,2,263498,2,7,0,10,0,0,0,0,0,40,0,0 +27,3,469705,1,9,0,10,0,1,0,0,1980,40,0,0 +39,4,113253,0,13,1,3,2,0,1,0,0,50,0,1 +20,2,138768,1,9,0,2,3,0,0,0,0,40,0,0 +51,2,302146,2,7,0,4,0,1,1,0,0,40,0,0 +68,2,253866,0,13,1,5,1,0,0,0,0,30,0,0 +28,3,214858,1,9,0,8,3,0,0,0,0,48,0,0 +43,2,243476,1,9,2,9,0,0,1,0,0,40,0,0 +35,2,169104,5,10,3,10,0,0,0,0,0,40,0,0 +44,2,103218,1,9,2,0,4,1,1,0,0,40,0,0 +41,2,57233,0,13,0,2,0,0,0,0,0,40,0,0 +44,2,228320,1,9,1,9,1,0,0,0,0,45,0,1 +20,2,217421,1,9,1,0,5,0,1,0,0,40,0,0 +46,2,185041,1,9,1,10,1,0,0,0,0,75,0,1 +27,1,37302,6,12,1,6,1,0,0,7688,0,70,0,1 +32,2,261059,5,10,0,4,0,0,0,0,0,50,0,0 +46,2,59767,5,10,2,5,0,0,0,0,0,50,0,0 +26,2,333541,1,9,0,4,0,0,0,0,0,24,0,0 +20,2,133352,5,10,0,0,3,2,1,0,0,40,36,0 +36,2,99270,1,9,1,7,2,0,1,0,0,40,0,0 +49,2,204629,0,13,1,1,1,0,0,0,0,40,0,1 +32,2,34104,1,9,1,1,1,0,0,3103,0,55,0,1 +32,2,312667,0,13,1,3,1,0,0,15024,0,50,0,1 +49,2,329603,0,13,1,10,1,0,0,0,1902,40,0,1 +36,2,281021,1,9,0,6,0,0,0,0,0,45,0,0 +22,2,275385,5,10,0,4,5,0,0,0,0,25,0,0 +52,3,129177,1,9,2,0,0,0,1,0,0,40,0,0 +42,2,385591,1,9,1,1,1,0,0,0,0,50,0,1 +72,2,38360,1,9,6,4,4,0,1,0,0,16,0,0 +30,4,73796,0,13,4,3,0,0,1,0,0,40,0,0 +44,2,67671,5,10,1,2,1,0,0,0,0,40,0,0 +23,2,257621,0,13,0,5,0,0,1,0,0,45,0,0 +22,2,180052,5,10,0,5,3,0,0,0,0,20,0,0 +59,2,656036,0,13,4,0,4,0,0,0,0,60,0,0 +46,2,215943,1,9,2,3,4,0,1,0,0,40,0,0 +30,2,488720,9,11,1,2,1,0,0,0,0,40,4,0 +64,3,199298,7,4,6,4,4,0,1,0,0,30,5,0 +31,2,305692,5,10,1,5,2,1,1,0,0,40,0,0 +64,2,114994,1,9,1,4,1,0,0,0,0,20,0,0 +45,2,88265,1,9,0,8,3,0,1,0,0,40,0,0 +59,2,168569,1,9,1,8,1,0,0,0,1887,40,0,1 +32,2,175413,1,9,0,0,5,1,1,0,0,40,2,0 +43,2,161226,0,13,1,8,1,3,0,0,0,40,0,0 +23,2,208598,5,10,0,5,0,0,0,0,0,45,0,0 +49,1,200471,1,9,1,10,1,0,0,0,0,40,0,0 +32,2,256609,14,8,1,8,1,0,0,0,0,40,4,0 +49,2,176684,9,11,0,1,4,0,1,0,0,40,0,0 +33,2,206512,5,10,2,3,0,0,0,0,0,40,0,0 +28,2,212640,10,15,0,3,0,0,1,0,0,85,0,0 +47,2,148724,1,9,1,5,1,1,0,0,0,40,0,0 +41,2,266510,1,9,0,4,3,0,0,0,0,40,0,0 +34,4,240252,3,14,1,1,1,0,0,0,0,40,0,1 +25,2,358975,1,9,0,4,0,0,1,0,0,35,0,0 +21,2,434710,5,10,0,5,0,0,1,0,0,15,0,0 +46,2,241844,4,5,1,4,1,0,0,0,0,40,0,0 +37,2,191342,15,2,1,10,1,2,0,0,0,40,14,0 +41,2,221947,5,10,1,10,1,0,0,0,0,56,0,1 +44,2,111483,1,9,0,0,3,0,0,0,1504,50,0,0 +30,2,65278,1,9,1,9,1,0,0,0,0,40,0,1 +54,2,133403,5,10,1,8,1,0,0,0,0,40,0,0 +35,1,166416,1,9,1,7,1,0,0,0,0,99,0,0 +21,2,221480,5,10,0,9,3,0,1,0,0,25,16,0 +35,1,189878,3,14,1,5,1,0,0,0,0,40,0,1 +35,2,278403,10,15,1,3,1,0,0,0,0,80,0,1 +19,2,184710,5,10,0,10,3,0,0,0,0,20,0,0 +48,2,177775,1,9,2,1,0,0,1,0,0,40,0,0 +65,1,225473,5,10,6,10,0,0,1,0,0,35,0,0 +40,2,289403,0,13,4,0,4,1,0,0,0,35,0,0 +26,2,269060,1,9,0,0,0,0,1,0,0,40,0,0 +45,2,449354,5,10,1,1,1,0,0,0,0,40,0,0 +26,2,214413,5,10,0,10,3,0,0,0,0,40,0,0 +32,2,80058,1,9,1,0,1,0,0,0,0,40,0,0 +35,2,202027,0,13,2,1,0,0,0,27828,0,50,0,1 +22,1,123440,5,10,0,10,0,0,0,0,0,48,0,0 +37,2,191524,9,11,4,3,3,0,1,0,0,38,0,0 +25,2,308144,0,13,0,10,0,0,0,0,0,40,4,0 +46,2,205100,9,11,1,1,1,0,0,0,0,48,0,1 +30,2,195750,1,9,0,2,3,0,0,0,0,27,0,0 +63,2,149756,6,12,2,1,0,0,0,0,0,40,0,1 +51,4,240358,1,9,1,11,1,0,0,0,0,40,0,1 +68,1,241174,7,4,1,1,1,0,0,0,0,16,0,0 +36,2,356838,8,16,1,3,1,0,0,0,0,50,8,0 +28,5,115705,5,10,0,1,0,0,0,0,0,50,0,0 +41,4,137142,5,10,1,5,1,0,0,0,0,40,0,0 +47,2,296066,5,10,1,3,1,0,0,0,0,40,0,0 +22,2,401335,5,10,0,4,4,1,1,0,0,30,0,0 +34,5,186824,10,15,1,3,1,0,0,15024,0,40,0,1 +46,3,162187,0,13,1,3,1,0,0,0,0,40,0,1 +28,2,98010,5,10,3,0,3,0,1,0,0,40,0,0 +36,2,172538,1,9,1,10,1,0,0,0,0,52,0,1 +18,2,80163,5,10,0,5,3,0,1,0,0,20,0,0 +33,4,43959,3,14,1,3,1,0,0,7688,0,50,0,1 +51,2,162632,1,9,1,6,1,0,0,7298,0,60,0,1 +56,1,115422,1,9,1,1,1,0,0,0,0,35,0,0 +54,2,100933,1,9,0,0,4,0,1,0,0,40,0,0 +29,2,270379,1,9,0,1,4,1,1,0,0,40,0,0 +40,2,20109,5,10,2,2,0,3,1,0,0,84,0,0 +53,2,114758,3,14,1,1,1,0,0,15024,0,65,0,1 +22,2,100345,1,9,0,2,3,0,0,0,0,35,0,0 +33,2,184901,1,9,1,8,1,0,0,0,0,40,0,1 +28,2,87239,1,9,2,6,0,0,0,0,0,50,0,0 +63,2,127363,5,10,1,3,2,0,1,0,0,12,0,0 +53,3,199720,8,16,1,3,1,0,0,15024,0,60,9,1 +37,2,143058,12,6,1,10,1,0,0,0,0,50,0,0 +50,3,36489,5,10,2,1,4,0,0,0,0,40,0,0 +22,2,141698,1,9,0,10,3,0,0,0,0,40,0,0 +40,3,26358,6,12,0,0,0,0,1,0,0,40,0,0 +22,2,195532,0,13,0,3,0,0,1,8614,0,40,0,1 +21,2,30039,5,10,0,3,3,0,0,0,0,40,0,0 +25,2,125159,6,12,1,2,1,1,0,0,0,40,2,0 +20,2,246250,5,10,0,10,0,0,1,0,0,40,0,0 +43,3,77370,1,9,1,6,1,0,0,0,0,40,0,0 +29,2,355569,9,11,0,1,4,0,1,0,0,50,0,0 +32,2,180603,0,13,1,5,1,0,0,0,0,40,0,1 +42,2,201785,3,14,1,5,1,0,0,0,0,50,0,1 +33,2,256211,1,9,1,8,1,2,0,0,0,40,27,0 +27,2,146764,5,10,1,1,2,0,1,0,0,40,0,1 +29,2,200515,5,10,1,8,1,0,0,0,0,38,0,0 +29,2,52636,1,9,1,6,1,0,0,0,0,40,0,0 +20,2,27049,5,10,0,1,3,0,1,0,0,20,0,0 +35,2,111128,12,6,0,0,3,0,0,0,0,40,0,0 +31,1,348038,0,13,1,3,1,0,0,0,1902,50,5,1 +33,2,93930,1,9,0,10,0,0,0,0,0,50,0,0 +67,2,397831,5,10,1,1,1,0,0,0,1539,40,0,0 +46,2,33794,5,10,1,3,1,0,0,0,0,10,0,0 +45,2,178215,4,5,1,8,2,0,1,0,0,40,0,1 +17,4,191910,2,7,0,5,3,0,0,0,0,20,0,0 +35,2,340110,0,13,1,1,1,0,0,0,1848,70,0,1 +48,1,133694,0,13,3,1,0,1,0,0,0,40,2,1 +49,2,148398,1,9,2,8,0,1,1,0,0,40,0,0 +20,2,133515,5,10,0,5,5,0,1,0,0,40,0,0 +27,2,181667,1,9,1,8,1,0,0,5013,0,46,8,0 +64,2,159715,5,10,1,10,1,0,0,0,0,20,0,0 +53,3,174040,5,10,4,10,0,1,0,0,0,40,0,0 +52,2,117700,1,9,2,0,0,0,1,0,0,40,0,0 +29,2,37215,1,9,1,10,1,0,0,0,0,55,0,0 +32,5,46807,1,9,1,10,1,0,0,99999,0,40,0,1 +48,1,317360,0,13,1,3,2,0,1,0,0,20,0,1 +30,2,425627,5,10,0,10,5,0,0,0,0,40,4,0 +34,2,82623,1,9,1,4,1,0,0,0,0,20,0,0 +39,2,140854,1,9,0,3,0,0,0,0,0,50,0,0 +28,2,185061,2,7,0,2,5,0,0,0,0,40,0,0 +54,2,282680,0,13,0,3,0,0,1,0,0,50,0,0 +24,2,137591,5,10,0,5,3,0,0,0,1762,40,0,0 +25,2,198163,1,9,0,1,3,0,1,0,0,40,0,0 +25,2,132749,2,7,2,4,4,0,1,0,0,12,0,0 +48,4,31264,5,10,1,1,2,0,1,5178,0,40,0,1 +24,2,399449,0,13,0,5,3,0,1,0,0,40,0,0 +31,2,27494,5,10,1,5,1,2,0,0,0,50,18,0 +47,2,368561,5,10,1,10,1,0,0,0,0,40,0,1 +19,2,406078,5,10,0,0,3,0,1,0,0,25,0,0 +52,5,100506,5,10,1,5,1,0,0,15024,0,50,0,1 +52,2,29658,1,9,1,0,1,0,0,0,0,40,0,0 +60,2,181953,1,9,1,6,1,0,0,0,0,28,0,0 +43,2,304175,3,14,1,3,1,0,0,0,0,50,0,1 +24,2,170070,6,12,2,4,3,0,1,0,0,30,0,0 +51,2,194908,1,9,0,0,0,0,1,0,0,40,0,0 +38,1,357962,4,5,2,10,0,0,0,0,0,40,0,0 +21,2,214716,5,10,0,0,3,0,1,0,0,10,0,0 +40,5,207578,1,9,1,0,1,0,0,0,0,50,0,1 +54,2,146409,5,10,6,1,4,0,1,0,0,40,0,0 +35,2,341643,0,13,0,4,5,0,0,0,0,50,0,0 +52,2,131631,2,7,4,8,4,1,0,0,0,40,0,0 +53,2,88842,1,9,1,1,1,0,0,99999,0,40,0,1 +35,2,417136,1,9,2,10,4,1,0,0,0,40,0,0 +43,1,336763,5,10,2,5,4,0,1,0,880,42,0,0 +29,2,209301,0,13,1,10,1,0,0,0,0,40,8,0 +29,2,120986,1,9,1,6,1,3,0,0,0,65,0,0 +27,2,51025,1,9,0,4,0,0,1,0,0,40,0,0 +58,2,218281,0,13,1,0,1,0,0,0,0,40,4,0 +64,2,114994,1,9,1,2,1,0,0,0,0,18,0,0 +53,2,335481,1,9,1,0,2,1,1,0,0,32,0,0 +21,2,174503,1,9,0,0,0,0,1,0,0,30,0,0 +40,1,230478,6,12,2,1,0,0,0,0,0,30,0,0 +52,0,149650,8,16,1,3,1,0,0,0,0,40,10,1 +38,2,149419,9,11,0,9,0,0,0,0,0,50,0,0 +39,2,185099,1,9,1,1,1,0,0,0,0,40,0,0 +68,2,128472,8,16,1,3,1,0,0,0,0,55,0,1 +24,2,124971,1,9,0,5,0,0,0,0,0,38,0,0 +40,5,344060,10,15,1,3,1,0,0,0,0,50,0,1 +43,5,286750,10,15,1,3,1,1,0,0,0,99,0,1 +38,2,296999,0,13,0,1,0,0,1,0,0,70,0,0 +45,2,123681,1,9,1,5,1,0,0,0,0,40,0,1 +18,2,232024,2,7,0,8,3,0,0,0,0,55,0,0 +57,4,52267,3,14,1,1,1,0,0,0,0,50,0,1 +49,2,119182,1,9,4,4,0,1,1,0,0,35,0,0 +25,2,191230,5,10,0,1,3,0,1,0,0,40,29,0 +52,3,23780,5,10,2,0,0,0,0,0,0,40,0,0 +56,2,184553,12,6,2,10,0,0,0,0,0,56,0,0 +26,5,242651,5,10,0,5,0,0,0,0,0,48,0,0 +19,2,246226,1,9,0,10,0,0,1,0,0,40,0,0 +25,5,86745,0,13,0,0,3,2,1,0,0,40,0,0 +25,2,106889,1,9,1,0,2,0,1,0,0,30,0,0 +21,2,460835,1,9,0,5,5,0,0,0,0,45,0,0 +48,1,213140,7,4,1,10,1,0,0,0,0,40,25,0 +33,0,37070,3,14,1,3,1,0,0,0,0,60,8,0 +31,0,93589,1,9,2,11,3,4,0,0,0,40,0,0 +26,1,213258,1,9,2,7,4,0,0,0,0,65,0,0 +37,0,46814,0,13,0,3,0,0,0,0,0,38,0,0 +20,2,284737,5,10,0,4,3,0,0,0,0,20,0,0 +49,2,197418,1,9,6,0,4,0,1,0,0,20,0,0 +49,2,185041,3,14,1,1,1,0,0,0,1977,40,0,1 +51,2,159604,5,10,1,3,2,0,1,0,0,40,0,1 +40,2,123557,5,10,1,5,1,0,0,0,0,40,0,0 +24,2,275421,9,11,0,8,3,0,1,0,0,40,0,0 +18,2,167147,14,8,0,5,3,0,0,0,0,24,0,0 +41,2,197583,12,6,1,6,1,1,0,0,0,40,0,1 +46,2,175109,1,9,1,0,1,0,0,0,1485,40,0,1 +46,2,117502,1,9,1,0,2,0,1,0,0,40,0,0 +64,2,180401,12,6,1,6,1,0,0,0,0,40,0,1 +50,1,146603,10,15,1,3,1,0,0,0,0,40,0,1 +53,0,143822,3,14,1,3,1,0,0,0,0,36,0,1 +21,2,51985,1,9,0,10,0,0,0,0,0,40,0,0 +22,0,48121,5,10,1,4,1,0,0,0,0,25,0,0 +37,2,234807,0,13,2,1,4,0,1,7430,0,45,0,1 +39,3,65324,10,15,0,3,0,0,0,0,0,55,0,1 +30,2,302149,0,13,1,5,1,2,0,0,0,40,3,0 +25,2,168403,0,13,0,3,0,0,0,0,1741,40,0,0 +26,2,159897,5,10,0,1,4,1,1,0,0,40,0,0 +43,2,416338,0,13,0,5,0,0,0,0,0,50,0,0 +59,2,370615,1,9,6,0,4,0,1,0,0,60,0,0 +27,2,219371,1,9,3,0,4,0,1,0,0,40,2,0 +55,2,120970,12,6,1,10,1,1,0,0,0,40,0,1 +20,2,22966,5,10,0,4,3,0,0,0,0,12,8,0 +25,2,34541,9,11,0,3,0,0,1,0,0,36,8,0 +28,2,191027,6,12,4,4,0,0,0,0,0,40,0,0 +29,2,107458,0,13,0,5,0,0,0,0,0,50,0,0 +60,2,121832,2,7,1,5,1,0,0,0,0,40,0,1 +37,4,233825,0,13,1,3,2,0,1,15024,0,50,0,1 +25,2,73839,2,7,2,5,3,0,1,0,0,40,0,0 +27,2,109165,5,10,1,10,1,0,0,0,0,60,0,0 +50,0,103063,0,13,1,1,1,0,0,0,0,40,0,1 +41,1,29762,5,10,1,7,1,0,0,5013,0,70,0,0 +46,2,111979,7,4,1,10,1,0,0,0,0,47,0,0 +35,2,150125,9,11,2,4,4,1,1,0,0,40,0,0 +40,2,118001,1,9,0,2,0,1,0,0,0,40,0,0 +49,2,149337,0,13,1,1,1,0,0,0,0,40,0,1 +29,2,36601,0,13,0,3,0,0,1,0,0,50,0,0 +43,4,118600,0,13,2,3,4,0,1,0,625,40,0,0 +39,2,279272,6,12,0,6,0,1,0,0,0,60,0,0 +35,2,181020,1,9,0,2,3,0,0,0,0,60,0,0 +52,2,165998,5,10,1,8,1,0,0,0,0,40,0,0 +25,2,218136,5,10,0,2,0,1,0,0,0,40,31,0 +20,5,182200,1,9,0,8,3,0,1,0,0,30,0,0 +24,2,140001,0,13,0,1,0,0,0,0,0,40,0,0 +29,2,193260,0,13,1,10,5,2,0,0,0,30,3,0 +21,2,191243,5,10,0,4,3,0,0,0,0,40,0,0 +37,3,207887,0,13,2,1,5,0,1,0,0,50,0,0 +43,3,211450,1,9,0,0,3,0,0,0,0,40,0,0 +19,2,184759,1,9,0,0,0,0,1,0,0,26,0,0 +47,2,197836,1,9,1,5,1,0,0,0,0,45,0,0 +61,2,232308,1,9,1,6,1,0,0,0,0,45,0,1 +35,2,301614,1,9,1,4,1,0,0,0,0,60,0,0 +60,2,146674,12,6,1,2,1,1,0,0,0,40,0,0 +27,2,225291,5,10,0,0,0,0,1,0,0,40,0,0 +57,4,148509,0,13,1,3,1,2,0,0,0,35,3,0 +56,2,136413,15,2,1,10,1,0,0,0,0,40,0,0 +27,2,126060,1,9,0,1,0,0,1,0,0,40,0,0 +47,2,73064,7,4,1,8,2,1,1,0,0,35,0,0 +19,2,39026,1,9,0,4,0,0,0,0,0,30,0,0 +28,1,33035,14,8,2,4,4,0,1,0,0,30,0,0 +43,2,193494,12,6,1,0,1,0,0,0,0,40,0,0 +63,4,147440,5,10,2,1,0,0,1,0,0,35,0,0 +25,2,64671,1,9,2,2,3,2,1,0,0,40,11,0 +35,1,225399,1,9,0,8,3,0,0,8614,0,40,0,1 +20,2,174391,1,9,0,2,3,0,1,0,0,40,0,0 +48,2,377757,12,6,1,5,1,0,0,0,0,70,0,0 +30,4,364310,0,13,0,3,0,1,1,0,0,40,9,0 +31,2,110643,0,13,1,3,1,0,0,0,0,40,0,1 +20,2,70240,1,9,0,5,3,2,1,0,0,24,11,0 +57,0,32694,3,14,1,3,1,0,0,0,0,50,0,1 +41,2,95047,9,11,1,0,2,0,1,7688,0,44,0,1 +33,2,264936,1,9,2,0,5,0,1,0,0,40,0,0 +27,2,367329,9,11,1,7,1,0,0,0,0,40,0,0 +34,2,56026,1,9,1,7,1,0,0,0,0,60,0,1 +22,2,186452,12,6,0,10,0,0,0,0,0,30,0,0 +50,2,125417,6,12,1,1,2,1,1,0,0,40,0,1 +40,1,242082,0,13,1,3,1,0,0,0,0,45,0,1 +37,2,31023,1,9,1,10,1,0,0,0,0,51,0,0 +53,2,424079,3,14,1,1,1,0,0,15024,0,55,0,1 +38,1,108947,5,10,1,8,1,0,0,7688,0,40,0,1 +25,0,261979,1,9,0,3,0,0,0,0,0,40,0,0 +51,2,55507,1,9,1,10,1,1,0,0,0,40,0,0 +18,2,353358,5,10,0,4,3,0,0,0,0,16,0,0 +41,2,67339,2,7,1,2,1,0,0,7688,0,40,0,1 +33,2,235109,1,9,0,0,4,0,1,0,0,40,0,0 +33,2,208180,0,13,0,5,0,0,1,0,0,40,0,0 +67,0,423561,5,10,1,6,1,0,0,0,0,40,0,0 +47,1,145290,1,9,1,1,1,0,0,0,2415,50,0,1 +24,2,403671,5,10,0,8,0,0,0,0,0,40,0,0 +32,4,49325,7,4,1,4,1,0,0,0,0,40,0,0 +29,2,370494,1,9,0,4,4,0,1,0,0,40,4,0 +25,2,267012,9,11,0,5,0,0,0,0,0,45,0,0 +33,2,191856,5,10,2,0,0,0,1,0,0,40,0,0 +55,2,80445,0,13,1,10,1,0,0,0,0,40,0,0 +31,2,379798,5,10,1,5,1,0,0,0,0,40,0,1 +32,4,168387,3,14,1,3,1,0,0,0,0,50,0,0 +18,2,301948,1,9,0,11,3,0,0,34095,0,3,0,0 +36,2,274809,1,9,2,0,4,0,1,0,0,50,0,0 +58,2,233193,1,9,6,0,0,0,1,0,0,27,0,0 +34,2,299635,3,14,1,1,1,0,0,0,1902,50,0,1 +19,2,236396,2,7,0,2,0,0,0,0,0,40,0,0 +21,2,688355,1,9,0,0,4,1,1,0,0,40,0,0 +36,5,37019,1,9,0,7,0,0,0,0,0,50,0,0 +37,2,148015,0,13,1,3,2,1,1,15024,0,40,0,1 +43,2,122975,1,9,1,8,2,1,1,0,0,21,33,0 +52,0,349795,0,13,1,11,1,0,0,0,0,40,0,0 +43,2,108945,5,10,2,3,4,0,1,0,0,38,0,0 +22,2,237498,1,9,0,4,3,0,0,0,0,40,0,0 +57,2,188872,11,3,2,6,4,0,0,6497,0,40,0,0 +37,2,324019,6,12,0,0,0,0,1,0,0,40,0,0 +39,2,82488,5,10,2,5,4,2,1,0,0,38,0,0 +54,2,206964,5,10,1,5,1,0,0,0,0,40,0,1 +27,2,37088,6,12,0,4,0,0,0,0,0,40,0,0 +21,2,152540,1,9,0,0,0,0,1,0,0,35,0,0 +65,2,143554,5,10,4,0,0,0,1,0,0,38,0,0 +30,2,126242,5,10,1,4,2,0,1,0,0,40,0,0 +22,2,127185,4,5,0,8,0,0,1,0,0,40,0,0 +26,2,164018,0,13,1,5,1,0,0,4064,0,50,0,0 +25,2,210184,2,7,4,10,3,0,0,0,0,40,0,0 +47,2,124973,9,11,1,1,1,0,0,15024,0,50,0,1 +23,2,182117,6,12,0,4,3,0,0,0,0,60,0,0 +42,2,220049,1,9,1,5,1,1,0,0,0,40,0,1 +39,1,247975,5,10,0,10,0,2,0,0,0,30,0,0 +55,2,50164,8,16,1,1,1,0,0,0,0,60,0,1 +24,0,123160,3,14,3,3,0,2,1,0,0,10,26,0 +53,2,79324,1,9,1,10,1,0,0,0,0,40,0,1 +44,2,129100,2,7,4,4,4,1,1,0,0,60,0,0 +40,2,210275,1,9,4,6,4,1,1,0,0,40,0,0 +48,2,189462,5,10,1,10,1,0,0,7688,0,40,0,1 +26,2,171114,9,11,4,0,4,0,1,0,0,35,0,0 +22,2,201799,1,9,0,5,3,0,1,0,0,40,0,0 +43,2,191149,1,9,2,1,0,0,1,0,0,40,0,0 +37,4,34173,1,9,1,4,2,0,1,0,0,25,0,0 +30,2,350979,1,9,1,10,1,2,0,0,0,40,17,0 +41,2,147314,1,9,1,5,1,3,0,0,0,50,0,0 +38,2,136081,10,15,1,3,1,0,0,0,0,60,0,1 +42,1,373403,1,9,1,7,1,0,0,0,0,50,0,0 +20,2,120601,1,9,0,6,3,1,0,0,0,40,0,0 +36,2,130926,0,13,2,0,0,0,1,3674,0,40,0,0 +32,3,72338,9,11,0,3,5,2,0,0,0,40,0,0 +27,2,129624,0,13,1,1,1,0,0,0,0,40,0,1 +25,0,328697,5,10,2,11,5,0,0,0,0,45,0,0 +40,2,191196,3,14,0,1,0,0,0,0,0,40,0,0 +49,2,110243,0,13,1,1,1,0,0,0,0,45,0,1 +17,2,181580,2,7,0,4,3,0,1,0,0,16,0,0 +29,2,89030,1,9,0,5,4,0,1,0,0,40,0,0 +47,2,345493,10,15,1,3,1,2,0,99999,0,55,18,1 +24,1,277700,5,10,4,2,3,0,0,0,0,45,0,0 +29,2,250679,1,9,0,10,0,0,0,0,0,40,0,0 +45,2,168837,5,10,1,0,2,0,1,0,0,24,8,1 +30,2,142675,14,8,1,10,1,0,0,0,0,50,0,0 +19,2,299050,5,10,0,0,3,0,0,0,0,20,0,0 +59,2,107833,12,6,1,6,1,0,0,0,1485,40,0,1 +47,2,121958,7,4,3,4,4,0,1,0,0,30,0,0 +41,2,282948,5,10,1,9,1,1,0,3137,0,40,0,0 +28,2,176683,6,12,0,3,3,0,0,0,0,40,23,0 +46,2,34377,6,12,1,10,1,0,0,0,0,40,0,1 +40,1,209833,5,10,1,10,1,0,0,0,0,60,0,0 +66,0,41506,12,6,2,4,0,1,1,0,0,40,0,0 +44,1,147206,5,10,0,10,3,0,0,0,0,12,0,0 +58,1,93664,1,9,1,1,1,0,0,15024,0,60,0,1 +21,2,315065,7,4,0,4,5,0,0,0,0,48,4,0 +59,2,381851,4,5,6,4,4,1,1,0,0,40,0,0 +35,4,185769,5,10,1,4,1,0,0,0,0,40,0,0 +45,2,186272,4,5,1,0,1,1,0,5178,0,40,0,1 +30,2,312667,1,9,1,6,1,0,0,0,0,40,0,0 +33,2,343925,1,9,0,2,0,1,0,0,0,40,2,0 +26,2,195994,5,10,0,5,0,0,1,0,0,15,0,0 +48,2,398843,5,10,4,5,4,1,1,0,0,35,0,0 +31,2,73514,1,9,0,5,3,2,1,0,0,40,0,0 +36,2,288049,1,9,1,1,1,0,0,0,0,45,0,0 +48,2,54759,1,9,2,3,4,0,1,0,0,38,0,0 +30,2,155343,1,9,1,10,1,0,0,5013,0,40,0,0 +33,2,401104,1,9,1,2,1,0,0,0,0,50,0,1 +53,2,113995,0,13,1,1,1,0,0,0,0,45,0,1 +38,2,111499,5,10,1,6,1,0,0,7298,0,50,0,1 +34,2,34374,5,10,0,4,0,0,0,0,0,50,0,0 +45,2,162187,0,13,1,5,1,0,0,0,0,52,0,1 +33,4,147654,9,11,1,3,1,0,0,0,0,60,0,0 +35,2,182467,9,11,1,10,2,0,1,0,0,44,0,0 +22,2,183970,1,9,0,2,3,1,0,0,0,40,0,0 +35,2,332588,1,9,2,4,4,0,1,0,0,30,0,0 +45,2,26781,1,9,1,3,1,3,0,0,0,8,0,0 +17,2,48610,2,7,0,7,3,0,0,0,0,45,0,0 +50,2,162632,1,9,1,1,1,0,0,0,0,45,0,0 +38,4,91711,0,13,1,3,1,0,0,0,0,50,0,1 +33,2,198003,5,10,1,10,1,0,0,7298,0,50,0,1 +25,2,262778,0,13,0,5,0,0,1,6849,0,50,0,0 +64,2,102470,1,9,1,10,1,0,0,0,0,40,0,0 +62,1,123170,5,10,1,1,1,0,0,0,0,10,0,0 +32,2,164243,1,9,1,9,1,0,0,0,0,60,0,1 +17,2,262511,2,7,0,5,3,0,0,0,0,20,0,0 +61,2,51170,1,9,1,10,1,0,0,0,0,55,0,0 +40,0,91949,8,16,0,3,0,1,1,0,0,40,0,0 +21,2,123727,1,9,0,1,5,0,1,0,0,40,0,0 +39,2,173175,0,13,1,1,1,0,0,15024,0,50,0,1 +35,1,120301,5,10,1,1,1,0,0,0,0,45,0,0 +29,2,250967,9,11,1,3,1,0,0,0,0,40,0,0 +27,3,285432,6,12,0,6,0,1,0,0,0,40,0,0 +20,2,36235,6,12,0,0,0,0,1,0,0,40,0,0 +51,4,110965,3,14,0,3,3,0,0,0,0,40,0,0 +45,2,123283,1,9,4,8,4,1,1,0,0,15,0,0 +31,2,152940,5,10,1,10,1,0,0,0,0,40,0,0 +29,2,376680,1,9,0,9,3,1,0,0,0,40,0,0 +56,2,231232,0,13,1,0,1,0,0,0,0,30,8,0 +55,1,168625,5,10,2,9,0,0,1,0,0,12,0,1 +26,2,33939,5,10,0,9,3,0,0,0,0,20,0,0 +46,2,155659,5,10,1,10,1,0,0,15024,0,45,0,1 +32,4,190228,1,9,1,4,1,0,0,0,0,40,0,0 +28,2,216178,1,9,1,5,1,0,0,0,0,40,0,0 +27,2,587310,7,4,0,4,5,0,0,0,0,35,24,0 +23,2,155919,4,5,3,10,0,0,0,0,0,40,4,0 +59,2,227386,12,6,1,10,1,0,0,0,0,40,0,0 +26,2,138152,14,8,0,10,5,4,0,0,0,48,24,0 +36,2,167482,12,6,0,2,0,0,0,0,0,40,0,0 +18,2,57957,1,9,0,5,3,0,1,0,0,15,0,0 +33,2,157747,4,5,2,2,0,0,0,0,0,70,0,0 +60,1,88570,9,11,1,6,2,0,1,0,0,15,9,1 +40,2,273308,1,9,2,8,4,0,1,0,0,48,4,0 +48,2,216292,1,9,1,7,1,0,0,0,0,43,0,0 +27,1,131298,12,6,1,10,1,0,0,0,0,48,0,0 +19,2,386378,5,10,0,4,3,0,0,0,0,20,0,0 +38,2,179668,0,13,1,3,1,0,0,0,0,50,0,1 +26,2,210812,5,10,2,10,0,0,0,0,0,43,0,0 +45,3,311671,9,11,1,11,1,0,0,3908,0,40,0,0 +20,2,215247,5,10,0,0,3,0,1,0,0,20,0,0 +32,3,125856,1,9,2,10,4,0,0,0,0,40,0,0 +22,2,74631,5,10,0,2,3,0,1,0,0,13,0,0 +22,2,24008,1,9,0,0,0,0,0,0,0,40,0,0 +38,0,354591,1,9,0,4,4,1,1,114,0,38,0,0 +34,2,155343,1,9,1,10,1,0,0,0,1848,50,0,1 +46,2,308334,15,2,6,4,4,4,1,0,0,30,4,0 +39,2,245361,0,13,2,1,0,0,1,0,0,25,0,0 +79,1,158319,1,9,6,4,0,0,1,0,0,24,0,0 +24,2,314823,1,9,0,5,3,0,0,0,0,40,21,0 +31,2,211334,5,10,1,10,1,0,0,2407,0,65,0,0 +37,1,73199,0,13,1,5,1,2,0,3137,0,77,36,0 +23,2,126550,1,9,0,10,5,0,0,0,0,40,0,0 +31,2,260782,5,10,1,6,1,0,0,0,1579,45,22,0 +29,2,114224,0,13,1,3,1,0,0,0,0,40,0,1 +22,0,64292,0,13,0,3,3,0,1,0,0,43,0,0 +55,4,219775,1,9,2,4,4,0,1,0,0,38,0,0 +43,2,212894,1,9,2,10,5,0,0,0,0,40,0,0 +23,2,260019,7,4,0,7,4,4,0,0,0,36,4,0 +29,2,228075,1,9,0,0,4,0,0,0,0,35,4,0 +22,2,239806,9,11,0,4,5,0,1,0,0,40,4,0 +22,2,324637,5,10,0,5,0,0,0,0,0,42,0,0 +25,2,163620,1,9,1,1,1,0,0,7298,0,84,0,1 +29,2,194200,5,10,0,8,3,0,0,0,0,45,0,0 +25,0,129200,5,10,0,6,0,1,0,0,0,40,0,0 +33,3,207172,1,9,0,1,0,0,1,0,0,40,0,0 +33,2,135312,0,13,0,3,0,0,0,0,0,40,0,1 +31,2,100734,8,16,0,3,0,0,1,0,0,28,0,0 +30,4,226443,3,14,1,3,1,0,0,0,1887,45,0,1 +55,2,110871,0,13,1,5,1,0,0,0,0,40,0,0 +36,2,192704,14,8,0,1,0,0,0,4650,0,50,0,0 +28,2,78870,0,13,0,5,0,0,0,8614,0,40,0,1 +42,2,107762,3,14,1,3,1,0,0,0,0,40,0,1 +51,2,183611,6,12,2,1,4,0,0,0,0,55,9,0 +62,4,249078,0,13,2,3,0,1,1,0,0,40,0,0 +65,5,208452,5,10,1,5,1,0,0,0,0,35,0,1 +23,2,302195,0,13,1,3,1,0,0,0,0,40,0,0 +47,2,379118,7,4,1,10,1,1,0,0,0,60,0,1 +50,5,174855,1,9,2,1,4,0,1,0,0,40,0,0 +32,1,39369,0,13,1,10,1,0,0,0,0,40,0,0 +37,3,196348,5,10,1,8,1,0,0,0,0,40,0,0 +31,2,340917,1,9,0,10,4,0,0,14344,0,40,0,1 +76,2,97077,12,6,6,5,4,1,1,0,0,12,0,0 +54,2,200098,0,13,2,5,0,1,1,0,0,60,0,0 +32,3,127651,0,13,1,3,1,0,0,0,0,40,0,1 +31,2,315128,5,10,0,0,0,0,1,0,0,52,0,0 +31,3,206823,0,13,2,11,0,0,0,0,0,50,0,1 +65,1,316093,10,15,2,3,0,0,0,0,1668,40,0,0 +30,2,112115,1,9,1,8,1,0,0,0,0,60,38,1 +21,2,250051,5,10,0,3,3,0,1,0,0,10,0,0 +40,3,298635,3,14,1,9,1,2,0,0,1902,40,11,1 +26,0,109193,5,10,0,10,0,0,1,0,0,40,0,0 +18,2,130849,2,7,0,4,3,0,1,0,0,8,0,0 +34,4,43959,1,9,1,4,1,0,0,0,0,50,0,0 +44,1,27242,5,10,0,7,3,0,0,0,0,60,0,0 +30,2,53158,6,12,0,9,0,0,1,0,0,40,0,0 +36,1,206520,0,13,0,10,3,0,0,0,0,40,0,0 +31,2,164190,5,10,1,3,1,0,0,0,0,50,0,1 +22,2,287988,5,10,0,5,0,0,0,0,0,20,0,0 +23,2,83891,1,9,0,5,3,2,0,0,0,40,0,0 +49,2,65087,3,14,1,1,1,0,0,15024,0,50,0,1 +39,1,363418,0,13,4,10,3,0,0,0,0,35,0,0 +19,2,278870,5,10,0,2,3,0,0,0,0,16,0,0 +30,2,174789,6,12,1,1,1,0,0,0,1848,50,0,1 +25,2,228608,5,10,0,10,5,2,1,0,0,40,14,0 +46,2,263568,1,9,1,8,1,0,0,0,0,40,0,0 +37,2,117381,3,14,1,3,1,0,0,0,0,45,0,0 +41,3,83411,1,9,1,4,1,0,0,0,0,40,0,0 +40,1,49156,5,10,1,3,1,0,0,0,0,20,0,0 +44,2,421449,1,9,2,0,4,0,1,0,0,40,0,0 +32,2,238944,1,9,1,8,1,0,0,0,0,40,0,0 +58,2,188982,1,9,1,2,1,1,0,0,0,20,0,1 +48,2,175925,1,9,1,8,1,0,0,0,0,48,0,0 +34,2,164190,0,13,1,1,1,0,0,0,0,40,0,0 +29,2,232914,9,11,0,0,3,1,1,0,0,40,0,0 +46,5,120121,0,13,1,5,1,0,0,0,0,50,0,1 +36,4,180805,1,9,0,6,0,2,0,0,0,40,0,0 +59,4,161944,0,13,0,0,0,0,0,0,0,38,0,0 +29,2,319149,14,8,1,6,1,0,0,0,0,40,4,0 +25,2,290528,1,9,1,8,1,0,0,0,0,40,0,0 +27,2,123984,6,12,0,4,0,2,1,0,0,35,11,0 +48,2,34186,1,9,1,7,1,0,0,0,0,70,0,0 +51,3,282680,8,16,0,3,0,0,1,0,1564,70,0,1 +36,2,183892,1,9,2,6,0,0,0,8614,0,45,0,1 +42,4,195124,2,7,2,5,4,0,0,7430,0,50,5,1 +49,0,55938,0,13,1,0,1,0,0,0,0,40,0,1 +33,2,209900,5,10,0,9,3,0,0,0,0,20,0,0 +40,2,179717,0,13,2,5,0,0,0,0,1564,60,0,1 +26,2,150361,0,13,0,3,0,0,1,0,0,40,0,0 +59,2,252714,1,9,1,8,1,0,0,0,0,30,25,0 +30,2,205204,1,9,0,0,3,0,1,0,0,40,0,0 +31,4,168906,6,12,1,0,2,0,1,0,0,35,0,0 +30,2,112115,0,13,1,1,1,0,0,0,0,50,0,1 +27,2,116531,0,13,0,1,0,0,1,0,0,40,0,0 +56,2,191917,6,12,2,0,4,0,1,4101,0,40,0,0 +24,2,341294,1,9,1,8,1,0,0,0,0,40,0,0 +47,2,216734,0,13,2,5,4,0,1,0,0,50,0,0 +51,2,182187,0,13,0,3,0,1,0,0,0,35,0,0 +34,2,424988,1,9,1,10,1,0,0,0,0,45,0,0 +47,2,379118,1,9,2,4,4,1,0,0,0,9,0,0 +47,2,168232,5,10,1,0,1,0,0,0,0,44,0,1 +20,2,147171,5,10,0,0,4,2,1,0,0,40,36,0 +31,2,193650,2,7,2,4,0,0,1,0,0,40,0,0 +42,2,200187,9,11,2,4,4,0,1,0,0,32,0,0 +52,2,188644,11,3,3,10,5,0,0,0,0,40,4,0 +56,2,398067,1,9,6,0,0,0,1,0,0,40,0,0 +53,2,29658,1,9,1,10,1,0,0,0,0,40,0,1 +26,2,154966,5,10,1,5,1,0,0,0,0,50,0,1 +81,2,364099,5,10,2,0,0,0,1,0,0,20,0,0 +57,3,97837,5,10,2,3,0,0,0,0,0,48,0,1 +34,2,117983,1,9,0,0,0,0,1,0,0,40,0,0 +24,2,64167,9,11,0,9,4,1,1,0,0,40,0,0 +20,2,315877,1,9,0,4,4,0,0,0,2001,40,0,0 +68,3,232151,5,10,2,0,5,1,1,2346,0,40,0,0 +60,2,225526,1,9,4,5,0,0,1,0,0,32,0,0 +37,3,289653,5,10,1,10,1,0,0,0,0,40,0,0 +25,2,179462,7,4,0,2,4,0,0,0,0,40,0,0 +36,3,67317,1,9,1,0,1,0,0,0,0,40,0,0 +45,2,77764,6,12,1,10,1,0,0,0,0,40,0,0 +34,2,253438,5,10,1,1,1,0,0,0,0,60,0,1 +31,2,150309,0,13,4,1,0,0,1,0,0,70,0,0 +47,1,83064,0,13,1,7,1,0,0,0,0,60,0,0 +60,1,376973,1,9,1,10,1,0,0,0,0,42,0,1 +75,2,311184,0,13,1,1,1,0,0,0,0,24,0,0 +43,4,159449,5,10,1,11,1,0,0,0,0,40,0,0 +18,2,168288,1,9,0,2,3,0,0,0,0,40,0,0 +25,2,74883,0,13,0,9,0,2,1,0,1092,40,11,0 +20,2,275190,1,9,0,0,3,0,1,0,0,40,0,0 +32,2,189838,1,9,0,5,0,0,1,0,0,50,0,0 +57,5,101338,0,13,1,1,1,0,0,0,0,20,0,0 +43,2,331894,5,10,1,6,1,0,0,0,0,60,0,1 +18,1,40293,1,9,0,7,5,0,0,0,0,40,0,0 +41,4,88904,0,13,4,3,4,1,1,0,0,40,0,0 +48,2,145041,1,9,0,8,5,0,0,0,0,40,21,0 +35,2,46385,1,9,1,6,1,0,0,5178,0,90,0,1 +41,0,363591,9,11,1,1,1,0,0,0,0,40,0,0 +23,2,183327,1,9,0,10,3,1,1,0,1594,20,0,0 +32,0,182556,0,13,1,11,1,0,0,0,1887,45,0,1 +33,2,267859,1,9,0,10,3,0,0,0,0,40,22,0 +58,2,190747,1,9,1,8,1,0,0,0,0,40,0,0 +22,2,162869,5,10,0,5,5,0,0,0,0,65,0,0 +33,2,141229,5,10,2,4,0,0,1,0,0,50,0,0 +42,1,174216,10,15,1,3,1,0,0,0,0,38,0,1 +25,2,366416,1,9,0,0,3,0,1,0,0,40,0,0 +39,2,172538,1,9,1,3,1,0,0,0,0,50,0,1 +35,2,193026,0,13,1,5,1,0,0,0,0,45,0,1 +50,2,184424,5,10,1,0,2,0,1,0,1902,38,0,1 +49,4,337768,3,14,1,1,1,0,0,0,0,50,0,1 +25,4,179059,0,13,0,3,3,0,0,0,0,40,0,0 +47,3,99549,5,10,2,0,4,1,1,0,0,40,0,0 +46,2,72619,5,10,1,1,2,0,1,0,0,40,0,1 +42,0,55764,6,12,2,3,0,1,0,0,0,40,0,0 +37,2,30267,2,7,0,6,0,0,0,0,0,60,0,1 +25,2,308144,0,13,0,10,0,0,0,0,0,40,4,0 +29,2,206351,12,6,1,10,1,0,0,5013,0,40,0,0 +26,2,282304,5,10,0,5,0,0,0,0,0,45,0,0 +45,5,142719,0,13,1,1,1,0,0,0,0,40,0,1 +34,2,114973,1,9,4,1,4,0,1,0,0,30,0,0 +33,3,159548,6,12,0,0,4,1,1,0,0,40,0,0 +43,2,91209,0,13,1,1,1,0,0,0,0,40,0,1 +28,2,196564,1,9,1,10,1,0,0,0,0,45,0,0 +51,1,149220,5,10,1,7,1,0,0,0,0,75,0,0 +21,2,169699,5,10,0,4,0,0,1,0,0,35,0,0 +23,2,218215,6,12,0,4,3,0,1,0,0,35,0,0 +30,2,156718,1,9,0,9,0,0,1,0,0,40,0,0 +46,2,55720,3,14,1,1,1,0,0,0,0,45,0,1 +38,5,257250,1,9,0,7,0,0,0,0,0,50,0,0 +20,2,194630,1,9,0,5,0,0,0,0,0,40,0,0 +36,2,398931,0,13,1,3,1,0,0,0,1485,50,0,1 +37,1,362062,10,15,1,3,1,0,0,99999,0,50,0,1 +44,4,101593,3,14,0,3,0,0,0,0,1876,42,0,0 +33,2,196266,1,9,1,10,1,0,0,0,0,40,0,1 +45,4,197332,0,13,0,1,0,0,0,0,0,40,0,0 +47,2,97842,5,10,1,10,1,0,0,0,0,40,0,0 +54,2,86837,1,9,1,10,1,2,0,0,1902,40,0,1 +17,2,57324,12,6,0,4,3,0,0,0,0,30,0,0 +43,2,116852,1,9,1,1,2,0,1,0,0,36,20,1 +45,2,154430,0,13,6,3,0,0,1,10520,0,50,0,1 +37,2,38468,5,10,0,0,0,0,1,0,0,40,0,0 +44,4,188808,9,11,1,10,1,0,0,0,0,40,0,1 +55,4,177163,3,14,6,3,4,0,1,914,0,50,0,0 +41,2,187322,1,9,1,8,1,0,0,0,0,48,0,0 +23,2,107578,0,13,0,0,3,0,1,2174,0,40,0,0 +38,2,168680,5,10,0,0,3,1,1,0,0,40,0,0 +23,2,256755,0,13,0,2,5,0,1,0,0,40,1,0 +35,2,360799,1,9,1,10,1,0,0,7298,0,40,0,1 +18,2,188476,2,7,0,1,3,0,0,0,0,20,0,0 +47,2,30457,9,11,1,4,1,0,0,0,0,40,0,0 +25,2,252752,5,10,0,3,0,0,1,0,0,8,0,0 +41,1,443508,1,9,1,1,1,0,0,0,0,50,0,0 +23,2,244408,5,10,0,0,5,2,1,0,0,24,36,0 +41,2,178983,1,9,1,0,2,0,1,0,0,40,0,0 +26,2,143068,5,10,1,1,1,0,0,2407,0,50,0,0 +30,4,247328,5,10,0,0,0,0,0,0,0,40,0,0 +42,2,201732,5,10,1,5,1,0,0,0,0,40,0,1 +35,2,246829,1,9,2,1,4,0,1,0,0,40,0,0 +29,2,119170,5,10,4,9,4,0,1,0,0,40,0,0 +21,2,207923,5,10,3,0,3,0,1,0,0,15,0,0 +48,0,170142,3,14,2,3,0,0,0,0,0,40,0,1 +44,1,187164,1,9,2,6,4,0,0,0,0,60,0,0 +34,4,303867,4,5,0,4,3,0,0,0,0,40,0,0 +19,2,291429,1,9,0,4,3,0,1,0,0,25,0,0 +32,2,213179,5,10,2,10,3,0,0,0,0,40,0,1 +31,0,111843,6,12,4,4,4,1,1,0,0,40,0,0 +25,2,297154,1,9,1,2,1,0,0,2407,0,40,0,0 +47,3,68493,1,9,1,0,1,1,0,0,0,40,0,1 +46,3,340718,2,7,6,0,0,0,1,0,0,40,0,0 +18,2,194059,14,8,0,0,3,0,0,0,0,40,0,0 +31,2,47296,5,10,1,0,2,0,1,0,1740,20,0,0 +28,0,286310,1,9,1,0,3,0,1,0,0,40,0,0 +38,2,207202,1,9,1,8,1,0,0,0,0,48,0,1 +33,5,132601,1,9,1,10,1,0,0,0,0,40,0,1 +41,2,160785,9,11,1,1,1,0,0,0,0,40,0,1 +46,2,117849,5,10,1,5,1,0,0,15024,0,40,0,1 +38,4,225605,5,10,1,3,1,0,0,0,0,44,0,0 +24,2,190290,0,13,0,5,0,0,0,0,0,60,0,0 +49,2,164799,1,9,1,8,1,0,0,0,0,40,0,1 +60,3,21876,5,10,2,3,0,3,1,0,0,40,0,0 +44,2,160785,0,13,1,5,1,0,0,0,0,60,0,1 +63,5,272425,9,11,1,1,1,0,0,0,0,40,0,1 +40,2,168538,1,9,1,5,1,0,0,0,0,60,0,1 +45,5,204205,5,10,1,1,1,0,0,0,0,50,0,1 +49,2,142287,5,10,1,0,1,0,0,0,1902,50,0,1 +36,2,169926,1,9,2,5,0,0,1,0,0,40,0,0 +65,4,205024,1,9,1,4,1,0,0,0,0,8,0,0 +41,2,374764,0,13,6,1,4,0,0,0,0,20,0,0 +25,2,108779,3,14,4,4,3,0,1,0,0,40,0,0 +60,2,227332,9,11,6,0,0,0,0,0,0,40,0,0 +17,4,246308,2,7,0,3,3,0,1,0,0,20,5,0 +28,2,51331,6,12,1,1,2,0,1,0,0,16,0,1 +31,2,153078,6,12,0,10,3,4,0,0,0,50,0,0 +47,2,169180,3,14,0,3,0,0,1,0,0,35,0,0 +45,1,193451,5,10,1,6,1,0,0,0,0,45,0,0 +51,2,305147,0,13,0,3,0,0,0,0,0,40,0,0 +23,2,138892,1,9,0,8,3,1,0,0,0,40,0,0 +44,1,402397,3,14,1,1,2,0,1,0,1902,60,0,1 +34,2,223267,1,9,0,1,5,0,0,0,0,50,0,0 +19,2,29250,5,10,0,3,3,0,0,0,0,10,0,0 +46,0,29696,1,9,1,6,1,0,0,0,0,40,0,0 +30,2,315640,8,16,1,3,1,2,0,0,1977,40,26,1 +37,2,632613,12,6,1,7,1,0,0,0,0,35,4,0 +56,2,282023,10,15,1,3,1,0,0,0,0,45,0,1 +29,2,77760,1,9,1,0,1,0,0,0,0,45,0,0 +46,1,148599,3,14,1,10,1,0,0,0,0,50,0,1 +55,2,414994,1,9,1,10,1,0,0,0,0,40,0,0 +45,2,339863,0,13,2,5,0,0,0,8614,0,48,0,1 +34,2,499249,1,9,3,2,0,0,0,0,0,40,24,0 +41,2,252058,0,13,0,0,0,0,0,0,0,40,0,0 +34,2,117963,10,15,1,3,1,0,0,0,0,50,0,1 +27,2,194652,1,9,0,10,3,1,0,0,0,40,0,0 +29,2,299705,5,10,0,2,4,1,0,0,0,37,0,0 +19,3,27433,14,8,0,4,3,0,1,0,0,30,0,0 +47,4,39986,0,13,1,3,1,0,0,0,0,40,0,0 +43,5,135342,5,10,1,1,1,0,0,0,0,50,0,1 +52,2,270142,9,11,4,1,4,1,1,0,0,60,0,0 +33,1,118267,6,12,2,5,0,0,0,0,0,60,0,0 +29,2,266043,4,5,1,6,1,0,0,0,0,40,0,0 +23,2,35633,1,9,1,2,1,0,0,0,0,40,0,0 +23,2,74568,5,10,0,1,0,0,0,0,0,40,0,0 +39,2,214816,0,13,1,1,1,0,0,0,0,60,0,0 +43,2,222971,11,3,0,8,4,0,1,0,0,40,4,0 +31,2,259425,1,9,1,10,1,0,0,0,0,40,0,1 +47,5,212120,1,9,1,10,1,0,0,0,0,40,0,1 +26,2,245880,1,9,0,0,0,0,0,0,0,60,0,0 +58,4,54947,5,10,0,3,0,0,1,0,0,55,0,0 +47,5,79627,10,15,2,3,0,0,0,27828,0,50,0,1 +55,2,151474,0,13,0,9,5,0,1,0,1590,38,0,0 +26,2,132661,1,9,1,1,2,0,1,5013,0,40,0,0 +28,2,161674,1,9,0,8,4,0,1,0,0,40,0,0 +36,2,62346,1,9,1,10,1,1,0,0,0,40,0,0 +40,2,227236,1,9,1,5,1,0,0,0,0,50,0,0 +19,2,283033,2,7,0,4,0,0,0,0,0,40,0,0 +63,1,298249,0,13,1,5,1,0,0,10605,0,40,0,1 +42,2,251229,0,13,1,6,1,0,0,0,0,40,0,0 +76,2,199949,4,5,1,11,1,0,0,0,0,13,0,0 +23,0,305498,9,11,0,9,0,0,1,0,0,40,0,0 +38,1,203836,11,3,0,6,0,0,0,0,0,40,0,0 +33,0,79440,3,14,0,3,0,2,0,0,0,30,28,0 +48,4,142719,3,14,1,3,1,0,0,0,0,40,0,1 +56,2,119859,5,10,2,6,0,0,0,0,0,40,0,1 +32,2,141410,1,9,1,8,1,1,0,0,0,40,0,0 +44,4,202872,5,10,2,3,4,0,1,0,0,25,0,0 +27,2,198813,1,9,2,0,3,1,1,0,0,40,0,0 +33,3,129707,5,10,0,1,0,0,0,0,0,50,0,0 +22,2,445758,11,3,0,2,0,0,0,0,0,40,4,0 +44,2,173981,1,9,1,10,1,0,0,0,0,40,0,0 +42,2,108506,1,9,1,6,1,3,0,0,0,60,0,0 +34,2,134886,5,10,0,0,0,0,1,0,0,40,0,0 +45,3,181970,1,9,1,0,1,0,0,0,1672,40,0,0 +57,5,282913,1,9,1,5,1,0,0,0,0,40,1,0 +59,4,196013,0,13,1,3,1,0,0,0,0,40,0,1 +33,3,348491,5,10,1,1,2,1,1,0,0,40,0,1 +52,2,416164,1,9,1,7,1,4,0,0,0,49,4,0 +17,2,121037,14,8,0,5,3,0,1,0,0,15,0,0 +29,2,103111,1,9,0,4,3,0,0,0,0,30,8,0 +63,1,147589,0,13,1,5,1,0,0,0,0,30,0,1 +20,2,24008,5,10,0,2,0,0,0,0,0,24,0,0 +42,5,123838,10,15,1,3,1,0,0,0,1977,50,0,1 +50,1,175456,1,9,1,7,1,0,0,0,0,50,0,0 +55,2,84774,1,9,1,13,2,0,1,0,0,30,0,0 +27,2,194590,6,12,1,0,2,1,1,0,0,25,0,0 +28,2,134566,0,13,1,1,1,0,0,0,0,45,0,0 +55,2,211678,9,11,1,8,1,0,0,0,0,45,0,0 +44,3,44822,5,10,1,10,1,0,0,0,0,40,0,0 +53,0,144586,5,10,0,11,0,0,1,0,0,40,0,0 +23,2,119156,1,9,1,10,1,0,0,0,0,40,0,0 +25,2,371987,1,9,2,0,0,0,1,0,0,40,0,0 +44,0,144125,0,13,2,3,0,0,1,0,0,40,0,0 +55,2,31905,3,14,1,1,1,0,0,0,1977,40,0,1 +48,1,121124,5,10,1,3,1,0,0,0,0,35,0,1 +46,2,58126,1,9,1,10,1,0,0,0,0,40,0,0 +26,2,318518,5,10,0,6,0,0,0,0,0,40,0,0 +30,2,296509,7,4,4,7,0,0,0,0,0,45,4,0 +32,2,473133,3,14,1,3,1,0,0,0,0,40,0,1 +52,2,155434,1,9,1,1,1,0,0,0,0,48,0,0 +52,2,99185,1,9,1,5,1,0,0,7298,0,50,0,1 +39,2,56648,1,9,4,5,0,0,1,0,0,47,0,0 +57,4,118481,0,13,1,3,1,0,0,0,1902,40,0,1 +21,2,321666,1,9,0,10,3,0,0,594,0,40,0,0 +22,0,119838,5,10,0,4,3,0,0,0,0,10,0,0 +26,2,330695,5,10,1,8,1,0,0,0,0,40,0,0 +26,0,58039,5,10,1,4,1,0,0,0,0,40,0,0 +44,2,313022,9,11,1,1,1,1,0,0,0,40,0,1 +42,2,178134,5,10,2,0,0,0,1,0,0,30,0,0 +40,2,165309,5,10,1,6,1,0,0,0,0,43,0,0 +22,2,216181,2,7,0,10,3,0,0,0,0,45,0,0 +62,2,178745,1,9,1,10,1,0,0,0,0,45,0,1 +44,2,111067,5,10,1,10,1,0,0,0,0,40,0,0 +33,1,295591,15,2,3,10,0,0,0,0,0,40,4,0 +45,2,123075,1,9,1,1,1,0,0,0,0,50,0,0 +18,2,78045,2,7,1,2,3,0,0,0,0,40,0,0 +32,4,255004,5,10,0,10,0,0,0,0,0,40,0,0 +33,2,254221,8,16,0,3,0,0,1,0,0,60,0,1 +20,2,174714,5,10,0,3,3,0,0,0,0,15,0,0 +68,1,450580,1,9,1,7,1,0,0,0,0,20,0,0 +61,2,128230,7,4,1,5,1,0,0,0,0,50,0,1 +48,2,192894,8,16,1,3,1,0,0,0,0,40,0,1 +45,2,325390,1,9,1,5,1,0,0,0,0,40,0,0 +36,1,20333,1,9,1,5,2,0,1,7688,0,40,0,1 +32,3,128714,1,9,0,4,3,1,1,0,0,32,0,0 +35,2,170797,0,13,2,4,0,0,1,0,0,40,0,0 +39,2,269186,1,9,1,10,1,0,0,0,0,40,0,0 +53,2,127671,7,4,1,8,1,0,0,0,0,40,0,0 +30,2,211840,5,10,4,5,4,1,1,0,0,16,0,0 +40,2,201495,0,13,2,11,0,0,0,0,0,45,0,0 +25,2,251854,5,10,0,0,0,1,1,0,0,40,2,0 +41,2,279297,1,9,0,5,0,1,1,0,0,60,0,0 +52,1,195462,1,9,1,7,1,0,0,0,0,98,0,1 +33,2,170769,1,9,1,10,1,0,0,0,0,40,0,0 +28,2,142443,1,9,0,10,3,0,0,0,0,40,0,0 +25,1,182809,1,9,1,10,1,0,0,7298,0,40,0,1 +53,2,121441,5,10,1,5,1,0,0,0,0,55,0,0 +44,2,275094,15,2,0,4,3,0,0,0,0,10,0,0 +35,2,170263,1,9,2,1,4,0,1,0,0,40,0,0 +38,2,172571,5,10,2,10,3,0,0,0,0,58,12,0 +34,2,178615,1,9,1,8,1,0,0,0,0,40,0,0 +33,2,279524,1,9,2,8,0,0,1,0,0,40,0,0 +24,0,165201,5,10,1,0,2,0,1,0,0,45,0,0 +65,4,323006,1,9,6,4,4,1,1,0,0,25,0,0 +29,2,235168,6,12,1,5,1,0,0,0,0,60,0,0 +39,5,114844,10,15,1,3,1,0,0,99999,0,65,0,1 +46,4,216414,5,10,1,11,1,0,0,0,0,40,0,1 +37,2,34378,7,4,1,7,1,0,0,2580,0,60,0,0 +47,0,80914,3,14,1,1,1,0,0,0,0,47,0,1 +62,2,73292,5,10,1,4,1,0,0,0,0,40,0,0 +54,1,212165,1,9,1,5,1,0,0,0,0,60,0,0 +90,2,52386,5,10,0,4,0,2,0,0,0,35,0,0 +33,2,205649,6,12,3,10,0,0,0,0,0,20,0,0 +57,2,109638,5,10,1,1,1,0,0,0,1672,45,0,0 +25,2,200408,6,12,0,10,3,0,0,0,0,40,0,0 +44,5,187720,5,10,1,5,1,0,0,0,0,50,0,1 +52,2,236180,0,13,3,4,0,0,0,0,0,50,0,0 +21,2,118693,5,10,0,8,3,0,0,0,0,40,0,0 +31,2,363130,1,9,0,4,4,1,0,0,0,18,0,0 +39,2,225544,3,14,1,6,1,0,0,0,0,40,12,0 +59,3,243612,1,9,6,8,4,0,1,0,0,40,0,0 +29,1,160786,1,9,1,1,1,0,0,0,0,55,0,0 +49,2,234320,7,4,0,3,5,1,0,0,0,45,0,0 +34,2,314646,4,5,1,10,1,0,0,0,0,40,0,0 +22,2,124971,0,13,0,5,0,0,0,0,0,40,0,0 +32,2,209184,0,13,1,5,1,4,0,0,0,40,5,0 +39,0,121838,1,9,2,4,4,1,1,0,0,40,0,0 +46,2,265275,3,14,1,3,1,0,0,0,0,60,0,0 +50,2,71417,1,9,1,10,1,0,0,3103,0,40,0,1 +34,2,45522,1,9,0,4,0,0,0,0,0,40,0,0 +28,4,250135,3,14,1,3,2,0,1,0,1902,55,0,0 +18,2,120283,14,8,0,5,3,0,1,0,0,24,0,0 +20,2,216972,1,9,0,5,0,0,0,0,0,30,0,0 +20,2,116791,1,9,0,8,5,0,1,0,0,40,0,0 +55,0,26290,9,11,6,1,0,3,1,0,0,38,0,0 +22,2,216134,5,10,0,5,3,1,1,0,0,40,0,0 +60,1,143932,3,14,1,1,1,0,0,0,0,40,0,0 +40,2,217120,12,6,2,10,0,0,0,0,0,50,0,0 +47,0,223944,5,10,1,0,2,0,1,0,0,30,0,0 +23,2,185452,0,13,0,1,0,0,1,0,0,35,8,0 +57,4,44273,1,9,6,6,0,0,1,0,0,40,0,0 +52,2,178983,2,7,1,4,1,0,0,0,0,40,0,0 +42,2,219288,7,4,6,10,4,0,0,0,0,40,0,0 +25,2,349190,6,12,0,2,3,0,0,0,0,20,0,0 +49,5,158685,1,9,1,0,2,0,1,0,2377,40,0,1 +41,3,57924,5,10,0,11,3,0,0,0,0,40,0,0 +40,0,270324,9,11,1,4,1,1,0,0,0,30,0,0 +38,2,33001,0,13,1,1,1,0,0,0,0,55,0,1 +58,2,204021,1,9,0,6,3,0,0,0,0,40,8,0 +26,2,192506,0,13,0,4,0,1,1,0,0,35,0,0 +57,2,372967,12,6,2,0,5,0,1,0,0,70,9,0 +28,2,273929,1,9,1,5,1,0,0,0,1628,60,0,0 +42,2,195821,1,9,4,5,4,0,1,0,0,40,0,0 +28,2,56179,5,10,0,1,0,0,0,2174,0,55,0,0 +39,1,124090,4,5,1,10,1,0,0,0,0,40,0,0 +28,2,199600,1,9,1,8,1,1,0,0,0,40,0,0 +42,2,255847,1,9,1,8,1,0,0,4386,0,48,0,1 +51,1,218311,5,10,2,5,4,0,1,0,0,50,0,0 +27,2,167336,5,10,0,0,0,0,1,0,0,39,0,0 +41,2,59938,1,9,2,0,4,0,1,0,0,43,0,0 +28,2,263728,0,13,1,10,1,0,0,0,0,40,0,0 +54,1,278230,5,10,2,7,4,0,1,10520,0,30,0,1 +49,2,43910,1,9,1,0,2,0,1,0,0,30,0,0 +47,2,190139,3,14,1,1,1,0,0,0,0,40,0,1 +27,2,109001,5,10,1,10,1,0,0,0,0,49,0,0 +42,4,159931,0,13,1,3,2,0,1,0,0,45,0,1 +32,2,194987,1,9,1,0,2,1,1,0,0,40,0,0 +32,4,87310,1,9,1,4,1,0,0,0,0,41,0,0 +27,2,133937,3,14,0,5,3,0,0,0,0,40,0,0 +29,2,207064,1,9,1,10,1,0,0,0,0,40,0,1 +22,2,36011,9,11,0,3,0,0,0,0,0,30,0,0 +41,3,168294,1,9,1,0,1,0,0,5178,0,40,0,1 +49,4,194895,5,10,1,2,1,0,0,7298,0,40,0,1 +58,1,49884,1,9,1,7,1,0,0,0,0,50,0,0 +41,1,27305,1,9,1,7,1,0,0,7688,0,40,0,1 +26,2,229977,4,5,1,10,1,0,0,0,0,35,0,0 +21,2,64520,1,9,0,5,0,0,0,0,0,55,0,0 +37,2,305379,0,13,1,1,1,0,0,0,0,50,0,1 +23,2,202284,0,13,0,5,3,0,0,0,0,20,0,0 +42,1,99185,5,10,1,1,1,0,0,0,0,40,0,1 +25,2,159662,1,9,1,5,3,0,0,0,0,26,0,1 +67,2,197865,5,10,2,0,0,0,1,0,0,40,0,0 +41,4,175149,1,9,2,6,0,1,1,0,0,38,0,0 +49,4,349633,3,14,1,3,2,0,1,0,0,50,0,1 +18,2,242893,2,7,0,10,3,0,0,0,0,35,0,0 +25,2,218667,11,3,1,2,3,0,0,0,0,40,0,0 +43,0,144811,10,15,2,3,0,0,0,0,0,50,0,0 +38,2,146091,8,16,1,1,2,0,1,99999,0,36,0,1 +65,1,226215,0,13,1,5,1,0,0,0,0,15,0,0 +66,2,114447,9,11,6,3,0,0,1,0,0,35,0,0 +33,2,124187,2,7,0,6,0,1,0,0,0,60,0,0 +51,2,147954,1,9,1,0,2,1,1,3411,0,38,0,0 +27,5,64379,1,9,1,10,1,0,0,0,1740,40,0,0 +17,2,156501,14,8,0,4,3,0,1,0,0,16,0,0 +32,2,207668,0,13,1,1,1,0,0,15024,0,45,0,1 +38,2,225707,1,9,1,8,1,0,0,0,0,40,1,1 +43,4,115603,5,10,2,0,4,0,1,0,0,40,0,0 +40,0,506329,8,16,1,3,1,2,0,0,0,40,18,1 +63,2,275034,0,13,1,5,1,0,0,0,1740,35,0,0 +42,2,56483,6,12,2,0,4,0,1,0,0,40,0,0 +43,3,144778,0,13,0,1,0,0,0,0,0,40,0,1 +41,4,297248,10,15,1,3,1,0,0,0,2415,45,0,1 +17,2,137042,12,6,0,3,3,0,0,0,0,20,0,0 +30,1,33308,1,9,0,10,0,0,0,0,0,40,0,0 +30,2,158420,0,13,0,3,0,0,0,0,0,50,10,0 +22,2,41763,5,10,0,4,0,0,0,0,0,25,0,0 +28,2,149734,1,9,0,4,4,1,1,0,0,52,0,0 +24,2,349691,5,10,0,5,5,1,1,0,0,40,0,0 +47,2,185385,12,6,1,8,1,0,0,0,0,40,0,1 +34,1,174463,9,11,0,7,0,0,0,0,0,50,0,0 +26,2,236068,5,10,0,5,5,0,1,0,0,20,0,0 +25,2,91334,9,11,1,1,1,0,0,0,0,75,0,0 +28,2,33895,0,13,0,5,0,0,0,0,0,45,0,0 +36,2,214816,1,9,0,10,0,0,1,0,0,40,0,0 +24,2,229773,0,13,0,1,0,0,0,0,0,40,0,0 +51,5,166386,0,13,1,1,2,2,1,0,0,35,18,0 +44,2,266135,0,13,1,3,1,0,0,0,0,50,0,1 +18,2,300379,14,8,0,0,3,0,0,0,0,12,0,0 +54,3,392502,5,10,1,3,1,0,0,0,0,40,0,1 +61,2,73809,5,10,2,0,0,0,1,0,0,40,0,0 +51,2,193720,0,13,1,1,1,0,0,0,0,45,0,1 +43,2,316183,7,4,1,8,1,0,0,0,0,40,0,0 +51,2,162944,1,9,1,10,1,0,0,0,0,40,0,0 +50,4,186888,1,9,1,1,2,1,1,0,0,40,0,1 +24,2,192017,5,10,1,2,1,0,0,0,0,30,0,0 +20,0,161978,5,10,1,4,1,0,0,0,0,20,0,0 +52,2,202930,0,13,2,1,0,0,0,0,0,40,0,1 +57,4,323309,7,4,2,4,0,0,0,0,0,40,0,0 +49,5,197332,5,10,1,5,1,0,0,0,0,60,0,0 +22,2,271274,2,7,0,5,0,0,1,0,0,40,0,0 +38,2,174242,5,10,1,9,1,0,0,0,0,40,0,1 +21,2,209483,5,10,0,5,3,0,1,0,0,20,0,0 +39,3,99146,0,13,1,11,1,0,0,0,1887,60,0,1 +52,1,102346,5,10,0,3,3,0,1,0,0,35,0,0 +25,2,181666,6,12,0,9,3,0,1,0,0,40,0,0 +50,2,207367,5,10,3,4,0,0,1,0,0,40,1,0 +35,0,82622,5,10,1,1,1,0,0,0,0,80,0,0 +50,2,202296,9,11,4,3,4,0,1,0,0,40,0,0 +58,2,142182,1,9,1,10,1,0,0,0,0,25,0,0 +48,3,94342,0,13,2,1,0,0,0,0,0,45,0,0 +30,2,41493,5,10,2,0,0,0,1,0,0,35,8,0 +18,2,181712,2,7,0,2,3,0,0,0,0,12,0,0 +29,1,164607,1,9,1,10,1,0,0,0,0,40,0,0 +52,1,41496,5,10,1,5,1,0,0,0,0,45,0,0 +63,2,143098,1,9,1,5,1,0,0,4064,0,40,0,0 +36,4,196529,3,14,1,3,2,0,1,0,0,40,0,1 +24,2,157332,5,10,0,8,3,0,1,0,0,42,0,0 +30,4,154935,6,12,0,11,0,1,0,0,0,40,0,0 +23,2,223231,1,9,1,8,1,4,0,0,0,40,4,0 +21,2,362589,0,13,0,4,3,0,1,0,0,20,0,0 +28,2,94880,5,10,0,10,0,0,0,0,0,43,4,0 +20,2,309580,1,9,0,0,3,0,0,0,0,40,0,0 +18,2,130389,2,7,0,4,3,0,0,0,0,20,32,0 +21,2,349365,5,10,0,0,3,0,1,0,0,15,0,0 +27,2,376936,1,9,0,10,0,0,0,0,0,40,0,0 +42,2,179557,5,10,2,9,0,0,1,0,0,40,0,0 +21,2,105577,5,10,0,4,3,0,1,0,0,30,0,0 +51,2,224207,5,10,1,5,1,0,0,0,0,40,0,1 +27,3,47907,0,13,0,0,0,0,1,0,0,40,0,0 +23,1,191283,1,9,0,6,3,0,0,0,0,40,0,0 +57,2,20953,5,10,1,5,1,0,0,0,1902,40,0,1 +22,0,186569,0,13,0,3,3,0,1,0,0,12,0,0 +59,2,43221,4,5,1,6,1,0,0,0,0,60,0,1 +38,2,161141,1,9,2,6,0,0,0,0,0,40,0,0 +20,2,203003,1,9,0,6,5,0,0,0,0,40,0,0 +90,2,141758,4,5,0,0,0,0,1,0,0,40,0,0 +35,2,113322,9,11,1,5,1,0,0,0,0,40,0,0 +50,2,343847,1,9,1,11,1,0,0,0,0,38,0,1 +45,2,214068,8,16,1,3,1,0,0,0,0,50,0,1 +44,2,116632,3,14,1,1,1,0,0,0,0,50,0,1 +23,2,240160,6,12,0,3,3,0,0,0,0,40,0,0 +34,2,516337,2,7,1,2,1,0,0,0,0,40,4,0 +23,5,284651,0,13,2,5,0,0,1,0,0,43,0,0 +39,0,141420,5,10,1,11,1,0,0,0,0,40,0,0 +19,2,42750,5,10,0,2,0,0,0,0,0,55,0,0 +54,2,165278,5,10,1,1,1,0,0,0,0,40,0,1 +40,2,167265,3,14,2,3,0,0,0,0,0,43,0,0 +44,2,139907,5,10,0,5,3,0,0,0,0,50,0,0 +31,5,236415,5,10,1,0,2,0,1,0,0,20,0,1 +25,2,312966,4,5,4,2,5,0,0,0,0,40,22,0 +33,2,118941,0,13,1,1,2,0,1,0,0,32,0,1 +32,2,198068,1,9,0,6,0,0,0,0,0,60,0,0 +36,2,373952,12,6,1,8,1,0,0,0,0,40,0,0 +47,1,236111,5,10,1,3,1,4,0,0,0,55,0,1 +80,2,157778,3,14,6,3,0,0,1,0,0,10,0,0 +21,2,143604,5,10,0,5,3,0,1,0,0,8,0,0 +35,1,319831,5,10,1,7,1,0,0,0,0,60,0,0 +30,2,137606,1,9,1,6,1,0,0,5013,0,40,0,0 +49,2,268234,7,4,1,2,1,0,0,0,0,40,0,0 +33,2,100135,1,9,1,0,2,0,1,0,1740,25,0,0 +53,1,34973,5,10,1,7,1,0,0,0,0,45,0,0 +41,2,323790,1,9,2,2,4,0,0,0,0,55,0,0 +57,2,319733,0,13,1,8,1,0,0,0,0,40,12,1 +19,2,125591,5,10,0,4,3,0,1,0,0,40,0,0 +28,2,60772,0,13,0,1,3,0,1,0,0,45,0,0 +42,3,74680,3,14,2,0,0,0,0,0,2001,60,0,0 +29,1,141185,5,10,1,7,1,0,0,0,0,55,0,0 +26,2,273792,5,10,0,4,3,0,0,0,0,20,0,0 +40,2,343068,5,10,2,1,0,0,1,0,0,40,0,0 +36,1,177907,8,16,0,3,0,0,0,0,0,40,0,1 +28,2,144063,1,9,1,1,1,0,0,0,0,40,0,0 +25,1,257574,0,13,0,0,0,1,1,0,0,20,0,0 +42,1,67065,1,9,1,7,1,0,0,0,0,60,0,0 +32,2,183356,1,9,0,10,3,0,0,0,0,40,0,0 +32,2,152940,6,12,0,0,3,0,0,0,0,30,0,0 +37,2,227128,11,3,1,10,1,0,0,0,0,40,0,0 +39,4,45607,1,9,1,11,1,0,0,0,0,56,0,0 +49,2,155489,0,13,1,10,1,0,0,0,0,40,0,0 +19,2,165115,1,9,0,5,0,0,1,0,0,40,0,0 +31,2,49923,1,9,1,6,1,0,0,0,0,40,0,0 +40,2,272240,1,9,2,8,0,0,1,0,0,40,0,0 +29,2,255476,7,4,0,2,3,0,0,0,0,30,4,0 +59,2,194290,1,9,1,7,1,0,0,0,0,48,0,0 +52,2,145548,6,12,1,11,1,0,0,0,0,40,0,1 +27,2,175262,0,13,0,1,3,0,0,0,0,40,0,0 +45,4,37306,0,13,1,3,1,0,0,0,0,45,0,1 +58,2,137547,0,13,1,4,1,2,0,0,0,40,27,0 +53,2,276515,0,13,0,1,3,0,0,0,0,40,1,0 +23,2,174626,1,9,0,2,3,0,0,0,0,25,0,0 +35,2,215310,2,7,2,2,5,0,0,0,0,40,0,0 +49,2,332355,1,9,1,1,1,0,0,0,0,40,0,0 +49,2,204057,6,12,2,1,0,0,1,0,0,40,0,0 +25,2,391591,14,8,0,10,0,0,0,0,0,40,0,0 +47,2,169092,3,14,2,3,4,0,1,0,0,50,0,1 +28,2,230743,6,12,2,0,0,0,1,0,0,40,0,0 +20,2,190963,5,10,0,1,0,0,1,0,0,30,0,0 +19,2,169853,1,9,0,8,3,0,0,0,0,24,0,0 +28,2,212091,1,9,1,8,1,0,0,2580,0,40,0,0 +31,2,202822,5,10,2,0,4,1,1,0,0,40,0,0 +30,2,140011,9,11,1,2,1,0,0,0,0,53,0,0 +23,2,224424,0,13,0,4,3,0,0,0,0,40,0,0 +25,2,168943,0,13,1,1,2,0,1,0,0,30,0,1 +19,2,571853,1,9,0,4,3,0,0,0,0,30,0,0 +30,2,156464,3,14,0,3,0,0,0,0,0,45,0,1 +26,2,108542,1,9,0,10,3,0,0,0,0,35,0,0 +34,4,194325,1,9,1,6,1,0,0,0,0,45,0,0 +49,2,114797,0,13,2,1,4,1,1,0,0,40,0,0 +35,2,40135,5,10,1,2,1,0,0,0,2042,40,0,0 +38,2,204756,1,9,0,5,3,0,1,0,0,40,0,0 +36,2,228190,1,9,1,2,1,1,0,0,0,20,0,0 +33,2,163392,1,9,1,3,1,3,0,0,0,48,0,1 +54,2,138845,5,10,0,4,0,0,1,0,0,40,0,0 +19,4,169853,1,9,0,10,3,0,0,0,0,40,0,0 +60,2,224097,1,9,1,10,1,0,0,0,0,40,0,0 +28,1,160786,1,9,0,10,3,0,0,0,0,40,0,0 +43,1,190044,1,9,1,5,1,0,0,0,0,40,0,0 +49,4,145290,11,3,1,4,1,0,0,0,0,40,0,0 +25,2,120268,0,13,0,3,3,0,0,0,0,70,0,0 +17,2,327434,12,6,0,5,3,0,0,0,0,20,0,0 +41,5,218302,0,13,1,5,1,0,0,0,0,60,0,1 +30,2,1184622,5,10,1,6,1,1,0,0,0,35,0,0 +90,4,227796,3,14,1,1,1,0,0,20051,0,60,0,1 +25,2,206343,1,9,0,11,5,0,0,0,0,40,0,0 +27,2,36851,9,11,1,5,1,0,0,0,0,35,0,0 +29,2,148550,1,9,1,10,1,0,0,0,0,40,0,0 +31,3,142470,0,13,0,1,0,1,1,0,0,40,0,0 +43,2,86750,9,11,1,10,1,0,0,0,0,99,0,0 +63,2,361631,3,14,4,3,0,0,1,0,0,40,0,1 +46,2,163229,7,4,1,6,1,0,0,0,0,40,0,0 +59,2,179594,1,9,1,5,1,0,0,0,0,40,0,0 +42,2,254773,0,13,1,1,2,1,1,0,0,50,0,1 +26,2,58065,0,13,0,0,0,0,1,0,0,20,0,0 +26,2,205428,5,10,1,5,1,0,0,0,0,45,0,0 +61,2,173924,4,5,2,2,0,0,0,0,0,40,5,1 +23,0,142547,1,9,1,1,1,0,0,0,0,40,0,0 +24,2,119704,1,9,1,0,2,0,1,0,0,40,0,0 +35,2,275364,0,13,2,9,4,0,0,7430,0,40,9,1 +42,1,207392,1,9,1,5,1,0,0,0,0,12,0,0 +31,2,147215,14,8,2,4,4,0,1,0,0,21,0,0 +31,2,101562,1,9,1,8,2,0,1,0,0,55,0,0 +63,2,216413,0,13,6,0,0,0,1,0,0,25,0,0 +29,0,188986,9,11,0,9,0,0,1,0,1590,64,0,0 +43,0,52849,0,13,1,3,1,0,0,0,0,40,0,0 +22,2,304710,0,13,0,0,0,2,1,0,0,10,36,0 +17,2,265657,2,7,0,4,3,0,0,0,0,25,0,0 +23,1,258298,0,13,0,0,3,0,0,0,2231,40,0,1 +35,2,360814,4,5,2,10,0,0,0,0,0,45,0,0 +32,2,53260,1,9,2,4,4,4,1,0,0,28,0,0 +50,5,127315,0,13,1,1,1,0,0,15024,0,60,0,1 +26,4,197530,3,14,3,3,0,0,1,0,0,40,0,0 +32,2,340940,0,13,1,1,1,0,0,0,0,40,0,0 +29,2,88432,9,11,1,10,1,0,0,0,0,50,0,0 +57,2,183810,5,10,1,3,1,0,0,0,0,40,0,1 +90,2,51744,3,14,0,1,0,1,0,0,0,50,0,1 +35,2,175614,9,11,2,3,4,0,1,0,0,40,0,1 +31,1,235237,5,10,1,5,1,1,0,0,0,60,0,1 +60,2,227266,1,9,2,5,0,0,1,0,0,33,0,0 +21,2,146499,9,11,1,0,5,0,1,0,1579,40,0,0 +71,4,337064,3,14,6,3,0,0,1,0,0,40,0,0 +22,2,141003,9,11,0,4,3,0,0,0,0,30,0,0 +50,4,117791,1,9,2,0,0,0,1,0,0,40,0,0 +37,2,172846,5,10,1,5,1,0,0,0,0,45,0,1 +23,2,73514,1,9,0,0,3,2,1,0,0,40,36,0 +74,2,211075,1,9,1,4,1,0,0,0,0,30,0,0 +67,2,197816,5,10,1,5,1,0,0,0,1844,70,0,0 +59,2,43221,5,10,1,10,1,0,0,0,0,43,0,1 +28,2,183780,1,9,1,6,1,0,0,0,1740,40,0,0 +45,2,26781,1,9,1,7,1,3,0,0,0,40,0,0 +63,1,271550,5,10,1,7,1,0,0,0,0,20,0,0 +39,2,250157,0,13,0,3,0,0,1,0,0,63,0,0 +33,0,913447,5,10,2,4,4,1,1,0,0,40,0,0 +32,2,153078,0,13,0,4,0,2,0,0,0,40,27,0 +34,2,181091,0,13,1,1,1,0,0,0,1977,45,0,1 +39,2,231491,1,9,0,2,5,0,0,0,0,40,0,0 +29,0,95423,3,14,1,0,1,0,0,0,0,36,0,0 +22,2,234663,1,9,1,8,1,0,0,0,0,40,0,0 +53,2,283602,0,13,2,5,0,0,1,13550,0,43,0,1 +46,2,328669,9,11,1,10,1,0,0,0,0,42,0,0 +51,2,143741,5,10,1,4,2,0,1,0,0,40,0,1 +44,2,83508,10,15,2,3,0,0,1,2354,0,99,0,0 +56,0,81954,1,9,2,0,0,0,1,0,0,40,0,0 +27,2,261375,0,13,0,0,3,1,1,0,0,40,0,0 +52,2,310045,4,5,3,8,0,2,1,0,0,30,26,0 +39,2,316211,0,13,0,3,0,0,0,0,0,40,0,1 +45,3,88564,5,10,1,1,1,0,0,7688,0,40,0,1 +37,2,61299,5,10,1,10,1,0,0,0,0,45,0,0 +33,2,113364,1,9,2,0,3,0,0,0,0,40,0,0 +46,2,267107,11,3,1,10,2,0,1,0,0,45,25,0 +35,2,48123,14,8,1,10,2,0,1,0,0,50,0,0 +33,2,214635,1,9,1,1,1,1,0,0,0,50,0,0 +48,2,115585,0,13,1,5,1,0,0,0,0,40,0,0 +32,2,194141,1,9,2,8,3,0,0,0,0,50,0,0 +20,2,89991,5,10,0,4,3,0,1,0,0,32,0,0 +35,2,101709,1,9,0,6,3,2,0,0,0,60,0,0 +19,2,237455,1,9,0,2,3,0,1,0,0,25,0,0 +56,2,28729,2,7,4,8,0,0,1,0,0,40,0,0 +28,2,153475,0,13,0,0,3,0,1,0,0,16,22,0 +45,2,275517,1,9,2,10,4,0,1,0,0,40,0,0 +32,2,128002,9,11,1,0,2,0,1,0,0,45,0,0 +44,2,175485,0,13,1,10,1,0,0,0,0,12,0,0 +55,2,189664,1,9,1,3,1,0,0,0,0,40,0,1 +34,2,209808,5,10,1,0,1,0,0,0,0,40,0,1 +33,2,176992,3,14,1,3,1,0,0,0,0,40,0,1 +36,2,154669,0,13,0,1,3,0,0,0,0,55,0,0 +25,2,191271,1,9,0,0,3,0,1,0,0,40,0,0 +28,2,375482,0,13,0,5,0,0,0,0,0,40,0,0 +39,2,102953,0,13,1,5,1,0,0,7298,0,55,0,1 +53,2,169182,12,6,3,8,0,0,1,0,0,40,13,0 +47,2,184005,1,9,2,1,0,3,1,3325,0,45,0,0 +49,5,30751,9,11,2,1,0,0,0,0,0,60,0,0 +22,2,145477,1,9,0,2,3,3,0,0,0,40,0,0 +31,2,91964,5,10,0,0,5,0,0,0,0,40,0,0 +44,5,49249,5,10,2,4,4,0,0,0,0,80,0,0 +19,2,218956,1,9,0,3,3,0,0,0,0,40,0,0 +37,1,241306,1,9,2,10,0,0,0,0,0,40,0,0 +23,2,319842,5,10,0,2,3,0,0,0,0,25,0,0 +44,2,332401,10,15,1,3,1,0,0,99999,0,65,0,1 +54,4,182388,1,9,1,4,2,0,1,0,0,35,0,0 +23,2,205939,1,9,1,10,1,0,0,0,0,38,0,0 +21,2,203914,5,10,0,4,3,0,1,0,0,10,0,0 +19,0,156294,5,10,0,3,3,0,0,0,0,25,0,0 +51,2,254211,0,13,1,10,1,0,0,0,0,20,0,1 +41,2,151504,0,13,1,1,1,0,0,7688,0,50,0,1 +61,2,85548,5,10,1,9,1,0,0,15024,0,18,0,1 +19,1,30800,12,6,3,0,4,3,1,0,0,40,0,0 +22,2,131230,0,13,0,5,3,0,0,0,0,40,0,0 +22,2,61850,1,9,0,4,0,0,1,0,0,40,0,0 +49,2,227800,7,4,1,3,1,0,0,0,0,32,0,0 +35,2,133454,12,6,2,8,0,0,0,0,0,50,0,0 +38,2,104094,5,10,1,5,1,0,0,0,0,40,0,0 +29,2,105422,1,9,1,3,1,0,0,0,0,40,0,1 +56,2,142182,9,11,1,10,1,0,0,0,0,45,0,1 +41,2,336643,5,10,2,1,0,0,1,0,0,80,0,0 +62,5,200577,3,14,1,5,1,0,0,0,0,45,0,1 +27,2,208703,1,9,0,11,3,0,0,0,0,40,28,0 +25,2,272428,1,9,0,5,0,0,0,4416,0,42,0,0 +33,2,56701,0,13,1,3,1,0,0,15024,0,75,0,1 +26,2,288592,1,9,0,0,0,0,1,0,0,40,0,0 +43,2,266439,1,9,2,8,0,0,0,0,0,45,0,0 +53,3,276868,3,14,1,0,1,0,0,0,0,40,0,1 +43,2,131435,0,13,2,4,0,0,1,0,0,40,0,0 +56,2,175127,1,9,2,10,4,0,0,0,0,35,0,0 +25,2,277444,0,13,1,5,1,0,0,0,0,50,0,0 +60,2,63296,3,14,2,3,5,1,0,0,0,40,0,0 +28,2,96337,5,10,0,0,0,0,1,0,0,40,0,0 +21,2,221955,1,9,0,8,4,0,0,0,0,40,4,0 +40,2,197923,0,13,0,0,4,1,1,2977,0,40,0,0 +29,2,632593,1,9,1,10,1,1,0,0,0,40,0,0 +20,2,205970,5,10,0,10,3,0,1,0,0,25,0,0 +25,2,139730,1,9,1,10,1,0,0,0,0,80,0,1 +18,2,201901,2,7,0,5,3,0,1,0,0,10,0,0 +32,0,230224,6,12,1,4,1,0,0,0,0,35,0,0 +27,2,113464,15,2,0,4,3,4,0,0,0,35,21,0 +48,2,94461,1,9,6,8,0,0,1,0,0,16,0,0 +20,2,271379,5,10,0,5,3,0,1,0,0,25,0,0 +55,2,231738,1,9,2,5,0,0,1,0,0,40,7,0 +33,4,198183,0,13,0,3,0,0,1,0,0,50,0,1 +21,0,140764,5,10,0,0,3,0,1,0,0,12,0,0 +43,1,183479,1,9,1,10,1,0,0,0,0,30,0,0 +35,2,165767,5,10,1,8,1,0,0,0,0,40,0,0 +39,4,139364,0,13,1,3,1,0,0,0,0,35,0,1 +19,2,227491,1,9,0,5,0,2,1,0,0,40,0,0 +25,2,222254,1,9,0,4,0,1,1,0,0,40,0,0 +44,2,193494,5,10,1,6,1,0,0,0,0,72,0,1 +27,2,29261,6,12,0,10,4,0,0,0,0,40,0,0 +39,2,174368,1,9,1,0,2,0,1,0,0,40,0,1 +69,2,108196,12,6,0,10,5,0,0,0,0,40,0,0 +34,2,110622,0,13,0,1,0,2,1,0,0,40,11,0 +37,2,130277,11,3,4,4,4,0,1,0,0,40,0,0 +43,4,98130,0,13,2,3,3,0,1,0,0,39,0,0 +34,0,595000,3,14,1,3,2,1,1,0,0,40,0,1 +31,1,349148,5,10,1,8,1,0,0,0,0,48,0,0 +42,0,117583,8,16,2,3,0,0,1,8614,0,60,0,1 +26,2,164583,1,9,2,5,4,0,1,0,0,30,0,0 +39,2,340091,5,10,4,4,4,0,1,0,0,75,0,0 +25,2,49092,0,13,0,4,3,0,0,0,0,40,0,0 +54,4,186884,5,10,1,6,1,1,0,0,0,30,0,0 +44,0,167265,3,14,1,3,1,0,0,0,0,60,0,1 +34,0,34104,3,14,1,3,1,0,0,7688,0,38,0,1 +21,5,265116,5,10,0,1,0,0,0,0,0,40,0,0 +33,2,158416,1,9,0,8,0,0,0,0,0,40,0,0 +40,5,169878,6,12,1,1,2,0,1,0,0,40,0,1 +44,2,296728,3,14,1,1,1,0,0,0,0,40,0,1 +33,4,342458,6,12,2,11,0,0,0,0,0,56,0,0 +21,4,38771,5,10,0,0,3,0,0,0,0,40,0,0 +35,1,269300,0,13,0,4,0,1,1,0,0,60,0,0 +43,2,111483,5,10,1,5,1,0,0,7298,0,40,0,1 +51,4,33863,3,14,1,3,1,0,0,0,0,45,0,0 +29,2,132874,1,9,1,10,1,0,0,0,0,40,0,0 +51,4,277024,1,9,4,11,0,1,0,0,0,40,0,0 +35,2,112160,1,9,1,5,1,0,0,0,0,40,0,0 +18,2,703067,2,7,0,5,3,0,0,0,0,20,0,0 +58,2,127264,12,6,1,10,1,0,0,0,0,50,0,0 +57,5,257200,5,10,1,1,1,0,0,0,0,40,0,1 +19,2,57206,1,9,0,5,3,0,1,0,0,20,0,0 +37,2,201319,5,10,4,4,4,0,1,0,0,40,0,0 +38,2,114079,1,9,1,5,1,0,0,0,0,44,0,0 +45,2,230979,5,10,3,0,0,0,1,0,0,40,0,0 +27,2,292472,5,10,1,3,1,2,0,0,0,40,14,1 +38,4,134444,5,10,1,11,1,0,0,0,0,72,0,0 +30,2,172403,1,9,2,10,0,0,0,0,0,30,0,0 +46,2,191357,0,13,1,9,1,0,0,0,0,40,0,0 +60,2,389254,1,9,1,5,1,0,0,0,0,40,0,1 +30,2,303867,1,9,4,6,0,0,0,0,0,44,0,0 +47,2,164113,5,10,1,10,1,1,0,7688,0,40,0,1 +39,2,111499,0,13,0,1,0,0,1,0,0,40,0,0 +42,2,266084,5,10,1,10,1,0,0,7298,0,45,0,1 +27,2,61580,5,10,2,0,5,0,1,0,0,40,0,0 +44,2,231348,5,10,2,5,0,0,0,0,0,40,0,0 +33,2,164748,0,13,1,6,1,0,0,0,0,40,0,0 +54,2,205337,0,13,0,1,0,0,0,0,0,50,0,1 +58,1,54566,5,10,1,7,1,0,0,0,0,35,0,0 +45,2,34419,0,13,0,6,0,0,0,0,0,30,0,0 +59,2,116442,5,10,1,8,1,0,0,0,0,50,0,0 +29,2,290740,6,12,0,13,0,0,1,0,0,50,0,0 +27,2,255582,1,9,0,8,0,0,1,0,0,40,0,0 +44,2,112517,3,14,1,9,1,0,0,0,0,20,0,1 +44,2,169397,1,9,1,10,1,0,0,0,0,40,0,1 +33,2,172664,5,10,1,1,1,0,0,0,0,70,0,1 +27,2,329005,1,9,0,10,3,0,0,0,0,40,0,0 +33,2,123253,0,13,1,1,1,0,0,0,0,55,0,1 +55,2,81865,9,11,2,0,4,1,1,0,0,40,0,0 +32,1,173314,9,11,1,3,1,4,0,0,0,60,0,0 +31,2,34572,9,11,1,2,1,0,0,0,0,45,0,0 +57,5,159028,10,15,1,3,1,0,0,99999,0,60,0,1 +30,2,149184,0,13,1,1,1,0,0,0,0,45,0,1 +28,2,308709,0,13,0,5,0,0,1,0,0,48,0,0 +30,1,257295,5,10,0,5,5,2,0,0,2258,40,27,0 +29,2,168479,3,14,1,3,1,0,0,0,0,40,0,1 +66,2,142501,1,9,0,4,5,1,1,0,0,3,0,0 +60,2,338345,1,9,1,10,1,0,0,0,0,45,0,1 +31,2,177675,0,13,1,3,1,0,0,0,0,40,0,0 +26,2,262617,1,9,0,10,5,0,0,2597,0,40,0,0 +24,2,200997,1,9,0,2,3,0,0,0,0,45,0,0 +29,2,176683,0,13,0,5,0,0,0,0,0,50,0,1 +44,2,376072,1,9,1,9,1,0,0,0,0,45,0,1 +34,4,177675,0,13,1,1,1,0,0,0,0,55,0,1 +59,2,348430,0,13,1,3,1,0,0,0,1902,43,0,1 +23,2,320451,0,13,0,1,3,2,0,0,0,24,0,0 +23,2,38151,2,7,0,4,5,0,0,0,0,40,11,0 +55,4,123382,9,11,4,3,4,1,1,0,0,35,0,0 +39,5,151029,1,9,1,1,1,0,0,0,0,40,0,1 +39,2,484475,2,7,0,10,0,1,0,0,0,40,0,0 +57,2,329792,7,4,2,6,4,0,0,0,0,75,0,0 +35,2,148903,1,9,2,5,4,0,1,0,0,40,0,0 +39,4,301614,9,11,1,11,1,0,0,0,0,48,0,1 +47,2,176319,1,9,1,5,3,0,1,0,0,38,0,1 +53,0,53197,8,16,1,0,1,0,0,0,0,50,0,1 +23,2,291407,5,10,0,5,3,1,0,0,0,25,0,0 +35,2,204527,3,14,0,10,0,0,0,0,0,50,0,1 +44,2,476391,5,10,2,7,0,0,1,0,0,40,0,0 +28,2,224964,1,9,0,4,3,0,1,0,0,25,0,0 +26,2,306225,0,13,0,1,0,2,1,0,0,40,12,0 +23,2,292023,1,9,0,1,0,0,0,0,0,45,0,0 +32,2,94041,1,9,1,4,1,0,0,0,0,25,38,0 +49,5,187563,5,10,1,6,1,0,0,0,0,50,0,1 +36,2,176101,5,10,0,10,3,0,0,2174,0,60,0,0 +36,2,749105,1,9,2,4,4,0,1,0,0,36,0,0 +21,2,216070,6,12,1,0,2,3,1,0,0,46,0,1 +54,1,105010,0,13,1,1,1,0,0,0,0,40,0,1 +43,2,198203,5,10,3,4,0,1,1,0,0,40,0,0 +35,4,215419,5,10,2,0,4,0,1,0,0,40,0,0 +31,2,120460,5,10,1,7,1,0,0,0,0,50,0,1 +46,2,199316,5,10,1,10,5,2,0,0,0,40,3,0 +46,2,146919,1,9,4,5,0,0,1,0,0,40,0,0 +56,2,174744,1,9,1,4,1,0,0,0,0,40,0,0 +21,2,249957,1,9,0,0,3,0,0,0,0,40,0,0 +51,2,146574,3,14,1,1,1,0,0,0,0,50,0,1 +47,0,156417,5,10,2,3,4,0,0,0,0,20,0,0 +42,2,236110,11,3,3,10,0,0,0,0,0,40,5,0 +19,2,63363,5,10,0,5,3,0,1,0,0,30,0,0 +25,2,190107,0,13,0,10,3,0,0,0,0,40,0,0 +37,2,126569,3,14,1,9,1,0,0,0,0,60,0,1 +35,2,176756,14,8,1,4,1,1,0,0,0,40,0,0 +40,2,115161,1,9,1,6,1,0,0,0,0,30,0,0 +57,1,138892,2,7,1,5,1,0,0,0,0,15,0,0 +38,2,256864,1,9,1,9,1,0,0,0,0,50,0,1 +48,2,265083,12,6,2,5,0,0,1,0,0,38,0,0 +34,2,249948,5,10,2,4,0,0,1,0,0,34,0,0 +46,3,31141,5,10,2,6,0,0,0,0,0,40,0,0 +45,0,67544,3,14,2,11,0,0,0,0,0,50,0,0 +32,1,174789,0,13,1,3,1,0,0,0,0,50,0,1 +35,2,199753,1,9,0,8,3,0,0,0,0,48,0,0 +62,2,122246,5,10,0,10,0,0,1,8614,0,39,0,1 +50,2,96586,9,11,1,4,1,0,0,0,0,40,0,0 +25,2,189590,0,13,0,9,0,0,0,0,0,40,0,0 +41,2,140590,5,10,0,5,0,1,0,0,0,33,0,0 +35,2,255702,1,9,0,4,3,0,1,0,0,27,0,0 +33,2,260782,5,10,1,10,1,0,0,0,0,41,0,1 +38,2,169926,6,12,1,1,2,0,1,0,1902,40,0,1 +37,0,151322,0,13,0,3,0,0,0,0,0,40,0,0 +56,2,192869,1,9,1,8,1,0,0,0,0,40,0,1 +19,2,93604,7,4,0,10,3,0,0,0,1602,32,0,0 +31,2,86958,4,5,1,1,2,0,1,0,0,40,0,0 +33,2,192644,1,9,4,2,4,0,0,0,0,35,5,0 +72,2,284080,15,2,2,4,0,1,0,0,0,40,0,0 +54,2,43269,1,9,1,6,1,0,0,0,0,50,0,1 +30,2,190040,0,13,0,8,0,0,1,0,0,40,0,0 +51,2,306108,8,16,0,3,0,0,0,0,0,40,0,1 +30,2,220148,1,9,1,10,1,0,0,0,1848,50,0,1 +30,2,381645,0,13,0,3,0,0,0,0,0,50,0,0 +32,2,216361,5,10,1,11,1,1,0,0,0,16,0,0 +30,2,213722,5,10,0,5,0,0,0,0,0,50,0,1 +35,2,112271,3,14,1,0,1,0,0,0,0,40,0,0 +40,2,208277,5,10,2,0,3,0,1,0,0,44,0,1 +38,0,352628,0,13,2,3,0,0,1,0,0,40,0,0 +19,2,129620,12,6,0,4,5,0,1,0,0,30,0,0 +32,2,249550,5,10,0,3,0,0,0,0,0,44,0,0 +49,2,178749,3,14,3,0,4,0,1,0,0,40,0,0 +60,2,167670,0,13,1,3,1,0,0,0,0,35,0,0 +60,2,81578,4,5,1,5,1,0,0,0,0,40,0,0 +55,2,160662,8,16,1,1,1,0,0,0,0,80,0,1 +24,2,152189,1,9,0,10,3,0,0,0,0,40,0,0 +53,2,106176,3,14,1,5,1,0,0,7298,0,60,0,1 +69,0,159191,5,10,6,0,0,0,1,0,810,38,0,0 +41,2,78410,1,9,1,0,2,0,1,0,0,40,0,1 +32,2,131379,1,9,0,4,3,0,1,0,0,40,0,0 +45,2,166929,2,7,1,10,1,0,0,0,0,40,0,0 +59,2,380357,0,13,2,1,0,0,0,0,0,40,0,0 +31,2,79190,1,9,0,4,3,0,1,0,0,35,0,0 +40,2,342164,1,9,4,0,4,0,1,0,0,37,0,0 +44,2,182616,9,11,1,9,1,0,0,0,0,40,0,1 +63,2,339473,5,10,2,5,0,0,1,0,0,60,0,0 +31,4,381153,5,10,1,11,1,0,0,15024,0,56,0,1 +51,2,300816,0,13,0,0,4,0,0,0,0,20,0,0 +51,2,240988,2,7,1,8,1,2,0,0,0,40,11,0 +23,2,149224,1,9,0,5,0,0,0,0,0,40,0,0 +49,2,168216,7,4,1,8,1,0,0,0,0,48,0,0 +56,2,286487,1,9,1,10,1,0,0,2885,0,45,0,0 +39,2,305597,1,9,1,10,1,0,0,0,0,40,0,1 +39,1,109766,10,15,1,3,1,0,0,15024,0,50,0,1 +30,1,188798,1,9,2,4,4,0,1,0,0,40,0,0 +43,1,240170,0,13,1,1,1,0,0,0,0,50,9,0 +31,2,459465,5,10,0,10,0,0,0,0,0,50,0,0 +44,4,162506,3,14,1,3,1,0,0,0,0,35,0,0 +43,1,145441,10,15,1,3,1,0,0,0,0,30,0,1 +41,2,27444,5,10,1,0,1,0,0,0,0,46,0,1 +43,2,195258,1,9,1,0,1,0,0,0,0,40,0,1 +47,0,55272,5,10,1,10,1,0,0,0,0,40,0,1 +38,1,164526,10,15,0,3,0,0,0,0,2824,45,0,1 +46,2,27802,9,11,1,8,1,0,0,0,0,40,0,0 +19,0,165289,5,10,0,4,3,0,1,0,0,40,0,0 +19,2,274657,11,3,0,4,0,0,0,0,0,50,24,0 +24,2,317175,0,13,1,5,1,0,0,0,0,45,0,1 +39,5,163237,5,10,1,7,1,0,0,0,0,65,0,0 +37,2,170408,9,11,2,8,0,0,1,0,0,30,0,0 +40,2,76625,1,9,2,10,4,0,0,0,0,40,0,0 +27,2,366066,6,12,0,5,3,0,1,0,0,40,0,0 +22,2,349368,1,9,0,0,5,0,1,0,0,40,0,0 +21,2,286824,5,10,0,2,3,0,0,0,0,12,0,0 +32,2,373263,1,9,1,1,2,0,1,0,0,40,0,0 +20,2,161978,1,9,4,8,3,0,0,0,0,40,0,0 +45,2,543922,3,14,2,6,0,0,0,14344,0,48,0,1 +46,4,109089,10,15,1,11,1,0,0,0,0,40,0,1 +46,2,110151,9,11,2,1,4,0,1,0,0,45,0,0 +26,2,34110,5,10,0,11,0,0,0,0,0,44,0,0 +47,1,118506,0,13,1,1,3,0,0,0,0,60,0,0 +22,2,117789,5,10,0,3,3,0,1,0,0,10,0,0 +34,1,353881,1,9,1,1,1,0,0,0,0,60,0,0 +49,2,200471,15,2,1,10,1,0,0,0,0,40,20,0 +20,2,258517,5,10,0,2,3,0,0,0,0,25,0,0 +28,2,190367,1,9,1,8,1,0,0,0,0,45,0,0 +30,2,174704,2,7,1,8,1,1,0,0,0,40,0,0 +23,2,179413,1,9,1,10,1,0,0,0,0,40,0,0 +20,2,329530,4,5,0,13,3,0,0,0,0,40,4,0 +31,2,273818,5,10,1,4,1,0,0,0,0,55,4,0 +46,2,256522,15,2,0,8,3,0,0,0,0,40,5,0 +42,2,196001,1,9,4,0,4,0,1,0,0,40,0,0 +60,1,282660,7,4,1,10,1,0,0,0,0,40,0,0 +30,2,72630,0,13,0,3,0,0,0,0,0,50,0,0 +27,2,50295,5,10,1,6,1,0,0,0,0,48,0,0 +20,2,203240,4,5,0,5,3,0,1,0,0,32,0,0 +56,1,172618,0,13,1,3,1,0,0,7688,0,40,0,1 +41,2,202168,5,10,1,1,1,0,0,0,0,60,0,1 +61,2,176839,1,9,1,8,1,0,0,0,0,40,0,0 +47,2,176140,1,9,2,1,4,1,1,0,0,40,0,1 +60,2,39952,4,5,1,8,1,0,0,2228,0,37,0,0 +33,2,292465,4,5,1,8,1,0,0,0,0,50,0,0 +48,2,355320,0,13,1,3,1,0,0,0,0,45,8,1 +56,2,182460,1,9,1,2,1,0,0,0,0,40,0,1 +50,2,69345,9,11,1,6,1,0,0,3103,0,55,0,1 +57,1,102058,3,14,1,3,1,0,0,0,0,40,0,1 +20,2,165804,5,10,0,0,3,4,1,0,0,40,0,0 +46,2,318259,9,11,2,9,5,0,1,0,0,36,0,0 +21,2,117606,5,10,0,3,0,0,1,0,0,40,0,0 +37,2,170718,1,9,1,1,1,0,0,0,0,40,0,0 +42,2,413297,5,10,1,9,1,0,0,0,0,40,0,0 +20,2,190457,1,9,0,4,3,0,1,0,0,30,0,0 +54,2,88278,8,16,1,3,1,0,0,0,1977,50,0,1 +32,4,217296,1,9,1,6,2,0,1,4064,0,22,0,0 +50,2,123429,5,10,1,10,1,0,0,0,0,40,0,1 +49,3,420282,5,10,0,0,4,1,1,0,0,40,0,0 +48,2,498325,6,12,1,6,1,0,0,0,0,50,0,0 +24,2,248533,5,10,0,5,5,1,1,0,0,40,0,0 +46,2,137354,3,14,1,9,1,2,0,0,0,40,11,1 +42,2,272910,1,9,2,4,0,0,1,0,0,40,0,0 +52,5,206054,5,10,1,10,1,0,0,0,0,40,0,0 +58,4,92141,6,12,6,0,0,1,1,0,0,40,0,0 +37,2,163199,5,10,2,9,0,3,1,0,0,40,0,0 +34,2,195860,1,9,1,10,1,0,0,0,0,40,0,0 +26,2,115717,5,10,1,0,1,0,0,0,2051,40,0,0 +18,2,120029,5,10,0,0,5,0,1,0,0,20,0,0 +33,2,221762,5,10,0,3,0,1,0,0,0,40,0,0 +41,2,342164,5,10,2,5,0,0,1,0,0,15,0,0 +21,2,176356,6,12,0,0,3,0,1,0,0,20,0,0 +23,2,133239,9,11,0,9,0,0,1,0,0,40,0,0 +26,3,169101,5,10,0,9,3,0,1,0,0,40,0,0 +33,2,159442,0,13,1,4,2,0,1,0,0,40,0,0 +24,2,174461,5,10,0,1,3,0,1,0,0,45,0,0 +43,2,361280,12,6,1,10,1,2,0,0,0,42,26,0 +52,0,447579,1,9,2,0,0,0,1,0,0,40,7,0 +61,2,248448,7,4,2,4,4,0,1,0,0,40,0,0 +35,2,161141,1,9,1,8,1,0,0,0,0,40,0,0 +35,2,212465,1,9,1,10,1,0,0,0,0,40,0,1 +45,5,170871,1,9,1,1,1,0,0,15024,0,55,0,1 +43,4,233865,1,9,1,1,1,0,0,0,0,40,0,1 +51,2,163052,1,9,1,11,1,0,0,0,0,40,0,1 +35,2,348690,0,13,1,6,1,0,0,0,0,40,0,0 +47,3,34845,0,13,1,0,1,0,0,0,0,45,9,1 +22,2,206861,5,10,0,0,3,0,0,0,0,40,0,0 +49,5,349230,9,11,1,1,1,0,0,0,0,60,0,1 +20,2,130840,1,9,0,10,3,0,0,0,0,20,0,0 +19,2,415354,12,6,2,4,0,0,1,0,0,40,0,0 +27,2,132191,1,9,0,10,0,0,0,0,0,40,0,0 +42,2,202466,6,12,2,3,4,0,1,0,0,45,0,0 +23,1,236804,5,10,0,7,3,0,0,0,0,35,0,0 +20,2,107658,5,10,0,9,0,0,1,0,0,10,0,0 +47,2,102771,1,9,1,6,1,0,0,0,0,50,0,0 +17,2,221403,14,8,0,4,3,1,0,0,0,18,0,0 +39,2,52645,5,10,2,5,4,0,1,0,0,40,0,0 +25,2,276310,4,5,1,8,1,0,0,0,0,40,4,0 +31,2,134613,9,11,1,1,2,1,1,0,0,43,0,0 +44,2,215479,1,9,2,6,0,1,0,0,0,20,19,0 +53,2,266529,9,11,1,1,1,0,0,0,0,40,0,1 +34,2,265807,5,10,4,10,0,0,0,0,0,45,0,0 +45,1,67716,5,10,1,1,1,0,0,0,0,60,0,0 +34,2,178951,1,9,1,5,1,0,0,0,0,45,0,0 +35,2,241126,3,14,1,5,1,0,0,0,0,40,0,1 +36,2,176544,5,10,0,4,0,0,0,0,0,48,0,0 +45,2,169180,5,10,6,4,4,0,1,0,0,45,0,0 +37,1,282461,5,10,1,1,1,0,0,0,0,60,0,0 +53,2,157069,6,12,1,8,1,0,0,0,0,40,0,1 +35,2,99357,3,14,1,3,2,0,1,15024,0,50,0,1 +65,5,338316,5,10,1,5,1,0,0,0,0,40,0,0 +49,1,59612,12,6,2,7,4,0,0,0,0,70,0,0 +24,2,220426,1,9,0,2,0,0,0,0,0,40,0,0 +54,2,115912,5,10,1,10,1,0,0,0,0,40,0,0 +17,2,27032,12,6,0,5,3,0,1,0,0,12,0,0 +19,2,170720,14,8,0,4,3,0,0,0,0,16,0,0 +60,2,183162,1,9,6,8,0,0,1,0,0,40,0,0 +46,2,192360,0,13,1,1,1,0,0,0,0,35,0,1 +26,2,128553,5,10,0,1,3,1,1,0,0,40,0,0 +58,2,209423,15,2,1,4,1,0,0,0,0,38,1,0 +37,1,121510,1,9,2,1,4,0,0,0,0,55,0,0 +41,2,93793,3,14,1,3,1,0,0,0,0,38,0,1 +30,2,133602,0,13,2,1,0,0,0,0,0,40,0,0 +19,2,391329,5,10,0,0,0,0,1,0,0,30,0,0 +48,2,96359,0,13,1,1,1,0,0,0,0,60,34,1 +22,2,203894,5,10,0,6,0,0,1,0,0,24,0,0 +25,2,195994,15,2,0,13,0,0,1,0,0,40,24,0 +18,2,50879,12,6,0,4,3,0,0,0,0,6,0,0 +21,2,186849,1,9,0,2,3,0,0,0,0,40,0,0 +47,2,201127,5,10,1,6,1,0,0,0,0,50,0,0 +33,2,110998,1,9,0,4,5,3,1,0,0,36,0,0 +39,2,190466,1,9,2,10,3,0,0,2174,0,40,0,0 +67,1,173935,0,13,1,1,1,0,0,0,0,8,0,1 +19,2,167140,5,10,0,4,3,0,0,0,1602,24,0,0 +18,2,110230,12,6,0,4,3,0,0,0,0,11,0,0 +36,2,287658,1,9,0,0,3,1,0,0,0,40,0,0 +23,2,224954,5,10,0,8,3,0,0,0,0,25,0,0 +73,1,29306,1,9,1,7,1,0,0,0,0,40,0,0 +35,2,37314,5,10,1,10,1,0,0,5013,0,40,0,0 +31,2,420749,6,12,1,10,1,0,0,0,0,40,0,1 +20,2,482732,12,6,0,8,0,0,0,0,0,40,0,0 +20,2,206215,1,9,0,0,3,0,1,0,0,40,0,0 +27,2,101364,1,9,1,2,1,0,0,0,0,40,4,0 +66,5,185369,12,6,1,5,1,0,0,0,0,30,0,0 +66,2,216856,3,14,1,5,1,0,0,0,0,50,0,0 +64,2,256019,3,14,0,3,0,0,1,0,0,35,0,0 +48,2,348144,5,10,2,6,0,0,0,3325,0,53,0,0 +24,2,190293,0,13,0,3,0,0,1,0,0,40,0,0 +51,1,25932,1,9,1,7,1,0,0,0,0,60,0,0 +25,2,176729,0,13,1,10,1,0,0,0,0,60,0,1 +33,2,166961,2,7,4,5,3,0,1,0,0,20,0,0 +50,2,86373,1,9,1,8,1,0,0,0,0,50,0,0 +51,2,320513,7,4,3,10,0,1,0,0,0,50,21,0 +34,0,190290,0,13,1,3,1,0,0,0,0,38,0,1 +41,4,111891,7,4,0,4,4,1,1,0,0,40,0,0 +30,1,45796,5,10,1,8,1,0,0,0,0,40,0,0 +59,2,108496,5,10,2,10,0,0,0,2907,0,40,0,0 +41,1,120539,5,10,1,8,1,0,0,3103,0,40,0,1 +36,1,164526,3,14,0,5,0,0,0,10520,0,45,0,1 +37,2,323155,15,2,1,7,1,0,0,0,0,85,4,0 +28,2,65389,1,9,0,4,0,3,0,0,0,30,0,0 +19,2,414871,1,9,0,10,3,0,0,0,0,40,0,0 +28,2,161607,5,10,1,6,1,0,0,0,0,45,0,0 +62,2,224953,12,6,1,8,1,1,0,0,0,40,0,0 +36,2,261382,3,14,1,5,1,0,0,15024,0,45,0,1 +58,1,231818,12,6,0,10,0,0,0,0,0,40,34,0 +42,5,184018,1,9,2,5,4,0,0,1151,0,50,0,0 +43,5,133060,1,9,1,10,1,0,0,0,0,40,0,0 +29,2,35032,1,9,1,10,1,0,0,0,0,40,0,0 +32,0,304212,1,9,0,1,0,0,0,0,0,50,0,0 +64,4,50442,4,5,0,0,5,0,0,0,0,40,0,0 +39,2,146091,0,13,1,3,2,0,1,0,0,20,0,1 +26,2,267431,0,13,0,5,3,1,1,0,0,20,0,0 +19,2,121240,1,9,0,4,0,0,0,0,0,30,0,0 +21,2,192572,1,9,0,0,3,0,1,0,0,45,0,0 +32,2,211028,5,10,0,0,0,0,1,0,0,40,0,0 +30,4,346122,6,12,1,11,1,0,0,5013,0,45,0,0 +26,2,202203,0,13,0,0,5,0,1,0,0,50,0,0 +20,2,159297,5,10,0,0,3,2,1,0,0,15,0,0 +19,2,310158,5,10,0,6,3,0,0,0,0,30,0,0 +33,3,193246,0,13,1,0,1,0,0,0,0,42,0,1 +23,2,200089,5,10,1,10,5,0,0,0,0,40,22,0 +29,2,38353,1,9,1,10,1,0,0,0,0,45,0,0 +42,2,76280,1,9,1,1,2,0,1,0,0,40,0,0 +30,1,243665,1,9,1,5,1,0,0,0,0,50,0,0 +63,2,68872,1,9,1,6,2,2,1,0,0,20,0,0 +34,2,103596,1,9,1,2,1,0,0,0,0,40,0,0 +60,1,88055,5,10,1,10,1,0,0,0,0,24,0,0 +48,2,186203,1,9,1,4,1,0,0,0,0,50,0,0 +25,2,257910,0,13,0,1,0,0,0,0,0,50,0,0 +27,2,200227,9,11,1,0,2,1,1,0,0,40,0,0 +55,1,124975,1,9,2,10,4,0,0,27828,0,55,0,1 +32,2,227669,5,10,0,8,3,1,1,0,0,40,0,0 +22,2,117210,5,10,0,0,3,0,0,0,0,25,34,0 +25,2,76144,1,9,0,1,0,0,0,0,0,50,0,0 +18,2,98667,2,7,0,4,3,0,1,0,0,16,0,0 +24,4,155818,5,10,1,0,2,0,1,0,0,44,0,0 +29,2,283760,0,13,0,1,0,0,1,0,0,40,0,0 +39,2,186183,1,9,1,10,1,0,0,0,0,40,0,1 +33,5,202153,3,14,1,10,1,0,0,0,0,40,0,0 +57,2,365683,1,9,2,8,0,0,1,0,0,40,0,1 +22,2,187538,12,6,4,4,4,0,1,0,0,40,0,0 +33,2,126950,1,9,1,6,1,0,0,0,0,60,0,0 +42,2,110028,1,9,1,10,1,0,0,0,0,40,0,0 +43,2,104660,0,13,4,3,4,0,0,0,0,45,0,0 +57,1,437281,5,10,1,9,1,0,0,0,0,38,0,1 +42,2,259643,3,14,2,3,0,0,0,4650,0,40,0,0 +22,2,217961,5,10,0,6,3,0,0,0,1719,30,0,0 +42,1,120539,0,13,1,5,1,0,0,0,0,50,0,1 +39,2,25803,5,10,1,5,1,0,0,0,0,55,0,0 +41,2,63596,5,10,1,3,2,0,1,0,0,32,0,1 +20,4,325493,1,9,0,2,3,1,0,0,0,40,0,0 +47,2,211239,5,10,1,10,1,0,0,0,0,40,0,0 +44,2,206686,5,10,2,0,4,0,1,0,0,40,0,0 +29,2,427965,0,13,0,0,0,1,1,0,0,40,0,0 +52,2,218550,5,10,3,0,0,0,1,14084,0,16,0,1 +71,2,163385,5,10,6,5,0,0,0,0,0,35,0,1 +52,2,124993,1,9,0,10,3,0,0,0,0,55,0,0 +36,2,107410,1,9,1,5,1,0,0,0,0,40,0,0 +53,2,152373,5,10,2,10,0,0,0,0,0,48,0,1 +37,2,161226,1,9,1,4,2,0,1,0,0,30,0,1 +26,2,213799,12,6,0,2,0,0,0,0,0,40,0,0 +34,2,204461,0,13,1,3,1,0,0,0,0,55,0,1 +35,2,377798,0,13,0,3,0,0,0,0,0,50,0,1 +20,2,116375,4,5,0,5,3,0,1,0,0,40,0,0 +34,4,210164,5,10,1,10,1,0,0,0,1740,40,0,0 +56,1,258752,0,13,1,1,1,0,0,0,0,60,0,0 +39,2,327435,0,13,1,3,2,0,1,0,0,36,0,1 +24,2,301199,5,10,0,9,3,0,1,0,0,20,0,0 +24,2,186221,2,7,2,5,4,0,1,0,0,35,0,0 +23,2,203924,0,13,0,3,0,0,0,0,0,50,0,0 +27,2,192236,0,13,0,3,0,0,0,0,0,45,0,0 +25,2,152035,1,9,0,0,4,0,1,0,0,40,0,0 +29,2,201454,5,10,0,0,0,0,1,0,0,40,0,0 +42,2,156580,5,10,1,8,2,0,1,0,0,37,0,1 +51,2,115851,1,9,1,10,1,0,0,0,0,40,0,0 +31,2,106753,9,11,1,10,1,0,0,0,1740,40,0,0 +59,2,359292,15,2,1,8,1,0,0,0,0,40,4,0 +29,2,83003,1,9,1,4,2,0,1,0,0,40,0,0 +18,2,78817,1,9,0,0,3,0,1,0,0,20,0,0 +24,2,200967,1,9,1,10,2,0,1,0,0,36,0,0 +38,0,107164,5,10,4,1,3,0,0,0,0,40,0,0 +34,1,90614,1,9,4,1,0,0,0,0,0,50,0,0 +42,1,323790,0,13,1,1,1,0,0,0,1977,70,0,1 +45,1,242552,14,8,2,10,5,1,0,0,0,35,0,0 +21,2,90935,9,11,0,6,3,0,0,0,0,40,0,0 +64,5,165667,8,16,1,3,1,0,0,7688,0,60,8,1 +32,2,162604,1,9,0,8,5,1,0,0,0,40,0,0 +45,2,205424,0,13,0,3,0,0,0,0,0,40,0,1 +53,2,97411,11,3,1,8,1,2,0,0,0,40,17,0 +42,2,184857,1,9,1,10,1,0,0,0,0,16,0,0 +32,2,165226,1,9,2,4,0,0,1,0,0,40,0,0 +49,2,115784,1,9,1,8,1,0,0,0,0,40,0,0 +62,2,368476,11,3,1,7,1,0,0,0,0,24,4,0 +28,2,53063,0,13,1,1,1,0,0,0,0,45,0,0 +32,2,153471,1,9,0,7,0,0,0,0,0,35,0,0 +37,5,107164,12,6,0,6,0,0,0,0,2559,50,0,1 +38,2,180303,0,13,1,1,1,2,0,0,0,50,28,1 +44,4,236321,1,9,2,6,3,0,0,0,0,25,0,0 +19,2,141868,1,9,0,6,3,0,0,0,0,40,0,0 +24,2,203518,0,13,0,3,0,0,1,0,0,40,0,0 +58,2,119558,1,9,1,1,1,0,0,0,0,50,0,1 +56,2,108276,0,13,6,4,0,0,1,0,0,40,0,0 +37,2,385452,12,6,2,10,4,0,1,0,0,40,0,0 +43,2,162003,5,10,2,8,0,0,0,0,0,40,0,0 +32,2,349028,1,9,1,10,1,0,0,0,0,40,0,0 +34,2,45114,0,13,0,5,3,1,1,0,0,40,0,0 +44,2,112797,4,5,2,4,3,0,1,0,0,50,0,0 +28,2,183639,1,9,0,2,4,0,0,0,0,40,0,0 +35,2,177121,1,9,2,4,0,0,1,0,0,35,0,0 +38,2,239755,1,9,1,8,1,0,0,0,0,40,0,0 +26,2,150361,5,10,0,9,3,0,1,0,0,40,0,0 +20,2,293091,2,7,0,6,3,0,0,0,0,60,0,0 +24,2,200089,1,9,1,10,1,0,0,0,0,60,4,1 +40,2,91836,1,9,2,10,0,0,0,0,0,45,0,0 +23,2,324960,1,9,0,10,5,0,0,0,0,40,0,0 +79,4,84616,2,7,1,1,1,0,0,0,0,7,0,0 +44,2,252930,12,6,2,0,4,4,1,0,0,42,0,0 +51,2,44000,3,14,1,3,2,0,1,99999,0,50,0,1 +30,2,154843,1,9,1,8,1,0,0,0,0,40,0,0 +52,2,99307,6,12,1,5,1,0,0,3103,0,48,0,1 +33,2,93206,11,3,1,7,1,2,0,0,0,40,11,0 +50,2,100109,0,13,2,1,4,0,0,0,0,45,0,1 +51,2,114927,9,11,1,9,1,0,0,7298,0,40,0,1 +41,2,121287,1,9,0,8,0,0,0,0,0,40,0,0 +35,2,189916,0,13,1,5,2,0,1,0,0,30,0,1 +34,2,157747,5,10,1,1,1,0,0,7298,0,40,0,1 +28,2,39232,0,13,0,3,0,0,0,0,0,45,0,0 +31,5,133861,9,11,2,5,0,0,0,0,0,40,0,0 +22,2,505980,1,9,0,2,3,0,0,0,0,40,0,0 +65,2,193216,1,9,1,5,1,0,0,9386,0,40,0,1 +39,1,140752,1,9,1,5,1,0,0,0,0,50,0,1 +23,2,549349,5,10,0,9,3,0,0,0,0,40,0,0 +29,1,179008,6,12,1,5,1,0,0,0,0,50,0,0 +57,1,190554,12,6,2,1,3,0,0,0,0,60,0,1 +47,2,80924,5,10,6,4,0,0,1,0,0,35,0,0 +51,4,319054,1,9,1,6,1,1,0,0,0,60,0,0 +34,2,297094,1,9,1,2,1,1,0,0,0,40,0,0 +52,2,170562,1,9,1,1,1,0,0,0,0,60,0,1 +29,2,240738,1,9,1,3,1,0,0,0,0,40,0,1 +29,2,297544,1,9,1,10,1,0,0,0,0,40,0,0 +25,4,169905,5,10,1,7,1,0,0,0,0,40,0,0 +21,2,149637,5,10,0,4,0,0,1,0,0,40,0,0 +38,2,182526,0,13,3,3,0,0,1,0,0,40,0,0 +55,1,158315,1,9,1,5,1,0,0,0,0,50,0,1 +61,5,227232,0,13,4,5,0,0,1,0,0,30,0,0 +34,2,96483,6,12,0,0,0,2,1,8614,0,60,0,1 +41,2,286970,0,13,1,0,1,0,0,0,0,40,0,0 +27,4,223529,9,11,0,0,3,0,0,0,0,43,0,0 +78,1,316261,0,13,0,1,0,0,0,99999,0,20,0,1 +40,2,170214,1,9,1,6,1,0,0,0,0,40,0,1 +26,1,224361,7,4,1,6,1,0,0,0,0,75,0,0 +43,2,124919,1,9,1,4,1,2,0,0,0,60,28,0 +25,2,306352,9,11,1,9,1,0,0,0,0,40,4,0 +26,1,227858,5,10,0,4,0,0,1,0,0,48,0,0 +43,5,150533,1,9,1,5,1,0,0,0,0,68,0,1 +25,2,144478,5,10,0,4,3,0,0,0,0,40,12,0 +22,2,254547,5,10,0,0,5,1,1,0,0,30,2,0 +52,1,313243,1,9,1,10,1,0,0,0,0,55,0,1 +61,2,149981,1,9,1,0,2,0,1,2414,0,5,0,0 +42,2,125461,0,13,0,5,4,0,0,0,0,40,0,0 +21,2,306967,9,11,0,0,0,0,1,0,0,40,0,0 +44,2,192976,1,9,1,6,1,3,0,0,0,40,0,0 +65,2,192133,1,9,1,10,1,0,0,2290,0,40,34,0 +33,3,339388,6,12,2,4,4,0,0,0,0,40,0,0 +22,2,203240,12,6,0,0,0,0,1,0,0,40,0,0 +43,2,83827,1,9,2,8,0,0,1,0,0,24,0,0 +45,5,160440,1,9,2,1,0,0,0,0,0,42,0,0 +42,2,108502,1,9,2,5,0,0,1,0,0,42,0,0 +37,2,410913,1,9,3,7,4,4,0,0,0,40,4,0 +56,2,193818,4,5,2,10,0,0,0,0,0,40,0,0 +40,2,103789,6,12,2,0,4,1,1,0,0,32,0,0 +31,2,34572,0,13,1,5,1,0,0,0,0,55,0,0 +26,2,43408,0,13,1,3,1,0,0,0,0,40,0,0 +26,0,105787,0,13,0,3,3,0,0,0,0,40,0,0 +42,5,90693,0,13,1,1,1,0,0,0,0,70,0,0 +45,1,285575,1,9,1,1,1,2,0,0,0,40,26,0 +47,4,56482,5,10,1,3,1,1,0,7688,0,50,0,1 +22,2,496025,5,10,1,8,1,0,0,0,0,40,4,0 +33,2,382764,0,13,0,1,3,0,0,0,0,40,0,0 +37,2,259284,1,9,0,6,0,1,0,0,0,50,0,0 +48,1,185385,1,9,1,7,1,0,0,0,0,98,0,0 +57,1,286836,12,6,1,10,1,0,0,0,0,8,0,0 +47,2,139145,5,10,2,0,0,0,1,0,0,60,0,0 +58,4,44246,4,5,1,6,1,0,0,0,0,40,0,0 +55,2,169611,2,7,6,0,4,0,1,0,0,40,0,0 +52,2,133403,5,10,1,10,1,0,0,0,0,55,0,0 +29,2,187327,0,13,0,3,0,0,0,0,0,40,0,0 +42,2,180032,3,14,0,3,0,0,1,0,0,40,0,0 +23,2,46561,1,9,2,10,0,0,0,0,0,60,0,0 +23,2,86065,14,8,0,4,0,0,1,0,0,30,0,0 +46,1,256014,9,11,1,1,1,0,0,0,0,60,0,0 +30,2,188403,5,10,0,8,0,0,0,0,0,40,0,0 +43,1,396758,0,13,1,3,2,0,1,0,1887,70,0,1 +25,2,60485,5,10,0,0,3,0,1,0,0,30,0,0 +32,2,271276,1,9,1,6,1,0,0,0,0,80,0,1 +56,2,229525,4,5,1,6,1,1,0,0,0,40,0,0 +33,2,34574,1,9,1,6,1,0,0,0,0,43,0,0 +19,0,112432,5,10,0,0,3,0,0,0,0,10,0,0 +20,2,105312,5,10,0,5,3,0,1,0,0,18,0,0 +34,2,221396,5,10,1,0,1,0,0,0,0,40,0,0 +34,2,304872,4,5,2,4,4,0,1,0,0,40,0,0 +55,1,319733,1,9,1,10,1,0,0,0,0,40,0,0 +55,2,176012,4,5,1,9,2,0,1,0,0,23,0,0 +31,2,213750,5,10,0,5,0,0,0,0,0,45,0,0 +30,2,248384,1,9,2,4,4,0,1,0,0,40,0,0 +31,2,351187,1,9,2,4,4,0,0,0,0,40,0,0 +51,2,138179,1,9,4,8,0,0,0,0,1876,40,0,0 +59,2,50223,1,9,1,10,1,0,0,0,0,40,0,0 +58,2,117477,1,9,2,0,4,1,1,0,0,36,0,0 +40,2,194360,4,5,1,2,1,0,0,0,0,40,0,0 +54,2,118108,1,9,1,10,1,1,0,0,0,40,0,0 +25,4,90730,0,13,1,3,1,0,0,0,1977,40,0,1 +18,5,38307,2,7,0,7,3,0,0,0,0,30,0,0 +41,2,116391,5,10,1,10,1,0,0,0,0,40,0,0 +57,2,210496,12,6,6,4,4,0,1,0,0,40,0,0 +37,2,168475,1,9,1,1,1,0,0,0,0,40,0,1 +46,2,174386,1,9,0,4,4,0,1,0,0,24,0,0 +39,2,166744,1,9,0,4,3,0,1,0,0,38,0,0 +19,2,375114,1,9,0,10,0,0,1,0,0,40,0,0 +41,2,373469,6,12,1,8,1,0,0,0,0,40,0,0 +54,2,339667,1,9,0,0,0,0,0,0,0,41,0,0 +39,2,91711,3,14,1,1,1,0,0,0,0,40,0,1 +41,2,82049,1,9,1,10,1,0,0,0,0,40,0,1 +26,2,236242,10,15,0,3,0,0,1,0,0,30,0,0 +57,5,140319,1,9,1,0,1,0,0,0,0,50,0,0 +33,4,34080,5,10,1,11,1,0,0,0,0,40,0,1 +56,2,204816,5,10,1,1,1,0,0,0,0,40,0,1 +60,2,187124,1,9,1,8,1,0,0,0,0,40,0,0 +22,2,72310,1,9,0,6,0,0,0,0,0,70,0,0 +58,2,175127,14,8,1,6,5,0,0,0,0,40,0,0 +48,3,205707,3,14,3,1,0,0,1,10520,0,50,0,1 +45,4,236586,3,14,1,3,1,0,0,7688,0,55,0,1 +18,2,71792,1,9,0,5,3,2,1,0,0,40,0,0 +56,2,87584,1,9,6,4,4,0,1,0,0,40,0,0 +48,5,136878,1,9,1,10,1,0,0,0,0,60,0,1 +40,2,287983,0,13,0,9,0,2,1,0,2258,48,11,0 +38,2,110607,1,9,2,4,0,0,0,0,0,32,0,0 +58,2,109015,5,10,2,0,4,0,1,0,0,40,0,0 +23,2,235071,5,10,0,1,3,0,0,0,0,50,0,0 +51,2,332243,0,13,2,3,0,0,0,0,0,45,0,0 +44,2,45093,1,9,1,7,1,0,0,0,0,70,0,0 +46,3,161337,5,10,2,9,0,0,0,0,0,40,0,0 +64,0,211222,0,13,1,0,1,0,0,0,0,40,0,0 +32,2,295117,0,13,1,1,1,1,0,0,0,40,7,1 +31,2,206541,5,10,1,0,1,0,0,0,0,40,0,0 +36,2,238415,9,11,1,5,1,0,0,0,0,50,0,1 +21,2,29810,1,9,0,4,0,0,1,0,0,50,0,0 +30,2,108023,5,10,1,10,1,0,0,0,0,40,0,0 +31,2,114324,9,11,0,4,0,1,1,0,0,40,0,0 +54,2,172281,1,9,1,6,1,0,0,0,2051,50,0,0 +59,4,197290,4,5,1,4,1,0,0,0,0,40,0,0 +28,4,191177,3,14,1,3,2,0,1,0,0,20,0,1 +57,2,562558,1,9,2,0,4,0,1,0,0,40,0,0 +44,2,79531,1,9,1,10,1,0,0,0,0,45,0,0 +53,5,157881,5,10,2,1,0,0,0,0,0,60,0,0 +58,1,204816,5,10,1,1,1,0,0,0,0,60,0,1 +19,2,185695,5,10,0,4,3,0,1,0,0,20,0,0 +39,5,167482,6,12,1,1,1,0,0,0,0,50,0,1 +31,5,83748,5,10,1,1,2,2,1,0,0,70,27,0 +27,2,39232,1,9,1,10,1,0,0,0,0,40,0,0 +46,4,236827,4,5,4,4,4,1,1,0,0,40,0,0 +37,1,154410,3,14,0,1,0,0,0,0,0,40,0,0 +27,2,135308,0,13,0,5,0,1,1,0,0,40,0,0 +33,2,204042,5,10,0,6,0,0,0,0,0,55,0,0 +20,2,308239,5,10,0,4,3,0,0,0,0,16,0,0 +55,2,183884,1,9,2,10,0,0,0,0,0,45,0,0 +39,2,98948,6,12,0,5,0,0,1,0,0,40,0,0 +41,2,141642,1,9,0,4,0,0,1,0,0,40,0,0 +30,2,162623,0,13,0,3,0,0,1,0,0,40,0,0 +39,5,186934,0,13,3,5,0,0,0,0,0,40,0,0 +28,2,179512,1,9,4,1,4,0,1,0,0,50,0,0 +25,2,391192,5,10,0,5,3,0,0,0,0,24,0,0 +31,2,87054,1,9,1,10,1,0,0,0,0,50,0,0 +51,2,30008,1,9,1,6,1,0,0,0,0,60,0,0 +24,2,113466,0,13,0,0,3,0,0,0,0,40,0,0 +70,2,642830,1,9,2,11,0,0,1,0,0,32,0,0 +23,2,182117,5,10,0,0,3,0,0,0,0,40,0,0 +61,2,162432,1,9,6,1,0,0,1,0,0,40,0,0 +45,1,242184,7,4,1,1,1,0,0,0,0,55,0,1 +47,2,170850,1,9,1,2,1,0,0,4064,0,60,0,0 +56,2,435022,5,10,2,4,0,0,1,0,0,50,0,0 +79,2,120707,8,16,1,3,1,0,0,20051,0,35,22,1 +20,2,170800,5,10,0,0,3,0,1,0,0,15,0,0 +30,2,268575,1,9,0,10,4,2,0,0,0,40,36,0 +40,2,224232,0,13,1,5,1,0,0,0,0,40,0,1 +58,2,177368,1,9,1,10,1,0,0,0,0,40,0,1 +71,1,163293,10,15,1,7,1,0,0,0,0,2,0,0 +50,2,178530,10,15,1,3,1,0,0,0,0,60,0,1 +29,4,183523,5,10,0,1,0,0,0,0,0,40,10,0 +33,2,207267,12,6,4,4,4,0,1,3418,0,35,0,0 +60,0,27037,1,9,1,11,1,3,0,0,0,40,0,1 +33,2,176711,6,12,0,0,0,0,0,0,0,50,0,0 +33,2,394727,12,6,0,2,4,1,0,0,0,40,0,0 +33,2,195488,1,9,1,0,2,0,1,0,0,52,0,0 +32,0,443546,1,9,1,11,1,0,0,0,0,45,0,0 +21,2,121023,5,10,0,4,3,0,1,0,0,9,0,0 +38,2,51838,1,9,1,3,2,0,1,0,0,40,0,0 +38,2,258888,5,10,1,0,2,0,1,0,0,35,0,1 +39,0,189385,5,10,4,1,4,1,1,0,0,30,0,0 +17,2,198146,2,7,0,5,3,0,1,0,0,15,0,0 +21,2,337766,5,10,1,0,1,0,0,0,0,40,0,0 +42,2,210525,5,10,1,9,1,0,0,0,0,20,0,1 +42,2,185602,1,9,1,1,2,0,1,0,0,40,0,1 +36,2,173804,2,7,2,4,0,0,1,0,0,40,0,0 +32,2,251243,5,10,2,1,0,0,1,0,0,50,0,1 +37,1,415847,0,13,1,3,1,0,0,0,0,40,0,1 +28,2,119793,0,13,0,5,0,0,0,0,0,40,0,0 +37,2,181705,9,11,1,10,1,0,0,0,0,40,0,0 +50,2,182360,1,9,4,3,4,4,1,0,0,60,5,0 +49,2,61885,2,7,1,10,1,0,0,0,0,40,0,0 +40,2,146520,3,14,1,1,1,0,0,0,0,40,0,1 +40,2,323790,5,10,1,4,1,0,0,0,0,40,0,0 +49,2,146268,5,10,1,10,1,0,0,0,0,40,0,0 +35,3,287031,3,14,0,1,0,0,0,8614,0,40,0,1 +33,4,292217,1,9,2,11,4,0,0,0,0,40,0,0 +24,2,88126,1,9,0,10,0,0,0,0,0,40,0,0 +41,2,143046,3,14,0,0,0,0,1,0,0,40,0,0 +43,2,401623,5,10,1,9,1,1,0,0,0,40,2,1 +36,1,283122,1,9,1,7,1,0,0,0,1902,60,0,1 +84,1,155057,0,13,1,7,1,0,0,0,0,20,0,0 +23,2,260254,1,9,0,5,3,0,0,0,0,40,0,0 +41,2,152292,0,13,1,3,1,0,0,0,0,50,0,1 +55,5,138594,1,9,1,1,1,0,0,0,1977,45,0,1 +30,1,523095,5,10,0,10,0,0,0,0,0,45,0,0 +46,2,175262,6,12,1,0,1,2,0,0,0,40,3,0 +55,2,323706,5,10,1,1,1,0,0,0,1902,40,0,1 +34,2,316470,5,10,0,0,0,0,0,0,0,40,0,0 +54,1,163815,3,14,2,5,0,0,0,0,0,60,0,0 +27,2,72208,5,10,0,0,3,1,0,0,0,40,0,0 +52,4,74784,3,14,1,3,2,0,1,0,0,40,0,1 +36,2,383518,5,10,1,0,2,1,1,99999,0,40,0,1 +25,1,266668,1,9,0,3,0,0,0,0,0,40,0,0 +52,2,347519,0,13,1,1,1,0,0,0,0,55,0,1 +24,2,336088,1,9,2,1,0,3,1,0,0,50,0,0 +36,2,190350,1,9,0,0,0,1,1,0,0,40,0,0 +31,2,204052,1,9,1,2,1,0,0,0,0,40,0,0 +90,1,155981,0,13,1,3,1,0,0,10566,0,50,0,0 +67,2,195161,3,14,1,3,1,0,0,20051,0,60,0,1 +22,5,269583,7,4,1,10,1,0,0,2580,0,40,0,0 +47,2,26994,5,10,2,0,0,0,1,0,0,35,0,0 +32,2,116539,0,13,1,1,1,0,0,0,1887,55,0,1 +55,1,189933,7,4,1,7,1,0,0,0,0,50,0,0 +32,2,101283,1,9,0,2,0,0,1,0,0,35,0,0 +48,2,113598,5,10,4,0,5,1,1,0,0,40,0,0 +21,2,188793,1,9,1,5,1,4,0,0,0,35,0,0 +33,2,109996,6,12,3,3,3,0,1,0,0,40,0,0 +47,2,436770,9,11,0,3,0,0,1,0,0,40,0,0 +18,2,84253,2,7,0,4,3,0,1,0,0,24,0,0 +44,5,383493,1,9,1,10,1,0,0,0,0,60,0,1 +23,2,216867,5,10,0,10,3,0,0,0,0,37,4,0 +18,2,401051,12,6,0,5,3,0,1,0,0,35,0,0 +56,2,83196,1,9,1,1,1,0,0,0,0,50,0,0 +24,2,325596,0,13,0,0,3,0,0,0,0,35,0,0 +43,2,187322,0,13,1,10,1,0,0,0,0,40,0,1 +23,2,193949,0,13,0,5,3,0,1,0,0,60,0,0 +26,2,133373,5,10,0,5,3,0,0,0,0,42,0,0 +42,2,113324,1,9,6,5,4,0,0,0,0,40,0,0 +23,2,178818,1,9,0,0,0,0,1,0,0,40,0,0 +53,1,152810,12,6,1,10,1,0,0,0,0,40,0,0 +51,2,335997,1,9,1,1,1,0,0,4386,0,55,0,1 +40,2,436493,1,9,0,4,3,0,0,0,0,25,0,0 +27,2,704108,0,13,0,3,0,0,0,0,0,50,0,0 +24,4,150084,5,10,4,11,0,0,0,0,0,60,0,0 +42,2,341204,1,9,2,10,5,0,1,0,0,40,0,0 +41,2,187336,1,9,4,0,4,0,1,0,0,40,0,0 +23,2,204209,5,10,0,2,3,0,0,0,0,10,0,0 +42,1,206066,3,14,1,3,1,0,0,0,0,65,0,0 +38,2,63509,1,9,1,10,1,0,0,0,0,40,0,1 +63,1,391121,7,4,1,7,1,0,0,0,0,30,0,0 +31,2,56026,1,9,1,10,1,0,0,0,0,40,0,0 +18,1,60981,2,7,0,4,3,0,1,0,0,4,0,0 +21,2,228255,5,10,0,4,3,0,0,0,0,30,0,0 +24,2,86745,0,13,1,3,5,2,1,0,0,40,11,0 +55,2,234327,5,10,1,10,1,0,0,0,0,40,0,0 +20,2,59948,4,5,0,0,4,1,1,114,0,20,0,0 +31,2,137814,5,10,2,5,3,0,1,0,0,30,0,0 +23,2,167692,5,10,0,0,3,0,1,0,0,20,0,0 +35,2,245090,1,9,1,10,1,0,0,0,0,40,4,0 +51,1,256963,5,10,1,5,1,0,0,0,0,60,0,0 +19,2,160033,5,10,0,11,3,0,1,0,0,30,0,0 +38,4,289430,1,9,2,11,0,0,0,0,0,56,0,0 +52,4,305053,1,9,1,10,1,0,0,0,2051,40,0,0 +70,1,172370,10,15,1,3,1,0,0,0,0,25,0,0 +53,2,320510,12,6,2,10,0,0,0,0,0,40,0,0 +59,2,171355,8,16,1,1,1,0,0,0,0,40,0,1 +39,2,65027,5,10,1,6,1,0,0,0,0,43,0,0 +18,2,215190,14,8,0,5,3,0,1,0,0,20,0,0 +24,2,138938,5,10,2,0,0,0,1,0,0,40,0,0 +25,2,557082,1,9,0,0,0,0,1,0,0,38,0,0 +32,2,273287,5,10,0,1,0,1,0,0,0,40,2,0 +34,1,77209,1,9,1,5,1,0,0,0,1902,60,0,1 +35,2,317153,1,9,0,5,0,0,1,0,0,40,0,0 +50,2,95469,1,9,1,0,1,0,0,7298,0,45,0,1 +18,2,302859,1,9,0,5,3,0,0,0,0,20,0,0 +37,2,333651,1,9,0,0,0,0,0,0,0,42,0,0 +30,2,177596,5,10,0,4,4,0,1,0,0,36,0,0 +40,5,157240,3,14,1,1,2,0,1,15024,0,30,10,1 +22,2,184779,1,9,0,3,0,0,1,0,0,40,0,0 +50,4,138358,5,10,4,4,4,1,1,0,0,28,0,0 +70,2,176285,1,9,2,4,0,0,1,0,0,23,0,0 +43,2,102180,3,14,1,3,1,0,0,0,0,40,0,1 +77,1,209507,5,10,0,10,0,0,0,0,0,40,0,0 +30,1,229741,1,9,1,10,1,0,0,0,0,40,0,0 +33,2,324546,5,10,1,8,1,0,0,0,0,39,0,0 +51,2,337195,5,10,1,5,1,0,0,0,1902,50,0,1 +58,0,194068,3,14,1,3,1,0,0,0,1977,50,0,1 +22,2,250647,5,10,0,0,3,0,0,0,0,12,0,0 +33,2,477106,1,9,1,6,1,1,0,0,0,40,0,0 +27,2,104329,2,7,1,5,1,0,0,0,0,40,0,0 +35,2,224566,5,10,0,1,0,0,0,0,0,60,0,0 +32,2,169841,5,10,2,5,0,0,1,0,0,55,0,0 +41,2,42563,0,13,1,9,2,0,1,0,0,25,0,1 +37,2,31368,5,10,1,10,1,0,0,0,0,40,0,0 +17,2,132755,2,7,0,5,3,0,0,0,0,15,0,0 +50,2,279129,0,13,2,1,0,0,0,0,0,55,0,1 +54,0,44172,1,9,4,1,4,0,1,0,0,38,0,0 +23,0,93076,1,9,0,4,3,1,0,0,0,40,0,0 +40,2,146653,0,13,2,0,4,0,1,0,0,20,0,0 +29,2,221366,0,13,1,3,1,0,0,5013,0,40,9,0 +30,2,172304,9,11,1,1,1,0,0,0,0,55,0,0 +20,2,116666,5,10,0,5,3,2,0,0,0,8,3,0 +43,1,64112,5,10,1,7,1,0,0,0,0,50,0,0 +25,2,55718,5,10,0,9,3,0,0,0,0,25,0,0 +39,2,126675,3,14,1,5,1,0,0,0,0,50,0,1 +48,2,102112,6,12,1,3,1,0,0,0,0,50,0,1 +41,1,226505,1,9,2,4,4,0,1,0,0,40,0,0 +24,2,211527,0,13,0,0,0,0,0,0,0,30,0,0 +20,2,175069,5,10,0,0,3,0,0,0,0,40,29,0 +25,2,25249,5,10,0,0,0,0,1,0,0,40,0,0 +57,2,73411,5,10,1,10,1,0,0,0,0,40,0,1 +39,2,207185,5,10,1,1,2,0,1,0,0,35,5,1 +66,2,127139,0,13,1,3,1,0,0,0,0,40,0,1 +34,2,41809,5,10,2,0,4,0,1,0,0,40,0,0 +36,2,297449,0,13,2,3,0,0,0,14084,0,40,0,1 +46,2,141483,1,9,1,5,2,0,1,0,0,40,0,0 +42,4,117227,3,14,2,3,4,0,1,0,0,45,0,0 +46,2,377401,1,9,1,6,1,0,0,0,1902,70,8,1 +34,4,167063,1,9,0,11,3,0,0,0,0,40,0,0 +43,2,253759,5,10,1,9,2,1,1,0,0,40,0,0 +42,2,183096,5,10,2,1,3,0,1,0,0,40,0,0 +31,2,269654,0,13,0,5,0,0,0,0,0,48,0,0 +32,2,34104,5,10,1,1,1,0,0,0,0,40,0,0 +46,3,80057,1,9,1,0,1,0,0,0,0,40,9,1 +42,5,369781,7,4,2,10,4,0,0,0,0,25,0,0 +21,2,223811,9,11,0,1,3,0,0,0,0,40,0,0 +24,2,163053,0,13,0,5,0,0,1,0,0,40,0,0 +23,2,189461,1,9,0,5,5,0,0,0,0,55,0,0 +50,4,145166,3,14,1,3,1,0,0,7298,0,40,0,1 +37,2,86310,5,10,2,0,4,0,1,0,0,45,0,0 +44,3,280362,6,12,1,10,1,0,0,0,0,40,0,1 +29,2,301031,1,9,1,6,1,1,0,0,0,40,0,0 +30,2,74966,9,11,1,0,2,0,1,0,0,24,0,0 +36,2,254493,5,10,1,5,1,0,0,0,0,44,0,0 +49,1,204241,0,13,0,5,0,0,0,0,0,45,0,0 +29,2,225024,1,9,2,10,0,0,0,0,0,40,0,0 +45,4,148222,1,9,0,0,0,1,1,0,0,40,0,0 +75,0,113868,8,16,1,3,1,1,0,0,0,20,0,1 +37,2,44780,6,12,2,1,0,0,1,0,0,40,0,0 +51,2,86373,0,13,1,8,1,0,0,0,0,25,0,0 +61,4,176753,1,9,1,7,1,0,0,0,0,48,0,0 +50,4,370733,1,9,1,0,1,1,0,0,0,40,0,0 +59,2,216851,1,9,0,8,0,0,0,0,0,40,0,0 +25,2,137951,1,9,0,0,4,0,1,0,0,30,0,0 +22,2,185279,1,9,0,2,3,0,0,0,0,16,0,0 +56,2,159724,5,10,1,6,1,0,0,0,0,40,0,1 +44,2,103233,0,13,0,0,4,1,1,0,0,40,0,0 +35,2,63509,9,11,1,10,1,0,0,0,0,50,0,0 +57,2,174353,1,9,0,1,0,0,0,0,0,40,0,0 +47,1,168109,1,9,1,7,1,0,0,15024,0,50,0,1 +27,2,159724,0,13,0,1,0,0,1,0,0,40,0,0 +50,1,105010,1,9,1,7,1,0,0,0,2051,20,0,0 +46,2,364913,2,7,1,6,1,1,0,0,0,40,0,0 +48,5,155664,10,15,1,3,1,0,0,0,0,60,0,1 +61,2,230568,0,13,2,0,0,0,0,0,0,40,0,1 +33,2,86492,1,9,0,6,0,0,0,0,0,87,0,0 +40,2,71305,1,9,1,4,1,1,0,0,0,40,0,0 +58,5,189933,5,10,1,1,1,0,0,0,0,65,0,1 +46,5,191978,3,14,1,1,1,0,0,0,2392,50,0,1 +35,2,38948,5,10,1,3,1,0,0,0,0,40,0,1 +51,5,139127,5,10,2,1,4,0,1,0,0,50,0,0 +37,2,301568,14,8,0,4,3,0,1,0,0,40,0,0 +64,2,149044,3,14,1,3,1,2,0,0,2057,60,26,0 +41,2,197344,1,9,0,10,0,0,0,0,0,54,0,0 +18,2,32244,2,7,0,2,3,0,0,594,0,30,0,0 +44,1,315406,2,7,1,7,1,0,0,0,0,88,0,0 +41,0,47170,0,13,1,3,2,3,1,0,0,48,0,1 +33,0,208785,5,10,4,3,0,0,0,10520,0,40,0,1 +37,2,196338,4,5,4,13,4,0,1,0,0,16,4,0 +34,2,269243,5,10,0,0,3,0,1,0,0,40,0,0 +20,2,117767,5,10,0,2,3,0,0,0,0,40,0,0 +38,2,176101,0,13,1,1,1,0,0,0,0,40,0,0 +28,2,138283,9,11,0,4,0,0,1,0,0,40,0,0 +20,1,132320,1,9,0,6,3,0,0,0,0,45,0,0 +22,3,471452,0,13,0,9,3,0,0,0,0,8,0,0 +55,2,147653,0,13,2,0,4,0,1,0,0,73,0,0 +20,2,49179,5,10,0,3,0,0,0,0,0,35,0,0 +26,2,174921,0,13,0,3,0,0,1,0,0,40,0,0 +20,5,95997,1,9,0,7,3,0,0,0,0,70,0,0 +40,2,247245,4,5,2,4,0,0,1,0,0,40,0,0 +33,2,67072,1,9,1,5,1,0,0,0,0,50,0,1 +24,2,107882,1,9,0,5,0,0,1,0,0,40,0,0 +25,2,241825,5,10,0,1,3,0,0,0,0,46,0,0 +18,2,79443,2,7,0,4,3,0,0,0,0,8,0,0 +49,1,233059,1,9,1,10,1,0,0,0,0,60,0,0 +17,2,226980,14,8,0,2,3,0,0,0,0,17,0,0 +34,1,181087,9,11,1,10,1,0,0,0,0,45,0,0 +37,2,305597,0,13,1,3,1,0,0,0,0,45,0,1 +49,3,311671,5,10,1,1,1,0,0,0,0,40,0,1 +74,2,129879,1,9,6,0,0,0,1,15831,0,40,0,1 +37,2,83375,1,9,2,7,0,0,0,0,0,40,0,0 +20,2,115824,2,7,1,2,1,0,0,0,1573,40,0,0 +40,2,141657,1,9,1,1,2,0,1,0,0,35,0,1 +34,2,50276,0,13,0,5,0,0,0,27828,0,40,0,1 +30,2,177216,10,15,1,3,1,1,0,0,1740,40,19,0 +44,2,228057,1,9,4,0,0,0,1,0,0,40,5,0 +40,2,222848,12,6,1,4,2,1,1,0,0,32,0,0 +58,2,121111,1,9,1,5,2,0,1,0,0,40,34,0 +44,2,298885,1,9,1,10,1,0,0,0,0,40,0,0 +42,2,149909,5,10,1,5,1,0,0,0,0,25,0,1 +39,2,387430,1,9,0,4,0,0,0,0,0,18,0,0 +19,2,121972,1,9,0,4,3,1,0,0,0,40,0,0 +41,2,280167,3,14,1,1,1,0,0,15024,0,70,0,1 +29,0,191355,3,14,0,3,0,0,0,0,0,40,0,0 +34,3,112115,5,10,0,10,5,0,0,0,0,40,0,0 +27,2,211032,13,1,1,7,5,0,0,41310,0,24,4,0 +54,2,199307,5,10,2,10,4,0,1,0,0,48,0,0 +40,2,205175,1,9,6,8,4,1,1,0,0,37,0,0 +19,2,257750,5,10,0,5,5,0,1,0,0,25,0,0 +17,2,191260,2,7,0,4,3,0,0,594,0,10,0,0 +33,2,342730,5,10,1,5,1,0,0,0,0,52,0,0 +80,2,249983,7,4,6,4,0,0,1,0,0,24,0,0 +24,1,161508,1,9,0,10,3,0,0,0,0,50,0,0 +28,2,338376,0,13,0,3,3,0,0,0,0,40,0,0 +55,2,334308,1,9,1,1,2,0,1,0,0,30,0,1 +21,2,133471,5,10,0,1,3,0,0,0,0,40,0,0 +51,2,129177,1,9,2,0,0,0,1,0,0,38,0,0 +19,2,178811,1,9,0,8,3,1,1,0,0,40,0,0 +42,2,178537,1,9,0,4,0,0,1,0,0,24,0,0 +60,1,235535,1,9,1,1,1,0,0,0,0,48,0,0 +51,2,145114,1,9,2,0,0,0,1,0,0,40,0,0 +21,2,194096,5,10,0,4,3,0,1,0,0,40,0,0 +37,0,191779,5,10,1,10,1,0,0,0,0,40,0,0 +26,2,159732,1,9,0,8,0,0,0,0,0,52,0,0 +42,3,170230,3,14,0,1,0,0,1,14084,0,60,0,1 +40,2,104719,5,10,1,2,1,0,0,0,0,40,0,0 +55,2,163083,3,14,1,3,1,0,0,0,0,40,0,1 +33,2,403552,1,9,0,4,0,1,0,0,0,32,0,0 +62,2,218009,1,9,1,6,1,0,0,0,1977,60,0,1 +47,2,179313,12,6,2,5,4,0,1,0,0,30,0,0 +26,2,51961,14,8,0,5,5,1,0,0,0,51,0,0 +59,2,426001,1,9,3,0,4,0,1,0,0,20,5,0 +70,4,176493,5,10,6,0,0,0,1,0,0,17,0,0 +26,2,124068,5,10,0,0,0,0,1,0,0,20,0,0 +47,2,108510,12,6,1,5,1,0,0,0,0,65,0,0 +25,2,181528,3,14,0,1,0,0,1,0,0,43,0,0 +52,5,173754,10,15,1,3,1,0,0,15024,0,60,0,1 +46,2,169699,1,9,1,10,1,0,0,0,0,40,0,0 +67,2,126849,12,6,1,6,1,3,0,0,0,20,0,0 +34,2,204470,3,14,1,1,1,0,0,0,0,50,0,1 +53,0,116367,5,10,2,0,5,0,1,4650,0,40,0,0 +22,2,117363,0,13,0,0,0,0,1,0,0,35,0,0 +39,4,106297,1,9,2,0,3,0,0,0,0,42,0,0 +54,1,108933,1,9,1,10,1,0,0,0,0,35,0,0 +24,2,190143,0,13,1,5,1,0,0,0,0,40,0,0 +37,2,246677,1,9,4,3,4,0,1,0,0,38,0,0 +38,2,175360,12,6,0,3,0,0,0,0,2559,90,0,1 +41,4,210259,3,14,0,3,0,1,1,0,0,40,0,0 +36,2,166304,1,9,1,6,1,0,0,0,0,33,0,0 +43,2,303051,9,11,1,1,1,0,0,15024,0,40,0,1 +39,2,49308,0,13,2,3,0,0,0,0,0,40,0,0 +26,2,192262,0,13,0,5,3,0,0,0,0,45,0,0 +49,4,192349,3,14,0,3,0,0,1,4650,0,40,0,0 +37,1,48063,0,13,1,3,1,0,0,0,0,55,0,1 +43,2,170214,5,10,1,1,1,0,0,0,0,50,0,1 +54,3,51048,1,9,1,3,1,0,0,0,0,40,0,1 +53,5,246562,11,3,1,5,1,0,0,0,0,40,4,1 +57,4,215175,3,14,1,3,1,0,0,0,0,60,0,0 +28,2,114967,0,13,1,3,1,0,0,0,0,40,0,1 +29,2,464536,0,13,1,4,1,0,0,0,0,40,0,0 +21,2,451996,1,9,0,5,3,0,0,0,0,40,0,0 +51,2,138852,1,9,1,10,1,0,0,0,0,40,0,0 +46,0,353012,1,9,1,6,1,0,0,0,0,40,0,0 +50,5,321822,10,15,1,3,1,0,0,0,0,75,0,1 +50,1,324506,1,9,6,1,4,2,1,0,0,48,27,0 +36,2,162256,1,9,2,1,4,0,1,0,0,40,0,0 +31,4,356689,0,13,1,3,1,0,0,0,0,40,0,0 +20,2,260199,1,9,0,0,3,0,1,0,0,10,0,0 +36,2,103605,1,9,1,2,1,0,0,0,0,40,0,0 +38,2,316211,1,9,2,10,3,0,0,0,0,40,0,0 +37,2,308691,0,13,1,10,1,0,0,0,0,45,0,1 +39,2,194404,3,14,1,3,1,0,0,7688,0,40,0,1 +18,2,334427,12,6,0,7,3,0,0,0,0,36,0,0 +33,2,213226,1,9,2,5,0,0,0,0,0,50,0,0 +35,2,342824,1,9,0,9,0,0,1,1151,0,40,0,0 +23,2,33105,5,10,0,2,3,3,0,0,0,40,0,0 +37,2,147638,0,13,4,4,4,2,1,0,0,36,11,0 +25,2,315643,1,9,1,4,1,0,0,0,0,30,0,0 +51,3,106257,6,12,1,9,1,1,0,0,0,40,0,0 +35,2,342768,1,9,1,10,1,0,0,0,0,40,0,0 +54,2,108960,2,7,1,8,1,0,0,0,0,40,0,0 +32,2,136935,1,9,0,4,4,1,1,0,0,13,0,0 +37,1,188774,0,13,0,11,0,0,0,0,0,55,0,1 +29,2,280344,0,13,1,5,1,0,0,0,0,40,0,1 +45,2,202496,0,13,1,2,1,0,0,0,0,37,0,0 +61,5,134768,5,10,1,5,1,0,0,0,0,40,0,0 +40,2,175686,5,10,2,0,4,0,1,0,0,40,0,0 +24,2,194748,1,9,0,6,0,0,1,0,0,49,0,0 +49,2,61307,7,4,1,8,1,4,0,0,0,38,0,0 +51,1,165001,3,14,2,1,4,0,0,25236,0,50,0,1 +34,2,325658,1,9,1,6,1,0,0,0,0,40,0,0 +20,2,505980,5,10,0,5,3,0,0,0,0,40,0,0 +30,2,185336,5,10,2,0,4,1,1,0,0,37,0,0 +49,5,362795,3,14,2,3,4,0,0,99999,0,80,4,1 +26,2,126829,5,10,0,5,0,0,0,0,0,40,0,0 +63,2,264600,12,6,1,0,1,0,0,0,0,45,0,0 +36,2,82743,6,12,0,6,0,0,0,0,0,55,10,0 +63,1,125178,0,13,1,3,1,0,0,0,0,40,0,1 +22,2,128487,1,9,0,0,0,0,1,0,0,10,0,0 +40,2,321758,1,9,1,5,1,0,0,0,0,40,0,1 +31,2,128220,7,4,6,0,0,0,1,0,0,35,0,0 +49,2,176814,5,10,1,10,1,0,0,0,0,50,8,0 +23,0,156423,0,13,0,3,3,0,1,0,0,20,0,0 +25,2,169905,9,11,0,5,0,0,0,27828,0,40,0,1 +28,2,176972,0,13,1,10,1,0,0,0,0,45,0,1 +44,1,171424,5,10,2,8,0,0,0,0,2205,35,0,0 +33,2,91811,1,9,4,6,0,0,0,0,0,40,0,0 +21,2,203924,5,10,0,0,0,0,0,2597,0,45,0,0 +55,2,177484,2,7,1,4,1,1,0,0,1672,40,0,0 +75,1,242108,1,9,2,5,0,0,0,2346,0,15,0,0 +61,2,132972,4,5,0,8,4,1,1,0,0,40,0,0 +53,2,157947,1,9,2,0,0,0,1,0,0,40,0,0 +26,4,177482,6,12,1,11,1,0,0,0,0,45,0,1 +48,2,246891,5,10,6,5,4,0,0,0,0,50,0,1 +28,0,158834,3,14,1,1,1,0,0,0,0,50,0,1 +29,2,110442,1,9,1,2,1,0,0,0,0,45,0,0 +25,2,240676,5,10,2,9,3,0,1,0,0,40,0,0 +37,2,192939,1,9,1,6,1,0,0,0,0,40,0,0 +43,4,260696,0,13,2,3,4,0,1,0,0,55,0,0 +40,4,55363,1,9,1,6,1,0,0,0,0,40,0,0 +34,2,144949,12,6,1,10,1,0,0,0,0,45,0,1 +55,2,116878,8,16,1,3,1,0,0,15024,0,30,0,1 +31,4,357954,6,12,0,9,0,0,0,0,0,20,0,0 +32,1,190290,1,9,1,7,1,0,0,0,0,40,25,0 +26,0,203279,10,15,0,3,0,2,0,2463,0,50,3,0 +26,2,167761,0,13,1,3,1,0,0,0,0,50,0,1 +44,2,138845,5,10,1,6,1,0,0,0,0,40,0,0 +49,2,144844,1,9,1,6,1,0,0,0,0,52,0,1 +26,2,55743,1,9,0,0,4,1,1,0,0,30,0,0 +40,1,117721,1,9,1,7,1,0,0,0,0,60,0,0 +19,1,116385,2,7,0,0,0,0,1,0,0,40,0,0 +58,2,301867,1,9,1,7,1,0,0,0,0,40,0,0 +61,2,238913,9,11,1,9,1,0,0,0,0,40,0,1 +28,1,123983,5,10,1,5,3,2,0,0,0,63,27,0 +26,2,165510,0,13,0,7,3,0,0,0,0,40,0,0 +64,2,183513,1,9,0,0,0,0,1,0,0,25,0,0 +42,5,119281,0,13,1,1,1,0,0,0,0,60,0,1 +41,2,152629,5,10,1,9,1,0,0,0,0,40,0,1 +45,2,110171,1,9,0,2,0,0,0,0,0,40,0,0 +39,2,211440,0,13,1,5,1,0,0,0,0,50,0,1 +41,4,359259,1,9,1,4,1,0,0,0,0,40,0,0 +51,2,125796,2,7,4,4,0,1,1,0,0,40,2,0 +34,2,39609,9,11,2,0,4,0,1,0,0,40,0,0 +33,2,111567,3,14,1,1,1,0,0,0,1902,45,9,1 +23,2,44064,5,10,4,4,0,0,0,0,2559,40,0,1 +35,1,120066,5,10,1,10,1,3,0,0,0,60,0,0 +41,2,132633,2,7,2,13,4,0,1,0,0,25,24,0 +39,2,192702,3,14,0,10,0,0,1,0,0,50,0,0 +41,2,166813,5,10,1,5,1,0,0,0,0,55,0,0 +33,5,40444,5,10,1,1,1,0,0,0,0,40,0,0 +22,2,290504,1,9,0,4,5,0,0,0,0,40,0,0 +25,2,178505,5,10,0,1,5,0,1,0,1504,45,0,0 +25,2,175370,5,10,2,8,3,0,1,0,0,40,0,0 +77,1,72931,7,4,3,0,0,0,0,0,0,20,25,1 +66,2,284021,1,9,6,5,0,0,1,0,0,40,0,0 +19,2,277974,5,10,0,5,3,0,0,0,0,35,0,0 +44,2,111275,1,9,0,4,4,1,1,0,0,38,0,0 +45,5,191776,3,14,2,5,4,0,1,25236,0,42,0,1 +28,2,125527,5,10,0,5,0,0,0,0,0,50,0,0 +19,2,38294,1,9,0,2,5,0,0,2597,0,40,0,0 +43,2,313022,1,9,1,8,1,1,0,4386,0,40,0,1 +39,2,179668,0,13,1,9,1,0,0,15024,0,40,0,1 +33,2,198660,0,13,1,5,1,0,0,0,0,50,0,0 +44,2,216116,1,9,3,4,0,1,1,0,0,40,2,0 +62,2,200922,7,4,6,8,0,0,1,0,0,40,0,0 +40,2,153372,5,10,1,5,1,0,0,0,0,50,0,1 +41,2,406603,1,9,0,4,0,0,0,0,0,6,10,0 +23,4,248344,5,10,0,4,0,1,0,0,0,30,0,0 +48,2,240629,1,9,1,10,1,0,0,0,0,40,25,1 +38,2,314310,3,14,1,3,1,0,0,0,0,45,0,0 +37,2,259785,3,14,1,1,1,0,0,0,0,50,0,1 +45,2,127111,3,14,1,3,1,0,0,0,0,55,0,1 +29,2,178272,1,9,1,11,1,0,0,0,0,40,0,0 +66,4,75134,1,9,6,0,4,0,1,0,0,25,0,0 +19,2,195985,1,9,0,4,0,0,1,0,0,50,0,0 +23,2,221955,4,5,0,2,5,0,0,0,0,39,4,0 +34,2,177675,0,13,1,9,1,0,0,0,0,40,0,1 +39,2,182828,3,14,0,1,0,0,1,0,0,45,0,0 +33,1,270889,1,9,0,6,0,0,0,0,0,60,0,0 +43,2,183096,5,10,4,5,4,0,1,0,0,10,0,0 +27,2,336951,1,9,1,6,1,0,0,0,0,99,0,0 +33,0,295589,5,10,4,0,3,1,0,0,0,35,0,0 +26,2,289980,11,3,1,7,1,0,0,0,0,30,4,0 +56,5,70720,3,14,2,1,0,0,0,27828,0,60,0,1 +46,2,163352,1,9,1,5,1,0,0,0,0,36,0,0 +38,2,190776,6,12,2,10,4,0,1,0,0,40,0,0 +90,2,313986,2,7,1,10,1,0,0,0,0,40,0,0 +72,5,473748,5,10,1,1,1,0,0,0,0,25,0,1 +20,2,163003,1,9,0,0,4,2,1,0,0,15,0,0 +29,2,183061,1,9,1,10,1,3,0,0,0,48,0,0 +49,2,123584,2,7,1,6,1,0,0,0,0,75,0,0 +23,2,120910,1,9,0,4,4,0,1,0,0,35,0,0 +20,2,227554,5,10,3,5,3,1,1,0,0,18,0,0 +57,2,182677,0,13,1,1,1,2,0,4508,0,40,27,0 +46,2,214955,6,12,2,3,4,0,1,0,0,40,0,0 +33,2,209768,0,13,1,3,1,0,0,0,0,40,0,1 +24,2,258120,0,13,0,5,0,0,0,0,0,55,2,0 +49,2,110015,9,11,1,10,1,0,0,0,0,45,34,0 +54,2,152652,1,9,1,6,1,0,0,0,0,65,0,0 +46,3,43206,8,16,0,3,0,0,1,0,1564,50,0,1 +31,1,114639,9,11,1,10,1,0,0,0,0,50,0,0 +43,5,221172,10,15,1,3,1,0,0,0,1977,40,0,1 +19,2,131615,1,9,0,8,3,0,0,0,0,40,0,0 +46,2,353824,6,12,0,0,0,0,0,0,0,40,0,0 +43,2,178417,0,13,2,3,0,0,0,0,0,40,0,0 +58,2,178644,1,9,6,10,4,0,0,0,0,40,0,0 +43,1,271665,1,9,1,5,1,0,0,0,0,45,0,0 +21,3,169003,14,8,0,0,3,1,0,0,0,25,0,0 +52,0,338816,3,14,0,0,0,0,0,0,0,70,0,1 +34,2,506858,9,11,1,10,1,0,0,0,0,32,0,1 +28,2,265628,9,11,0,2,3,0,1,0,0,40,0,0 +34,2,173495,1,9,2,6,0,0,0,0,0,40,0,0 +29,2,177413,1,9,1,8,1,0,0,0,0,40,0,1 +39,2,31670,1,9,1,7,1,0,0,0,0,65,0,0 +49,2,154451,2,7,2,8,4,1,1,0,0,35,0,0 +35,2,265535,5,10,1,10,1,1,0,0,0,50,2,1 +31,2,118941,5,10,2,4,3,0,1,0,0,20,0,0 +18,2,214617,5,10,0,2,3,0,0,0,0,30,0,0 +47,4,265097,1,9,1,4,1,0,0,4386,0,40,0,1 +46,2,276087,1,9,1,5,1,0,0,5013,0,50,0,0 +43,2,124692,0,13,1,5,1,0,0,0,0,40,0,1 +51,3,306784,1,9,1,10,1,0,0,4386,0,40,0,1 +21,2,434102,5,10,0,0,0,0,1,0,0,40,0,0 +31,0,181824,0,13,1,3,2,0,1,0,1902,35,0,1 +39,4,177907,1,9,1,11,1,0,0,0,1887,40,0,1 +58,2,87329,2,7,1,0,1,0,0,0,0,48,0,0 +36,2,263130,3,14,0,3,0,0,1,0,0,40,0,0 +38,2,262882,1,9,1,8,2,0,1,0,0,40,0,0 +31,2,37546,0,13,1,1,2,0,1,0,1902,35,0,1 +19,2,27433,2,7,0,2,0,0,0,0,0,40,0,0 +38,2,393945,9,11,2,9,0,0,1,0,0,36,0,0 +26,2,173927,9,11,0,3,3,4,1,0,0,60,2,0 +38,2,343403,6,12,2,0,0,0,1,0,0,16,0,0 +36,2,111128,5,10,1,10,1,0,0,0,0,45,0,0 +40,2,193882,1,9,1,1,1,0,0,0,0,45,0,1 +41,2,128354,0,13,1,9,2,0,1,0,0,25,0,1 +33,2,113364,1,9,0,5,0,0,0,0,0,45,0,0 +51,2,136913,1,9,1,8,1,0,0,0,0,40,0,0 +34,2,115488,1,9,1,5,1,0,0,0,0,40,0,0 +33,2,154227,9,11,2,5,0,0,0,0,0,40,0,0 +25,2,279667,12,6,1,10,1,0,0,0,0,45,0,0 +30,1,281030,1,9,0,5,4,0,0,0,0,66,0,0 +19,2,283945,5,10,0,0,3,0,0,0,0,25,0,0 +47,2,454989,1,9,1,1,2,0,1,0,0,40,0,1 +26,2,391349,0,13,0,0,0,0,1,0,0,40,0,0 +21,0,166704,5,10,0,4,3,0,1,0,0,14,0,0 +36,2,151835,1,9,1,4,1,0,0,0,0,60,0,1 +60,2,199085,12,6,1,8,1,0,0,0,0,40,0,0 +28,2,61487,1,9,0,3,4,1,0,0,0,40,0,0 +19,2,120251,1,9,0,0,3,0,1,0,0,14,0,0 +42,2,273230,0,13,1,3,1,0,0,0,0,90,0,0 +36,2,358373,1,9,4,8,0,1,1,0,0,36,0,0 +35,2,267891,1,9,1,4,2,0,1,0,0,38,0,0 +22,2,234880,5,10,0,0,3,0,1,0,0,25,0,0 +54,2,48358,1,9,1,10,1,0,0,0,0,40,0,1 +36,2,96452,0,13,1,3,1,0,0,0,0,45,0,0 +55,2,204751,1,9,1,6,1,0,0,0,0,65,0,0 +57,2,375868,3,14,1,0,1,0,0,0,0,40,0,0 +56,2,413373,7,4,1,6,1,0,0,0,0,36,0,0 +24,2,537222,1,9,1,1,1,0,0,0,0,50,0,0 +35,4,33975,0,13,1,3,1,0,0,0,0,40,0,1 +51,5,162327,2,7,2,5,0,0,0,0,0,40,0,0 +34,2,182691,1,9,2,1,3,0,0,0,0,44,0,0 +36,2,300829,6,12,2,0,4,0,1,0,0,42,0,0 +51,4,114508,4,5,4,4,5,0,1,0,0,40,0,0 +46,5,214627,8,16,1,3,1,0,0,0,0,60,0,1 +42,2,129684,1,9,2,1,0,1,1,5455,0,50,0,0 +25,0,120041,0,13,0,3,0,0,1,0,0,40,0,0 +22,2,361138,1,9,0,2,5,0,0,0,0,50,0,0 +37,2,76893,1,9,1,10,1,0,0,0,0,40,0,0 +48,2,205424,0,13,2,5,4,0,0,0,0,40,0,1 +61,2,176839,0,13,1,3,1,0,0,15024,0,50,0,1 +40,2,229148,14,8,1,6,1,1,0,0,0,40,2,0 +58,5,154537,1,9,1,1,2,0,1,0,0,20,0,1 +52,2,181901,1,9,3,7,5,0,0,0,0,20,4,0 +18,2,152004,2,7,0,4,3,1,0,0,0,20,0,0 +27,2,205188,12,6,1,8,1,0,0,0,0,40,0,0 +48,1,30840,5,10,1,3,1,0,0,5013,0,45,0,0 +63,2,66634,4,5,1,10,1,0,0,0,0,16,0,0 +38,1,180220,1,9,1,10,1,0,0,0,0,60,0,0 +31,2,291052,5,10,1,0,1,0,0,0,2051,40,0,0 +40,1,99651,5,10,1,3,1,0,0,0,0,60,0,0 +41,2,327723,1,9,2,1,0,0,0,0,0,40,0,0 +28,2,32291,0,13,0,3,0,0,1,2174,0,40,0,0 +31,2,345122,10,15,2,3,0,0,0,14084,0,50,0,1 +32,2,127384,9,11,1,10,1,0,0,0,0,55,0,1 +30,2,363296,1,9,0,2,4,1,0,0,0,72,0,0 +39,4,86551,1,9,2,10,0,0,0,0,1876,40,0,0 +28,2,30070,0,13,1,5,1,0,0,0,0,50,0,0 +31,2,595000,1,9,0,2,5,1,1,0,0,35,0,0 +44,0,111483,3,14,1,3,1,0,0,0,0,40,0,1 +22,2,199555,5,10,0,7,3,0,0,0,0,25,0,0 +36,2,218490,6,12,1,10,1,0,0,0,0,35,0,0 +39,2,49020,3,14,0,1,0,0,0,0,1974,40,0,0 +61,2,213321,5,10,1,1,1,0,0,0,1672,40,0,0 +31,2,159187,1,9,2,6,3,0,0,0,0,40,0,0 +21,2,83033,5,10,0,4,0,0,1,0,0,25,9,0 +39,1,31848,5,10,1,7,1,0,0,2829,0,90,0,0 +34,1,24961,1,9,1,7,1,0,0,0,0,80,0,0 +21,2,182117,5,10,0,4,3,0,0,0,0,15,0,0 +75,1,146576,0,13,6,3,4,0,0,0,0,48,0,1 +21,2,176690,5,10,0,4,3,0,0,0,0,24,0,0 +81,2,122651,5,10,1,5,1,0,0,0,0,15,0,0 +54,5,149650,1,9,2,4,0,0,0,0,0,40,8,0 +34,2,454508,0,13,1,3,1,0,0,0,0,65,10,0 +54,1,269068,10,15,1,3,1,2,0,99999,0,50,11,1 +41,2,266530,1,9,1,4,1,3,0,0,0,45,0,0 +63,2,133144,1,9,1,4,1,0,0,2580,0,20,0,0 +24,2,217961,5,10,0,8,0,0,0,0,0,40,0,0 +20,2,221661,1,9,1,0,2,0,1,0,0,40,4,0 +44,4,60735,0,13,2,3,3,0,1,0,0,60,0,0 +47,1,121124,0,13,1,5,1,0,0,0,0,40,0,1 +31,2,48588,5,10,1,10,1,0,0,0,0,40,0,0 +41,2,48087,7,4,2,10,0,0,0,0,1590,40,0,0 +53,1,240138,1,9,1,10,1,0,0,0,0,60,0,0 +63,2,273010,1,9,1,0,2,0,1,3471,0,40,0,0 +44,2,104196,3,14,1,3,1,0,0,0,0,45,0,1 +37,2,230035,1,9,1,10,1,0,0,0,0,46,0,1 +28,2,38918,5,10,1,10,1,0,0,0,0,50,9,1 +57,2,176079,1,9,2,0,0,0,1,0,0,40,0,0 +22,2,180052,5,10,0,7,3,0,0,0,0,10,0,0 +33,4,173005,0,13,1,0,1,0,0,0,1848,45,0,1 +30,2,378723,5,10,2,0,3,0,1,0,0,55,0,0 +20,2,233624,1,9,0,10,3,0,0,0,0,40,0,0 +28,2,192591,0,13,0,0,0,0,1,0,0,45,0,0 +54,2,249860,2,7,2,13,4,1,1,0,0,10,0,0 +20,2,247564,1,9,0,2,3,0,0,0,0,35,0,0 +34,2,238912,1,9,1,1,1,0,0,0,0,40,0,0 +21,2,190227,5,10,0,0,3,0,0,0,0,40,0,0 +29,0,293287,5,10,0,4,4,0,1,0,0,40,0,0 +51,2,180807,5,10,2,1,4,0,1,0,0,40,0,0 +39,2,250217,1,9,2,8,0,1,1,0,0,70,0,0 +19,2,217418,5,10,0,0,5,1,1,0,0,38,0,0 +22,4,137510,1,9,0,7,3,0,0,0,0,40,0,0 +59,0,163047,5,10,2,0,0,0,1,0,0,38,0,0 +18,2,577521,2,7,0,5,3,0,0,0,0,13,0,0 +22,2,221533,1,9,0,4,0,0,0,0,0,20,0,0 +42,4,255675,5,10,1,10,1,0,0,0,0,40,0,1 +39,2,114079,6,12,0,10,0,0,0,0,0,40,0,0 +31,2,155781,0,13,1,5,1,0,0,0,0,40,0,1 +28,2,243762,2,7,4,10,4,0,1,0,0,40,0,0 +22,2,113062,0,13,0,1,3,0,1,0,0,7,0,0 +67,2,217028,3,14,0,4,0,0,1,0,0,40,0,0 +17,2,110723,2,7,0,5,3,0,1,0,0,25,0,0 +47,3,191858,6,12,1,0,1,0,0,0,0,40,0,1 +23,2,179423,0,13,0,0,0,0,1,0,0,5,0,0 +20,2,339588,1,9,1,4,2,0,1,0,0,40,30,0 +22,2,206815,1,9,0,5,4,0,1,0,0,40,30,0 +47,0,103743,7,4,1,6,1,0,0,0,0,40,0,0 +49,2,235683,5,10,1,5,2,0,1,0,0,40,0,1 +35,0,197495,5,10,2,1,0,1,1,0,0,40,0,0 +52,3,424012,5,10,2,1,0,0,1,0,0,40,0,0 +29,2,178469,1,9,0,5,0,0,1,0,0,40,0,0 +73,5,92886,12,6,6,5,4,0,1,0,0,40,8,0 +38,1,214008,1,9,1,3,1,0,0,0,0,50,0,1 +59,1,325732,1,9,1,1,1,0,0,0,1902,52,0,1 +35,2,28572,5,10,1,10,1,0,0,4064,0,35,0,0 +18,2,118376,5,10,0,5,3,0,1,0,0,15,0,0 +24,2,51799,1,9,1,0,2,1,1,0,0,40,0,0 +33,4,115488,0,13,1,3,1,0,0,0,0,50,0,0 +40,2,190621,5,10,2,1,5,1,1,0,0,55,0,0 +55,2,193568,1,9,6,0,0,0,1,0,0,40,0,0 +44,2,192878,1,9,2,3,0,0,0,0,0,40,0,0 +40,2,264663,0,13,0,3,3,0,1,0,0,60,0,0 +22,2,234731,1,9,2,2,3,0,0,0,0,40,0,0 +55,2,308373,5,10,1,1,2,0,1,0,0,40,0,1 +45,2,205644,1,9,4,9,0,0,1,0,0,26,0,0 +47,4,321851,0,13,0,3,0,0,1,0,0,50,0,1 +56,2,206399,1,9,1,10,1,0,0,0,0,40,0,0 +44,2,124563,1,9,1,8,1,1,0,0,0,40,0,0 +32,0,198211,5,10,0,0,0,0,0,0,0,38,0,0 +17,2,130795,12,6,0,4,3,0,0,0,0,20,0,0 +44,2,71269,5,10,2,1,0,0,0,0,0,50,0,0 +32,1,319280,6,12,0,5,0,0,0,0,0,80,0,0 +35,2,125933,0,13,1,5,1,0,0,0,0,60,0,1 +27,2,107236,1,9,1,4,1,0,0,0,0,40,0,0 +32,2,32732,1,9,1,3,1,0,0,0,0,50,0,0 +68,2,284763,2,7,2,6,0,0,0,0,0,70,0,0 +20,2,112668,5,10,0,4,3,0,1,0,0,20,0,0 +33,2,376483,5,10,2,0,0,1,1,0,0,40,0,0 +24,2,402778,4,5,0,2,3,0,0,0,0,12,0,0 +48,2,36177,1,9,1,10,1,0,0,0,0,45,0,0 +45,2,125489,3,14,2,3,4,0,1,0,0,50,0,0 +48,2,304791,5,10,6,0,0,0,1,0,0,40,0,0 +28,2,209205,3,14,1,3,1,0,0,0,0,45,0,1 +39,4,178100,3,14,2,3,4,0,1,0,0,40,0,0 +23,2,70261,5,10,0,4,3,0,0,0,0,30,0,0 +23,0,186634,14,8,0,1,0,0,0,0,0,40,0,0 +36,2,32958,5,10,4,0,5,0,1,0,0,40,0,0 +25,2,254746,0,13,1,3,2,0,1,0,0,40,0,0 +52,2,158746,1,9,0,4,4,0,0,0,0,40,0,0 +35,1,140854,1,9,1,10,1,0,0,0,0,40,0,0 +41,2,51506,1,9,1,1,1,0,0,0,0,40,0,0 +45,2,189564,0,13,1,5,2,0,1,0,0,42,0,1 +58,2,213975,9,11,6,3,0,0,1,0,0,40,0,0 +67,1,431426,1,9,1,0,2,0,1,0,0,2,0,0 +48,2,199763,1,9,1,3,2,0,1,0,0,8,0,0 +63,2,161563,1,9,1,10,1,0,0,0,0,48,0,0 +24,4,252024,5,10,1,11,1,0,0,0,0,72,0,1 +43,2,43945,5,10,1,10,1,0,0,0,0,40,0,1 +36,2,178487,1,9,2,6,3,0,0,0,0,60,0,0 +32,2,604506,1,9,1,6,3,0,0,0,0,72,4,0 +36,2,228157,5,10,0,10,0,2,0,0,0,40,17,0 +43,2,199191,5,10,0,0,0,0,1,0,0,50,0,0 +27,2,189775,1,9,0,0,0,1,1,0,0,40,0,0 +17,2,171080,2,7,0,4,3,0,0,0,0,12,0,0 +45,2,117310,0,13,2,5,0,0,1,0,0,46,0,0 +41,5,82049,1,9,1,10,1,0,0,0,0,40,0,0 +41,1,126094,1,9,1,1,1,0,0,0,0,38,0,0 +48,4,246392,6,12,4,0,0,1,1,0,0,40,0,0 +26,2,292803,5,10,0,4,3,0,1,0,0,24,0,0 +54,2,286989,13,1,1,7,1,0,0,0,0,60,0,0 +22,2,190483,5,10,2,5,3,0,1,0,0,48,10,0 +19,2,235849,1,9,0,6,3,0,0,0,0,35,0,0 +47,2,359766,7,4,2,2,5,1,0,0,0,40,0,0 +32,2,128016,1,9,3,4,4,0,1,0,0,20,0,0 +46,2,360096,0,13,1,1,1,0,0,15024,0,60,0,1 +30,2,170154,0,13,0,9,0,0,1,0,0,40,0,1 +35,2,337286,3,14,0,1,0,2,0,0,0,40,0,0 +52,2,204322,9,11,1,9,1,0,0,5013,0,40,0,0 +73,1,143833,14,8,1,7,1,0,0,0,0,18,0,0 +17,2,365613,12,6,0,4,3,0,0,0,0,10,8,0 +32,2,100135,0,13,4,3,4,0,1,0,0,32,0,0 +43,4,180096,3,14,1,3,1,0,0,0,0,40,0,1 +26,2,61270,1,9,0,8,4,4,1,0,0,40,13,0 +41,3,564135,3,14,1,1,1,0,0,0,0,40,0,1 +49,2,198759,6,12,1,5,1,0,0,15024,0,60,0,1 +52,0,303462,5,10,4,11,4,0,0,0,0,40,0,0 +35,2,193106,1,9,4,0,4,0,1,0,0,32,0,0 +57,2,250201,2,7,1,4,1,0,0,0,0,52,0,0 +35,2,200426,9,11,3,3,4,0,1,0,0,44,0,0 +33,2,222654,0,13,0,3,0,0,0,0,0,40,0,0 +56,2,53366,7,4,2,6,4,0,0,0,0,40,0,0 +42,2,132222,0,13,0,5,3,0,0,0,0,60,0,0 +17,2,100828,5,10,0,0,3,0,0,0,0,20,0,0 +49,2,31264,1,9,2,0,0,0,1,0,0,35,0,0 +39,2,202027,10,15,1,3,1,0,0,0,0,45,0,1 +34,1,168906,5,10,2,0,4,0,1,0,0,50,0,0 +37,1,255454,5,10,0,3,0,1,0,0,0,40,0,0 +22,2,245524,14,8,0,4,0,0,0,0,0,35,0,0 +27,2,386040,9,11,1,10,1,0,0,0,0,40,4,0 +21,2,35424,5,10,0,5,3,0,1,0,0,25,0,0 +44,2,152629,0,13,1,0,1,0,0,3103,0,40,0,1 +53,1,151159,12,6,3,6,0,0,0,0,0,99,0,0 +26,2,410240,2,7,0,10,0,0,0,0,0,40,0,0 +48,2,138970,0,13,1,1,1,0,0,0,0,45,0,1 +39,2,269722,0,13,1,1,1,0,0,0,0,70,0,0 +34,2,223678,1,9,0,4,4,3,1,0,0,32,0,0 +54,0,197184,0,13,1,1,1,0,0,0,0,38,0,0 +36,2,143486,1,9,1,6,1,0,0,7298,0,50,0,1 +60,2,160625,1,9,1,3,1,0,0,5013,0,40,0,0 +50,2,140516,1,9,1,11,1,0,0,0,0,40,0,1 +48,4,85341,0,13,1,3,1,0,0,0,0,45,0,0 +35,2,108293,5,10,0,0,3,0,1,0,2205,40,0,0 +40,1,192507,6,12,2,3,0,0,1,0,0,50,0,0 +30,2,186932,0,13,1,1,1,0,0,0,0,70,0,0 +65,1,223580,5,10,1,8,1,0,0,6514,0,40,0,1 +31,2,236861,1,9,1,10,1,0,0,0,0,60,0,0 +46,4,327886,6,12,1,0,1,0,0,0,0,40,0,0 +62,5,197060,9,11,1,1,1,0,0,0,0,50,0,0 +38,2,229180,0,13,0,1,4,0,1,0,0,40,1,0 +24,2,284317,0,13,0,4,3,0,1,0,0,30,0,0 +24,2,73514,5,10,0,5,0,2,1,0,0,50,11,0 +27,2,47907,0,13,0,3,0,0,1,0,0,48,0,0 +43,0,134782,6,12,3,4,4,0,1,0,0,30,0,0 +48,2,118831,1,9,2,2,4,2,1,0,0,40,27,0 +41,2,299505,1,9,4,10,0,1,0,0,0,40,0,0 +30,2,267161,5,10,1,9,2,1,1,0,0,45,0,0 +38,2,119177,0,13,1,5,1,0,0,0,0,40,0,1 +45,2,327886,10,15,0,3,0,0,0,0,0,40,0,1 +45,2,187730,0,13,0,3,3,0,0,0,0,40,0,0 +55,2,109015,5,10,2,0,0,0,1,0,0,38,0,0 +46,1,110015,7,4,1,1,1,0,0,0,0,75,34,0 +24,2,104146,0,13,0,3,3,2,0,0,0,40,0,0 +31,4,50442,5,10,0,0,3,3,1,0,0,25,0,0 +35,2,57640,1,9,1,10,1,0,0,0,0,35,0,0 +37,4,333664,5,10,4,0,0,0,1,0,0,40,0,0 +29,2,224858,5,10,1,3,1,0,0,0,0,45,0,0 +56,2,290641,0,13,1,1,1,0,0,0,0,50,0,1 +25,2,34402,0,13,0,1,0,0,0,0,1590,60,0,0 +33,2,245378,12,6,1,8,1,0,0,0,0,40,0,0 +44,2,179136,1,9,0,5,0,0,1,0,0,40,0,0 +21,2,116788,1,9,0,10,3,0,0,0,0,40,0,0 +21,2,129699,1,9,0,0,0,0,0,0,0,40,0,0 +46,3,39606,3,14,1,1,1,0,0,0,0,40,7,1 +44,5,95150,5,10,1,1,1,0,0,0,0,50,0,1 +63,2,102479,0,13,2,1,0,0,1,0,0,40,0,0 +44,2,199191,1,9,1,0,2,0,1,0,0,30,0,0 +31,2,229636,5,10,1,10,1,0,0,0,0,45,4,0 +26,2,53833,5,10,1,1,1,0,0,0,0,42,0,0 +37,5,27997,1,9,0,6,0,0,0,0,0,50,0,0 +33,2,111363,0,13,1,10,1,0,0,0,0,45,0,0 +38,2,107630,0,13,1,1,1,0,0,0,0,40,0,0 +26,2,134287,9,11,0,5,3,0,1,0,0,35,0,0 +46,5,283004,9,11,2,1,4,2,1,0,0,63,15,0 +24,2,33616,1,9,0,4,4,0,1,0,0,35,0,0 +47,4,121124,3,14,1,3,1,0,0,0,0,35,0,1 +27,2,188189,5,10,0,9,0,0,1,0,0,30,0,0 +46,2,106255,5,10,1,10,1,0,0,0,0,40,0,0 +47,3,282830,6,12,1,0,1,1,0,0,0,40,0,1 +47,2,243904,1,9,2,0,4,0,0,0,0,40,6,0 +69,2,165017,1,9,6,8,4,0,0,2538,0,40,0,0 +32,2,131584,1,9,1,5,1,0,0,7298,0,40,0,1 +51,2,427781,1,9,1,6,1,1,0,0,0,40,0,0 +36,2,334291,1,9,1,5,1,0,0,0,0,40,0,1 +50,4,173224,3,14,1,3,2,0,1,0,0,40,0,0 +29,2,87507,8,16,1,3,1,2,0,0,0,60,3,0 +32,2,187560,10,15,1,3,1,0,0,3908,0,40,0,0 +27,2,204497,12,6,2,6,0,3,0,0,0,75,0,0 +60,2,230545,7,4,2,0,0,0,1,0,0,35,1,0 +31,2,118161,1,9,1,4,1,0,0,0,0,40,0,0 +46,2,150499,6,12,1,10,1,0,0,0,0,40,0,0 +40,4,96554,1,9,0,0,3,0,1,0,0,40,0,0 +39,2,288551,5,10,1,10,1,1,0,0,0,52,0,1 +69,1,104003,7,4,1,5,1,0,0,0,0,55,0,0 +54,5,124963,0,13,1,1,1,0,0,0,0,40,0,1 +56,2,198388,1,9,2,0,0,0,1,0,0,40,0,0 +47,3,126204,5,10,2,0,0,0,1,0,0,40,0,0 +25,2,91709,6,12,0,9,0,0,1,0,0,45,0,0 +34,1,152109,1,9,1,6,1,0,0,0,0,60,0,0 +24,1,191954,7,4,0,7,3,0,0,0,0,50,0,0 +63,2,108097,5,10,1,10,1,0,0,10566,0,45,0,0 +29,4,289991,3,14,1,3,1,0,0,0,0,50,0,0 +64,2,92115,5,10,1,0,1,0,0,0,0,40,0,0 +44,2,320277,0,13,0,3,0,0,0,0,0,40,0,0 +26,2,33610,1,9,0,10,5,0,0,0,0,60,0,0 +36,2,168276,12,6,2,4,0,0,1,0,0,40,0,0 +55,0,175127,0,13,1,0,1,0,0,7688,0,38,0,1 +37,2,254973,1,9,1,2,2,0,1,0,0,40,0,1 +37,2,95336,12,6,0,8,0,0,0,0,0,65,0,0 +63,2,346975,0,13,1,3,2,0,1,7688,0,36,0,1 +33,2,227282,1,9,1,6,1,0,0,0,0,60,0,0 +19,2,138153,5,10,0,0,3,0,1,0,0,10,0,0 +57,4,174132,3,14,1,3,2,1,1,0,1977,40,0,1 +31,2,182237,6,12,1,5,1,0,0,4386,0,45,0,1 +58,4,217775,1,9,1,1,1,0,0,7298,0,40,0,1 +25,2,394503,5,10,1,5,1,0,0,0,0,40,0,0 +40,2,141657,1,9,2,0,4,0,1,0,0,40,0,0 +18,2,125441,2,7,0,4,3,0,0,1055,0,20,0,0 +26,2,172230,1,9,0,0,0,0,0,0,0,40,0,0 +29,2,282944,8,16,1,3,1,0,0,0,0,50,0,1 +45,4,55377,0,13,1,3,1,1,0,0,0,40,0,0 +35,0,49352,5,10,0,0,3,0,1,0,0,38,0,0 +32,2,213887,5,10,2,8,4,0,0,0,0,45,0,0 +61,1,24046,1,9,6,4,5,0,1,0,0,40,0,0 +26,0,208122,0,13,0,3,0,0,0,0,0,15,0,0 +56,2,176118,1,9,1,10,1,0,0,3103,0,40,0,1 +22,2,227994,5,10,3,0,3,2,1,0,0,39,0,0 +49,2,215389,0,13,1,8,1,1,0,0,0,48,0,0 +40,2,99434,1,9,1,4,2,0,1,0,0,12,0,0 +37,2,190964,1,9,4,1,3,0,0,0,0,40,0,0 +28,2,259840,0,13,1,5,1,0,0,0,0,60,0,1 +27,2,168827,1,9,1,8,1,0,0,0,0,40,0,0 +34,5,28984,9,11,2,5,4,0,1,0,0,40,0,0 +49,2,182211,4,5,1,2,1,0,0,0,0,45,0,0 +41,2,82393,5,10,0,10,3,2,0,0,0,40,0,0 +28,2,183639,0,13,0,0,0,0,0,0,0,21,0,0 +38,2,342448,5,10,1,1,1,0,0,0,0,55,0,1 +47,0,469907,6,12,1,11,1,0,0,0,1740,40,0,0 +28,4,211920,1,9,1,11,1,0,0,0,0,40,0,0 +44,0,33658,3,14,1,3,1,0,0,7688,0,50,0,1 +41,3,34178,0,13,2,3,0,0,0,0,0,40,0,0 +50,2,400630,10,15,1,3,1,0,0,0,0,36,0,1 +73,1,161251,1,9,6,10,0,0,0,0,0,24,0,0 +21,2,255685,5,10,0,4,3,1,0,0,0,40,31,0 +38,2,199256,1,9,2,0,4,0,1,0,0,40,0,0 +47,2,221666,5,10,2,9,4,0,1,0,0,40,0,0 +52,2,145409,5,10,1,6,1,0,0,15024,0,60,8,1 +24,2,39615,0,13,0,5,0,0,0,0,0,45,0,0 +44,2,104440,0,13,1,1,1,0,0,0,0,40,0,1 +27,2,151382,7,4,2,8,4,0,0,0,974,40,0,0 +61,1,503675,5,10,1,5,1,1,0,0,0,60,0,1 +58,2,306233,0,13,1,5,1,0,0,15024,0,40,0,1 +51,2,216475,0,13,0,5,0,0,1,0,1564,43,0,1 +49,2,50748,5,10,2,5,4,0,1,0,0,55,7,0 +23,2,107190,5,10,0,0,3,1,0,0,0,20,0,0 +19,2,206874,9,11,0,0,3,1,1,0,0,40,0,0 +21,2,83141,1,9,0,7,0,0,0,0,0,53,0,0 +56,2,444089,2,7,2,5,0,0,1,0,0,40,0,0 +35,2,141896,14,8,1,10,1,0,0,0,0,40,0,0 +37,3,33487,5,10,2,9,4,3,1,0,0,20,0,0 +41,2,65372,8,16,2,5,4,0,1,0,0,50,0,1 +30,2,341346,2,7,1,5,1,0,0,0,0,40,0,0 +47,2,287480,5,10,1,10,1,0,0,0,0,40,0,0 +59,5,107287,12,6,6,1,4,0,1,0,2559,50,0,1 +55,2,199067,2,7,1,8,1,0,0,0,0,32,0,0 +31,2,159737,12,6,0,0,4,1,1,0,0,40,0,0 +30,2,110643,3,14,1,0,1,0,0,4386,0,40,0,1 +24,2,117583,0,13,0,1,3,0,0,0,0,48,0,0 +49,1,43479,5,10,1,10,1,0,0,0,0,40,0,0 +23,2,203003,7,4,0,10,0,0,0,0,0,25,9,0 +50,2,133963,1,9,2,0,4,0,1,0,0,35,0,0 +38,2,227794,0,13,0,0,0,1,0,0,0,40,0,0 +20,1,112137,5,10,0,3,5,2,1,0,0,20,27,0 +49,1,110457,5,10,1,10,1,0,0,0,0,50,0,1 +45,2,281565,1,9,6,4,5,2,1,0,0,50,27,0 +46,3,297906,0,13,1,3,1,2,0,0,0,50,0,1 +19,2,151506,1,9,0,4,3,0,1,0,0,30,0,0 +31,3,139455,0,13,0,1,3,0,1,0,0,40,1,0 +38,2,26987,1,9,2,4,4,0,1,0,0,40,0,0 +56,1,233312,3,14,1,10,1,0,0,0,0,50,0,1 +24,2,161092,0,13,0,1,3,0,0,0,0,40,0,0 +58,4,98361,1,9,1,1,1,0,0,0,0,50,0,0 +28,2,188928,1,9,1,4,1,0,0,0,0,40,0,0 +22,2,164922,1,9,1,4,1,0,0,0,0,40,0,0 +46,2,185673,1,9,2,6,0,0,0,0,0,40,0,0 +30,2,193598,13,1,0,7,0,0,0,0,0,40,4,0 +56,2,274111,0,13,1,0,1,0,0,0,0,45,0,1 +56,2,160932,1,9,1,6,1,0,0,0,0,44,0,1 +50,2,44368,5,10,1,1,1,0,0,0,0,40,0,0 +30,2,280927,0,13,0,0,0,0,1,0,0,40,0,0 +24,2,222993,1,9,0,8,3,0,0,0,0,40,0,0 +42,3,25240,9,11,2,3,4,3,1,0,0,40,0,0 +31,1,204052,1,9,1,10,1,0,0,0,0,40,0,1 +46,2,169042,12,6,0,4,0,0,1,0,0,25,16,0 +31,2,104509,0,13,0,5,0,0,1,0,0,65,0,1 +38,4,185394,0,13,1,3,2,0,1,7688,0,40,0,1 +44,4,254146,3,14,1,3,1,0,0,0,0,40,0,1 +55,5,227856,0,13,1,1,1,0,0,0,2415,50,0,1 +19,2,183041,1,9,0,4,3,0,0,0,0,20,0,0 +45,2,107682,3,14,2,1,0,0,1,0,0,40,0,1 +50,5,287598,5,10,1,10,1,0,0,0,0,70,0,0 +53,2,182186,4,5,1,4,1,0,0,0,0,40,21,0 +41,5,194636,0,13,1,5,1,0,0,99999,0,65,0,1 +45,2,112305,5,10,2,4,4,1,1,0,0,40,0,0 +21,2,212661,12,6,0,0,0,0,1,0,0,39,0,0 +37,2,32709,0,13,1,9,2,0,1,0,0,40,0,1 +42,3,46366,1,9,4,0,4,1,1,0,0,40,0,0 +37,1,24106,1,9,1,9,1,0,0,0,0,30,0,0 +45,1,40666,9,11,1,7,1,0,0,0,0,60,0,0 +32,2,182975,5,10,0,9,0,0,1,0,0,20,0,0 +30,2,345122,10,15,1,3,1,0,0,0,0,50,0,0 +37,2,120045,1,9,2,8,0,0,1,0,0,56,0,0 +32,2,152940,5,10,1,5,1,0,0,0,0,40,0,1 +43,2,243580,0,13,1,3,1,0,0,0,0,40,0,1 +46,2,182128,3,14,2,3,4,0,1,6497,0,50,0,0 +33,2,101562,3,14,0,1,0,0,1,0,0,40,0,0 +48,2,108699,1,9,0,0,0,0,1,0,0,40,0,0 +34,2,175878,1,9,1,5,1,0,1,0,0,40,0,0 +34,4,177675,5,10,0,11,0,0,0,0,0,50,0,1 +33,2,213887,1,9,2,7,0,0,0,0,0,40,0,0 +36,2,357619,0,13,1,1,2,0,1,0,0,60,9,0 +23,2,435835,1,9,0,5,0,0,0,0,1669,55,0,0 +39,2,165799,1,9,1,1,1,0,0,0,0,40,0,0 +22,2,71469,6,12,0,5,3,0,1,0,0,25,0,0 +19,2,229745,1,9,0,7,3,0,0,0,0,20,0,0 +47,2,284916,1,9,1,5,1,0,0,7298,0,45,0,1 +46,2,28419,9,11,0,6,0,0,0,0,0,50,0,0 +47,2,26950,3,14,2,5,0,0,1,0,0,6,0,0 +47,1,107231,8,16,1,3,1,0,0,0,0,35,0,1 +52,4,512103,5,10,2,6,0,0,1,0,0,40,0,0 +38,1,245090,4,5,1,10,1,0,0,0,0,40,4,0 +58,2,314153,1,9,1,5,1,0,0,0,0,40,0,1 +32,2,243988,11,3,1,4,1,0,0,0,0,40,4,0 +54,1,82551,9,11,1,9,5,0,1,0,0,10,0,0 +20,2,42706,5,10,0,0,0,0,0,0,0,25,0,0 +25,2,235795,6,12,0,5,0,0,0,0,0,48,0,0 +25,1,108001,4,5,0,10,0,0,0,0,0,15,0,0 +36,0,112497,0,13,2,3,0,0,0,0,1876,44,0,0 +69,1,128206,1,9,1,9,1,0,0,0,0,30,0,0 +28,2,224634,0,13,1,3,2,0,1,0,0,45,0,1 +20,2,362999,5,10,0,0,3,0,1,0,0,20,0,0 +21,2,346693,7,4,0,7,4,0,0,0,0,40,0,0 +37,2,175759,0,13,1,9,1,0,0,0,0,40,0,1 +21,2,99199,1,9,0,8,3,0,0,0,0,32,0,0 +39,2,143445,1,9,1,4,5,1,1,0,0,40,0,0 +34,2,118710,9,11,1,4,1,0,0,0,0,40,0,1 +33,4,224185,1,9,1,10,1,0,0,0,0,40,0,0 +47,2,118972,1,9,1,6,1,0,0,0,0,50,0,1 +29,2,165360,9,11,0,0,0,0,1,0,0,40,0,0 +48,2,38950,1,9,1,9,1,0,0,0,0,89,0,0 +42,5,277256,8,16,1,3,1,0,0,0,1977,60,0,1 +29,2,247151,2,7,2,8,4,0,1,0,0,40,0,0 +34,2,213722,1,9,0,2,3,0,0,0,0,40,0,0 +20,2,209955,5,10,0,4,3,0,0,0,0,25,0,0 +41,2,174395,3,14,1,3,1,0,0,0,0,40,0,1 +45,2,138626,5,10,2,1,0,0,0,0,1876,50,0,0 +23,2,200207,1,9,2,2,3,0,0,0,0,44,0,0 +19,2,156587,5,10,0,0,3,0,1,0,0,38,0,0 +24,2,33016,5,10,0,10,3,0,0,0,0,40,0,0 +32,2,153588,1,9,2,10,0,0,0,0,0,40,0,0 +52,2,99736,3,14,2,3,4,0,0,15020,0,50,0,1 +36,2,284166,1,9,0,5,4,0,0,0,0,60,0,1 +18,2,716066,12,6,0,8,3,0,0,0,0,30,0,0 +27,2,188519,1,9,2,5,3,0,1,0,0,40,0,0 +26,2,109080,5,10,1,5,1,0,0,0,0,60,0,0 +52,2,174421,6,12,2,3,4,0,1,0,0,32,0,0 +24,2,259351,5,10,0,10,4,3,0,0,0,40,4,0 +42,3,284403,1,9,2,0,0,1,0,0,0,40,0,0 +39,2,85319,10,15,1,3,2,0,1,7688,0,60,0,1 +20,0,340475,5,10,0,0,3,0,1,0,0,10,0,0 +35,2,170617,1,9,0,8,4,1,1,0,0,48,0,0 +54,2,94055,0,13,1,4,1,0,0,0,0,40,0,0 +24,2,117779,0,13,0,1,3,0,0,0,0,40,0,0 +24,2,209770,0,13,0,3,0,0,1,0,0,8,0,0 +20,2,317443,5,10,0,0,3,1,1,0,0,15,0,0 +28,2,107411,0,13,0,3,0,0,1,0,0,35,0,0 +36,1,122493,1,9,1,10,1,0,0,0,0,47,0,0 +38,2,101978,5,10,4,8,0,0,0,0,2258,55,0,1 +22,2,335453,1,9,0,0,0,0,1,0,0,60,0,0 +56,2,318329,1,9,1,8,1,0,0,0,0,40,0,0 +24,2,100321,0,13,1,3,1,0,0,0,0,45,0,0 +24,1,81145,5,10,0,4,0,0,1,0,0,75,0,0 +22,2,62865,6,12,0,0,0,0,1,0,0,40,0,0 +21,2,176262,5,10,0,1,3,0,1,0,0,30,0,0 +42,2,168103,0,13,1,1,1,0,0,0,0,40,0,1 +41,4,208174,3,14,2,3,4,0,1,0,0,55,0,0 +19,2,188815,1,9,0,4,3,0,1,34095,0,20,0,0 +67,1,226092,5,10,1,7,1,0,0,0,0,44,0,0 +20,2,212668,5,10,0,5,3,0,1,0,0,30,0,0 +32,2,381583,1,9,1,10,1,4,0,0,0,40,0,0 +46,2,239439,1,9,4,8,3,1,1,0,0,40,0,0 +52,2,172493,1,9,0,5,0,0,1,0,0,36,0,0 +44,2,239876,0,13,2,3,4,1,0,0,0,40,0,0 +37,4,218184,0,13,1,3,1,0,0,0,1887,40,0,1 +27,1,206889,5,10,1,7,1,0,0,0,0,50,0,0 +35,2,110668,1,9,1,8,2,1,1,0,0,35,0,0 +30,2,211028,1,9,0,0,0,0,1,0,0,45,0,0 +64,4,202984,1,9,1,10,1,0,0,3137,0,40,0,0 +48,2,20296,1,9,2,0,0,0,1,0,0,37,0,1 +35,2,194690,7,4,2,9,4,0,1,0,0,40,0,0 +28,1,204984,0,13,0,9,0,0,0,0,0,45,0,0 +63,1,35021,0,13,1,3,1,2,0,0,1977,32,26,1 +40,1,238574,10,15,1,3,1,0,0,0,0,55,0,1 +33,2,345360,5,10,0,5,0,0,0,0,0,40,0,0 +40,2,192381,5,10,1,10,1,0,0,0,0,50,0,1 +25,2,479765,7,4,0,5,5,0,0,0,0,45,24,0 +45,5,34091,0,13,1,1,1,0,0,0,0,38,0,1 +30,2,151773,5,10,1,8,1,0,0,0,0,40,0,1 +53,2,299080,5,10,0,0,4,1,1,0,0,40,0,0 +63,2,135339,1,9,1,0,1,2,0,2105,0,40,36,0 +27,4,52156,5,10,1,11,1,0,0,0,0,60,0,0 +31,2,318647,2,7,0,10,0,0,0,0,0,40,0,0 +33,2,80145,1,9,1,6,1,0,0,0,0,60,0,0 +39,0,343646,0,13,2,11,0,0,0,0,0,40,4,1 +42,1,198692,5,10,1,10,1,0,0,0,0,45,0,1 +19,2,266635,1,9,0,4,3,1,0,0,0,30,0,0 +31,2,197672,0,13,1,3,1,0,0,0,0,40,0,0 +53,2,185846,1,9,1,10,1,0,0,0,0,40,0,0 +47,1,315110,5,10,1,3,1,0,0,0,0,20,0,0 +27,2,220754,8,16,0,0,3,0,1,0,0,40,0,0 +22,2,64292,1,9,0,9,0,0,1,0,0,40,0,0 +29,2,126060,1,9,1,5,2,0,1,0,0,40,0,1 +52,2,78012,1,9,6,5,4,0,1,0,1762,40,0,0 +32,2,210562,9,11,2,10,3,0,0,0,0,46,0,0 +23,2,350181,1,9,0,5,0,0,0,0,0,40,0,0 +27,2,233421,5,10,0,0,3,0,0,0,0,20,0,0 +53,2,167170,1,9,6,8,0,1,1,0,0,40,0,0 +18,2,260801,1,9,0,2,3,0,0,0,0,20,0,0 +41,2,173370,0,13,4,5,4,0,1,0,0,30,0,0 +27,2,135520,1,9,1,8,2,0,1,0,0,40,21,0 +30,2,121308,5,10,2,5,3,0,0,0,0,40,0,0 +41,2,444743,1,9,2,9,4,0,1,0,0,40,0,0 +21,2,65225,5,10,0,0,0,0,1,0,0,30,0,0 +58,0,136982,1,9,3,4,4,1,1,0,0,40,6,0 +45,0,271962,0,13,2,11,0,0,1,0,0,40,0,0 +40,2,204046,12,6,2,6,3,0,0,0,0,40,0,0 +21,2,225823,5,10,0,0,0,0,1,0,0,40,0,0 +29,2,183009,0,13,0,3,0,4,1,0,1590,40,0,0 +50,2,121038,9,11,1,4,2,1,1,0,0,40,0,0 +26,2,49092,1,9,1,10,1,0,0,0,0,40,0,0 +23,2,148709,1,9,4,2,5,0,1,0,0,40,0,0 +27,2,209205,0,13,0,9,3,0,0,0,0,40,0,0 +36,4,285865,0,13,0,0,0,1,1,0,0,40,0,0 +22,3,216129,1,9,0,0,5,0,0,0,0,40,0,0 +37,3,40955,5,10,0,4,3,0,0,0,0,40,28,0 +54,2,197189,0,13,1,6,1,0,0,0,0,40,0,0 +36,2,33001,1,9,2,7,4,0,0,0,0,50,0,0 +44,2,227399,9,11,1,1,1,1,0,0,0,40,0,0 +38,2,164050,5,10,1,11,1,1,0,0,0,40,0,1 +49,2,259087,5,10,2,10,0,0,1,0,0,40,0,0 +18,2,236262,2,7,0,2,3,0,0,0,0,12,0,0 +26,2,177929,0,13,0,5,0,0,0,0,0,48,0,0 +32,2,199963,2,7,1,8,2,0,1,0,0,40,0,0 +35,0,98776,1,9,0,9,3,0,0,0,0,40,0,0 +40,2,135056,1,9,0,0,0,0,1,0,0,45,0,0 +40,1,55363,1,9,1,10,1,0,0,3411,0,40,0,0 +42,0,102343,10,15,1,3,1,2,0,0,0,72,3,1 +30,2,231263,1,9,1,5,1,0,0,0,0,40,0,0 +19,2,226913,5,10,0,5,3,0,1,0,0,20,0,0 +36,2,129573,6,12,1,5,1,0,0,0,0,60,0,1 +31,2,191001,1,9,0,5,0,0,1,0,0,40,0,0 +50,3,69345,6,12,1,1,1,0,0,0,0,60,0,0 +38,2,204556,1,9,2,10,0,1,0,0,0,40,0,0 +35,2,192626,5,10,1,3,1,0,0,0,0,50,0,1 +45,2,202812,0,13,1,3,1,0,0,0,0,40,0,1 +29,2,405177,12,6,4,5,4,0,1,0,0,40,0,0 +41,2,227890,5,10,2,10,0,0,0,0,0,46,0,1 +33,2,101352,10,15,0,3,0,0,1,0,0,50,0,1 +49,2,82572,5,10,0,4,0,0,1,0,0,60,0,0 +28,2,132686,5,10,1,1,1,0,0,0,0,40,0,1 +49,4,149210,0,13,1,11,1,1,0,15024,0,40,0,1 +27,2,245661,1,9,4,8,3,0,1,0,0,40,0,0 +47,5,483596,1,9,1,1,1,0,0,2885,0,32,0,0 +42,0,104663,8,16,0,1,0,0,1,0,0,40,25,1 +30,2,347166,1,9,0,1,0,0,0,0,0,60,0,0 +37,4,108540,1,9,1,10,1,0,0,0,0,40,0,0 +37,2,333305,8,16,1,3,2,0,1,0,0,35,0,0 +51,2,155408,1,9,3,5,0,1,1,0,0,38,0,0 +27,3,246372,1,9,1,4,1,0,0,0,0,40,0,0 +53,2,30290,1,9,0,5,0,0,1,0,0,40,0,0 +45,2,347321,1,9,0,10,0,0,0,0,0,40,0,0 +37,5,205852,0,13,1,3,1,0,0,0,0,45,0,0 +54,0,93449,3,14,1,3,1,2,0,0,0,40,3,1 +47,5,116927,1,9,1,1,1,0,0,0,0,42,0,1 +35,2,164526,1,9,1,4,1,0,0,0,0,40,29,1 +33,2,31573,1,9,1,8,1,0,0,0,0,40,0,0 +28,4,125159,5,10,0,0,5,1,0,0,0,40,19,0 +39,0,201105,0,13,1,1,2,0,1,0,0,55,0,1 +33,2,150570,0,13,1,5,1,0,0,0,0,40,0,0 +34,2,118941,2,7,0,4,0,0,1,0,0,40,38,0 +53,2,141388,1,9,1,6,1,0,0,0,0,40,0,1 +21,2,174714,6,12,0,0,3,0,0,0,0,35,0,0 +31,0,75755,8,16,1,1,1,0,0,7298,0,55,0,1 +63,2,133144,1,9,1,3,1,0,0,0,0,45,0,0 +21,1,318865,5,10,0,4,3,0,0,0,0,30,0,0 +59,2,109638,1,9,1,10,1,0,0,0,0,40,0,1 +50,2,92969,15,2,4,3,4,1,1,0,0,40,0,0 +19,2,144161,1,9,0,6,3,0,0,0,0,30,0,0 +31,2,183778,0,13,0,9,0,0,0,0,0,45,0,0 +23,2,398904,0,13,1,3,2,0,1,0,0,40,0,0 +45,2,170846,9,11,1,1,2,0,1,0,0,40,0,1 +35,4,204277,0,13,1,3,1,0,0,0,0,40,0,0 +32,2,205152,0,13,0,10,3,0,0,0,0,40,0,0 +20,2,225395,7,4,0,8,5,0,1,0,0,60,4,0 +38,2,33975,1,9,1,1,5,0,0,0,0,40,0,1 +49,2,147032,1,9,1,4,2,2,1,0,0,8,11,0 +64,2,174826,1,9,2,8,0,0,1,0,0,40,0,0 +60,4,232769,2,7,1,6,1,0,0,0,0,20,0,0 +25,2,36984,0,13,0,3,0,0,1,0,0,50,0,0 +21,2,292264,1,9,0,10,0,0,0,0,0,35,0,0 +26,2,303973,1,9,0,13,5,0,1,0,1602,15,4,0 +23,2,287988,5,10,0,0,0,0,0,0,0,20,0,0 +67,5,330144,3,14,1,5,1,0,0,0,0,48,0,1 +24,2,191948,1,9,2,5,4,0,1,0,0,30,0,0 +46,2,324601,15,2,4,8,3,0,1,0,0,40,24,0 +38,0,200289,8,16,1,3,1,2,0,0,0,40,18,0 +20,2,113307,7,4,0,8,5,0,0,0,0,40,0,0 +26,2,155213,0,13,0,3,0,0,0,0,0,48,0,0 +58,2,175127,1,9,1,8,1,0,0,0,0,40,0,0 +31,0,358461,5,10,0,4,0,2,0,0,0,40,0,0 +37,0,354929,6,12,2,11,0,1,0,0,0,38,0,0 +45,2,112929,7,4,2,8,0,1,1,0,0,35,0,0 +33,2,132832,1,9,0,0,0,0,1,0,0,50,0,0 +33,0,357691,3,14,1,11,1,1,0,0,0,40,0,0 +35,2,114605,1,9,2,2,0,0,0,0,0,25,0,0 +60,1,525878,1,9,1,1,1,1,0,0,0,40,0,0 +21,2,68358,5,10,0,5,3,0,1,0,0,20,0,0 +38,2,174571,12,6,1,10,1,1,0,0,0,45,0,0 +40,2,42703,9,11,2,10,4,0,1,0,0,40,0,0 +40,2,220589,5,10,1,5,2,0,1,0,0,40,0,1 +44,1,197558,10,15,1,3,1,0,0,0,0,70,0,1 +27,2,423250,5,10,1,1,1,0,0,0,0,60,0,0 +34,1,29254,5,10,1,10,1,0,0,0,0,55,0,1 +49,4,276247,5,10,1,11,1,0,0,0,0,40,0,0 +37,2,213841,5,10,1,10,1,0,0,0,0,50,0,1 +52,2,181677,12,6,1,6,1,0,0,0,0,30,0,1 +46,2,160061,5,10,1,8,1,1,0,0,0,40,0,0 +43,2,265266,1,9,1,10,1,0,0,0,0,40,0,0 +46,4,222115,0,13,2,0,0,0,1,99999,0,40,0,1 +25,0,194954,5,10,1,4,2,0,1,0,0,15,0,0 +48,2,156926,0,13,2,0,0,0,0,0,0,40,0,0 +36,4,217414,5,10,2,11,4,0,0,0,0,55,0,0 +37,2,538443,1,9,2,10,0,0,0,14344,0,40,0,1 +42,2,383493,3,14,1,3,1,0,0,0,0,50,0,1 +60,2,193235,6,12,1,0,1,0,0,0,0,24,0,0 +37,5,99452,5,10,1,6,1,0,0,0,0,55,0,1 +44,4,254134,6,12,2,9,0,1,0,0,0,40,0,0 +32,2,90446,12,6,1,10,1,0,0,0,0,40,0,0 +29,2,116613,0,13,0,0,3,0,1,0,0,40,20,0 +42,4,238188,3,14,1,3,1,0,0,0,0,35,0,1 +17,2,95909,2,7,0,2,3,0,0,0,0,12,0,0 +41,2,82319,14,8,1,4,2,0,1,0,0,10,0,0 +34,2,182274,5,10,1,1,2,0,1,0,1887,40,0,1 +56,2,179625,12,6,4,4,4,0,1,0,0,32,0,0 +28,2,119793,5,10,0,0,3,0,0,0,0,40,0,0 +28,1,254989,2,7,0,5,3,0,0,0,0,40,0,0 +19,2,104830,7,4,0,6,4,0,0,0,0,25,24,0 +49,3,110373,5,10,1,9,1,0,0,0,0,40,0,1 +36,1,135416,5,10,1,4,2,0,1,0,0,50,0,0 +25,2,298225,5,10,1,6,1,0,0,0,0,35,0,0 +42,2,166740,0,13,2,3,0,0,0,0,0,40,0,0 +47,1,213668,10,15,1,3,1,0,0,0,1977,50,0,1 +26,2,276624,5,10,1,11,1,0,0,0,0,40,0,0 +35,2,226789,5,10,1,1,1,0,0,0,0,58,0,0 +37,2,31023,1,9,1,10,1,0,0,0,0,45,0,0 +39,4,116666,1,9,0,11,3,3,0,4650,0,48,0,0 +42,2,136986,1,9,1,1,1,0,0,0,0,35,0,1 +41,2,179580,5,10,2,4,0,0,1,0,0,36,0,1 +23,2,103277,5,10,2,4,3,0,1,0,0,24,0,0 +31,3,351141,1,9,1,9,1,0,0,0,0,40,0,0 +36,4,191161,5,10,1,11,1,0,0,0,0,57,0,1 +20,2,148709,5,10,0,3,4,0,1,0,0,25,0,0 +36,2,128382,5,10,0,8,4,0,0,0,0,45,0,0 +50,2,144361,1,9,1,8,1,0,0,0,0,50,0,1 +37,2,172538,1,9,0,8,3,0,0,0,0,40,0,0 +25,2,102476,0,13,0,7,3,0,0,27828,0,50,0,1 +39,2,46028,5,10,2,4,4,0,1,0,0,60,0,0 +32,2,198452,1,9,1,7,2,0,1,0,0,40,0,0 +59,2,193895,5,10,6,0,0,0,1,0,0,35,0,0 +29,2,233421,0,13,1,10,1,0,0,3411,0,45,0,0 +50,2,378747,1,9,1,6,1,1,0,0,0,40,0,0 +42,2,31251,9,11,1,5,1,0,0,0,0,37,0,0 +32,2,71540,5,10,2,3,0,0,0,0,0,40,0,0 +48,2,194772,6,12,1,5,1,0,0,0,1902,40,0,1 +20,2,34568,1,9,1,10,1,0,0,3781,0,35,0,0 +50,1,36480,12,6,2,10,0,0,0,0,0,45,0,0 +18,2,116528,5,10,0,10,0,0,0,0,0,30,0,0 +60,2,52152,3,14,0,3,0,0,0,0,0,50,0,0 +42,4,227065,3,14,0,3,0,0,0,0,0,22,0,0 +49,2,84013,1,9,2,4,4,0,1,0,0,35,0,0 +35,5,82051,5,10,1,5,2,0,1,0,0,40,0,0 +30,1,176185,6,12,1,5,1,0,0,0,0,60,10,0 +59,2,115414,5,10,1,1,1,0,0,0,0,40,0,1 +24,5,493034,1,9,0,4,0,1,0,13550,0,50,0,1 +55,2,354923,6,12,2,0,4,0,1,0,0,40,0,0 +19,2,393712,1,9,0,0,3,0,1,0,0,20,0,0 +39,2,98941,1,9,1,10,1,0,0,0,0,40,0,0 +48,2,141483,5,10,2,1,4,0,1,0,0,40,0,0 +44,2,172479,0,13,1,3,1,0,0,7688,0,40,0,1 +21,2,226145,5,10,0,2,3,0,0,0,0,30,0,0 +23,2,394612,0,13,0,9,3,1,0,0,0,40,0,0 +22,2,231085,5,10,0,4,3,0,0,0,0,30,0,0 +55,1,183810,3,14,1,3,1,0,0,0,0,55,0,1 +19,2,186159,5,10,0,5,0,0,1,0,0,40,0,0 +23,2,162282,5,10,0,2,0,0,0,0,0,25,0,0 +46,2,219021,1,9,1,6,1,0,0,15024,0,44,0,1 +23,2,273206,0,13,0,0,0,0,1,0,0,23,0,0 +47,5,332355,3,14,1,1,1,0,0,15024,0,50,0,1 +23,2,102729,5,10,0,5,3,0,1,0,0,15,0,0 +42,2,198096,5,10,1,4,1,0,0,0,0,40,0,1 +22,0,292933,0,13,0,0,3,0,1,0,0,10,0,0 +18,2,135924,1,9,0,0,3,0,0,0,0,20,0,0 +37,2,99146,0,13,1,1,1,0,0,0,1977,50,0,1 +34,2,27409,4,5,1,10,1,0,0,0,0,50,0,0 +30,2,299507,6,12,4,4,4,0,1,0,0,40,0,0 +62,1,102631,5,10,6,7,4,0,1,0,0,50,0,0 +51,2,153486,5,10,1,2,1,0,0,0,0,40,0,0 +34,2,434292,1,9,1,4,1,1,0,0,0,30,0,0 +28,1,240172,3,14,0,3,3,0,0,0,0,40,0,0 +56,2,219426,12,6,0,2,0,0,0,0,0,40,0,0 +46,2,295791,1,9,2,9,0,0,1,0,0,30,0,0 +46,2,114032,5,10,1,9,1,0,0,0,1887,45,0,1 +23,4,496382,5,10,3,0,3,0,1,0,0,40,24,0 +33,2,376483,0,13,1,0,2,1,1,0,0,30,0,0 +27,2,107218,1,9,0,4,3,2,0,0,0,40,0,0 +21,2,246207,5,10,0,0,3,1,1,0,0,20,0,0 +36,2,83089,11,3,1,8,1,0,0,7298,0,40,4,1 +37,4,328301,0,13,2,3,0,0,1,0,0,36,0,0 +39,4,301614,2,7,1,4,1,0,0,0,0,40,0,0 +36,2,199739,1,9,1,6,1,0,0,7298,0,60,0,1 +24,2,180060,6,12,0,10,0,0,0,2354,0,40,0,0 +26,2,121040,6,12,0,1,3,1,1,0,0,40,0,0 +37,2,125550,1,9,2,5,0,0,1,0,0,60,0,0 +34,2,170772,1,9,1,10,1,0,0,0,0,50,0,0 +33,2,180551,1,9,2,1,4,0,1,0,0,40,0,0 +33,1,48189,1,9,1,11,1,0,0,0,0,30,0,0 +20,2,432154,1,9,0,5,3,0,1,0,0,8,4,0 +26,2,263200,5,10,2,0,4,0,1,0,0,38,0,0 +47,2,123207,1,9,1,0,2,0,1,0,0,20,0,1 +17,2,110798,2,7,0,5,3,0,1,0,0,20,0,0 +53,2,238481,9,11,1,1,1,0,0,0,1485,40,0,0 +31,2,185528,5,10,2,5,3,0,1,0,0,35,0,0 +34,2,181311,2,7,1,8,1,0,0,0,0,40,0,0 +23,2,528616,11,3,1,4,1,0,0,0,0,40,4,0 +39,2,272950,0,13,1,10,1,0,0,0,0,45,0,1 +21,2,197583,5,10,0,0,3,0,1,0,0,20,0,0 +40,2,48612,1,9,0,0,4,1,1,0,0,35,0,0 +54,4,31533,3,14,1,0,1,0,0,7298,0,40,0,1 +32,3,148138,0,13,1,3,1,2,0,0,2002,40,10,0 +29,4,30069,1,9,1,4,2,0,1,2635,0,40,0,0 +27,4,230885,0,13,1,11,1,0,0,0,0,45,0,1 +54,2,174102,5,10,0,1,0,0,0,0,0,40,0,1 +23,2,352606,1,9,2,13,4,0,1,0,0,40,0,0 +38,2,241153,3,14,1,1,1,0,0,0,0,48,0,1 +54,2,155433,1,9,1,4,2,0,1,0,0,35,0,0 +21,2,109414,5,10,0,3,3,2,0,0,1974,40,0,0 +40,2,125461,9,11,0,3,0,0,0,0,0,42,0,0 +19,2,331556,12,6,0,4,0,0,1,0,0,40,0,0 +35,2,223514,0,13,1,0,2,1,1,0,0,40,0,0 +39,2,115418,5,10,0,0,3,0,1,2174,0,45,0,0 +41,2,147206,14,8,1,2,1,0,0,0,0,40,0,1 +26,2,174592,5,10,0,0,0,0,1,0,0,40,0,0 +35,2,268620,1,9,2,4,0,0,1,0,0,45,0,0 +70,1,150886,5,10,1,10,1,0,0,0,0,25,0,0 +45,2,112362,12,6,1,5,1,0,0,0,0,40,0,0 +83,2,195507,1,9,6,11,0,0,0,0,0,55,0,0 +59,2,192983,1,9,4,4,0,0,1,0,0,40,0,0 +18,2,120544,4,5,0,4,3,1,0,0,0,15,0,0 +31,2,59083,1,9,1,0,1,0,0,0,0,40,0,0 +43,2,208277,3,14,1,3,2,0,1,0,0,45,0,1 +24,4,184678,0,13,0,3,0,0,1,0,0,40,0,0 +33,2,278736,9,11,1,8,1,0,0,0,0,50,0,0 +48,4,39464,3,14,0,3,0,0,1,0,0,52,0,0 +27,2,162343,0,13,1,1,1,0,0,0,0,40,21,0 +41,2,204046,1,9,1,10,1,0,0,0,0,40,0,0 +25,2,255647,1,9,1,4,2,0,1,0,0,25,4,0 +53,2,123011,1,9,2,6,0,0,0,0,0,40,0,1 +66,1,291362,10,15,1,3,1,0,0,0,0,50,0,0 +31,2,159187,5,10,1,10,1,0,0,0,0,40,0,1 +30,0,126414,0,13,3,0,0,0,0,0,0,40,0,0 +22,2,227626,1,9,2,6,0,0,0,0,0,40,0,0 +47,5,173783,0,13,1,5,1,0,0,15024,0,60,0,1 +74,2,211075,1,9,1,1,1,0,0,0,0,40,0,1 +37,2,176756,5,10,1,0,1,1,0,0,1485,70,0,1 +35,1,31095,5,10,4,7,0,0,0,4101,0,60,0,0 +51,1,32372,0,13,1,1,1,0,0,0,1672,70,0,0 +40,2,331651,5,10,4,4,0,0,1,0,0,40,0,0 +51,4,146325,8,16,1,3,1,0,0,0,1887,40,0,1 +26,2,515025,12,6,1,2,2,0,1,0,0,40,0,0 +53,2,394474,6,12,0,0,4,1,1,0,0,40,0,0 +32,2,400535,1,9,1,10,1,0,0,3781,0,40,0,0 +29,1,337505,5,10,1,10,1,2,0,0,0,40,27,0 +42,2,211860,1,9,4,0,0,0,0,0,0,40,0,0 +22,2,102684,5,10,0,6,0,0,0,0,0,32,0,0 +33,2,121966,1,9,2,0,0,0,1,0,0,40,0,0 +21,2,396790,1,9,0,6,3,1,0,0,0,20,0,0 +46,4,149949,0,13,1,3,1,0,0,0,0,45,0,1 +25,2,252187,2,7,0,2,0,0,0,0,0,40,0,0 +29,2,209934,11,3,1,4,1,0,0,0,0,40,4,0 +29,3,229300,0,13,0,3,0,0,0,0,0,48,0,0 +33,2,170769,8,16,2,5,0,0,0,99999,0,60,0,1 +50,2,200618,6,12,2,10,0,0,0,0,0,40,0,0 +22,2,216984,1,9,0,0,0,3,1,0,0,40,0,0 +40,2,212760,1,9,2,10,0,0,0,0,0,40,0,0 +28,2,150309,1,9,1,8,1,3,0,0,0,45,0,0 +54,2,174655,1,9,1,0,1,0,0,0,0,40,0,0 +29,2,109621,1,9,1,10,1,0,0,0,0,40,0,0 +49,2,225124,1,9,6,8,4,1,1,0,0,40,0,0 +46,2,172695,2,7,6,4,0,0,1,0,0,27,22,0 +71,1,238479,12,6,1,10,1,0,0,0,0,8,0,0 +27,2,37754,5,10,1,7,1,0,0,0,0,80,0,0 +56,2,85018,1,9,0,0,0,0,1,0,0,40,0,0 +64,2,256466,1,9,1,9,1,2,0,0,0,60,11,1 +23,2,169188,5,10,1,1,2,0,1,0,0,25,0,0 +36,2,210945,0,13,1,3,1,0,0,0,0,40,0,1 +39,4,287031,3,14,1,3,1,0,0,0,0,45,0,1 +26,2,224361,1,9,0,1,0,0,0,0,0,40,0,0 +31,3,108464,6,12,1,9,1,0,0,0,0,40,0,0 +36,2,75826,0,13,2,0,4,0,1,0,0,40,0,0 +43,2,120277,1,9,1,10,1,0,0,0,0,40,0,1 +25,2,104439,5,10,0,0,0,0,1,0,0,50,0,0 +27,2,56870,1,9,1,8,1,0,0,0,0,40,0,0 +24,2,200819,14,8,0,5,0,0,0,0,0,40,0,0 +50,1,170562,6,12,1,11,1,0,0,0,0,20,0,0 +30,2,80933,1,9,1,10,1,0,0,0,0,40,0,0 +24,2,33088,2,7,0,2,0,0,0,0,0,40,0,0 +41,4,112763,3,14,2,3,4,0,1,7430,0,36,0,1 +29,2,177651,5,10,0,1,0,0,0,0,0,45,0,0 +31,2,261943,5,10,1,1,1,0,0,0,0,40,0,0 +54,2,169785,5,10,2,1,0,0,1,0,0,40,25,0 +20,2,141481,2,7,1,5,5,0,1,0,0,50,0,0 +37,2,433491,1,9,0,4,3,0,0,0,0,40,0,0 +28,4,86615,1,9,0,4,3,1,0,0,0,30,0,0 +39,2,125550,1,9,1,0,2,0,1,0,0,40,0,1 +46,0,421223,5,10,0,1,0,0,1,0,0,40,0,0 +35,2,26999,0,13,4,1,4,0,1,0,0,42,0,0 +36,1,241998,5,10,1,5,1,0,0,99999,0,20,0,1 +44,2,115323,3,14,1,1,1,0,0,0,0,40,0,1 +34,5,23778,0,13,2,1,0,0,0,0,0,50,0,0 +28,1,190836,1,9,1,5,1,0,0,0,0,50,0,1 +38,5,159179,10,15,1,3,1,0,0,0,0,45,0,1 +35,2,163237,0,13,1,5,1,0,0,0,0,52,0,1 +61,2,202202,1,9,0,0,0,0,1,0,0,40,0,0 +45,2,168837,5,10,2,5,4,0,1,0,0,40,0,0 +36,2,112271,1,9,1,6,1,0,0,0,0,40,0,0 +34,2,52537,1,9,0,6,4,1,0,0,0,30,0,0 +27,2,38353,9,11,1,5,1,0,0,0,0,60,0,0 +22,2,141698,12,6,0,10,4,0,0,0,0,40,0,0 +26,2,28856,0,13,0,9,0,0,1,0,0,40,0,0 +19,2,175652,2,7,0,4,5,0,1,0,0,15,0,0 +36,2,213008,1,9,2,7,0,0,0,0,0,40,0,0 +51,2,196501,0,13,2,1,0,0,0,14084,0,50,0,1 +63,2,118798,1,9,1,10,1,0,0,99999,0,40,0,1 +51,2,92463,1,9,1,0,1,0,0,0,0,40,0,0 +20,0,125165,5,10,0,0,3,0,1,0,0,25,0,0 +42,1,103980,9,11,1,3,1,0,0,0,0,50,0,0 +25,2,53903,5,10,1,10,1,0,0,0,0,40,0,0 +40,2,179735,9,11,2,0,4,0,1,0,0,50,0,0 +49,2,122177,1,9,0,2,3,0,0,0,0,80,0,0 +46,2,188161,1,9,4,8,3,1,1,0,0,40,0,0 +32,1,170108,1,9,4,5,0,0,0,0,0,50,0,0 +28,2,175262,5,10,1,2,1,1,0,0,0,40,4,0 +19,2,164395,1,9,0,0,3,0,1,0,0,25,0,0 +18,2,115630,2,7,0,0,3,1,0,0,0,20,0,0 +39,2,178815,1,9,0,5,0,0,0,0,0,55,0,0 +60,1,168223,0,13,2,3,0,0,1,0,0,30,0,0 +46,4,202560,0,13,2,3,0,0,1,0,1408,40,0,0 +38,2,100295,7,4,1,8,2,0,1,0,0,50,8,1 +36,2,172256,1,9,1,8,1,0,0,0,0,44,0,1 +45,2,51664,5,10,1,5,1,0,0,0,0,40,0,0 +60,0,358893,0,13,2,3,0,0,1,0,2339,40,0,0 +30,2,115963,2,7,1,10,1,0,0,0,0,40,0,0 +22,2,333910,5,10,0,9,0,0,1,0,0,43,0,0 +23,2,148948,5,10,0,1,0,0,0,0,0,45,0,0 +48,0,130561,5,10,0,3,0,1,1,0,0,24,0,0 +46,2,428350,1,9,1,4,3,0,1,0,0,15,0,0 +43,2,188808,3,14,1,1,1,0,0,0,0,45,0,1 +25,2,112847,1,9,1,6,3,4,0,0,0,40,0,0 +50,2,110748,5,10,0,3,0,0,0,0,0,40,0,0 +61,5,156653,1,9,2,5,0,0,0,0,0,55,0,0 +35,2,196491,0,13,0,5,0,0,0,0,0,50,0,0 +65,4,254413,5,10,2,1,0,0,1,0,0,40,0,0 +56,2,91262,1,9,1,6,1,2,0,0,0,45,0,0 +43,1,154785,0,13,1,8,2,2,1,0,0,80,15,0 +55,2,84231,1,9,1,6,1,0,0,0,0,50,0,0 +22,2,226327,5,10,0,0,3,0,1,0,0,40,0,0 +40,2,248406,5,10,2,8,3,0,0,0,0,32,0,0 +35,2,54317,1,9,1,7,1,0,0,0,1672,50,0,0 +20,2,95918,4,5,1,8,1,0,0,0,0,40,0,0 +46,4,375675,14,8,1,4,1,0,0,0,0,35,0,1 +43,2,244172,1,9,4,6,4,0,0,0,0,40,4,0 +39,2,326342,2,7,1,4,1,1,0,2635,0,37,0,0 +34,2,77271,1,9,0,1,4,0,1,0,0,20,7,0 +35,2,33397,1,9,2,4,0,0,1,0,0,35,0,0 +30,2,446358,1,9,0,0,4,0,0,0,0,41,0,0 +25,2,151810,1,9,0,8,0,1,0,0,0,28,0,0 +44,2,125461,3,14,1,1,1,0,0,0,0,35,0,1 +35,2,133906,1,9,2,0,4,0,1,0,0,40,0,0 +41,2,155106,1,9,1,2,1,0,0,0,0,40,0,0 +43,3,203637,0,13,1,0,1,0,0,7298,0,40,0,1 +32,2,232766,5,10,0,0,0,0,1,0,0,40,0,0 +50,2,305319,7,4,1,10,1,0,0,0,0,40,0,0 +20,2,121023,5,10,0,0,3,0,1,0,0,15,0,0 +29,2,198997,1,9,1,0,2,0,1,0,0,20,0,0 +38,2,167140,10,15,1,3,1,0,0,99999,0,70,0,1 +20,2,38772,12,6,0,2,4,0,0,0,0,50,0,0 +41,2,253759,1,9,0,5,4,1,1,0,0,40,0,0 +27,2,130067,5,10,0,1,0,0,1,0,0,65,0,0 +37,2,203828,4,5,1,10,1,0,0,0,0,40,0,0 +31,2,156464,12,6,2,4,0,0,0,0,0,40,0,0 +49,2,72333,5,10,2,0,0,2,1,0,0,40,0,0 +33,4,83671,0,13,0,3,0,1,1,0,0,50,0,0 +31,2,339482,1,9,1,10,1,0,0,0,1848,40,0,1 +19,2,91928,5,10,0,4,5,0,1,0,0,35,0,0 +44,2,99203,7,4,1,8,1,0,0,0,0,40,0,0 +31,5,455995,5,10,0,1,0,0,0,0,0,65,0,1 +62,2,192515,1,9,6,7,4,0,1,0,0,40,0,0 +65,1,111483,5,10,1,1,1,0,0,0,2174,10,0,1 +17,2,221129,4,5,1,4,1,0,0,0,0,40,0,0 +60,2,85413,1,9,1,6,1,0,0,0,0,44,0,1 +31,2,196125,2,7,1,10,1,0,0,0,0,40,0,0 +29,2,265638,5,10,0,4,4,1,1,0,0,40,0,0 +53,2,177727,1,9,1,8,1,0,0,0,0,40,0,1 +44,2,205822,5,10,1,5,1,0,0,0,0,40,0,1 +43,2,112607,2,7,1,5,1,0,0,0,0,60,0,0 +40,3,177595,5,10,1,10,1,0,0,0,1579,40,0,0 +18,2,183315,2,7,0,5,3,1,1,0,0,10,0,0 +47,2,116279,1,9,2,10,4,0,1,0,0,43,0,0 +38,3,122493,0,13,1,3,1,0,0,4064,0,40,0,0 +37,2,215419,6,12,1,4,2,0,1,0,0,25,0,0 +40,2,310101,5,10,4,5,0,3,1,0,0,40,0,0 +57,5,61885,1,9,1,3,1,1,0,0,0,60,0,1 +43,2,59107,1,9,4,4,0,0,1,4101,0,40,0,0 +32,2,227214,0,13,1,3,1,4,0,0,0,40,16,0 +64,2,239450,5,10,1,5,1,0,0,0,0,40,0,0 +18,2,118847,14,8,0,5,3,0,1,0,0,20,0,0 +40,1,95226,0,13,0,1,0,0,0,0,0,50,0,0 +23,2,215395,1,9,0,8,0,0,0,0,0,40,0,0 +45,2,170600,9,11,2,0,4,1,1,0,0,40,0,0 +45,1,91044,3,14,2,3,0,0,1,0,0,15,0,0 +27,2,318639,12,6,0,4,0,0,0,0,0,60,4,0 +23,2,160398,5,10,3,2,4,0,0,0,0,40,0,0 +58,1,216824,1,9,1,7,1,2,0,0,0,30,0,0 +35,2,308945,1,9,2,9,4,0,1,0,0,75,0,0 +47,2,30840,3,14,2,3,0,0,0,0,0,40,0,1 +33,2,99309,1,9,1,1,1,0,0,0,0,50,0,0 +27,2,188576,0,13,4,3,0,2,0,0,0,40,11,1 +46,2,83064,6,12,1,8,1,0,0,0,0,40,0,1 +24,2,403865,5,10,1,10,1,0,0,0,0,56,0,0 +40,2,235786,5,10,1,10,1,0,0,0,0,44,0,1 +44,2,191893,1,9,0,4,3,0,1,0,0,24,0,0 +31,4,149184,0,13,1,11,1,0,0,0,0,97,0,1 +37,2,152909,9,11,1,0,1,0,0,7688,0,40,0,1 +23,2,435604,9,11,4,1,3,0,1,0,0,40,0,0 +30,5,109282,0,13,1,5,1,0,0,0,0,52,0,1 +31,2,248178,5,10,1,4,1,1,0,0,0,35,0,0 +32,2,209103,5,10,1,1,1,0,0,3464,0,40,0,0 +27,2,183639,1,9,0,6,3,0,0,0,0,40,0,0 +35,4,107233,1,9,0,0,4,3,0,0,0,55,0,0 +27,2,175387,0,13,0,1,0,0,0,0,1876,40,0,0 +33,1,38223,1,9,0,7,3,0,0,0,0,70,0,0 +34,2,228873,8,16,1,3,1,0,0,0,0,45,0,1 +29,2,202182,5,10,1,10,1,0,0,0,0,50,0,0 +26,4,425092,3,14,0,3,0,0,1,2174,0,40,0,0 +39,1,152587,1,9,0,10,3,0,0,0,0,40,0,0 +37,5,39089,5,10,1,1,1,0,0,3103,0,50,0,1 +51,2,204304,5,10,2,1,0,0,1,0,0,50,0,1 +40,2,116103,5,10,4,10,4,0,0,4934,0,47,0,1 +53,2,290640,7,4,1,10,1,2,0,0,0,40,36,0 +58,3,81973,5,10,1,9,1,2,0,0,1485,40,0,1 +29,2,134890,0,13,1,9,1,0,0,0,0,40,0,1 +33,2,452924,1,9,1,8,1,4,0,0,0,40,4,0 +57,2,245193,3,14,1,1,1,0,0,0,0,60,0,1 +69,0,34339,1,9,1,11,1,0,0,0,0,40,0,0 +20,2,184756,5,10,0,0,3,0,1,0,0,12,0,0 +56,2,392160,1,9,6,5,4,0,1,0,0,25,4,0 +49,2,168337,11,3,1,10,1,0,0,0,0,40,0,0 +34,2,309513,1,9,1,8,1,0,0,0,0,40,0,0 +70,2,77219,1,9,1,10,1,0,0,0,0,37,0,0 +44,2,212888,0,13,2,1,4,0,1,0,0,45,0,0 +37,2,361888,0,13,0,3,0,0,0,10520,0,40,0,1 +58,4,237879,0,13,1,3,1,0,0,0,0,58,0,0 +42,1,93099,5,10,1,3,3,0,1,0,0,25,0,0 +41,2,225193,1,9,1,5,1,0,0,0,0,40,0,0 +28,2,50814,1,9,0,0,0,0,1,0,0,40,0,0 +47,4,123681,3,14,1,3,1,0,0,7688,0,60,0,1 +24,2,249351,1,9,1,8,2,0,1,0,0,40,0,0 +58,1,222311,1,9,1,4,1,0,0,7688,0,55,0,1 +18,2,301762,1,9,0,0,3,0,1,0,0,25,0,0 +50,2,195298,5,10,1,1,1,0,0,0,0,50,0,1 +69,2,541737,5,10,6,0,0,0,1,2050,0,24,0,0 +84,2,241065,3,14,0,3,0,0,0,0,0,66,0,0 +47,2,129513,0,13,1,1,1,0,0,0,0,60,0,1 +19,2,374262,14,8,0,2,3,0,0,0,0,20,0,0 +24,2,382146,5,10,0,3,0,1,0,0,0,40,0,0 +53,2,30447,1,9,2,8,0,0,0,0,0,50,0,0 +58,2,49893,5,10,1,5,1,0,0,0,0,45,0,0 +22,2,197387,5,10,0,2,5,0,0,0,0,24,4,0 +36,1,111957,5,10,1,1,1,0,0,0,0,52,0,0 +34,2,340458,14,8,0,0,4,0,1,0,0,40,0,0 +43,2,185670,15,2,6,3,4,0,1,0,0,21,4,0 +37,2,210945,1,9,1,2,1,0,0,0,0,24,0,0 +43,2,350661,10,15,4,9,0,0,0,0,0,50,13,1 +42,2,190543,5,10,1,9,2,0,1,0,0,40,0,1 +21,2,70261,5,10,0,4,3,0,0,0,0,30,0,0 +49,1,179048,1,9,1,5,1,0,0,0,0,60,34,0 +35,2,242094,1,9,1,4,5,1,0,0,0,40,0,0 +49,1,117634,5,10,6,10,4,0,1,0,0,30,0,0 +28,2,82531,5,10,0,4,0,1,0,0,0,40,0,0 +51,2,193374,15,2,1,10,1,0,0,0,0,40,4,0 +19,2,323605,7,4,0,4,0,0,0,0,0,60,0,1 +56,2,371064,4,5,1,4,1,0,0,0,0,40,0,0 +20,2,39927,1,9,0,4,0,0,0,0,0,8,0,0 +22,2,64292,5,10,0,0,3,0,1,0,0,37,0,0 +33,2,198660,1,9,1,8,1,0,0,99999,0,56,0,1 +22,2,210165,5,10,0,10,0,0,0,0,0,50,0,0 +68,2,144137,5,10,2,13,5,0,1,0,0,30,0,0 +56,4,155657,0,13,2,1,4,0,1,0,0,40,0,0 +69,1,107548,4,5,1,0,1,0,0,0,0,40,0,0 +41,2,163258,0,13,0,9,0,0,0,0,0,40,0,0 +33,2,221324,1,9,0,8,4,1,1,0,0,40,0,0 +18,2,444822,2,7,0,5,3,0,1,0,0,8,4,0 +17,2,154398,2,7,0,4,3,1,0,0,0,16,19,0 +31,2,120672,2,7,2,2,5,1,0,0,1721,40,0,0 +50,2,159650,5,10,1,9,1,0,0,0,0,60,0,1 +62,2,290754,12,6,6,2,0,0,1,0,0,40,0,0 +41,2,49654,1,9,2,0,4,0,1,0,0,52,0,0 +20,3,147352,1,9,0,4,0,0,1,0,0,40,0,0 +23,2,227943,6,12,0,5,3,0,0,0,0,30,0,0 +18,2,423024,1,9,0,4,0,0,0,0,0,20,0,0 +42,2,445940,4,5,1,10,1,0,0,0,0,40,4,0 +23,2,230824,0,13,0,3,0,0,0,0,0,40,0,0 +43,2,48882,1,9,2,0,5,0,1,0,0,40,0,0 +47,2,168195,1,9,1,5,1,0,0,0,0,55,0,0 +53,4,188644,11,3,1,4,1,0,0,0,0,40,4,0 +28,2,136077,12,6,0,2,0,0,0,0,0,40,0,0 +28,0,119793,5,10,1,11,1,0,0,0,0,40,0,0 +44,2,336513,5,10,1,3,1,0,0,0,0,45,0,0 +58,2,186991,1,9,1,8,1,0,0,0,0,40,0,0 +26,2,211435,1,9,0,8,4,0,1,0,0,40,0,0 +36,1,280169,5,10,1,7,1,0,0,3456,0,8,0,0 +27,2,109997,1,9,2,4,0,0,1,0,0,40,0,0 +39,2,286789,8,16,1,1,1,0,0,0,0,45,0,1 +25,2,102460,0,13,1,1,1,0,0,0,0,40,0,0 +17,2,287160,2,7,0,4,3,0,1,0,0,15,0,0 +39,2,198097,0,13,2,1,0,0,0,0,0,50,0,0 +52,2,119111,1,9,1,8,1,0,0,0,0,40,0,0 +24,2,174461,0,13,0,5,0,0,1,0,0,50,0,0 +26,1,281678,9,11,1,7,1,0,0,0,0,55,0,0 +32,2,151053,1,9,1,2,1,0,0,0,0,40,0,1 +49,4,186539,3,14,1,11,1,0,0,0,0,40,0,1 +40,2,198452,2,7,1,7,1,0,0,0,0,40,0,0 +52,2,198863,10,15,2,1,0,0,0,0,2559,60,0,1 +33,2,176711,1,9,0,0,0,0,0,0,0,40,0,0 +19,2,165310,1,9,1,8,5,0,0,0,0,20,0,0 +37,2,213008,9,11,1,3,1,0,0,0,0,40,28,0 +21,0,38251,5,10,0,9,3,0,1,0,0,20,0,0 +33,2,125761,5,10,0,0,0,0,0,0,0,36,0,0 +28,2,148645,6,12,2,3,0,0,1,0,0,40,0,0 +48,2,273435,1,9,1,10,1,0,0,0,1579,40,0,0 +43,2,208613,0,13,4,9,0,0,0,0,0,40,0,0 +32,2,192565,1,9,1,8,1,0,0,0,0,40,0,0 +28,2,183885,1,9,0,4,3,0,0,0,0,30,0,0 +47,1,243631,0,13,1,3,1,2,0,0,0,40,27,0 +37,2,191754,0,13,1,0,1,0,0,0,0,50,0,1 +26,2,261278,5,10,4,5,5,1,0,0,0,30,0,0 +55,2,127014,1,9,1,4,1,0,0,0,0,60,0,0 +40,2,197919,6,12,2,5,4,0,1,0,0,40,0,0 +31,2,217460,0,13,1,1,1,0,0,0,0,40,0,1 +39,2,86551,1,9,1,4,1,0,0,0,0,40,0,1 +54,5,98051,5,10,1,5,1,0,0,0,0,54,0,1 +38,2,215917,5,10,1,5,1,2,0,0,0,40,11,0 +53,1,192982,1,9,1,7,1,0,0,0,0,85,0,0 +27,1,334132,6,12,0,3,0,0,1,0,0,78,0,0 +42,2,136986,0,13,1,1,1,0,0,0,0,40,0,1 +62,2,116812,5,10,2,0,0,0,1,0,0,40,0,0 +47,2,189123,2,7,1,0,1,0,0,0,1485,58,0,0 +26,2,89648,0,13,0,1,0,0,1,0,0,50,0,0 +59,2,99248,5,10,2,4,0,0,0,0,0,40,0,0 +42,2,57600,1,9,2,3,0,0,1,0,0,45,0,0 +25,2,199224,0,13,1,3,1,0,0,0,0,45,0,1 +58,2,140363,1,9,2,5,0,0,0,0,0,36,0,0 +30,2,308812,5,10,0,5,0,0,1,0,0,60,0,0 +21,2,275421,5,10,0,10,3,0,1,0,0,40,0,0 +61,2,213321,1,9,1,11,1,0,0,0,0,40,0,0 +33,2,157747,6,12,1,2,1,0,0,0,0,40,0,0 +51,2,182314,3,14,1,9,1,0,0,0,0,40,0,1 +70,2,220589,5,10,6,1,0,0,1,0,0,12,0,0 +29,1,189346,5,10,2,10,0,0,0,2202,0,50,0,0 +46,2,124071,3,14,6,3,0,0,1,0,0,44,0,0 +35,3,20469,5,10,2,1,4,2,1,0,0,40,11,0 +31,2,154227,1,9,1,10,1,0,0,0,0,43,0,1 +37,2,105044,5,10,1,1,1,0,0,0,0,42,0,1 +43,2,35910,5,10,1,5,1,0,0,0,0,43,0,1 +23,2,189203,1,9,0,5,0,0,0,0,0,40,0,0 +41,2,116493,1,9,2,10,0,0,0,13550,0,44,0,1 +42,4,19700,0,13,1,3,2,0,1,0,0,50,0,1 +26,2,48718,12,6,0,0,0,0,1,2907,0,40,0,0 +45,2,106113,5,10,1,1,1,0,0,0,0,40,0,1 +25,2,256263,6,12,1,5,1,0,0,0,0,40,0,0 +38,2,120074,0,13,1,8,1,0,0,0,0,50,0,1 +28,2,122922,1,9,0,1,0,0,1,0,0,50,0,0 +68,1,116903,9,11,1,3,1,0,0,0,2149,40,0,0 +42,4,222596,1,9,1,10,1,0,0,0,0,40,0,1 +35,2,107302,3,14,1,5,1,0,0,0,0,40,3,0 +36,2,156400,5,10,2,0,4,0,1,0,0,40,0,0 +33,2,53373,1,9,1,10,1,0,0,0,0,35,0,0 +22,2,58916,5,10,0,0,0,0,1,0,0,30,0,0 +45,4,167159,0,13,1,11,1,0,0,0,0,50,0,1 +24,2,283806,5,10,0,4,0,0,1,0,0,40,0,0 +36,4,61778,1,9,1,3,1,0,0,15024,0,40,0,1 +41,2,33310,1,9,0,0,0,0,1,0,0,40,0,0 +26,1,202560,5,10,0,3,3,0,1,0,0,35,0,0 +25,1,60828,5,10,0,7,3,0,1,0,0,50,0,0 +53,0,153486,5,10,1,7,1,0,0,0,0,50,0,0 +28,4,167536,6,12,6,3,4,0,0,0,0,40,0,0 +30,4,370990,3,14,0,3,0,0,1,0,0,40,0,0 +38,1,198867,2,7,1,10,1,0,0,0,0,40,0,0 +37,4,174924,5,10,2,11,4,0,0,0,0,48,9,0 +30,2,175856,3,14,1,3,1,0,0,0,0,38,0,0 +31,2,220690,5,10,2,10,0,0,0,0,0,80,0,0 +36,2,160035,1,9,1,10,1,0,0,3908,0,55,0,0 +59,1,116878,1,9,1,1,1,0,0,0,0,60,34,0 +33,1,134737,1,9,1,10,1,0,0,0,0,35,0,0 +29,2,81648,1,9,1,5,1,0,0,0,1887,55,0,1 +49,0,122177,5,10,1,8,1,0,0,0,0,40,0,1 +50,3,69614,12,6,4,10,0,0,0,0,0,56,0,0 +33,2,112115,0,13,1,1,1,0,0,0,1902,45,0,1 +28,2,299422,7,4,1,2,1,0,0,0,0,40,4,0 +24,2,112854,5,10,0,9,0,0,1,0,0,16,0,0 +32,1,33417,5,10,1,10,1,0,0,0,0,50,0,0 +47,3,224559,1,9,1,6,1,1,0,0,0,40,0,1 +24,2,357028,5,10,0,1,3,0,0,0,0,40,0,0 +37,4,51158,5,10,1,9,2,0,1,7298,0,36,0,1 +51,2,186303,0,13,1,5,1,0,0,0,0,40,0,1 +52,2,127749,1,9,1,6,1,0,0,0,0,50,0,0 +22,2,291386,5,10,0,0,0,0,1,0,0,40,0,0 +28,2,138054,6,12,0,4,0,4,0,0,0,40,0,0 +47,1,174533,5,10,1,10,1,0,0,0,0,40,0,0 +43,2,200835,1,9,1,10,1,0,0,0,0,40,0,0 +25,2,108658,1,9,0,1,0,0,0,0,0,45,0,0 +43,2,180985,5,10,1,6,1,0,0,0,0,60,0,1 +25,2,34803,0,13,0,1,3,0,1,0,0,20,0,0 +59,2,75867,3,14,1,3,1,0,0,0,0,60,0,0 +29,2,156819,6,12,2,3,4,0,1,0,0,35,0,0 +30,2,61272,4,5,1,8,2,0,1,0,0,40,20,0 +24,2,39827,5,10,1,8,2,4,1,0,0,40,5,0 +38,2,130007,0,13,0,4,0,0,0,0,0,40,0,0 +37,1,80324,1,9,1,1,1,0,0,0,0,60,0,1 +26,2,322614,13,1,3,8,0,0,0,0,1719,40,4,0 +30,2,140869,1,9,0,4,4,0,1,0,0,40,0,0 +73,4,181902,3,14,1,3,1,0,0,0,0,10,12,1 +30,2,287908,1,9,1,8,1,1,0,0,0,40,0,0 +33,2,309630,1,9,1,4,1,0,0,0,0,40,0,0 +46,2,28225,5,10,1,6,1,0,0,0,0,58,0,0 +18,2,39222,2,7,0,4,3,0,0,0,0,40,0,0 +22,2,122272,1,9,0,0,3,0,1,0,0,40,0,0 +50,5,198400,1,9,1,5,1,1,0,0,0,60,0,0 +39,5,283338,0,13,1,1,1,0,0,7298,0,40,0,1 +22,2,208946,5,10,0,5,3,0,0,0,0,40,0,0 +33,2,348416,1,9,0,0,4,1,1,0,0,40,0,0 +31,2,379046,1,9,0,2,3,2,1,0,0,40,36,0 +29,2,183887,0,13,0,0,3,0,0,0,0,40,0,0 +38,1,127961,5,10,1,8,1,0,0,0,0,45,0,1 +24,2,211129,0,13,0,5,3,0,1,0,0,35,0,0 +29,4,187649,1,9,4,11,5,0,1,0,0,40,0,0 +49,3,94754,3,14,1,0,1,0,0,0,0,40,0,1 +33,2,231826,7,4,1,8,1,0,0,0,0,40,4,0 +28,2,142764,1,9,0,8,0,0,0,0,0,48,0,0 +22,2,126822,0,13,0,0,3,0,1,0,0,60,0,0 +37,2,188069,1,9,1,8,1,0,0,0,0,40,0,0 +30,2,284395,1,9,1,10,1,0,0,0,0,50,0,0 +49,2,31267,7,4,1,10,1,0,0,0,0,40,0,0 +29,2,161444,1,9,1,1,1,0,0,0,0,40,13,0 +25,2,144483,1,9,4,1,4,0,1,0,0,40,0,0 +36,2,133655,1,9,3,0,4,0,1,0,0,40,0,0 +36,0,112074,8,16,0,3,0,0,0,0,0,45,0,0 +21,2,249727,1,9,0,4,3,0,0,0,0,22,0,0 +18,2,165754,5,10,0,4,3,0,1,0,0,30,0,0 +30,4,172822,9,11,0,11,0,0,0,0,0,40,0,0 +44,2,288433,5,10,0,0,3,1,1,0,0,40,0,0 +40,2,33331,5,10,1,6,1,0,0,0,0,50,0,0 +43,2,168071,1,9,1,1,1,0,0,0,0,44,0,0 +45,2,207277,0,13,1,1,1,0,0,0,0,50,0,1 +29,2,130620,5,10,3,5,3,2,1,0,0,26,3,0 +40,2,136244,5,10,1,0,2,0,1,0,0,40,0,0 +43,2,972354,5,10,1,4,1,0,0,0,0,48,0,0 +20,2,245297,5,10,0,4,0,0,1,0,0,20,0,0 +32,0,71151,0,13,1,9,1,0,0,0,0,20,0,0 +19,2,118352,5,10,0,4,3,0,1,0,0,16,0,0 +21,2,117210,1,9,0,8,3,0,0,0,0,40,0,0 +23,2,120068,9,11,1,2,1,0,0,0,0,40,0,0 +24,2,48343,2,7,0,4,0,1,1,0,0,40,0,0 +52,2,84451,9,11,2,4,0,0,0,0,0,32,0,0 +19,2,281704,5,10,0,4,0,0,0,0,0,35,0,0 +54,2,123011,5,10,1,5,1,0,0,0,0,45,0,1 +50,2,104729,1,9,2,8,5,0,1,0,0,48,0,0 +29,2,110134,5,10,2,8,0,0,0,0,0,40,0,0 +17,2,186067,12,6,0,9,3,0,0,0,0,10,0,0 +47,2,214702,1,9,2,4,4,0,1,0,0,37,5,0 +46,2,384795,0,13,2,3,4,1,1,0,0,32,0,0 +30,2,175931,5,10,1,2,1,0,0,0,0,44,0,0 +58,2,366324,5,10,1,4,2,0,1,0,0,30,0,0 +48,2,118717,0,13,2,3,0,1,1,0,0,40,0,0 +23,2,219835,5,10,0,11,3,0,0,0,0,40,4,0 +23,2,176486,9,11,0,0,3,0,1,0,0,36,0,0 +45,2,273435,1,9,1,10,1,0,0,0,0,40,0,0 +20,2,182661,5,10,0,5,3,1,0,0,0,20,0,0 +26,2,212304,7,4,0,8,3,0,0,0,0,48,0,0 +50,4,133963,0,13,0,3,3,0,1,0,0,40,0,1 +49,2,165152,1,9,1,5,1,0,0,0,0,48,0,1 +26,2,274724,5,10,0,4,5,0,0,0,0,40,35,0 +47,2,196707,10,15,2,0,0,0,0,0,0,40,0,0 +31,2,213002,14,8,0,5,0,0,0,4650,0,50,0,0 +35,2,148581,1,9,1,10,1,0,0,0,1740,40,0,0 +46,2,459189,5,10,1,10,1,0,0,0,1902,50,0,1 +28,1,214689,2,7,0,10,0,0,0,0,0,40,0,0 +58,2,289364,5,10,1,1,1,0,0,7688,0,45,0,1 +21,2,174907,1,9,0,0,3,0,1,0,0,40,0,0 +50,1,348099,12,6,2,5,0,0,1,0,0,50,0,0 +31,2,31600,0,13,0,3,0,0,1,0,0,40,0,0 +31,1,286282,0,13,1,0,2,0,1,0,0,20,0,0 +35,1,181705,1,9,1,10,1,0,0,3103,0,40,0,1 +33,2,238912,8,16,1,3,1,0,0,0,0,60,0,1 +34,2,134737,3,14,1,3,1,0,0,7688,0,55,0,1 +37,2,197429,1,9,1,2,1,0,0,0,0,45,0,1 +48,2,47343,3,14,1,3,1,0,0,0,0,40,0,1 +34,3,67083,0,13,0,1,4,2,0,1471,0,40,14,0 +24,2,249957,5,10,0,1,3,0,0,0,0,40,0,0 +55,2,175942,1,9,2,13,0,0,1,0,0,40,23,0 +50,2,192982,1,9,1,9,1,0,0,0,1848,40,0,1 +40,2,209547,0,13,1,5,1,0,0,0,1977,60,0,1 +33,2,142675,0,13,0,2,0,0,0,0,0,30,0,0 +51,3,190333,5,10,1,10,1,0,0,0,0,40,0,0 +30,2,196396,5,10,0,8,0,0,0,0,0,40,0,0 +41,2,166740,1,9,1,8,1,0,0,0,0,40,0,0 +47,4,174533,9,11,1,1,1,0,0,0,0,40,0,1 +37,2,118486,0,13,4,3,4,0,1,4934,0,32,0,1 +40,2,144067,9,11,1,10,1,0,0,0,0,40,0,0 +36,2,106964,1,9,1,8,1,0,0,0,0,40,0,0 +37,2,178136,1,9,1,8,1,1,0,0,0,40,0,0 +38,2,196554,10,15,4,3,0,0,0,0,0,35,0,1 +40,1,403550,5,10,1,10,1,0,0,0,0,50,0,0 +35,2,498216,0,13,2,1,4,0,1,0,0,40,0,0 +47,1,192755,1,9,1,8,2,0,1,0,0,20,0,1 +33,2,156192,3,14,1,3,1,0,0,0,0,45,0,1 +45,2,189802,5,10,2,0,0,0,1,0,0,40,0,0 +35,1,179171,1,9,0,5,4,1,1,0,0,38,9,0 +32,2,77634,2,7,1,0,1,0,0,0,0,45,0,0 +23,2,189830,5,10,1,4,1,1,0,0,0,50,0,0 +19,2,127190,1,9,0,4,3,0,1,0,0,15,0,0 +20,2,138107,1,9,0,2,3,1,0,0,0,35,0,0 +44,5,269733,0,13,1,5,1,0,0,0,0,30,0,0 +41,0,227734,1,9,1,0,1,0,0,3464,0,40,0,0 +19,2,318822,5,10,0,0,5,0,1,0,0,40,0,0 +48,2,48885,1,9,2,4,0,0,1,0,0,35,0,0 +45,2,205424,5,10,1,5,1,0,0,0,0,65,0,1 +40,2,173858,7,4,1,4,1,2,0,0,0,42,14,0 +34,2,202450,1,9,1,10,1,0,0,0,0,55,0,1 +20,2,154779,5,10,0,5,5,4,1,0,0,40,0,0 +33,2,180551,5,10,4,0,4,0,1,0,0,40,0,0 +30,2,177522,1,9,1,0,3,0,1,0,0,20,0,0 +23,2,277328,5,10,0,2,3,0,0,0,0,32,1,0 +34,2,112584,12,6,2,4,4,0,1,0,0,38,0,0 +48,0,85384,5,10,1,10,1,0,0,0,0,40,0,1 +42,2,69019,5,10,1,10,1,1,0,0,0,40,0,1 +22,2,112847,1,9,0,0,3,2,0,0,0,40,0,0 +60,1,52900,1,9,1,10,1,0,0,0,0,42,0,1 +42,2,37937,0,13,1,1,1,0,0,0,0,55,0,1 +45,2,59380,0,13,4,1,0,0,1,0,0,55,0,0 +47,2,114770,1,9,2,4,3,0,1,0,0,32,0,0 +29,2,216481,3,14,1,1,2,0,1,0,0,40,0,1 +34,2,176469,0,13,0,5,0,0,0,0,0,38,0,0 +34,2,176831,0,13,2,3,4,0,1,0,0,40,0,1 +39,3,410034,1,9,1,0,1,0,0,0,0,40,0,0 +29,2,93662,5,10,2,3,4,0,1,0,0,24,0,0 +42,5,144236,5,10,0,5,0,0,0,0,0,60,0,0 +48,2,240917,2,7,4,4,0,1,1,0,0,35,0,0 +53,2,608184,0,13,1,1,1,1,0,0,1902,40,0,1 +51,2,243361,5,10,6,0,4,0,1,0,0,45,0,0 +44,1,35166,0,13,1,7,1,0,0,0,0,90,0,0 +46,5,182655,9,11,1,1,1,0,0,0,0,60,0,1 +51,2,142717,8,16,2,10,0,0,1,4787,0,60,0,1 +32,2,272944,5,10,0,10,0,0,1,0,0,40,0,0 +24,2,228686,5,10,0,4,0,0,0,0,0,45,0,0 +33,2,236818,9,11,0,3,4,1,1,0,0,26,0,0 +47,1,117865,1,9,5,10,1,0,0,0,0,90,0,0 +64,1,106538,3,14,2,3,0,0,0,0,0,50,0,0 +62,2,153891,0,13,1,1,1,0,0,0,0,50,0,1 +52,2,190909,1,9,1,1,1,0,0,0,0,40,0,1 +39,2,191002,1,9,0,5,0,0,1,0,0,40,12,0 +42,2,89073,1,9,1,3,1,0,0,0,0,48,0,0 +38,3,238342,0,13,1,5,1,0,0,7688,0,42,0,1 +55,2,259532,7,4,1,6,1,0,0,0,0,50,0,0 +42,2,132481,6,12,2,3,0,0,1,0,0,24,0,0 +30,2,205659,6,12,1,1,2,0,1,0,0,50,15,1 +32,2,182323,4,5,1,10,1,0,0,0,0,40,0,0 +50,3,166419,2,7,0,5,0,1,1,3674,0,40,0,0 +27,2,152246,1,9,0,8,3,2,0,0,0,40,11,0 +47,2,155659,1,9,1,1,1,0,0,0,0,60,0,0 +33,2,155198,4,5,2,8,0,0,0,0,0,35,0,0 +48,1,100931,5,10,0,0,0,0,0,0,0,40,0,0 +23,2,162945,7,4,0,4,3,0,0,0,0,35,0,0 +31,3,334346,0,13,1,1,1,0,0,0,0,40,0,1 +26,2,181597,5,10,1,8,1,1,0,0,0,40,0,0 +61,1,133969,1,9,1,5,1,2,0,0,0,63,27,0 +50,2,210217,0,13,2,5,4,1,0,0,0,40,0,0 +49,2,169711,9,11,1,3,1,0,0,0,0,40,9,1 +19,2,271521,1,9,0,4,5,2,0,0,0,24,0,0 +18,2,51255,2,7,0,2,3,0,0,0,0,15,0,0 +44,1,26669,6,12,1,4,2,0,1,0,0,99,0,0 +54,2,194580,9,11,1,5,1,0,0,0,0,50,0,0 +35,0,177974,1,9,1,11,1,0,0,0,0,40,0,1 +27,0,315640,3,14,0,3,0,2,0,0,0,20,26,0 +50,5,136913,1,9,1,7,1,0,0,0,0,50,0,0 +43,0,230961,1,9,1,10,1,0,0,0,0,40,0,0 +28,2,167062,5,10,2,0,4,0,0,0,0,40,0,0 +47,2,120131,1,9,1,1,1,0,0,0,0,40,0,0 +21,2,243368,13,1,0,7,0,0,0,0,0,50,4,0 +30,2,171876,10,15,0,3,0,0,1,0,0,45,0,0 +19,2,136866,1,9,0,10,3,0,0,0,0,45,0,0 +40,2,316820,5,10,1,4,1,0,0,0,1485,40,0,0 +55,2,185459,3,14,1,5,1,0,0,0,0,50,0,1 +31,2,43716,9,11,2,8,4,0,0,0,0,43,0,0 +30,2,220939,9,11,2,1,0,0,0,0,0,40,0,0 +51,3,40808,0,13,0,3,0,3,1,0,0,43,0,0 +34,2,183473,1,9,2,6,3,0,1,0,0,40,0,0 +59,2,108496,3,14,1,1,1,0,0,0,0,45,0,1 +50,2,204838,1,9,2,1,4,0,1,0,0,38,0,0 +29,2,132686,1,9,2,8,4,0,0,0,0,40,0,0 +17,0,117906,12,6,0,7,3,0,0,0,0,40,0,0 +24,2,304386,1,9,0,4,3,0,1,0,0,30,0,0 +39,2,165215,3,14,1,3,2,0,1,0,1902,18,0,1 +32,2,259719,5,10,2,2,4,1,0,0,0,40,35,0 +34,2,248795,1,9,0,8,0,0,1,0,0,45,0,0 +44,1,124692,1,9,1,3,1,0,0,0,1902,40,0,1 +37,4,128054,5,10,2,0,4,0,1,0,0,40,0,0 +39,2,179731,3,14,1,1,2,0,1,0,2415,65,0,1 +32,5,113543,10,15,1,3,1,0,0,0,0,40,0,1 +23,2,252153,5,10,0,4,0,0,1,0,0,28,0,0 +45,3,45891,5,10,2,0,4,0,0,0,0,42,0,0 +30,2,112263,2,7,2,2,3,0,0,0,0,40,0,0 +20,2,47791,14,8,2,4,0,0,1,0,0,10,0,0 +41,2,202980,1,9,1,10,1,0,0,0,0,4,30,0 +21,2,34918,1,9,0,5,3,0,1,0,0,30,0,0 +48,2,91251,7,4,1,4,1,2,0,0,0,30,26,0 +31,2,132996,1,9,1,3,1,0,0,5178,0,45,0,1 +34,2,306215,9,11,0,2,0,1,0,0,0,40,0,0 +25,2,203570,1,9,4,4,4,1,0,0,0,40,0,0 +41,1,355918,0,13,4,10,0,0,0,0,0,35,0,0 +35,1,198841,10,15,1,3,1,0,0,0,0,50,0,1 +42,2,282964,0,13,2,1,4,0,1,0,0,40,0,0 +34,1,312197,1,9,1,6,1,0,0,0,0,75,4,1 +44,2,98779,12,6,1,8,1,0,0,4386,0,60,0,0 +32,2,200246,0,13,1,1,1,0,0,0,0,40,0,1 +25,2,182771,5,10,0,5,3,2,0,0,0,40,0,0 +23,2,199908,2,7,1,6,1,0,0,0,0,50,0,0 +36,2,172104,10,15,0,3,0,4,0,0,0,40,3,1 +53,1,35295,0,13,0,5,4,0,0,0,0,60,0,1 +27,2,216858,8,16,0,3,0,0,0,0,0,52,0,0 +27,2,332187,0,13,0,0,0,0,1,0,0,65,0,0 +57,2,255109,1,9,0,1,0,0,1,0,0,45,0,0 +17,2,111332,2,7,0,5,3,0,1,0,0,20,0,0 +59,4,238431,1,9,2,0,4,0,1,0,0,38,0,0 +34,2,131552,1,9,0,4,3,0,1,0,0,40,0,0 +30,2,110239,12,6,1,6,1,0,0,0,0,55,0,0 +31,0,255830,6,12,0,0,3,1,1,0,0,45,0,0 +23,2,82998,5,10,0,5,0,0,0,0,0,30,0,0 +19,2,164320,1,9,0,6,3,0,0,0,0,40,0,0 +20,1,263498,9,11,0,7,3,0,0,0,0,40,0,0 +52,1,162381,1,9,2,5,0,0,0,0,0,40,0,0 +39,4,229651,0,13,1,3,1,0,0,0,0,50,0,1 +27,2,357348,1,9,4,4,4,0,1,0,0,50,0,0 +19,2,269657,5,10,0,5,0,0,1,0,0,35,0,0 +38,4,82880,0,13,1,3,2,0,1,0,0,15,0,0 +19,2,389755,1,9,0,2,3,0,0,0,0,16,0,0 +34,2,195136,0,13,1,3,2,0,1,0,1887,40,0,1 +23,2,222925,1,9,1,8,3,0,1,2105,0,40,0,0 +24,2,50341,0,13,0,0,0,0,1,0,0,40,0,0 +22,2,214134,12,6,0,6,0,3,0,0,0,84,0,0 +45,2,114032,10,15,1,3,1,0,0,0,0,60,0,1 +45,2,192053,1,9,1,1,1,0,0,0,0,60,0,1 +48,2,240231,0,13,1,1,1,2,0,0,0,40,28,1 +42,2,44402,0,13,1,5,1,0,0,0,0,60,0,0 +35,1,191503,5,10,1,5,1,0,0,0,0,50,0,0 +32,2,163530,1,9,2,4,4,3,1,0,0,40,0,0 +51,4,136823,1,9,1,1,2,0,1,0,0,32,0,0 +59,2,121912,5,10,1,1,1,0,0,0,0,40,0,1 +31,4,58624,1,9,0,6,3,0,0,0,0,40,0,0 +27,4,74056,0,13,0,9,0,0,0,0,0,50,0,0 +57,2,182028,6,12,6,0,0,0,1,0,0,35,0,0 +40,2,209040,1,9,0,4,0,0,0,0,0,40,0,0 +31,2,206046,1,9,2,8,0,0,0,0,0,40,0,0 +23,2,182494,7,4,0,8,3,0,0,0,0,40,0,0 +42,2,185057,1,9,4,0,4,0,1,0,0,35,32,0 +60,2,147473,1,9,1,5,1,0,0,0,0,40,0,0 +53,4,221722,3,14,0,1,0,0,1,14344,0,50,0,1 +27,2,221912,1,9,0,2,3,0,0,0,0,40,0,0 +31,2,48189,1,9,1,6,1,0,0,0,0,45,0,0 +29,0,382272,0,13,0,10,0,0,0,0,0,40,0,0 +22,2,48347,0,13,0,7,3,0,0,0,0,40,0,0 +42,2,143046,0,13,0,3,0,0,1,0,1564,38,0,1 +63,5,137940,10,15,1,3,1,0,0,15024,0,50,0,1 +28,2,249571,1,9,1,5,1,0,0,0,0,40,0,0 +79,2,121318,5,10,1,0,1,0,0,0,0,20,0,0 +39,2,224531,1,9,1,10,1,0,0,7298,0,40,0,1 +29,2,185019,14,8,0,4,0,4,0,0,0,40,0,0 +60,2,27886,7,4,2,4,0,0,0,0,0,40,0,0 +58,2,94741,14,8,1,4,2,0,1,0,0,24,0,0 +20,2,107801,6,12,0,4,3,0,1,0,2205,18,0,0 +44,2,191256,1,9,1,6,1,0,0,0,0,65,0,1 +47,2,256866,1,9,1,6,1,0,0,0,0,48,0,0 +59,2,197148,1,9,1,11,1,0,0,0,0,24,0,1 +37,2,312271,3,14,2,1,0,0,0,0,0,65,0,0 +21,2,118657,1,9,4,8,5,0,0,0,0,40,0,0 +68,2,224338,9,11,6,1,0,0,1,0,0,40,0,0 +43,2,242488,5,10,1,0,1,0,0,5013,0,40,0,0 +23,2,227915,1,9,0,10,4,0,1,0,0,33,0,0 +40,4,105717,3,14,0,0,0,0,1,0,1876,35,0,0 +45,1,160962,5,10,0,5,3,0,1,0,0,35,0,0 +22,2,188950,5,10,0,9,3,0,0,0,0,40,0,0 +38,2,201328,0,13,1,3,1,0,0,0,0,50,0,1 +24,2,218678,5,10,0,5,0,0,0,0,0,49,0,0 +23,2,184255,1,9,1,5,2,0,1,0,0,40,0,0 +39,3,200968,5,10,1,0,5,0,0,0,0,45,0,1 +26,2,102264,5,10,0,10,0,0,0,0,0,40,0,0 +24,2,300584,1,9,0,2,4,0,0,0,0,40,0,0 +22,2,208946,5,10,0,0,3,0,0,0,0,25,0,0 +36,2,105021,0,13,1,3,1,0,0,0,0,55,0,0 +20,2,124751,5,10,0,13,3,0,1,0,0,20,0,0 +18,2,274057,2,7,0,4,3,1,0,0,0,8,0,0 +38,2,132879,0,13,1,1,1,0,0,0,0,40,0,1 +43,5,260960,0,13,2,7,0,0,0,0,0,35,0,0 +42,2,356934,3,14,1,1,1,0,0,0,0,40,0,1 +35,2,154410,0,13,1,1,1,0,0,0,0,50,0,1 +31,2,35378,5,10,2,0,0,0,1,0,0,45,0,0 +73,2,301210,15,2,1,6,1,0,0,0,1735,20,0,0 +32,2,73621,5,10,2,1,4,0,1,0,0,42,0,0 +37,2,108140,3,14,1,1,1,0,0,15024,0,45,0,1 +66,2,217198,1,9,1,2,1,0,0,0,0,10,0,0 +22,2,157332,1,9,0,4,3,0,1,0,0,35,0,0 +51,2,202956,9,11,1,5,1,0,0,0,0,40,0,0 +31,2,173495,1,9,0,4,3,0,0,0,0,35,0,0 +65,2,149811,1,9,2,0,4,0,1,0,2206,59,8,0 +39,2,444219,1,9,1,10,2,1,1,0,0,45,0,0 +48,2,125120,5,10,1,0,2,0,1,0,0,37,0,0 +20,2,190429,5,10,0,4,0,0,1,0,0,40,0,0 +48,2,248164,0,13,1,5,1,0,0,4386,0,50,0,1 +29,3,208534,10,15,1,3,1,0,0,0,0,80,0,0 +35,5,196373,0,13,1,1,1,0,0,0,0,45,0,1 +31,2,433788,5,10,1,6,1,0,0,0,0,40,0,1 +48,0,122086,1,9,1,11,1,0,0,0,0,40,0,0 +36,2,137314,9,11,0,9,0,0,0,0,0,45,0,0 +40,1,33068,1,9,1,7,1,0,0,0,0,50,0,0 +57,2,210688,1,9,1,3,1,0,0,0,0,15,0,0 +26,4,117833,0,13,0,3,0,0,1,4865,0,35,0,0 +37,0,103474,1,9,0,4,3,0,1,0,0,40,0,0 +65,2,115880,8,16,1,1,1,0,0,0,0,40,0,1 +26,1,233933,12,6,0,3,0,0,1,0,0,32,0,0 +42,2,52781,5,10,1,9,1,0,0,0,0,40,0,0 +47,2,586657,3,14,1,1,1,0,0,0,0,40,28,1 +62,2,113080,7,4,2,10,3,0,0,0,0,40,0,0 +27,2,251905,9,11,0,1,3,0,0,0,0,50,0,0 +76,1,225964,5,10,6,5,0,0,0,0,0,8,0,0 +29,2,263831,0,13,0,0,3,0,1,0,0,40,0,0 +29,2,133136,14,8,1,6,1,0,0,0,0,40,0,1 +32,2,121634,12,6,0,8,3,0,0,0,0,40,4,0 +22,5,40767,5,10,1,10,1,0,0,0,0,40,0,0 +30,3,355789,1,9,0,0,0,1,1,0,0,50,0,0 +43,4,311914,5,10,2,0,0,0,1,0,0,40,0,0 +23,2,91189,0,13,1,4,1,0,0,0,0,20,0,0 +44,3,344060,10,15,1,3,1,0,0,0,0,40,0,1 +41,2,113823,0,13,2,4,0,0,0,0,0,40,0,0 +49,0,185800,3,14,2,3,4,1,1,7430,0,40,0,1 +30,2,76107,1,9,0,6,0,0,0,0,0,45,0,1 +23,2,117618,5,10,0,2,3,0,0,0,0,35,0,0 +39,2,238008,1,9,6,0,3,0,1,0,0,40,0,0 +32,2,136480,0,13,1,5,1,0,0,0,0,60,0,1 +50,2,285200,5,10,1,10,1,0,0,0,1887,35,0,1 +19,2,351040,5,10,0,0,3,0,1,0,0,40,5,0 +35,2,1226583,0,13,1,5,1,0,0,0,0,52,0,1 +23,2,195767,1,9,0,10,0,0,0,0,0,40,0,0 +25,2,187540,5,10,0,10,0,0,0,0,0,40,0,0 +40,2,79372,1,9,2,5,0,0,1,0,0,40,0,0 +30,2,226665,0,13,1,1,1,1,0,0,0,42,0,1 +52,2,213209,5,10,1,10,1,0,0,0,0,40,0,1 +49,2,211005,5,10,1,8,1,1,0,0,0,60,0,0 +24,2,96178,0,13,0,0,3,0,1,0,0,40,0,0 +46,2,328216,0,13,1,1,1,0,0,15024,0,40,0,1 +39,2,110713,0,13,1,5,1,0,0,0,0,50,0,1 +45,1,225456,0,13,1,1,1,0,0,0,0,50,0,1 +62,4,159908,0,13,1,0,2,0,1,0,1258,38,0,0 +43,2,118308,0,13,1,3,1,0,0,0,1977,50,0,1 +45,2,180309,5,10,2,8,4,0,1,0,0,40,0,0 +62,1,39630,1,9,1,5,1,0,0,0,0,40,0,0 +48,2,273828,11,3,0,2,0,0,0,0,0,40,4,0 +56,2,172071,1,9,2,4,4,1,1,0,0,40,2,0 +28,2,218887,1,9,0,7,4,0,1,0,0,35,0,0 +23,2,664670,1,9,0,10,3,1,0,0,0,40,0,0 +43,2,209149,1,9,2,4,0,0,1,0,0,35,0,0 +26,2,84619,0,13,1,10,1,0,0,0,0,40,0,1 +36,2,447346,1,9,1,5,1,0,0,0,0,50,0,1 +55,4,37869,8,16,0,3,0,0,1,0,0,60,0,0 +48,0,99086,0,13,0,1,0,0,1,0,0,50,0,0 +38,2,326886,9,11,1,1,1,0,0,0,0,45,0,1 +18,2,181755,1,9,0,5,0,0,0,0,0,30,0,0 +56,1,249368,1,9,3,1,0,0,0,0,0,70,0,0 +39,1,326400,3,14,0,3,0,0,0,0,0,40,0,0 +46,2,504725,11,3,4,2,0,0,0,0,0,50,4,0 +36,2,88967,2,7,0,6,4,3,0,0,0,65,0,0 +42,1,170721,1,9,1,10,1,0,0,0,2002,40,0,0 +50,2,148953,1,9,1,6,1,0,0,0,0,50,0,1 +17,2,342752,2,7,0,2,3,0,0,0,0,20,0,0 +57,2,220871,7,4,6,8,4,1,1,0,0,40,0,0 +73,2,29675,1,9,6,4,5,0,1,0,0,12,0,0 +50,3,183611,5,10,0,0,0,0,0,0,0,40,0,0 +35,2,115215,5,10,0,6,3,0,0,0,0,45,0,0 +27,2,152231,5,10,1,8,1,0,0,0,0,45,0,0 +27,2,225142,5,10,0,10,3,0,0,0,0,40,0,0 +23,1,121313,1,9,0,10,3,0,0,0,0,40,0,0 +25,2,134821,1,9,0,0,3,0,1,0,0,40,0,0 +51,2,311350,0,13,1,1,1,0,0,0,0,40,0,1 +26,2,102106,12,6,1,0,2,0,1,0,0,40,0,0 +47,2,427055,5,10,1,0,1,0,0,0,0,45,4,0 +40,2,117860,1,9,2,4,0,1,0,0,0,40,0,0 +58,2,285885,4,5,2,4,4,0,1,0,0,40,0,0 +25,2,212800,5,10,0,5,3,0,1,0,0,40,0,0 +29,2,194864,1,9,1,5,2,0,1,0,0,18,0,0 +36,2,31438,2,7,1,6,1,0,0,0,0,43,0,0 +46,2,148254,1,9,2,1,0,0,1,0,0,60,0,0 +69,2,113035,15,2,6,13,0,1,1,0,0,4,0,0 +69,2,106595,1,9,6,0,0,0,1,1848,0,40,0,0 +28,2,144521,1,9,0,4,3,1,1,0,0,40,0,0 +20,2,172232,1,9,0,0,3,0,0,0,0,48,0,0 +54,0,123592,1,9,4,0,4,1,1,3887,0,35,0,0 +25,2,191921,5,10,0,6,3,0,0,0,0,40,0,0 +64,4,237379,1,9,1,2,1,0,0,3471,0,40,0,0 +17,2,208463,1,9,0,5,3,0,1,0,0,20,0,0 +53,3,68985,1,9,1,0,1,0,0,0,0,40,0,0 +50,2,22418,4,5,2,6,0,0,0,0,0,50,0,0 +57,2,163047,1,9,1,1,2,0,1,0,0,38,0,0 +51,2,153870,5,10,1,6,1,0,0,0,2603,40,0,0 +47,2,197702,5,10,1,10,1,0,0,0,0,40,0,0 +25,2,166415,1,9,0,6,4,0,0,0,0,52,0,0 +50,0,116211,10,15,1,1,1,0,0,0,0,52,0,1 +20,2,33644,1,9,0,0,3,0,1,0,0,30,0,0 +43,0,33331,10,15,1,3,1,0,0,0,1977,70,0,1 +46,2,73019,0,13,0,3,0,0,1,0,0,40,0,0 +54,2,169182,1,9,4,0,4,0,1,0,0,38,5,0 +53,2,20438,5,10,4,1,4,3,1,0,0,15,0,0 +21,2,109869,1,9,0,10,3,0,0,0,0,30,0,0 +58,2,316849,5,10,2,4,0,0,0,0,0,40,0,0 +30,2,208043,0,13,1,5,1,0,0,0,0,55,0,1 +61,2,153790,1,9,1,0,2,1,1,0,0,40,0,0 +56,0,153451,5,10,2,0,0,0,1,0,0,35,0,0 +59,2,96840,1,9,2,4,4,0,1,0,0,40,0,0 +72,2,192732,1,9,1,2,1,0,0,0,0,20,0,0 +33,2,209101,1,9,0,0,0,0,0,0,0,40,0,0 +46,2,146919,1,9,1,0,2,0,1,0,0,40,0,1 +46,4,192323,5,10,1,11,1,0,0,0,0,38,0,1 +48,2,217019,1,9,0,3,4,1,1,0,0,28,0,0 +33,2,198211,1,9,1,1,1,0,0,0,0,40,0,0 +21,2,222490,5,10,0,2,3,0,1,0,0,40,0,0 +27,2,106758,1,9,2,0,4,0,1,0,0,45,0,0 +31,2,561334,1,9,2,6,0,0,0,0,0,40,0,0 +28,2,203710,0,13,0,8,0,0,0,0,0,40,0,0 +45,4,203322,5,10,2,0,0,0,1,0,0,38,0,0 +51,2,123703,1,9,1,8,1,0,0,4386,0,40,0,1 +46,0,312015,1,9,0,4,0,1,1,0,0,40,0,0 +25,2,209428,5,10,1,5,1,0,0,0,0,25,22,0 +61,2,230292,5,10,1,0,1,0,0,7688,0,40,0,1 +17,2,114420,2,7,0,5,3,0,1,0,0,30,0,0 +26,2,120238,0,13,0,10,0,0,0,3325,0,40,0,0 +35,2,100375,12,6,2,10,0,0,0,0,0,60,0,0 +33,1,42485,2,7,1,1,1,0,0,0,0,70,0,0 +39,4,134367,1,9,0,0,3,0,1,0,0,35,0,0 +42,2,147099,1,9,2,4,4,0,1,0,0,30,0,0 +35,2,36214,0,13,1,1,1,0,0,4386,0,47,0,1 +45,2,119904,1,9,2,9,0,0,1,0,0,50,0,1 +47,5,105779,0,13,0,5,3,0,0,0,0,40,0,1 +64,2,165020,2,7,1,10,1,0,0,0,0,48,0,0 +39,2,187098,10,15,1,1,2,0,1,15024,0,47,0,1 +62,2,121319,0,13,1,3,1,0,0,3103,0,40,0,1 +53,2,151580,5,10,1,3,1,0,0,15024,0,40,0,1 +31,2,162572,0,13,1,1,1,0,0,0,0,40,0,0 +26,2,35917,1,9,1,5,1,0,0,0,0,40,0,0 +56,5,35723,7,4,1,10,1,0,0,0,0,50,0,1 +43,2,194773,5,10,0,4,0,0,1,0,0,40,0,0 +33,2,62155,5,10,0,5,0,1,0,0,0,35,0,0 +45,1,192203,5,10,1,10,1,0,0,0,1485,40,0,1 +46,2,174370,5,10,4,5,0,0,0,0,0,55,0,0 +26,2,161007,9,11,1,2,1,0,0,0,0,80,0,0 +24,2,270517,1,9,0,4,3,0,1,0,0,40,4,0 +43,2,163847,0,13,1,7,1,0,0,0,0,50,0,1 +40,2,193882,9,11,0,8,3,0,0,0,0,40,0,0 +61,2,160037,7,4,2,4,0,0,0,0,0,35,0,0 +34,3,189944,5,10,0,0,0,1,1,0,0,72,0,0 +85,2,115364,1,9,6,5,4,0,0,0,0,35,0,0 +41,2,163174,1,9,0,0,0,0,1,0,0,40,0,0 +31,0,188900,6,12,0,0,0,0,1,3325,0,35,0,0 +22,2,214399,5,10,0,5,3,0,1,0,0,30,0,0 +60,2,156616,1,9,6,4,4,1,1,0,0,40,0,0 +29,2,204862,6,12,2,3,0,0,1,0,0,36,0,0 +35,0,172475,0,13,0,1,0,2,1,2977,0,45,0,0 +24,2,153082,1,9,0,5,0,0,0,0,0,30,0,0 +45,4,195418,3,14,2,3,0,1,0,0,0,40,0,0 +21,4,276840,14,8,0,4,3,1,0,0,0,20,0,0 +30,2,97933,6,12,1,6,2,0,1,0,1485,37,0,1 +50,5,119099,5,10,1,1,1,0,0,0,0,99,0,1 +41,1,83411,1,9,1,1,1,0,0,0,0,40,0,1 +21,2,198992,1,9,0,5,0,0,1,0,0,33,0,0 +45,2,337825,1,9,1,10,1,0,0,0,0,45,0,0 +34,2,192002,0,13,1,1,1,0,0,0,0,40,0,1 +28,2,189346,1,9,2,2,3,0,0,0,0,40,0,0 +19,2,231962,1,9,0,4,4,0,0,0,0,40,0,0 +26,2,164488,0,13,0,3,0,0,0,13550,0,50,0,1 +48,2,200471,0,13,1,6,1,0,0,0,0,45,0,1 +69,2,228921,0,13,6,3,0,0,0,0,2282,40,0,1 +41,2,184846,5,10,2,0,4,0,1,0,0,40,0,0 +43,2,233851,0,13,2,0,0,0,1,0,0,40,0,0 +28,2,499001,1,9,0,10,4,0,0,0,0,40,4,0 +65,4,125768,5,10,2,0,0,0,1,0,0,28,0,0 +31,2,255004,0,13,0,1,0,0,0,0,1741,38,0,0 +28,2,157624,0,13,0,0,0,0,1,0,0,40,0,0 +51,2,146767,0,13,1,3,1,0,0,0,0,40,0,1 +45,2,118291,5,10,0,10,0,0,1,0,0,80,0,0 +43,2,313181,1,9,2,0,5,1,0,0,0,38,0,0 +31,2,87891,6,12,1,5,1,0,0,0,0,60,0,0 +31,2,226443,5,10,1,10,1,0,0,0,0,55,0,1 +45,2,81132,5,10,1,10,5,2,0,0,0,40,11,0 +20,2,216436,0,13,0,5,5,1,1,0,0,30,0,0 +25,2,213412,0,13,0,9,4,0,0,0,0,40,0,0 +36,2,179358,1,9,6,2,4,0,1,0,0,30,0,0 +31,2,369825,0,13,0,5,0,0,0,4101,0,50,0,0 +56,2,199763,5,10,1,10,1,0,0,0,0,45,0,0 +26,2,239390,0,13,0,5,3,0,0,0,0,18,0,0 +47,1,173613,5,10,2,1,0,0,1,0,0,65,0,0 +40,5,37869,1,9,1,1,1,0,0,0,0,50,0,0 +32,2,302845,1,9,1,1,2,0,1,0,0,48,0,0 +34,0,85218,3,14,0,3,4,1,1,0,0,24,0,0 +37,2,48268,1,9,1,1,1,0,0,0,0,55,0,0 +38,2,173968,1,9,1,10,1,0,0,0,0,45,0,0 +19,2,70982,9,11,0,4,3,2,0,0,0,16,0,0 +49,2,166857,4,5,2,2,0,0,1,0,0,40,0,0 +26,2,162872,6,12,0,3,0,0,1,0,0,40,0,0 +82,2,152148,7,4,1,2,1,0,0,0,0,2,0,0 +40,2,139193,1,9,2,10,0,0,0,0,0,40,0,0 +28,2,791084,5,10,0,10,3,0,0,0,0,50,0,0 +23,2,137214,1,9,1,5,1,1,0,0,0,37,0,0 +19,2,183258,5,10,0,0,3,0,0,0,0,40,0,0 +67,2,154035,1,9,6,2,5,1,0,0,0,32,0,0 +43,2,115323,0,13,1,1,1,0,0,3103,0,40,0,1 +41,2,213055,6,12,0,0,0,4,1,0,0,50,0,0 +37,2,155064,9,11,2,3,4,0,1,0,0,40,0,0 +20,2,33551,1,9,0,6,3,0,0,0,0,40,0,0 +40,2,169995,1,9,2,10,4,0,0,0,0,40,0,0 +47,2,168262,3,14,4,1,0,0,0,99999,0,50,0,1 +40,2,104196,1,9,1,9,1,0,0,0,0,40,0,0 +39,0,114055,0,13,0,1,0,0,1,0,0,40,0,0 +24,2,274398,5,10,0,0,3,1,1,0,0,20,0,0 +49,2,196571,0,13,1,5,1,0,0,0,0,45,0,1 +66,2,101607,1,9,2,8,0,0,0,0,0,10,0,0 +52,2,122109,1,9,0,3,4,0,1,0,323,40,0,0 +59,5,255822,1,9,2,1,0,0,0,0,0,60,0,0 +72,2,195184,1,9,6,13,4,0,1,0,0,12,1,0 +35,3,245372,1,9,0,0,0,0,0,0,0,40,0,0 +30,2,169583,0,13,5,1,2,0,1,0,0,40,0,1 +36,2,224531,5,10,0,4,0,0,0,0,0,40,0,0 +26,2,186151,1,9,4,9,3,0,1,0,0,40,0,0 +23,2,118693,0,13,0,4,0,0,0,0,0,35,0,0 +39,2,297449,0,13,1,3,1,0,0,0,0,40,0,1 +40,1,125206,10,15,1,3,1,0,0,0,0,40,0,0 +29,2,393264,0,13,0,3,0,0,0,0,0,40,0,0 +38,2,108140,0,13,0,4,0,0,0,0,0,20,0,0 +63,2,264968,0,13,0,0,0,0,0,0,0,40,0,0 +58,1,318106,1,9,1,1,1,0,0,0,0,40,0,1 +30,2,156025,1,9,2,1,4,0,1,0,0,40,0,0 +38,0,149455,1,9,0,4,4,1,1,0,0,40,0,0 +25,2,359985,11,3,0,0,0,0,1,0,0,33,4,0 +44,0,165108,3,14,1,3,1,0,0,0,0,40,0,1 +43,2,115178,9,11,1,0,2,0,1,0,0,40,0,1 +21,2,149224,5,10,0,6,3,0,0,0,0,30,0,0 +41,4,352056,6,12,0,1,0,0,0,0,0,40,0,0 +38,2,174717,0,13,1,5,1,0,0,0,0,50,0,1 +29,2,147755,5,10,1,10,1,0,0,0,1672,40,0,0 +52,1,135716,1,9,1,7,1,0,0,0,0,70,0,0 +47,2,44216,1,9,2,1,4,0,1,0,0,45,0,0 +28,2,37359,9,11,1,3,1,0,0,99999,0,50,0,1 +30,0,70617,3,14,1,3,1,2,0,0,0,10,26,0 +30,2,154950,5,10,1,1,1,0,0,15024,0,60,0,1 +40,2,356934,6,12,2,1,0,0,0,0,0,40,0,1 +27,2,271714,5,10,0,4,3,0,1,0,0,30,0,0 +26,2,247025,1,9,0,11,4,0,0,0,0,44,0,0 +32,2,107417,1,9,0,4,0,0,0,0,0,37,0,0 +36,0,116554,0,13,0,0,0,0,1,0,0,40,0,0 +26,2,917220,14,8,0,6,3,1,0,0,0,40,0,0 +25,2,430084,5,10,0,6,0,1,0,0,0,40,0,0 +39,2,202937,5,10,2,9,0,0,1,0,0,40,12,0 +27,2,62737,9,11,1,9,1,0,0,0,0,40,0,0 +24,2,508548,1,9,1,7,1,0,0,0,0,50,0,0 +38,5,275223,0,13,1,5,1,0,0,7688,0,40,0,1 +35,1,381931,1,9,1,7,1,0,0,0,0,55,0,0 +29,2,246974,9,11,0,9,0,0,0,0,0,40,0,0 +49,2,105431,1,9,2,4,0,1,1,0,0,40,0,0 +36,2,146311,4,5,1,8,1,0,0,0,0,40,0,0 +47,1,159869,8,16,1,10,1,0,0,0,0,50,0,0 +21,2,204641,5,10,0,4,3,0,0,0,0,40,0,0 +35,2,66297,0,13,0,3,0,2,1,0,0,40,11,1 +38,2,227615,15,2,1,2,1,0,0,0,0,40,4,0 +45,2,360393,3,14,1,1,1,0,0,0,1902,50,0,1 +19,2,263340,5,10,0,4,3,0,1,0,0,15,0,0 +18,2,141918,1,9,0,2,3,0,0,0,0,22,0,0 +37,2,294292,10,15,1,1,1,0,0,0,0,40,0,0 +49,2,128736,0,13,0,3,4,0,1,0,0,40,0,0 +33,4,511289,9,11,1,11,1,0,0,0,0,48,0,1 +27,2,302406,5,10,1,5,1,0,0,0,0,40,0,1 +34,4,101517,5,10,2,0,4,0,1,0,0,35,0,0 +54,0,161334,3,14,3,3,0,2,1,0,0,40,26,0 +24,5,189148,5,10,0,6,3,0,0,0,0,40,0,0 +44,1,103111,10,15,1,3,1,0,0,0,0,60,0,1 +48,1,51620,0,13,4,10,0,0,0,0,0,50,0,0 +23,2,31606,1,9,0,0,4,0,1,0,0,40,0,0 +29,2,34292,1,9,0,4,3,0,0,0,0,38,0,0 +21,2,107882,6,12,0,4,3,0,1,0,0,9,0,0 +18,2,39529,14,8,0,4,3,0,1,0,0,32,0,0 +18,2,135315,4,5,0,5,3,4,1,0,0,32,0,0 +29,2,107812,1,9,2,10,0,0,0,0,0,40,0,0 +29,2,229729,1,9,0,6,0,0,0,0,0,40,0,0 +41,2,111891,1,9,4,8,5,1,1,0,0,40,0,0 +32,2,340917,1,9,0,2,0,0,0,0,0,40,0,0 +61,2,202952,12,6,2,4,0,1,1,0,0,24,0,0 +79,2,333230,1,9,3,3,0,0,0,0,0,6,0,0 +34,2,114955,6,12,2,8,0,0,0,0,0,40,0,0 +46,2,159869,0,13,1,1,1,0,0,0,0,40,0,1 +50,1,57758,9,11,1,5,1,0,0,0,0,60,0,1 +29,2,207064,1,9,1,8,1,0,0,0,0,40,0,0 +23,2,193090,5,10,0,0,0,0,1,3674,0,40,0,0 +64,2,151364,5,10,0,0,0,0,1,0,0,40,0,0 +70,4,88638,3,14,0,3,4,0,1,7896,0,50,0,1 +28,4,304960,6,12,0,0,0,0,1,0,1980,40,0,0 +51,2,102828,9,11,1,2,1,0,0,0,0,40,34,0 +34,0,154246,0,13,2,3,0,0,0,4865,0,55,0,0 +29,2,142519,1,9,0,2,3,0,0,0,0,40,0,0 +49,2,104455,0,13,3,4,0,2,0,0,0,40,11,0 +77,5,192230,5,10,1,1,1,0,0,0,0,40,0,0 +32,2,292592,1,9,0,4,3,0,1,0,0,35,0,0 +27,2,330132,0,13,1,9,2,0,1,0,0,40,0,1 +22,2,51111,5,10,0,5,0,0,1,0,0,40,0,0 +35,4,258037,1,9,1,10,1,0,0,0,0,40,1,1 +42,4,188291,0,13,1,11,1,0,0,0,1902,40,0,1 +35,0,349066,1,9,2,8,3,0,0,0,0,40,0,0 +33,2,133503,1,9,1,11,1,0,0,2635,0,16,0,0 +45,2,146497,5,10,6,1,4,0,1,0,0,55,0,0 +19,2,240468,5,10,3,5,3,0,1,0,1602,40,0,0 +38,2,175120,1,9,2,10,0,0,0,0,0,40,0,0 +26,2,416577,1,9,1,8,1,1,0,0,0,45,0,0 +29,2,253814,0,13,0,1,0,0,1,0,0,45,0,0 +33,2,159247,0,13,1,3,1,0,0,0,0,40,0,1 +35,1,102471,1,9,2,7,0,0,0,0,0,80,5,0 +42,2,213464,5,10,1,10,1,0,0,0,0,40,0,0 +20,2,211968,9,11,0,4,3,0,1,0,0,20,0,0 +43,3,32016,3,14,1,3,1,0,0,0,0,40,0,1 +69,2,512992,2,7,1,3,1,1,0,0,0,45,0,0 +39,2,135020,1,9,0,6,3,0,0,0,0,40,0,0 +37,2,109133,1,9,1,8,1,0,0,0,0,40,20,0 +28,2,142712,5,10,1,10,1,0,0,0,0,40,0,0 +26,3,76900,0,13,0,9,0,0,0,0,0,40,0,0 +32,2,112176,5,10,2,5,3,0,0,0,0,30,0,0 +43,3,262233,0,13,2,1,0,0,0,0,0,40,0,1 +49,2,122066,1,9,1,1,1,0,0,0,0,30,39,0 +28,2,194690,7,4,4,4,3,0,0,0,0,60,4,0 +35,2,306678,1,9,1,8,1,0,0,2885,0,40,0,0 +35,4,308945,1,9,1,10,1,0,0,0,0,40,0,1 +57,2,46699,1,9,1,0,2,0,1,0,0,40,0,0 +45,2,377757,4,5,1,6,1,0,0,0,0,40,0,0 +23,2,220993,1,9,0,5,0,0,0,0,1590,48,0,0 +45,2,102147,1,9,1,10,1,0,0,0,0,40,0,0 +42,2,113770,1,9,1,0,2,0,1,0,0,40,0,0 +35,2,139012,0,13,1,4,1,2,0,0,0,40,36,0 +45,2,148900,0,13,1,3,1,0,0,0,0,50,0,1 +28,3,329426,0,13,0,1,0,0,0,0,0,40,0,0 +64,5,181408,9,11,1,10,1,0,0,0,0,10,0,0 +44,4,101950,10,15,4,3,4,0,1,0,0,40,0,0 +59,1,32537,1,9,1,7,1,0,0,0,0,40,0,1 +41,2,209547,1,9,0,8,0,0,0,0,0,40,0,0 +21,2,202373,5,10,0,5,3,1,0,0,0,25,0,0 +29,1,151476,9,11,0,0,0,0,1,2174,0,40,0,0 +51,1,174824,1,9,0,7,0,0,0,8614,0,40,0,1 +22,2,138768,1,9,0,0,3,0,0,0,0,40,0,0 +49,2,143482,1,9,2,4,4,0,1,0,0,40,0,0 +53,2,200190,6,12,1,5,1,0,0,0,0,80,0,1 +38,2,168407,5,10,2,0,4,0,1,5721,0,44,0,0 +23,2,148315,5,10,4,10,3,0,0,0,0,40,0,0 +20,2,270517,1,9,0,4,3,0,1,0,0,40,4,0 +40,2,53506,0,13,2,10,3,0,1,0,0,40,0,0 +25,2,105693,0,13,0,3,0,0,1,0,0,40,0,0 +27,2,189589,5,10,2,9,0,0,1,0,0,40,0,0 +20,2,164574,1,9,0,4,3,0,0,0,0,30,0,0 +37,2,185744,1,9,1,4,2,0,1,0,0,20,0,0 +40,4,33155,1,9,0,4,3,0,0,0,0,40,0,0 +28,2,215955,0,13,1,1,1,0,0,3103,0,40,0,1 +38,1,233571,1,9,4,4,4,0,1,0,0,40,0,0 +42,2,211253,0,13,2,1,4,0,1,0,0,40,0,0 +32,3,191385,6,12,2,11,0,0,0,2174,0,40,0,0 +20,2,137895,1,9,1,5,1,0,0,0,0,45,0,0 +62,0,159699,0,13,1,0,1,0,0,0,0,38,0,0 +31,2,295922,5,10,0,0,0,0,0,0,0,40,0,0 +31,1,175856,1,9,1,10,1,0,0,0,0,60,0,0 +24,2,216129,1,9,0,0,3,0,0,0,0,40,0,0 +62,4,407669,7,4,6,4,0,1,1,0,0,35,0,0 +43,4,214242,5,10,1,10,1,0,0,0,0,40,0,1 +21,2,285457,5,10,0,6,3,0,0,0,0,50,0,0 +30,5,124420,1,9,2,1,0,0,0,4650,0,40,0,0 +18,2,142751,12,6,0,2,0,0,0,0,0,40,0,0 +59,4,283635,3,14,2,3,0,0,1,0,0,40,0,0 +24,1,322931,7,4,1,6,1,0,0,0,1902,40,0,1 +49,2,76482,1,9,1,10,1,0,0,0,0,40,0,0 +19,0,431745,2,7,0,4,3,0,0,0,0,30,0,0 +48,2,141944,1,9,1,8,1,0,0,4386,0,40,0,1 +32,2,193042,10,15,1,5,1,0,0,15024,0,60,0,1 +33,2,67006,12,6,0,8,0,0,1,0,0,45,0,0 +23,2,240398,0,13,0,5,0,1,0,0,0,15,0,0 +33,3,182714,10,15,0,3,0,0,1,0,0,65,0,1 +50,3,172046,5,10,1,1,1,0,0,0,0,40,0,1 +30,2,185177,0,13,1,1,1,0,0,0,0,43,0,0 +32,2,102858,6,12,1,3,1,0,0,0,2002,42,0,0 +39,2,84954,5,10,1,5,1,0,0,2829,0,65,0,0 +21,2,115895,5,10,0,5,3,0,1,0,0,20,0,0 +23,2,184589,0,13,0,3,3,0,1,0,0,21,0,0 +32,2,282611,0,13,0,1,0,0,1,0,0,40,0,0 +57,2,218649,1,9,1,2,1,0,0,0,0,40,0,0 +22,0,157541,5,10,0,3,0,0,0,0,0,10,0,0 +70,2,145419,1,9,6,0,4,0,1,0,0,5,0,0 +34,2,122616,5,10,1,9,1,0,0,0,0,84,0,1 +53,2,204584,3,14,2,5,0,0,1,0,0,40,0,0 +21,2,117210,5,10,0,5,3,0,0,0,0,45,0,0 +37,2,69481,1,9,2,8,0,0,0,0,0,40,0,0 +60,1,148492,1,9,1,10,1,0,0,0,1485,50,0,1 +23,2,106957,2,7,0,10,3,2,0,14344,0,40,36,1 +32,2,29312,12,6,1,6,1,0,0,0,0,80,0,1 +57,2,120302,1,9,1,8,1,0,0,0,0,40,0,0 +25,2,182227,5,10,0,0,0,0,0,0,0,30,0,0 +30,2,219110,1,9,1,10,1,0,0,0,0,46,0,0 +31,2,200192,1,9,2,0,0,0,1,0,0,40,9,0 +19,2,427862,5,10,0,4,3,0,0,0,0,35,0,0 +23,0,33551,0,13,1,9,1,0,0,0,0,38,0,0 +44,2,164043,1,9,1,5,1,0,0,0,0,40,0,0 +42,2,175133,5,10,0,8,4,1,1,0,0,40,0,0 +34,1,289731,2,7,1,8,1,0,0,0,0,40,0,0 +32,2,256362,1,9,1,10,1,0,0,0,0,40,0,1 +25,2,282612,9,11,0,9,4,1,1,0,0,40,0,0 +21,2,73679,5,10,0,1,3,0,1,0,0,40,0,0 +31,2,237824,1,9,3,13,5,1,1,0,0,60,2,0 +36,4,357720,9,11,0,3,0,0,1,0,0,40,0,0 +49,1,155489,5,10,1,10,1,0,0,0,0,65,12,0 +44,2,138077,0,13,2,0,4,0,1,0,0,32,0,0 +42,2,183479,9,11,1,5,1,0,0,0,0,40,0,1 +30,2,103596,1,9,0,11,0,0,0,0,0,99,0,0 +33,2,172304,12,6,1,8,1,0,0,0,0,40,0,0 +36,1,313853,0,13,2,4,4,1,0,0,0,45,0,1 +17,2,294485,12,6,0,4,3,0,0,0,0,30,0,0 +20,2,637080,5,10,0,5,0,0,0,0,0,25,0,0 +32,2,385959,1,9,0,10,3,0,0,0,0,50,0,0 +33,1,116539,1,9,1,10,1,0,0,0,0,40,0,0 +37,2,129263,5,10,2,1,4,0,1,0,0,60,0,0 +60,2,141253,12,6,2,7,0,0,0,0,0,48,0,0 +35,0,35626,5,10,2,0,4,0,1,0,0,15,0,0 +43,3,94937,0,13,2,0,4,0,1,0,0,40,0,0 +46,2,220269,5,10,1,9,1,0,0,0,0,40,0,1 +29,1,169544,1,9,1,6,1,0,0,5178,0,40,0,1 +36,2,214604,0,13,1,5,1,0,0,0,0,42,0,1 +27,2,81540,1,9,1,10,1,0,0,0,0,40,0,1 +50,2,24013,5,10,1,1,1,0,0,0,0,84,0,1 +22,2,124940,5,10,1,0,2,3,1,0,0,44,0,0 +33,0,313729,3,14,0,3,0,0,0,0,0,60,0,0 +61,2,192237,12,6,2,5,4,0,1,0,0,40,0,0 +41,1,113324,9,11,1,7,1,0,0,0,0,70,0,1 +22,2,215477,5,10,0,6,3,0,0,0,0,40,0,0 +27,2,199903,0,13,0,3,0,0,1,0,0,40,0,0 +25,2,431861,1,9,1,6,1,0,0,0,0,40,0,0 +32,2,105938,1,9,0,8,3,1,1,0,1602,20,0,0 +28,2,274679,3,14,0,3,0,0,0,0,0,50,0,0 +25,2,177499,0,13,0,10,3,0,0,0,1590,35,0,0 +28,2,206125,5,10,1,10,1,0,0,0,0,40,0,0 +37,4,221740,0,13,1,3,2,0,1,0,0,30,0,1 +58,2,202652,1,9,6,0,0,0,1,0,0,37,0,0 +39,2,348960,1,9,1,2,1,0,0,0,0,40,0,0 +33,2,171876,5,10,2,4,4,0,1,0,0,40,0,0 +59,2,157932,12,6,1,10,1,0,0,0,0,40,0,1 +58,2,201344,0,13,2,10,3,0,1,0,0,20,0,0 +38,2,354739,9,11,1,3,1,2,0,0,0,36,11,1 +34,2,40067,5,10,1,10,1,0,0,0,0,40,0,0 +31,2,326862,5,10,2,10,3,1,0,0,0,40,0,0 +48,4,189762,1,9,1,10,1,0,0,0,0,40,0,1 +45,2,226246,1,9,2,2,0,0,0,0,0,50,0,0 +23,2,38251,1,9,0,4,3,0,1,0,0,40,0,0 +33,2,196385,3,14,1,3,1,0,0,0,0,37,0,1 +38,1,217054,5,10,2,7,0,0,0,0,0,40,0,0 +44,1,104973,3,14,1,7,1,0,0,0,0,40,0,1 +48,4,238959,3,14,2,1,4,1,1,9562,0,40,0,1 +40,0,34218,1,9,1,10,1,0,0,0,0,40,0,0 +19,4,292962,1,9,0,10,5,1,1,0,0,40,0,0 +45,2,235924,0,13,2,1,3,0,1,0,0,40,0,0 +34,2,98656,5,10,0,3,0,0,1,0,0,40,0,0 +70,2,102610,5,10,2,4,0,0,0,0,0,80,0,0 +32,4,296466,3,14,0,3,0,0,0,0,0,60,0,0 +33,2,323069,9,11,2,4,4,0,1,0,0,40,0,0 +24,2,184756,0,13,0,1,0,0,1,0,0,40,0,0 +30,4,233993,0,13,0,3,3,0,1,0,0,15,0,0 +22,2,130724,5,10,0,5,3,1,0,0,0,25,0,0 +52,5,181855,10,15,1,3,1,4,0,99999,0,65,0,1 +67,1,127543,12,6,1,7,1,0,0,2414,0,80,0,0 +40,2,187164,1,9,1,1,1,0,0,0,1672,45,0,0 +55,2,113912,9,11,1,3,2,0,1,0,0,20,0,0 +29,2,216479,1,9,2,1,0,0,1,0,0,40,0,0 +62,2,135480,1,9,1,5,1,0,0,0,0,16,0,0 +22,2,204160,1,9,2,8,3,0,1,0,0,40,0,0 +64,0,114650,4,5,1,10,1,0,0,0,0,40,0,0 +29,1,240172,0,13,0,1,5,0,0,0,0,50,0,0 +28,2,184831,5,10,1,1,1,0,0,0,0,40,0,0 +25,2,124590,1,9,0,1,5,0,0,0,0,40,0,0 +47,0,120429,8,16,1,3,1,0,0,15024,0,50,0,1 +26,2,202033,0,13,1,6,1,0,0,0,0,40,0,1 +18,2,156874,14,8,0,4,3,0,0,0,0,27,0,0 +52,5,177727,12,6,1,5,1,0,0,4064,0,45,0,0 +48,4,334409,0,13,1,3,2,0,1,0,0,50,0,1 +36,2,311255,1,9,1,8,1,1,0,0,0,40,19,0 +23,2,214227,9,11,2,0,0,0,1,0,0,30,0,0 +41,2,115849,1,9,1,6,1,0,0,0,0,40,0,0 +56,0,671292,1,9,1,6,1,0,0,0,0,38,0,1 +53,2,31460,1,9,2,3,0,0,0,0,0,40,0,0 +26,2,141824,5,10,2,1,0,0,1,0,0,40,0,0 +22,2,310152,5,10,0,4,0,0,0,3325,0,40,0,0 +25,2,179953,3,14,0,3,3,0,1,2597,0,31,0,0 +31,2,137952,5,10,1,4,1,4,0,0,0,40,5,0 +36,2,103323,6,12,1,8,1,0,0,2829,0,40,0,0 +46,2,174426,5,10,1,8,1,0,0,0,0,40,0,0 +46,0,192779,6,12,2,0,4,0,0,0,2258,38,0,1 +32,2,169955,5,10,1,4,2,0,1,0,0,36,5,0 +43,1,48087,1,9,0,7,0,0,0,0,0,60,0,0 +30,2,132601,0,13,1,1,1,0,0,99999,0,50,0,1 +41,5,253060,0,13,1,5,1,0,0,7688,0,45,0,1 +50,2,108435,3,14,1,1,1,0,0,99999,0,60,0,1 +37,0,210452,3,14,1,1,1,0,0,0,0,38,0,0 +22,4,134181,1,9,0,2,5,0,0,0,0,50,0,0 +51,3,45487,1,9,1,6,1,0,0,0,0,80,0,0 +47,2,183522,5,10,1,1,2,1,1,0,0,40,0,1 +40,2,199303,1,9,1,0,1,0,0,0,0,40,0,0 +46,2,83064,5,10,1,8,1,0,0,0,0,40,0,0 +30,2,44419,5,10,0,9,4,0,1,0,0,40,0,0 +27,1,442612,1,9,1,5,1,0,0,0,0,65,0,1 +31,4,158092,5,10,0,0,3,0,1,0,0,35,0,0 +31,2,374833,15,2,1,2,1,0,0,0,0,40,4,0 +30,2,112650,1,9,2,10,3,0,0,0,0,40,0,0 +50,4,183390,0,13,4,3,0,0,0,0,0,40,0,1 +27,2,207418,0,13,0,3,0,0,1,0,0,50,0,0 +29,2,243660,1,9,1,8,1,0,0,0,0,50,0,1 +28,2,54243,1,9,2,6,0,0,0,0,0,60,0,0 +54,2,50385,0,13,2,1,0,1,1,0,0,45,0,1 +47,0,187581,9,11,1,9,1,0,0,0,0,48,0,1 +34,2,37380,1,9,3,8,4,0,1,0,0,40,0,0 +26,2,247025,5,10,0,2,0,0,0,0,0,40,0,0 +23,0,101094,5,10,0,11,3,0,0,0,0,60,0,0 +42,4,176716,3,14,2,3,0,0,0,0,0,40,0,0 +36,1,118429,1,9,1,1,1,0,0,0,0,50,0,0 +52,3,221532,0,13,1,11,1,0,0,0,0,45,0,1 +27,4,124680,3,14,0,3,0,0,1,0,0,40,0,0 +42,2,153160,1,9,6,4,4,0,1,0,0,40,0,0 +39,2,114678,1,9,2,4,4,1,1,5455,0,40,0,0 +49,0,142856,1,9,1,3,1,0,0,0,0,40,0,1 +36,2,29702,1,9,1,5,1,0,0,7688,0,40,0,1 +20,2,277700,13,1,0,4,3,0,0,0,0,32,0,0 +55,5,67433,1,9,1,1,1,0,0,0,0,60,0,0 +47,2,121124,4,5,1,8,1,0,0,0,0,40,0,0 +33,2,394447,3,14,1,3,1,0,0,0,0,33,0,1 +36,2,79649,5,10,1,5,1,0,0,0,0,40,0,0 +39,2,203763,8,16,2,3,4,0,1,0,0,80,0,0 +55,2,229029,0,13,1,1,1,0,0,15024,0,48,0,1 +48,2,162816,6,12,1,6,1,0,0,0,0,45,0,0 +30,2,109117,9,11,0,2,3,0,0,0,0,45,0,0 +24,2,32732,1,9,1,10,1,0,0,0,0,50,0,0 +57,1,217692,1,9,6,10,0,0,1,0,0,38,0,0 +20,2,34590,5,10,0,7,3,0,0,0,0,60,0,0 +56,2,168625,1,9,2,3,0,0,1,4101,0,40,0,0 +36,2,91037,1,9,1,0,2,0,1,0,0,40,0,1 +44,2,171484,12,6,1,8,1,0,0,0,0,40,0,1 +57,2,200453,1,9,1,10,1,0,0,15024,0,40,0,1 +57,2,36990,1,9,1,10,1,1,0,0,0,52,0,0 +33,2,198211,1,9,1,9,1,0,0,0,0,40,0,0 +39,2,70995,0,13,1,6,1,0,0,15024,0,99,0,1 +28,2,245790,1,9,0,10,3,0,0,0,0,40,0,0 +31,2,273324,5,10,0,4,3,0,0,0,1721,16,0,0 +60,2,182687,6,12,2,4,0,0,1,0,0,40,0,0 +36,4,247807,9,11,0,11,0,0,0,0,0,40,0,1 +58,2,163113,1,9,6,5,0,0,1,0,0,35,0,1 +50,2,180522,5,10,0,2,0,0,0,0,0,38,0,0 +23,4,203353,0,13,0,1,3,0,1,0,0,12,0,0 +30,2,87469,1,9,0,4,0,0,0,0,0,40,0,0 +90,2,87372,10,15,1,3,1,0,0,20051,0,72,0,1 +49,4,173584,0,13,0,3,0,0,1,0,0,50,0,0 +47,4,80282,0,13,1,3,1,0,0,3137,0,40,0,0 +34,2,319854,8,16,0,3,0,0,0,0,0,40,18,1 +37,3,408229,1,9,2,9,4,0,1,0,0,40,0,0 +25,2,431307,12,6,1,11,2,1,1,0,0,50,0,0 +37,2,134088,6,12,0,0,0,0,1,0,0,40,0,0 +47,2,246396,1,9,1,0,1,0,0,0,0,40,4,0 +34,2,159255,1,9,1,1,1,0,0,0,0,60,0,1 +34,2,106014,5,10,0,4,0,0,0,0,0,40,0,0 +35,2,186934,1,9,1,1,1,0,0,7688,0,50,0,1 +39,2,120130,5,10,4,8,3,0,0,0,0,40,0,0 +32,0,203849,7,4,1,2,1,0,0,0,0,19,0,0 +24,2,207940,1,9,1,4,2,0,1,0,0,30,0,0 +28,2,302406,10,15,0,3,0,0,0,0,0,60,0,0 +41,1,144594,7,4,1,10,1,0,0,0,2179,40,0,0 +32,2,459007,1,9,1,11,1,0,0,0,0,90,0,0 +58,2,372181,1,9,2,5,4,0,1,0,0,40,0,1 +47,1,172034,1,9,1,5,1,0,0,0,0,75,0,1 +41,2,156566,0,13,1,1,1,0,0,4386,0,50,0,1 +35,5,338320,1,9,1,1,1,0,0,0,0,50,0,1 +24,2,353696,5,10,0,4,3,0,0,0,0,20,8,0 +46,1,342907,1,9,1,5,1,1,0,0,0,60,0,1 +69,5,169717,0,13,1,1,1,0,0,6418,0,45,0,1 +22,2,103762,0,13,0,1,3,0,1,0,0,40,0,0 +36,0,47570,3,14,0,3,0,0,1,0,0,40,0,0 +31,2,119432,0,13,1,5,1,0,0,0,0,40,0,1 +23,4,144165,0,13,0,3,3,3,0,0,0,30,0,0 +35,2,180647,5,10,0,3,0,1,1,0,0,40,0,0 +37,4,312232,0,13,1,11,1,0,0,5178,0,40,0,1 +35,0,150488,0,13,0,3,0,0,1,0,0,40,0,0 +18,2,200876,2,7,0,6,3,0,0,0,0,16,0,0 +43,2,188199,4,5,2,2,4,0,1,0,0,40,0,0 +53,0,118793,1,9,1,11,1,0,0,0,0,40,0,0 +54,4,204325,5,10,1,11,1,0,0,0,0,52,0,0 +29,2,256671,1,9,1,0,2,0,1,0,0,40,0,0 +46,2,231515,6,12,0,0,0,0,1,0,0,47,1,0 +24,2,100669,5,10,0,2,3,2,0,0,0,30,0,0 +30,2,88913,5,10,4,4,4,2,1,0,0,40,0,0 +23,2,363219,5,10,0,13,0,0,1,0,0,6,0,0 +36,2,308945,1,9,1,8,1,0,0,0,0,40,0,0 +38,1,100316,0,13,1,10,1,0,0,0,0,35,0,0 +33,2,296453,3,14,1,9,1,0,0,0,0,15,0,0 +66,2,298834,5,10,1,11,1,0,0,0,0,40,8,0 +45,1,188694,1,9,1,1,1,0,0,0,0,40,0,0 +37,2,186934,1,9,1,5,1,0,0,15024,0,60,0,1 +17,2,154908,12,6,0,4,3,0,1,0,0,10,0,0 +31,2,22201,1,9,1,0,1,3,0,0,0,40,0,1 +46,2,216999,0,13,0,1,0,0,0,0,0,55,0,1 +40,2,186916,0,13,1,3,1,0,0,0,0,40,0,0 +34,2,116677,5,10,1,2,1,0,0,0,0,40,0,0 +56,2,95763,12,6,2,10,0,0,0,0,0,45,0,0 +42,2,266710,5,10,4,0,4,1,1,0,0,41,0,0 +46,2,117849,3,14,1,1,1,0,0,0,0,55,0,1 +30,2,242460,1,9,4,10,0,0,0,0,0,50,0,0 +33,1,202729,0,13,1,10,1,0,0,0,0,40,0,1 +47,2,181652,1,9,1,8,2,0,1,0,0,40,0,0 +57,1,174760,6,12,3,7,4,3,0,0,0,40,0,0 +34,2,56121,2,7,2,10,4,0,0,0,0,40,0,0 +40,2,390369,1,9,2,10,3,0,0,0,0,40,0,0 +33,2,149726,1,9,1,5,1,0,0,0,0,40,0,1 +22,2,51262,1,9,0,8,3,0,0,0,0,40,0,0 +53,3,205288,1,9,1,0,2,0,1,7688,0,35,0,1 +36,2,154835,1,9,4,0,3,2,1,0,0,40,11,0 +45,2,89028,1,9,2,10,0,2,0,10520,0,40,0,1 +36,2,194630,5,10,2,5,4,0,1,0,0,40,0,0 +18,1,212207,1,9,0,7,3,0,0,0,0,11,0,0 +27,2,204788,1,9,0,0,0,0,1,0,0,40,0,0 +30,2,158688,1,9,1,8,1,0,0,0,0,40,0,0 +34,2,97723,0,13,1,3,1,0,0,0,0,40,0,1 +36,2,193026,0,13,1,5,1,0,0,0,0,40,0,1 +36,1,257250,7,4,0,7,3,0,0,0,0,75,0,0 +48,2,355978,3,14,1,1,1,0,0,0,0,40,0,0 +41,1,200574,10,15,1,3,1,0,0,0,1977,60,0,1 +21,2,376929,11,3,0,13,0,0,1,0,0,40,4,0 +47,0,123219,3,14,1,3,1,0,0,0,0,38,0,1 +41,2,82778,15,2,1,7,1,0,0,0,0,40,4,0 +61,1,115882,15,2,1,10,1,0,0,0,0,20,0,0 +64,2,103021,7,4,1,10,1,0,0,0,0,40,0,0 +35,2,297767,5,10,4,0,0,1,0,0,0,40,0,0 +44,2,259479,1,9,2,6,4,0,0,0,0,50,0,0 +20,2,167787,5,10,0,5,3,0,1,0,0,20,0,0 +23,4,40021,5,10,2,0,4,0,1,0,0,70,0,0 +52,2,245275,12,6,1,4,2,0,1,0,0,35,0,0 +43,2,37402,3,14,0,1,0,0,1,0,0,25,0,0 +32,2,103608,0,13,1,2,1,2,0,0,0,40,0,0 +63,2,137192,0,13,1,10,1,2,0,0,0,40,27,0 +29,2,137618,5,10,0,4,0,0,1,0,0,41,0,1 +42,5,96509,5,10,1,1,1,2,0,0,0,60,18,0 +65,2,196174,12,6,2,2,0,0,1,0,0,28,0,0 +24,2,172612,1,9,1,10,1,0,0,0,0,40,0,0 +42,2,141186,5,10,0,4,3,0,1,0,0,40,0,0 +35,2,228190,1,9,1,6,1,1,0,0,0,40,0,0 +38,3,307404,5,10,2,0,4,0,1,0,0,40,0,0 +26,2,152436,1,9,2,0,0,0,1,0,0,50,0,0 +46,1,182541,1,9,1,7,1,0,0,0,1672,50,0,0 +39,2,282153,5,10,0,0,3,0,1,0,0,20,0,0 +42,2,162003,8,16,0,3,0,0,0,0,0,36,0,1 +36,2,190759,0,13,1,3,1,0,0,0,0,45,0,1 +26,2,208122,5,10,2,2,0,0,0,0,0,45,0,0 +57,2,173832,0,13,1,5,1,0,0,0,1902,40,0,1 +55,2,129173,1,9,0,2,0,1,0,0,0,40,0,0 +35,2,287548,5,10,1,5,1,0,0,0,0,55,0,1 +24,2,146706,5,10,0,4,0,0,1,0,0,30,0,0 +47,2,285200,1,9,1,10,1,0,0,0,0,40,0,0 +34,5,314375,5,10,1,5,1,0,0,0,0,60,0,1 +44,2,203943,0,13,1,1,1,1,0,0,0,35,0,1 +27,2,517000,0,13,0,0,0,0,0,0,0,35,0,0 +36,2,66173,0,13,0,0,0,0,1,0,0,50,0,0 +21,2,182823,0,13,0,5,3,0,0,0,0,30,0,0 +29,2,159479,1,9,1,6,1,4,0,0,0,55,0,0 +25,2,135568,1,9,1,2,1,0,0,0,0,40,0,0 +73,2,333676,1,9,1,7,1,0,0,0,0,50,0,0 +45,2,201699,9,11,1,8,1,0,0,0,0,40,0,1 +28,2,96020,0,13,1,1,2,0,1,0,0,50,0,1 +43,2,176138,0,13,1,1,1,0,0,0,0,50,0,0 +47,2,47496,1,9,2,10,0,0,0,0,0,42,0,0 +20,2,187158,5,10,0,0,3,0,1,0,0,15,0,0 +22,2,249727,5,10,0,6,3,0,0,0,0,20,0,0 +76,1,237624,7,4,1,10,1,0,0,0,0,10,0,0 +24,2,175254,5,10,0,6,0,1,0,0,0,40,0,0 +54,1,42924,5,10,1,5,1,0,0,0,0,50,0,0 +30,2,205950,5,10,1,8,1,0,0,0,0,40,0,1 +33,2,111985,5,10,1,10,1,0,0,0,0,58,0,0 +30,2,167476,5,10,2,8,0,0,0,0,0,50,0,0 +40,2,221172,6,12,1,1,1,0,0,0,0,50,0,1 +49,2,199448,9,11,2,5,4,0,1,0,0,40,0,0 +30,2,313038,1,9,0,10,0,0,0,0,0,40,0,0 +22,2,148431,1,9,0,0,0,4,1,0,0,40,0,0 +19,2,112432,1,9,1,2,1,0,0,0,0,58,0,0 +46,2,57914,1,9,1,11,1,0,0,0,0,40,0,0 +51,2,145166,1,9,1,0,1,0,0,0,0,50,0,0 +56,2,247119,7,4,6,8,4,4,1,0,0,40,21,0 +53,2,196278,5,10,6,5,0,0,1,0,0,40,0,0 +27,2,216481,0,13,0,3,0,0,1,0,0,40,0,0 +46,2,188027,5,10,0,1,4,0,1,0,0,45,0,0 +37,2,66686,1,9,1,6,1,0,0,0,0,40,0,1 +41,2,74775,0,13,1,4,1,2,0,0,0,30,36,0 +30,1,250499,5,10,1,0,2,0,1,0,0,55,0,1 +57,1,192869,1,9,1,7,1,0,0,0,0,72,0,0 +44,5,121352,5,10,1,1,1,0,0,0,0,50,0,0 +32,1,70985,1,9,1,7,1,0,0,4064,0,40,0,0 +27,1,123116,1,9,1,6,1,0,0,0,0,40,0,0 +57,4,339163,5,10,6,0,4,0,1,0,0,40,4,0 +59,1,124771,0,13,1,7,1,0,0,0,0,30,0,0 +32,2,167531,10,15,1,3,2,2,1,15024,0,50,0,1 +22,2,199266,0,13,0,1,0,0,1,0,0,30,0,0 +39,2,190728,1,9,0,0,0,0,1,0,0,40,0,0 +43,2,99212,9,11,1,1,1,0,0,3103,0,48,0,1 +38,4,421446,0,13,1,1,1,1,0,0,0,50,0,1 +61,2,215944,4,5,2,5,0,0,0,0,0,25,0,0 +24,2,72310,5,10,0,5,3,0,0,0,0,43,0,0 +25,2,57512,5,10,0,5,0,0,0,0,0,45,0,0 +44,2,89413,9,11,1,10,1,0,0,0,0,40,0,0 +55,4,28151,1,9,2,0,0,0,1,0,0,40,0,1 +90,2,46786,0,13,1,5,1,0,0,9386,0,15,0,1 +30,2,226943,1,9,2,0,4,0,1,0,0,35,0,0 +44,2,182402,1,9,1,10,1,0,0,0,0,40,0,1 +36,2,305352,12,6,2,10,5,1,0,0,0,40,0,0 +63,5,189253,5,10,1,1,1,0,0,0,0,45,0,1 +60,2,296485,11,3,1,6,1,0,0,0,0,40,0,0 +34,1,204375,10,15,0,3,0,0,1,0,0,60,0,1 +49,1,249585,2,7,1,1,1,0,0,0,0,65,0,0 +47,2,148995,3,14,1,1,1,0,0,0,0,65,0,1 +42,5,168071,1,9,1,5,1,0,0,0,0,43,0,1 +53,2,194995,11,3,1,10,1,0,0,0,0,45,25,0 +23,2,211049,5,10,0,9,0,0,1,4101,0,40,0,0 +20,2,50397,5,10,1,5,1,1,0,0,0,35,0,0 +43,2,177905,1,9,1,2,1,0,0,3908,0,40,0,0 +32,2,204374,10,15,1,3,1,0,0,0,1977,60,0,1 +43,2,60001,0,13,2,5,4,0,0,0,0,44,0,1 +31,2,223046,1,9,1,6,1,0,0,0,0,60,0,0 +24,2,154571,5,10,0,0,3,2,0,0,0,20,0,0 +39,2,67136,9,11,4,0,0,2,0,0,0,40,0,0 +29,2,188675,5,10,1,10,1,1,0,0,0,40,2,1 +20,2,390817,11,3,0,2,0,0,0,0,0,25,4,0 +42,2,30424,2,7,4,4,4,0,1,0,0,38,0,0 +53,2,548361,1,9,1,10,1,0,0,0,0,40,0,0 +20,2,189148,1,9,1,2,1,0,0,0,0,48,0,0 +58,1,266707,15,2,1,6,1,0,0,0,2179,18,0,0 +51,1,311569,1,9,2,5,0,0,0,0,0,40,0,0 +25,2,187653,1,9,0,2,0,0,0,0,0,48,0,0 +38,2,235379,6,12,0,3,4,0,1,0,0,36,0,0 +41,2,188615,5,10,1,10,1,0,0,0,0,40,0,1 +58,2,322691,0,13,1,8,1,0,0,0,0,40,0,1 +25,2,184698,12,6,0,8,0,0,0,0,0,40,21,0 +50,2,144361,1,9,1,10,1,0,0,0,0,40,0,0 +32,2,130057,0,13,1,1,1,0,0,0,0,45,0,1 +31,5,117963,8,16,0,3,3,0,0,0,0,40,0,0 +22,2,123876,5,10,0,4,3,0,1,0,0,20,0,0 +37,2,248445,1,9,2,2,5,0,0,0,0,40,22,0 +32,2,207172,5,10,0,5,5,0,1,0,0,40,0,0 +46,0,119904,10,15,0,3,0,0,1,0,1564,55,0,1 +62,2,134768,1,9,1,6,1,0,0,0,0,40,0,1 +56,2,132026,0,13,1,5,1,1,0,7688,0,45,0,1 +37,2,60722,5,10,2,1,0,2,1,0,0,40,28,1 +41,2,648223,15,2,3,7,4,0,0,0,0,40,4,0 +56,2,298695,7,4,1,8,1,0,0,0,0,48,0,0 +20,2,219835,5,10,0,2,0,0,0,0,0,30,0,0 +34,1,313729,0,13,1,5,1,0,0,0,0,60,0,1 +45,2,140644,1,9,1,5,1,0,0,0,0,50,0,1 +30,2,203488,5,10,1,8,1,0,0,0,0,40,0,1 +51,1,132341,1,9,1,1,1,0,0,0,0,45,0,1 +27,2,161683,2,7,1,8,1,0,0,0,0,42,0,0 +38,2,312771,9,11,1,5,1,0,0,0,0,40,0,1 +39,2,258102,5,10,1,2,1,0,0,0,0,50,0,0 +47,2,254367,5,10,1,1,1,0,0,0,0,50,0,1 +43,2,152629,1,9,1,10,1,0,0,0,0,40,0,1 +46,4,141058,1,9,1,1,1,0,0,0,0,65,0,0 +41,2,233130,5,10,1,10,1,0,0,0,0,40,0,1 +20,2,406641,1,9,0,0,0,0,1,0,0,30,0,0 +30,0,119422,12,6,1,0,1,0,0,0,0,40,0,0 +30,2,255486,1,9,1,4,1,1,0,0,0,25,0,0 +22,2,161532,5,10,0,2,3,0,0,0,0,35,0,0 +25,2,75759,1,9,1,6,1,0,0,0,0,44,0,1 +18,2,163332,1,9,0,5,3,0,1,0,0,22,0,0 +50,2,34832,0,13,1,9,1,0,0,15024,0,40,0,1 +28,2,37933,1,9,0,4,0,1,1,0,0,48,0,0 +21,2,165107,5,10,0,13,3,0,1,0,0,40,0,0 +37,2,126011,9,11,2,9,3,0,0,0,0,40,0,0 +28,3,56651,0,13,0,3,3,1,1,0,0,40,0,0 +23,2,522881,11,3,1,4,1,0,0,0,0,35,4,0 +32,2,191777,9,11,0,1,0,1,1,0,0,35,7,0 +27,2,132686,14,8,0,8,3,0,0,0,0,50,0,0 +55,2,201112,1,9,2,3,4,1,1,0,0,40,0,0 +44,2,174283,1,9,1,10,1,0,0,0,0,40,0,1 +25,2,208591,0,13,0,3,3,0,0,0,0,40,0,0 +29,2,126399,1,9,2,5,4,0,1,0,0,32,0,0 +50,2,142073,1,9,3,1,0,0,1,0,0,55,0,0 +18,2,395567,1,9,0,2,3,0,0,0,0,40,0,0 +74,2,180455,0,13,6,4,0,0,1,0,0,8,0,0 +22,2,235853,4,5,0,5,0,0,0,0,0,40,0,0 +27,2,160731,0,13,1,3,1,0,0,0,0,40,0,0 +27,0,31935,5,10,0,9,3,0,1,0,0,80,0,0 +41,2,35166,10,15,1,3,1,0,0,15024,0,50,0,1 +24,2,161092,5,10,1,0,1,0,0,7298,0,40,0,1 +23,2,223019,1,9,0,0,3,0,1,0,0,40,0,0 +34,1,179673,10,15,1,3,1,0,0,7688,0,60,0,1 +46,0,248895,0,13,1,1,1,0,0,0,0,40,0,1 +32,2,200323,10,15,0,3,0,0,0,0,0,60,0,0 +41,2,230020,1,9,1,10,1,4,0,0,0,40,0,0 +29,2,134890,9,11,1,7,1,0,0,0,0,40,0,1 +48,2,162096,4,5,1,8,5,2,1,0,0,45,26,0 +51,2,103824,1,9,0,4,0,1,0,0,0,40,19,0 +34,0,61431,14,8,0,0,0,1,1,0,0,40,0,0 +58,2,197319,0,13,1,1,1,0,0,0,0,45,0,1 +52,2,183618,1,9,1,2,1,0,0,0,0,40,0,0 +37,1,268598,0,13,1,1,1,4,0,7298,0,50,5,1 +53,2,263729,5,10,4,0,0,0,1,0,0,40,0,0 +54,2,39493,9,11,1,6,1,0,0,0,0,20,0,0 +36,2,185360,1,9,1,5,1,0,0,0,0,60,0,0 +25,2,132661,9,11,0,0,3,0,1,0,0,60,0,0 +20,2,266400,5,10,0,3,3,0,1,0,0,48,0,0 +23,2,433669,6,12,0,0,0,0,0,0,0,40,0,0 +39,5,216473,0,13,1,1,1,0,0,0,0,60,0,1 +20,1,217404,12,6,0,8,3,0,0,0,0,40,0,0 +28,2,227778,9,11,0,4,5,1,0,0,0,40,0,0 +73,0,96262,1,9,6,0,0,0,1,0,0,40,0,0 +67,2,247566,1,9,1,11,1,0,0,0,0,24,0,0 +56,2,139616,0,13,2,1,0,0,0,0,0,45,0,1 +32,2,73585,9,11,1,10,1,0,0,0,0,40,0,0 +42,2,37869,5,10,2,8,0,0,0,0,1590,40,0,0 +33,2,165814,1,9,1,4,1,1,0,0,0,40,0,0 +37,2,108913,1,9,0,4,0,0,0,0,0,40,0,0 +33,2,34975,5,10,1,1,1,0,0,0,0,45,0,0 +31,2,157078,12,6,0,0,4,0,1,0,0,40,0,0 +59,2,232672,3,14,1,1,1,0,0,0,0,40,0,1 +21,2,294295,1,9,0,0,4,0,0,0,0,40,0,0 +58,5,130454,5,10,1,1,1,0,0,0,0,50,0,1 +24,4,461678,12,6,0,4,0,0,0,0,0,40,0,0 +26,0,252284,5,10,1,11,1,0,0,0,0,40,0,0 +26,2,256737,2,7,1,6,1,0,0,0,0,40,0,0 +33,4,96480,3,14,0,3,0,0,1,0,0,40,9,0 +25,2,234263,0,13,0,5,0,0,0,0,0,40,0,0 +21,2,109952,12,6,1,8,1,0,0,0,0,50,0,0 +24,2,262570,1,9,0,8,0,0,0,0,0,40,0,0 +39,1,65716,6,12,1,0,2,0,1,0,0,40,0,1 +68,2,201732,5,10,2,0,4,0,1,0,0,40,0,0 +66,1,174788,5,10,0,5,0,0,1,0,0,20,0,0 +38,2,278924,0,13,0,7,0,0,0,0,0,40,0,0 +41,2,101593,3,14,1,1,1,0,0,0,0,50,0,1 +37,2,342768,1,9,1,10,1,0,0,0,0,40,0,0 +54,1,242606,3,14,1,5,1,0,0,4386,0,45,0,1 +27,0,176727,0,13,0,3,0,0,0,0,0,40,0,0 +49,2,99179,0,13,0,3,0,0,1,0,0,40,0,0 +19,0,354104,5,10,0,3,3,0,0,0,0,10,0,0 +25,2,61956,5,10,0,6,0,0,0,0,0,50,0,0 +47,3,137917,5,10,1,0,1,1,0,0,0,40,0,1 +40,2,224658,5,10,1,5,5,0,0,0,0,40,0,0 +38,2,51100,0,13,2,1,0,0,0,3325,0,40,0,0 +25,2,224361,1,9,0,4,0,0,0,0,0,40,0,0 +25,2,362912,5,10,0,10,3,0,1,0,0,50,0,0 +23,2,218782,12,6,0,2,5,4,0,0,0,40,0,0 +28,2,103389,3,14,2,5,3,0,1,0,0,40,0,0 +29,2,308944,1,9,3,10,0,0,0,0,0,40,0,0 +32,2,140092,2,7,1,10,1,0,0,0,0,40,0,0 +34,2,202210,1,9,0,4,4,1,1,0,0,40,0,0 +52,2,416059,0,13,1,3,1,1,0,0,0,40,0,1 +33,1,281030,1,9,1,7,1,0,0,0,0,94,0,0 +19,2,169758,5,10,0,5,3,0,0,0,0,35,0,0 +68,2,193666,8,16,1,3,1,0,0,20051,0,55,0,1 +41,2,139907,12,6,0,2,4,0,0,0,0,50,0,0 +18,5,119422,1,9,0,4,4,2,1,0,0,30,3,0 +29,2,149324,5,10,1,10,1,0,0,0,1485,40,0,1 +40,2,259307,3,14,1,1,1,0,0,0,0,50,0,1 +51,1,74160,3,14,2,3,4,0,0,0,0,60,0,1 +49,2,134797,5,10,2,0,0,0,0,0,0,40,0,0 +20,0,41103,5,10,0,4,3,0,1,0,0,20,0,0 +38,4,193026,1,9,1,10,1,0,0,0,0,50,0,1 +57,2,303986,11,3,0,4,0,0,0,0,0,40,1,0 +35,2,126569,5,10,1,5,1,0,0,4064,0,40,0,0 +66,2,166461,2,7,1,5,1,0,0,0,0,26,0,0 +25,2,254746,9,11,0,0,0,0,1,0,0,40,0,0 +70,2,282642,1,9,1,2,1,0,0,0,2174,40,0,1 +59,1,136413,7,4,1,7,1,0,0,0,0,48,0,0 +25,2,131463,0,13,1,3,1,0,0,0,0,40,0,0 +44,4,177240,10,15,0,3,0,0,0,10520,0,40,0,1 +37,2,218490,3,14,1,1,1,0,0,0,0,55,22,1 +21,2,20728,1,9,0,5,3,0,1,4101,0,40,0,0 +47,3,117628,1,9,1,10,1,0,0,0,0,40,0,1 +20,2,91939,1,9,0,0,0,1,1,0,1721,30,0,0 +32,0,175931,1,9,1,11,1,0,0,0,0,40,0,0 +28,2,309566,1,9,0,0,4,0,1,0,0,20,0,0 +53,2,123703,1,9,2,6,0,0,0,0,0,40,0,0 +58,2,29928,5,10,1,5,2,0,1,0,0,36,0,0 +22,2,167868,1,9,0,5,0,0,1,0,0,30,0,0 +23,2,235894,2,7,1,1,1,0,0,0,0,55,0,0 +21,2,189888,1,9,0,2,0,0,0,3325,0,60,0,0 +36,2,111545,1,9,1,10,1,0,0,0,0,70,0,0 +39,2,175972,5,10,1,4,2,0,1,0,0,15,0,0 +34,4,254270,0,13,0,3,0,0,1,0,0,40,0,0 +41,4,185057,3,14,0,3,0,0,1,0,0,40,0,0 +72,2,157593,0,13,1,5,1,0,0,1455,0,6,0,0 +34,2,101345,1,9,1,4,2,0,1,0,0,40,0,1 +51,4,176751,0,13,1,3,1,0,0,0,1902,40,0,1 +32,1,97723,9,11,0,10,0,0,0,0,0,40,0,0 +38,2,127601,5,10,6,1,0,0,1,0,0,40,0,1 +37,2,227597,5,10,1,10,1,0,0,0,0,40,0,0 +21,2,250051,5,10,0,3,3,0,1,0,0,10,0,0 +26,2,284078,5,10,0,0,0,0,0,0,0,40,0,0 +34,2,207668,5,10,1,2,1,0,0,0,1887,40,0,1 +18,2,163787,5,10,0,5,3,0,1,0,0,15,0,0 +27,2,119170,2,7,0,1,4,0,1,0,0,45,0,0 +20,2,188612,5,10,0,0,3,0,1,0,0,38,35,0 +36,2,114605,9,11,1,0,1,0,0,0,0,40,0,1 +32,2,164197,0,13,1,1,1,0,0,0,0,60,0,1 +54,2,329266,1,9,1,10,1,0,0,0,0,44,0,1 +34,4,207383,3,14,6,3,0,0,1,0,0,40,0,0 +46,2,123598,5,10,1,5,1,0,0,0,0,48,0,1 +33,2,259931,2,7,4,8,5,0,0,0,0,30,0,0 +32,2,134737,0,13,1,3,1,0,0,99999,0,50,0,1 +42,2,106900,9,11,0,9,0,0,0,0,0,40,0,0 +30,2,87054,1,9,1,10,1,0,0,0,0,50,0,0 +37,2,82622,5,10,1,4,1,0,0,0,0,40,0,1 +28,2,181659,1,9,1,8,1,0,0,0,0,40,0,0 +25,2,321205,0,13,0,1,0,0,0,4101,0,35,0,0 +44,1,231348,5,10,1,4,1,0,0,0,0,40,0,1 +40,2,276096,1,9,1,8,1,0,0,0,0,40,0,0 +36,2,290560,5,10,1,1,1,0,0,0,0,45,0,0 +21,2,307315,5,10,0,0,4,0,0,0,0,40,0,0 +39,0,99156,8,16,1,3,1,0,0,0,0,50,0,1 +24,2,237928,0,13,0,3,0,0,0,0,0,39,0,0 +46,2,153501,1,9,0,6,0,3,0,0,0,40,0,0 +47,2,189680,0,13,1,5,1,0,0,0,1977,40,0,1 +35,2,374524,10,15,1,3,1,0,0,0,0,75,0,1 +60,1,127805,7,4,1,6,1,0,0,0,0,40,0,1 +35,2,150217,0,13,1,4,2,0,1,0,0,24,12,0 +33,2,295649,1,9,4,4,4,0,1,0,0,40,26,0 +21,2,197182,6,12,0,3,0,0,1,0,0,40,0,0 +37,2,241998,0,13,1,9,1,0,0,0,0,50,0,1 +48,3,156410,1,9,1,0,1,1,0,0,0,50,0,1 +58,2,473836,7,4,6,7,5,0,1,0,0,45,24,0 +21,2,198431,1,9,0,2,0,0,1,0,0,40,0,0 +22,2,113936,1,9,0,2,3,0,0,0,0,40,0,0 +22,2,318915,1,9,0,4,4,0,1,0,0,40,0,0 +28,1,175406,3,14,1,1,2,0,1,0,0,30,0,1 +23,3,320294,1,9,0,3,0,0,0,0,0,40,0,0 +58,0,400285,1,9,1,0,1,1,0,0,0,40,0,1 +38,4,227154,0,13,1,10,1,2,0,0,0,40,11,0 +49,2,298659,1,9,1,5,1,0,0,0,0,15,4,0 +47,2,212120,0,13,1,1,1,0,0,0,0,45,0,1 +50,2,320510,0,13,1,1,1,0,0,0,1902,40,0,1 +21,2,175800,1,9,0,3,4,0,1,0,0,55,0,0 +55,2,170169,1,9,4,0,0,0,1,0,0,40,0,0 +47,2,344157,2,7,2,2,0,0,0,0,0,40,0,0 +19,2,199441,1,9,0,3,0,0,1,0,0,40,0,0 +47,2,225456,1,9,0,9,5,0,0,0,0,50,0,0 +36,2,61178,2,7,1,10,1,0,0,0,0,40,0,0 +28,4,175262,6,12,1,11,1,0,0,0,2002,40,7,0 +42,2,152568,1,9,6,5,4,3,1,0,0,40,0,0 +41,2,182108,3,14,0,3,0,0,1,27828,0,35,0,1 +46,2,273771,0,13,1,5,1,0,0,99999,0,40,0,1 +32,2,208291,1,9,1,5,1,0,0,0,0,50,0,0 +34,2,224358,12,6,0,4,4,1,1,0,0,40,0,0 +33,2,55176,7,4,1,10,1,0,0,0,0,40,0,0 +60,0,152711,0,13,1,1,1,0,0,0,0,40,0,1 +53,2,68684,1,9,1,6,1,0,0,0,0,40,0,0 +24,2,185452,0,13,0,9,0,0,1,0,0,50,0,0 +39,3,175232,5,10,1,2,1,0,0,0,1977,60,0,1 +23,2,173851,5,10,0,10,0,0,0,0,0,40,0,0 +36,4,51424,1,9,2,0,4,0,1,0,0,40,0,0 +19,2,123416,14,8,4,3,3,0,1,1055,0,40,0,0 +26,2,262656,1,9,0,0,3,0,1,0,0,40,0,0 +38,2,233194,1,9,1,5,1,1,0,0,0,40,0,1 +41,2,290660,0,13,1,10,1,0,0,7688,0,55,0,1 +22,2,151105,5,10,0,5,5,0,1,0,0,18,0,0 +38,2,179117,6,12,0,8,0,1,1,10520,0,50,0,1 +39,2,317434,1,9,1,10,1,0,0,0,0,40,0,0 +35,0,126569,1,9,1,10,1,0,0,7298,0,40,0,1 +38,4,745768,5,10,2,1,4,1,1,0,0,45,0,0 +19,2,69927,1,9,1,4,2,1,1,0,0,16,0,0 +26,2,302603,1,9,0,6,3,0,0,0,0,45,0,0 +52,2,46788,0,13,2,10,4,0,0,0,0,25,0,0 +41,2,289886,11,3,1,4,1,4,0,0,1579,40,35,0 +45,2,179135,1,9,2,0,0,0,1,0,0,40,0,0 +58,3,175873,5,10,1,0,1,0,0,0,0,40,0,1 +34,2,57426,0,13,0,5,0,0,0,0,0,45,0,0 +36,2,312206,1,9,1,8,1,0,0,0,0,40,0,0 +19,6,344858,1,9,0,7,3,0,0,0,0,20,0,0 +26,0,177035,2,7,2,4,4,0,1,0,0,40,0,0 +60,2,88055,12,6,1,6,1,0,0,0,0,40,0,0 +35,1,111095,1,9,1,1,1,0,0,0,0,50,0,0 +39,2,192251,12,6,2,4,0,0,1,0,0,60,0,0 +27,2,29807,1,9,4,2,4,0,1,0,0,40,28,0 +26,3,211596,3,14,0,3,0,0,0,0,0,40,0,0 +17,2,268276,14,8,0,4,3,0,0,0,0,12,0,0 +59,1,181070,1,9,1,5,1,0,0,0,0,40,7,1 +53,4,20676,1,9,1,1,1,3,0,0,0,48,0,0 +35,2,115803,2,7,2,6,0,0,0,0,0,40,0,0 +34,4,124827,5,10,1,1,1,0,0,0,0,40,0,1 +36,2,95336,1,9,1,9,1,0,0,0,0,45,0,1 +36,2,257942,1,9,1,5,1,0,0,0,0,40,0,0 +21,2,72593,1,9,0,4,3,0,0,0,0,40,0,0 +29,2,147340,5,10,0,5,3,0,1,0,0,40,0,0 +35,2,185325,0,13,1,3,1,0,0,0,0,50,0,1 +59,1,357943,0,13,1,1,1,0,0,0,0,40,0,1 +22,2,215395,5,10,0,4,0,0,0,0,1602,10,0,0 +50,4,30682,3,14,1,3,1,0,0,0,0,50,0,0 +24,3,29591,0,13,0,3,0,4,1,0,0,40,0,0 +36,2,215392,0,13,2,9,0,0,1,0,0,40,0,0 +31,2,110554,1,9,1,8,2,0,1,4386,0,40,0,1 +42,1,133584,5,10,1,10,1,0,0,0,0,40,22,0 +38,2,210438,7,4,2,5,4,0,1,0,0,40,0,0 +52,2,256916,1,9,1,1,1,0,0,0,0,40,0,0 +46,2,73541,12,6,2,10,0,0,0,0,0,40,0,0 +23,2,109952,5,10,1,10,1,0,0,0,0,60,0,0 +54,2,197975,11,3,1,5,1,0,0,0,0,51,0,0 +27,2,401723,1,9,0,0,0,1,1,0,0,40,0,0 +42,2,179524,0,13,4,4,0,0,1,0,0,50,0,0 +33,0,296282,1,9,1,10,1,0,0,0,0,40,0,0 +19,2,145844,6,12,0,1,0,0,1,0,0,50,0,0 +59,2,191965,2,7,1,4,2,0,1,3908,0,28,0,0 +54,2,96792,1,9,6,4,4,0,1,0,0,32,0,0 +48,2,185041,7,4,1,6,1,0,0,0,1672,55,0,0 +45,2,347834,1,9,2,0,0,0,1,0,0,40,0,0 +36,2,215373,0,13,0,1,0,0,0,0,0,70,0,0 +35,1,169426,6,12,1,10,1,0,0,0,0,40,0,0 +47,2,202856,5,10,2,0,0,0,1,0,0,36,0,0 +33,2,50276,0,13,0,1,0,0,0,0,0,40,0,0 +48,1,187454,0,13,1,3,1,0,0,0,0,40,0,0 +42,2,126098,1,9,4,10,4,1,1,0,0,40,0,0 +19,2,250639,5,10,0,4,3,0,0,0,0,24,0,0 +64,5,195366,0,13,1,3,1,0,0,0,0,40,0,0 +51,1,186845,0,13,1,7,1,0,0,0,0,8,0,0 +20,3,119156,1,9,0,0,5,0,0,0,0,20,0,0 +28,2,162343,1,9,0,4,0,0,0,0,0,40,5,0 +52,2,108435,3,14,1,1,1,0,0,0,1902,50,34,1 +29,1,394927,5,10,0,10,0,0,0,0,0,45,0,0 +51,2,172281,0,13,4,5,0,0,0,0,0,40,0,0 +36,2,370767,1,9,1,3,1,0,0,0,2377,60,0,0 +43,2,352005,0,13,1,5,1,0,0,15024,0,45,0,1 +52,2,165681,5,10,1,1,1,0,0,0,0,40,0,0 +50,2,258819,1,9,2,10,0,0,0,0,0,40,0,1 +25,2,130793,5,10,2,4,0,0,0,0,0,30,0,0 +36,2,118909,6,12,0,0,4,1,1,0,0,40,2,0 +44,2,202466,5,10,1,1,2,0,1,0,0,60,0,0 +47,2,161558,12,6,3,6,0,1,0,0,0,45,0,0 +32,2,188246,1,9,2,10,3,0,0,0,0,40,0,0 +37,2,160120,3,14,0,3,4,2,0,0,0,40,27,0 +40,2,144594,1,9,1,0,1,0,0,2829,0,40,0,0 +34,1,123429,1,9,1,5,1,0,0,0,0,60,0,0 +35,5,340110,5,10,1,5,1,0,0,0,0,50,0,1 +26,2,523067,5,10,0,3,3,0,0,0,0,3,22,0 +49,1,113513,0,13,1,7,1,0,0,0,0,50,0,0 +46,1,320421,0,13,3,3,0,0,0,0,0,25,0,0 +31,4,295589,5,10,0,0,3,1,0,0,0,40,0,0 +22,2,370548,9,11,0,10,0,0,0,0,0,30,0,0 +20,2,120572,5,10,0,4,0,0,1,0,0,12,0,0 +52,2,110977,8,16,0,1,0,0,0,0,0,40,0,1 +26,2,55860,5,10,0,0,0,1,1,0,0,40,0,0 +34,2,158800,0,13,1,1,1,0,0,0,0,50,0,1 +31,2,131568,4,5,0,8,0,0,0,0,0,40,0,0 +46,2,173613,1,9,2,5,4,0,1,0,0,30,0,0 +22,2,216867,7,4,1,8,1,0,0,0,0,40,4,0 +38,2,104089,9,11,0,10,3,0,0,0,0,40,0,0 +35,2,208106,1,9,1,5,1,0,0,0,0,40,16,0 +27,0,340269,5,10,0,11,0,0,0,0,0,40,0,0 +27,2,236246,6,12,1,1,1,0,0,0,0,40,0,0 +46,2,213408,5,10,2,5,4,0,1,0,0,40,1,0 +19,2,302945,5,10,0,0,3,0,0,0,0,10,15,0 +20,2,262749,5,10,0,4,3,0,0,0,0,35,0,0 +34,3,198265,0,13,1,11,1,0,0,0,0,60,0,0 +49,2,170871,3,14,1,1,1,0,0,0,0,45,0,1 +27,2,177761,5,10,1,7,1,4,0,0,0,50,0,0 +59,2,175689,5,10,1,0,2,0,1,0,0,14,1,1 +45,2,205100,0,13,1,1,1,0,0,15024,0,60,0,1 +21,2,77759,5,10,0,5,3,0,1,0,0,15,0,0 +51,0,77905,9,11,2,3,4,0,1,0,0,40,0,0 +41,0,116520,8,16,1,3,1,0,0,0,0,40,0,1 +49,2,180532,3,14,3,3,0,0,0,0,0,40,0,0 +51,2,508891,1,9,2,8,3,1,0,0,0,40,0,0 +20,2,211345,5,10,0,2,3,0,1,0,0,20,0,0 +69,1,170877,1,9,1,5,1,0,0,0,0,48,0,0 +43,2,184105,1,9,1,2,1,0,0,0,0,50,0,0 +50,2,150941,1,9,2,8,4,1,1,0,0,44,0,0 +32,2,303942,1,9,1,8,1,0,0,0,0,40,0,0 +27,4,273929,1,9,0,7,3,0,0,0,0,40,0,0 +38,2,197077,1,9,1,4,1,0,0,0,0,40,0,0 +62,2,162825,1,9,1,8,1,0,0,0,0,40,0,1 +46,2,159869,1,9,2,1,0,0,0,0,0,44,0,0 +21,2,227986,1,9,0,8,4,0,1,0,0,40,0,0 +36,2,137527,0,13,0,0,0,0,1,0,0,50,0,0 +36,2,180150,14,8,2,2,0,0,0,0,0,40,0,0 +23,2,239539,1,9,0,8,3,2,0,0,0,40,11,0 +58,2,281792,0,13,1,3,1,0,0,0,0,40,0,1 +40,2,224799,0,13,1,3,1,0,0,0,0,45,0,0 +64,2,292639,5,10,1,1,2,0,1,10566,0,35,0,0 +66,2,22313,2,7,1,10,1,0,0,0,0,20,0,0 +42,2,194636,1,9,1,5,1,0,0,0,0,40,0,0 +55,2,156089,5,10,6,0,4,0,1,0,0,40,0,0 +53,2,193720,5,10,1,1,1,0,0,0,1977,40,0,1 +25,2,218667,1,9,1,2,1,0,0,0,0,40,0,0 +39,2,358837,5,10,0,9,4,1,1,0,0,40,0,0 +20,2,174685,1,9,0,4,3,0,0,0,0,40,0,0 +32,2,168854,1,9,1,4,1,0,0,0,0,54,0,0 +28,2,133696,0,13,0,5,4,0,0,0,0,65,0,0 +23,3,350680,6,12,0,1,3,0,1,0,0,40,12,0 +18,2,115215,1,9,0,4,3,0,0,0,0,25,0,0 +43,1,152958,1,9,1,1,1,0,0,0,0,35,0,1 +29,2,217200,1,9,1,10,1,0,0,0,0,40,0,0 +32,2,235124,5,10,1,11,1,0,0,0,0,46,21,0 +31,4,144949,1,9,2,10,4,0,0,0,0,40,0,0 +60,2,135470,11,3,1,10,1,0,0,0,0,40,4,0 +42,2,281209,5,10,1,6,1,0,0,0,0,50,0,0 +46,2,155489,3,14,1,1,1,0,0,0,0,50,0,1 +38,2,290306,1,9,1,10,1,0,0,0,0,40,0,1 +18,2,182042,2,7,0,4,3,0,1,0,0,19,0,0 +31,2,210008,1,9,0,5,3,0,1,0,0,40,0,0 +54,2,234938,1,9,1,5,1,0,0,4064,0,55,0,0 +46,2,315423,5,10,1,5,1,0,0,0,2042,50,0,0 +27,1,30244,1,9,0,7,3,0,0,0,0,80,0,0 +50,4,30008,0,13,1,3,1,0,0,0,0,45,0,1 +38,1,201328,7,4,1,7,1,0,0,0,0,56,0,0 +36,0,96468,3,14,0,3,3,0,1,0,0,40,0,0 +25,2,486332,1,9,2,4,0,0,0,0,0,40,4,0 +19,2,46162,1,9,0,7,3,0,0,0,0,25,0,0 +60,4,98350,5,10,1,4,1,2,0,0,0,60,11,0 +45,4,175958,4,5,0,4,3,0,0,0,0,40,0,0 +21,2,119309,5,10,0,9,3,0,0,0,1602,16,0,0 +42,2,175935,1,9,2,6,0,0,0,0,1980,46,0,0 +38,2,204527,1,9,1,10,1,0,0,0,0,50,0,0 +19,2,418176,1,9,0,1,0,1,0,0,0,32,0,0 +23,2,262744,5,10,0,0,3,0,0,0,0,40,0,0 +24,2,177287,5,10,0,2,3,0,1,0,0,30,0,0 +30,2,255004,6,12,2,5,0,0,0,0,0,52,0,0 +62,2,183735,5,10,1,1,1,0,0,0,0,40,0,0 +26,1,318644,10,15,0,3,3,0,0,0,0,20,0,0 +42,3,132125,0,13,1,1,1,0,0,0,0,52,0,1 +33,2,206051,1,9,1,10,1,0,0,0,0,40,0,0 +35,2,225750,0,13,2,3,4,0,1,0,0,32,0,0 +33,2,245777,1,9,2,5,0,0,0,0,0,40,0,0 +45,2,169092,1,9,2,5,0,0,1,0,0,55,0,0 +62,2,211035,0,13,1,0,2,0,1,0,0,30,0,1 +24,2,285432,1,9,0,1,3,0,0,0,0,40,0,0 +50,4,154779,5,10,2,0,0,1,1,0,0,40,0,0 +54,2,37237,0,13,1,3,1,0,0,0,0,40,0,1 +58,2,417419,7,4,2,8,3,0,0,0,0,40,0,0 +39,5,33975,1,9,1,10,1,0,0,0,0,50,0,0 +32,2,42485,1,9,2,10,4,0,0,0,0,40,0,0 +27,2,170017,0,13,1,3,1,0,0,0,0,40,0,0 +27,2,152683,1,9,1,6,1,0,0,3908,0,35,0,0 +20,2,41721,5,10,0,4,3,0,0,0,0,60,0,0 +64,2,66634,7,4,1,10,1,0,0,0,0,40,0,0 +55,5,257216,3,14,6,5,0,0,1,0,0,40,0,0 +46,2,167882,1,9,2,9,0,0,1,0,0,43,0,0 +45,2,179428,5,10,1,6,1,0,0,0,0,55,0,0 +26,2,57512,1,9,0,6,0,0,0,0,0,40,0,0 +36,2,301614,1,9,1,10,1,0,0,0,0,40,0,0 +25,2,193820,0,13,0,5,0,0,1,0,1876,40,0,0 +58,2,222247,12,6,1,6,1,0,0,0,1887,40,0,1 +39,5,189092,0,13,1,1,1,0,0,0,0,45,0,0 +47,2,217509,1,9,6,13,0,2,1,0,0,45,15,0 +35,2,308691,3,14,1,8,1,0,0,0,0,48,0,0 +38,2,169672,1,9,1,1,1,0,0,0,0,40,0,0 +50,2,120914,2,7,1,10,1,0,0,0,0,40,0,0 +36,2,370156,1,9,2,0,4,0,1,0,0,38,0,0 +28,2,398220,11,3,0,10,5,0,0,0,0,40,4,0 +44,1,208277,1,9,1,8,2,0,1,0,0,45,0,0 +40,2,337456,1,9,2,11,4,0,1,0,0,40,0,0 +55,2,172666,5,10,1,10,1,0,0,0,0,40,0,1 +29,1,32280,1,9,0,7,0,0,0,0,0,45,0,0 +33,2,194901,1,9,1,10,1,0,0,0,0,45,0,0 +32,2,173730,0,13,1,1,1,0,0,7688,0,40,0,1 +45,4,153312,3,14,1,3,1,1,0,0,0,10,0,1 +23,2,274797,1,9,0,2,3,0,0,0,0,25,0,0 +31,2,359249,9,11,0,11,3,1,0,0,0,40,0,0 +22,2,152744,5,10,0,4,0,2,1,0,0,40,11,0 +59,2,188041,1,9,2,2,0,1,0,0,0,40,0,0 +32,2,97723,5,10,0,10,0,0,0,0,0,38,0,0 +49,0,354529,5,10,0,0,0,0,1,0,0,40,0,0 +22,2,249727,5,10,0,0,3,0,0,0,0,30,0,0 +26,2,189590,5,10,0,0,0,0,0,0,0,30,0,0 +23,0,298871,5,10,1,0,1,2,0,0,0,40,36,0 +55,1,205296,5,10,1,5,2,0,1,0,0,50,0,0 +47,2,303637,1,9,1,1,1,0,0,0,0,49,0,1 +44,2,242861,1,9,1,6,1,0,0,0,0,40,0,0 +27,2,37599,5,10,0,4,0,0,0,0,0,24,0,0 +40,0,199381,3,14,1,3,2,0,1,15024,0,37,0,1 +32,1,56328,0,13,1,3,2,0,1,0,0,8,0,1 +20,2,256211,5,10,0,8,5,2,0,0,0,40,36,0 +84,4,163685,1,9,6,1,0,0,1,0,0,33,0,0 +40,2,266084,5,10,2,10,5,0,0,0,0,50,0,0 +37,2,161111,0,13,0,5,0,0,1,0,0,40,0,0 +44,2,199031,5,10,2,6,3,0,0,0,1380,40,0,0 +47,2,166634,5,10,2,1,4,0,1,0,0,40,9,0 +62,1,204085,5,10,1,5,1,0,0,0,0,25,0,0 +47,2,464945,1,9,0,6,0,0,0,0,0,45,0,0 +44,4,174684,1,9,2,10,4,1,0,0,0,40,0,0 +26,4,166295,0,13,1,0,1,0,0,0,0,41,0,0 +36,2,220511,5,10,1,10,1,0,0,0,0,40,0,0 +52,2,246936,2,7,1,4,1,0,0,0,0,40,0,0 +33,2,104509,5,10,2,0,4,0,1,0,0,40,0,0 +33,2,252168,1,9,1,6,1,1,0,0,0,40,0,0 +25,2,92093,0,13,1,1,1,0,0,0,0,20,0,0 +62,2,88055,0,13,1,8,1,0,0,0,0,40,0,0 +38,2,129591,5,10,1,10,1,0,0,0,0,40,0,0 +46,2,142719,1,9,3,7,0,0,0,0,0,65,0,0 +46,2,128796,0,13,1,1,1,0,0,0,0,44,0,1 +38,2,115336,1,9,2,4,4,0,1,0,0,70,0,0 +52,2,190333,5,10,1,0,1,0,0,0,0,40,0,1 +63,1,179444,7,4,1,1,1,0,0,0,0,15,0,0 +49,2,218676,5,10,1,8,1,0,0,0,0,43,0,0 +17,4,148194,2,7,0,0,3,0,1,0,0,12,0,0 +33,2,184833,1,9,0,4,0,0,1,0,0,35,0,0 +70,1,280639,1,9,6,4,5,0,1,2329,0,20,0,0 +19,2,217769,5,10,0,4,3,0,1,0,0,15,0,0 +61,2,56009,5,10,1,5,1,0,0,0,0,40,0,0 +33,2,255334,0,13,1,3,1,0,0,0,0,25,0,1 +29,2,349154,12,6,4,7,4,0,1,0,0,40,24,0 +40,4,24763,5,10,2,6,4,0,0,6849,0,40,0,0 +43,0,41834,1,9,1,6,1,0,0,0,0,38,0,1 +24,2,113466,1,9,0,5,0,0,0,0,0,40,0,0 +29,2,130856,5,10,1,10,1,0,0,0,0,60,0,0 +61,1,268797,1,9,1,4,2,1,1,0,0,17,0,0 +48,2,202117,2,7,2,4,0,0,1,0,0,34,0,0 +19,2,280146,5,10,0,2,3,0,0,0,0,20,0,0 +30,2,70377,5,10,0,8,0,0,1,0,0,40,0,0 +24,2,236696,5,10,0,4,0,0,0,0,0,30,0,0 +39,4,222572,3,14,0,3,4,0,1,0,0,43,0,0 +46,5,110702,5,10,2,1,4,0,1,2036,0,60,0,0 +40,2,96129,1,9,1,5,1,0,0,0,0,72,0,1 +27,4,200492,0,13,0,3,3,0,1,0,0,40,0,0 +25,2,193820,3,14,0,3,3,0,1,0,0,40,0,0 +31,2,454508,2,7,0,10,0,0,0,0,2001,40,0,0 +58,2,220789,0,13,2,6,0,0,0,0,0,45,0,0 +33,2,101345,1,9,1,1,2,0,1,0,0,42,8,1 +40,2,140559,1,9,6,4,4,0,1,0,0,25,0,0 +40,5,64885,3,14,1,5,1,0,0,0,0,70,0,1 +31,2,402361,1,9,1,10,1,0,0,0,0,40,0,0 +33,2,143582,1,9,4,4,4,2,1,0,0,48,26,0 +49,2,185385,6,12,1,5,1,0,0,0,0,45,0,0 +24,2,112706,9,11,0,9,3,0,0,0,0,40,0,0 +46,2,130364,1,9,0,10,4,0,0,0,0,40,0,0 +58,4,147428,3,14,1,3,1,0,0,0,0,40,0,1 +20,2,205895,5,10,0,5,3,0,1,0,0,20,0,0 +43,2,153160,5,10,1,0,2,0,1,0,0,40,0,0 +48,1,167918,3,14,1,5,1,2,0,0,0,50,3,0 +41,2,195661,5,10,1,6,1,0,0,0,0,54,0,0 +27,0,146243,5,10,4,4,0,0,1,0,0,30,0,0 +52,4,246197,1,9,1,10,1,0,0,0,0,40,0,0 +52,4,192563,5,10,2,1,0,0,1,0,0,38,0,0 +19,2,244115,1,9,0,4,3,1,0,0,0,30,0,0 +39,4,98587,5,10,2,3,3,0,1,0,0,45,0,0 +47,2,145886,5,10,2,4,4,0,1,0,0,40,0,0 +27,2,244315,1,9,2,10,5,4,0,0,0,40,0,0 +48,2,192779,5,10,2,10,0,0,0,0,0,40,0,0 +50,2,209464,1,9,4,4,4,0,1,0,0,35,0,0 +60,2,25141,5,10,1,6,1,0,0,0,0,60,0,0 +28,2,405793,6,12,1,9,1,0,0,0,0,45,0,1 +47,3,53498,1,9,2,4,4,1,1,0,0,40,0,0 +40,1,162312,1,9,1,10,1,2,0,0,0,66,27,0 +37,2,277022,1,9,0,2,4,0,1,3887,0,40,35,0 +41,0,109762,3,14,0,3,0,0,0,0,0,40,0,0 +38,2,123031,1,9,1,0,1,2,0,0,0,48,33,0 +46,3,119890,9,11,4,9,0,4,1,0,0,30,0,0 +21,1,409230,5,10,0,0,3,0,0,0,0,30,0,0 +44,2,223308,3,14,4,5,4,0,1,0,0,48,0,0 +47,1,119199,5,10,1,0,2,0,1,0,0,35,0,1 +42,4,351161,5,10,2,10,0,0,0,0,0,40,0,0 +56,2,174533,0,13,0,1,0,0,1,0,0,45,0,1 +32,2,324386,0,13,0,3,3,0,0,0,0,40,0,0 +24,2,126568,0,13,1,4,1,0,0,0,0,33,0,0 +26,2,275703,5,10,1,5,1,0,0,0,0,40,0,0 +36,1,219611,0,13,0,5,0,1,1,2174,0,50,0,0 +49,2,200471,2,7,0,4,0,0,0,0,0,60,0,0 +65,2,155261,1,9,1,1,1,0,0,0,0,40,0,1 +73,0,74040,7,4,2,4,0,2,1,0,0,40,0,0 +34,2,226296,2,7,1,2,1,0,0,0,0,40,0,0 +22,2,211968,0,13,0,0,3,0,1,0,0,40,0,0 +49,4,126446,5,10,0,4,4,0,1,0,0,30,0,0 +25,2,262885,2,7,0,4,4,1,1,0,0,32,0,0 +39,2,188069,4,5,1,6,1,0,0,0,0,25,0,0 +19,2,113546,2,7,0,10,0,0,0,0,0,56,0,0 +24,2,227070,12,6,1,8,2,0,1,0,0,40,0,0 +34,2,136997,1,9,2,0,4,0,1,0,0,35,0,0 +21,2,212407,1,9,0,8,5,0,0,0,0,40,0,0 +43,2,197810,3,14,2,4,4,0,1,0,0,40,0,0 +39,2,141802,5,10,2,0,4,1,1,0,0,40,0,0 +33,1,124187,6,12,0,4,0,1,0,0,0,32,0,0 +19,2,201743,5,10,0,4,3,0,1,0,0,26,0,0 +17,2,156736,12,6,0,5,4,0,1,0,0,12,0,0 +43,1,47261,5,10,1,7,1,0,0,0,0,50,0,0 +62,2,150693,1,9,6,0,0,0,1,0,0,42,0,0 +53,4,233734,3,14,2,3,0,1,1,0,0,40,0,1 +45,0,35969,3,14,1,3,1,0,0,0,0,60,0,1 +47,2,159550,1,9,2,0,0,1,1,0,0,40,0,0 +30,2,190823,5,10,0,4,3,1,1,0,0,40,0,0 +53,2,213378,1,9,4,5,0,0,1,0,0,33,0,0 +24,2,257500,1,9,4,8,3,1,1,0,0,40,0,0 +41,4,488706,5,10,1,2,1,0,0,0,0,40,0,0 +58,4,239405,11,3,2,4,5,1,1,0,0,40,19,0 +27,3,105189,1,9,2,0,0,0,0,4865,0,50,0,0 +63,0,109735,1,9,2,0,0,0,1,0,0,38,0,0 +50,2,172942,5,10,2,4,3,0,0,0,0,28,0,0 +43,4,209899,3,14,0,9,0,1,1,8614,0,47,0,1 +29,5,87745,5,10,0,1,0,0,0,0,0,60,0,0 +41,2,187881,5,10,1,5,1,0,0,3942,0,40,0,0 +55,2,234125,1,9,1,4,1,0,0,0,0,40,0,0 +36,2,272944,1,9,0,6,0,0,0,0,0,45,0,0 +23,4,129232,1,9,0,0,3,0,0,0,0,40,0,0 +22,2,100345,0,13,0,10,0,0,0,13550,0,55,0,1 +58,1,195835,5,10,2,10,0,0,0,0,0,45,0,0 +25,2,251854,2,7,0,0,3,1,1,0,0,40,0,0 +40,2,103474,1,9,1,5,2,0,1,0,0,30,0,0 +38,2,22042,9,11,0,3,0,0,1,0,0,39,0,0 +37,2,343721,0,13,1,3,1,0,0,0,0,40,0,1 +19,2,232368,5,10,0,4,3,0,1,0,0,35,0,0 +55,2,174478,12,6,0,4,0,0,0,0,0,29,0,0 +55,2,282023,0,13,1,5,1,0,0,15024,0,50,0,1 +28,2,274690,0,13,0,0,0,0,0,0,0,45,0,0 +53,2,251675,1,9,1,10,1,0,0,0,0,40,22,0 +60,2,128367,5,10,2,3,4,0,0,3325,0,42,0,0 +32,2,37380,5,10,2,0,4,0,1,0,0,38,0,0 +34,2,173730,1,9,1,5,1,0,0,0,0,50,0,0 +49,2,353824,5,10,2,3,0,0,0,0,0,45,0,1 +21,2,225890,5,10,0,4,5,0,1,0,0,30,0,0 +24,0,147147,0,13,0,0,0,1,1,0,0,20,0,0 +53,2,233780,9,11,2,0,0,1,1,2202,0,40,0,0 +34,4,188682,0,13,3,3,0,0,1,0,0,40,0,0 +41,2,277192,11,3,1,7,2,0,1,0,0,40,4,0 +21,2,314182,1,9,0,4,0,0,1,0,0,40,0,0 +43,2,220776,3,14,1,1,1,0,0,0,0,35,0,1 +31,4,189269,1,9,0,11,3,0,0,0,0,40,0,0 +38,2,35429,1,9,1,2,1,0,0,0,2042,40,0,0 +42,2,154374,0,13,1,1,1,0,0,0,2415,60,0,1 +62,2,161460,0,13,0,7,0,0,0,0,0,30,0,0 +51,2,251487,7,4,6,8,0,3,1,0,0,40,0,0 +30,2,177531,1,9,0,5,4,1,1,0,0,25,0,0 +24,2,53942,0,13,1,8,1,0,0,0,0,40,0,0 +36,2,113481,1,9,2,10,0,0,0,0,0,40,0,0 +57,2,361324,12,6,1,10,1,0,0,0,0,40,0,0 +46,2,330087,0,13,1,1,1,0,0,0,0,55,0,1 +33,2,276221,8,16,1,3,1,0,0,0,0,40,0,0 +42,2,121055,5,10,0,5,0,0,0,0,0,45,0,0 +62,2,118696,1,9,1,10,1,0,0,0,0,40,0,0 +64,1,289741,5,10,1,5,1,0,0,0,0,20,0,0 +18,2,238401,5,10,0,5,3,0,1,0,0,25,0,0 +43,2,262038,11,3,3,7,4,0,0,0,0,35,4,0 +62,1,26911,7,4,6,4,0,0,1,0,0,66,0,0 +29,2,161155,6,12,1,3,1,0,0,0,0,50,0,0 +43,2,252519,0,13,1,2,1,1,0,0,0,40,19,1 +39,2,43712,1,9,1,1,1,0,0,7298,0,40,0,1 +34,2,188900,0,13,1,1,2,0,1,0,0,40,0,0 +44,2,120057,6,12,1,1,1,0,0,4386,0,45,0,1 +25,2,134113,0,13,0,0,0,0,0,0,0,30,0,0 +47,4,165822,5,10,2,6,4,0,0,0,0,40,0,0 +17,2,99161,12,6,0,4,3,0,0,0,0,8,0,0 +41,4,74581,0,13,2,3,4,0,0,0,0,65,0,0 +19,2,304643,5,10,0,5,3,0,0,0,0,20,0,0 +57,2,121821,15,2,1,4,1,4,0,0,0,40,21,0 +25,2,154863,1,9,0,0,4,1,0,0,0,35,0,0 +37,4,365430,5,10,1,0,1,0,0,0,0,40,8,1 +29,2,183111,9,11,1,8,1,0,0,0,0,40,0,0 +32,2,50178,5,10,0,5,3,0,0,0,0,35,0,0 +35,2,186845,10,15,1,3,1,0,0,0,0,45,0,1 +52,2,159908,14,8,0,8,0,0,0,0,0,40,0,0 +41,2,162189,1,9,0,8,3,0,1,1831,0,40,30,0 +29,2,128509,1,9,3,8,0,0,1,0,0,38,22,0 +23,2,143032,3,14,0,3,3,0,1,0,0,36,0,0 +31,2,382368,2,7,1,10,1,0,0,0,0,40,0,0 +40,2,210013,1,9,1,6,1,0,0,0,0,50,0,0 +19,2,293928,1,9,0,0,3,0,1,0,0,20,0,0 +21,2,208503,5,10,0,6,3,0,0,0,0,10,0,0 +37,0,191841,0,13,0,0,0,0,1,8614,0,40,0,1 +49,1,355978,10,15,1,3,1,0,0,99999,0,35,0,1 +64,4,202738,1,9,1,0,2,0,1,0,0,35,0,0 +37,4,144322,9,11,0,0,0,0,1,0,0,43,0,0 +70,1,155141,0,13,1,10,1,0,0,0,2377,12,0,1 +22,2,160120,12,6,0,6,3,2,0,0,0,30,0,0 +29,5,190450,1,9,1,5,1,2,0,0,0,40,9,0 +37,2,212900,1,9,1,10,1,0,0,0,0,40,0,0 +29,2,115677,0,13,0,9,0,0,0,0,0,40,0,0 +38,2,252250,2,7,2,8,0,0,0,0,0,65,0,0 +27,2,212041,1,9,0,10,0,0,0,0,0,50,0,0 +58,0,198145,0,13,1,0,1,0,0,0,0,35,0,1 +60,4,113658,5,10,1,0,2,0,1,0,0,35,0,0 +20,2,32426,5,10,0,5,0,0,0,0,0,25,0,0 +51,2,98791,5,10,1,5,1,0,0,0,0,40,0,1 +37,2,203828,4,5,1,6,1,0,0,0,0,65,0,0 +22,0,186634,14,8,0,1,0,0,0,0,0,50,0,1 +56,1,125147,12,6,1,6,1,0,0,0,0,60,0,0 +26,2,247455,0,13,1,5,2,0,1,5178,0,42,0,1 +19,2,97215,5,10,4,5,4,0,1,0,0,25,0,0 +37,2,330826,9,11,1,3,2,0,1,0,0,30,0,0 +27,2,200802,5,10,0,9,0,0,1,0,0,40,0,0 +27,2,156266,1,9,0,5,3,3,0,0,0,20,0,0 +52,1,72257,5,10,1,5,1,0,0,0,0,50,0,0 +45,2,363087,1,9,4,8,4,1,1,0,0,40,0,0 +28,2,25955,5,10,0,10,3,3,0,0,0,40,0,0 +20,2,334633,1,9,2,0,0,0,1,0,0,40,0,0 +28,2,109162,3,14,0,3,0,0,1,0,0,50,0,0 +44,2,569761,9,11,1,2,1,1,0,0,0,40,0,0 +30,2,209900,0,13,1,10,1,0,0,0,0,40,0,0 +26,0,272986,6,12,0,0,3,1,1,0,0,8,0,0 +46,2,82946,1,9,0,5,0,0,1,0,0,40,0,0 +51,2,104651,0,13,1,10,1,0,0,0,0,50,0,0 +25,4,58441,0,13,0,3,0,0,1,0,0,40,0,0 +43,4,269733,1,9,4,4,0,0,0,0,0,40,0,0 +36,2,179468,1,9,2,10,0,0,0,0,0,40,0,0 +36,2,183081,5,10,0,1,0,0,0,0,0,40,0,0 +48,2,102938,0,13,0,4,4,2,1,0,0,40,36,0 +24,2,359828,0,13,1,3,1,0,0,0,0,44,0,1 +30,2,155659,1,9,2,4,4,0,1,0,0,36,0,0 +24,2,585203,0,13,1,1,2,0,1,7688,0,45,0,1 +62,2,173601,0,13,1,8,1,0,0,0,0,40,0,0 +41,1,214541,1,9,2,6,0,0,0,0,1590,40,0,0 +49,1,163352,10,15,1,3,1,0,0,0,0,85,0,1 +36,1,153976,1,9,1,6,1,0,0,0,0,50,0,0 +47,4,247676,3,14,2,3,4,0,1,5455,0,45,0,0 +49,0,155372,3,14,2,3,0,0,1,0,0,40,0,0 +52,2,329733,5,10,0,1,0,0,0,0,0,40,0,0 +52,2,162576,6,12,1,9,1,0,0,0,0,40,0,1 +26,2,176520,1,9,0,0,0,0,0,0,0,53,0,0 +51,0,226885,1,9,0,6,0,0,0,0,0,40,0,0 +18,2,120781,12,6,0,4,3,0,0,0,0,20,0,0 +30,2,375827,1,9,0,2,5,0,0,0,0,40,0,0 +46,2,205504,1,9,2,8,0,0,0,0,0,20,0,0 +28,2,198813,1,9,0,2,3,1,1,0,0,40,0,0 +48,5,254291,0,13,1,1,1,0,0,7298,0,50,0,1 +62,2,159908,5,10,1,0,2,0,1,0,0,38,0,1 +49,2,40000,0,13,1,5,1,0,0,4064,0,44,0,0 +69,2,102874,1,9,6,0,0,0,1,0,0,24,0,0 +35,2,117381,0,13,0,1,0,0,0,8614,0,45,0,1 +78,2,180239,3,14,6,10,4,2,0,0,0,40,27,0 +61,2,539563,5,10,1,1,1,0,0,0,0,45,0,1 +24,2,261561,0,13,0,3,0,0,1,0,0,40,0,0 +29,2,81057,5,10,0,0,3,0,1,0,0,40,0,0 +17,2,41979,12,6,0,7,3,0,0,0,0,40,0,0 +27,2,275110,1,9,1,2,1,1,0,0,0,80,0,1 +64,2,265661,1,9,1,6,1,0,0,0,0,40,0,0 +33,1,193246,1,9,0,1,0,0,0,0,0,55,23,0 +32,2,236543,14,8,1,10,5,0,0,0,0,40,4,0 +19,2,29510,5,10,0,4,3,0,1,0,0,20,0,0 +42,0,105804,2,7,1,7,1,0,0,0,0,40,0,0 +24,2,194604,0,13,0,5,3,0,1,0,0,15,0,0 +23,2,1038553,1,9,0,1,0,1,0,0,0,45,0,0 +51,4,209320,10,15,0,3,0,0,0,3325,0,40,0,0 +31,2,193231,0,13,0,9,0,0,0,3325,0,60,0,0 +44,2,307468,10,15,1,3,1,0,0,0,0,29,0,1 +38,2,255941,3,14,0,1,0,0,1,10520,0,50,0,1 +44,4,107845,6,12,2,11,0,0,1,0,0,56,0,1 +44,1,567788,11,3,1,7,1,0,0,0,0,40,4,0 +38,2,91857,1,9,1,10,1,0,0,0,0,44,0,0 +36,2,732569,4,5,2,0,4,0,1,0,0,40,0,0 +29,2,86613,15,2,0,4,0,0,0,0,0,20,22,0 +46,2,35961,6,12,2,5,0,0,1,0,0,25,9,0 +47,2,114754,1,9,1,0,1,0,0,0,0,40,0,0 +30,2,235124,1,9,1,6,1,0,0,99999,0,40,0,1 +37,4,218490,1,9,1,11,1,0,0,7688,0,35,0,1 +27,2,329426,0,13,0,1,0,0,0,0,0,45,0,0 +43,2,181015,1,9,2,8,4,0,1,0,0,50,0,0 +44,1,264740,10,15,1,3,1,0,0,0,0,40,0,1 +31,2,381153,5,10,0,1,4,0,0,0,0,60,0,0 +34,2,189759,0,13,1,1,1,0,0,0,1977,45,0,1 +39,2,230467,0,13,0,5,3,0,0,0,1092,40,9,0 +36,2,218542,5,10,2,10,4,0,1,0,0,40,0,0 +57,2,298507,0,13,1,3,1,0,0,3103,0,40,0,1 +78,2,111189,7,4,0,8,0,0,1,0,0,35,21,0 +24,2,168997,5,10,1,10,1,0,0,0,0,40,0,0 +39,2,168894,5,10,0,0,0,0,1,0,0,40,0,0 +21,2,149809,6,12,0,5,3,0,0,0,0,40,0,0 +34,2,344073,1,9,4,0,0,0,0,0,0,40,0,1 +22,2,416165,5,10,0,5,4,0,1,0,0,32,0,0 +36,2,41490,5,10,2,0,4,0,1,0,0,40,0,0 +61,2,40269,5,10,1,5,1,0,0,0,0,40,0,1 +42,2,250536,5,10,4,4,4,1,1,0,0,21,19,0 +49,3,105586,9,11,1,10,1,2,0,0,0,40,0,1 +58,2,51499,9,11,1,10,1,0,0,0,0,40,0,0 +37,4,189878,5,10,1,11,1,0,0,0,0,60,0,0 +39,2,179481,1,9,0,9,0,0,0,4650,0,44,0,0 +25,2,299765,5,10,4,0,5,1,1,0,0,40,2,0 +30,2,54608,0,13,1,0,1,0,0,0,0,40,0,0 +36,1,285020,1,9,1,10,1,0,0,2885,0,40,0,0 +23,2,201145,1,9,0,10,0,0,0,0,0,65,0,0 +51,2,125796,5,10,1,0,2,1,1,0,0,35,2,0 +55,2,249072,1,9,1,6,1,0,0,0,0,60,0,0 +35,2,99156,0,13,0,5,0,0,0,0,0,50,0,0 +45,0,94754,3,14,1,0,1,0,0,0,0,40,3,0 +36,2,111128,0,13,1,3,1,0,0,0,0,48,0,1 +32,4,157887,1,9,1,10,1,0,0,0,0,40,0,0 +39,2,74194,1,9,1,1,1,0,0,0,0,55,0,0 +47,5,168191,5,10,1,10,1,0,0,0,0,40,0,0 +49,2,28334,5,10,1,1,1,0,0,0,0,45,0,1 +44,2,721161,5,10,4,8,0,1,0,0,0,40,0,0 +36,2,188069,5,10,1,1,1,0,0,0,0,50,0,1 +40,2,145178,5,10,2,10,4,1,1,0,0,30,0,0 +17,2,52967,12,6,0,4,3,0,1,0,0,6,0,0 +18,2,177578,1,9,0,5,3,0,1,0,0,38,0,0 +30,5,185384,5,10,1,1,2,0,1,0,0,25,0,0 +66,2,66008,1,9,6,13,0,0,1,0,0,50,7,0 +59,2,329059,0,13,0,10,0,0,0,0,0,50,0,0 +30,4,348802,1,9,1,0,1,1,0,0,0,40,0,0 +50,2,34233,1,9,1,7,1,0,0,0,0,50,0,0 +24,2,509629,1,9,0,4,3,0,1,0,0,25,0,0 +28,2,27956,10,15,1,3,1,2,0,0,0,99,11,0 +44,4,83286,3,14,1,3,2,0,1,0,0,40,0,1 +25,2,309098,9,11,0,3,0,0,0,0,0,40,0,0 +45,2,188950,3,14,1,1,1,0,0,0,0,50,0,1 +20,2,224217,1,9,0,6,0,0,0,0,0,40,0,0 +67,2,222899,9,11,2,3,4,0,1,0,0,40,0,0 +40,1,123306,10,15,1,3,1,0,0,0,0,45,0,1 +52,3,279337,1,9,1,0,1,0,0,0,0,40,0,0 +34,2,347166,8,16,0,3,0,0,0,0,0,50,0,1 +37,4,251396,6,12,1,3,1,0,0,0,0,45,8,1 +17,5,143034,12,6,0,4,3,0,0,0,0,4,0,0 +25,2,57635,9,11,1,5,2,0,1,0,0,42,0,1 +35,4,162651,0,13,2,3,0,0,0,0,0,40,5,0 +63,2,28334,3,14,2,1,0,0,1,0,0,40,0,1 +38,4,84570,5,10,0,0,3,3,1,0,0,40,0,0 +33,2,181091,0,13,1,0,1,0,0,0,0,60,10,1 +51,4,117496,3,14,1,3,2,0,1,0,0,40,0,1 +64,0,216160,8,16,1,3,1,0,0,0,0,50,13,1 +50,5,204447,5,10,2,11,0,0,0,0,0,40,0,0 +18,2,374969,12,6,0,6,0,0,0,0,0,56,0,0 +67,2,35015,3,14,0,3,0,0,0,0,0,99,0,0 +46,2,179869,1,9,1,10,1,0,0,0,0,40,0,0 +60,1,137733,0,13,1,7,1,0,0,0,0,50,0,0 +29,2,193125,1,9,0,8,0,0,1,0,0,40,0,0 +30,2,103649,5,10,0,4,3,1,1,0,0,40,0,0 +56,0,54260,8,16,1,3,0,2,0,2885,0,40,26,0 +29,2,197932,1,9,1,2,2,0,1,0,0,40,4,1 +37,2,249720,0,13,0,0,4,1,1,0,0,27,0,0 +55,2,223613,15,2,2,13,4,0,1,0,0,30,1,0 +24,2,259865,1,9,0,0,0,0,1,0,0,30,0,0 +21,2,301694,1,9,0,10,0,0,0,0,0,35,4,0 +46,5,276934,0,13,1,5,1,0,0,0,0,70,0,1 +25,2,395512,14,8,1,8,5,4,0,0,0,40,4,0 +40,2,168071,1,9,0,10,3,0,0,0,0,28,0,0 +23,2,45317,5,10,4,5,3,0,1,0,0,40,0,0 +43,1,311177,5,10,0,6,0,1,0,0,0,30,0,0 +29,1,190636,5,10,1,10,1,3,0,0,1485,60,0,1 +59,2,221336,12,6,6,4,5,2,1,0,0,40,11,0 +28,2,107389,1,9,0,1,3,0,0,0,0,32,0,0 +17,2,293440,2,7,0,0,3,0,1,0,0,15,0,0 +53,2,145409,1,9,1,8,1,0,0,0,0,40,0,1 +22,2,213902,11,3,0,13,5,0,1,0,0,40,22,0 +63,2,100099,1,9,3,10,0,0,0,0,0,40,0,0 +32,2,191856,3,14,1,5,2,0,1,0,0,45,0,1 +40,4,233891,1,9,0,0,4,1,1,0,0,35,0,0 +61,1,96073,10,15,1,3,1,0,0,0,0,50,7,1 +35,2,474136,1,9,0,10,0,0,0,0,1408,40,0,0 +43,1,355856,0,13,1,1,1,2,0,0,0,50,11,0 +48,1,139212,5,10,2,10,0,0,0,0,0,40,0,0 +56,0,143931,0,13,6,3,0,0,1,0,0,40,0,0 +51,3,160703,1,9,1,0,1,0,0,0,0,40,0,0 +34,2,191291,5,10,0,10,0,0,0,0,0,40,0,0 +44,2,68729,5,10,1,5,1,2,0,0,1902,40,0,1 +37,2,227545,5,10,1,5,1,0,0,0,0,44,0,1 +36,2,32776,0,13,1,1,1,0,0,0,1977,40,0,1 +34,2,228881,5,10,4,8,0,4,0,0,0,40,0,0 +23,2,84648,5,10,0,5,3,0,1,0,0,25,0,0 +63,3,101996,3,14,2,3,0,0,0,0,0,40,0,1 +47,4,285060,3,14,1,1,1,0,0,0,1977,41,0,1 +55,5,209569,1,9,2,5,4,0,1,0,0,50,0,1 +31,4,331126,0,13,0,11,3,1,0,0,0,48,0,0 +27,2,279872,5,10,2,4,0,0,0,0,0,40,0,0 +58,2,150560,0,13,2,0,0,0,1,14084,0,40,0,1 +28,4,185647,5,10,1,11,1,0,0,0,0,48,0,0 +52,2,128871,7,4,2,8,0,0,1,0,0,64,0,0 +31,3,386331,1,9,1,0,1,1,0,0,0,50,0,0 +53,2,117814,5,10,2,0,4,0,1,0,0,38,0,0 +43,2,220609,5,10,2,9,0,0,1,0,0,50,0,0 +43,4,117022,1,9,3,7,4,1,0,0,0,40,0,0 +50,5,176751,3,14,2,1,0,0,0,0,0,80,0,1 +37,2,80410,2,7,1,4,1,0,0,0,0,40,0,0 +26,2,127202,1,9,2,8,0,0,0,0,0,40,0,0 +22,2,121471,2,7,0,5,0,0,1,0,0,40,0,0 +22,2,219086,5,10,1,5,1,0,0,0,0,55,0,0 +59,2,271571,5,10,1,10,1,0,0,15024,0,50,0,1 +30,2,241583,5,10,1,8,1,0,0,0,0,40,0,0 +24,2,374253,1,9,4,4,0,0,1,0,0,55,0,0 +30,2,214993,1,9,1,10,1,0,0,0,0,40,0,0 +50,4,199995,0,13,2,11,0,0,0,0,0,40,0,1 +38,2,450924,14,8,1,4,1,0,0,3942,0,40,0,0 +29,2,120359,1,9,1,0,1,0,0,0,0,40,0,0 +76,2,93125,1,9,1,5,1,0,0,1424,0,24,0,0 +21,2,187513,9,11,0,10,4,0,0,0,0,40,0,0 +65,2,243569,5,10,6,4,4,0,1,0,0,24,0,0 +43,2,295510,1,9,1,1,1,0,0,0,0,45,0,1 +29,2,29732,0,13,1,3,2,0,1,0,0,24,0,0 +32,2,211743,0,13,0,5,0,0,0,0,0,45,0,0 +37,2,251396,6,12,1,1,1,0,0,0,0,65,0,1 +64,2,477697,1,9,1,1,1,0,0,0,0,16,0,0 +49,2,151584,5,10,1,10,1,0,0,0,0,40,0,1 +44,2,193882,0,13,1,1,1,0,0,0,0,40,0,1 +34,2,242460,0,13,1,1,1,0,0,7688,0,40,0,1 +35,2,411395,5,10,1,1,1,0,0,0,0,36,0,0 +53,2,191025,5,10,2,0,0,0,1,0,0,43,0,0 +24,2,154571,9,11,0,5,4,2,0,0,0,50,27,0 +31,2,208657,5,10,2,0,4,0,1,0,0,40,0,0 +25,2,29599,5,10,1,6,1,0,0,0,0,38,0,0 +36,2,423711,1,9,1,8,1,0,0,0,0,45,0,0 +29,2,122000,5,10,0,5,0,0,0,0,0,60,0,0 +37,2,148581,1,9,1,6,1,0,0,0,0,50,0,1 +42,1,222978,8,16,0,3,0,0,1,0,0,45,0,0 +30,2,149118,1,9,2,10,0,0,1,0,0,40,0,0 +32,5,218407,5,10,0,1,0,0,0,0,0,70,1,0 +47,1,112200,0,13,0,1,0,1,0,10520,0,45,0,1 +44,2,85604,1,9,2,10,0,0,0,0,0,40,0,1 +19,2,111232,1,9,0,5,3,0,0,0,0,40,0,0 +22,2,99199,1,9,1,1,1,0,0,0,0,48,0,0 +51,2,199995,4,5,1,10,1,0,0,0,0,50,0,1 +69,2,122850,1,9,1,10,1,0,0,0,0,16,0,0 +33,1,361497,1,9,0,3,0,0,0,0,0,40,0,0 +22,4,399020,5,10,0,0,0,0,1,0,0,55,0,0 +33,2,345277,0,13,0,9,0,0,1,0,0,45,0,1 +20,3,55233,5,10,0,0,5,0,1,0,0,40,0,0 +28,1,200515,5,10,1,10,1,0,0,0,0,40,0,0 +25,2,188119,1,9,0,2,0,0,1,0,0,40,0,0 +27,2,176683,1,9,0,4,0,0,0,0,0,48,0,0 +22,2,309178,1,9,0,6,3,0,0,0,0,40,0,0 +67,1,40021,1,9,1,7,1,0,0,0,0,35,0,0 +31,5,49923,1,9,1,1,1,0,0,0,0,40,0,0 +43,3,325706,10,15,1,3,1,2,0,0,0,50,3,1 +33,2,124407,0,13,0,3,0,0,1,0,0,40,0,0 +37,1,301568,1,9,1,3,2,0,1,0,0,35,0,1 +27,2,339956,1,9,1,6,1,1,0,0,0,60,0,0 +36,2,176335,5,10,0,6,0,0,0,0,0,40,0,0 +33,2,198452,6,12,2,5,0,0,1,0,0,45,0,0 +63,2,213945,0,13,1,5,1,0,0,15024,0,40,10,1 +48,2,171807,0,13,2,4,4,0,1,0,0,56,0,1 +25,2,362826,1,9,0,2,5,0,0,0,0,45,0,0 +41,1,344329,1,9,1,4,1,0,0,0,0,10,0,0 +26,2,137678,1,9,0,4,0,0,0,0,0,40,0,0 +23,2,175424,5,10,0,0,3,1,1,0,0,40,0,0 +33,0,73296,1,9,0,4,4,1,1,1831,0,40,0,0 +30,0,137613,3,14,1,3,1,2,0,0,0,17,18,0 +67,1,354405,1,9,6,4,0,0,1,0,0,20,0,0 +32,2,130057,1,9,1,5,1,0,0,0,0,55,0,1 +48,1,362883,1,9,2,10,0,0,0,0,0,60,0,1 +51,2,49017,1,9,6,4,0,0,1,0,0,24,0,0 +39,2,149943,3,14,0,5,0,2,0,0,0,40,26,0 +40,5,99185,0,13,1,3,1,0,0,0,0,60,0,0 +40,2,294708,1,9,1,6,1,1,0,0,0,40,0,1 +19,2,228238,1,9,0,8,5,0,0,0,0,40,4,0 +28,2,156819,1,9,2,2,4,0,1,0,0,36,0,0 +47,2,332727,0,13,1,3,1,0,0,0,0,60,0,1 +20,2,289944,5,10,0,3,0,0,1,0,0,20,0,0 +41,2,116103,1,9,6,1,5,0,0,914,0,40,0,0 +29,2,24153,5,10,1,4,2,3,1,0,0,40,0,0 +40,2,273425,0,13,1,1,1,0,0,0,0,50,0,1 +61,2,231183,1,9,6,1,0,0,1,0,0,40,0,0 +25,2,313930,2,7,0,10,0,0,0,0,0,40,4,0 +26,2,114483,1,9,1,8,1,0,0,0,0,40,0,0 +43,2,162108,0,13,0,0,0,0,1,0,0,40,0,0 +17,2,168807,7,4,0,10,0,0,0,0,0,45,0,0 +43,4,143828,3,14,2,3,4,1,1,9562,0,40,0,1 +73,2,242769,1,9,1,8,1,0,0,3471,0,40,7,0 +46,4,111558,5,10,2,8,3,0,1,0,0,40,0,0 +19,2,69770,5,10,0,4,3,0,0,0,0,20,0,0 +37,2,291981,1,9,2,8,0,0,0,0,0,40,0,0 +26,2,102460,5,10,1,0,1,0,0,0,0,40,0,0 +47,2,151584,1,9,2,5,3,0,0,0,1876,40,0,0 +47,4,287320,3,14,0,3,0,0,0,0,0,40,0,0 +29,2,115677,0,13,0,3,0,0,0,0,0,40,0,0 +29,2,239632,1,9,0,0,0,0,1,0,0,40,0,0 +33,2,409172,0,13,1,1,3,0,0,0,0,55,0,0 +20,2,186849,1,9,0,6,5,0,0,0,0,40,0,0 +28,2,118861,12,6,1,10,2,4,1,0,0,48,24,0 +41,0,170924,3,14,1,3,1,0,0,0,0,40,0,0 +43,2,153489,0,13,1,5,1,0,0,0,0,50,0,0 +35,2,186489,4,5,1,2,1,0,0,0,0,46,0,0 +18,2,192409,14,8,0,4,3,0,1,0,0,25,0,0 +55,0,337599,5,10,2,0,0,0,0,0,0,40,0,0 +44,2,195545,1,9,2,8,3,1,1,0,0,40,0,0 +64,2,61892,1,9,6,13,0,0,1,0,0,15,0,0 +34,1,175697,9,11,1,10,1,0,0,0,0,75,0,0 +38,2,80303,5,10,1,5,1,0,0,0,0,60,0,1 +25,2,419658,1,9,0,4,3,0,1,0,0,8,0,0 +21,2,319163,5,10,0,6,3,1,0,0,0,40,0,0 +37,2,126743,15,2,1,4,1,0,0,0,0,53,4,0 +39,2,301568,5,10,2,5,4,0,1,0,0,40,0,0 +34,2,120461,5,10,2,0,0,0,1,0,0,50,0,0 +23,2,268145,0,13,0,1,0,0,1,0,0,45,0,0 +54,2,257337,5,10,1,10,1,0,0,0,0,40,0,1 +49,5,213354,3,14,4,1,0,0,0,0,0,70,0,1 +25,2,303431,1,9,1,0,2,0,1,0,0,40,0,0 +51,2,124963,6,12,1,5,1,0,0,0,0,50,0,0 +29,2,158218,1,9,0,7,4,0,0,0,0,35,0,0 +27,0,553473,0,13,1,11,2,1,1,0,0,48,0,0 +53,2,46155,1,9,1,13,5,0,1,0,0,40,0,0 +68,2,138714,0,13,1,3,1,0,0,0,0,55,0,1 +56,2,231781,1,9,1,5,1,0,0,0,0,40,0,1 +24,2,19410,1,9,2,5,4,3,1,0,0,48,0,0 +24,2,185821,5,10,0,5,3,0,1,0,0,40,0,0 +41,4,144995,3,14,1,1,1,0,0,0,0,55,0,0 +45,2,162494,1,9,0,5,3,0,1,0,0,19,0,0 +35,2,171968,1,9,1,8,1,0,0,0,0,40,0,0 +21,2,232569,1,9,0,2,0,0,0,0,0,40,0,0 +45,2,161819,2,7,4,0,4,1,1,0,0,25,0,0 +18,2,123343,2,7,0,5,0,0,1,0,0,30,0,0 +49,2,105449,0,13,0,13,0,0,0,0,0,25,0,0 +49,2,181717,9,11,4,3,3,0,1,0,0,36,0,0 +45,4,102359,0,13,1,3,1,0,0,0,0,37,0,0 +27,2,72887,1,9,0,2,5,2,0,0,0,40,0,0 +28,2,154571,5,10,1,1,1,2,0,0,0,40,11,0 +35,2,255191,0,13,1,3,1,0,0,0,0,45,0,1 +33,2,174789,5,10,0,8,0,0,0,0,0,40,0,0 +35,2,110402,2,7,1,5,1,0,0,0,0,35,0,0 +19,2,208513,1,9,0,10,5,0,0,0,0,40,0,0 +33,2,121904,5,10,0,4,0,0,1,0,0,28,0,0 +28,2,34335,1,9,2,5,0,3,0,14084,0,40,0,1 +49,2,59380,5,10,3,0,0,0,1,0,0,40,0,0 +39,5,126675,5,10,1,3,1,0,0,0,0,25,0,0 +22,2,217363,1,9,4,0,4,0,1,0,0,40,0,0 +42,2,91836,12,6,1,10,1,0,0,0,0,40,0,0 +22,2,184813,5,10,0,0,3,0,0,0,0,40,0,0 +18,2,178142,1,9,0,10,3,0,0,0,0,40,0,0 +49,4,102359,4,5,6,2,4,0,0,0,2231,40,0,1 +33,5,281832,8,16,1,3,1,0,0,0,0,40,1,1 +28,2,96226,1,9,1,10,1,0,0,0,0,45,0,0 +42,2,195124,7,4,3,3,5,0,0,0,0,35,5,0 +20,2,56322,5,10,0,4,3,0,0,2176,0,25,0,0 +50,4,97449,5,10,1,11,1,0,0,0,0,48,0,0 +32,2,339773,5,10,1,1,1,0,0,0,0,40,0,1 +31,3,210926,1,9,4,2,4,0,1,0,0,40,0,0 +29,2,199499,9,11,0,4,0,1,0,0,0,40,0,0 +46,3,190729,5,10,1,4,1,0,0,0,0,40,0,0 +32,5,191385,8,16,0,3,0,0,0,0,0,77,0,0 +61,2,193479,1,9,6,0,4,0,1,0,0,24,0,0 +43,1,225165,2,7,1,10,1,0,0,0,0,55,0,0 +35,2,346766,1,9,0,2,0,0,1,0,0,40,0,0 +39,0,152307,0,13,1,3,1,0,0,0,0,40,0,0 +42,1,170649,5,10,1,7,1,0,0,0,0,60,0,0 +23,2,197207,0,13,0,3,0,0,1,0,0,40,0,0 +32,2,229732,0,13,1,5,1,0,0,0,0,45,0,0 +52,2,204402,1,9,1,6,1,0,0,0,0,85,0,1 +36,2,181065,6,12,1,9,1,0,0,0,0,40,0,1 +50,2,237729,1,9,6,5,0,0,1,0,2444,72,0,1 +71,2,179574,10,15,1,3,1,0,0,0,0,12,0,1 +27,2,191782,1,9,0,4,5,1,1,0,0,30,0,0 +56,2,146660,1,9,1,10,1,0,0,0,0,60,0,0 +28,1,115945,5,10,0,3,4,0,0,0,0,40,0,0 +45,2,210875,1,9,1,10,1,0,0,0,0,40,0,0 +28,2,137898,1,9,1,8,2,0,1,0,0,40,0,0 +28,4,216965,5,10,1,11,1,0,0,0,0,40,0,0 +18,2,201554,5,10,0,8,0,0,1,0,0,15,0,0 +62,2,57970,7,4,2,2,0,0,0,0,0,40,0,0 +35,2,208378,14,8,4,8,4,0,1,0,0,40,0,0 +39,2,61343,12,6,1,8,1,0,0,0,0,60,0,0 +24,2,283872,5,10,0,0,0,1,0,0,0,20,0,0 +58,2,225603,4,5,2,7,0,1,0,0,0,40,0,0 +48,2,401333,1,9,2,5,0,0,0,0,0,40,0,0 +57,2,278228,0,13,1,1,1,0,0,0,0,50,0,1 +31,2,145377,0,13,1,5,1,0,0,0,0,60,0,0 +25,2,120238,1,9,1,5,1,0,0,0,0,40,0,0 +34,2,187215,0,13,1,3,2,0,1,15024,0,36,0,1 +29,1,144063,7,4,1,7,1,0,0,0,0,72,0,0 +38,2,238721,6,12,2,1,4,1,1,0,0,40,0,0 +21,2,164920,5,10,0,4,3,0,1,0,0,40,0,0 +34,1,152493,1,9,1,7,1,0,0,0,0,70,0,0 +50,2,92968,0,13,0,5,4,0,1,0,0,32,0,0 +50,2,136836,1,9,2,3,4,1,1,0,0,40,0,0 +49,3,216453,9,11,2,1,4,1,1,0,0,45,0,0 +30,2,349148,0,13,0,3,0,0,0,0,0,70,0,0 +29,0,309620,3,14,1,3,1,2,0,0,0,20,18,0 +22,0,347803,5,10,0,0,0,4,0,0,0,20,0,0 +42,2,85995,1,9,1,6,1,0,0,0,0,50,0,0 +31,2,164569,5,10,2,4,4,0,1,0,0,48,0,0 +42,1,308279,0,13,1,3,1,0,0,0,0,21,0,0 +20,2,56322,5,10,0,4,3,0,0,0,0,20,0,0 +50,2,211654,12,6,1,10,1,0,0,0,0,40,0,1 +27,5,120126,4,5,0,10,3,0,0,0,0,40,0,0 +26,2,239043,2,7,0,4,0,0,0,0,0,40,0,0 +20,2,312017,5,10,0,11,3,0,0,0,0,40,9,0 +51,2,257485,5,10,1,10,1,0,0,0,0,40,0,1 +52,2,49243,1,9,1,8,1,0,0,0,0,40,0,0 +33,2,229716,1,9,2,0,0,0,0,0,0,38,0,0 +31,2,341672,0,13,1,0,1,2,0,0,0,60,3,0 +24,2,32311,5,10,1,4,2,0,1,0,0,40,0,0 +56,2,275236,0,13,1,8,1,0,0,0,0,40,0,0 +29,2,184596,2,7,1,10,1,0,0,3942,0,50,0,0 +18,2,186909,1,9,0,5,5,0,1,1055,0,30,0,0 +43,2,152420,5,10,1,8,1,1,0,0,0,50,0,0 +43,0,261929,8,16,3,3,4,0,0,25236,0,64,0,1 +21,2,235442,1,9,1,0,1,0,0,0,0,40,0,0 +51,2,161691,1,9,1,0,2,0,1,0,0,40,0,0 +41,2,355918,5,10,1,6,1,0,0,0,0,65,0,1 +45,0,198660,5,10,1,3,1,0,0,0,0,40,0,1 +20,2,122649,1,9,0,4,0,0,1,0,0,30,0,0 +28,2,421967,0,13,1,1,2,0,1,0,0,60,0,1 +50,4,259377,3,14,1,3,2,0,1,15024,0,40,0,1 +47,2,74305,0,13,2,10,0,0,0,0,0,40,0,0 +80,1,34340,7,4,6,7,0,0,0,0,0,35,0,0 +47,1,182752,1,9,1,0,2,0,1,0,0,35,10,0 +45,2,34248,1,9,1,5,1,0,0,0,0,50,0,0 +17,2,186677,2,7,0,2,3,0,0,0,0,12,0,0 +37,2,167851,1,9,1,10,1,0,0,0,0,50,0,0 +27,2,146460,5,10,0,8,0,0,1,0,0,40,0,0 +17,2,209650,14,8,0,4,3,0,0,0,0,16,0,0 +18,1,132986,1,9,0,7,3,0,0,0,0,40,0,0 +57,2,94429,1,9,1,2,1,0,0,0,0,40,0,0 +26,2,252406,1,9,4,0,4,0,1,0,0,40,0,0 +26,2,174592,3,14,0,1,3,0,1,0,0,40,0,0 +36,1,151322,0,13,1,3,1,0,0,0,0,45,0,1 +51,2,37237,1,9,1,7,1,0,0,0,0,80,0,1 +38,2,101192,5,10,0,4,0,0,0,0,0,40,0,0 +51,2,94081,1,9,0,10,0,0,0,0,0,40,0,1 +24,2,329408,2,7,0,2,0,0,0,0,0,40,0,0 +35,2,106028,1,9,2,7,0,0,0,0,0,65,0,0 +51,5,167793,0,13,1,1,1,0,0,15024,0,40,0,1 +28,2,138692,0,13,1,1,1,0,0,0,0,40,0,1 +37,2,173968,1,9,1,6,1,0,0,0,0,40,0,0 +43,2,228320,1,9,1,1,1,0,0,0,0,40,0,0 +23,2,96585,1,9,0,2,0,0,0,0,0,30,0,0 +42,2,156580,0,13,1,5,2,0,1,0,0,40,5,0 +58,2,210673,5,10,1,0,2,0,1,0,0,40,0,1 +52,4,137753,1,9,1,4,2,1,1,0,0,20,0,0 +29,2,29865,1,9,2,5,0,3,1,0,0,50,0,0 +27,2,196044,5,10,1,10,1,0,0,0,0,60,0,0 +28,2,308995,5,10,0,0,3,1,1,0,0,40,2,0 +59,2,159008,6,12,1,10,1,0,0,7298,0,20,0,1 +28,2,362491,1,9,0,2,3,0,0,0,0,40,0,0 +24,2,94395,5,10,0,10,0,0,0,0,0,40,0,0 +20,2,320047,12,6,3,2,0,0,0,0,0,40,0,0 +54,2,98535,0,13,1,1,1,0,0,0,0,40,0,1 +65,2,183170,1,9,2,4,0,0,0,0,0,25,0,0 +38,2,195686,5,10,1,10,1,0,0,0,0,40,0,1 +29,2,178244,1,9,1,8,1,0,0,0,0,40,0,0 +27,2,127833,1,9,0,0,3,1,1,0,0,40,0,0 +36,2,269722,3,14,1,4,1,0,0,0,0,40,0,0 +55,0,136819,1,9,1,11,1,0,0,0,0,40,0,0 +22,2,205604,11,3,0,8,0,0,0,0,0,30,4,0 +28,2,132078,0,13,0,3,0,0,1,0,0,40,0,0 +20,2,234880,5,10,0,5,3,0,1,0,0,30,0,0 +24,2,196816,0,13,1,3,1,0,0,3908,0,40,0,0 +36,2,237943,3,14,1,1,1,0,0,15024,0,50,0,1 +68,5,140852,1,9,1,5,1,0,0,0,0,40,0,0 +49,1,105614,1,9,2,5,0,0,0,0,0,50,0,1 +18,2,83492,7,4,0,8,3,0,0,0,0,40,0,0 +50,1,225772,8,16,2,3,0,0,1,0,0,60,0,1 +37,2,242713,14,8,4,13,4,1,1,0,0,40,0,0 +60,2,355865,3,14,1,1,1,0,0,0,0,50,0,1 +43,2,173316,5,10,1,10,1,0,0,0,0,40,0,0 +43,5,35662,8,16,1,3,2,0,1,0,0,70,0,1 +17,2,297246,2,7,0,13,3,0,1,0,0,9,0,0 +43,2,108945,5,10,0,1,0,0,1,0,0,50,0,0 +21,1,57298,5,10,0,0,3,0,1,0,0,15,0,0 +48,1,164582,5,10,1,7,1,0,0,7298,0,60,0,1 +56,2,295067,0,13,0,1,0,0,0,14084,0,45,0,1 +21,2,177265,6,12,0,4,3,0,1,0,0,30,0,0 +28,4,336543,6,12,1,11,1,2,0,0,0,40,37,1 +39,1,52870,1,9,1,10,1,0,0,0,0,40,0,1 +40,2,316820,7,4,1,5,1,0,0,4064,0,40,0,0 +38,4,200153,6,12,0,3,0,0,0,0,0,40,0,0 +59,2,453067,5,10,1,3,1,0,0,0,0,36,0,1 +51,3,27166,1,9,1,9,1,0,0,0,0,40,0,0 +19,2,299598,1,9,0,2,3,0,0,0,0,16,0,0 +23,2,122048,1,9,0,8,0,0,1,0,0,40,0,0 +31,2,345277,0,13,2,3,0,0,1,0,0,40,0,0 +42,2,113147,6,12,1,3,1,1,0,0,0,40,0,0 +43,2,34007,1,9,1,10,1,0,0,0,0,40,0,1 +45,2,255014,5,10,1,10,1,0,0,0,0,55,0,1 +34,2,152667,5,10,1,8,1,0,0,0,0,35,0,0 +21,2,231053,1,9,0,8,3,0,0,0,0,30,0,0 +34,2,103651,5,10,1,1,1,0,0,0,0,40,0,1 +55,5,124137,5,10,1,5,1,0,0,0,0,40,0,1 +30,2,198183,9,11,0,3,0,0,1,0,0,40,0,0 +29,2,183627,1,9,1,8,1,0,0,3137,0,48,38,0 +19,2,466458,5,10,0,0,3,0,1,0,0,20,0,0 +45,1,114396,0,13,2,3,0,0,0,0,0,35,0,0 +42,2,186376,0,13,1,4,1,2,0,0,0,72,11,1 +32,2,290964,0,13,0,5,0,0,1,0,1590,40,0,0 +90,1,282095,5,10,1,7,1,0,0,0,0,40,0,0 +44,0,244974,0,13,1,11,1,0,0,0,0,44,0,1 +34,1,114691,1,9,1,3,1,0,0,0,0,40,0,1 +35,2,107160,14,8,4,4,0,0,1,0,0,30,0,0 +39,1,142573,5,10,0,10,0,0,0,0,0,25,0,0 +29,2,203833,0,13,0,3,0,1,0,0,0,40,0,0 +24,2,47791,1,9,0,4,4,0,1,0,0,32,0,0 +49,2,133729,5,10,1,4,1,0,0,0,0,17,0,0 +54,2,135803,0,13,1,1,1,2,0,15024,0,60,27,1 +31,2,128591,4,5,2,6,0,0,0,0,0,40,0,0 +44,2,133853,5,10,2,1,0,0,1,0,0,50,0,0 +27,1,243569,1,9,1,5,1,0,0,0,0,40,0,0 +24,2,119156,1,9,0,2,3,0,0,0,0,40,0,0 +30,2,391114,1,9,1,2,1,0,0,0,0,60,0,0 +27,2,252506,5,10,2,1,3,0,1,0,0,40,0,0 +34,0,117503,0,13,1,0,1,0,0,0,0,20,25,0 +25,0,117833,5,10,1,1,2,0,1,0,0,19,0,0 +39,2,294183,1,9,2,1,4,0,1,0,0,40,0,0 +28,2,394927,5,10,1,9,1,0,0,0,0,40,0,1 +51,1,259323,1,9,1,10,1,0,0,0,0,70,0,0 +33,2,96635,5,10,0,5,0,2,0,0,0,26,27,0 +27,2,192283,9,11,0,2,3,0,1,0,0,38,0,0 +29,2,214881,1,9,0,1,0,0,0,0,0,40,0,0 +33,0,167474,12,6,1,2,1,0,0,0,0,40,0,0 +37,2,110713,1,9,1,5,1,0,0,0,0,50,0,1 +20,2,201204,1,9,0,2,3,0,0,0,0,40,0,0 +24,2,197666,0,13,0,1,0,0,1,0,0,40,0,0 +29,2,162002,1,9,0,4,3,0,1,0,0,35,0,0 +31,2,263561,0,13,1,1,1,0,0,0,2246,45,0,1 +41,2,224799,5,10,1,10,1,0,0,0,0,40,0,0 +42,1,89942,5,10,1,10,1,0,0,0,0,40,0,0 +20,2,238685,5,10,0,5,0,0,1,0,0,30,0,0 +54,2,38795,4,5,4,10,4,0,0,0,0,40,0,0 +55,2,90414,0,13,3,10,4,0,1,0,0,55,38,0 +21,2,190805,1,9,1,2,1,0,0,0,0,32,0,0 +52,2,23780,9,11,1,1,1,0,0,0,1977,45,0,1 +19,2,285263,1,9,0,0,3,0,0,0,0,40,0,0 +33,2,177331,9,11,1,10,1,1,0,0,0,40,0,0 +22,2,347530,1,9,4,4,4,1,1,0,0,35,0,0 +59,2,230039,1,9,0,1,4,0,1,0,625,38,0,0 +31,2,204752,14,8,0,5,3,0,0,0,0,32,0,0 +74,1,104001,1,9,1,5,1,0,0,0,0,40,0,1 +45,2,253116,12,6,2,4,4,1,1,0,0,40,0,0 +36,2,169037,1,9,0,0,0,0,1,0,0,40,0,0 +35,5,202027,5,10,2,1,0,0,0,0,0,60,0,0 +45,2,170099,5,10,2,10,0,0,0,0,0,40,0,0 +42,1,212847,1,9,0,7,3,0,0,0,0,85,0,0 +50,0,307392,3,14,2,3,4,0,1,0,0,40,0,0 +39,2,233428,1,9,2,1,5,0,1,0,0,40,0,0 +44,2,355728,5,10,4,1,0,0,0,0,1980,45,7,0 +52,2,177995,15,2,1,7,1,0,0,0,0,56,4,1 +24,2,283613,0,13,0,3,0,0,0,0,0,43,0,0 +56,5,184598,4,5,1,6,1,0,0,0,0,99,0,0 +27,2,185647,1,9,1,8,1,0,0,0,0,50,0,1 +47,5,192894,0,13,1,1,1,0,0,0,1902,45,0,1 +40,1,284706,10,15,1,3,1,3,0,0,1977,60,0,1 +38,2,179579,1,9,0,3,0,0,0,0,0,40,0,0 +27,2,131679,9,11,2,5,0,0,1,0,0,40,0,0 +52,2,132973,1,9,2,0,4,0,1,0,0,38,0,0 +22,2,154713,1,9,2,5,3,0,0,0,0,40,0,0 +41,2,121718,5,10,1,10,1,0,0,0,0,40,25,0 +30,2,255279,1,9,2,0,4,0,1,0,0,20,0,0 +55,2,202559,0,13,1,4,5,2,0,0,0,35,11,0 +25,2,123095,5,10,0,0,3,0,0,0,1590,40,0,0 +32,2,153326,0,13,1,3,5,0,0,0,0,40,0,0 +28,2,75695,5,10,4,4,0,0,1,0,0,60,0,0 +33,5,206609,1,9,1,1,1,0,0,0,0,50,0,0 +17,2,234780,1,9,0,7,3,1,0,0,0,40,0,0 +27,2,178778,1,9,1,6,1,0,0,0,0,40,0,0 +55,2,171355,9,11,1,8,1,0,0,0,0,20,0,0 +63,3,95680,5,10,1,9,1,0,0,0,0,18,0,1 +39,2,196673,1,9,1,4,2,0,1,5013,0,40,0,0 +51,3,73670,8,16,1,3,1,0,0,4386,0,52,0,1 +67,1,139960,7,4,1,10,1,0,0,0,0,40,0,0 +27,2,60374,1,9,6,10,4,0,1,0,1594,26,0,0 +54,2,421561,3,14,1,1,1,0,0,0,0,45,0,1 +59,2,245196,12,6,1,6,1,1,0,0,0,40,0,1 +18,2,27620,1,9,0,0,0,0,1,0,0,25,0,0 +19,2,187570,1,9,0,10,3,0,0,0,0,20,0,0 +31,2,102884,1,9,1,8,1,0,0,0,0,50,0,0 +17,2,228399,2,7,0,4,3,0,1,0,0,7,0,0 +42,2,340234,1,9,1,9,1,2,0,15024,0,40,0,1 +37,2,176293,5,10,3,3,0,0,1,0,0,30,0,0 +51,4,108435,1,9,1,10,1,0,0,0,0,40,0,0 +48,2,161187,1,9,0,0,0,0,1,2463,0,40,0,0 +23,2,278391,1,9,0,6,3,0,0,0,0,40,0,0 +27,2,157941,9,11,1,5,1,0,0,0,0,45,0,0 +25,2,182866,1,9,0,2,3,0,0,0,0,40,0,0 +69,2,370888,6,12,2,0,0,0,1,2964,0,6,9,0 +30,2,206512,0,13,0,1,0,0,0,0,0,44,0,0 +33,2,357954,1,9,1,2,1,0,0,0,0,35,3,0 +28,2,189346,1,9,0,2,3,0,0,0,0,48,0,0 +45,2,234652,11,3,1,8,1,0,0,0,0,40,4,0 +25,2,113436,5,10,0,0,3,0,0,0,0,15,0,0 +37,2,204145,9,11,1,10,1,0,0,0,0,45,0,1 +59,2,157305,13,1,0,8,0,0,0,0,0,40,21,0 +26,2,104045,1,9,0,4,3,0,1,0,0,30,0,0 +48,2,280422,5,10,4,4,0,0,1,0,0,25,30,0 +64,3,173754,1,9,1,0,1,0,0,0,0,40,0,0 +39,2,211154,0,13,1,9,1,0,0,0,0,50,0,0 +24,2,321435,0,13,0,0,0,0,0,0,0,40,0,0 +40,0,177083,3,14,0,1,0,0,1,0,0,35,0,0 +46,2,178829,3,14,3,1,0,0,0,0,0,70,0,1 +35,3,287658,5,10,1,11,1,1,0,0,0,40,0,1 +43,2,209894,1,9,1,0,2,0,1,0,0,40,0,1 +31,2,334744,1,9,4,6,0,0,0,0,0,40,0,0 +22,2,306967,5,10,0,0,0,0,1,0,0,25,0,0 +35,2,52187,5,10,0,4,0,0,0,0,0,30,0,0 +35,2,101978,1,9,4,6,0,0,0,0,0,50,0,0 +35,0,483530,5,10,2,9,4,0,1,0,0,40,0,0 +40,2,77357,10,15,1,3,1,0,0,0,0,40,0,1 +50,2,149770,3,14,0,3,4,0,1,0,0,40,0,0 +48,1,328606,10,15,2,3,4,0,0,14084,0,63,0,1 +46,2,188293,1,9,2,0,0,0,1,0,0,40,0,0 +36,2,116608,1,9,2,8,4,0,1,0,0,38,0,0 +37,0,348960,0,13,1,3,1,0,0,0,0,36,0,1 +24,2,329530,4,5,1,5,1,0,0,0,0,45,4,0 +47,4,93476,0,13,4,3,0,0,1,0,0,70,0,0 +35,1,195744,1,9,2,10,0,0,0,0,0,50,0,0 +43,2,125833,0,13,1,0,1,2,0,0,0,40,36,0 +18,0,191117,2,7,0,4,3,0,0,0,0,20,0,0 +54,2,311020,1,9,1,4,1,0,0,0,0,50,0,0 +62,2,210464,1,9,0,4,5,1,1,0,0,38,0,0 +36,2,135289,0,13,1,10,1,0,0,0,0,48,0,1 +27,2,156266,4,5,1,7,1,3,0,0,0,40,0,0 +23,2,154210,5,10,0,0,5,2,0,0,0,14,5,0 +33,1,249249,11,3,1,10,1,0,0,0,0,50,0,1 +28,2,261725,15,2,0,8,0,0,1,0,0,40,4,0 +22,2,239612,1,9,0,0,3,0,0,0,0,20,0,0 +31,1,226696,9,11,1,7,1,0,0,0,0,60,0,1 +26,2,190330,0,13,0,4,0,0,0,0,0,30,0,0 +44,2,193755,0,13,2,1,0,0,0,0,0,50,0,1 +73,2,192740,0,13,1,3,1,0,0,0,0,30,0,0 +44,2,201924,0,13,2,5,4,0,1,0,0,35,0,0 +35,2,77146,9,11,2,1,0,0,0,0,0,45,0,0 +27,2,43652,0,13,0,0,0,0,1,0,0,40,0,0 +47,3,227244,0,13,1,11,1,1,0,0,0,50,0,1 +29,2,160731,1,9,1,10,1,0,0,0,0,45,0,1 +33,2,287878,5,10,1,4,2,0,1,0,0,26,0,0 +50,2,166758,5,10,2,4,0,0,1,0,0,15,0,0 +32,2,183811,1,9,1,2,1,0,0,2829,0,40,0,0 +41,1,254818,3,14,2,2,4,0,0,0,0,40,30,0 +45,2,295046,1,9,1,5,1,0,0,0,0,60,0,1 +65,2,190568,1,9,6,0,0,0,1,0,810,36,0,0 +42,0,211915,5,10,4,9,4,0,1,0,0,40,0,0 +33,1,295621,0,13,1,3,1,1,0,0,0,25,0,1 +32,2,204567,0,13,1,5,1,0,0,99999,0,60,0,1 +42,2,204235,5,10,1,3,1,0,0,0,0,40,0,1 +49,2,186982,5,10,4,1,0,0,1,0,0,45,0,1 +38,2,133586,1,9,1,11,3,0,0,0,0,45,0,0 +38,2,165930,5,10,1,1,1,0,0,0,0,50,0,0 +37,2,164898,5,10,1,10,1,0,0,0,0,52,0,0 +24,2,278155,5,10,0,8,0,0,0,0,0,30,0,0 +27,1,115705,5,10,0,5,0,0,0,0,0,50,0,0 +25,2,150553,4,5,3,0,4,2,1,0,0,40,36,0 +29,2,185127,1,9,1,5,1,0,0,0,0,50,0,0 +46,2,201595,1,9,1,6,1,0,0,0,0,70,0,0 +44,5,165815,1,9,1,6,1,0,0,0,0,96,0,0 +26,2,102420,0,13,0,5,0,2,1,0,0,40,27,0 +46,4,344172,6,12,1,11,1,0,0,0,0,49,0,1 +38,2,222450,5,10,4,1,4,0,0,0,0,40,0,0 +38,2,212245,5,10,1,10,1,0,0,0,0,40,0,0 +22,0,190625,0,13,1,1,1,0,0,0,0,20,0,0 +33,2,203488,5,10,2,5,0,0,0,0,0,40,0,0 +50,2,304260,6,12,2,0,0,2,0,0,0,40,0,0 +31,4,243665,1,9,1,11,1,0,0,0,0,41,0,1 +26,1,189238,5,10,0,3,0,0,1,0,0,4,4,0 +42,2,77373,5,10,1,2,1,0,0,0,0,38,0,0 +27,2,410351,1,9,1,10,1,0,0,0,0,40,0,0 +34,2,36385,3,14,1,3,1,0,0,0,0,45,0,1 +64,2,110150,1,9,1,11,1,0,0,0,0,40,0,0 +43,2,198316,5,10,1,10,1,0,0,0,0,40,0,0 +39,2,127772,1,9,1,10,1,0,0,0,0,40,0,0 +47,1,199058,10,15,0,3,0,0,0,0,0,40,0,1 +56,2,285730,3,14,0,3,0,0,0,0,0,66,0,0 +25,4,334133,3,14,0,3,3,0,0,0,0,20,0,0 +60,0,97030,0,13,2,1,0,0,1,0,0,35,0,0 +52,2,67090,1,9,1,5,1,0,0,0,0,44,0,0 +43,2,397963,1,9,2,2,0,0,0,594,0,16,0,0 +46,2,182533,0,13,0,0,4,2,1,0,0,40,11,0 +19,2,560804,5,10,0,0,3,0,1,0,0,30,0,0 +56,2,365050,7,4,0,7,4,1,1,0,0,20,0,0 +22,2,110200,0,13,0,3,0,0,0,0,0,40,0,0 +39,2,299828,11,3,4,5,4,1,1,0,0,30,5,0 +28,2,109282,5,10,2,3,0,0,0,0,0,40,0,0 +31,2,103435,0,13,1,5,1,0,0,0,0,50,0,1 +22,2,34747,1,9,0,4,3,0,1,0,0,35,0,0 +39,2,286789,0,13,1,1,1,0,0,0,0,40,0,1 +28,1,211032,2,7,0,10,0,0,0,0,0,40,4,0 +31,2,219318,1,9,0,0,4,0,1,0,0,35,5,0 +50,2,112873,0,13,1,5,1,0,0,0,0,40,0,0 +34,2,36069,1,9,1,10,1,0,0,3908,0,46,0,0 +48,2,73434,1,9,1,0,2,0,1,0,0,40,9,1 +51,2,200576,0,13,2,0,0,0,1,0,0,40,0,0 +54,2,172962,1,9,1,5,1,0,0,0,0,40,0,0 +44,2,44006,9,11,2,6,0,0,0,0,0,40,0,0 +20,2,234474,5,10,0,5,3,1,1,0,0,20,0,0 +37,2,212826,1,9,1,4,1,1,0,0,0,40,0,0 +38,2,234901,5,10,1,3,1,0,0,0,0,40,0,0 +59,3,200700,6,12,1,7,1,1,0,0,0,40,0,0 +59,1,41258,0,13,1,3,1,0,0,0,0,50,0,0 +51,2,249644,5,10,2,10,0,0,0,0,0,48,0,1 +29,2,351731,5,10,1,3,1,0,0,0,0,40,0,0 +37,2,114765,5,10,0,8,0,0,1,0,0,40,0,0 +42,2,349884,12,6,1,10,1,0,0,0,0,35,0,0 +28,5,204247,0,13,1,3,1,0,0,0,0,50,0,1 +34,2,143392,1,9,0,5,3,0,1,0,0,40,0,0 +50,1,37913,0,13,1,1,1,0,0,0,0,40,25,1 +22,5,150683,1,9,0,8,3,0,0,0,0,24,0,0 +27,2,207611,1,9,0,4,0,0,1,0,0,52,0,0 +45,0,319666,10,15,2,3,4,0,1,0,0,43,0,0 +39,2,155961,1,9,2,0,4,1,1,0,0,38,0,0 +25,4,117833,0,13,0,3,0,0,1,0,0,35,0,0 +24,5,142404,0,13,1,1,1,0,0,0,0,40,0,1 +18,2,155752,1,9,0,8,0,0,1,0,0,30,0,0 +23,2,111450,14,8,0,4,4,1,0,0,0,38,0,0 +20,2,528616,11,3,0,4,5,0,0,0,0,40,4,0 +17,1,228786,12,6,0,4,3,0,1,0,0,24,0,0 +63,5,80572,0,13,1,7,1,0,0,0,0,40,0,1 +28,4,180271,0,13,1,2,1,0,0,0,0,65,0,1 +51,3,237819,0,13,1,3,1,0,0,0,0,50,0,1 +29,2,157612,0,13,0,5,0,0,1,3325,0,45,0,0 +64,2,379062,5,10,6,0,4,0,1,0,0,12,0,0 +17,2,191910,12,6,0,4,3,0,0,0,0,25,0,0 +45,4,326064,5,10,2,0,4,1,1,6497,0,35,0,0 +18,2,312353,14,8,0,4,3,1,0,0,0,20,0,0 +31,4,213307,1,9,0,0,3,0,1,0,0,40,0,0 +48,1,209057,0,13,3,5,3,0,0,0,0,50,0,1 +41,2,340148,5,10,0,3,0,0,1,0,0,45,0,0 +65,2,154171,10,15,1,3,1,0,0,20051,0,60,0,1 +27,2,94064,9,11,2,8,0,0,0,0,0,40,0,0 +39,2,119098,9,11,1,1,1,0,0,0,0,40,0,0 +51,1,388496,5,10,2,10,0,0,0,0,0,8,5,1 +49,2,181363,3,14,1,1,1,0,0,0,0,45,0,1 +36,2,206951,0,13,1,5,1,0,0,0,1902,45,0,1 +25,2,485496,1,9,0,8,0,1,1,0,0,40,0,0 +41,2,210259,5,10,2,0,4,1,1,0,0,37,0,0 +31,2,118551,4,5,2,0,0,0,1,0,0,40,0,0 +63,2,180911,2,7,1,11,1,0,0,4386,0,37,0,1 +50,0,242517,0,13,2,1,0,0,1,0,0,40,0,0 +63,2,298113,5,10,2,4,0,0,0,0,0,40,0,0 +44,1,277783,3,14,0,7,3,0,0,0,0,99,0,0 +48,2,155862,1,9,2,6,0,0,0,0,0,65,0,0 +51,1,171924,5,10,1,5,1,0,0,0,0,50,0,0 +18,2,243900,1,9,0,0,3,0,1,0,0,15,0,0 +23,2,231160,5,10,0,4,3,0,0,0,0,25,0,0 +31,2,356882,1,9,1,8,1,0,0,5013,0,40,0,0 +38,2,49020,1,9,1,10,1,0,0,0,0,40,0,0 +56,2,157749,5,10,1,7,1,0,0,0,0,60,0,1 +31,2,131568,7,4,2,6,4,0,0,0,0,20,0,0 +46,2,332355,5,10,1,0,1,0,0,0,0,40,0,0 +39,2,204501,3,14,1,1,1,0,0,0,0,50,0,1 +56,4,305767,1,9,1,4,1,2,0,0,0,40,26,0 +31,2,129761,1,9,0,1,4,0,1,0,0,40,0,0 +42,5,130126,0,13,1,3,1,0,0,0,1977,40,0,1 +53,2,102828,1,9,1,1,1,0,0,0,0,35,0,1 +18,2,160984,2,7,0,4,3,0,1,0,0,15,0,0 +27,2,285897,1,9,1,3,1,0,0,0,1848,45,0,1 +31,2,356689,0,13,0,7,0,0,0,0,0,40,0,0 +52,3,192386,3,14,1,1,1,0,0,5013,0,40,0,0 +46,2,394860,1,9,1,4,1,0,0,0,0,40,0,0 +30,2,113129,5,10,0,4,0,0,0,0,0,24,0,0 +26,2,55929,0,13,0,4,0,0,1,0,0,40,0,0 +48,4,177018,3,14,1,3,1,0,0,0,0,50,0,1 +37,2,161141,5,10,1,10,1,0,0,0,0,40,0,1 +29,2,309463,4,5,1,10,1,0,0,0,0,40,0,0 +49,2,165468,1,9,1,1,1,0,0,7688,0,55,0,1 +24,2,49218,1,9,2,8,0,0,0,0,0,40,0,0 +74,1,119129,1,9,1,5,1,0,0,0,2149,20,0,0 +56,1,162130,11,3,1,1,1,0,0,0,1887,67,0,1 +39,3,129573,0,13,0,0,0,0,0,0,1741,40,0,0 +21,2,306850,1,9,0,6,3,0,0,0,0,40,0,0 +29,2,135296,0,13,0,1,0,0,1,0,2258,45,0,1 +43,1,187322,1,9,2,4,4,0,0,0,0,45,0,0 +23,2,55674,0,13,0,11,0,0,1,2907,0,40,0,0 +26,2,148298,1,9,0,1,0,0,1,0,0,50,0,0 +47,2,34845,1,9,1,6,1,0,0,0,0,60,0,0 +27,2,200733,1,9,1,8,1,0,0,0,0,55,0,0 +45,2,191858,1,9,1,8,1,0,0,0,0,45,0,1 +30,2,425528,1,9,0,11,3,0,0,0,0,70,0,0 +35,2,44780,5,10,1,0,2,0,1,7688,0,20,0,1 +33,2,125856,1,9,1,10,1,0,0,0,0,40,0,0 +37,2,100508,1,9,1,10,1,0,0,0,0,40,0,1 +21,2,148294,1,9,0,7,3,0,0,0,0,20,0,0 +42,2,39324,1,9,1,5,1,0,0,0,0,40,0,0 +48,3,147397,1,9,1,0,1,0,0,0,0,36,0,0 +46,2,24728,1,9,0,10,0,0,1,0,0,48,0,0 +36,2,177616,11,3,4,8,0,0,1,0,0,40,0,0 +54,2,163826,1,9,0,3,0,0,0,0,0,40,0,0 +25,2,199947,1,9,1,0,2,0,1,0,0,40,0,0 +26,4,386949,1,9,2,0,4,0,1,0,0,25,0,0 +36,5,116133,1,9,1,6,1,0,0,0,0,57,0,0 +56,1,196307,0,13,0,3,0,0,0,0,0,20,0,0 +37,2,177181,1,9,1,10,1,0,0,0,0,40,0,0 +26,2,324854,0,13,0,3,0,0,1,0,0,40,0,1 +23,2,188505,0,13,0,4,3,0,1,0,0,25,0,0 +23,0,502316,0,13,0,3,0,0,1,0,0,40,0,0 +41,0,26892,0,13,0,0,0,0,0,0,0,40,0,0 +55,2,102058,0,13,1,1,1,0,0,0,0,50,0,1 +39,2,167728,0,13,1,1,1,0,0,0,0,40,0,1 +67,4,233681,6,12,1,1,1,0,0,0,0,35,0,0 +60,2,26756,1,9,6,5,0,0,1,0,0,50,0,0 +54,2,101890,1,9,6,5,4,0,1,0,0,40,0,0 +38,2,192337,3,14,1,3,1,0,0,0,0,40,7,1 +47,2,340982,5,10,1,8,1,2,0,3103,0,40,11,1 +49,0,102308,0,13,1,3,1,0,0,0,0,42,0,1 +19,2,84747,1,9,0,5,3,0,1,0,0,24,0,0 +20,2,197752,5,10,0,10,4,0,0,0,0,40,0,0 +66,2,185336,1,9,6,5,5,0,1,0,0,35,0,0 +51,1,125417,3,14,1,1,1,0,0,0,0,42,0,1 +19,2,278480,5,10,0,1,0,0,0,0,0,40,0,0 +36,2,146412,5,10,2,0,4,0,1,0,0,40,0,0 +33,2,193042,1,9,1,6,1,0,0,0,0,60,0,1 +41,2,53956,0,13,2,5,0,0,0,0,1980,56,0,0 +90,2,175491,1,9,1,10,1,0,0,9386,0,50,16,1 +36,2,144154,1,9,2,1,0,0,1,0,0,40,0,0 +30,2,194901,10,15,2,5,3,0,0,0,0,55,0,0 +35,2,335777,5,10,2,1,0,0,0,0,0,40,4,0 +46,2,139268,3,14,1,1,1,0,0,0,0,45,0,1 +38,2,33887,1,9,0,8,5,0,0,0,0,40,0,0 +24,2,283613,0,13,1,3,1,0,0,0,0,40,0,0 +40,2,141245,0,13,1,4,2,0,1,0,0,40,5,0 +49,2,298130,7,4,1,8,1,0,0,0,0,40,0,0 +19,2,186096,1,9,0,4,3,1,0,0,0,30,0,0 +77,2,187656,5,10,6,13,0,0,1,0,0,20,0,0 +46,2,102308,1,9,1,2,1,0,0,0,0,56,0,1 +41,2,124639,5,10,4,10,0,1,0,0,0,40,0,0 +28,2,388112,15,2,0,7,4,0,0,0,0,77,4,0 +21,2,109952,1,9,1,10,1,0,0,0,0,40,0,0 +24,2,164529,14,8,0,7,3,1,0,0,0,40,0,0 +36,2,247750,1,9,1,6,1,1,0,0,0,45,0,0 +23,0,103588,5,10,0,0,3,0,0,0,0,25,0,0 +38,3,248919,1,9,1,6,1,0,0,0,2051,40,0,0 +29,1,178551,1,9,1,10,1,0,0,0,0,40,0,0 +38,2,136137,5,10,1,1,5,0,0,0,0,50,0,1 +47,3,55377,0,13,0,0,4,1,0,0,0,40,0,1 +39,4,177728,3,14,2,3,0,0,1,0,0,40,0,0 +40,4,243580,0,13,1,3,1,0,0,0,0,48,0,0 +32,2,63910,1,9,2,0,3,2,1,0,0,40,0,0 +23,2,219535,1,9,0,1,3,0,0,0,0,40,0,0 +44,0,180609,1,9,1,11,1,0,0,0,0,40,0,0 +70,2,170428,0,13,6,3,4,0,1,0,0,20,5,0 +51,2,102615,3,14,1,11,1,0,0,0,1977,40,0,1 +66,2,193132,4,5,4,4,0,1,1,0,0,30,0,0 +57,5,124137,5,10,1,1,1,0,0,0,0,40,0,0 +36,2,136629,5,10,1,8,1,0,0,0,0,40,0,1 +48,5,148995,0,13,2,5,0,0,0,0,0,60,0,1 +51,2,63424,3,14,1,3,2,0,1,0,0,40,0,1 +43,2,241895,0,13,1,1,1,0,0,0,0,50,0,1 +27,2,266973,1,9,1,10,1,0,0,0,0,60,0,0 +32,2,188048,0,13,0,0,3,0,1,0,0,40,0,0 +20,2,366929,5,10,0,0,3,0,1,0,0,35,0,0 +33,2,214129,5,10,2,0,0,0,1,0,0,40,0,0 +19,2,250818,5,10,0,0,0,0,0,0,0,40,0,0 +32,4,240979,5,10,1,10,1,0,0,0,0,60,0,1 +35,2,98283,10,15,0,3,0,2,0,0,0,40,3,1 +26,2,104746,1,9,1,10,1,0,0,5013,0,60,0,0 +39,2,103710,1,9,0,5,4,0,1,0,0,60,0,0 +24,2,159580,0,13,0,4,3,1,1,0,0,75,0,0 +45,2,117409,5,10,1,1,1,0,0,0,0,40,0,1 +20,2,140001,5,10,0,0,3,0,0,0,0,40,0,0 +49,0,31650,0,13,1,3,5,0,1,0,0,45,0,0 +35,0,80771,3,14,0,3,0,0,1,0,0,40,0,0 +30,2,66278,1,9,0,0,0,0,1,0,0,40,0,0 +23,2,107801,5,10,0,0,3,0,1,0,1617,25,0,0 +33,2,206609,0,13,1,1,1,0,0,0,0,45,0,0 +35,2,282461,1,9,1,6,1,0,0,0,0,50,0,0 +31,2,188246,3,14,1,3,1,0,0,0,0,50,0,0 +20,2,279763,2,7,0,10,0,1,0,0,0,25,0,0 +44,2,467799,1,9,1,10,1,0,0,0,0,40,0,0 +33,1,137674,1,9,1,4,1,1,0,0,0,40,0,0 +50,2,158284,5,10,1,8,1,0,0,0,0,40,0,0 +25,2,204219,1,9,0,0,4,0,1,0,0,40,4,0 +28,0,210498,1,9,1,11,1,0,0,0,0,40,0,0 +60,3,63526,0,13,1,0,1,1,0,0,0,40,0,1 +38,3,216924,9,11,1,10,1,0,0,0,0,40,0,0 +38,2,372559,5,10,1,10,1,1,0,0,0,40,0,0 +57,3,199114,0,13,0,0,0,0,0,0,2258,40,0,0 +50,2,168539,1,9,1,10,1,0,0,0,0,40,0,1 +39,4,189911,2,7,2,0,4,0,1,0,0,40,0,0 +69,4,61958,1,9,1,10,1,0,0,1424,0,6,0,0 +51,0,68898,9,11,2,9,0,0,0,0,2444,39,0,1 +42,2,204450,1,9,1,2,1,1,0,0,0,40,0,0 +53,2,311350,0,13,1,1,1,0,0,0,0,50,0,1 +37,2,113750,0,13,1,2,1,0,0,0,0,40,0,0 +37,2,359591,12,6,1,10,1,0,0,0,0,40,0,0 +38,2,132879,1,9,1,10,1,0,0,7298,0,50,0,1 +20,2,301199,5,10,0,4,3,0,1,0,0,24,0,0 +38,0,267540,5,10,4,0,4,1,1,0,0,38,0,0 +52,2,185407,9,11,1,10,1,0,0,0,0,48,12,1 +48,5,191277,9,11,1,1,1,0,0,0,0,50,0,1 +30,2,78980,9,11,1,8,1,0,0,0,0,40,0,1 +37,1,241463,1,9,1,1,1,0,0,0,1848,65,0,1 +47,2,216999,1,9,1,5,1,0,0,0,0,45,0,0 +33,4,120508,0,13,2,11,4,0,1,0,0,60,9,0 +33,2,122612,1,9,3,4,0,2,1,0,0,35,15,0 +20,2,94057,5,10,0,4,3,0,0,0,0,15,0,0 +41,0,197558,0,13,2,1,0,0,0,0,0,40,0,0 +32,2,351869,5,10,1,6,1,0,0,0,1485,45,0,1 +36,3,184556,0,13,1,1,2,0,1,0,0,40,0,0 +46,2,268281,0,13,0,3,0,0,1,0,0,40,0,0 +45,2,235646,0,13,1,1,1,0,0,0,0,40,0,1 +18,2,186909,5,10,0,4,3,0,1,0,0,16,0,0 +62,2,35783,5,10,1,6,1,0,0,0,0,60,0,0 +33,2,188861,1,9,1,8,1,0,0,0,0,40,0,0 +42,2,363591,1,9,2,10,4,0,0,0,0,40,0,0 +18,2,469921,5,10,0,3,3,0,1,0,0,40,0,0 +32,2,51150,9,11,2,0,4,0,1,0,0,40,0,0 +43,2,174325,7,4,1,6,1,1,0,0,0,40,0,0 +20,2,347530,1,9,0,4,4,1,1,0,0,25,0,0 +50,2,72351,0,13,2,5,0,0,0,0,0,45,0,0 +36,2,188571,1,9,1,10,1,0,0,0,0,40,0,0 +22,2,255252,1,9,0,10,3,0,0,0,0,40,0,0 +30,2,291951,1,9,1,10,1,1,0,0,0,40,0,0 +33,1,223046,1,9,0,10,0,0,0,0,0,40,0,0 +43,4,37937,6,12,1,9,1,0,0,0,0,43,0,0 +38,2,295127,5,10,1,8,1,0,0,0,0,40,0,0 +34,4,183801,0,13,0,4,0,0,0,0,0,14,0,0 +40,2,116218,5,10,4,0,4,0,1,0,0,45,0,0 +40,2,143069,1,9,1,8,1,0,0,0,0,40,0,0 +41,4,235951,10,15,1,3,1,0,0,0,0,50,0,1 +57,2,112840,5,10,1,5,1,0,0,0,0,50,0,1 +65,4,146454,3,14,1,3,1,0,0,0,1648,4,34,0 +52,3,43705,5,10,1,4,1,0,0,0,0,50,0,0 +59,2,122283,10,15,1,3,1,2,0,99999,0,40,3,1 +18,2,376647,1,9,0,2,3,0,0,2176,0,25,0,0 +48,2,101299,6,12,1,3,1,0,0,0,0,45,0,0 +45,2,96798,11,3,2,6,4,0,0,0,0,40,0,0 +24,2,194654,1,9,1,11,1,0,0,0,0,40,0,0 +27,0,206889,6,12,0,11,0,0,0,0,0,40,0,0 +40,2,226902,3,14,1,1,1,0,0,15024,0,50,0,1 +44,0,150755,0,13,1,0,1,0,0,5013,0,40,0,0 +24,2,200679,1,9,0,7,3,1,0,0,0,50,0,0 +71,2,183678,10,15,1,3,1,0,0,0,0,16,0,0 +17,2,33138,14,8,0,5,3,0,0,0,0,40,0,0 +57,1,57071,5,10,1,10,1,0,0,3137,0,40,0,0 +33,2,169496,1,9,1,2,1,0,0,0,0,40,0,0 +41,2,58124,1,9,1,4,1,0,0,0,0,40,0,0 +25,2,356344,0,13,0,0,3,0,1,0,0,40,0,0 +42,1,444134,1,9,1,7,1,0,0,0,0,15,0,0 +34,2,219619,1,9,0,2,0,0,0,0,0,40,0,0 +27,4,331046,0,13,0,3,0,0,1,0,0,45,0,0 +24,2,100345,0,13,0,3,3,0,0,0,0,20,0,0 +23,2,205653,0,13,0,2,3,0,0,0,0,30,0,0 +33,2,112383,5,10,1,3,1,0,0,0,0,40,0,0 +58,5,21626,9,11,2,5,0,0,0,2202,0,56,0,0 +25,2,135568,4,5,1,2,1,0,0,0,0,40,0,0 +44,2,190532,3,14,0,3,0,0,1,0,0,55,0,0 +53,3,266598,1,9,1,3,1,0,0,0,0,40,0,1 +38,4,116608,1,9,1,0,2,0,1,0,0,35,0,1 +36,2,353263,0,13,0,3,0,0,1,0,0,45,0,1 +25,0,157617,1,9,0,1,0,0,0,0,0,40,0,0 +54,3,21698,0,13,2,1,4,0,1,0,0,40,0,0 +31,2,77143,14,8,4,6,4,1,0,0,0,40,0,0 +18,0,342852,1,9,0,0,3,0,0,0,0,40,0,0 +40,2,176602,1,9,2,4,0,1,0,0,0,40,0,0 +26,2,146343,5,10,1,5,2,1,1,0,0,40,0,0 +33,2,221966,0,13,0,3,0,0,0,2202,0,50,0,0 +22,2,215546,6,12,0,1,0,0,0,0,0,55,0,0 +50,0,173020,5,10,1,10,1,0,0,0,0,40,0,0 +44,2,252202,1,9,2,0,0,0,1,0,0,40,0,0 +37,2,497300,1,9,0,4,4,1,0,0,0,40,0,0 +34,1,426431,0,13,1,10,1,0,0,0,0,40,0,0 +45,3,162410,5,10,6,9,0,0,1,0,0,45,0,1 +25,2,190350,12,6,1,4,3,0,1,0,0,35,0,0 +20,2,194504,5,10,4,5,4,1,1,0,0,40,0,0 +46,3,110884,1,9,0,0,0,3,0,0,0,40,0,0 +26,2,187652,6,12,0,9,3,0,0,0,0,40,0,0 +45,2,81400,15,2,1,4,2,0,1,0,0,25,22,0 +57,2,180920,1,9,1,6,1,0,0,0,0,40,0,1 +28,2,189186,9,11,0,5,0,0,0,0,0,40,0,0 +36,2,607848,5,10,1,5,1,0,0,7688,0,45,0,1 +32,2,207301,1,9,0,2,0,0,1,0,0,40,0,0 +29,2,293073,0,13,0,5,0,0,0,0,0,50,0,1 +36,2,210452,0,13,2,3,4,0,0,0,0,45,0,0 +19,2,41400,1,9,0,2,3,0,0,0,0,30,0,0 +27,2,164170,0,13,0,9,4,2,1,0,0,20,11,0 +48,2,112906,3,14,1,6,1,0,0,0,0,55,0,1 +49,1,126268,0,13,1,10,1,0,0,0,0,50,0,0 +55,2,208311,3,14,1,9,1,0,0,0,1977,20,0,1 +61,2,28291,1,9,2,7,0,0,1,0,0,82,0,0 +42,4,121998,5,10,1,1,1,0,0,15024,0,40,0,1 +42,3,31621,6,12,2,0,0,0,1,0,0,40,0,0 +30,4,108386,9,11,1,11,1,0,0,0,0,40,0,0 +32,1,134727,1,9,1,8,1,0,0,0,0,40,0,0 +37,2,208391,5,10,1,6,1,0,0,0,0,40,0,1 +35,2,112271,5,10,1,10,1,0,0,0,0,45,0,0 +30,2,173350,9,11,3,0,0,0,1,0,0,40,0,0 +30,2,243190,10,15,1,3,1,2,0,0,0,20,3,1 +55,2,185436,5,10,1,1,1,0,0,0,0,70,0,1 +36,2,290409,5,10,1,6,1,0,0,0,0,40,0,0 +33,2,80058,1,9,0,4,3,0,0,0,0,48,0,0 +56,4,370045,0,13,1,3,1,0,0,0,0,40,0,1 +26,2,36936,9,11,1,10,1,0,0,0,2002,40,0,0 +37,2,231180,1,9,1,8,1,0,0,0,0,40,0,0 +28,2,119793,1,9,0,5,3,0,0,0,0,60,0,0 +38,2,102178,1,9,1,6,1,0,0,0,0,50,0,0 +48,2,232840,5,10,6,0,4,0,1,0,0,43,0,0 +35,2,33975,6,12,1,10,1,0,0,0,0,40,0,0 +39,4,256997,0,13,1,10,1,0,0,0,0,40,0,0 +64,2,298301,1,9,1,4,1,0,0,0,0,40,0,0 +22,2,310380,1,9,0,0,4,1,1,0,0,40,0,0 +45,4,182100,0,13,1,5,1,0,0,0,0,40,0,1 +27,2,501172,11,3,1,6,1,0,0,0,0,40,4,0 +43,0,143939,1,9,2,0,4,0,1,0,0,50,0,1 +23,2,85088,5,10,0,4,3,0,1,0,0,37,0,0 +25,2,282313,12,6,0,2,3,1,0,0,1602,40,0,0 +39,2,230054,3,14,1,3,1,0,0,0,0,50,0,1 +63,2,236338,1,9,1,5,2,0,1,0,0,35,0,0 +37,2,321943,10,15,1,3,1,0,0,0,0,40,0,1 +26,3,218782,1,9,1,0,1,4,0,0,0,40,0,0 +33,2,191385,0,13,0,3,0,0,0,0,0,40,8,0 +28,2,126129,5,10,0,0,0,0,1,0,0,40,0,0 +20,2,199268,5,10,0,4,3,0,1,0,0,20,0,0 +34,2,255693,1,9,1,0,2,0,1,0,0,20,0,0 +34,2,203488,5,10,1,6,1,0,0,0,0,40,0,0 +41,2,203233,1,9,1,1,1,0,0,0,0,40,0,1 +38,2,203836,5,10,1,5,1,0,0,0,0,50,0,1 +36,2,187847,0,13,1,1,1,0,0,7688,0,40,0,1 +38,2,116358,5,10,1,4,1,2,0,0,0,40,11,0 +46,5,198660,0,13,1,5,1,0,0,99999,0,72,0,1 +43,1,89636,0,13,1,5,2,2,1,0,0,60,27,0 +49,2,120629,5,10,6,5,4,0,1,0,0,30,0,0 +26,4,150226,0,13,0,3,3,0,1,0,0,35,0,0 +28,2,137898,1,9,2,0,0,0,1,0,0,35,0,0 +54,5,146574,1,9,1,10,1,0,0,0,0,40,0,1 +24,2,142022,5,10,0,2,3,0,0,0,0,50,0,0 +23,2,284898,5,10,0,1,3,0,0,0,0,30,0,0 +55,4,212448,1,9,2,0,0,0,1,0,0,40,0,0 +58,1,203039,4,5,4,10,0,0,0,0,0,40,0,0 +19,2,105289,12,6,0,4,5,1,1,0,0,20,0,0 +45,2,242994,5,10,0,5,0,0,0,0,0,52,0,0 +30,2,196385,5,10,1,10,1,0,0,0,0,45,0,1 +76,2,116202,1,9,6,4,4,0,1,0,0,33,0,0 +47,2,140045,1,9,4,0,4,0,1,0,0,40,0,0 +34,2,133503,5,10,2,6,0,0,0,2174,0,40,0,0 +40,2,226585,5,10,1,0,2,0,1,0,0,35,0,1 +24,2,85041,1,9,4,4,4,0,1,0,0,25,0,0 +30,2,162442,0,13,1,3,2,0,1,7688,0,50,0,1 +67,2,279980,5,10,1,6,1,0,0,10605,0,10,0,1 +24,2,216563,1,9,1,8,2,0,1,0,0,40,0,0 +43,4,231964,5,10,2,0,4,0,1,0,0,40,0,0 +29,2,263855,14,8,0,10,4,0,0,0,0,40,0,0 +40,2,124915,1,9,1,8,1,0,0,0,0,40,0,0 +61,3,178312,5,10,1,3,1,0,0,0,0,40,0,0 +45,4,215862,8,16,1,1,1,0,0,7688,0,45,0,1 +21,0,39236,5,10,0,9,0,0,1,0,0,50,0,0 +58,2,349910,1,9,1,1,1,0,0,7688,0,40,0,1 +52,2,75839,5,10,1,9,1,0,0,0,0,40,0,0 +34,2,176711,1,9,0,0,3,0,0,0,0,40,0,0 +20,2,266525,5,10,0,3,5,1,1,594,0,20,0,0 +46,2,331776,1,9,1,8,1,0,0,0,0,40,0,0 +54,2,111469,5,10,2,1,0,0,1,0,0,40,0,0 +43,0,198965,3,14,1,3,1,0,0,0,0,40,0,1 +25,2,288185,4,5,1,8,1,0,0,0,0,40,4,0 +21,2,198050,6,12,0,0,0,0,1,0,0,25,0,0 +65,2,242580,5,10,2,3,0,0,0,11678,0,50,0,1 +37,2,173128,1,9,2,4,0,0,0,0,0,40,0,0 +29,2,87905,1,9,2,4,0,0,0,10520,0,40,0,1 +44,2,173704,0,13,1,1,1,0,0,0,0,40,0,1 +37,3,93225,5,10,1,0,1,0,0,7688,0,40,0,1 +38,2,323269,5,10,1,4,2,1,1,0,0,40,0,0 +35,2,158046,5,10,1,5,1,0,0,5013,0,70,0,0 +32,2,133503,1,9,1,0,1,0,0,0,0,40,0,0 +44,1,172296,5,10,4,5,4,0,0,0,0,60,0,0 +23,2,176486,5,10,0,4,5,0,1,0,0,25,0,0 +25,5,182750,0,13,0,5,0,0,0,0,0,45,0,1 +23,2,82497,5,10,0,5,3,0,1,0,0,28,0,0 +47,2,208872,5,10,1,10,1,0,0,0,0,40,0,0 +47,2,145269,2,7,2,10,0,0,1,0,0,45,0,0 +25,2,19214,1,9,0,2,0,0,0,0,0,40,0,0 +35,2,149347,5,10,1,10,1,0,0,0,0,45,0,0 +50,2,158294,9,11,1,9,1,0,0,3103,0,40,0,1 +47,2,152073,1,9,2,8,4,0,1,0,0,40,0,0 +35,2,189623,8,16,1,1,1,0,0,0,0,45,0,1 +24,2,341368,1,9,0,0,0,0,0,0,0,40,0,0 +21,2,201603,1,9,0,8,3,0,0,2176,0,40,0,0 +35,2,270572,0,13,2,3,0,0,1,0,0,40,0,1 +30,2,285295,0,13,1,4,2,2,1,0,0,40,11,0 +17,2,126779,2,7,0,4,3,1,0,0,0,20,0,0 +27,2,373499,11,3,0,4,0,0,0,0,0,60,22,0 +22,2,244773,1,9,0,5,3,1,1,0,0,15,0,0 +22,0,96862,5,10,0,0,3,0,1,0,0,40,0,0 +50,2,162632,1,9,1,10,1,0,0,0,0,2,0,0 +51,1,159755,9,11,1,9,1,0,0,0,0,38,0,1 +27,2,37088,0,13,1,9,1,0,0,0,0,30,0,0 +27,2,335421,0,13,0,3,0,0,1,0,0,20,0,0 +20,0,349365,1,9,0,4,0,0,1,0,0,40,0,0 +42,2,33002,1,9,1,1,1,0,0,0,0,48,0,0 +32,2,330715,1,9,1,10,1,0,0,99999,0,40,0,1 +45,2,146857,0,13,1,1,1,0,0,0,0,38,0,1 +35,2,275522,7,4,6,4,4,0,1,0,0,80,0,0 +22,2,43646,1,9,1,10,3,0,0,0,0,40,0,0 +34,2,154548,5,10,0,0,4,0,1,0,0,38,0,0 +28,2,47907,0,13,0,0,0,0,1,0,0,40,0,0 +38,2,238397,0,13,2,13,4,0,1,0,0,24,0,0 +48,4,195949,5,10,1,11,1,0,0,0,0,42,0,1 +34,2,349169,3,14,1,10,1,0,0,0,0,40,4,0 +25,2,158662,1,9,1,0,2,0,1,0,0,50,0,1 +23,4,23438,1,9,0,3,0,0,1,0,0,40,0,0 +38,2,107302,5,10,1,5,1,0,0,0,0,60,0,1 +43,2,174196,1,9,0,4,4,1,1,0,0,40,0,0 +49,4,226871,1,9,1,8,1,1,0,0,0,40,0,1 +23,2,124971,5,10,2,0,0,0,0,0,0,40,0,0 +57,2,214061,1,9,2,0,0,0,1,0,0,40,0,0 +24,2,441700,0,13,0,9,3,0,0,0,0,40,0,0 +44,5,104892,5,10,1,10,1,0,0,0,0,58,0,1 +34,2,234386,6,12,2,10,0,0,0,0,0,50,0,0 +29,4,188278,5,10,1,3,1,0,0,0,0,40,0,0 +29,2,244395,2,7,0,4,4,1,1,0,0,40,0,0 +35,2,30916,1,9,1,6,1,0,0,0,0,50,0,1 +48,2,219565,1,9,1,10,1,0,0,0,0,40,0,0 +38,2,377486,1,9,0,10,0,0,0,0,0,36,0,0 +42,4,137232,1,9,2,11,4,0,1,0,0,50,0,0 +53,2,233369,5,10,6,1,4,0,1,0,0,40,0,0 +29,2,71067,10,15,0,3,0,0,1,0,0,55,0,0 +59,2,195176,0,13,1,5,1,0,0,0,0,72,0,0 +31,2,98639,1,9,0,10,4,0,0,0,0,40,0,0 +34,2,183778,1,9,1,10,1,0,0,0,0,40,0,0 +51,2,123011,0,13,2,1,0,0,0,0,2559,50,0,1 +25,2,164938,1,9,0,8,3,0,0,4416,0,40,0,0 +30,2,206046,1,9,1,10,1,0,0,0,1848,40,0,1 +46,2,81497,1,9,2,2,0,0,1,0,0,48,0,0 +45,2,189225,1,9,0,4,4,1,1,0,0,40,0,0 +23,2,141264,5,10,0,1,5,1,1,0,0,40,0,0 +33,2,97939,6,12,2,8,0,0,1,0,0,42,0,0 +44,2,160829,0,13,1,9,2,0,1,0,0,20,0,1 +25,2,483822,1,9,0,4,3,0,0,0,0,40,22,0 +48,0,148738,5,10,2,4,3,0,0,0,0,40,0,0 +23,2,289982,1,9,0,5,0,0,1,0,0,40,0,0 +33,1,58702,9,11,1,3,2,0,1,3103,0,50,0,1 +20,2,146706,5,10,1,5,5,0,1,0,0,30,0,0 +23,2,420973,0,13,0,3,0,0,1,0,0,40,0,0 +71,2,124959,1,9,6,0,0,0,1,0,0,40,0,0 +22,0,121471,0,13,0,3,0,0,1,0,0,40,0,0 +36,2,198237,0,13,1,3,1,0,0,15024,0,50,0,1 +27,2,280758,2,7,0,10,5,0,0,0,0,60,0,0 +40,2,191544,1,9,0,4,0,0,1,0,0,35,0,0 +30,2,261023,5,10,2,8,4,0,0,0,0,50,0,0 +30,0,231043,9,11,1,11,1,0,0,0,0,40,0,0 +30,2,340917,5,10,1,8,1,0,0,0,0,40,0,0 +35,2,167140,0,13,1,3,1,0,0,5013,0,40,0,0 +39,2,370795,1,9,0,0,4,1,1,0,0,40,0,0 +39,3,209609,1,9,1,0,1,0,0,0,0,50,0,0 +74,2,209454,11,3,1,6,1,1,0,0,0,40,0,0 +32,5,78530,5,10,1,1,1,0,0,15024,0,50,0,1 +25,2,88922,1,9,1,6,1,1,0,0,0,40,0,0 +64,2,86972,5,10,2,1,4,0,1,0,0,40,0,0 +47,1,165468,1,9,1,8,1,0,0,7298,0,40,0,1 +37,2,134367,0,13,1,1,2,0,1,0,0,37,0,1 +47,2,199058,1,9,1,10,1,0,0,0,0,40,0,1 +33,2,183612,1,9,1,8,1,0,0,0,0,40,0,1 +40,2,191982,9,11,2,3,4,0,1,0,0,40,0,1 +22,2,514033,1,9,0,4,0,1,0,0,0,80,0,0 +56,2,172364,1,9,1,8,1,0,0,0,0,40,0,0 +37,2,190105,1,9,0,0,3,0,1,0,0,55,0,0 +30,5,119422,5,10,1,1,1,0,0,0,0,70,0,0 +20,2,236592,14,8,0,3,0,0,1,0,0,35,25,0 +53,0,43952,3,14,1,1,1,0,0,15024,0,38,0,1 +43,2,194636,0,13,1,10,1,0,0,0,0,48,0,1 +23,2,235853,1,9,1,6,1,0,0,0,0,40,0,0 +43,1,150528,1,9,1,10,1,0,0,0,0,30,0,0 +30,2,213722,1,9,0,2,3,0,0,0,0,40,0,0 +20,2,41432,5,10,0,0,3,0,1,0,0,46,0,0 +22,2,285775,9,11,0,10,3,0,0,0,0,40,0,0 +38,2,470663,0,13,0,1,0,0,0,0,0,50,0,0 +54,1,114520,5,10,1,5,1,0,0,0,0,40,0,0 +23,2,113466,1,9,0,10,0,0,0,0,0,40,0,0 +46,2,224559,1,9,1,6,1,1,0,0,0,40,0,0 +59,2,186385,12,6,1,8,1,0,0,0,0,40,0,0 +41,4,384236,9,11,0,4,0,0,0,0,0,40,0,0 +42,2,181265,9,11,1,6,1,0,0,0,0,48,0,0 +58,2,190997,5,10,1,1,1,0,0,0,0,40,0,1 +24,2,98287,1,9,1,5,1,0,0,0,0,50,0,0 +39,2,103456,0,13,1,0,1,0,0,0,0,45,0,1 +28,2,184723,0,13,0,9,0,0,1,0,1980,35,0,0 +25,2,165622,3,14,0,5,0,0,0,0,0,55,0,0 +29,2,101597,5,10,2,5,4,0,1,0,0,54,0,0 +53,2,146378,11,3,1,10,1,0,0,0,0,40,0,0 +63,4,152163,1,9,1,11,1,0,0,0,0,40,0,0 +26,0,106812,9,11,2,1,0,0,1,0,0,38,0,0 +21,2,148211,1,9,0,2,0,0,0,3674,0,50,0,0 +45,2,187581,5,10,1,10,1,0,0,0,0,40,0,1 +29,2,135296,9,11,0,0,3,0,1,0,0,40,0,0 +72,4,144515,8,16,1,1,1,0,0,0,1258,40,0,0 +51,2,210736,12,6,3,10,5,0,0,0,0,40,0,0 +21,2,210165,4,5,3,2,3,0,0,0,0,40,0,0 +38,2,224584,5,10,2,5,4,1,1,0,0,40,0,0 +38,2,80771,0,13,1,3,2,0,1,0,0,40,0,1 +46,2,164733,3,14,1,3,1,0,0,0,0,41,0,0 +31,1,119411,0,13,2,1,4,0,0,0,0,60,0,1 +68,4,177596,12,6,4,4,0,1,1,0,0,90,0,0 +21,2,185251,1,9,0,5,3,0,0,0,0,40,0,0 +44,2,173590,0,13,1,3,1,0,0,0,0,3,0,0 +56,3,196307,8,16,1,3,1,0,0,0,0,40,0,1 +36,2,175232,1,9,1,10,1,0,0,5178,0,40,0,1 +21,2,51047,1,9,0,0,0,0,1,0,0,25,0,0 +21,2,334618,5,10,0,11,0,1,1,99999,0,40,0,1 +52,4,152795,5,10,1,10,1,0,0,0,0,40,0,0 +56,5,205601,8,16,1,3,1,0,0,99999,0,70,0,1 +52,2,129177,0,13,6,4,0,0,1,0,2824,20,0,1 +51,1,121548,0,13,1,1,1,0,0,0,0,25,0,0 +29,2,244566,1,9,2,8,4,0,0,0,0,40,0,0 +36,2,75073,5,10,0,10,0,1,0,0,0,55,0,0 +29,2,179008,1,9,1,7,1,0,0,0,0,55,0,0 +21,2,170800,1,9,0,5,3,0,1,0,0,30,0,0 +58,2,373344,15,2,1,7,1,0,0,0,0,40,0,0 +37,2,127961,1,9,0,8,0,0,0,0,0,40,0,0 +50,2,99392,5,10,2,10,0,1,1,0,0,45,0,0 +30,2,392812,1,9,0,2,0,0,0,0,0,50,9,0 +29,2,262478,1,9,0,7,3,1,0,0,0,30,0,0 +48,1,32825,1,9,1,10,1,0,0,0,0,40,0,0 +50,1,167380,7,4,1,7,1,0,0,0,0,40,0,0 +39,2,203204,6,12,1,0,2,0,1,0,0,25,0,1 +35,3,105138,10,15,1,3,1,0,0,0,0,55,0,0 +54,2,145714,1,9,1,9,1,0,0,7688,0,25,0,1 +24,2,182276,1,9,1,4,2,0,1,0,0,25,0,0 +20,2,275385,1,9,0,2,5,0,0,0,0,45,0,0 +30,1,292472,5,10,1,5,1,3,0,0,0,55,0,1 +19,1,73514,1,9,0,0,3,2,1,0,0,30,0,0 +26,2,199600,1,9,0,5,0,1,0,0,0,40,0,0 +38,2,111499,1,9,1,5,1,0,0,0,1977,99,0,1 +25,2,202560,5,10,0,4,0,0,1,0,0,40,0,0 +33,2,99309,5,10,2,10,4,0,0,0,0,50,0,0 +60,4,124987,0,13,1,3,1,0,0,7298,0,40,0,1 +30,2,287986,5,10,0,2,0,0,0,0,0,40,0,0 +30,2,119411,0,13,0,3,0,0,0,0,0,40,0,0 +19,2,198668,7,4,0,4,0,0,1,0,0,40,0,0 +23,2,117583,1,9,0,10,3,0,0,0,0,40,0,0 +27,2,234664,5,10,1,3,1,0,0,0,0,40,0,1 +39,0,176949,6,12,1,11,1,0,0,0,0,52,0,0 +33,2,189710,7,4,1,7,1,0,0,0,0,45,4,0 +65,2,205309,1,9,1,7,1,0,0,0,0,24,0,0 +34,2,195576,0,13,1,1,1,0,0,0,0,50,0,1 +20,2,216825,1,9,0,5,3,0,1,0,0,25,4,0 +25,2,197036,12,6,0,10,3,0,0,0,0,40,0,0 +28,2,181291,0,13,0,1,0,0,1,0,1564,50,0,1 +31,2,206512,2,7,0,2,3,0,0,0,0,25,0,0 +28,0,38309,0,13,0,3,3,0,0,6849,0,40,0,0 +37,2,312766,1,9,2,4,0,0,1,0,0,40,0,0 +52,2,139671,5,10,1,1,1,0,0,0,1977,50,0,1 +66,3,38621,9,11,6,4,4,1,1,3273,0,40,0,0 +31,2,124827,1,9,0,4,0,0,0,0,0,40,0,0 +37,2,77820,0,13,1,1,1,0,0,0,0,50,0,1 +45,3,56904,0,13,1,0,1,0,0,5013,0,45,0,0 +45,2,190115,6,12,2,1,4,0,0,0,0,40,0,0 +44,2,106682,1,9,1,5,1,0,0,0,0,60,0,0 +32,4,42596,0,13,2,3,0,0,0,0,0,40,0,0 +35,2,143058,1,9,1,8,1,0,0,0,0,60,0,1 +53,2,102615,2,7,2,6,0,0,0,0,0,40,8,0 +54,2,139703,5,10,1,10,1,0,0,3103,0,40,9,1 +43,2,240124,9,11,1,10,1,0,0,0,0,40,0,0 +30,2,132565,5,10,0,10,4,0,0,0,0,40,0,0 +49,2,323798,5,10,2,1,0,0,0,3325,0,50,0,0 +52,2,96359,8,16,1,1,1,0,0,0,0,57,0,1 +20,2,165201,5,10,0,0,3,0,1,0,0,4,0,0 +60,3,165630,1,9,1,9,1,0,0,0,1977,40,0,1 +45,2,264526,6,12,2,8,3,0,0,0,0,40,0,0 +48,2,102359,0,13,1,1,1,0,0,7298,0,60,0,1 +28,2,37359,0,13,1,5,1,0,0,0,0,60,0,1 +48,4,115497,5,10,1,1,1,0,0,0,0,40,0,0 +32,2,157747,5,10,1,9,1,0,0,0,0,45,0,0 +27,1,41099,1,9,0,10,0,0,0,0,0,30,0,0 +38,2,472604,0,13,1,4,1,0,0,0,0,35,4,0 +33,2,348618,11,3,3,6,4,4,0,0,0,20,22,0 +43,2,135606,3,14,2,1,0,0,1,0,0,50,0,1 +36,2,248445,1,9,4,6,5,0,0,0,0,60,4,0 +38,2,112093,2,7,1,6,1,0,0,0,0,40,0,0 +24,4,197552,1,9,0,9,0,0,1,0,0,40,0,0 +22,2,303822,12,6,0,10,3,0,0,0,0,40,0,0 +30,2,288566,0,13,0,4,0,0,0,0,0,40,0,0 +46,1,43348,10,15,1,1,1,0,0,15024,0,55,0,1 +39,0,239409,1,9,1,11,1,0,0,0,0,50,0,0 +50,2,337606,1,9,1,8,1,0,0,0,1485,40,0,0 +34,2,32528,9,11,3,0,4,0,1,0,974,40,0,0 +47,0,118447,0,13,1,3,1,0,0,0,0,60,0,1 +46,2,234690,1,9,1,5,1,0,0,0,0,40,0,0 +43,2,216042,5,10,2,9,3,0,1,0,1617,72,0,0 +45,2,190482,1,9,2,8,4,0,0,0,0,40,0,0 +55,2,381965,0,13,1,10,5,0,0,0,0,40,0,0 +68,2,186943,1,9,1,10,1,0,0,0,0,8,0,0 +39,2,142707,9,11,1,8,1,0,0,0,0,40,0,0 +39,2,53447,1,9,2,7,0,0,1,0,0,40,0,0 +37,2,127772,0,13,0,10,0,0,0,0,0,40,0,0 +19,2,344414,5,10,0,6,3,0,0,0,0,40,0,0 +20,2,194138,2,7,0,10,3,0,0,0,0,20,0,0 +33,2,150154,5,10,1,10,1,0,0,0,0,40,0,0 +21,2,306114,1,9,0,4,0,0,0,0,0,35,0,0 +58,4,368797,3,14,6,3,4,0,0,0,0,35,0,1 +43,5,175715,1,9,0,1,0,1,0,0,0,55,0,0 +62,2,416829,2,7,4,4,0,1,1,0,0,21,0,0 +21,2,350001,5,10,0,7,3,0,0,0,0,20,0,0 +26,2,339952,5,10,1,1,1,0,0,0,0,60,0,0 +27,2,114967,4,5,1,10,1,0,0,0,0,40,0,0 +34,2,164190,5,10,1,3,1,0,0,0,1902,38,0,1 +49,4,166039,1,9,2,4,4,0,1,0,0,40,0,0 +28,2,250135,1,9,0,3,5,0,1,0,0,40,0,0 +34,1,234960,0,13,1,3,1,1,0,0,1887,48,0,1 +29,2,103628,5,10,1,0,2,0,1,0,0,40,0,1 +58,2,430005,12,6,1,6,1,0,0,0,0,50,0,1 +45,5,106517,1,9,2,1,0,0,1,0,0,40,0,0 +47,1,162236,0,13,0,10,0,0,1,0,0,40,0,0 +53,2,92430,1,9,1,10,1,0,0,0,0,40,0,1 +52,4,40641,12,6,1,10,1,0,0,5013,0,40,0,0 +47,2,169388,2,7,2,4,4,0,1,0,0,15,0,0 +36,4,410034,0,13,1,3,1,0,0,0,1887,40,0,1 +48,2,237525,0,13,1,1,1,0,0,7688,0,65,0,1 +35,2,150057,5,10,1,1,1,0,0,0,0,40,0,1 +49,2,148549,0,13,1,1,1,0,0,0,1902,50,0,1 +43,2,75742,5,10,1,6,1,0,0,0,0,45,0,0 +33,2,177675,0,13,1,1,1,0,0,0,0,50,9,1 +49,4,193249,6,12,1,0,1,0,0,0,0,40,0,0 +17,2,266072,12,6,0,4,0,0,0,0,0,20,22,0 +25,2,339324,0,13,0,9,0,0,0,0,0,40,0,0 +41,1,284086,9,11,2,5,0,0,0,0,0,60,0,0 +31,2,206051,0,13,1,0,1,0,0,0,0,40,0,1 +57,2,426263,3,14,2,1,4,0,0,0,0,40,0,1 +49,2,102583,5,10,1,3,1,0,0,0,1848,44,0,1 +40,2,277647,0,13,1,3,1,0,0,0,0,40,0,1 +55,2,124808,9,11,1,3,1,0,0,0,1977,50,9,1 +47,2,193061,5,10,2,1,0,0,0,0,0,60,0,0 +50,2,121411,14,8,2,6,0,0,0,0,0,40,0,0 +36,2,89202,0,13,0,3,3,0,0,0,0,50,0,0 +17,2,232900,2,7,0,2,3,0,0,0,0,25,0,0 +30,4,319280,1,9,1,11,1,0,0,0,0,40,0,1 +42,2,193494,1,9,1,8,1,0,0,0,0,40,0,1 +67,1,195066,1,9,1,7,1,0,0,0,0,50,0,0 +36,2,99146,1,9,1,8,1,0,0,0,0,45,0,1 +35,2,92028,3,14,1,1,1,0,0,0,0,50,0,1 +27,2,174419,0,13,0,3,0,0,1,0,0,40,0,0 +21,2,57916,7,4,0,8,3,0,0,0,0,40,0,0 +46,2,383384,1,9,1,3,1,0,0,0,0,40,0,0 +45,2,198223,0,13,1,5,1,0,0,0,1902,45,0,1 +20,2,109813,2,7,0,9,5,0,0,0,0,40,0,0 +17,2,174298,2,7,0,4,3,0,0,0,0,20,0,0 +40,2,45687,5,10,2,4,0,1,0,4787,0,50,0,1 +28,2,263614,0,13,1,1,1,0,0,0,0,40,0,1 +33,2,96128,2,7,0,10,3,0,0,0,0,40,0,0 +55,2,220262,1,9,2,5,0,0,1,0,0,40,0,0 +55,1,35340,5,10,1,10,1,0,0,0,0,50,0,0 +47,2,280483,1,9,4,10,4,1,1,0,0,40,0,0 +52,5,254211,3,14,1,3,1,0,0,15024,0,60,0,1 +29,2,351324,5,10,0,5,4,0,1,0,0,40,0,0 +36,2,58602,11,3,0,4,0,0,0,0,0,35,0,0 +37,2,64922,0,13,4,4,0,0,0,0,0,70,7,0 +41,3,185616,1,9,0,0,0,0,1,0,1980,40,0,0 +43,2,185832,5,10,1,8,1,0,0,0,0,48,0,1 +24,2,254767,7,4,1,7,1,0,0,2105,0,50,0,0 +39,3,32312,0,13,0,3,0,0,1,0,0,60,0,0 +47,1,109421,0,13,1,1,1,0,0,0,0,50,0,0 +42,2,183205,1,9,2,1,4,0,1,0,0,45,0,0 +39,2,156897,1,9,0,10,3,0,0,0,2258,42,0,1 +48,4,145886,0,13,2,3,4,0,1,0,0,60,0,0 +47,4,29819,3,14,1,1,1,1,0,0,1977,50,0,1 +27,2,244566,12,6,1,2,1,0,0,0,0,40,0,0 +29,2,253801,1,9,1,10,1,0,0,0,0,40,16,0 +22,2,181313,9,11,0,4,0,0,1,0,0,30,0,0 +37,0,150566,1,9,4,10,0,0,0,0,0,44,0,0 +38,2,237713,0,13,1,1,1,0,0,0,0,60,0,0 +32,2,112137,13,1,1,8,2,2,1,4508,0,40,14,0 +48,4,187969,3,14,2,3,4,0,1,0,0,80,0,0 +46,1,224108,1,9,1,1,2,0,1,0,0,50,0,0 +51,2,174754,1,9,0,4,0,1,1,0,0,38,0,0 +28,5,219705,0,13,1,1,1,0,0,5013,0,55,0,0 +35,2,167062,1,9,1,0,1,0,0,0,0,40,0,0 +18,2,190325,2,7,0,10,3,0,0,0,0,30,0,0 +45,2,108859,1,9,4,10,4,1,1,0,0,40,0,0 +36,1,344351,1,9,0,6,3,0,0,0,0,40,0,0 +73,2,153127,5,10,6,13,4,0,1,0,0,10,0,0 +52,2,180881,0,13,1,1,1,0,0,0,0,40,0,0 +17,2,183066,12,6,0,4,3,0,1,0,0,40,0,0 +29,3,339002,9,11,1,10,1,0,0,0,0,40,0,1 +20,2,172047,5,10,0,7,3,0,0,0,0,10,0,0 +42,2,94600,1,9,1,10,1,0,0,5178,0,40,0,1 +37,2,302604,5,10,4,4,5,0,1,0,0,40,0,0 +40,2,248094,1,9,1,6,1,0,0,0,0,40,0,0 +32,2,36467,6,12,1,0,1,0,0,0,0,45,0,1 +29,2,53181,3,14,1,3,1,0,0,0,0,55,0,1 +20,2,181032,5,10,0,8,3,0,1,0,0,40,0,0 +26,2,248990,2,7,1,0,1,0,0,0,0,40,0,1 +25,2,40512,0,13,0,3,0,0,0,3674,0,30,0,0 +37,2,117381,1,9,1,9,1,0,0,0,0,80,0,1 +26,2,154966,5,10,1,10,1,0,0,0,0,40,5,0 +24,2,198259,1,9,0,5,3,0,1,0,0,30,0,0 +33,2,167939,1,9,1,4,3,0,1,0,0,25,0,0 +23,2,131275,1,9,0,10,3,3,0,0,0,40,0,0 +36,2,272950,5,10,0,5,0,0,0,0,0,50,0,0 +37,2,174503,0,13,6,3,0,0,1,0,0,50,0,0 +24,2,116800,9,11,0,8,3,0,0,0,0,35,0,0 +38,2,110713,6,12,1,10,1,0,0,0,0,50,0,1 +50,2,202044,0,13,2,3,4,0,1,0,0,45,0,0 +44,2,300528,2,7,1,0,1,0,0,0,0,40,0,1 +46,2,54985,1,9,1,8,1,0,0,0,1887,40,0,1 +57,2,133126,5,10,0,10,0,1,1,0,0,40,0,0 +37,2,74593,1,9,1,10,1,0,0,0,0,70,0,0 +44,2,302424,1,9,2,8,0,0,0,0,0,55,0,0 +21,2,344492,5,10,0,4,3,0,1,0,0,30,0,0 +31,2,349148,1,9,1,10,1,0,0,0,0,40,0,1 +32,2,222221,9,11,1,3,1,0,0,7298,0,42,0,1 +45,2,234699,1,9,3,4,4,1,1,0,0,60,0,1 +20,4,243178,1,9,0,2,3,0,0,0,0,40,0,0 +52,2,189728,1,9,4,13,0,0,1,0,0,50,0,0 +47,1,318593,1,9,1,1,1,0,0,0,0,25,0,0 +41,2,108681,5,10,1,0,2,0,1,0,0,40,0,0 +40,2,187376,5,10,1,5,1,0,0,0,0,60,0,1 +41,0,75409,0,13,1,3,2,0,1,0,0,40,0,1 +46,2,172581,0,13,1,1,1,0,0,0,1902,50,0,1 +49,2,266150,1,9,1,8,2,0,1,0,0,40,0,0 +50,2,135643,1,9,1,8,5,2,1,0,0,40,26,0 +59,2,46466,1,9,1,6,1,0,0,0,0,40,0,1 +18,2,130652,5,10,0,0,3,0,1,0,0,25,0,0 +47,4,114459,3,14,1,3,1,0,0,7688,0,45,0,1 +45,2,195554,1,9,1,8,1,0,0,0,0,45,0,1 +17,2,244589,2,7,0,5,3,0,1,0,0,40,0,0 +45,5,271901,1,9,1,5,1,0,0,0,0,32,0,1 +73,2,139978,2,7,1,8,1,0,0,0,0,40,0,0 +48,2,180446,12,6,1,8,1,1,0,0,0,40,0,0 +38,0,341643,6,12,0,1,0,0,0,0,0,60,0,0 +37,3,289653,1,9,1,0,1,0,0,0,0,50,0,1 +62,5,118725,1,9,1,1,1,1,0,20051,0,72,0,1 +26,2,187891,1,9,0,0,0,1,0,0,0,40,0,0 +46,5,116338,3,14,1,1,2,0,1,0,0,50,0,1 +46,2,102771,3,14,1,9,1,0,0,0,1977,40,0,1 +51,2,89652,1,9,2,0,4,0,1,4787,0,24,0,1 +54,3,439608,5,10,2,0,0,0,1,0,0,40,0,0 +65,2,330144,5,10,1,1,1,0,0,0,0,40,0,0 +29,2,251905,6,12,1,10,1,0,0,0,0,45,0,0 +37,2,218955,1,9,1,4,1,0,0,0,0,40,0,0 +36,1,188972,8,16,4,3,4,0,1,0,0,10,8,0 +60,1,25825,1,9,2,10,0,0,0,0,0,50,0,1 +33,2,202046,0,13,0,2,0,0,0,0,2001,40,0,0 +62,2,116104,1,9,6,0,0,0,1,0,0,20,9,0 +20,2,194891,1,9,0,0,0,0,1,0,0,40,0,0 +37,2,125550,1,9,0,9,0,0,1,14084,0,35,0,1 +66,2,116468,3,14,1,3,1,0,0,2936,0,20,0,0 +29,0,409201,5,10,1,0,1,0,0,0,0,40,0,0 +70,5,379819,5,10,1,5,1,0,0,10566,0,40,0,0 +74,2,97167,1,9,1,4,1,0,0,0,0,15,0,0 +51,1,115851,1,9,1,10,1,0,0,0,0,40,0,0 +50,2,118058,5,10,1,6,1,0,0,0,0,50,0,0 +42,2,258589,1,9,0,5,0,0,0,0,0,60,0,1 +26,2,158810,0,13,0,3,0,0,0,0,0,70,0,0 +27,4,92431,5,10,0,11,0,0,0,0,2231,40,0,1 +58,1,165695,1,9,2,1,0,0,0,0,0,70,0,0 +32,2,244147,0,13,0,3,0,0,0,0,1876,50,0,0 +66,5,253741,1,9,1,5,1,0,0,0,1825,10,0,1 +23,2,170482,5,10,0,5,3,0,0,0,0,45,0,0 +35,2,241001,1,9,1,8,1,0,0,0,0,44,0,0 +50,2,165001,0,13,1,10,1,0,0,0,0,50,0,0 +35,2,340260,1,9,2,10,4,0,1,0,0,48,0,0 +31,2,96480,1,9,0,0,0,0,1,0,0,50,0,0 +30,2,185177,2,7,0,2,3,0,0,0,0,49,0,0 +84,5,172907,5,10,1,5,1,0,0,0,0,35,0,1 +35,1,308874,1,9,0,10,0,1,0,0,0,40,0,0 +45,1,54098,9,11,1,7,1,0,0,0,0,50,0,1 +46,2,288608,1,9,0,10,3,0,0,0,0,40,0,0 +50,4,254148,5,10,1,7,1,0,0,0,0,40,4,0 +37,2,111128,2,7,0,8,0,0,0,0,0,40,0,0 +32,2,171116,1,9,2,4,3,0,1,0,0,40,0,0 +53,5,96062,0,13,1,1,1,0,0,0,1902,48,0,1 +27,3,276776,5,10,1,9,1,0,0,0,0,40,0,1 +22,2,152878,1,9,1,6,1,0,0,0,0,40,0,0 +29,2,149211,0,13,1,9,1,0,0,0,0,40,0,0 +35,2,58343,1,9,1,5,1,0,0,0,0,44,0,0 +38,2,127601,5,10,1,2,2,0,1,0,0,35,0,0 +29,2,357781,7,4,1,7,1,0,0,0,0,40,0,0 +26,2,137367,5,10,0,2,5,2,0,0,0,44,11,0 +34,2,110978,10,15,0,3,0,2,1,0,0,40,0,0 +31,2,34503,9,11,1,10,1,0,0,0,0,40,0,1 +30,2,84119,5,10,1,10,1,0,0,0,2051,40,0,0 +20,2,223515,5,10,0,4,3,0,0,0,0,40,0,0 +37,2,372525,3,14,2,3,4,0,0,0,0,48,0,0 +32,2,116365,1,9,1,0,2,0,1,0,0,20,0,0 +36,2,111268,6,12,2,5,4,0,1,0,0,40,0,0 +54,2,225599,3,14,1,3,1,2,0,7298,0,40,3,1 +46,1,199596,5,10,2,1,4,0,1,0,0,50,0,0 +18,2,301867,1,9,0,5,3,3,1,0,0,20,0,0 +57,2,191983,5,10,1,11,1,0,0,0,0,50,0,0 +37,2,105803,1,9,1,2,1,0,0,0,0,40,0,0 +43,2,456236,1,9,1,10,1,0,0,0,0,40,0,1 +45,2,116255,1,9,0,1,0,1,1,0,0,40,0,0 +32,2,235109,5,10,2,0,4,0,1,0,0,40,0,0 +38,3,91716,1,9,1,0,1,0,0,0,0,40,0,0 +25,2,121102,6,12,0,9,0,0,1,0,2001,30,0,0 +70,2,235781,5,10,2,7,0,2,0,0,0,40,36,0 +40,2,136986,5,10,1,8,1,0,0,0,0,50,0,1 +40,1,33658,1,9,2,10,0,0,0,0,0,40,0,0 +20,2,53878,1,9,0,10,4,0,0,0,0,40,0,0 +29,2,200928,1,9,1,1,1,0,0,0,0,40,0,1 +24,2,173736,9,11,0,10,0,0,0,0,0,55,0,0 +28,2,214385,9,11,0,1,3,1,1,0,0,40,0,0 +58,2,102509,12,6,2,6,0,1,0,0,0,50,0,0 +38,2,173047,0,13,2,0,4,2,1,0,213,40,11,0 +59,1,241297,5,10,6,7,0,0,1,6849,0,40,0,0 +18,2,329054,2,7,0,0,3,0,1,0,0,15,0,0 +40,2,274158,1,9,1,8,1,0,0,0,0,40,0,0 +39,5,241153,3,14,1,1,1,0,0,0,0,50,0,0 +45,2,229516,1,9,3,10,0,0,0,0,0,72,4,0 +24,0,247075,1,9,0,0,4,1,1,0,0,20,0,0 +22,2,315524,5,10,0,0,3,1,0,0,0,30,21,0 +23,2,126945,0,13,1,1,1,0,0,0,0,40,0,0 +39,1,29874,5,10,4,10,0,0,0,0,0,60,0,1 +28,2,115579,9,11,0,9,3,0,1,0,0,38,0,0 +51,2,29580,2,7,1,5,1,0,0,4386,0,30,0,1 +44,2,56483,0,13,0,0,3,0,1,0,0,37,0,0 +24,2,420779,1,9,1,7,1,1,0,0,0,35,0,0 +24,2,255474,2,7,1,5,1,0,0,0,0,40,0,0 +52,2,241444,15,2,1,10,1,4,0,0,0,50,5,0 +43,2,85995,1,9,0,2,0,0,0,0,0,40,0,0 +67,5,116986,14,8,1,1,1,0,0,0,0,20,0,0 +36,2,20507,1,9,1,10,1,0,0,7688,0,50,0,1 +43,2,184099,6,12,1,6,1,0,0,0,0,40,0,0 +31,2,117816,7,4,2,2,5,0,0,0,0,70,0,0 +23,2,263899,5,10,0,0,3,1,0,0,0,20,19,0 +26,2,45869,0,13,0,2,3,0,0,0,0,40,0,0 +48,2,186539,5,10,1,3,1,0,0,0,0,40,0,0 +40,2,326310,5,10,1,10,1,0,0,0,0,44,0,0 +55,4,84564,10,15,2,3,0,0,1,0,0,39,0,0 +49,2,247294,1,9,1,10,1,0,0,0,0,45,0,1 +34,2,72793,0,13,0,4,0,0,1,0,0,15,0,0 +29,2,261375,1,9,0,0,3,1,1,0,0,60,0,0 +50,2,77905,0,13,2,0,0,0,1,0,0,8,0,0 +19,2,66838,5,10,0,5,3,0,1,0,0,9,0,0 +63,0,194682,8,16,1,1,1,0,0,0,1902,50,0,1 +66,2,180211,0,13,1,10,1,2,0,0,0,30,11,0 +60,2,101198,9,11,2,4,0,0,0,0,0,20,0,0 +60,2,80574,1,9,2,4,4,0,1,0,0,38,0,0 +19,2,198663,1,9,0,9,3,0,0,0,0,40,0,0 +26,5,160340,1,9,1,1,1,0,0,0,0,60,0,0 +75,1,205860,5,10,1,10,1,1,0,0,1735,40,0,0 +58,0,69579,5,10,6,3,0,0,1,0,0,20,0,0 +18,1,379242,5,10,0,1,0,0,1,0,0,50,0,0 +65,2,113323,6,12,1,1,1,0,0,3818,0,40,0,0 +50,1,312477,1,9,1,1,1,0,0,0,1887,40,0,1 +26,2,259505,5,10,0,4,3,0,0,0,0,40,0,0 +45,3,171335,3,14,1,5,1,0,0,0,0,50,0,1 +29,3,155970,1,9,1,9,1,0,0,0,0,40,0,1 +52,2,99682,5,10,1,5,2,0,1,0,0,52,8,1 +23,2,117789,0,13,0,1,3,0,1,0,0,40,0,0 +21,2,296158,1,9,0,4,3,0,0,0,0,40,0,0 +48,4,78859,1,9,0,1,3,0,1,0,0,40,0,0 +50,2,189811,0,13,1,1,1,0,0,0,0,40,0,1 +41,0,518030,0,13,0,11,0,1,0,0,1590,40,5,0 +32,2,360593,1,9,2,5,4,1,1,0,0,30,0,0 +40,2,145504,1,9,1,7,1,1,0,0,0,40,0,0 +19,2,459248,1,9,0,2,0,0,0,0,0,30,0,0 +42,0,126094,1,9,4,0,4,0,0,0,0,39,0,0 +23,2,209483,0,13,0,0,3,0,1,0,0,50,0,0 +37,1,32239,1,9,2,7,0,0,0,27828,0,40,0,1 +21,2,210355,2,7,0,3,0,0,1,0,0,24,0,0 +28,2,84547,0,13,1,9,1,0,0,0,0,40,0,1 +20,2,105585,5,10,0,5,3,0,0,0,0,25,0,0 +21,2,132320,2,7,0,10,0,0,0,0,0,35,0,0 +21,2,129172,5,10,0,4,5,0,0,0,0,16,0,0 +45,1,222374,0,13,0,3,0,0,0,0,0,40,0,0 +49,5,201498,1,9,1,10,1,0,0,0,0,40,0,0 +53,5,251675,5,10,2,5,0,0,0,8614,0,50,1,1 +41,2,114157,1,9,2,8,3,0,0,0,0,40,0,0 +48,4,148121,0,13,3,0,4,2,1,0,0,40,11,0 +34,2,96480,5,10,4,1,4,0,1,0,0,40,0,0 +24,2,179423,1,9,0,0,3,0,1,0,0,40,0,0 +58,0,123329,1,9,0,0,0,0,1,0,0,16,0,0 +41,2,134130,0,13,1,5,1,0,0,0,0,50,0,1 +53,2,188644,13,1,1,4,1,0,0,0,0,40,4,0 +40,2,226388,1,9,1,10,1,1,0,0,0,40,0,0 +28,1,209205,5,10,1,10,1,0,0,7298,0,40,0,1 +32,2,209808,5,10,1,5,1,0,0,0,1740,47,0,0 +44,5,56236,5,10,0,1,0,1,0,2202,0,45,0,0 +18,2,28648,2,7,0,4,5,0,1,0,0,40,0,0 +37,0,34996,1,9,4,4,4,0,1,0,0,40,0,0 +43,2,281422,6,12,0,0,0,1,1,0,0,45,0,0 +22,2,214716,1,9,0,4,3,0,1,0,0,40,0,0 +28,2,314177,12,6,0,2,5,1,0,0,0,40,0,0 +51,2,112310,5,10,2,1,4,0,1,0,0,40,0,0 +63,2,203783,1,9,2,3,0,0,1,0,0,72,0,0 +29,2,205499,5,10,1,11,1,0,0,0,0,45,0,0 +44,2,145441,0,13,1,1,1,0,0,7298,0,48,0,1 +44,2,155701,7,4,4,4,4,0,1,0,0,38,30,0 +37,0,186934,5,10,1,4,1,0,0,0,0,40,0,0 +62,3,209433,1,9,1,0,1,1,0,0,0,40,0,0 +31,2,80933,1,9,1,10,1,0,0,0,0,52,0,0 +20,2,102607,1,9,0,2,3,0,0,0,0,30,0,0 +48,2,254809,12,6,2,8,4,0,1,0,1594,32,0,0 +24,1,102942,5,10,0,4,0,0,1,0,0,50,0,0 +56,0,175057,0,13,1,1,1,0,0,0,0,40,0,0 +36,3,68781,5,10,1,0,1,0,0,0,0,35,0,0 +29,2,108594,1,9,0,10,3,0,0,0,0,40,0,0 +34,2,98283,10,15,0,9,0,2,0,0,1564,40,3,1 +39,2,56269,5,10,0,10,3,1,0,0,0,40,0,0 +29,2,152503,5,10,0,2,0,1,0,0,0,45,0,0 +38,5,206951,1,9,1,1,1,0,0,0,0,65,0,0 +23,2,82393,4,5,0,4,3,2,0,0,0,20,11,0 +37,2,167396,1,9,1,4,1,0,0,0,0,40,24,0 +30,1,123397,5,10,2,4,4,0,1,0,0,30,0,0 +42,2,118652,6,12,1,9,1,0,0,0,0,40,0,0 +59,4,114401,1,9,6,4,0,0,1,0,1504,19,0,0 +45,2,186272,1,9,1,2,1,1,0,7298,0,40,0,1 +46,2,182689,5,10,1,5,1,0,0,0,0,40,0,0 +25,2,231016,3,14,0,3,0,0,1,4650,0,37,0,0 +41,5,60949,1,9,2,10,0,0,0,0,0,55,0,0 +49,2,129513,1,9,1,6,1,0,0,0,0,50,0,1 +37,2,84306,5,10,1,4,1,0,0,0,0,40,0,0 +31,2,117507,1,9,0,10,0,0,0,0,0,45,0,0 +22,2,88050,6,12,1,1,1,2,0,0,0,6,0,0 +22,2,305498,1,9,2,5,3,0,1,0,0,33,0,0 +17,2,295308,2,7,0,13,3,0,1,0,0,20,0,0 +47,2,114459,8,16,1,3,1,0,0,0,0,50,0,1 +17,2,176017,12,6,0,4,5,0,0,0,0,15,0,0 +39,2,248445,11,3,1,2,1,0,0,0,0,40,4,0 +23,2,214542,5,10,0,0,3,0,0,0,0,20,0,0 +41,2,384508,0,13,1,3,1,0,0,0,0,40,0,1 +36,3,403489,3,14,1,3,1,0,0,0,0,45,0,1 +52,2,143953,0,13,1,3,1,0,0,0,1902,40,0,1 +21,2,254904,1,9,0,10,0,0,1,0,0,30,0,0 +33,2,98995,12,6,2,2,0,0,1,0,0,36,0,0 +41,2,193995,1,9,0,10,0,0,0,0,0,44,0,0 +19,2,205829,1,9,0,5,3,0,1,0,0,35,0,0 +38,3,205852,1,9,0,0,0,0,0,0,0,45,0,1 +24,2,37072,5,10,0,10,0,0,0,0,0,40,0,0 +38,2,275338,0,13,2,5,4,0,1,1151,0,40,0,0 +39,0,122353,0,13,1,3,1,0,0,0,0,45,0,1 +19,2,100009,5,10,0,5,3,0,1,0,0,15,0,0 +42,2,135056,5,10,1,0,2,0,1,0,0,40,0,0 +29,2,280618,5,10,1,2,1,0,0,0,0,40,0,0 +17,2,226717,14,8,0,2,3,0,0,0,0,20,0,0 +47,4,173938,0,13,1,10,1,0,0,0,0,50,0,1 +24,2,291355,5,10,2,0,0,0,1,0,0,60,0,0 +61,3,160155,5,10,1,1,1,0,0,0,0,40,0,1 +40,1,29762,5,10,1,10,1,0,0,0,0,60,0,0 +59,2,172071,1,9,1,3,2,1,1,0,0,38,2,0 +29,2,166210,5,10,2,9,0,0,0,0,0,55,0,0 +26,2,330263,1,9,4,4,0,0,0,0,0,40,0,0 +46,2,247043,1,9,1,6,1,0,0,0,0,40,0,1 +56,3,155238,1,9,1,0,1,0,0,0,0,40,0,1 +25,2,130557,0,13,0,0,0,0,1,0,0,40,0,0 +17,2,56986,14,8,0,5,3,0,1,0,0,18,0,0 +29,2,220692,9,11,0,1,0,1,1,0,0,40,0,0 +23,2,121650,11,3,0,2,4,0,0,0,0,30,0,0 +67,2,174603,1,9,0,1,0,0,1,0,0,35,0,0 +29,2,341846,3,14,0,3,0,0,1,0,0,50,0,0 +33,2,99339,6,12,2,0,0,0,1,0,880,40,0,0 +32,2,34437,1,9,0,6,3,0,0,0,0,40,0,0 +34,2,141058,5,10,1,4,1,0,0,0,0,62,4,0 +49,2,192323,1,9,1,8,1,0,0,0,0,40,0,0 +39,2,28572,1,9,2,4,0,0,0,0,0,40,0,0 +41,2,120277,0,13,0,10,0,0,0,0,0,40,0,0 +31,2,164309,5,10,2,0,4,0,1,0,0,38,0,0 +47,3,102771,8,16,1,3,1,0,0,0,0,40,0,1 +27,2,147951,1,9,0,8,5,0,0,0,0,1,0,0 +23,2,188409,2,7,1,6,1,0,0,4508,0,25,0,0 +44,2,173888,7,4,1,6,1,0,0,0,0,80,0,1 +25,2,247006,6,12,1,1,1,0,0,0,0,45,0,0 +23,2,82889,5,10,0,0,3,0,1,0,0,16,0,0 +52,2,259363,1,9,1,10,1,0,0,0,0,50,0,1 +62,3,159165,1,9,6,1,0,0,1,0,0,36,0,0 +31,2,112062,0,13,0,3,0,0,1,0,0,40,0,0 +19,2,299050,2,7,1,10,1,0,0,0,0,60,0,0 +53,2,548580,5,10,1,10,1,0,0,0,0,40,24,0 +25,2,234057,1,9,0,10,0,0,1,0,0,40,0,0 +45,2,241350,1,9,0,6,0,0,0,0,0,40,0,0 +69,2,108196,4,5,0,10,5,0,0,2993,0,40,0,0 +49,2,278322,1,9,1,10,1,0,0,0,0,40,0,1 +42,2,157443,0,13,1,3,2,2,1,0,0,27,18,1 +44,1,37618,1,9,1,7,1,0,0,0,0,40,0,1 +56,4,238582,5,10,1,10,1,0,0,0,0,41,0,1 +37,0,28887,1,9,1,8,1,0,0,0,0,40,0,1 +37,2,77820,0,13,1,1,1,0,0,0,0,45,0,1 +22,2,110946,5,10,0,4,0,0,1,0,0,40,0,0 +34,4,230420,0,13,1,3,1,0,0,0,0,40,0,1 +36,2,206521,1,9,0,8,0,0,0,0,0,40,0,0 +28,4,283227,5,10,1,1,1,0,0,0,0,65,0,0 +28,2,141957,0,13,1,3,1,0,0,0,0,50,0,0 +73,4,161027,11,3,1,11,1,0,0,0,0,20,0,0 +37,1,31670,1,9,1,7,1,0,0,0,0,60,0,0 +24,2,205844,0,13,0,1,3,1,1,0,0,65,0,0 +30,0,46144,1,9,5,0,3,0,1,0,0,38,0,0 +38,2,168055,9,11,1,4,1,0,0,0,0,40,0,0 +50,2,98350,5,10,1,0,1,2,0,0,0,40,11,1 +43,2,208613,10,15,3,3,0,0,0,99999,0,40,0,1 +42,2,334522,1,9,1,2,1,1,0,0,0,40,0,0 +54,0,187686,5,10,2,0,0,0,1,0,0,38,0,0 +27,0,365916,6,12,0,1,0,0,1,0,0,58,0,0 +39,2,190719,5,10,2,5,0,0,0,0,0,45,0,0 +27,2,218184,5,10,0,0,0,1,1,0,0,40,2,0 +30,2,222162,1,9,1,2,1,0,0,0,0,66,0,0 +30,2,148524,1,9,1,6,1,0,0,0,2057,40,0,0 +37,2,267085,5,10,1,10,1,0,0,0,0,40,0,0 +50,3,307555,0,13,2,3,0,0,0,0,0,60,0,1 +36,2,229180,5,10,2,10,4,0,1,0,0,40,1,0 +22,2,279041,5,10,0,2,3,1,0,0,0,10,0,0 +21,2,312017,5,10,0,10,0,0,0,0,0,40,0,0 +33,2,54782,0,13,1,0,1,0,0,0,1579,42,0,0 +76,2,70697,7,4,6,4,0,0,1,0,0,25,0,0 +37,2,188774,0,13,1,0,1,0,0,0,0,40,0,0 +34,2,302770,5,10,1,5,1,0,0,0,0,60,0,0 +29,2,183639,1,9,1,7,1,0,0,0,0,97,0,0 +29,2,178551,1,9,1,6,1,0,0,0,0,40,0,0 +28,2,175343,0,13,1,5,1,0,0,0,0,40,0,0 +73,1,190078,5,10,1,1,1,0,0,0,0,35,0,0 +43,2,117627,5,10,2,1,0,1,1,0,0,40,0,0 +39,2,108419,5,10,1,10,1,0,0,0,0,40,0,0 +74,2,183701,12,6,6,4,0,1,1,0,0,6,0,0 +27,0,208406,0,13,0,3,0,0,0,0,0,30,0,0 +47,2,148884,1,9,1,6,1,0,0,0,0,60,0,0 +90,2,87285,1,9,0,4,3,0,1,0,0,24,0,0 +47,2,199058,0,13,1,3,1,0,0,0,0,60,0,1 +42,2,173628,0,13,1,1,1,0,0,0,0,40,0,1 +69,2,370837,0,13,2,2,0,0,0,0,0,40,0,0 +23,2,342769,0,13,0,9,0,0,1,0,0,20,0,0 +44,4,65145,1,9,1,3,1,0,0,0,0,30,0,0 +41,2,150533,1,9,1,5,1,0,0,2829,0,40,0,0 +47,4,272182,5,10,0,0,0,1,0,0,0,40,0,0 +43,2,403467,0,13,1,1,1,1,0,7688,0,40,0,1 +33,2,252168,5,10,0,4,0,1,0,0,0,40,0,0 +48,2,80430,2,7,0,4,0,0,1,0,0,30,0,0 +39,2,189623,0,13,2,5,4,0,0,0,0,60,0,0 +43,2,115806,3,14,2,1,4,0,1,0,2547,40,0,1 +52,2,226084,1,9,6,13,5,0,1,0,0,40,0,0 +18,2,150817,1,9,0,5,3,0,1,0,0,20,0,0 +27,5,190911,1,9,0,5,3,0,0,0,0,45,0,0 +27,5,120126,0,13,1,1,1,0,0,0,1887,45,0,1 +45,4,255559,1,9,0,0,0,0,1,0,0,40,0,0 +24,2,173679,9,11,1,4,1,0,0,0,0,20,0,0 +25,2,35854,5,10,3,5,4,0,1,0,0,40,0,0 +42,1,82161,12,6,6,6,4,0,0,0,0,35,0,0 +63,1,129845,7,4,1,10,1,0,0,0,0,40,0,0 +40,2,226505,1,9,1,0,2,0,1,0,0,46,0,1 +47,2,151584,10,15,1,1,1,0,0,7688,0,60,0,1 +42,2,136419,1,9,1,10,1,0,0,0,0,50,0,1 +42,2,66460,5,10,2,1,4,0,1,0,0,45,0,0 +63,4,379940,0,13,1,3,1,0,0,0,0,40,0,1 +37,4,102936,0,13,2,3,4,0,1,0,0,55,0,0 +65,2,205309,1,9,1,0,1,0,0,0,0,20,0,0 +62,2,208711,0,13,1,10,1,0,0,7688,0,50,0,1 +46,2,137547,1,9,2,10,0,3,0,0,0,40,0,0 +23,2,220168,1,9,0,5,5,1,1,0,0,25,2,0 +47,4,37672,0,13,1,3,2,0,1,0,0,45,0,0 +20,2,196643,5,10,0,4,3,0,0,0,0,20,0,0 +28,2,197484,1,9,0,2,3,0,0,0,0,40,0,0 +61,4,115023,1,9,1,4,1,0,0,0,0,40,0,0 +30,0,234824,1,9,1,4,2,0,1,0,0,72,0,0 +30,0,361497,0,13,1,11,1,0,0,0,0,72,0,1 +29,2,351871,0,13,0,5,0,0,0,0,0,50,0,1 +39,2,324231,1,9,6,8,4,1,1,0,0,40,0,0 +23,2,123490,2,7,2,4,4,0,1,0,0,35,0,0 +32,2,188245,2,7,0,13,4,1,1,0,0,40,0,0 +63,2,50349,1,9,6,4,0,0,1,0,0,34,0,0 +19,1,47176,5,10,0,10,0,0,1,0,0,15,0,0 +57,0,290661,8,16,2,3,0,0,0,0,0,60,0,1 +41,2,221172,0,13,1,10,1,0,0,0,0,40,0,1 +23,2,188950,9,11,0,5,3,0,0,0,0,40,0,0 +30,2,356882,8,16,0,3,3,0,0,0,0,20,0,0 +43,5,150533,6,12,1,1,1,0,0,0,0,50,0,0 +64,1,167149,7,4,1,4,1,0,0,0,0,25,0,0 +56,2,301835,11,3,4,8,0,0,0,0,0,40,0,0 +32,2,313729,1,9,1,0,1,0,0,0,0,40,0,0 +55,2,130957,1,9,1,10,1,0,0,0,0,45,0,0 +17,2,197732,2,7,0,4,3,0,1,0,0,12,0,0 +17,2,250541,12,6,0,4,3,1,0,0,0,20,0,0 +29,2,218785,5,10,1,0,2,0,1,0,0,65,0,0 +37,2,194630,1,9,2,10,0,0,0,0,0,50,0,0 +39,2,38721,1,9,2,13,4,0,1,0,0,22,0,0 +36,2,201519,0,13,1,1,2,0,1,0,0,40,0,1 +50,2,279337,0,13,2,1,0,0,0,0,0,55,0,1 +31,2,87560,5,10,0,8,0,0,1,0,0,50,0,0 +56,2,208431,5,10,6,1,0,1,1,0,0,32,0,0 +51,2,143822,5,10,1,10,1,0,0,7298,0,40,0,1 +20,2,163205,5,10,4,4,3,0,1,0,0,30,0,0 +53,2,171924,0,13,2,3,0,0,0,14344,0,55,0,1 +33,0,137616,3,14,0,3,0,1,1,0,0,35,0,0 +27,2,156516,5,10,1,0,2,1,1,0,2377,20,0,0 +40,2,119101,5,10,1,10,1,0,0,5178,0,40,0,1 +45,2,117556,5,10,2,0,4,1,1,0,0,32,0,0 +54,2,147863,9,11,1,10,1,2,0,5013,0,40,36,0 +33,1,24504,1,9,4,10,5,0,0,0,0,50,0,0 +36,2,181721,12,6,0,7,3,1,0,0,0,60,0,0 +42,4,55363,3,14,1,3,1,0,0,0,0,55,0,1 +33,2,92865,5,10,0,0,3,0,1,0,0,40,0,0 +52,3,221532,0,13,1,1,1,0,0,0,0,45,0,1 +41,4,183224,3,14,1,3,2,2,1,0,0,40,18,1 +30,2,381153,5,10,1,10,1,0,0,0,0,40,0,0 +22,2,300871,5,10,0,0,3,0,0,0,0,40,0,0 +47,2,33710,0,13,1,1,1,0,0,3103,0,60,0,1 +26,2,158333,11,3,0,6,0,0,0,0,0,40,13,0 +36,2,288103,2,7,4,8,0,1,0,0,0,40,0,0 +35,2,108907,1,9,4,8,4,0,0,0,0,40,0,0 +46,2,358533,5,10,1,11,1,1,0,0,0,40,0,1 +24,2,126613,0,13,0,3,3,0,1,0,0,8,0,0 +30,2,164190,9,11,1,3,1,0,0,5178,0,52,0,1 +38,2,199816,1,9,2,8,3,0,0,0,0,40,0,0 +50,2,98228,1,9,2,5,4,0,1,0,0,45,0,0 +41,4,129060,5,10,2,0,4,1,1,0,0,40,0,0 +38,2,22245,1,9,1,1,1,0,0,0,0,60,0,1 +36,2,226918,0,13,0,5,0,1,0,0,0,48,0,0 +47,2,398652,1,9,1,5,1,0,0,0,0,50,0,1 +59,2,268840,5,10,1,0,5,0,1,0,0,16,0,1 +59,2,91384,8,16,1,3,1,0,0,0,0,60,0,1 +52,2,174767,5,10,1,1,1,0,0,0,0,45,0,1 +37,5,126675,9,11,1,5,1,0,0,0,0,60,0,1 +52,2,82285,0,13,3,4,5,1,1,0,0,40,19,0 +51,2,177727,6,12,1,10,1,0,0,0,0,45,0,1 +67,1,345236,0,13,1,1,1,0,0,0,0,55,0,0 +68,2,156000,12,6,6,4,4,1,1,0,0,20,0,0 +71,2,228806,4,5,2,13,0,1,1,0,0,6,0,0 +49,4,184428,3,14,1,0,1,0,0,0,0,40,0,0 +35,4,102938,1,9,1,4,1,0,0,0,0,40,0,0 +18,2,161063,1,9,0,0,3,0,0,0,0,40,0,0 +29,2,253752,12,6,1,7,2,0,1,0,0,40,0,0 +47,1,274800,0,13,1,3,1,0,0,0,0,60,0,0 +31,2,129804,4,5,0,7,0,0,0,0,0,40,5,0 +22,3,65547,5,10,0,1,0,1,0,0,0,40,0,0 +20,2,107658,5,10,0,9,0,0,1,0,0,10,0,0 +57,2,161097,1,9,2,5,0,0,1,0,0,26,0,0 +18,2,118376,5,10,0,4,3,0,1,0,0,15,0,0 +32,2,131224,1,9,1,3,1,0,0,0,0,40,0,0 +39,2,120985,1,9,2,4,3,0,0,0,0,40,0,0 +37,2,215392,0,13,2,3,0,0,1,0,0,40,0,0 +51,2,63685,1,9,1,5,1,2,0,0,0,50,14,0 +48,2,131826,5,10,1,0,1,0,0,0,0,40,0,1 +39,2,211440,1,9,1,6,1,0,0,0,0,55,0,1 +35,2,31023,0,13,1,5,1,0,0,0,0,45,0,0 +40,2,145439,11,3,1,4,1,4,0,4064,0,40,4,0 +19,2,255161,1,9,0,5,3,0,0,0,0,25,0,0 +28,2,411950,1,9,2,0,0,0,0,0,0,40,0,0 +23,2,275818,5,10,0,5,0,0,1,0,1974,40,0,0 +18,2,318082,5,10,0,5,3,0,0,0,0,35,0,0 +23,4,287988,0,13,0,3,0,0,0,0,0,40,0,0 +47,4,138342,2,7,1,6,1,0,0,3411,0,40,22,0 +42,3,115932,0,13,2,0,3,0,0,0,0,40,0,0 +25,2,60358,5,10,0,5,3,0,0,0,0,40,0,0 +17,2,140117,12,6,0,5,3,0,1,0,0,12,0,0 +34,2,158040,0,13,0,1,0,0,1,0,0,45,0,0 +29,2,232784,6,12,0,1,3,0,0,0,0,40,0,0 +22,2,349368,5,10,1,0,2,0,1,0,0,40,0,0 +46,3,325573,1,9,0,2,0,0,0,0,0,40,0,0 +69,2,140176,1,9,1,5,1,0,0,0,0,24,0,0 +50,2,128478,1,9,1,10,1,0,0,0,0,60,0,1 +45,3,155659,5,10,1,3,1,0,0,0,0,40,0,1 +41,0,288433,3,14,0,0,0,1,1,0,0,40,0,0 +47,3,329205,0,13,2,3,4,0,0,0,0,40,0,0 +64,2,171373,2,7,6,7,4,0,1,0,0,40,0,0 +29,2,228860,5,10,1,4,1,0,0,0,0,35,0,0 +29,2,196116,10,15,2,3,3,0,1,2174,0,72,0,0 +17,2,47771,2,7,0,3,3,0,1,0,0,20,0,0 +24,2,201680,1,9,0,0,4,0,0,0,0,60,0,0 +28,2,337378,1,9,1,10,1,0,0,0,0,40,0,0 +35,2,246449,1,9,0,4,0,0,0,3325,0,50,0,0 +48,2,227714,0,13,1,5,1,0,0,0,0,60,0,0 +36,2,177285,9,11,0,3,4,1,1,0,0,38,0,0 +38,2,71701,9,11,0,10,0,0,1,0,0,40,20,0 +49,2,30219,1,9,2,10,0,0,0,0,1669,40,0,0 +42,2,280167,3,14,1,3,1,0,0,0,0,40,0,1 +36,5,27408,9,11,1,5,1,0,0,0,0,60,0,0 +25,2,167031,12,6,0,8,0,0,1,0,0,40,13,0 +41,2,173682,3,14,1,8,1,0,0,0,0,40,0,0 +35,1,278557,1,9,1,7,1,0,0,0,0,30,0,0 +32,2,113688,9,11,2,1,0,0,1,0,0,50,0,0 +41,1,252986,3,14,1,3,1,0,0,0,0,40,0,1 +48,2,33669,5,10,1,6,1,0,0,0,0,60,0,0 +56,2,100776,1,9,1,5,2,0,1,0,0,50,0,0 +47,1,177457,5,10,1,4,1,1,0,0,0,40,0,0 +30,0,312767,1,9,0,5,4,1,1,0,0,40,0,0 +51,2,43354,2,7,1,10,1,0,0,0,0,40,0,1 +22,5,375422,0,13,0,0,3,0,0,0,0,40,27,0 +49,1,263568,0,13,1,1,1,0,0,0,0,60,0,1 +26,2,302097,1,9,1,8,1,0,0,3464,0,48,0,0 +35,2,248010,0,13,3,10,4,0,0,0,0,40,0,0 +34,2,405577,5,10,0,0,0,0,0,0,0,40,0,0 +51,0,167065,1,9,1,1,1,0,0,0,0,40,0,0 +26,2,102476,0,13,1,1,1,0,0,0,0,40,0,0 +28,3,526528,5,10,0,0,4,1,1,3887,0,40,0,0 +32,2,175878,7,4,1,10,1,0,0,0,0,35,0,0 +55,2,213894,2,7,4,0,4,1,1,0,0,40,0,0 +17,2,150262,2,7,0,5,3,0,1,0,0,20,0,0 +40,2,75363,5,10,4,1,4,0,1,0,0,40,0,0 +38,2,272671,0,13,2,5,3,0,0,0,0,50,0,0 +67,5,411007,1,9,6,1,0,0,1,15831,0,40,0,1 +44,2,222434,1,9,2,8,3,0,0,0,0,40,0,0 +26,2,180246,5,10,1,1,1,0,0,7688,0,40,0,1 +25,2,171236,1,9,2,2,3,0,1,0,0,40,0,0 +45,2,367037,1,9,2,0,4,0,1,0,0,40,0,0 +38,2,304651,1,9,1,0,1,0,0,0,0,45,0,1 +62,2,97017,5,10,1,10,1,0,0,0,0,45,0,0 +20,2,146879,1,9,0,4,0,0,0,0,2001,40,0,0 +45,0,320818,5,10,3,4,5,1,0,0,0,40,19,0 +47,1,84735,3,14,1,3,2,0,1,0,0,20,0,1 +49,2,184428,0,13,2,0,0,0,0,0,0,40,0,0 +36,2,326886,1,9,1,10,1,0,0,0,0,40,0,1 +29,2,212102,1,9,4,4,4,1,1,0,0,30,0,0 +23,2,175837,2,7,0,7,5,0,1,0,0,40,5,0 +50,2,177487,1,9,1,10,1,0,0,0,0,40,0,0 +44,2,286750,0,13,1,1,1,1,0,0,1902,40,0,1 +44,2,171424,0,13,1,3,1,0,0,0,0,40,0,1 +32,2,194981,1,9,1,9,2,0,1,0,0,36,0,0 +73,2,199362,1,9,1,4,1,0,0,0,0,30,0,0 +24,2,204226,3,14,0,3,0,0,1,0,0,40,0,0 +46,0,72506,1,9,1,4,2,1,1,0,0,40,0,0 +61,5,61040,5,10,1,5,1,0,0,7688,0,36,0,1 +37,3,194630,3,14,0,1,3,0,1,0,0,40,0,0 +29,2,391867,9,11,1,10,1,0,0,0,0,40,0,1 +40,2,94080,6,12,1,1,1,0,0,0,0,40,0,1 +17,2,289405,2,7,0,8,3,4,0,0,0,12,0,0 +30,2,170130,1,9,2,0,4,0,1,0,0,40,0,0 +19,2,158118,1,9,0,4,0,0,1,0,1719,40,0,0 +30,2,447739,8,16,0,3,0,0,0,0,0,60,0,0 +47,2,223342,1,9,2,0,4,0,1,0,1504,35,0,0 +25,2,106377,5,10,0,0,3,0,0,0,0,40,0,0 +41,2,66118,0,13,2,3,3,0,1,0,0,40,0,0 +47,2,274883,1,9,1,6,1,0,0,0,0,40,0,0 +27,4,123773,6,12,0,0,4,1,1,0,0,40,0,0 +42,4,70655,1,9,1,10,1,0,0,0,0,44,0,0 +49,2,177426,1,9,2,4,0,0,1,0,0,20,0,0 +37,2,200374,0,13,1,5,1,0,0,0,1902,40,0,1 +19,0,159269,5,10,0,0,3,0,0,0,0,15,0,0 +24,2,235894,1,9,1,10,1,0,0,0,0,38,0,0 +34,4,97723,10,15,1,3,1,0,0,0,0,40,0,1 +33,2,167309,0,13,0,0,0,0,0,0,0,40,0,0 +44,1,98106,5,10,2,1,0,0,1,0,0,40,0,0 +37,3,22201,0,13,1,0,1,2,0,7298,0,40,11,1 +45,2,108993,1,9,0,10,3,0,0,0,0,40,0,0 +35,2,265954,0,13,0,2,0,1,0,0,0,40,0,0 +58,5,100960,1,9,1,5,1,0,0,0,0,50,0,0 +45,2,170092,5,10,2,4,0,0,1,0,0,50,0,0 +54,2,326156,5,10,1,10,1,0,0,0,0,40,0,1 +45,2,216932,3,14,1,1,1,0,0,0,0,40,0,1 +69,2,36956,5,10,1,1,1,0,0,20051,0,50,0,1 +24,2,214014,1,9,0,10,3,1,0,0,0,40,0,0 +36,2,99872,1,9,1,10,1,2,0,0,0,40,3,0 +61,0,151459,12,6,0,4,0,1,1,0,0,38,0,0 +57,5,161662,0,13,1,1,1,0,0,7688,0,60,0,1 +56,2,367200,1,9,2,10,5,0,0,0,0,40,0,0 +35,2,86648,3,14,1,3,1,0,0,0,1977,45,0,1 +51,4,168539,0,13,1,1,1,0,0,0,0,50,0,1 +50,2,140741,2,7,0,8,5,0,1,0,0,40,0,0 +25,2,197651,5,10,0,9,3,0,1,0,0,43,0,0 +46,2,123053,3,14,1,1,1,2,0,0,0,50,28,1 +23,2,330571,0,13,0,0,3,0,1,0,0,25,0,0 +44,2,204235,1,9,1,6,1,0,0,0,0,40,0,0 +38,0,346766,1,9,2,0,4,0,1,0,0,40,0,0 +25,2,163396,5,10,0,9,0,4,1,0,0,40,0,0 +18,2,36251,12,6,0,4,3,0,1,0,0,15,0,0 +40,2,149102,1,9,3,2,0,0,0,2174,0,60,12,0 +31,0,29152,14,8,1,4,2,0,1,0,0,40,0,0 +33,2,79303,1,9,1,7,1,0,0,0,0,45,0,0 +35,2,272338,9,11,2,3,4,0,1,0,0,40,0,0 +55,0,200497,3,14,1,1,1,0,0,0,0,45,0,1 +19,2,148392,1,9,0,0,3,0,0,0,0,30,0,0 +31,2,164243,5,10,1,10,1,0,0,0,1579,40,0,0 +43,0,129298,3,14,1,1,1,0,0,0,0,40,0,1 +49,4,174981,3,14,1,1,1,1,0,0,0,47,0,1 +48,4,328610,10,15,1,3,1,0,0,0,0,45,0,1 +27,2,77774,1,9,0,8,3,0,1,0,0,34,0,0 +38,0,134069,3,14,1,1,1,0,0,7298,0,60,0,1 +35,2,209214,1,9,1,0,2,0,1,4386,0,35,0,1 +29,2,153805,1,9,0,8,5,4,0,0,0,40,16,0 +27,2,168827,0,13,0,5,3,0,0,0,0,2,0,0 +31,2,373432,4,5,1,10,1,0,0,0,0,43,0,0 +26,2,57600,0,13,1,3,1,0,0,0,0,40,0,0 +53,1,302847,1,9,1,5,1,0,0,0,0,35,0,0 +23,2,227594,1,9,0,0,0,0,1,0,0,30,0,0 +32,3,44777,1,9,4,8,0,1,0,0,0,46,0,0 +36,2,279615,0,13,2,5,3,0,1,0,0,40,0,0 +22,2,276133,1,9,0,7,0,0,0,0,0,50,0,0 +62,2,136314,5,10,1,0,2,0,1,0,0,40,0,0 +41,2,204410,1,9,1,10,1,0,0,0,1485,44,0,1 +59,5,223215,0,13,1,1,1,0,0,0,1977,50,0,1 +43,2,184625,1,9,1,0,2,0,1,0,0,40,0,1 +34,5,265917,1,9,1,1,1,0,0,0,0,40,0,1 +27,2,158647,5,10,0,0,0,0,1,0,0,40,0,0 +35,2,22055,5,10,1,3,1,3,0,0,0,60,0,0 +41,4,176716,1,9,1,6,1,0,0,0,0,60,0,0 +42,2,270721,0,13,0,3,0,0,0,0,0,32,0,0 +24,2,100321,5,10,2,10,0,0,0,0,0,48,0,0 +35,2,79050,1,9,0,6,4,1,0,0,0,72,0,0 +40,4,42703,5,10,1,0,2,0,1,0,0,40,0,1 +46,2,116952,7,4,1,3,2,0,1,0,0,45,0,0 +45,2,331643,5,10,1,10,1,0,0,0,0,40,0,1 +33,2,207937,1,9,0,10,0,0,0,0,1092,40,0,0 +68,2,223486,1,9,6,4,4,0,1,0,0,7,7,0 +33,2,340332,0,13,4,1,0,1,1,0,0,45,0,0 +23,2,184813,5,10,1,4,1,0,0,0,0,20,0,0 +42,1,32185,0,13,1,7,1,0,0,0,0,60,0,1 +30,2,197886,5,10,0,5,0,0,0,0,0,45,0,1 +35,0,248374,5,10,2,0,4,1,1,0,0,40,0,0 +40,2,382499,1,9,2,0,4,0,1,0,0,50,0,0 +36,0,108320,3,14,2,3,4,0,0,5455,0,30,0,0 +46,5,161386,4,5,1,0,2,0,1,0,0,50,0,0 +49,4,110172,1,9,1,6,1,0,0,0,0,40,0,0 +41,2,144032,1,9,1,1,1,0,0,0,0,60,0,0 +26,2,224426,3,14,0,1,3,0,0,0,0,38,0,0 +37,2,230408,1,9,2,4,0,1,1,0,0,20,0,0 +50,4,20795,5,10,1,11,1,0,0,0,0,40,0,1 +20,2,174714,5,10,0,4,3,0,0,0,0,20,0,0 +59,0,398626,8,16,2,3,4,0,0,25236,0,45,0,1 +30,2,149531,5,10,1,5,1,0,0,0,0,40,0,0 +23,2,34113,1,9,1,10,1,0,0,0,0,45,0,0 +44,4,323790,0,13,1,11,1,0,0,0,0,40,0,1 +28,2,331381,0,13,0,0,0,0,0,0,0,40,0,0 +48,2,160647,5,10,0,1,0,0,1,0,0,40,38,1 +34,2,339142,1,9,4,2,4,0,1,0,0,40,0,0 +58,2,164857,0,13,0,3,0,0,0,0,0,99,0,0 +33,4,267859,5,10,1,11,1,0,0,0,0,40,0,0 +38,2,167725,0,13,3,6,0,4,0,0,0,84,3,0 +49,3,586657,0,13,1,1,1,0,0,7298,0,40,0,1 +67,1,105907,15,2,6,4,0,1,1,0,0,20,0,0 +23,2,200677,12,6,0,8,0,0,1,0,0,40,0,0 +42,2,193882,5,10,1,3,1,0,0,0,0,40,0,1 +54,2,138026,1,9,1,0,2,0,1,0,0,40,0,0 +49,2,122385,3,14,1,1,1,0,0,0,0,40,0,1 +35,2,49020,3,14,1,1,1,0,0,0,0,60,0,1 +26,2,283715,1,9,0,10,3,0,0,0,0,40,0,0 +31,2,286406,1,9,0,1,0,0,0,3325,0,40,0,0 +36,2,166416,1,9,1,2,1,0,0,0,0,40,0,0 +25,2,156334,12,6,1,8,1,0,0,0,0,40,0,0 +35,4,45607,3,14,0,3,0,0,0,0,0,60,0,1 +40,4,112362,3,14,1,3,1,0,0,0,0,40,0,0 +52,2,200419,6,12,4,3,0,0,1,0,0,50,0,0 +42,0,341638,0,13,1,3,1,0,0,0,0,40,0,1 +50,1,127151,3,14,1,3,2,0,1,0,0,40,8,1 +52,2,321959,5,10,1,9,1,1,0,0,0,40,0,1 +51,4,35211,3,14,1,3,1,3,0,0,0,40,0,0 +19,2,214935,5,10,0,2,3,0,0,0,0,40,0,0 +43,2,132130,9,11,1,7,1,0,0,0,0,40,0,1 +57,2,222247,14,8,1,6,1,0,0,0,0,40,0,1 +35,2,165799,1,9,2,1,0,0,0,0,0,60,0,0 +30,2,257874,0,13,0,5,0,0,1,0,0,30,0,0 +38,2,357173,1,9,1,10,1,0,0,0,0,40,0,0 +45,0,305739,5,10,2,0,0,0,1,0,0,40,0,0 +23,2,172047,1,9,0,2,3,0,0,0,0,40,0,0 +22,2,110677,5,10,4,4,3,0,1,0,0,40,0,0 +60,2,82388,5,10,1,11,1,0,0,0,0,38,0,0 +45,2,289230,0,13,2,3,4,0,1,0,0,48,0,1 +26,2,101812,1,9,0,8,4,0,0,5721,0,40,0,0 +49,0,336509,12,6,1,4,1,0,0,0,0,40,0,0 +29,2,383402,5,10,2,4,0,0,1,0,0,35,0,0 +47,2,328216,5,10,1,9,1,0,0,7298,0,40,0,1 +40,2,280362,1,9,1,6,1,0,0,0,0,35,0,0 +34,2,212064,1,9,4,0,4,0,1,7443,0,35,0,0 +42,2,173704,3,14,1,3,1,0,0,0,0,40,0,0 +33,2,433375,15,2,1,10,1,0,0,0,0,35,4,0 +63,1,106551,1,9,1,10,1,0,0,0,0,40,0,0 +53,2,22418,1,9,1,10,1,0,0,0,0,40,0,0 +38,2,54816,9,11,1,10,1,0,0,0,0,40,0,1 +44,2,358199,5,10,1,5,1,0,0,0,0,45,0,1 +43,2,190044,12,6,1,6,1,0,0,0,0,40,0,0 +26,2,97698,3,14,0,1,0,0,0,0,0,32,0,0 +56,2,53366,1,9,1,6,1,0,0,0,0,40,0,0 +39,2,236136,9,11,2,0,4,1,1,0,0,40,0,0 +44,2,326232,7,4,2,2,0,0,0,0,0,48,0,0 +34,2,581071,1,9,4,0,0,0,0,0,0,48,0,1 +40,2,220589,6,12,0,0,0,0,1,0,0,40,0,0 +38,3,161463,5,10,1,4,1,1,0,0,0,40,0,0 +44,2,95255,5,10,2,0,4,0,1,0,0,40,0,0 +34,3,223267,5,10,2,11,3,0,0,0,0,72,0,0 +22,2,236769,0,13,0,3,0,0,0,0,0,20,7,0 +58,5,229498,5,10,6,5,0,0,1,0,0,20,0,1 +43,2,177083,5,10,2,9,4,0,1,0,0,30,0,0 +23,2,287681,1,9,0,10,3,0,0,0,0,40,13,0 +41,2,49797,5,10,4,1,0,1,1,0,0,40,0,0 +44,2,174051,5,10,0,4,0,0,0,0,0,35,0,0 +32,2,194901,1,9,1,0,1,0,0,0,0,40,0,0 +38,4,252250,6,12,1,11,1,0,0,0,0,56,0,1 +47,2,191277,5,10,1,5,1,0,0,0,0,50,0,1 +24,2,174907,1,9,0,4,3,0,1,0,0,30,0,0 +39,2,167140,3,14,1,1,1,0,0,0,0,40,0,0 +32,2,236543,14,8,2,11,3,0,0,0,0,54,4,0 +40,2,214242,1,9,1,8,1,0,0,0,0,50,0,0 +34,2,216864,1,9,2,4,4,0,1,0,3770,45,0,0 +34,2,245211,1,9,0,10,4,0,0,2036,0,30,0,0 +57,2,437727,3,14,1,3,1,0,0,0,1977,45,0,1 +71,2,200418,11,3,1,6,1,0,0,0,0,40,0,0 +45,4,167334,3,14,0,3,0,0,0,0,0,50,0,1 +54,2,146834,1,9,2,6,0,0,0,0,0,45,0,0 +26,2,78424,9,11,0,5,4,0,1,0,0,54,0,0 +37,2,182675,5,10,1,1,2,0,1,0,0,45,0,1 +28,1,38079,5,10,1,7,1,0,0,0,0,55,0,0 +42,2,115178,0,13,2,3,4,0,1,0,0,15,0,0 +45,2,195949,1,9,1,10,1,0,0,0,0,40,0,0 +37,2,167415,1,9,1,5,1,0,0,0,0,50,0,0 +57,2,223214,1,9,1,5,1,0,0,0,0,50,0,0 +39,2,22245,0,13,1,3,0,0,0,0,0,60,0,0 +45,0,81853,5,10,1,0,2,2,1,0,0,40,0,1 +30,2,147921,9,11,2,0,0,0,1,0,0,46,0,0 +27,2,29261,1,9,5,10,1,0,0,0,0,40,0,1 +44,2,257758,8,16,1,3,1,0,0,0,0,40,0,1 +44,0,136546,8,16,1,3,1,0,0,0,1902,40,0,1 +38,2,205493,1,9,1,1,2,0,1,0,0,60,0,1 +19,2,71650,1,9,0,7,3,0,0,0,0,40,0,0 +39,2,150217,5,10,2,5,0,0,1,0,0,38,0,0 +55,5,258648,12,6,6,6,0,0,0,0,0,40,0,0 +17,2,114798,12,6,0,4,3,0,1,0,0,20,0,0 +43,2,186188,5,10,2,0,4,0,1,0,0,40,0,0 +36,4,175255,1,9,1,4,2,0,1,0,0,35,0,0 +45,2,249935,0,13,1,7,1,0,0,0,0,60,0,0 +44,2,120277,3,14,1,1,1,0,0,0,0,38,0,1 +26,2,193165,5,10,1,6,1,0,0,0,0,52,0,1 +32,2,185027,6,12,1,10,1,0,0,0,1887,40,38,1 +21,2,221418,1,9,0,4,3,0,1,0,0,40,0,0 +43,3,56063,0,13,1,5,1,0,0,0,0,60,0,0 +34,2,153927,1,9,1,10,1,0,0,0,0,40,0,0 +33,0,163110,0,13,0,3,0,0,0,0,0,20,0,0 +40,5,175696,1,9,0,5,0,0,0,0,0,51,0,0 +46,2,143189,11,3,0,8,3,0,1,0,0,40,21,0 +54,0,32778,1,9,6,1,0,0,1,0,0,40,0,0 +23,2,150683,5,10,0,1,3,0,0,0,0,40,0,0 +58,5,78104,1,9,1,1,1,0,0,0,0,45,0,0 +25,2,335005,5,10,1,11,1,0,0,3137,0,40,0,0 +50,4,311551,3,14,1,3,1,0,0,7688,0,50,0,1 +42,1,201520,1,9,1,10,1,0,0,0,0,45,0,0 +25,2,124111,1,9,0,4,0,0,1,0,0,38,0,0 +60,2,166386,2,7,1,8,2,2,1,0,0,30,37,0 +43,0,117471,1,9,0,0,0,0,1,0,0,40,0,0 +25,2,361307,0,13,0,5,3,0,1,0,0,40,0,0 +31,2,142038,1,9,1,10,2,0,1,0,0,45,0,0 +35,2,276552,1,9,2,10,0,0,0,0,0,40,0,0 +48,2,50402,5,10,2,8,4,0,0,0,0,40,0,0 +43,1,174090,1,9,1,0,2,0,1,0,0,20,0,1 +27,2,277760,1,9,2,1,4,0,1,0,0,40,0,0 +24,2,24243,1,9,0,10,0,0,0,0,1590,40,0,0 +44,5,151089,1,9,1,1,1,0,0,0,1887,70,0,1 +52,1,165278,1,9,1,6,1,0,0,0,0,22,0,0 +49,2,182752,5,10,1,0,2,0,1,0,0,40,0,1 +31,2,173002,1,9,0,0,3,0,1,0,0,40,0,0 +59,2,261232,2,7,2,7,0,0,0,0,0,40,0,0 +27,2,164607,0,13,1,4,1,0,0,0,0,40,0,0 +38,1,129573,3,14,0,3,0,0,0,0,0,40,0,1 +51,3,36186,0,13,1,3,1,0,0,0,0,40,0,1 +24,2,325744,1,9,0,10,0,0,0,0,0,40,0,0 +58,5,329793,0,13,1,1,1,0,0,0,0,45,0,1 +46,2,133616,5,10,2,0,4,0,1,0,0,40,0,0 +55,2,83401,11,3,6,8,4,0,1,0,0,40,0,0 +76,2,239880,1,9,2,0,0,0,1,0,0,8,0,0 +25,2,201737,5,10,2,0,4,0,1,0,0,40,0,0 +51,2,192182,5,10,1,8,1,0,0,7298,0,40,0,1 +33,2,143540,1,9,1,10,1,0,0,0,0,40,0,0 +46,2,28334,1,9,1,6,1,0,0,0,0,40,0,0 +51,2,245873,5,10,1,0,2,0,1,0,0,40,0,0 +42,4,199095,9,11,6,3,4,1,1,0,0,40,0,0 +53,2,104461,0,13,0,4,0,0,0,8614,0,50,25,1 +33,4,183923,3,14,1,3,2,0,1,7688,0,35,0,1 +30,2,129707,0,13,1,3,1,0,0,99999,0,35,0,1 +41,4,575442,5,10,2,10,0,0,0,0,0,40,0,0 +42,0,184682,6,12,2,4,0,0,1,0,0,40,0,0 +34,2,69251,1,9,1,6,1,2,0,0,0,40,0,1 +31,2,225507,9,11,0,4,4,0,1,0,0,40,0,0 +46,2,167515,5,10,1,3,1,0,0,0,1977,50,0,1 +35,2,407068,15,2,3,4,0,0,0,0,0,40,24,0 +46,4,125892,5,10,1,11,1,0,0,0,0,40,0,1 +43,4,35824,3,14,1,3,2,0,1,0,0,40,0,1 +35,2,67083,1,9,1,4,1,2,0,0,0,40,26,0 +23,2,107801,0,13,0,0,3,0,1,0,0,20,0,0 +43,2,118536,1,9,2,8,5,1,0,0,0,40,0,0 +61,2,198078,1,9,1,6,1,0,0,0,0,40,0,1 +29,2,78261,10,15,0,3,3,0,0,0,0,50,0,0 +21,2,234108,1,9,0,5,0,0,0,0,0,40,0,0 +36,4,241998,0,13,1,3,1,0,0,0,1672,50,0,0 +40,2,92717,1,9,0,4,4,1,1,0,0,40,0,0 +23,2,257683,0,13,0,3,3,0,0,0,0,40,0,0 +90,2,40388,0,13,0,1,0,0,0,0,0,55,0,0 +24,2,55424,0,13,0,1,3,0,0,0,0,40,0,0 +20,2,169600,5,10,0,3,3,0,1,2176,0,12,0,0 +40,4,319271,3,14,1,1,1,0,0,0,0,60,0,1 +37,1,75050,9,11,1,10,1,0,0,0,0,55,0,0 +31,2,182896,1,9,0,10,0,0,1,0,0,40,0,0 +22,2,188274,1,9,0,6,3,0,0,0,0,40,0,0 +25,2,211497,5,10,1,1,1,0,0,0,0,40,0,0 +47,4,172246,3,14,1,3,1,0,0,0,0,60,0,1 +48,4,219962,9,11,1,10,1,0,0,0,0,40,0,0 +28,2,209801,4,5,1,8,2,0,1,0,0,40,0,0 +20,0,178517,5,10,0,7,0,0,0,0,0,40,0,0 +51,2,169364,5,10,2,2,0,0,1,0,0,40,38,0 +32,3,164707,1,9,1,0,2,0,1,0,0,40,0,1 +55,2,144084,12,6,1,4,1,0,0,0,0,40,0,0 +41,4,133692,0,13,2,11,4,0,1,0,0,40,0,0 +46,2,184169,3,14,1,3,2,0,1,7688,0,35,0,1 +45,5,145290,1,9,1,4,1,0,0,0,0,40,0,1 +65,4,24824,1,9,1,10,1,0,0,0,0,40,0,0 +45,2,178319,8,16,1,3,1,0,0,7688,0,50,0,1 +22,2,235829,5,10,0,0,3,0,1,0,0,40,0,0 +42,1,54202,10,15,1,3,1,0,0,0,0,50,0,1 +37,2,220237,0,13,1,1,1,0,0,5178,0,40,0,1 +24,2,59146,0,13,1,1,2,0,1,0,0,40,0,0 +67,2,64148,5,10,2,4,4,1,1,0,0,41,0,0 +28,2,196621,1,9,3,9,0,0,1,0,0,37,0,0 +56,2,195668,12,6,1,4,1,0,0,0,0,35,1,1 +31,0,263000,9,11,1,11,1,0,0,0,0,38,0,0 +33,2,554986,5,10,4,1,4,0,1,0,0,40,0,0 +45,2,217654,5,10,1,2,1,0,0,0,0,40,9,1 +53,2,139671,0,13,1,3,1,0,0,0,1902,40,0,1 +47,2,102771,7,4,1,2,1,0,0,0,0,40,20,0 +40,2,213019,1,9,2,5,4,0,1,0,0,30,0,0 +35,2,228493,5,10,0,5,3,0,0,0,0,48,0,0 +65,1,22907,7,4,1,7,1,0,0,0,0,40,0,0 +42,2,24364,5,10,1,4,2,1,1,0,0,30,0,0 +23,3,41432,0,13,0,3,0,0,1,0,0,15,0,0 +39,2,235259,5,10,2,0,0,0,1,0,0,40,0,0 +39,2,343476,1,9,1,10,1,0,0,0,0,30,0,0 +37,2,326886,1,9,1,6,1,0,0,0,0,40,0,0 +25,2,248313,9,11,0,0,0,0,1,0,0,40,0,0 +31,1,30290,1,9,0,4,4,0,1,0,0,40,0,0 +39,2,188540,1,9,2,1,0,0,0,0,0,45,0,0 +39,2,237943,0,13,1,5,1,0,0,0,0,30,0,1 +25,2,198870,0,13,0,0,3,1,0,0,0,35,0,0 +30,2,233980,2,7,1,6,1,0,0,0,0,40,0,0 +37,2,171090,4,5,1,8,2,1,1,0,0,48,0,0 +22,2,353039,1,9,0,10,4,0,1,0,0,36,4,0 +46,3,213140,3,14,1,1,1,0,0,0,1977,40,0,1 +54,2,188136,0,13,2,5,0,0,1,0,1408,38,0,0 +33,2,130057,6,12,0,10,0,0,0,0,0,45,0,0 +70,0,345339,0,13,0,1,0,0,0,0,0,40,0,0 +36,2,182074,5,10,2,0,0,0,0,0,0,45,0,0 +53,4,176557,3,14,2,3,4,0,1,0,0,50,0,0 +55,0,71630,1,9,2,0,0,0,1,0,1617,40,0,0 +17,2,159849,2,7,0,11,3,0,1,0,0,30,0,0 +36,2,183425,5,10,2,2,0,0,0,0,0,40,0,0 +36,1,125933,10,15,0,3,0,0,0,0,0,55,0,1 +40,4,180123,1,9,3,7,3,1,0,0,0,40,0,0 +36,2,592930,1,9,1,6,1,1,0,0,0,50,0,1 +28,2,183802,1,9,1,6,1,0,0,0,0,55,0,0 +39,2,77005,3,14,1,3,1,0,0,99999,0,40,0,1 +49,2,80914,11,3,0,8,0,0,0,0,0,45,0,0 +63,5,165667,1,9,1,1,1,0,0,0,0,40,0,0 +61,2,123991,5,10,1,2,1,0,0,0,0,20,0,0 +48,5,181307,1,9,1,10,1,0,0,0,0,60,0,1 +55,2,124137,1,9,3,8,0,0,0,0,0,40,12,0 +20,2,291979,1,9,1,5,5,0,0,0,0,20,0,0 +49,2,91251,1,9,1,4,1,2,0,0,0,40,26,0 +27,3,148153,1,9,1,2,1,2,0,0,0,40,0,0 +37,2,131463,12,6,2,4,4,0,1,0,0,33,0,0 +32,0,127651,1,9,1,11,1,0,0,0,0,40,0,0 +33,5,239018,8,16,1,3,1,0,0,0,0,60,0,0 +47,2,276087,9,11,1,4,1,0,0,0,0,26,0,0 +34,2,386877,1,9,1,8,1,1,0,0,0,40,0,0 +61,2,210464,1,9,2,0,5,1,1,0,0,35,0,0 +25,2,632834,1,9,0,10,3,1,0,0,0,40,0,0 +26,2,245465,6,12,0,5,3,0,0,0,0,30,0,0 +18,2,198087,1,9,0,5,3,0,1,0,0,30,0,0 +35,2,27408,1,9,1,5,1,0,0,0,0,50,0,0 +56,2,314727,1,9,1,10,1,0,0,0,0,35,0,1 +40,0,269733,9,11,0,10,0,0,0,0,0,40,0,0 +24,2,177287,14,8,0,4,3,0,1,0,0,38,0,0 +66,2,167711,1,9,6,5,0,0,1,0,0,40,0,1 +42,2,112181,1,9,1,8,2,0,1,0,0,40,0,0 +28,2,339002,1,9,0,6,3,0,0,0,0,20,0,0 +39,0,24721,5,10,2,0,4,0,1,0,0,35,0,0 +65,1,37092,9,11,1,7,1,0,0,0,0,25,0,0 +20,2,216563,5,10,0,4,3,0,1,0,0,20,0,0 +52,2,204447,1,9,1,8,1,0,0,4386,0,40,0,1 +39,2,187089,5,10,2,5,0,0,1,0,0,40,0,0 +18,2,423052,1,9,0,8,0,0,1,0,0,30,0,0 +49,2,169180,7,4,1,8,2,0,1,0,0,40,37,0 +21,2,104981,5,10,0,3,3,0,0,0,0,48,0,0 +38,2,269323,1,9,1,0,1,0,0,0,0,40,0,1 +55,2,141549,1,9,1,10,1,0,0,0,0,40,0,0 +27,2,214858,12,6,1,10,5,0,0,0,0,55,0,0 +34,2,173524,1,9,4,0,4,0,1,0,0,40,0,0 +54,4,365049,5,10,0,3,0,0,1,0,0,40,4,0 +38,2,60355,1,9,0,0,4,0,1,0,0,40,0,0 +32,2,86808,1,9,2,0,5,0,1,0,0,40,0,0 +33,0,174171,5,10,4,9,0,0,0,0,0,12,0,0 +32,3,504951,6,12,1,11,1,0,0,0,0,50,0,0 +34,2,294064,3,14,1,1,1,0,0,0,0,50,23,0 +46,2,120131,0,13,1,4,1,0,0,0,0,30,0,1 +48,2,199058,3,14,1,1,1,0,0,0,0,40,0,1 +23,2,152328,5,10,0,1,3,0,0,0,0,40,0,0 +48,3,88564,7,4,3,2,4,0,0,0,0,40,0,0 +67,2,95113,1,9,1,1,1,0,0,0,0,37,0,1 +25,2,178421,0,13,0,4,0,0,1,0,0,20,0,0 +43,2,484861,5,10,1,10,1,0,0,4064,0,38,0,0 +27,4,225291,6,12,0,3,0,0,1,0,0,40,0,0 +56,2,205735,15,2,4,8,4,0,0,0,0,40,0,0 +54,1,58898,5,10,1,10,1,0,0,0,1579,48,0,0 +39,2,355468,1,9,1,5,1,0,0,0,1887,46,0,1 +60,1,184362,1,9,1,5,2,0,1,0,0,25,0,0 +27,2,347513,5,10,0,0,0,0,1,0,0,40,0,0 +21,2,138768,5,10,0,5,3,0,0,0,0,40,0,0 +24,2,29810,5,10,0,3,3,0,1,0,0,40,0,0 +31,2,126501,5,10,1,10,1,0,0,0,0,40,0,0 +22,2,60783,12,6,0,10,3,0,0,0,0,15,0,0 +26,2,179772,0,13,0,1,0,0,1,0,0,45,0,0 +45,5,281911,1,9,1,10,1,0,0,0,0,48,0,0 +33,2,70447,1,9,0,6,5,2,0,0,0,40,0,0 +29,2,327964,4,5,2,8,4,1,1,0,0,40,0,0 +72,2,496538,1,9,6,0,0,0,1,6360,0,40,0,0 +35,1,153066,1,9,1,10,1,0,0,0,0,60,0,1 +53,0,77651,1,9,1,10,1,0,0,0,0,40,0,0 +40,2,119493,5,10,0,1,3,0,1,0,0,40,0,0 +20,2,256240,1,9,0,4,3,0,0,0,0,30,0,0 +69,2,177374,1,9,6,0,4,0,1,1848,0,12,0,0 +41,4,37848,1,9,0,4,4,0,1,0,0,25,0,0 +45,2,129336,3,14,1,0,1,0,0,0,0,45,0,1 +27,2,183511,1,9,1,2,1,0,0,0,0,40,0,0 +46,5,120131,10,15,1,3,1,0,0,99999,0,60,0,1 +55,2,190508,5,10,1,6,1,1,0,0,0,35,0,0 +31,2,363130,5,10,1,1,1,1,0,0,0,40,0,1 +45,2,240356,5,10,2,5,0,0,1,0,0,55,0,0 +64,2,133166,1,9,1,1,1,0,0,0,0,5,0,0 +38,2,32916,5,10,1,1,1,0,0,0,0,45,0,0 +17,2,117477,12,6,0,4,3,0,0,0,0,40,0,0 +33,2,34748,1,9,1,0,2,0,1,0,1887,20,0,1 +22,2,459463,14,8,3,4,4,1,1,0,0,50,0,0 +23,2,95989,5,10,0,4,3,0,1,0,0,30,0,0 +25,2,118088,1,9,0,10,4,0,0,0,0,40,0,0 +33,2,150570,0,13,1,3,1,0,0,3103,0,43,0,1 +37,2,179731,1,9,0,4,4,0,1,0,0,35,0,0 +53,2,122109,1,9,4,0,4,0,1,0,1876,38,0,0 +28,4,163942,5,10,0,11,3,0,0,0,0,40,0,0 +33,2,106670,0,13,1,3,2,0,1,0,0,40,0,1 +41,2,123403,1,9,1,0,1,0,0,0,0,40,0,0 +61,5,119986,0,13,1,5,1,0,0,0,0,50,0,0 +25,2,66622,5,10,0,4,3,0,1,0,0,25,0,0 +35,2,260578,1,9,2,1,4,0,1,0,0,40,0,1 +64,4,96076,9,11,1,1,1,0,0,0,0,40,0,1 +28,2,70604,1,9,1,2,1,0,0,0,0,38,0,0 +39,1,230329,5,10,0,3,0,0,0,0,1564,12,0,1 +53,2,49715,1,9,2,6,4,0,0,0,0,40,0,0 +28,2,116531,1,9,0,0,0,0,1,0,0,40,0,0 +38,3,214542,5,10,2,2,4,1,1,0,0,40,0,0 +25,4,335005,0,13,0,3,0,0,0,0,0,35,25,0 +19,2,258633,5,10,0,4,0,0,1,0,0,30,0,0 +20,2,203240,6,12,0,0,0,0,1,0,0,30,0,0 +55,4,99131,1,9,1,3,5,0,1,0,2246,40,0,1 +52,0,125796,3,14,1,3,2,1,1,0,1848,40,0,1 +30,2,167790,1,9,0,0,3,0,1,0,0,40,0,0 +47,2,133758,1,9,2,1,0,0,1,0,1974,40,0,0 +22,2,106843,12,6,0,10,5,0,0,0,0,30,0,0 +24,2,117959,1,9,1,2,1,0,0,4386,0,40,0,1 +26,2,174921,0,13,0,5,0,0,1,0,0,40,0,0 +27,2,134152,1,9,1,8,1,0,0,0,0,45,0,0 +57,2,99364,4,5,1,8,1,0,0,0,0,40,5,0 +18,4,155905,3,14,0,3,3,0,1,0,0,60,0,0 +30,2,467108,0,13,0,3,0,0,0,0,0,45,0,0 +34,1,304622,0,13,2,3,4,0,1,0,0,50,0,0 +40,2,198692,5,10,1,0,1,0,0,5178,0,60,0,1 +60,2,178050,1,9,2,4,4,1,1,0,0,38,0,0 +25,2,162687,14,8,1,10,1,0,0,0,0,40,0,1 +39,2,113151,0,13,1,5,1,0,0,0,0,55,0,0 +48,2,158924,1,9,1,0,2,0,1,0,0,40,0,1 +27,1,141795,5,10,1,1,1,0,0,0,0,30,0,0 +33,1,33404,1,9,2,10,0,0,0,0,0,65,0,1 +65,5,178771,1,9,1,1,1,0,0,0,0,40,0,0 +52,2,168553,1,9,1,10,1,0,0,0,1977,40,0,1 +27,2,110648,0,13,0,9,3,0,0,0,0,40,0,0 +32,2,151053,5,10,0,10,4,0,0,0,0,40,0,0 +45,1,142871,5,10,4,5,4,0,0,0,0,50,0,0 +27,2,183523,0,13,0,1,0,0,0,0,0,45,0,0 +57,1,222216,5,10,1,1,2,0,1,0,0,60,0,0 +44,2,121874,5,10,2,5,4,0,0,0,0,55,0,1 +30,2,467108,3,14,1,3,1,0,0,0,0,44,0,1 +26,2,34393,5,10,2,0,0,0,1,0,0,40,0,0 +28,3,42003,5,10,1,0,1,0,0,0,0,40,0,1 +61,2,180418,1,9,1,6,1,0,0,0,0,40,0,1 +49,1,199590,1,9,1,10,1,0,0,0,0,50,4,0 +33,2,144949,3,14,1,3,1,0,0,15024,0,40,0,1 +50,2,155594,6,12,1,8,1,0,0,0,0,50,0,1 +53,1,162576,7,4,1,9,1,0,0,0,0,99,0,0 +33,2,232475,1,9,1,10,1,0,0,0,0,40,0,1 +22,2,269474,5,10,0,0,3,0,0,0,0,10,0,0 +45,4,140644,0,13,2,11,0,0,0,0,0,40,0,1 +47,1,159726,1,9,1,10,1,0,0,0,0,40,0,1 +52,3,290856,0,13,1,3,1,0,0,0,0,40,0,1 +57,2,217886,1,9,6,0,0,0,1,0,0,36,0,0 +58,2,106546,1,9,2,0,4,0,1,2174,0,40,0,0 +50,4,220640,3,14,2,3,0,3,1,0,0,50,0,1 +33,3,88913,5,10,0,0,3,2,1,0,0,40,0,0 +34,1,288486,2,7,1,10,1,0,0,0,0,40,0,0 +20,2,227411,5,10,0,4,3,0,1,0,0,20,0,0 +37,4,99935,3,14,1,11,1,0,0,7688,0,50,0,1 +57,2,201112,6,12,2,0,0,1,1,0,0,40,0,0 +57,1,123778,1,9,1,5,1,0,0,0,0,48,0,0 +21,2,204596,6,12,0,0,3,0,1,0,0,8,0,0 +40,2,190290,5,10,2,5,0,0,0,0,0,40,0,0 +23,2,196674,5,10,4,10,0,0,0,0,0,40,0,0 +54,2,108435,1,9,1,0,1,0,0,0,0,20,0,0 +38,2,186359,5,10,1,1,1,0,0,0,0,40,0,1 +32,2,137076,5,10,1,1,1,0,0,15024,0,60,0,1 +22,0,262819,5,10,0,0,0,0,1,0,0,40,0,0 +27,2,171655,1,9,0,0,0,0,1,0,0,42,0,0 +42,2,183319,11,3,1,4,1,0,0,0,0,40,22,0 +36,2,127306,1,9,0,0,0,0,1,0,0,47,0,0 +22,2,68678,1,9,1,5,1,1,0,0,0,40,0,0 +40,0,140108,4,5,4,8,0,1,0,0,0,40,0,0 +26,2,263444,1,9,1,8,1,0,0,0,0,45,0,0 +46,0,265554,1,9,0,6,0,1,0,0,0,40,0,0 +28,2,410216,2,7,1,10,0,0,0,0,0,60,0,1 +46,0,20534,0,13,0,1,0,0,0,0,0,45,0,0 +55,2,188917,1,9,2,2,0,0,1,0,0,40,0,0 +76,2,98695,5,10,2,0,0,0,1,0,0,20,0,0 +27,2,411950,0,13,0,3,0,0,0,0,0,60,0,0 +50,2,237819,1,9,1,6,1,0,0,0,0,40,0,1 +75,2,187424,1,9,1,10,1,0,0,0,0,20,0,0 +42,3,198316,3,14,1,1,1,0,0,0,0,40,0,1 +36,4,139703,3,14,0,3,0,1,1,0,0,40,0,0 +51,2,152596,1,9,1,11,1,0,0,0,0,40,0,0 +43,2,194726,10,15,1,3,1,0,0,15024,0,55,0,1 +44,2,82601,0,13,1,6,1,0,0,0,0,40,0,0 +60,2,122276,11,3,1,10,1,0,0,0,0,45,25,0 +47,0,188386,0,13,1,3,1,0,0,0,0,45,0,1 +73,2,92298,2,7,1,8,1,0,0,0,0,15,0,0 +27,2,390657,1,9,1,2,1,1,0,0,0,40,0,0 +50,2,89041,1,9,1,10,1,0,0,15024,0,50,0,1 +35,2,314897,7,4,1,10,1,0,0,0,0,40,5,0 +45,2,88781,0,13,1,10,1,0,0,0,0,40,9,1 +57,2,41762,1,9,1,10,1,2,0,0,0,40,27,1 +34,2,849857,1,9,1,10,1,0,0,0,0,40,35,0 +19,2,307496,5,10,0,4,3,0,1,0,0,16,0,0 +25,2,324372,1,9,0,2,3,1,0,0,0,40,0,0 +39,2,99270,0,13,1,3,2,0,1,0,0,50,9,1 +28,2,160731,1,9,1,10,1,0,0,0,0,40,12,1 +48,0,148306,3,14,2,3,4,0,1,0,0,40,0,0 +38,2,259019,1,9,1,10,1,0,0,0,0,44,0,0 +53,2,224894,11,3,1,13,2,1,1,0,0,10,19,0 +19,2,258470,1,9,0,2,0,0,0,0,0,40,0,0 +41,2,197919,1,9,1,0,2,0,1,0,0,60,0,0 +23,2,213719,6,12,0,5,3,1,1,0,0,36,0,0 +32,2,226535,1,9,0,10,0,0,0,0,0,40,0,0 +35,2,146042,5,10,2,8,0,3,0,0,0,40,0,0 +21,2,180339,9,11,0,7,0,0,1,0,1602,30,0,0 +24,2,99970,0,13,0,9,3,0,0,0,0,40,0,0 +34,2,300687,1,9,1,10,1,1,0,0,0,40,0,0 +29,4,219906,0,13,1,3,2,0,1,0,0,25,0,1 +55,2,158641,1,9,6,0,0,0,1,0,0,40,0,0 +28,2,239539,1,9,3,8,3,2,0,0,0,40,11,0 +46,4,102308,1,9,0,10,3,0,0,0,0,40,0,0 +38,2,186934,1,9,1,8,1,0,0,0,0,40,0,0 +29,2,234447,5,10,2,0,0,1,1,0,0,40,0,0 +35,2,125933,0,13,1,10,1,0,0,0,0,50,0,1 +29,2,142760,1,9,0,2,0,1,0,0,0,40,0,0 +41,0,309056,8,16,1,3,1,0,0,0,0,50,0,1 +40,1,48859,1,9,1,10,1,0,0,0,0,32,0,0 +30,2,110594,1,9,2,0,3,0,1,0,0,40,0,0 +72,2,426562,2,7,2,4,0,1,1,0,0,35,0,0 +17,2,169037,2,7,0,2,3,0,0,0,0,40,0,0 +46,5,123075,1,9,1,11,1,0,0,0,0,70,0,0 +38,2,195744,0,13,0,4,0,0,0,0,0,48,0,0 +36,2,81896,0,13,0,3,0,0,1,0,0,45,0,0 +24,1,172047,6,12,0,10,3,0,0,0,0,40,0,0 +28,2,253814,1,9,2,4,4,0,1,0,0,35,0,0 +28,2,66473,1,9,1,8,1,0,0,0,0,40,0,0 +42,4,271521,5,10,1,11,1,4,0,0,0,40,0,1 +48,2,265295,0,13,1,1,1,0,0,0,0,40,0,1 +37,1,174308,1,9,1,10,1,0,0,0,0,40,0,0 +32,2,196342,8,16,0,3,0,0,0,0,0,40,0,1 +55,2,223594,5,10,1,10,1,1,0,7688,0,40,5,1 +30,2,149787,5,10,1,2,1,0,0,0,0,40,0,0 +68,2,124686,7,4,6,8,0,0,1,0,0,10,0,0 +45,2,50163,1,9,2,4,0,0,1,0,0,30,0,0 +26,2,175789,1,9,2,2,3,0,1,0,0,40,0,0 +22,2,218215,5,10,0,1,3,0,1,0,0,40,0,0 +22,2,166371,5,10,0,10,3,0,0,0,0,40,0,0 +36,2,169469,5,10,1,1,1,0,0,7298,0,40,0,1 +52,2,145081,7,4,0,8,0,1,1,0,0,40,0,0 +68,2,214521,10,15,6,3,4,0,1,0,0,16,0,0 +26,4,287233,0,13,1,3,2,1,1,0,0,40,0,1 +46,1,197836,1,9,1,7,1,0,0,0,1672,50,0,0 +53,2,158294,3,14,1,3,1,0,0,7298,0,40,0,1 +17,2,127366,2,7,0,5,3,0,1,0,0,8,0,0 +29,2,203697,0,13,1,3,3,0,0,0,0,75,0,0 +41,2,168730,5,10,1,5,1,0,0,0,0,50,0,1 +45,2,165232,5,10,2,9,0,1,1,0,0,40,33,0 +57,2,175942,5,10,2,1,0,0,1,0,0,50,0,1 +30,3,356689,0,13,1,0,1,0,0,0,0,30,28,0 +46,2,132912,1,9,1,5,1,0,0,0,0,45,0,1 +45,2,187226,6,12,1,2,1,0,0,0,0,40,0,0 +40,2,202565,6,12,1,5,1,0,0,0,0,52,0,0 +38,0,103925,1,9,2,4,4,0,1,2036,0,20,0,0 +59,1,70623,7,4,1,5,1,0,0,0,0,85,0,0 +36,2,102729,5,10,0,10,0,0,0,0,0,40,0,0 +40,2,558944,7,4,0,7,3,0,0,0,0,40,0,0 +18,2,256967,12,6,0,5,5,1,1,0,0,40,0,0 +63,2,102412,1,9,2,5,0,0,1,0,0,40,0,0 +29,2,159788,3,14,0,3,0,0,1,0,0,80,0,0 +27,2,55743,0,13,1,1,2,1,1,0,0,45,0,1 +47,0,148171,8,16,2,3,4,0,0,0,0,50,23,1 +20,4,271354,1,9,0,0,3,0,0,0,0,40,0,0 +48,2,98524,6,12,1,10,1,0,0,0,0,45,0,0 +29,2,272913,1,9,1,0,1,0,0,0,0,30,4,0 +22,2,324445,1,9,0,9,0,0,1,0,0,40,0,0 +42,2,155469,6,12,6,9,4,0,1,0,0,24,0,0 +36,2,102945,9,11,2,10,0,0,0,0,0,40,0,0 +60,2,291904,12,6,2,4,0,1,1,0,0,40,0,0 +41,3,186601,1,9,4,1,0,1,1,0,0,40,0,0 +43,2,172401,1,9,1,5,1,0,0,0,0,40,0,1 +33,2,193285,0,13,1,3,1,0,0,0,0,38,0,1 +34,2,176244,7,4,1,4,2,0,1,0,0,40,0,0 +32,2,117779,1,9,0,6,3,0,1,0,0,35,0,0 +52,2,169182,4,5,6,4,0,0,1,0,0,25,5,0 +27,2,180758,6,12,0,5,0,0,0,0,0,40,0,0 +60,4,141637,3,14,1,3,1,0,0,0,0,40,0,1 +41,1,169023,0,13,1,0,2,0,1,7688,0,40,0,1 +34,1,101266,0,13,0,5,0,0,0,0,0,62,0,0 +30,2,164190,1,9,1,1,1,0,0,0,0,40,0,1 +35,2,142282,5,10,4,4,4,0,1,0,0,25,0,0 +39,3,103984,0,13,2,1,4,1,1,0,0,40,0,0 +64,2,187601,5,10,6,0,0,0,1,0,0,40,0,0 +17,1,36218,2,7,0,7,3,0,0,0,0,20,0,0 +37,4,249392,9,11,1,11,1,0,0,0,0,40,0,1 +43,1,110355,1,9,1,6,1,0,0,0,0,45,0,0 +30,1,117944,1,9,1,3,1,0,0,0,0,25,0,0 +17,2,163836,12,6,0,5,3,0,1,0,0,12,0,0 +29,2,145592,1,9,0,10,0,0,0,0,0,40,24,0 +24,2,108495,5,10,0,0,3,0,0,0,0,40,3,0 +27,1,212041,0,13,0,5,0,0,0,0,0,50,0,0 +69,5,182451,0,13,4,1,0,0,0,0,0,40,0,0 +30,2,124020,1,9,3,0,0,0,0,0,0,40,0,0 +29,2,199116,1,9,1,8,1,0,0,0,0,40,5,0 +61,2,107438,7,4,1,6,1,1,0,0,1651,40,0,0 +70,2,405362,7,4,6,4,4,1,1,0,0,38,0,0 +32,2,175856,0,13,1,9,1,0,0,0,1902,40,0,1 +27,1,420054,1,9,0,10,4,0,0,9562,0,50,0,1 +27,2,86681,0,13,0,4,0,0,1,0,0,40,0,0 +19,2,187161,5,10,0,5,3,0,1,0,0,25,0,0 +44,0,691903,3,14,1,3,1,1,0,0,0,60,0,1 +36,2,219483,5,10,0,0,0,0,1,0,0,40,0,0 +45,2,199058,3,14,1,1,1,0,0,7298,0,50,0,1 +29,2,192010,0,13,0,3,0,0,1,0,0,60,12,0 +34,3,419691,0,13,1,11,1,0,0,7298,0,54,0,1 +28,4,356089,0,13,0,3,5,0,0,0,0,50,0,0 +34,2,684015,11,3,0,2,3,0,0,0,0,40,22,0 +18,2,36882,1,9,0,0,3,0,1,0,0,20,0,0 +39,2,203180,5,10,2,7,4,0,1,0,0,45,0,0 +34,2,183811,5,10,0,2,0,0,0,0,0,40,0,0 +35,4,103966,3,14,2,0,4,0,1,0,0,41,0,0 +24,2,304602,1,9,0,2,3,0,0,0,0,40,0,0 +41,2,57233,0,13,1,5,1,0,0,0,0,70,0,0 +50,0,289207,8,16,1,3,1,0,0,0,1902,45,0,1 +68,2,224019,5,10,2,1,0,0,0,0,0,30,0,0 +35,2,267966,2,7,0,8,0,0,0,0,0,50,0,0 +47,2,214800,9,11,1,2,1,0,0,0,0,40,0,0 +43,4,241528,3,14,2,3,4,0,1,0,0,40,0,0 +35,2,197365,1,9,1,7,1,0,0,0,0,40,0,0 +34,2,296724,5,10,0,1,0,0,1,0,0,17,0,0 +26,2,136226,1,9,0,10,3,0,0,0,0,40,0,0 +50,2,40623,5,10,2,5,0,0,1,0,0,40,0,0 +22,2,264874,1,9,0,10,3,0,1,0,0,40,0,0 +20,2,112847,1,9,0,7,3,2,0,0,0,40,0,0 +52,1,89028,1,9,1,10,1,2,0,0,0,40,0,0 +71,0,210673,1,9,1,11,1,0,0,0,0,28,0,0 +55,2,60193,1,9,2,0,0,0,1,0,0,40,0,0 +17,2,216137,2,7,0,5,3,0,1,0,0,8,0,0 +36,2,139743,5,10,6,3,3,0,1,0,0,40,0,0 +39,4,423605,14,8,1,6,1,0,0,0,1848,40,35,1 +27,2,298871,0,13,0,4,0,2,0,0,0,40,11,0 +42,2,318255,1,9,2,0,4,0,1,0,0,40,0,0 +22,2,347867,1,9,3,5,0,0,0,0,1719,40,0,0 +57,2,279636,9,11,0,10,0,0,0,0,0,40,0,1 +34,2,405386,5,10,0,10,0,1,0,0,0,28,0,0 +31,2,297188,3,14,0,3,0,0,1,0,0,60,0,0 +24,2,182342,0,13,0,5,3,0,0,0,0,40,0,0 +41,1,229148,1,9,0,4,0,1,0,0,0,60,2,0 +30,2,189620,5,10,2,3,0,0,1,6849,0,40,7,0 +17,2,413557,2,7,0,0,3,0,1,0,0,32,0,0 +26,5,246025,1,9,4,5,4,0,1,0,0,20,6,0 +32,2,390997,15,2,0,7,0,4,0,0,0,50,4,0 +55,2,102058,12,6,1,1,1,0,0,0,0,45,0,0 +19,2,247298,14,8,3,4,3,4,1,0,0,20,0,0 +28,2,140108,3,14,2,3,0,0,1,0,0,50,0,0 +49,2,81654,10,15,1,3,1,0,0,0,0,60,0,1 +23,2,177526,0,13,0,1,0,0,0,0,0,40,0,0 +43,2,64631,1,9,1,10,1,0,0,0,0,40,0,0 +40,2,110028,5,10,1,10,1,0,0,0,0,40,0,0 +41,2,203761,0,13,1,3,1,0,0,0,0,40,0,1 +23,2,163870,5,10,0,10,3,0,0,0,0,40,0,0 +59,3,117299,1,9,1,10,1,0,0,0,1887,40,0,1 +20,2,50648,1,9,0,2,3,0,0,0,0,35,0,0 +21,2,166517,1,9,0,10,3,0,0,0,0,40,0,0 +44,5,181762,5,10,1,1,1,0,0,0,0,50,0,0 +31,1,340880,0,13,1,5,1,0,0,0,0,48,0,0 +50,1,114758,0,13,0,10,0,0,0,4416,0,45,0,0 +54,2,138847,1,9,1,8,1,0,0,0,0,45,0,1 +28,2,215014,1,9,1,6,1,0,0,0,0,50,0,0 +34,2,183778,1,9,2,6,0,0,0,0,0,40,0,0 +46,2,273629,3,14,1,1,1,0,0,0,0,40,0,1 +28,5,113870,0,13,1,1,1,0,0,0,0,60,0,1 +23,2,213955,1,9,0,0,3,1,0,0,2001,40,0,0 +29,2,114982,0,13,1,9,1,0,0,0,0,40,0,1 +35,2,205338,1,9,1,10,1,0,0,0,0,40,0,0 +41,1,57924,5,10,1,7,1,0,0,7688,0,50,0,1 +35,1,202027,3,14,1,1,1,0,0,7688,0,55,0,1 +20,2,281356,1,9,1,2,1,4,0,0,0,40,0,0 +42,2,30824,3,14,2,3,0,0,1,2354,0,16,0,0 +56,2,98809,7,4,1,8,2,0,1,5013,0,45,0,0 +31,2,38223,0,13,0,5,3,0,0,0,0,45,0,0 +23,2,172232,1,9,0,9,3,0,0,0,0,50,0,0 +60,2,140544,1,9,0,2,0,0,0,0,0,40,0,0 +28,2,221366,5,10,0,10,3,0,0,0,0,40,0,0 +32,2,180799,5,10,1,6,1,0,0,0,0,60,0,1 +36,2,111499,3,14,0,1,0,0,1,14084,0,40,0,1 +44,1,155930,0,13,1,1,1,0,0,0,0,60,0,0 +34,2,201122,5,10,1,10,1,0,0,0,0,48,0,1 +27,2,101709,1,9,0,5,3,2,0,0,0,40,0,0 +49,2,140121,1,9,2,1,4,0,0,0,0,50,0,0 +48,2,172709,1,9,2,4,4,1,1,0,0,40,0,0 +47,2,120131,1,9,1,10,1,0,0,0,0,50,0,1 +34,2,117444,0,13,1,1,1,0,0,0,0,65,0,1 +27,2,256764,6,12,0,5,0,0,0,0,0,40,0,0 +24,2,223811,5,10,1,10,1,0,0,0,0,40,0,0 +24,2,201603,1,9,2,2,0,0,0,0,0,30,0,0 +25,2,138765,5,10,1,8,1,0,0,0,0,40,0,0 +36,2,133974,9,11,2,5,4,0,1,0,0,40,0,0 +38,3,137953,1,9,1,0,1,0,0,0,0,45,0,0 +57,2,103403,11,3,1,6,1,0,0,0,0,40,0,0 +24,2,461678,5,10,1,7,1,0,0,0,0,50,0,1 +41,0,70884,1,9,1,9,1,0,0,0,0,40,0,0 +56,0,466498,9,11,1,10,1,1,0,0,0,60,0,1 +19,2,148644,1,9,0,0,3,0,1,0,0,40,0,0 +44,2,190739,1,9,0,4,5,1,0,0,0,32,0,0 +34,2,299507,9,11,0,10,0,0,1,0,0,40,0,0 +25,2,211424,0,13,0,1,3,0,0,0,0,40,0,0 +27,0,106721,1,9,1,9,1,0,0,0,0,40,0,0 +22,2,192017,1,9,0,3,0,0,0,0,0,40,0,0 +59,2,530099,5,10,1,10,1,0,0,0,1887,55,0,1 +34,2,119153,2,7,1,6,1,0,0,0,0,50,0,0 +30,2,202450,1,9,1,6,1,0,0,0,0,65,0,1 +21,2,50341,5,10,0,0,0,0,1,0,0,38,0,0 +24,2,140001,5,10,0,2,5,0,0,0,0,40,25,0 +35,2,31964,0,13,1,5,1,0,0,0,0,50,0,1 +32,2,148207,9,11,1,10,1,0,0,0,0,40,0,0 +45,2,151627,5,10,2,0,4,0,1,0,0,45,0,0 +30,2,402539,1,9,0,0,4,0,1,0,0,40,0,0 +28,1,188278,0,13,1,10,1,0,0,0,0,55,0,0 +28,1,96219,0,13,1,5,2,0,1,0,0,5,0,0 +29,2,340534,1,9,0,0,0,0,1,0,0,44,0,0 +60,2,160339,5,10,1,10,1,0,0,0,0,40,13,0 +28,2,120135,9,11,0,5,0,0,1,0,0,40,0,0 +38,3,303817,5,10,2,1,0,1,1,0,0,40,0,0 +31,2,181091,1,9,1,10,1,0,0,0,0,50,0,1 +28,2,200515,5,10,1,4,1,0,0,0,0,35,0,1 +42,2,160893,5,10,1,4,2,0,1,0,0,23,0,0 +40,4,183096,4,5,1,4,2,0,1,0,0,40,29,1 +24,2,241367,5,10,0,4,0,0,0,0,0,40,0,0 +37,5,342084,5,10,1,1,1,0,0,0,0,60,0,1 +36,2,193855,1,9,1,10,1,0,0,0,0,40,0,0 +39,2,80410,0,13,0,1,0,0,0,0,0,40,0,0 +22,2,554317,4,5,3,4,5,0,0,0,0,35,4,0 +46,2,85109,5,10,1,8,1,0,0,0,1628,40,0,0 +28,2,108569,0,13,1,3,1,0,0,0,0,43,0,0 +34,2,120959,5,10,2,0,4,0,1,0,0,40,0,0 +42,2,222011,5,10,2,5,4,0,1,0,0,43,0,0 +43,2,238530,1,9,1,10,1,0,0,0,0,40,0,0 +35,2,48404,1,9,0,5,3,0,1,0,0,40,0,0 +60,2,88055,10,15,1,3,1,0,0,3781,0,16,0,0 +33,2,238381,5,10,0,10,0,1,0,8614,0,40,0,1 +22,2,243923,1,9,1,6,5,0,0,0,0,80,0,0 +39,2,305597,9,11,1,10,1,0,0,0,0,40,0,0 +33,2,141841,0,13,1,1,1,1,0,5178,0,40,0,1 +39,2,129764,1,9,1,10,1,0,0,0,0,40,0,0 +37,1,150993,2,7,1,6,1,0,0,0,0,45,0,0 +63,1,147140,7,4,1,7,1,0,0,0,0,60,0,1 +46,0,30219,5,10,1,1,1,0,0,7688,0,38,0,1 +48,2,167967,1,9,4,8,4,1,1,0,0,40,0,0 +33,2,133278,1,9,0,0,3,1,1,0,0,40,0,0 +65,2,172510,5,10,6,3,0,0,1,1848,0,20,39,0 +39,2,192251,1,9,0,0,3,0,1,0,0,40,0,1 +43,2,210844,0,13,2,1,0,1,1,0,0,40,0,1 +28,2,263015,12,6,1,10,1,0,0,0,0,40,0,0 +50,1,155118,1,9,2,1,0,0,1,99999,0,35,0,1 +24,0,232918,0,13,0,3,0,0,0,0,0,20,0,0 +48,2,143542,1,9,2,6,0,0,0,0,0,40,0,0 +35,2,45607,5,10,0,4,0,0,0,0,0,40,0,0 +62,2,29828,1,9,1,6,1,0,0,0,0,40,0,0 +42,1,104118,5,10,0,1,0,0,0,0,0,40,0,0 +60,2,191446,1,9,1,1,1,0,0,99999,0,40,0,1 +50,2,27484,1,9,1,1,1,0,0,0,0,50,0,1 +40,2,205987,10,15,0,1,0,0,1,0,0,40,1,0 +39,4,143385,1,9,1,10,1,0,0,0,0,40,0,0 +43,4,186995,1,9,2,11,4,0,1,0,0,40,0,0 +35,2,54159,1,9,1,10,1,0,0,0,0,38,0,0 +39,2,113481,0,13,1,1,1,0,0,0,0,45,0,1 +30,4,235271,0,13,1,11,1,0,0,0,0,40,0,1 +32,2,349365,5,10,1,5,1,1,0,0,0,65,0,0 +18,2,283637,5,10,0,0,0,0,0,0,0,40,0,0 +37,2,70282,6,12,0,5,4,1,1,0,0,40,0,0 +26,2,166051,0,13,0,0,3,0,1,0,0,40,0,0 +51,2,193720,1,9,1,10,1,0,0,0,0,42,0,0 +33,2,236379,0,13,1,5,1,0,0,0,0,45,0,0 +46,2,122026,0,13,1,10,1,0,0,0,0,44,0,1 +40,2,114537,9,11,1,1,1,0,0,0,0,50,0,1 +34,2,191834,9,11,1,10,1,0,0,0,0,48,0,0 +29,2,420054,1,9,1,8,1,0,0,0,0,40,0,0 +47,1,160045,5,10,6,4,4,0,1,0,0,35,0,0 +45,2,190088,1,9,3,0,4,0,1,0,0,30,0,0 +53,2,126977,1,9,4,10,0,0,0,0,0,35,0,0 +52,1,63004,3,14,1,1,1,2,0,0,0,40,11,0 +64,2,391121,7,4,1,7,1,0,0,0,0,40,0,1 +42,2,211450,3,14,0,1,0,0,0,0,0,45,0,1 +44,2,156413,5,10,1,9,1,0,0,0,0,44,0,1 +41,2,116797,1,9,1,5,1,0,0,7298,0,50,0,1 +53,4,204447,3,14,1,1,1,0,0,0,0,43,0,1 +25,2,66935,1,9,0,10,0,0,0,0,0,35,0,0 +20,2,344278,2,7,4,4,3,0,1,0,0,40,0,0 +29,2,108574,9,11,0,13,3,0,1,0,0,40,0,0 +56,2,244605,1,9,1,10,1,0,0,0,0,40,0,0 +45,2,363677,8,16,1,3,2,0,1,0,1977,30,0,1 +56,2,219762,1,9,1,5,2,0,1,0,0,35,0,0 +38,5,269318,5,10,1,1,1,0,0,7298,0,40,0,1 +62,2,77884,1,9,1,5,1,2,0,0,0,40,11,0 +28,1,70100,0,13,0,3,0,0,0,0,0,60,0,0 +31,2,213643,1,9,1,5,1,0,0,3908,0,40,0,0 +24,2,69640,0,13,0,5,3,0,0,0,0,40,0,0 +65,2,170012,0,13,1,0,1,0,0,0,0,34,0,0 +40,2,329924,1,9,4,2,0,1,0,0,0,30,0,0 +31,2,193285,0,13,0,3,0,0,0,0,0,40,0,0 +35,2,261241,1,9,2,6,0,0,0,0,1741,60,0,0 +42,3,108183,3,14,1,3,1,2,0,0,1902,40,27,1 +20,2,296618,1,9,0,5,0,0,1,0,0,30,0,0 +30,4,257796,5,10,2,0,0,0,1,0,0,40,0,0 +25,2,155320,0,13,0,1,3,0,0,0,0,45,0,0 +22,2,151888,1,9,0,4,3,0,0,0,0,40,0,0 +31,2,66278,5,10,1,3,2,0,1,3908,0,40,0,0 +56,2,92444,5,10,1,1,1,1,0,0,0,50,0,1 +51,2,229272,1,9,2,4,5,1,0,0,0,32,19,0 +36,1,207202,12,6,1,7,1,0,0,0,0,60,0,0 +44,0,154176,5,10,2,0,0,1,1,0,1590,40,0,0 +49,2,180899,3,14,2,1,4,0,0,0,1755,45,0,1 +28,2,205337,1,9,1,10,1,0,0,0,0,40,0,0 +57,2,180779,0,13,1,3,1,0,0,7298,0,40,0,1 +33,1,343021,5,10,0,5,0,0,0,0,0,65,0,0 +49,2,176814,0,13,1,0,1,0,0,5178,0,40,0,1 +74,0,88638,8,16,0,3,5,0,1,0,3683,20,0,1 +48,2,248059,0,13,1,1,1,0,0,5013,0,45,0,0 +38,2,409604,0,13,1,1,1,0,0,15024,0,40,0,1 +39,2,185053,1,9,0,8,0,0,1,0,0,40,0,0 +46,2,332884,0,13,1,1,1,0,0,7298,0,65,0,1 +56,2,212864,0,13,1,3,1,0,0,0,0,40,0,1 +27,2,66473,0,13,1,1,1,0,0,0,0,40,0,1 +17,2,285169,2,7,0,13,3,0,1,0,0,40,0,0 +28,2,175431,4,5,2,3,0,1,1,0,0,40,0,0 +42,2,339346,3,14,2,0,0,0,1,0,0,25,0,0 +39,2,287306,5,10,4,0,4,1,1,0,0,40,0,0 +29,1,70604,1,9,1,7,1,0,0,3464,0,40,0,0 +21,2,88926,5,10,0,3,3,0,0,0,0,10,0,0 +36,2,91275,5,10,0,0,4,2,1,0,0,40,0,0 +56,2,244554,12,6,6,8,4,1,1,0,0,40,0,0 +49,2,232586,11,3,1,10,1,0,0,0,0,40,0,0 +47,5,127678,5,10,1,5,1,0,0,0,0,80,0,0 +44,2,162184,5,10,4,0,4,0,1,0,0,40,0,0 +40,2,408229,15,2,0,4,0,0,0,0,0,45,22,0 +43,0,139734,0,13,1,1,1,0,0,15024,0,40,0,1 +62,2,197286,14,8,1,7,1,0,0,0,0,48,9,0 +52,2,229983,10,15,1,3,2,0,1,3103,0,30,0,1 +25,2,252803,1,9,0,4,4,1,1,0,0,40,0,0 +63,5,110890,3,14,2,3,0,0,0,0,0,70,0,1 +51,2,160724,8,16,1,3,1,2,0,0,0,99,27,0 +25,2,89625,1,9,0,0,3,2,1,0,0,40,0,0 +27,2,126730,1,9,0,5,0,0,1,0,0,40,0,0 +48,3,96854,5,10,0,0,0,0,0,0,0,30,0,0 +32,2,186788,1,9,1,6,1,0,0,0,0,40,0,0 +36,2,28996,5,10,1,5,1,0,0,0,0,45,0,0 +30,1,347166,1,9,2,10,0,0,0,0,0,40,0,0 +45,0,110311,3,14,2,1,4,0,1,0,0,40,0,0 +27,2,310850,1,9,1,6,1,0,0,0,0,50,0,0 +41,2,220694,0,13,2,4,0,0,0,0,0,37,0,0 +61,2,149405,1,9,1,4,1,1,0,0,0,40,0,0 +70,5,131699,0,13,2,1,4,0,1,0,0,55,0,0 +55,2,49996,2,7,0,8,0,1,1,0,0,40,0,0 +35,2,187112,0,13,0,4,0,0,1,0,0,45,0,0 +36,2,180859,9,11,1,2,1,0,0,0,0,38,0,0 +29,2,185647,5,10,0,9,3,0,0,0,0,60,0,0 +30,2,316606,0,13,1,4,2,0,1,0,0,40,0,0 +39,3,193583,0,13,2,3,4,0,1,5455,0,60,0,0 +18,2,338836,1,9,0,4,3,0,0,0,0,20,0,0 +28,2,216814,1,9,1,6,1,1,0,0,0,40,0,0 +27,2,106935,0,13,1,1,1,0,0,0,0,45,0,0 +38,2,223433,1,9,0,8,0,0,0,0,0,40,0,0 +33,2,174789,1,9,1,10,1,0,0,0,0,40,0,0 +25,2,135603,1,9,1,6,1,0,0,0,0,40,0,1 +38,2,372484,2,7,0,4,3,1,1,0,0,40,0,0 +23,2,181820,5,10,0,7,4,0,0,0,0,45,0,0 +40,2,235371,9,11,2,3,4,0,0,0,0,40,0,0 +20,2,299399,5,10,0,5,3,0,1,0,0,20,0,0 +41,2,202508,1,9,1,8,1,0,0,0,0,48,0,0 +44,2,172025,5,10,4,0,4,0,1,0,0,38,0,0 +49,5,246891,0,13,1,0,1,0,0,0,0,40,0,1 +22,2,450920,6,12,0,0,0,1,1,0,0,40,0,0 +26,2,53598,5,10,0,0,0,0,1,0,0,40,0,0 +47,2,103757,6,12,1,10,1,0,0,0,0,40,0,0 +48,2,76017,1,9,6,4,4,0,1,0,0,25,0,0 +28,5,80158,1,9,0,1,3,0,0,0,0,40,0,0 +37,3,90881,5,10,4,1,0,0,0,8614,0,55,0,1 +44,2,427952,0,13,1,3,1,0,0,0,0,40,0,0 +53,2,177916,0,13,1,0,1,0,0,7298,0,40,0,1 +36,2,342642,3,14,0,1,0,0,0,0,0,15,0,0 +77,2,253642,7,4,1,8,1,4,0,0,0,30,0,0 +21,2,219086,1,9,0,4,3,0,0,0,0,35,0,0 +24,2,162593,0,13,0,0,0,2,1,0,0,40,0,0 +30,2,87561,6,12,0,9,0,0,1,0,0,40,0,0 +51,4,142411,9,11,2,0,4,0,1,0,0,50,0,0 +22,2,154422,5,10,2,5,3,2,1,0,0,30,11,0 +23,2,169104,5,10,0,5,3,2,0,0,0,25,0,0 +47,2,193047,8,16,1,1,1,0,0,99999,0,50,0,1 +17,2,151141,14,8,0,5,3,0,0,0,0,20,0,0 +48,2,267912,0,13,0,4,0,0,0,0,0,50,4,1 +43,2,137126,5,10,1,1,1,0,0,0,0,40,0,1 +34,2,152453,14,8,1,10,1,0,0,0,0,40,24,0 +19,2,357059,1,9,0,0,3,0,1,0,0,35,0,0 +42,0,202011,5,10,0,1,0,0,1,0,0,40,0,0 +23,2,98283,0,13,0,1,3,2,0,0,0,40,0,0 +61,1,176965,10,15,1,3,1,0,0,0,0,50,0,1 +63,2,187919,2,7,1,4,1,0,0,0,0,30,0,0 +65,2,274916,1,9,6,5,4,0,1,0,0,40,0,0 +37,2,105813,9,11,1,0,1,0,0,7298,0,40,0,1 +41,4,193524,6,12,1,9,1,0,0,0,0,40,0,1 +21,2,263641,1,9,2,5,5,0,1,0,0,40,0,0 +48,4,102076,0,13,0,0,4,0,1,0,0,35,0,0 +51,0,155594,5,10,1,5,1,0,0,0,1887,40,0,1 +43,2,33331,0,13,1,5,1,0,0,0,0,55,0,0 +56,1,115439,5,10,1,10,1,0,0,0,0,60,0,0 +47,2,181652,1,9,2,0,0,0,1,0,0,40,0,0 +26,2,120268,0,13,0,0,3,0,0,0,0,24,0,0 +39,2,196308,5,10,1,4,2,0,1,0,0,24,0,0 +45,1,40690,5,10,0,7,3,0,0,0,0,75,0,0 +49,2,228583,1,9,2,4,4,0,0,0,0,40,13,0 +23,2,695136,1,9,0,2,0,0,0,0,0,30,0,0 +69,2,209236,1,9,1,0,1,0,0,0,0,36,0,0 +41,3,214838,3,14,1,1,1,0,0,0,0,60,0,1 +40,1,188436,1,9,4,1,5,0,0,0,0,40,0,0 +25,2,177625,1,9,0,8,0,0,0,0,0,40,0,0 +52,2,124591,1,9,0,2,4,0,0,0,0,40,0,0 +28,2,230856,5,10,0,3,0,1,1,3325,0,50,0,0 +50,3,221532,6,12,1,10,1,0,0,0,0,40,0,1 +21,2,232577,9,11,0,9,3,0,1,0,0,30,0,0 +48,2,168216,5,10,1,5,1,0,0,0,0,40,0,1 +27,2,214702,10,15,1,3,1,0,0,0,0,42,0,1 +63,2,237620,1,9,1,10,1,0,0,0,0,30,0,0 +47,0,54887,8,16,1,3,1,0,0,0,0,40,0,1 +37,1,164526,8,16,0,3,0,0,0,14084,0,45,0,1 +58,2,183870,1,9,2,0,0,0,1,0,0,40,0,0 +41,2,208330,5,10,1,5,1,0,0,0,0,51,0,0 +67,5,168370,5,10,1,5,1,0,0,0,0,40,0,0 +62,1,320376,1,9,1,5,2,0,1,0,0,48,0,0 +28,2,192384,5,10,1,2,1,0,0,0,0,40,0,1 +26,2,167350,14,8,0,2,3,0,0,0,0,40,0,0 +46,1,103538,10,15,1,3,1,0,0,0,0,65,0,1 +29,2,58522,1,9,1,10,1,0,0,0,0,40,0,0 +39,2,191342,0,13,1,10,1,2,0,0,0,40,11,1 +25,2,193820,3,14,0,3,3,0,1,0,0,35,0,0 +20,2,258490,5,10,0,5,0,0,1,0,0,35,0,0 +21,2,56520,5,10,0,0,3,0,0,0,0,40,0,0 +25,2,102476,0,13,0,3,0,0,0,0,0,50,0,0 +44,5,311357,10,15,1,3,1,0,0,0,0,50,0,1 +37,2,166497,1,9,0,0,3,0,0,0,0,38,0,0 +50,2,160724,3,14,1,1,1,2,0,7298,0,40,11,1 +29,2,338270,1,9,4,0,4,0,1,0,0,40,0,0 +18,2,282394,5,10,0,5,3,1,1,0,0,21,0,0 +32,2,383269,0,13,0,1,4,0,1,0,0,40,0,0 +58,2,119386,9,11,2,0,0,0,1,0,0,60,0,0 +50,2,196975,1,9,1,10,1,0,0,0,0,40,0,1 +29,2,334221,5,10,0,4,0,0,1,0,0,18,0,0 +58,2,27385,1,9,1,1,1,0,0,0,0,60,0,1 +29,0,133846,5,10,0,4,3,0,1,0,0,40,0,0 +36,2,361888,1,9,1,6,1,0,0,0,0,45,0,1 +21,2,230429,1,9,0,10,0,0,0,0,0,35,0,0 +49,2,328776,1,9,2,1,4,0,1,0,0,40,0,0 +60,2,243829,3,14,2,3,0,0,1,0,0,50,0,0 +39,2,306646,5,10,1,5,1,0,0,3103,0,50,0,1 +50,2,138179,6,12,1,10,1,0,0,0,1902,40,0,1 +30,2,280069,5,10,0,5,0,0,1,0,0,48,0,0 +64,4,164876,1,9,2,6,4,0,0,0,0,20,0,0 +29,5,138597,6,12,0,3,5,1,1,0,0,40,0,0 +40,2,111483,0,13,1,1,1,0,0,7298,0,40,0,1 +42,2,144778,1,9,1,10,1,0,0,0,0,50,0,0 +55,2,171015,1,9,6,5,4,0,1,0,0,40,0,0 +43,2,112494,1,9,2,6,0,0,0,0,0,45,0,0 +28,2,408473,14,8,0,5,0,1,0,0,0,40,0,0 +46,0,27802,6,12,1,9,1,0,0,0,0,38,0,1 +34,2,236318,1,9,0,8,4,0,0,0,0,40,0,0 +47,2,121836,3,14,1,0,2,0,1,7688,0,38,0,1 +43,1,315971,3,14,0,1,0,0,1,0,0,40,0,0 +24,2,698418,5,10,0,0,3,1,1,0,0,25,0,0 +21,2,329530,2,7,1,10,1,0,0,0,0,40,4,0 +65,2,194456,0,13,1,10,1,0,0,0,0,40,7,1 +20,2,282579,5,10,0,4,0,0,0,0,0,40,0,0 +31,0,26401,3,14,2,0,0,0,1,0,0,25,0,0 +38,0,364958,1,9,1,0,1,0,0,3464,0,40,0,0 +22,2,83998,5,10,0,5,0,0,0,0,0,40,0,0 +20,2,94364,5,10,0,3,0,4,1,0,0,20,0,0 +44,2,174189,5,10,1,5,1,0,0,0,0,60,0,0 +44,4,101967,3,14,1,3,2,0,1,0,0,40,0,0 +41,2,146908,8,16,1,3,1,0,0,0,0,60,0,1 +38,2,126675,1,9,2,10,0,0,0,0,2205,40,0,0 +21,2,31606,5,10,0,4,3,0,1,0,0,25,9,0 +24,2,132327,5,10,3,5,4,4,1,0,0,30,16,0 +24,2,112459,3,14,0,3,0,0,1,0,0,45,0,0 +28,2,48894,1,9,1,0,3,0,1,0,0,40,0,0 +39,2,181943,0,13,0,1,0,0,1,0,0,35,0,0 +48,2,247685,5,10,2,10,0,0,0,3325,0,40,0,0 +24,4,195808,1,9,0,11,0,0,0,0,0,40,0,0 +50,2,172052,1,9,1,3,1,2,0,0,0,35,27,1 +50,4,50178,5,10,1,10,1,0,0,4064,0,55,0,0 +68,2,351711,5,10,1,0,1,0,0,0,0,40,0,0 +31,0,190305,3,14,1,3,1,0,0,0,0,50,0,0 +22,2,464103,15,2,0,10,0,0,0,0,0,40,24,0 +25,2,120238,1,9,3,8,0,0,0,0,0,40,12,0 +28,2,354095,5,10,0,5,0,0,1,0,0,40,0,0 +17,4,308901,2,7,0,0,3,0,1,0,0,15,0,0 +24,0,208826,8,16,0,3,0,0,1,0,0,99,7,0 +20,2,369677,12,6,4,5,0,0,1,0,0,36,0,0 +45,3,98524,6,12,1,0,1,0,0,0,0,40,0,1 +44,2,239723,5,10,3,10,4,0,1,1506,0,45,0,0 +57,2,231232,7,4,1,10,1,0,0,0,0,40,0,0 +33,2,236396,0,13,1,5,1,0,0,0,1902,55,0,1 +22,2,320451,5,10,0,11,3,2,0,0,0,24,3,0 +41,2,38397,1,9,2,4,0,0,1,0,0,40,0,0 +51,5,189183,0,13,1,1,1,0,0,0,0,40,0,0 +46,4,199281,0,13,4,3,4,0,0,0,0,40,0,0 +52,2,286342,1,9,2,8,0,0,1,0,0,38,0,0 +50,2,152810,0,13,1,5,1,0,0,0,0,40,0,1 +26,5,176981,0,13,0,0,3,0,1,0,0,50,0,0 +17,2,117549,12,6,0,5,5,1,1,0,0,12,0,0 +64,2,254797,5,10,1,1,1,0,0,0,0,40,0,0 +51,2,133336,1,9,1,9,1,0,0,0,0,40,0,1 +28,1,182826,1,9,1,3,1,0,0,0,0,35,0,0 +51,2,136224,0,13,2,0,0,0,1,0,0,40,0,0 +39,1,134475,0,13,2,0,0,0,0,0,1762,40,0,0 +48,2,272778,5,10,2,4,4,0,1,0,0,32,0,0 +44,2,279183,5,10,1,4,3,0,1,0,0,40,0,1 +47,2,110243,2,7,1,4,1,0,0,0,0,40,0,0 +52,2,202071,1,9,6,10,3,0,1,0,0,40,0,0 +58,2,197642,5,10,0,0,0,0,1,0,0,39,0,0 +19,2,125591,2,7,0,4,0,0,1,0,0,40,0,0 +40,2,197462,0,13,1,9,1,0,0,0,0,40,0,1 +23,2,238831,5,10,0,0,3,0,0,0,0,40,0,0 +31,2,182177,0,13,1,4,1,0,0,0,0,40,29,0 +40,4,240504,6,12,1,1,1,0,0,0,0,40,0,1 +48,5,125892,5,10,1,5,1,0,0,0,0,38,0,1 +46,2,154430,3,14,2,1,0,0,1,0,0,50,0,1 +32,2,207685,1,9,1,2,2,1,1,3908,0,40,0,0 +50,2,222020,1,9,1,10,1,0,0,0,0,40,0,0 +18,2,243240,1,9,0,8,0,0,0,0,0,37,0,0 +26,2,158734,3,14,0,1,0,0,1,0,0,30,0,0 +36,2,257691,0,13,0,5,0,0,1,0,0,20,0,0 +26,2,144483,9,11,2,5,3,0,1,594,0,35,0,0 +19,2,209826,5,10,0,5,3,0,1,0,0,15,0,0 +53,2,30244,6,12,1,1,1,0,0,15024,0,40,0,1 +54,2,133050,5,10,0,5,0,1,0,0,0,41,0,0 +29,2,138332,5,10,1,0,3,0,1,0,0,6,0,0 +37,2,526968,3,14,0,3,0,0,1,0,0,38,0,1 +40,2,79036,9,11,2,6,0,0,0,0,0,50,0,1 +36,2,240323,5,10,6,0,4,1,1,0,0,40,0,0 +18,2,270544,14,8,0,0,3,0,1,0,0,30,0,0 +44,0,199551,2,7,4,9,0,1,0,0,0,40,0,0 +36,2,231052,1,9,4,4,4,1,1,0,0,35,0,0 +69,0,203072,8,16,1,3,1,0,0,0,0,50,0,1 +17,2,126771,14,8,0,3,3,0,0,0,0,7,0,0 +38,2,31848,9,11,1,10,1,0,0,0,0,40,0,1 +27,2,328981,1,9,0,8,4,1,0,0,0,40,0,0 +52,2,159670,6,12,1,1,1,0,0,0,0,40,0,0 +24,2,450695,6,12,0,5,0,0,0,0,0,35,0,0 +57,2,182028,0,13,1,1,2,0,1,0,0,40,0,0 +19,2,349620,12,6,0,8,3,0,1,0,0,40,0,0 +38,2,161066,1,9,2,10,0,3,0,0,0,50,0,0 +46,2,213611,7,4,3,13,4,0,1,0,1594,24,24,0 +21,2,548303,1,9,1,3,3,0,0,0,0,40,4,1 +29,2,150861,5,10,0,0,0,0,1,0,0,40,28,0 +26,2,133766,1,9,1,7,1,0,0,0,0,70,0,0 +28,2,200511,1,9,4,7,0,0,0,0,0,55,0,0 +26,2,50103,5,10,1,5,2,0,1,0,0,40,0,0 +49,2,177211,0,13,1,4,1,0,0,0,0,40,0,0 +28,2,132686,0,13,1,1,1,0,0,0,0,55,0,0 +57,3,21626,5,10,2,4,0,0,0,0,0,40,0,0 +60,2,52900,7,4,1,6,1,0,0,0,0,40,0,0 +38,2,248886,1,9,1,0,1,0,0,0,0,42,0,0 +51,1,118259,1,9,1,10,1,0,0,3137,0,60,0,0 +60,2,145493,5,10,2,0,0,0,1,0,0,40,0,0 +37,2,219546,0,13,1,1,5,0,0,3411,0,47,0,0 +44,3,399155,1,9,0,10,3,1,1,0,0,40,0,0 +19,1,227310,5,10,0,4,3,0,1,0,0,25,0,0 +59,2,333270,3,14,1,10,2,2,1,0,0,35,11,0 +50,2,231495,1,9,1,4,1,0,0,0,0,40,0,0 +35,3,133935,0,13,1,10,1,0,0,0,0,40,0,1 +46,3,55237,5,10,2,8,4,0,0,0,0,40,0,0 +18,2,183034,5,10,0,5,3,1,0,0,0,35,0,0 +32,2,245487,11,3,1,8,1,3,0,0,0,40,4,0 +32,2,185480,9,11,2,4,4,0,1,0,0,40,0,0 +39,2,114251,1,9,1,10,1,0,0,0,0,40,0,1 +25,2,181814,1,9,0,10,5,0,1,0,0,40,0,0 +30,2,340917,3,14,1,1,1,0,0,15024,0,60,0,1 +37,2,241998,0,13,1,9,1,0,0,0,1977,40,0,1 +38,5,125324,5,10,1,1,1,0,0,0,0,80,0,1 +36,2,34744,6,12,2,4,4,0,1,0,0,37,0,0 +56,2,131608,5,10,1,5,1,0,0,0,0,40,0,1 +35,3,226916,0,13,6,0,0,0,0,0,0,40,0,1 +56,2,124137,1,9,2,0,0,0,0,0,0,41,0,0 +17,2,96282,12,6,0,4,3,0,0,0,0,14,0,0 +46,2,337050,3,14,1,1,1,0,0,0,1977,45,0,1 +56,2,229335,1,9,2,0,0,0,1,0,0,40,0,0 +61,0,199495,14,8,1,10,1,0,0,0,0,40,0,0 +25,2,111675,5,10,1,5,1,0,0,0,0,43,0,0 +27,2,139209,1,9,0,8,4,1,1,0,0,40,0,0 +50,1,32372,1,9,1,7,1,0,0,0,0,30,0,0 +33,1,203784,9,11,1,7,1,0,0,0,0,62,0,0 +33,2,164190,9,11,1,10,1,0,0,7298,0,40,0,1 +38,2,64875,5,10,0,7,4,0,0,0,0,60,0,0 +51,2,41806,2,7,1,8,1,0,0,0,0,40,0,0 +27,2,208725,6,12,0,5,0,0,0,0,0,42,0,0 +49,4,79019,3,14,6,3,4,0,1,0,0,16,0,0 +26,2,136951,1,9,4,8,4,1,1,0,0,40,0,0 +42,2,203554,3,14,1,1,1,0,0,0,0,60,0,1 +37,2,252947,0,13,0,8,0,1,0,0,1719,32,0,0 +38,2,170861,5,10,0,0,3,0,1,0,0,40,0,0 +48,2,199590,1,9,1,4,1,0,0,0,0,40,4,1 +33,2,195576,1,9,1,1,1,0,0,4386,0,60,0,0 +30,2,182177,1,9,0,4,0,0,0,0,0,40,38,0 +25,0,183678,0,13,0,3,0,0,1,0,0,50,0,0 +50,2,209320,0,13,1,5,1,0,0,0,0,40,0,1 +54,5,206862,1,9,1,1,1,0,0,0,0,36,0,1 +37,2,168941,2,7,2,10,0,0,0,0,0,40,0,0 +59,1,201263,0,13,1,5,1,0,0,15024,0,55,0,1 +17,2,75333,12,6,0,5,3,1,1,0,0,24,0,0 +56,1,163212,1,9,6,0,4,0,1,99999,0,40,0,1 +57,2,139290,1,9,2,4,0,0,0,0,0,38,0,0 +33,2,400416,12,6,0,4,3,1,0,0,0,20,0,0 +41,1,223763,3,14,1,10,1,0,0,0,0,65,0,0 +45,2,77927,0,13,6,4,3,2,1,0,0,40,11,0 +50,2,175804,1,9,1,5,1,0,0,0,0,48,0,0 +18,2,91525,1,9,0,5,5,0,0,0,0,25,0,0 +19,2,279968,5,10,0,0,3,0,1,0,0,20,0,0 +26,2,77698,5,10,1,3,2,2,1,0,0,40,0,0 +41,2,113491,5,10,1,3,1,0,0,0,0,40,0,1 +29,2,202878,1,9,0,10,0,0,0,0,0,50,0,0 +27,2,108431,5,10,0,10,0,1,0,0,0,40,0,0 +35,2,194490,1,9,2,0,4,0,1,0,0,38,0,0 +37,2,48093,0,13,0,10,0,0,0,0,0,90,0,1 +22,2,136824,2,7,0,0,0,0,0,0,0,40,0,0 +25,2,143280,12,6,0,13,3,0,1,0,0,24,0,0 +26,2,150062,1,9,1,5,1,0,0,0,0,50,0,0 +27,4,298510,1,9,2,11,3,0,0,0,0,40,0,0 +26,2,177147,0,13,0,0,0,0,0,6849,0,65,0,0 +51,2,115025,1,9,1,10,1,0,0,0,0,40,0,0 +45,2,350440,1,9,1,1,1,2,0,0,0,40,0,1 +60,2,83850,1,9,1,5,1,0,0,0,0,40,0,0 +35,2,62669,5,10,1,1,1,0,0,0,0,55,0,1 +24,2,229773,1,9,0,8,3,0,0,0,0,40,0,0 +40,4,196234,1,9,2,10,3,0,1,0,0,40,5,0 +44,2,157249,0,13,1,3,1,1,0,0,1977,50,0,1 +65,2,80174,1,9,2,1,5,0,1,1848,0,50,0,0 +52,5,49069,5,10,1,0,2,0,1,0,0,40,0,1 +38,2,122952,1,9,4,10,4,0,1,0,0,35,0,0 +18,2,123856,2,7,0,5,3,0,1,0,0,49,0,0 +24,2,216181,9,11,0,8,3,0,0,0,0,40,0,0 +52,2,180062,5,10,1,1,1,0,0,0,0,60,0,0 +21,2,188535,1,9,0,8,0,0,0,0,0,44,0,0 +67,1,106143,8,16,1,5,1,0,0,20051,0,40,0,1 +64,1,170421,5,10,6,10,0,0,1,0,0,8,0,0 +25,2,283087,5,10,0,1,3,1,0,0,0,40,0,0 +34,3,341051,3,14,1,0,1,0,0,0,0,50,0,1 +39,1,34378,1,9,1,7,1,0,0,0,0,50,0,0 +26,2,380674,1,9,0,2,3,0,0,0,0,52,0,0 +19,2,304469,12,6,0,7,3,0,0,0,0,25,0,0 +35,2,99146,1,9,1,1,1,0,0,0,0,50,0,1 +26,2,205109,3,14,0,3,0,0,1,0,0,40,0,0 +38,2,99156,1,9,4,4,3,0,0,0,0,35,0,0 +45,2,97842,5,10,1,8,1,0,0,0,0,65,0,0 +18,2,100875,2,7,0,4,4,0,1,0,0,28,0,0 +51,2,200576,5,10,2,0,0,0,1,0,0,63,0,0 +36,2,355053,1,9,4,4,4,1,1,0,0,28,0,0 +37,4,117760,9,11,0,11,0,0,0,4650,0,40,0,0 +37,2,117567,0,13,1,1,1,0,0,0,0,60,0,1 +39,3,189632,1,9,1,0,2,0,1,0,0,40,0,1 +21,2,170108,5,10,0,4,3,0,0,0,0,40,0,0 +46,0,27243,8,16,1,3,1,0,0,7688,0,45,0,1 +33,2,192663,1,9,4,5,0,0,1,0,0,35,0,0 +23,2,526164,0,13,0,0,4,1,1,0,0,40,0,0 +52,1,146579,1,9,2,5,4,1,0,0,0,40,0,0 +28,2,60288,1,9,0,0,3,0,1,0,0,40,0,0 +23,0,241951,5,10,0,3,0,0,0,0,0,40,0,0 +48,5,213140,5,10,1,1,1,0,0,0,0,40,0,1 +17,2,218124,2,7,0,5,3,0,1,0,0,20,0,0 +22,1,279802,5,10,0,3,3,0,1,0,0,3,0,0 +40,2,167919,1,9,1,10,1,0,0,0,0,40,0,0 +90,2,250832,12,6,1,1,1,0,0,0,0,40,0,0 +28,2,193158,1,9,2,5,3,0,1,0,0,40,0,0 +44,2,172032,1,9,1,6,1,0,0,0,0,40,0,0 +29,2,39484,0,13,1,4,1,0,0,7298,0,42,0,1 +45,2,84298,9,11,1,1,1,0,0,0,1977,50,0,1 +43,2,269015,1,9,1,8,1,1,0,0,0,40,9,1 +49,3,125892,0,13,1,1,1,0,0,0,0,40,0,1 +27,2,134890,0,13,0,9,3,0,0,0,0,50,0,0 +60,1,261119,1,9,2,10,4,0,1,0,0,40,0,0 +33,2,119409,1,9,1,8,2,4,1,0,0,40,13,0 +53,1,118793,12,6,1,10,1,0,0,0,0,50,0,1 +19,2,184207,5,10,0,5,0,0,0,0,0,40,0,0 +28,1,191027,1,9,2,7,0,0,0,0,0,40,0,0 +22,2,207782,6,12,0,2,3,0,0,0,0,20,0,0 +48,1,209146,1,9,1,6,1,0,0,0,0,60,0,0 +19,2,187724,5,10,0,4,3,0,1,0,0,25,0,0 +28,2,66777,9,11,1,4,5,0,1,3137,0,40,0,0 +58,2,158002,5,10,1,5,1,1,0,0,0,40,0,0 +19,1,305834,5,10,0,10,3,0,1,0,0,25,0,0 +22,2,211798,5,10,0,10,3,0,0,0,0,40,0,0 +52,1,123011,10,15,1,3,1,0,0,0,0,50,0,1 +31,2,36302,0,13,1,8,1,0,0,0,0,50,0,0 +50,1,176867,8,16,1,3,1,0,0,3781,0,40,0,0 +62,2,169204,1,9,6,10,4,0,0,0,0,40,0,0 +26,2,38232,0,13,0,3,0,0,0,0,0,50,0,0 +64,0,277657,1,9,6,0,0,0,1,0,0,24,0,0 +38,2,32271,5,10,1,10,1,0,0,0,0,40,0,0 +44,2,116825,10,15,1,3,1,0,0,15024,0,80,0,1 +28,1,226198,1,9,2,1,0,0,1,0,0,40,0,0 +19,2,28145,1,9,0,4,3,0,1,0,0,52,0,0 +39,2,140477,1,9,0,8,0,0,1,0,0,10,0,0 +50,2,165050,12,6,1,10,1,0,0,0,0,40,0,1 +39,5,202937,3,14,1,3,2,0,1,0,0,40,0,1 +36,2,316298,0,13,0,9,3,0,0,0,0,40,0,0 +39,2,203070,9,11,1,2,1,0,0,0,0,49,0,0 +51,5,103995,6,12,0,5,0,0,1,0,0,25,0,0 +28,2,176137,1,9,0,4,3,0,1,0,0,32,0,0 +57,1,103948,10,15,1,3,1,0,0,0,0,30,0,1 +40,4,39581,10,15,4,3,3,1,1,0,0,40,0,0 +27,2,506436,5,10,2,5,4,0,1,0,0,40,30,0 +32,2,226975,5,10,0,5,3,0,0,0,1876,60,0,0 +49,0,154493,1,9,2,1,4,0,1,0,0,44,0,0 +34,1,137223,12,6,0,4,3,0,1,0,0,40,0,0 +24,2,102323,1,9,0,8,3,0,0,0,0,40,0,0 +54,2,257765,7,4,2,8,0,0,0,0,0,40,24,0 +52,2,42924,14,8,1,10,1,0,0,0,0,45,0,0 +43,2,167599,2,7,1,2,2,0,1,0,0,25,0,0 +35,2,52738,5,10,1,8,1,0,0,0,0,46,0,0 +56,2,98418,1,9,2,6,0,0,0,0,0,30,0,0 +30,2,381153,1,9,0,10,0,0,0,0,0,40,0,0 +54,2,103700,1,9,6,4,4,0,1,0,0,40,0,0 +35,2,298635,0,13,0,5,0,2,0,0,0,50,0,0 +32,2,127895,5,10,0,0,3,1,1,0,0,40,0,0 +44,5,212760,0,13,1,1,1,0,0,0,0,60,0,1 +32,2,281384,1,9,5,4,5,0,1,0,0,10,0,0 +60,2,181200,14,8,1,0,1,0,0,0,0,40,0,0 +40,2,257364,5,10,2,4,0,0,0,0,0,45,0,0 +50,2,283281,7,4,1,8,1,1,0,0,0,40,0,0 +58,2,214502,4,5,1,2,1,0,0,0,0,50,0,1 +41,2,69333,1,9,1,10,1,0,0,0,0,45,0,1 +28,2,190060,1,9,1,5,1,0,0,0,0,40,0,1 +53,2,95864,1,9,0,0,5,0,0,0,0,35,0,0 +45,2,27332,1,9,2,5,0,0,1,0,0,40,0,0 +23,2,24395,1,9,0,2,3,0,1,0,0,30,0,0 +25,2,330695,5,10,1,5,1,0,0,0,0,50,0,0 +40,1,171615,5,10,0,10,0,0,0,0,0,35,0,1 +28,2,116372,0,13,0,1,0,0,1,0,0,60,0,0 +27,2,38599,14,8,0,6,0,0,0,0,0,40,0,0 +19,4,202184,5,10,0,0,3,0,0,0,0,15,0,0 +24,2,315303,1,9,0,2,3,1,0,0,0,25,0,0 +38,2,103456,0,13,4,3,4,0,0,0,0,40,0,0 +24,0,163480,3,14,0,0,0,1,1,0,0,40,0,0 +18,2,317425,2,7,0,4,3,1,0,0,0,7,0,0 +58,2,216941,1,9,2,1,4,0,1,0,0,40,0,0 +35,2,116541,3,14,0,3,3,0,0,0,0,44,0,1 +43,2,186396,4,5,0,8,0,0,1,0,0,20,0,0 +45,2,273194,1,9,1,8,1,1,0,3137,0,35,0,0 +24,2,385540,1,9,1,5,1,0,0,0,0,40,4,0 +63,2,201631,4,5,1,7,1,1,0,0,0,40,0,0 +40,2,439919,4,5,1,8,1,0,0,0,0,40,4,0 +21,2,182117,0,13,0,4,5,0,0,0,0,20,0,0 +20,0,334113,5,10,1,4,1,0,0,0,0,40,0,0 +42,2,184837,1,9,1,8,2,0,1,7298,0,40,0,1 +47,3,211123,1,9,1,10,1,0,0,0,0,40,0,0 +48,5,38819,1,9,1,10,1,0,0,0,0,36,0,0 +61,2,162391,7,4,1,6,1,0,0,0,1651,40,0,0 +35,0,89040,0,13,1,1,1,0,0,0,0,40,0,1 +46,2,264210,5,10,1,7,2,0,1,0,0,20,0,0 +18,2,87157,14,8,0,4,3,0,0,0,0,25,0,0 +28,1,398918,0,13,0,3,0,0,0,0,0,50,0,1 +20,2,155818,1,9,0,4,3,0,1,0,0,20,0,0 +28,2,243660,1,9,1,6,1,0,0,0,0,40,0,0 +57,2,134195,1,9,1,5,1,0,0,0,0,40,0,0 +56,2,238638,7,4,1,10,1,0,0,0,0,40,0,0 +33,2,159929,1,9,1,10,1,0,0,0,0,40,0,0 +19,2,198668,1,9,0,2,3,0,0,0,0,40,0,0 +29,2,215504,1,9,1,8,1,0,0,0,0,40,0,0 +30,2,158002,5,10,0,10,5,0,0,0,0,55,16,0 +53,4,35305,0,13,2,3,4,0,1,0,0,57,0,0 +25,2,195994,15,2,0,13,0,0,1,0,0,40,24,0 +44,0,321824,1,9,1,11,1,0,0,0,0,38,0,0 +22,2,180449,5,10,1,2,1,0,0,0,0,28,0,0 +40,2,201764,1,9,2,10,0,0,0,0,0,40,0,0 +30,1,226535,7,4,1,7,1,0,0,0,0,40,4,0 +51,2,136121,9,11,2,0,4,0,1,0,0,38,0,0 +17,2,47199,2,7,0,13,3,0,1,0,0,24,0,0 +46,4,215895,0,13,1,11,1,0,0,0,0,40,0,1 +50,0,24647,5,10,1,0,1,0,0,0,0,40,0,1 +34,2,734193,5,10,0,1,0,0,1,0,0,50,0,0 +41,3,192589,0,13,1,0,1,0,0,0,0,40,0,0 +32,2,326283,0,13,0,4,4,4,0,0,0,40,0,0 +32,2,207284,1,9,1,8,1,0,0,0,0,40,0,0 +47,2,109089,5,10,1,3,1,0,0,0,0,70,0,0 +50,2,274528,5,10,1,5,1,0,0,0,0,40,0,0 +77,2,142646,7,4,6,13,4,0,1,0,0,23,0,0 +33,2,180859,1,9,2,1,0,0,0,0,0,40,0,0 +47,5,188610,1,9,1,8,1,0,0,0,0,48,0,0 +64,2,169604,2,7,1,6,1,0,0,0,0,40,0,0 +34,2,260560,1,9,1,1,1,0,0,0,0,50,0,0 +34,4,188245,1,9,0,3,4,1,1,0,0,35,0,0 +67,4,103315,3,14,0,1,5,0,1,15831,0,72,0,1 +37,4,52465,1,9,0,4,0,0,0,0,0,40,0,0 +34,2,737315,0,13,1,3,1,0,0,0,0,40,0,1 +50,1,219420,8,16,2,5,0,0,0,0,0,64,0,0 +60,2,198170,0,13,1,1,1,0,0,0,0,45,0,1 +46,4,183168,0,13,2,3,4,0,1,0,0,43,0,0 +44,2,196545,0,13,1,10,1,0,0,7298,0,40,0,1 +43,2,168412,1,9,1,5,5,0,1,0,0,44,12,0 +48,2,174386,3,14,1,3,1,0,0,0,0,40,22,1 +36,2,544686,1,9,0,0,5,0,1,2907,0,40,35,0 +48,2,95661,5,10,0,0,0,0,1,0,0,43,0,0 +37,2,468713,5,10,1,0,1,0,0,0,0,40,0,0 +51,2,169112,3,14,1,5,1,0,0,0,0,40,0,1 +52,2,74024,3,14,1,3,1,0,0,0,0,45,0,1 +27,2,110622,11,3,0,5,3,2,1,0,0,20,36,0 +43,4,33331,3,14,1,1,1,0,0,0,0,40,0,1 +23,2,181557,1,9,0,4,3,1,0,0,0,25,0,0 +66,2,142624,6,12,1,8,1,0,0,5556,0,40,29,1 +37,1,192251,12,6,1,4,2,0,1,2635,0,40,0,0 +35,2,146091,5,10,0,0,0,0,1,0,0,40,0,0 +42,4,174575,0,13,1,3,1,0,0,5178,0,40,0,1 +49,2,200949,12,6,0,4,4,0,1,0,0,38,30,0 +51,4,201560,0,13,1,3,2,0,1,0,0,40,0,1 +71,3,149386,1,9,6,1,0,0,0,0,0,9,0,0 +50,4,168672,3,14,1,3,2,0,1,0,1902,40,0,1 +63,2,38352,1,9,6,0,4,0,1,0,0,40,0,0 +41,0,180272,3,14,0,3,3,0,1,0,0,35,0,0 +24,0,275421,5,10,0,8,3,0,1,0,0,40,0,0 +41,4,173051,5,10,2,4,4,0,1,0,0,45,0,0 +33,4,167474,6,12,1,0,1,0,0,0,0,40,0,0 +42,4,267138,5,10,1,10,1,1,0,0,0,40,0,0 +23,2,135138,0,13,0,5,3,2,0,0,0,40,0,0 +49,2,218357,9,11,2,3,0,0,1,0,0,38,0,0 +28,1,107236,14,8,1,10,0,0,0,0,0,40,0,0 +31,2,138416,11,3,1,2,1,0,0,0,0,56,4,0 +28,2,154863,0,13,0,0,3,1,0,0,0,35,0,0 +37,2,194004,2,7,1,10,1,0,0,0,0,25,0,0 +19,2,339123,5,10,0,1,3,0,0,0,0,40,0,0 +51,4,548361,0,13,1,3,1,0,0,0,0,26,0,0 +25,2,101812,9,11,1,5,1,0,0,0,0,41,0,0 +49,5,127111,1,9,1,1,1,0,0,0,0,50,0,0 +47,2,171807,1,9,2,5,4,0,1,0,0,45,0,0 +48,4,40666,1,9,1,4,1,0,0,0,0,40,0,0 +41,4,340682,1,9,2,0,0,0,1,0,0,40,0,0 +32,2,175052,1,9,2,0,4,0,1,0,0,40,0,0 +46,2,154405,1,9,1,2,1,1,0,0,0,40,0,0 +17,2,108402,12,6,0,5,3,0,1,0,0,20,0,0 +34,2,346275,2,7,2,2,0,0,0,0,0,43,0,0 +44,2,42476,1,9,0,0,5,0,1,0,0,30,0,0 +23,2,161708,6,12,0,4,3,0,1,0,0,20,0,0 +35,2,70447,5,10,0,3,4,2,0,4650,0,20,0,0 +30,2,189759,0,13,0,6,0,0,0,4865,0,40,0,0 +34,2,250724,0,13,1,5,1,0,0,0,0,45,2,0 +34,3,149368,10,15,1,3,1,0,0,0,0,40,0,1 +39,2,154641,9,11,1,0,1,0,0,0,0,40,0,0 +28,2,38309,9,11,1,0,1,0,0,2407,0,40,0,0 +53,4,202733,3,14,1,1,1,0,0,7688,0,70,0,1 +34,2,56150,2,7,0,6,4,0,0,0,0,40,0,0 +21,2,260254,1,9,0,10,0,0,0,0,0,40,0,0 +53,2,108083,7,4,1,7,1,0,0,0,0,45,0,0 +54,1,71344,3,14,2,3,0,0,0,0,0,50,0,1 +32,2,174215,5,10,2,5,4,0,1,0,0,40,0,0 +39,0,114366,0,13,0,3,0,0,0,0,0,35,0,0 +39,2,158962,5,10,2,8,4,0,1,0,0,40,0,0 +29,2,179498,1,9,1,1,1,0,0,0,0,40,9,0 +29,2,31935,1,9,2,3,0,0,1,0,0,40,0,0 +43,2,149909,1,9,1,10,1,0,0,0,0,42,0,1 +39,2,216552,3,14,1,0,1,0,0,0,0,40,0,0 +45,2,255348,5,10,2,1,0,0,1,0,0,40,0,0 +36,2,176050,5,10,1,8,1,0,0,0,0,40,0,0 +43,4,337469,5,10,2,0,0,0,1,594,0,20,4,0 +31,2,159737,1,9,0,5,4,1,1,0,0,58,0,0 +39,2,316211,1,9,1,1,1,0,0,0,0,60,0,1 +32,2,127610,0,13,1,3,2,0,1,0,1902,32,0,1 +45,4,556652,1,9,1,10,1,1,0,0,0,40,0,1 +19,2,265576,1,9,0,2,3,0,0,0,0,50,0,0 +43,2,347653,5,10,1,3,1,0,0,0,0,48,0,1 +32,2,62374,9,11,1,6,1,0,0,0,0,40,0,0 +43,1,170230,0,13,0,5,0,0,1,0,0,60,0,0 +34,2,203051,0,13,1,0,1,0,0,0,0,27,0,0 +66,5,115880,5,10,1,3,1,0,0,0,0,40,0,0 +37,2,167735,9,11,1,10,1,0,0,0,1887,40,0,1 +46,5,181413,6,12,1,1,2,0,1,0,0,40,0,0 +23,2,185554,0,13,0,3,3,0,1,0,0,40,0,0 +41,2,350387,0,13,0,3,0,0,0,0,0,40,0,1 +55,2,105582,1,9,1,2,1,0,0,3103,0,40,0,1 +35,1,350247,10,15,1,3,1,0,0,0,0,50,0,1 +37,2,107737,0,13,1,3,1,0,0,0,0,55,0,1 +43,2,115562,0,13,1,3,1,0,0,0,0,42,0,1 +30,1,131584,9,11,0,10,3,0,0,0,0,60,0,0 +36,4,95855,3,14,1,3,2,0,1,0,0,60,0,1 +54,2,391016,0,13,1,5,1,0,0,0,0,40,0,1 +36,3,51089,0,13,1,0,1,0,0,0,0,50,0,1 +78,5,188044,0,13,1,1,1,0,0,0,2392,40,0,1 +77,2,117898,0,13,1,1,1,0,0,0,0,50,0,1 +28,2,70240,1,9,3,4,0,2,1,0,0,40,11,0 +39,1,187693,1,9,1,10,1,0,0,0,0,72,0,1 +37,2,341672,0,13,4,9,0,2,0,0,0,40,11,0 +34,2,208043,9,11,1,3,1,0,0,7298,0,45,0,1 +22,4,289982,0,13,0,3,3,0,1,0,0,35,0,0 +54,2,76344,0,13,0,4,0,0,1,0,0,50,0,0 +21,2,200973,5,10,0,5,3,0,1,0,0,20,0,0 +36,2,111377,12,6,1,10,1,0,0,0,0,40,0,0 +62,1,136684,1,9,6,0,5,0,1,0,0,30,0,0 +40,2,176716,5,10,1,5,1,0,0,0,0,40,0,1 +47,1,166894,5,10,2,3,4,1,1,0,0,40,0,0 +38,2,243872,0,13,1,5,1,0,0,0,0,70,0,1 +28,2,155621,11,3,0,10,0,0,0,0,0,40,13,0 +46,2,102597,0,13,2,3,4,0,1,0,0,40,0,0 +22,2,60331,5,10,1,4,1,0,0,0,0,35,0,0 +37,2,75024,1,9,2,5,4,0,1,0,0,25,8,0 +69,2,174474,12,6,4,8,0,0,1,0,0,28,30,0 +43,2,145441,0,13,1,1,1,0,0,0,0,50,0,1 +53,2,83434,0,13,0,4,0,2,1,0,0,21,28,1 +20,2,691830,1,9,0,5,3,1,1,0,0,35,0,0 +22,2,189203,0,13,0,3,0,0,0,0,0,50,0,0 +48,2,115784,4,5,1,10,1,0,0,0,0,44,0,0 +40,3,280167,3,14,1,3,1,0,0,0,0,40,0,1 +39,2,52978,5,10,2,4,0,0,1,0,1721,55,0,0 +57,2,169329,1,9,1,9,1,1,0,0,1887,40,33,1 +23,2,315065,12,6,0,4,4,0,0,0,0,60,4,0 +25,4,167835,0,13,1,3,2,0,1,0,0,38,0,1 +22,2,63105,1,9,0,3,3,1,0,0,0,40,0,0 +23,2,520775,14,8,0,13,3,0,0,0,0,30,0,0 +41,4,47902,0,13,1,3,1,0,0,0,0,45,0,1 +25,2,145434,5,10,0,8,0,0,1,0,0,25,0,0 +58,2,56392,5,10,1,5,1,0,0,0,0,40,0,0 +33,2,162312,1,9,2,5,0,2,0,0,0,45,28,0 +28,2,204074,3,14,1,3,1,0,0,0,0,48,0,0 +19,2,99246,2,7,0,8,0,0,1,0,0,25,0,0 +44,2,102085,5,10,2,0,5,0,1,0,0,40,0,0 +68,2,168794,13,1,0,8,0,0,0,0,0,10,0,0 +33,0,332379,1,9,1,10,1,0,0,0,0,40,0,1 +24,2,233419,1,9,2,1,0,0,1,0,0,40,0,0 +44,1,57233,1,9,1,7,1,0,0,0,0,50,0,0 +38,2,192337,0,13,1,1,1,0,0,7688,0,40,0,1 +31,2,442429,1,9,4,10,4,0,1,0,0,40,4,0 +29,2,369114,1,9,2,0,0,0,1,0,0,40,0,0 +65,2,261334,4,5,6,5,0,0,1,0,0,40,0,0 +55,2,160303,1,9,6,0,5,0,1,0,0,40,0,0 +49,2,50474,1,9,1,1,1,0,0,0,0,40,0,0 +27,2,321577,1,9,0,8,3,1,1,0,0,40,0,0 +41,2,29591,1,9,2,5,0,0,0,0,0,30,0,0 +33,1,334744,5,10,1,10,1,0,0,0,0,50,0,1 +22,1,269474,1,9,0,7,3,0,0,0,0,40,0,0 +41,2,287306,1,9,1,3,1,0,0,0,1902,40,0,1 +66,2,33619,1,9,1,4,1,1,0,0,0,4,0,0 +38,2,149347,5,10,2,5,0,0,0,0,0,60,0,0 +43,2,96249,1,9,1,8,1,0,0,0,0,42,0,1 +40,4,370502,5,10,1,2,1,0,0,0,0,40,4,0 +32,2,188246,5,10,1,5,1,0,0,0,0,40,0,1 +30,2,167558,1,9,0,5,4,0,1,0,0,35,4,0 +35,2,292185,0,13,1,0,1,0,0,0,0,40,0,0 +41,2,101593,3,14,1,3,1,0,0,15024,0,50,0,1 +33,4,70164,0,13,0,3,0,3,0,0,0,60,0,0 +36,2,269722,0,13,1,1,1,0,0,0,0,55,0,1 +33,1,175502,0,13,1,3,1,0,0,0,0,60,0,0 +53,2,233165,1,9,1,1,1,0,0,0,0,60,0,1 +27,2,177351,0,13,0,5,0,0,0,0,0,45,0,0 +22,2,212114,0,13,0,2,3,0,1,0,0,15,0,0 +26,2,288959,1,9,1,5,1,1,0,0,0,36,0,0 +64,2,231619,1,9,1,5,2,0,1,0,0,21,0,0 +48,2,146919,5,10,2,0,4,0,1,0,0,45,0,0 +23,2,388811,1,9,0,0,3,0,1,0,0,40,0,0 +35,1,98360,0,13,1,3,1,0,0,0,0,40,0,0 +46,2,369538,5,10,1,5,1,0,0,0,0,40,0,1 +65,1,31740,5,10,6,1,4,0,1,0,0,45,0,0 +53,2,223660,1,9,6,8,0,0,0,6849,0,40,0,0 +18,2,333611,11,3,0,4,5,0,0,0,0,54,4,0 +34,1,108247,10,15,1,3,1,0,0,0,0,55,0,1 +28,2,76129,1,9,0,8,4,0,1,0,0,40,24,0 +37,2,91711,0,13,1,1,1,0,0,0,0,60,0,1 +59,2,182062,0,13,1,3,1,0,0,5013,0,40,0,0 +32,2,252752,3,14,0,1,0,0,1,13550,0,60,0,1 +31,2,43953,0,13,1,3,2,0,1,0,0,35,0,0 +25,4,84224,0,13,0,3,0,0,1,0,0,40,0,0 +81,2,100675,15,2,1,3,1,0,0,0,0,15,12,0 +47,2,155509,1,9,4,4,5,1,1,0,0,35,0,0 +39,2,29814,1,9,1,10,1,0,0,0,0,40,0,0 +37,2,241805,5,10,1,4,1,1,0,0,0,30,0,0 +44,2,214838,1,9,1,8,1,0,0,0,0,45,0,1 +37,2,240810,6,12,1,10,1,0,0,0,0,45,0,0 +41,2,154076,5,10,1,0,1,0,0,0,0,50,0,1 +55,2,170287,5,10,1,3,1,0,0,0,0,40,12,1 +60,2,145995,0,13,1,5,1,0,0,0,0,40,0,1 +23,2,233626,0,13,0,5,0,0,0,0,0,25,0,0 +19,2,607799,1,9,0,8,0,0,1,0,0,60,0,0 +45,2,88500,5,10,1,8,1,0,0,0,0,44,0,1 +36,2,127809,1,9,4,4,4,1,1,0,0,30,0,0 +46,2,243743,0,13,1,3,1,0,0,0,0,40,0,1 +48,2,177211,2,7,1,8,1,0,0,0,0,40,0,0 +39,1,231180,1,9,1,4,1,0,0,0,0,50,0,0 +29,2,253856,0,13,1,6,1,0,0,0,0,20,0,0 +39,2,177075,1,9,2,0,0,0,1,0,0,40,0,0 +26,2,152855,1,9,0,1,3,4,1,0,0,40,4,0 +37,2,191137,6,12,2,3,4,0,0,0,0,25,0,0 +49,2,255559,5,10,1,0,2,0,1,0,0,40,0,1 +27,2,169815,0,13,0,5,3,0,0,0,0,40,0,0 +28,2,221215,12,6,0,2,5,0,0,0,0,40,4,0 +35,2,270059,5,10,2,5,4,0,1,0,0,30,0,0 +17,2,345403,12,6,0,4,3,0,0,0,0,40,0,0 +18,2,194897,1,9,0,2,3,3,0,0,0,40,0,0 +33,2,388741,5,10,0,0,4,4,1,0,0,38,0,0 +33,2,355856,6,12,1,5,1,2,0,0,0,60,0,0 +51,2,122109,5,10,1,0,2,0,1,0,0,35,0,0 +49,2,75673,1,9,0,0,3,2,1,0,0,40,0,0 +49,5,141058,5,10,2,1,0,0,0,0,2339,50,0,0 +41,2,47902,5,10,1,5,1,0,0,0,0,35,0,1 +64,2,221343,15,2,2,13,0,0,1,0,0,12,0,0 +40,2,255675,5,10,1,3,1,0,0,0,0,40,0,1 +49,3,203505,1,9,6,0,0,0,1,0,0,40,0,0 +23,2,125106,0,13,0,3,3,0,1,0,0,40,0,0 +34,2,139890,5,10,2,0,4,0,1,0,0,40,0,0 +38,2,76878,2,7,1,10,1,0,0,5178,0,40,0,1 +47,1,28035,5,10,1,7,1,0,0,0,0,86,0,0 +30,2,43953,1,9,0,0,5,0,1,0,1974,40,0,0 +36,2,163237,6,12,1,0,1,0,0,0,0,40,0,1 +23,4,55890,0,13,0,3,0,0,1,0,0,40,0,0 +47,1,255934,5,10,1,1,1,0,0,0,0,80,0,0 +61,2,168654,1,9,2,0,0,0,1,0,0,40,8,0 +47,1,39986,0,13,1,5,1,0,0,0,0,40,0,0 +56,2,208451,0,13,1,3,1,0,0,0,0,40,0,1 +20,2,206681,14,8,0,5,0,0,1,0,0,55,0,0 +33,2,117779,1,9,1,8,2,0,1,0,0,46,0,1 +36,1,129150,1,9,1,7,1,0,0,0,0,50,0,1 +34,4,226443,5,10,1,11,1,0,0,0,0,40,0,1 +56,2,146326,1,9,1,6,1,0,0,0,0,50,0,0 +32,2,187901,9,11,0,1,0,0,1,0,0,23,0,0 +26,2,97153,6,12,1,8,1,0,0,5178,0,40,0,1 +49,2,188694,0,13,0,1,0,0,0,0,0,40,0,1 +71,2,187493,1,9,1,11,1,0,0,0,0,40,0,1 +19,2,212468,5,10,0,4,3,0,1,0,0,15,0,0 +20,2,84726,5,10,0,9,0,0,1,0,0,40,0,0 +42,2,137907,1,9,2,0,4,0,1,0,0,35,0,0 +51,2,34361,5,10,1,1,2,0,1,0,0,20,0,1 +38,2,254114,5,10,3,3,3,1,1,0,0,40,0,0 +38,2,170174,12,6,1,8,1,0,0,0,0,40,0,1 +35,1,190895,0,13,2,1,0,0,0,0,0,25,0,0 +24,4,317443,0,13,1,3,2,1,1,0,0,40,0,0 +40,2,375603,1,9,2,0,4,1,0,0,0,40,0,0 +21,2,203076,1,9,0,2,3,0,0,0,0,35,0,0 +49,2,53893,1,9,2,6,0,0,0,0,0,40,0,0 +54,2,167770,1,9,1,1,1,0,0,0,1902,55,0,1 +52,2,204584,0,13,3,1,0,0,1,0,0,42,0,0 +27,2,660870,0,13,0,3,0,0,1,0,0,60,0,0 +20,2,105686,1,9,0,8,0,0,0,0,0,40,0,0 +31,2,148607,5,10,2,8,0,0,0,0,0,40,0,0 +25,2,255849,1,9,0,0,3,0,1,0,0,40,0,0 +19,3,255921,5,10,0,2,3,0,0,0,0,20,7,0 +33,2,113326,5,10,1,10,1,0,0,0,0,50,0,0 +23,2,440456,0,13,0,4,0,0,0,0,0,40,0,0 +34,2,105493,3,14,2,3,4,0,1,0,0,40,0,0 +42,2,259757,0,13,2,3,4,0,0,0,653,50,0,1 +37,4,89491,3,14,2,1,0,0,1,0,0,40,0,0 +25,2,171818,0,13,0,1,3,0,1,0,0,40,0,0 +40,2,51151,9,11,1,10,1,0,0,0,0,40,0,0 +33,1,188957,0,13,0,5,0,0,1,0,0,40,0,0 +31,2,97933,5,10,0,0,0,0,1,0,0,40,0,0 +32,5,195447,0,13,1,5,1,0,0,0,0,45,0,0 +54,5,383365,0,13,1,5,1,0,0,0,0,70,0,1 +32,1,203408,1,9,1,10,1,0,0,0,0,44,0,0 +29,4,148182,1,9,1,6,1,1,0,0,0,40,0,0 +26,4,211497,5,10,1,3,1,0,0,0,0,40,0,0 +39,1,48063,5,10,1,7,1,0,0,0,0,60,0,0 +57,2,211804,0,13,1,3,1,0,0,3103,0,50,0,1 +54,2,185407,5,10,1,7,1,0,0,0,0,40,0,0 +57,2,225927,12,6,1,8,1,0,0,0,0,40,0,0 +23,3,314525,0,13,0,3,0,0,0,0,0,40,0,0 +27,1,208577,5,10,1,1,1,0,0,0,0,45,0,1 +42,2,222884,0,13,0,1,0,0,0,0,0,55,0,1 +31,2,209538,12,6,1,10,1,0,0,0,0,40,0,0 +49,4,177114,3,14,2,3,0,0,1,0,0,60,0,0 +50,2,173754,1,9,1,10,1,0,0,0,0,40,0,0 +46,4,121370,1,9,2,0,4,0,1,0,0,30,0,0 +37,2,67125,1,9,2,5,0,0,0,0,0,60,0,0 +26,2,67240,1,9,1,10,1,0,0,0,0,40,0,0 +27,2,198346,0,13,2,0,0,0,1,0,0,35,0,0 +24,2,141003,5,10,0,1,3,0,0,0,0,25,0,0 +24,5,60668,1,9,0,10,3,0,0,0,0,40,0,0 +29,2,104256,1,9,2,5,0,0,1,0,0,34,0,0 +47,2,131002,0,13,1,3,1,0,0,0,0,50,0,1 +33,1,155151,5,10,1,5,1,0,0,0,1740,50,0,0 +26,2,177720,6,12,2,3,4,0,1,0,0,45,0,0 +20,2,39615,5,10,0,10,3,0,0,0,0,40,0,0 +25,2,203871,9,11,1,3,2,0,1,0,1887,40,0,1 +57,0,25045,0,13,2,0,4,0,0,2174,0,37,0,0 +36,2,112264,1,9,1,6,1,0,0,0,0,50,0,0 +25,2,169100,3,14,1,1,1,0,0,0,0,40,0,0 +46,2,155659,0,13,1,8,1,0,0,0,0,40,9,1 +39,2,291665,1,9,1,0,1,0,0,4508,0,24,0,0 +29,2,224215,5,10,1,10,1,0,0,0,0,40,0,1 +18,2,270502,2,7,0,1,3,0,1,0,0,20,0,0 +46,2,125487,9,11,1,9,1,0,0,0,0,40,0,0 +61,2,51385,0,13,1,5,1,0,0,0,0,50,0,1 +41,2,112763,1,9,6,5,0,0,1,0,0,40,0,0 +50,2,108926,5,10,2,8,0,1,1,0,0,40,0,0 +53,2,366957,0,13,1,1,1,2,0,99999,0,50,3,1 +36,4,109766,0,13,0,11,0,0,0,0,0,60,0,0 +38,2,226106,5,10,0,0,4,1,1,0,0,40,0,0 +75,1,92792,1,9,1,5,1,0,0,0,0,35,0,0 +26,2,186950,9,11,1,0,2,0,1,0,0,40,0,1 +44,2,230478,0,13,1,1,1,0,0,0,0,40,0,1 +25,2,231638,1,9,0,0,3,0,1,0,0,40,0,0 +31,2,120461,5,10,0,5,3,0,1,0,0,40,0,0 +49,2,33673,14,8,0,6,0,2,0,0,0,35,0,0 +34,2,191385,1,9,1,8,1,0,0,0,0,48,0,0 +31,1,229946,1,9,1,3,1,0,0,0,0,40,13,0 +47,1,160131,5,10,2,10,0,0,0,0,0,40,0,0 +38,2,190895,0,13,1,1,1,0,0,7298,0,50,0,1 +18,2,126021,1,9,0,10,3,0,1,0,0,20,0,0 +47,2,27815,4,5,2,4,0,0,1,0,1719,30,0,0 +42,2,203542,1,9,0,10,0,0,0,0,0,40,0,0 +29,2,144592,0,13,0,5,3,0,0,0,0,40,0,0 +38,4,223004,5,10,2,11,0,0,0,0,0,75,0,0 +22,2,183257,5,10,0,5,3,1,1,0,0,20,0,0 +32,2,172714,1,9,0,10,3,0,0,0,0,40,0,0 +20,2,131611,5,10,0,0,3,0,0,0,0,48,0,0 +41,2,253060,10,15,1,5,1,0,0,0,0,50,0,0 +46,2,471990,1,9,1,6,1,1,0,0,0,46,0,1 +44,2,138966,1,9,1,0,2,0,1,0,0,38,0,0 +35,2,385412,0,13,0,0,0,0,1,0,0,40,0,0 +60,2,103344,1,9,1,10,1,0,0,15024,0,40,0,1 +36,4,135786,4,5,1,10,1,0,0,0,0,25,0,0 +30,2,227359,5,10,0,10,4,0,0,0,0,40,0,0 +40,0,86912,8,16,1,3,1,0,0,0,0,50,0,1 +21,2,83033,5,10,0,0,3,0,1,2176,0,20,0,0 +25,2,172581,0,13,0,3,0,0,1,0,0,40,0,0 +56,0,274111,3,14,2,3,0,0,0,0,1669,40,0,0 +42,2,187795,5,10,1,1,1,0,0,99999,0,55,0,1 +26,2,483822,7,4,0,2,4,0,0,0,0,40,24,0 +66,5,220543,1,9,1,0,2,0,1,0,0,40,0,1 +48,2,152953,7,4,1,10,1,0,0,0,0,32,21,0 +35,2,239755,5,10,0,5,4,0,0,0,0,50,0,0 +41,2,177905,3,14,1,3,1,0,0,0,0,45,0,1 +19,2,200136,5,10,0,5,3,0,1,0,0,20,0,0 +55,1,111625,1,9,1,5,1,0,0,0,0,40,0,0 +42,1,336513,0,13,1,10,1,0,0,15024,0,60,0,1 +45,2,162915,5,10,2,6,0,0,0,0,0,50,0,0 +29,2,116662,0,13,0,2,0,0,0,0,0,40,0,0 +42,1,24763,8,16,1,3,1,0,0,15024,0,40,0,1 +65,2,225580,1,9,2,5,0,0,1,0,0,20,0,0 +30,2,169104,6,12,0,4,5,2,0,0,0,40,36,0 +43,2,212894,5,10,1,10,1,0,0,0,0,40,0,0 +61,2,93997,7,4,1,8,1,0,0,0,0,40,25,0 +22,2,189924,5,10,0,4,0,0,1,0,0,50,0,0 +23,2,274424,2,7,4,4,4,0,1,0,0,40,0,0 +34,2,188246,1,9,1,8,1,0,0,0,0,40,0,0 +51,2,284211,1,9,6,3,4,0,1,0,0,35,0,0 +21,2,198259,5,10,0,0,3,0,1,0,0,15,0,0 +31,2,368517,6,12,0,3,0,2,0,0,0,40,0,0 +34,2,168768,6,12,0,0,0,0,1,0,0,35,0,0 +33,3,122220,5,10,1,1,2,1,1,0,0,40,0,1 +32,2,136204,3,14,4,1,0,0,0,0,2824,55,0,1 +44,2,175641,2,7,1,5,1,0,0,0,0,40,0,1 +21,0,173324,5,10,0,4,3,1,0,0,0,20,0,0 +75,4,31195,1,9,2,0,0,0,1,0,0,20,0,0 +55,3,88876,3,14,1,1,1,2,0,0,0,60,0,1 +43,1,176069,1,9,1,4,2,0,1,0,0,16,0,0 +31,2,215297,1,9,1,10,1,0,0,0,0,45,0,0 +41,2,198425,5,10,1,10,1,0,0,0,0,45,0,0 +26,4,180957,3,14,0,3,0,0,0,0,0,50,0,0 +23,2,206129,9,11,0,10,4,1,1,0,0,40,0,0 +42,3,65950,1,9,2,0,4,1,1,0,0,40,0,0 +29,2,197618,1,9,0,0,0,0,1,0,0,40,0,0 +21,2,185357,1,9,0,0,0,0,0,0,0,50,0,0 +28,2,134890,0,13,0,1,3,0,0,0,0,40,0,0 +35,3,153633,5,10,0,4,4,1,1,0,0,40,0,0 +65,2,115890,0,13,1,6,1,0,0,0,0,20,0,0 +34,2,394447,0,13,0,3,0,0,0,2463,0,50,23,0 +58,2,343957,0,13,2,5,0,0,0,0,0,50,0,0 +59,2,159048,1,9,2,4,0,0,1,0,0,40,0,0 +46,2,423222,0,13,1,1,1,0,0,7688,0,40,0,1 +30,2,89735,9,11,1,3,1,0,0,0,0,40,0,1 +28,2,31778,0,13,0,2,3,0,0,0,0,40,0,0 +47,2,233511,3,14,2,5,0,0,0,27828,0,60,0,1 +30,2,327112,0,13,2,5,0,0,0,0,1564,40,0,1 +34,2,236543,1,9,0,10,3,0,0,0,0,40,0,0 +51,0,194475,5,10,2,3,0,0,1,0,0,40,0,0 +41,2,303510,1,9,1,1,1,0,0,0,0,40,0,0 +57,2,171242,5,10,1,3,1,0,0,0,0,40,0,1 +28,1,39388,9,11,1,7,1,0,0,0,0,60,0,0 +62,4,197218,1,9,6,4,0,0,1,0,0,18,0,0 +22,0,151991,5,10,0,9,3,0,0,0,0,20,0,0 +38,2,374524,0,13,1,3,1,0,0,0,0,40,0,1 +45,4,364563,1,9,1,6,1,0,0,0,0,40,0,1 +37,2,186035,6,12,1,10,1,0,0,0,0,55,0,0 +21,2,47541,1,9,2,8,5,0,0,0,0,40,0,0 +49,2,151107,1,9,0,10,0,1,0,0,0,40,0,0 +24,2,500509,1,9,0,4,3,1,0,0,0,40,0,0 +47,2,138107,0,13,2,1,0,0,0,0,2258,40,0,1 +20,3,225515,5,10,0,9,3,0,1,0,0,24,0,0 +27,2,153291,10,15,1,3,2,0,1,0,0,50,0,1 +40,2,169885,1,9,4,4,0,0,1,0,0,40,0,0 +31,4,175778,0,13,2,3,0,0,1,0,0,40,0,0 +43,2,55213,1,9,1,8,1,0,0,0,1977,52,0,1 +48,2,38950,0,13,1,1,1,0,0,15024,0,50,0,1 +64,1,65991,1,9,1,7,1,0,0,7298,0,45,0,1 +39,2,174330,1,9,4,10,4,0,0,0,0,40,0,0 +50,2,35224,1,9,1,10,1,0,0,0,0,40,0,0 +52,2,175622,9,11,2,4,4,0,1,0,0,40,0,0 +44,2,164678,3,14,1,3,2,0,1,0,0,45,0,0 +54,2,163671,1,9,1,6,1,0,0,0,1887,65,0,1 +17,1,181317,12,6,0,7,3,0,0,0,0,35,0,0 +33,3,177945,1,9,1,0,1,1,0,0,0,40,0,0 +28,2,47168,12,6,0,8,3,0,1,0,0,40,0,0 +39,1,190023,0,13,1,5,1,0,0,0,0,60,0,0 +33,2,168782,9,11,0,10,4,0,0,0,0,40,0,0 +59,2,175290,7,4,0,4,5,0,0,0,0,32,0,0 +74,2,145463,15,2,6,13,0,1,1,0,0,15,0,0 +54,2,159755,5,10,1,11,1,0,0,0,0,40,0,1 +31,2,113364,6,12,1,8,1,0,0,0,0,55,0,0 +31,2,487742,5,10,4,5,4,0,1,0,0,40,0,0 +20,2,304710,5,10,0,5,3,2,1,0,0,20,0,0 +54,4,185846,3,14,1,3,1,0,0,0,1977,40,0,1 +42,2,212894,9,11,1,0,1,0,0,2407,0,40,0,0 +57,1,315460,10,15,1,3,1,0,0,0,0,36,0,0 +49,2,135643,1,9,6,10,4,2,1,0,0,40,27,0 +40,2,220977,8,16,1,1,1,2,0,3103,0,40,3,1 +38,2,202683,1,9,0,0,0,0,0,0,0,40,0,0 +39,2,164866,1,9,1,8,1,0,0,0,0,42,0,1 +43,2,191814,6,12,1,5,1,0,0,7688,0,50,0,1 +57,2,158077,0,13,1,5,2,0,1,0,0,40,0,0 +38,2,191103,10,15,1,3,1,0,0,0,0,99,0,1 +25,2,193701,0,13,0,4,0,0,1,0,0,38,0,0 +40,2,143046,0,13,0,3,0,0,1,0,0,45,0,0 +34,2,206297,0,13,1,1,1,0,0,0,0,48,0,1 +35,1,188563,1,9,2,7,3,0,0,0,0,50,0,0 +53,2,35102,5,10,2,0,0,0,1,0,0,34,0,0 +21,2,203055,5,10,0,8,4,0,0,0,0,40,0,0 +43,2,309932,0,13,1,10,1,0,0,0,0,40,0,0 +43,1,243432,1,9,1,10,1,0,0,0,0,60,0,0 +22,2,177107,9,11,0,3,4,1,1,0,0,35,0,0 +64,1,113929,1,9,1,5,1,0,0,0,0,35,0,0 +40,2,222011,3,14,0,3,0,0,1,3325,0,40,0,0 +34,2,186824,1,9,1,2,1,0,0,0,0,70,0,0 +46,2,192768,1,9,1,0,2,0,1,0,0,40,0,0 +35,2,234962,1,9,0,8,5,0,0,0,0,40,4,0 +32,2,83253,5,10,1,6,1,0,0,0,0,60,0,0 +26,2,248990,5,10,0,10,3,0,0,0,0,40,0,0 +25,2,346159,1,9,0,10,0,0,0,0,0,40,0,0 +55,2,272656,0,13,1,9,1,0,0,0,0,55,0,1 +22,2,60552,5,10,0,5,3,0,1,0,0,40,0,0 +29,0,33798,5,10,2,0,3,0,0,0,0,20,0,0 +38,1,112158,1,9,1,1,1,0,0,0,0,99,0,0 +55,2,200992,5,10,6,4,0,0,1,0,0,35,0,0 +26,2,98155,1,9,1,1,1,0,0,0,0,40,0,0 +34,5,79586,0,13,0,3,0,4,0,0,0,60,0,0 +25,0,143062,1,9,0,0,3,0,1,0,0,40,0,0 +39,2,101146,1,9,2,3,0,0,1,4650,0,40,0,0 +58,0,159021,4,5,1,7,1,0,0,0,0,40,0,0 +34,4,353270,9,11,0,10,3,0,1,0,0,40,0,0 +29,1,162312,5,10,0,1,3,2,0,0,0,45,27,0 +49,0,231961,8,16,2,3,4,0,0,0,0,50,0,1 +38,2,181943,0,13,0,0,0,0,1,0,0,35,0,0 +21,2,163595,5,10,0,4,3,0,0,0,0,35,0,0 +28,2,130856,0,13,1,3,1,0,0,0,0,40,0,1 +42,2,208875,5,10,1,1,2,0,1,0,0,40,22,1 +29,1,58744,6,12,0,4,3,0,0,0,0,60,0,0 +48,2,116641,1,9,2,0,4,0,1,0,0,45,0,0 +40,2,69333,0,13,1,7,1,0,0,0,0,40,0,0 +36,2,320811,5,10,1,10,1,0,0,0,0,40,0,1 +34,2,197886,0,13,1,5,1,0,0,0,0,60,0,1 +57,1,253914,15,2,1,5,1,0,0,0,0,35,4,0 +24,2,89154,4,5,0,4,0,0,0,0,0,40,22,0 +32,2,372317,4,5,4,4,4,0,1,0,0,23,4,0 +39,2,192614,1,9,1,6,1,0,0,0,0,56,0,0 +39,2,403489,2,7,2,6,3,0,0,0,0,40,0,0 +18,2,169652,2,7,0,4,3,0,1,0,0,12,0,0 +20,2,217467,5,10,0,10,3,0,0,0,0,40,0,0 +54,2,175912,12,6,1,6,1,0,0,0,0,40,0,0 +40,1,179533,1,9,1,6,1,0,0,0,0,75,0,1 +27,2,149624,5,10,1,0,1,0,0,0,0,30,0,0 +27,2,289147,1,9,0,8,3,0,1,0,0,40,0,0 +43,3,347720,0,13,0,9,0,0,0,0,0,50,0,0 +22,2,406978,0,13,0,1,5,0,1,0,0,40,0,0 +17,2,193199,2,7,0,5,4,0,1,0,0,12,12,0 +37,5,163998,6,12,1,5,1,0,0,0,0,50,0,1 +49,2,173115,12,6,4,1,0,1,0,4416,0,99,0,0 +33,2,333701,9,11,0,4,4,1,0,0,0,40,0,0 +21,0,48121,5,10,0,1,3,0,0,0,1602,10,0,0 +45,2,186256,1,9,2,10,0,0,0,0,0,40,0,0 +33,2,104525,1,9,1,2,1,0,0,0,0,40,0,0 +25,2,104097,0,13,1,10,1,0,0,2829,0,60,0,0 +71,2,212806,1,9,1,5,1,0,0,0,0,36,0,0 +23,4,203353,0,13,0,3,3,0,1,0,0,45,0,0 +41,2,130126,10,15,1,3,1,0,0,0,0,80,0,1 +47,2,218435,1,9,3,5,4,0,1,0,0,20,1,0 +30,2,154120,0,13,0,5,0,0,0,0,0,65,0,0 +40,2,193537,5,10,1,0,2,0,1,0,0,40,21,0 +44,2,84535,5,10,2,5,4,0,1,0,0,48,0,0 +50,2,150999,3,14,1,3,1,0,0,0,1977,40,0,1 +31,0,157673,1,9,1,7,1,0,0,0,0,40,0,0 +68,2,217424,1,9,1,11,1,0,0,0,0,24,0,0 +45,2,358886,14,8,1,0,1,0,0,2407,0,50,0,0 +38,2,186191,0,13,0,3,3,0,0,0,0,40,0,0 +78,5,212660,2,7,1,1,1,0,0,0,0,10,0,0 +31,5,31740,9,11,1,7,1,0,0,0,0,55,0,0 +39,2,498785,1,9,2,0,0,0,0,0,0,40,0,0 +36,1,35945,7,4,1,8,1,0,0,7298,0,45,0,1 +46,4,162566,3,14,2,3,4,0,1,0,0,50,8,0 +30,2,118861,5,10,1,0,1,2,0,0,0,50,0,1 +34,2,206609,5,10,0,5,4,0,0,0,0,35,0,0 +30,3,423064,1,9,4,0,5,1,0,0,0,35,0,0 +47,2,191957,0,13,1,5,1,1,0,0,0,40,0,1 +40,2,223934,5,10,1,0,2,0,1,0,0,17,0,1 +44,1,195486,1,9,1,5,1,1,0,0,0,70,2,0 +40,2,114580,1,9,2,10,5,0,1,0,0,40,36,0 +20,2,119215,5,10,0,6,3,0,0,0,0,40,0,0 +45,2,240554,0,13,1,1,1,0,0,0,0,40,0,1 +55,2,199067,0,13,1,1,1,0,0,15024,0,42,0,1 +51,2,144084,1,9,0,8,3,0,1,0,0,40,0,0 +38,2,358682,5,10,1,2,1,0,0,0,0,40,0,0 +49,4,59612,3,14,1,3,1,0,0,0,0,40,0,1 +49,0,391585,0,13,1,1,1,0,0,15024,0,40,0,1 +30,4,101345,1,9,4,4,4,0,1,0,0,26,0,0 +20,2,117618,5,10,0,1,3,0,0,0,0,40,0,0 +34,2,231238,4,5,4,7,4,1,0,0,0,40,0,0 +42,4,143046,1,9,6,6,4,0,1,0,0,40,0,0 +46,2,326857,3,14,1,5,1,0,0,0,2415,65,0,1 +43,2,203642,0,13,0,3,0,0,1,0,0,40,0,1 +62,2,88579,1,9,0,0,0,0,1,0,0,38,0,0 +21,2,240517,5,10,0,8,3,0,1,0,0,70,0,0 +58,4,156649,15,2,6,2,4,1,0,0,0,40,0,0 +30,2,143392,0,13,1,0,2,0,1,0,0,40,0,0 +37,2,365465,1,9,4,10,4,0,0,0,0,70,11,0 +22,0,264710,0,13,0,9,3,0,1,0,0,40,0,0 +64,0,223830,4,5,0,0,0,0,1,0,0,38,0,0 +42,2,154374,1,9,1,6,1,0,0,0,0,50,0,1 +43,0,242521,1,9,1,10,1,0,0,0,0,40,0,0 +34,2,124569,5,10,2,0,0,0,1,0,0,40,0,0 +25,2,209230,1,9,0,4,3,0,1,0,0,6,0,0 +21,2,162228,5,10,0,0,3,0,0,0,0,40,0,0 +45,3,60267,1,9,1,0,1,0,0,0,0,40,0,1 +55,1,76901,6,12,1,1,1,0,0,0,0,55,0,1 +24,2,137876,1,9,0,10,3,0,0,0,0,50,0,0 +70,1,347910,5,10,1,1,1,0,0,0,0,35,0,0 +27,4,138917,0,13,0,3,0,0,0,0,0,35,0,0 +34,2,532379,5,10,1,10,1,0,0,0,0,40,0,0 +57,2,31532,0,13,1,6,1,0,0,0,0,40,0,0 +37,1,30973,1,9,1,1,1,0,0,0,0,40,0,0 +52,2,117295,15,2,1,1,1,0,0,0,0,50,0,1 +32,2,295282,1,9,1,10,1,0,0,0,0,48,0,0 +42,2,190786,9,11,1,10,1,0,0,0,0,40,0,0 +24,2,246207,0,13,0,8,3,1,1,0,0,40,0,0 +50,2,130780,1,9,1,2,1,1,0,0,0,40,0,0 +36,2,186212,6,12,1,10,1,0,0,0,0,50,0,0 +42,2,175526,1,9,1,8,1,0,0,0,0,40,0,0 +40,2,207025,1,9,0,0,0,0,1,6849,0,38,0,0 +39,3,82622,0,13,0,0,0,0,0,0,0,45,0,0 +38,0,318886,0,13,1,11,1,1,0,0,0,52,0,0 +18,2,256005,1,9,0,4,3,0,0,0,0,40,0,0 +63,1,217715,11,3,0,5,0,0,1,0,0,3,0,0 +50,2,205803,3,14,1,5,1,0,0,15024,0,40,0,1 +82,1,240491,1,9,1,10,1,0,0,0,0,40,1,0 +33,2,154120,1,9,2,2,3,0,0,0,0,45,0,0 +37,2,69251,5,10,1,6,1,2,0,0,0,40,0,0 +24,2,333505,1,9,3,6,3,0,0,0,0,40,30,0 +31,2,168521,0,13,0,1,4,0,1,0,0,50,0,0 +59,2,193568,1,9,2,8,3,0,1,0,0,40,0,0 +18,2,426895,14,8,0,7,3,0,0,0,0,55,0,0 +47,1,131826,5,10,1,5,1,0,0,0,0,40,0,0 +48,2,79646,2,7,1,7,1,0,0,0,0,50,0,0 +27,2,167031,0,13,0,3,4,4,1,0,0,33,0,0 +34,2,73199,2,7,0,4,3,2,0,0,0,40,11,0 +50,2,114056,9,11,1,11,1,0,0,0,0,84,0,0 +57,1,110417,5,10,1,7,1,0,0,0,0,75,0,0 +60,2,33266,1,9,1,11,1,0,0,0,0,40,0,0 +39,2,154410,1,9,1,0,1,0,0,0,0,40,0,1 +18,2,27780,1,9,0,5,3,0,1,0,0,25,0,0 +26,2,142914,6,12,1,3,2,0,1,0,0,75,0,0 +37,2,190987,5,10,1,5,2,0,1,7298,0,40,0,1 +20,2,314422,1,9,0,5,3,0,1,0,0,30,0,0 +29,4,273771,3,14,0,3,0,0,0,0,0,45,0,0 +30,2,175083,1,9,2,6,0,0,0,0,0,52,0,0 +21,2,63665,5,10,0,4,3,0,0,0,0,15,0,0 +24,4,193416,5,10,0,11,3,0,1,0,0,40,0,0 +51,2,74275,1,9,1,8,1,0,0,0,0,40,0,0 +31,2,122609,1,9,2,0,4,0,1,0,0,40,0,0 +45,2,225456,0,13,1,3,1,0,0,0,1977,40,0,1 +36,4,116892,5,10,1,10,1,0,0,0,0,40,0,0 +29,2,196971,0,13,0,3,3,0,1,0,0,72,0,0 +20,2,105312,1,9,0,5,0,0,1,0,0,35,0,0 +46,2,108699,5,10,6,0,0,0,1,0,0,60,0,0 +44,2,171615,1,9,1,6,1,0,0,0,0,45,0,0 +39,2,388023,1,9,2,1,0,0,1,0,0,38,0,0 +39,2,181553,0,13,2,1,0,0,0,0,0,55,0,0 +45,2,170850,1,9,1,8,1,0,0,0,0,44,0,1 +28,2,187479,5,10,1,1,1,0,0,0,0,55,0,0 +44,2,277720,5,10,1,0,2,0,1,0,0,35,0,0 +48,4,493862,1,9,1,1,1,1,0,7298,0,38,0,1 +27,2,220754,1,9,0,0,0,0,1,0,0,70,0,0 +34,1,209768,1,9,1,1,1,0,0,0,0,40,0,0 +35,2,93225,1,9,1,10,1,0,0,0,0,40,0,0 +28,3,341709,1,9,0,10,0,0,0,0,0,40,0,0 +25,2,236242,10,15,0,3,0,0,1,0,0,30,0,0 +21,2,121889,5,10,0,5,3,1,1,0,0,20,0,0 +18,2,318190,2,7,0,4,3,0,0,0,0,15,0,0 +63,1,111306,7,4,6,7,4,0,1,0,0,10,0,0 +18,2,198614,2,7,0,5,3,1,1,0,0,8,0,0 +32,2,193231,1,9,1,10,1,0,0,0,0,40,0,0 +19,2,172368,2,7,0,6,3,0,0,0,0,20,0,0 +23,2,60331,5,10,0,6,0,0,0,0,0,60,0,0 +36,2,192939,3,14,1,3,1,0,0,0,1977,60,0,1 +43,2,138184,1,9,2,4,0,1,1,0,1762,35,0,0 +45,2,238567,0,13,1,1,1,0,0,0,0,40,7,1 +30,2,208068,1,9,1,10,1,4,0,0,0,40,4,0 +46,2,181810,1,9,1,10,1,1,0,4064,0,40,0,0 +24,3,283918,5,10,2,0,4,1,1,0,0,25,0,0 +42,2,107276,5,10,0,1,0,0,1,0,2444,40,0,1 +23,2,37783,5,10,0,5,3,0,1,0,0,40,0,0 +27,2,263552,1,9,0,0,0,0,0,0,0,50,0,0 +48,2,255439,5,10,0,2,0,0,0,0,0,40,0,0 +31,5,344275,1,9,0,10,0,0,0,0,0,44,0,0 +31,2,70568,15,2,0,4,5,0,1,0,0,25,22,0 +18,2,127827,14,8,0,5,3,0,1,0,0,25,0,0 +36,2,185203,1,9,0,5,0,0,1,0,0,40,0,0 +58,2,123436,0,13,1,1,1,0,0,7688,0,50,0,1 +51,1,136322,1,9,1,7,1,0,0,0,1579,40,0,0 +22,2,187052,1,9,0,0,3,0,1,0,0,40,0,0 +72,2,177769,12,6,1,5,1,0,0,0,0,15,0,0 +61,2,68268,12,6,1,7,1,0,0,0,0,55,0,0 +42,2,424855,5,10,1,8,1,0,0,3908,0,40,0,0 +30,5,153549,1,9,1,1,1,0,0,0,0,50,0,1 +40,2,271393,6,12,2,1,0,0,1,0,0,40,0,0 +20,2,198148,1,9,0,0,3,0,0,0,0,40,0,0 +65,2,469602,0,13,1,5,1,0,0,0,0,15,0,0 +36,2,163290,5,10,2,5,4,0,1,0,0,40,0,0 +37,2,295949,1,9,0,8,0,0,0,0,0,40,0,0 +33,1,125279,5,10,1,5,1,0,0,0,0,60,0,0 +64,4,182866,1,9,6,4,4,0,1,0,0,40,0,0 +61,1,111563,0,13,1,7,1,0,0,0,0,20,0,1 +38,2,34173,0,13,0,5,4,0,1,0,0,45,0,0 +27,2,183627,0,13,1,1,1,0,0,0,1977,50,0,1 +24,2,197757,0,13,0,3,3,2,1,0,0,40,11,0 +39,2,98941,0,13,0,3,0,0,0,0,0,40,0,1 +44,2,205474,0,13,1,5,1,0,0,0,0,40,0,1 +47,2,206659,5,10,2,0,5,0,1,0,0,40,0,0 +66,2,244661,0,13,1,0,1,2,0,0,0,40,11,0 +53,2,47396,5,10,1,0,1,0,0,0,0,50,0,1 +43,0,270721,0,13,1,1,1,0,0,0,0,55,0,1 +57,0,32694,8,16,1,3,1,0,0,0,0,40,0,1 +44,2,171256,6,12,2,8,3,0,1,0,0,45,0,0 +59,2,169982,0,13,1,1,1,0,0,0,2002,50,0,0 +52,1,217210,1,9,6,4,5,1,1,0,0,40,0,0 +46,2,218329,5,10,0,10,3,0,0,0,0,40,0,0 +20,2,386643,5,10,0,4,3,0,1,0,0,40,0,0 +37,3,125933,1,9,1,0,1,0,0,0,0,40,0,1 +41,1,155767,5,10,1,1,1,0,0,0,0,50,0,0 +39,3,432555,1,9,1,0,1,1,0,0,1628,40,0,0 +30,2,54929,1,9,1,5,1,0,0,0,0,55,0,0 +59,2,162136,5,10,2,8,0,0,0,0,0,56,0,0 +22,2,256504,0,13,0,0,3,0,1,0,0,40,0,0 +40,2,162098,1,9,2,0,4,0,1,0,0,30,0,0 +39,1,103110,0,13,1,3,1,0,0,0,0,50,0,0 +24,2,227610,12,6,2,2,4,0,1,0,0,58,0,0 +63,2,176696,1,9,1,10,1,0,0,0,0,40,0,1 +51,2,220019,6,12,2,3,0,0,1,0,0,40,0,0 +34,5,242984,0,13,0,1,0,0,0,0,0,50,0,0 +38,2,187847,9,11,1,1,1,0,0,0,0,50,0,1 +17,2,132636,2,7,0,5,3,0,1,0,0,15,0,0 +20,2,108887,5,10,0,0,3,0,1,0,0,25,0,0 +42,1,195897,1,9,1,10,1,0,0,0,0,40,0,0 +41,2,112181,0,13,1,5,2,0,1,0,0,12,0,1 +56,4,391926,1,9,1,1,1,0,0,0,0,40,0,0 +17,2,195505,12,6,0,5,3,0,0,0,0,5,0,0 +31,2,43819,0,13,1,3,2,0,1,7688,0,43,0,1 +23,2,145389,5,10,1,5,2,0,1,0,0,40,0,0 +36,4,101833,0,13,4,3,0,0,0,0,0,40,0,0 +52,2,99602,1,9,4,10,3,1,1,0,0,40,0,0 +28,2,213276,1,9,1,1,1,0,0,0,0,50,0,0 +30,2,176123,12,6,0,8,5,2,0,0,0,40,36,0 +32,2,38797,9,11,0,10,0,0,0,0,0,40,0,0 +30,2,101859,7,4,0,10,0,0,0,0,0,50,0,0 +53,2,87158,1,9,1,10,1,1,0,0,0,40,0,0 +54,1,205066,12,6,1,10,1,0,0,0,0,36,0,0 +31,2,87950,9,11,2,5,0,3,1,0,0,40,0,0 +34,2,150154,1,9,0,0,3,0,0,0,0,40,0,0 +58,2,142076,1,9,2,9,0,0,0,4787,0,39,0,1 +30,0,112139,1,9,1,11,1,0,0,0,0,40,0,0 +53,2,149217,1,9,1,10,1,0,0,0,0,40,5,0 +27,2,189974,5,10,2,0,3,0,1,0,0,20,0,0 +23,2,109199,11,3,1,2,1,0,0,0,0,40,4,0 +24,2,190290,9,11,1,10,1,0,0,0,0,45,0,0 +36,2,189404,0,13,1,5,1,0,0,0,1977,35,0,1 +33,3,428271,1,9,2,0,4,1,1,0,0,35,0,0 +22,0,134192,5,10,0,9,3,0,1,0,0,10,0,0 +47,2,168211,1,9,1,10,1,0,0,0,0,44,0,0 +34,2,277314,6,12,1,5,1,1,0,0,1902,50,0,1 +44,3,316120,10,15,2,3,4,0,0,0,0,40,0,1 +41,2,107276,9,11,0,3,0,0,1,0,0,45,0,0 +24,2,346909,1,9,1,10,1,0,0,0,0,44,4,0 +45,2,317360,0,13,2,3,4,0,1,0,0,50,0,0 +23,2,189017,0,13,0,5,0,0,0,0,0,55,0,0 +54,2,138179,1,9,1,8,1,0,0,0,0,40,0,0 +40,2,299813,2,7,0,8,0,0,1,0,0,37,21,0 +45,2,265083,11,3,2,13,4,0,1,0,0,35,4,0 +50,2,185846,1,9,1,5,1,0,0,0,0,40,0,0 +40,2,184655,6,12,0,4,5,0,0,0,0,25,0,0 +24,2,200295,5,10,0,10,0,0,0,0,0,40,0,0 +42,2,117319,1,9,1,10,1,0,0,0,1672,40,0,0 +50,2,63000,5,10,1,5,1,0,0,0,0,60,0,1 +58,1,106942,5,10,2,10,4,0,0,0,0,40,0,0 +47,2,52795,5,10,1,8,1,0,0,0,0,46,0,0 +37,2,51264,8,16,1,3,1,0,0,0,0,99,23,1 +37,1,410919,1,9,0,10,3,0,0,0,0,35,0,0 +22,2,105592,6,12,0,6,0,0,0,0,0,45,0,0 +29,1,183151,1,9,1,6,1,0,0,0,0,48,0,0 +45,2,209912,0,13,1,1,1,2,0,0,0,40,3,1 +49,1,275845,5,10,1,1,1,0,0,0,0,60,0,0 +44,4,241851,9,11,1,6,1,0,0,4386,0,40,0,1 +72,2,89299,1,9,2,4,0,0,1,0,0,16,0,0 +63,1,106648,1,9,1,4,1,0,0,0,0,12,0,0 +26,2,58426,1,9,1,3,1,0,0,0,0,50,0,0 +58,1,121912,9,11,1,10,1,0,0,0,0,42,0,0 +40,2,170730,1,9,1,10,1,0,0,0,0,50,0,0 +56,2,257555,5,10,1,5,1,0,0,0,0,40,0,0 +55,1,51499,5,10,1,7,1,0,0,0,0,72,0,0 +28,2,195000,0,13,0,5,5,0,1,0,0,45,0,0 +57,2,108741,1,9,1,1,2,0,1,0,0,40,0,0 +37,2,184964,3,14,2,1,0,0,0,0,0,45,0,1 +44,2,156815,1,9,2,0,0,0,1,0,0,40,0,0 +31,2,49325,1,9,1,8,1,0,0,0,0,40,0,0 +42,2,121718,5,10,1,0,1,0,0,0,0,40,9,0 +18,2,172076,5,10,0,4,3,0,1,0,0,25,0,0 +57,1,327901,12,6,1,10,1,0,0,0,0,40,0,0 +53,4,215990,5,10,1,4,1,0,0,0,0,35,0,0 +38,2,210866,1,9,1,1,1,0,0,0,0,44,0,1 +33,2,322873,1,9,2,5,0,0,1,0,0,50,0,0 +42,2,265698,3,14,2,3,4,0,1,0,0,40,0,0 +50,2,177896,1,9,1,10,1,0,0,0,0,50,0,0 +50,2,189107,1,9,1,8,1,0,0,0,0,40,0,0 +28,2,306830,6,12,1,2,1,0,0,0,0,40,35,0 +72,3,39110,2,7,2,0,0,0,1,0,0,8,8,0 +33,2,155475,1,9,1,5,1,0,0,0,0,40,0,0 +47,2,135803,1,9,1,4,1,2,0,0,0,25,11,0 +48,2,117849,5,10,1,3,1,0,0,0,0,40,0,1 +64,1,339321,0,13,1,3,1,0,0,0,0,24,0,1 +19,2,318822,2,7,0,13,0,0,1,0,0,35,0,0 +48,2,174794,9,11,2,0,4,0,1,0,0,40,0,0 +37,2,204277,1,9,1,8,1,0,0,0,1848,48,0,1 +55,2,182460,1,9,1,10,1,0,0,15024,0,35,0,1 +42,3,91468,1,9,2,0,0,0,1,0,0,40,0,0 +43,2,106760,1,9,1,0,2,0,1,0,0,50,8,1 +34,2,375680,6,12,0,10,3,1,1,0,0,40,0,0 +55,5,222615,3,14,1,1,1,0,0,0,0,60,0,0 +22,2,190968,1,9,1,4,1,0,0,0,0,40,0,0 +39,2,76767,5,10,2,0,0,0,1,0,0,60,0,0 +50,1,203098,0,13,1,1,1,0,0,0,0,35,0,0 +47,4,162187,5,10,1,6,1,0,0,0,1887,40,0,1 +25,2,242729,0,13,0,5,3,0,1,0,0,20,0,0 +52,2,253784,2,7,2,4,4,0,1,0,0,20,0,0 +30,2,206051,1,9,1,6,1,0,0,0,0,40,0,0 +37,1,181553,1,9,2,10,0,0,0,0,0,50,0,0 +73,5,80986,1,9,1,5,1,0,0,0,0,20,0,0 +50,2,200783,7,4,2,10,0,0,0,0,0,60,0,0 +34,2,42596,5,10,1,1,1,0,0,0,0,45,0,0 +66,2,205724,5,10,1,5,1,0,0,0,0,24,0,1 +22,2,446140,1,9,0,5,3,0,0,0,0,55,0,0 +69,4,32287,12,6,1,6,1,0,0,0,0,25,0,0 +23,2,56774,1,9,0,10,3,0,0,0,0,40,0,0 +35,2,176279,5,10,6,0,4,0,1,0,0,30,0,0 +20,2,103277,5,10,0,0,3,0,1,0,0,35,0,0 +70,5,225780,5,10,1,1,1,0,0,0,0,20,0,1 +54,2,154728,9,11,1,9,1,0,0,7688,0,40,0,1 +34,2,149943,1,9,0,4,0,2,0,0,0,40,28,0 +38,0,22245,8,16,1,3,1,0,0,0,0,45,0,1 +33,2,93056,7,4,2,2,3,0,0,0,0,40,0,0 +43,2,270522,1,9,4,4,0,0,1,0,0,26,0,0 +60,5,123218,5,10,1,1,1,0,0,0,0,40,0,0 +81,1,123959,0,13,6,3,0,0,1,0,1668,3,39,0 +32,1,103642,1,9,1,1,1,0,0,0,0,55,0,0 +34,2,157747,1,9,1,6,1,0,0,0,0,45,0,0 +46,1,154083,3,14,0,1,0,0,0,0,0,25,0,0 +30,0,23037,5,10,0,4,3,3,0,0,0,84,0,0 +29,2,50028,5,10,1,4,1,0,0,0,0,40,0,0 +51,2,138251,1,9,1,6,1,0,0,0,0,60,0,0 +31,2,369825,7,4,0,2,5,0,0,0,0,25,0,0 +36,3,44364,1,9,0,0,3,1,1,0,0,36,0,0 +23,2,230704,5,10,0,2,3,1,0,0,0,22,0,0 +35,2,42044,1,9,1,8,1,0,0,0,0,30,0,0 +28,4,56340,3,14,0,3,0,0,1,0,0,40,0,0 +33,0,156015,0,13,1,1,1,0,0,0,0,40,0,1 +40,2,163434,5,10,1,2,1,0,0,0,0,40,0,0 +27,2,85251,5,10,1,6,1,0,0,0,0,45,0,0 +38,5,187411,1,9,1,1,1,0,0,0,0,40,0,1 +47,2,155124,9,11,2,3,0,0,1,0,1669,40,0,0 +25,2,396633,5,10,1,0,2,1,1,0,0,56,0,1 +45,2,182313,0,13,1,1,1,0,0,7688,0,50,0,1 +38,2,52596,5,10,0,0,3,1,1,0,0,40,0,0 +65,4,143570,5,10,0,3,0,1,1,0,0,40,0,0 +30,2,160634,9,11,0,10,3,0,0,0,0,40,0,1 +54,2,29909,2,7,1,4,2,0,1,0,0,43,0,0 +49,2,94215,14,8,2,8,0,0,1,0,0,40,0,0 +41,1,151990,9,11,1,3,2,0,1,0,0,15,0,1 +48,3,188081,1,9,1,0,1,0,0,0,0,40,0,1 +23,2,218445,11,3,0,13,4,0,1,0,0,12,4,0 +77,2,235775,1,9,1,4,1,0,0,0,0,25,1,0 +19,2,98605,5,10,0,4,3,0,1,0,0,20,0,0 +30,2,188398,1,9,3,0,0,0,1,0,0,30,0,0 +41,5,140365,0,13,1,1,1,0,0,0,1902,55,0,1 +35,2,202950,1,9,1,1,1,0,0,0,0,55,10,1 +20,2,218215,5,10,0,0,3,0,1,0,0,40,0,0 +66,5,197816,0,13,1,1,1,0,0,10605,0,40,0,1 +49,2,147002,1,9,0,10,4,0,1,0,0,40,5,0 +52,2,138497,0,13,1,5,1,0,0,0,0,45,0,1 +24,2,57711,3,14,1,3,2,0,1,0,0,35,0,1 +50,2,169925,1,9,1,10,1,0,0,0,0,15,0,0 +22,2,72310,2,7,0,6,0,0,0,0,0,65,0,0 +19,2,170800,5,10,0,4,3,0,0,0,0,20,0,0 +39,2,215095,2,7,0,3,4,0,1,0,0,30,5,0 +61,4,34632,0,13,2,4,0,0,0,0,0,30,0,0 +45,2,140664,6,12,2,6,0,0,0,0,0,55,0,0 +36,4,177858,0,13,1,3,3,0,0,0,0,40,0,0 +40,2,160369,3,14,1,1,1,0,0,0,2415,45,0,1 +38,2,129102,1,9,1,1,1,0,0,0,0,50,0,0 +52,4,278522,5,10,1,6,1,1,0,0,0,40,0,0 +29,3,124953,9,11,1,9,1,0,0,0,0,42,0,1 +33,2,63184,1,9,0,7,0,0,0,0,0,40,0,0 +40,1,165815,5,10,0,10,3,0,0,0,0,40,0,0 +34,2,248584,1,9,0,10,0,0,0,0,0,55,0,0 +46,4,226871,0,13,2,11,0,1,0,0,0,50,0,1 +44,2,267717,3,14,1,10,1,0,0,15024,0,45,0,1 +19,2,60367,1,9,0,4,3,0,1,0,0,13,0,0 +44,2,134120,1,9,1,0,2,0,1,0,0,40,0,1 +40,2,95639,1,9,0,10,0,3,0,0,0,40,0,0 +20,2,132053,5,10,0,3,3,0,1,0,0,2,0,0 +24,2,138768,6,12,0,2,3,0,0,0,0,30,0,0 +76,2,203910,1,9,6,4,0,0,0,0,0,17,0,0 +20,2,109952,1,9,1,9,5,0,0,0,0,40,0,0 +33,2,155781,10,15,0,3,0,0,0,0,0,40,0,1 +31,2,49398,5,10,1,9,1,0,0,0,0,40,0,0 +33,2,159303,1,9,2,4,4,0,1,0,0,40,0,0 +19,2,248339,1,9,0,10,3,0,0,0,0,35,0,0 +29,2,190539,0,13,0,1,0,0,0,0,1590,50,0,0 +30,2,183620,1,9,1,5,1,0,0,0,0,45,0,0 +48,2,25468,3,14,2,1,0,0,0,99999,0,50,0,1 +42,2,201495,0,13,1,1,1,0,0,0,0,40,0,0 +37,2,52221,2,7,1,6,1,0,0,0,0,40,0,0 +54,5,96460,1,9,1,1,1,0,0,7688,0,60,0,1 +42,2,325353,6,12,1,0,1,0,0,7688,0,42,0,1 +28,1,176027,1,9,0,4,0,0,1,0,0,28,0,0 +42,4,266135,5,10,1,11,1,0,0,0,0,52,0,1 +60,0,194252,3,14,1,1,2,0,1,3103,0,40,0,1 +21,2,363192,9,11,0,4,3,0,1,0,0,40,0,0 +29,2,31360,5,10,0,7,3,0,0,0,0,40,0,0 +43,2,63503,0,13,1,3,1,0,0,0,0,40,0,1 +44,2,157614,1,9,2,5,3,0,0,0,0,38,0,0 +45,2,160647,0,13,2,0,4,0,1,4687,0,35,0,1 +38,2,363395,5,10,0,5,4,1,1,0,0,40,0,0 +28,2,338376,5,10,1,0,1,0,0,0,0,50,0,1 +29,2,87523,1,9,0,5,3,0,1,0,0,40,0,0 +20,2,280714,5,10,0,4,3,0,0,0,0,40,0,0 +49,5,119565,3,14,1,5,1,0,0,0,0,40,0,1 +36,4,171482,5,10,1,11,1,0,0,0,0,56,0,1 +40,5,49249,0,13,1,1,1,0,0,0,0,50,0,1 +17,2,331552,14,8,0,0,3,0,1,0,0,30,0,0 +45,2,174426,1,9,1,10,1,0,0,0,0,40,0,0 +42,2,184105,5,10,0,7,0,0,0,0,0,28,0,0 +29,2,37933,0,13,0,1,4,1,1,0,0,40,0,0 +57,1,291529,0,13,1,1,1,0,0,4386,0,13,0,1 +23,2,376416,0,13,0,0,0,0,0,0,0,40,0,0 +20,2,263612,5,10,0,0,3,1,1,0,0,40,19,0 +23,2,227471,1,9,0,2,3,0,0,0,0,24,0,0 +39,2,191103,1,9,0,4,0,0,0,0,0,40,0,0 +34,2,35644,5,10,1,10,1,0,0,0,0,40,0,1 +43,1,227298,0,13,0,5,0,0,0,0,0,45,0,0 +25,0,187508,5,10,0,2,3,0,0,0,0,40,0,0 +40,2,184378,5,10,1,5,1,0,0,0,0,60,5,0 +52,1,190333,1,9,2,7,0,0,0,0,0,25,0,0 +48,2,155372,1,9,6,8,4,0,1,0,0,36,0,0 +37,2,259882,9,11,0,5,4,1,1,0,0,6,0,0 +36,2,217077,1,9,1,5,1,0,0,0,0,50,0,0 +33,2,103596,9,11,1,6,1,0,0,0,0,40,0,0 +36,4,188236,1,9,1,0,2,0,1,0,0,40,0,1 +24,2,353010,0,13,0,0,0,0,0,0,0,10,0,0 +42,4,70655,1,9,2,7,0,0,0,0,0,40,0,0 +35,5,64874,6,12,0,5,3,0,0,0,0,40,0,0 +40,3,219240,1,9,2,0,4,0,1,0,0,22,0,0 +50,5,104849,10,15,1,3,1,2,0,0,0,40,3,0 +40,2,173590,3,14,1,1,1,0,0,0,0,50,0,1 +57,5,195835,1,9,1,1,1,0,0,0,0,40,0,0 +51,4,170579,1,9,1,6,1,0,0,0,0,40,0,1 +61,3,230545,1,9,0,0,4,0,1,0,0,35,5,0 +71,2,162297,1,9,6,5,4,0,1,0,0,20,0,0 +47,2,169549,1,9,1,10,1,0,0,0,0,40,0,1 +38,2,117528,0,13,0,4,5,0,1,0,0,45,0,0 +25,2,273876,0,13,0,5,0,0,0,0,0,65,0,0 +33,2,529104,2,7,1,2,1,0,0,0,0,50,0,0 +40,0,456110,2,7,2,6,4,0,1,0,0,52,0,0 +29,2,170301,1,9,1,0,2,0,1,2829,0,40,0,0 +33,2,55717,1,9,0,10,0,0,0,0,0,40,0,0 +46,2,166181,5,10,0,0,3,1,1,0,0,36,0,0 +24,2,52242,1,9,1,5,2,0,1,0,0,40,0,1 +28,2,224629,3,14,0,1,0,4,0,0,0,30,1,0 +20,2,197997,1,9,0,10,0,0,0,0,0,40,0,0 +34,2,46144,5,10,2,2,4,0,1,0,0,40,0,0 +34,0,180871,0,13,1,0,1,0,0,0,0,55,0,0 +25,2,212311,5,10,0,0,4,1,1,0,0,40,0,0 +36,2,232874,0,13,1,9,1,0,0,0,0,40,0,0 +61,2,175999,1,9,1,8,1,0,0,0,0,40,0,0 +38,2,177121,5,10,4,4,0,0,1,0,0,58,0,0 +57,2,299358,1,9,6,4,5,0,1,0,1719,25,0,0 +56,2,129836,1,9,1,4,2,0,1,0,0,10,0,0 +24,2,225515,0,13,0,1,0,0,1,0,0,40,0,0 +60,2,145664,5,10,2,5,0,0,1,0,0,48,0,0 +37,2,151764,5,10,1,1,1,0,0,0,0,50,0,0 +27,2,183523,5,10,1,6,1,0,0,0,0,40,0,1 +54,2,257869,5,10,4,4,0,0,0,0,0,28,13,0 +40,2,73025,1,9,1,4,1,2,0,0,0,30,26,0 +18,2,165532,14,8,0,4,3,0,0,0,0,15,0,0 +51,3,140035,1,9,1,0,1,0,0,0,0,40,0,1 +40,1,325159,5,10,1,9,1,0,0,0,0,50,0,1 +64,3,161926,1,9,1,3,1,0,0,0,0,8,0,0 +24,2,163665,1,9,0,4,0,0,1,2174,0,40,0,0 +33,2,106938,1,9,1,9,2,1,1,0,0,38,0,0 +31,2,97453,1,9,2,1,4,0,1,0,0,40,0,0 +26,4,242464,1,9,1,11,1,0,0,3103,0,40,0,1 +54,2,155233,0,13,0,0,0,0,1,14084,0,40,0,1 +31,2,248653,15,2,0,2,0,0,0,0,0,37,4,0 +22,2,141297,5,10,0,9,3,0,0,0,0,40,0,0 +31,2,227325,5,10,0,10,0,0,0,0,0,40,0,0 +68,2,123653,11,3,4,4,0,0,0,0,0,12,25,0 +59,3,176317,12,6,2,4,0,0,1,0,0,37,0,0 +35,1,77146,1,9,1,10,1,0,0,2829,0,45,0,0 +25,2,169124,0,13,0,0,3,0,0,0,0,40,0,0 +23,2,179413,1,9,0,10,4,0,0,0,0,40,0,0 +35,2,180137,5,10,2,1,4,0,0,0,0,60,0,0 +17,0,179319,12,6,0,4,3,0,0,0,0,30,0,0 +19,2,45766,5,10,0,2,0,0,0,0,0,45,0,0 +53,2,152810,3,14,1,1,1,0,0,0,1977,55,0,1 +59,2,214052,11,3,2,8,4,0,1,0,0,40,0,0 +37,2,201141,1,9,0,0,3,0,1,0,0,37,0,0 +74,1,43599,1,9,6,4,0,0,0,0,0,20,0,0 +28,2,292536,5,10,0,6,0,0,0,0,0,50,0,0 +40,2,82161,0,13,0,0,0,0,0,0,0,40,0,0 +20,2,181370,5,10,0,4,3,1,0,0,0,40,0,0 +80,2,148623,10,15,1,3,1,0,0,0,0,35,0,1 +51,2,84399,1,9,1,8,1,1,0,0,0,40,0,0 +17,2,143331,12,6,0,5,3,0,0,0,0,15,0,0 +37,3,48779,0,13,1,3,1,0,0,0,0,40,0,0 +58,2,83542,1,9,0,4,0,0,0,0,0,40,0,0 +57,2,214619,5,10,1,10,1,0,0,0,0,40,0,0 +37,2,160035,5,10,2,8,0,0,0,0,0,40,0,0 +23,3,39603,5,10,0,10,4,3,0,0,0,40,0,0 +36,2,181589,0,13,0,0,0,0,1,0,0,32,13,0 +33,2,261511,1,9,1,10,1,0,0,0,0,40,0,0 +30,2,29522,5,10,1,5,2,0,1,0,0,40,0,0 +30,2,36340,1,9,0,0,4,0,1,0,0,24,0,0 +41,2,320984,10,15,1,3,1,0,0,99999,0,65,0,1 +23,2,122346,1,9,0,5,3,0,0,0,0,40,0,0 +40,2,105794,10,15,0,3,0,0,1,14084,0,50,0,1 +53,2,152883,1,9,6,0,0,1,1,0,0,40,0,0 +31,0,123037,5,10,0,9,0,0,0,0,0,13,0,0 +36,2,182074,1,9,0,0,5,0,0,0,0,40,0,0 +30,2,248588,14,8,2,4,0,0,1,0,0,40,0,0 +44,2,187584,1,9,1,11,1,0,0,0,0,40,8,0 +36,2,46706,1,9,0,4,3,0,0,0,0,40,0,0 +42,2,190290,6,12,1,3,1,0,0,0,0,40,0,1 +48,1,247294,1,9,1,10,1,0,0,0,0,30,30,0 +22,2,117779,0,13,0,3,3,0,0,0,0,40,0,0 +38,2,121602,1,9,1,8,1,0,0,0,0,40,0,0 +31,2,451744,1,9,0,10,0,0,0,0,0,50,0,0 +32,2,107793,1,9,2,4,3,0,0,2174,0,40,0,0 +35,2,339772,1,9,1,2,1,1,0,0,0,40,0,0 +21,2,185582,5,10,0,5,3,0,0,0,0,43,0,0 +26,2,260614,1,9,1,8,1,0,0,0,0,40,0,0 +19,4,53220,1,9,0,0,3,1,1,0,0,40,0,0 +43,2,213844,1,9,5,10,2,1,1,0,0,42,0,1 +33,2,213226,1,9,1,10,1,0,0,0,0,60,0,0 +30,2,58582,0,13,0,10,3,0,0,0,0,10,0,0 +52,2,193116,12,6,1,6,1,0,0,0,0,45,0,0 +38,4,201410,0,13,1,1,1,0,0,0,0,40,0,1 +28,2,190525,0,13,1,1,1,0,0,0,0,46,0,1 +57,1,138285,6,12,1,4,1,0,0,0,0,40,10,0 +51,2,111939,0,13,1,3,1,0,0,0,0,50,0,1 +50,2,109277,4,5,1,8,1,0,0,0,0,48,0,0 +32,2,331539,0,13,1,1,1,2,0,0,0,50,26,1 +32,2,396745,0,13,1,3,1,0,0,0,2415,48,0,1 +37,2,126675,1,9,1,10,1,0,0,0,0,40,0,0 +69,1,349022,1,9,1,5,1,0,0,0,0,33,0,0 +37,2,234901,5,10,1,5,1,0,0,0,0,50,9,1 +36,2,100681,5,10,0,0,0,0,0,2463,0,40,0,0 +47,1,265097,1,9,1,6,1,0,0,0,0,45,0,1 +63,2,237379,12,6,1,6,1,0,0,0,0,40,0,0 +21,2,44793,5,10,0,0,0,0,0,0,0,65,0,0 +17,2,270942,1,9,0,4,5,0,0,0,0,35,4,0 +56,2,193622,1,9,4,10,4,0,0,0,0,40,0,0 +90,4,187749,6,12,1,0,1,2,0,0,0,20,11,0 +27,2,160178,5,10,2,0,0,0,1,0,0,38,0,0 +38,2,680390,1,9,2,0,4,0,1,0,0,20,0,0 +33,2,96245,6,12,1,3,1,0,0,0,0,50,0,0 +26,2,34803,1,9,0,1,0,0,1,0,0,40,0,0 +20,2,170091,5,10,0,4,3,0,1,0,0,35,0,0 +42,2,231813,2,7,1,6,1,0,0,0,0,40,0,0 +55,2,23789,1,9,2,1,0,0,1,0,0,40,0,0 +32,0,438711,5,10,1,3,2,1,1,0,0,40,0,0 +66,2,169804,0,13,1,5,1,0,0,20051,0,40,0,1 +66,4,376506,8,16,2,3,0,0,1,3273,0,40,0,0 +49,2,28791,5,10,2,4,0,0,1,0,0,40,0,0 +34,2,162814,1,9,2,11,0,1,0,0,0,45,0,0 +38,2,58108,0,13,1,1,1,0,0,0,0,50,0,1 +40,5,102226,1,9,1,1,1,0,0,0,0,40,0,0 +22,3,209131,6,12,0,4,3,0,0,0,0,20,0,0 +46,1,157117,1,9,1,6,1,0,0,0,0,40,0,0 +29,2,172865,1,9,1,8,1,0,0,0,0,50,0,0 +19,2,29798,14,8,0,2,3,3,0,0,0,20,0,0 +37,4,80680,0,13,2,3,4,0,1,1151,0,35,0,0 +52,4,238959,3,14,0,3,0,0,0,0,0,32,0,1 +27,2,189462,3,14,0,0,0,0,1,0,0,46,0,0 +52,2,139347,1,9,1,6,2,0,1,0,0,40,0,0 +31,2,188108,1,9,0,10,3,0,0,4101,0,40,0,0 +37,5,111128,5,10,1,10,1,0,0,0,0,50,0,1 +28,2,81540,1,9,0,2,0,0,0,0,0,40,0,0 +25,2,257562,7,4,1,10,1,0,0,0,0,40,4,0 +31,2,59496,5,10,1,0,1,0,0,0,0,50,0,0 +29,2,29974,1,9,1,10,1,0,0,0,0,40,0,0 +45,2,102597,1,9,6,0,4,0,1,0,0,35,0,0 +69,2,41419,7,4,1,4,1,0,0,0,0,20,0,0 +50,2,118565,2,7,1,8,1,1,0,0,0,40,0,0 +54,0,312897,8,16,1,3,1,0,0,0,0,46,7,1 +17,2,166290,4,5,0,4,3,0,1,0,0,20,0,0 +34,2,160261,1,9,0,9,3,2,0,14084,0,35,26,1 +23,2,203076,5,10,0,8,3,0,0,0,0,40,0,0 +66,2,201197,0,13,1,3,1,0,0,0,0,45,0,1 +61,2,273803,1,9,1,10,1,0,0,0,0,40,0,0 +55,2,156797,5,10,2,8,0,0,1,0,0,40,0,0 +24,2,283896,1,9,0,2,0,0,0,0,0,40,0,0 +30,2,149368,1,9,2,5,4,0,0,1151,0,30,0,0 +49,2,156926,9,11,2,1,0,0,0,0,0,45,0,1 +56,5,165881,1,9,1,5,1,0,0,0,0,50,0,1 +25,2,86872,1,9,1,5,1,0,0,0,0,40,0,0 +49,2,167523,0,13,2,11,0,0,0,0,0,40,0,0 +58,2,154950,0,13,1,9,1,0,0,0,0,40,0,1 +40,3,171231,0,13,0,0,0,0,0,0,0,40,5,0 +62,2,244933,3,14,2,3,0,0,1,0,0,45,0,0 +54,2,256908,0,13,1,9,1,0,0,0,0,25,0,1 +34,1,33442,9,11,0,4,5,0,1,0,0,40,0,0 +18,2,126142,12,6,0,10,3,0,0,0,0,30,0,0 +32,2,167106,1,9,1,5,1,2,0,0,0,40,37,0 +22,4,50065,0,13,0,3,0,0,1,0,0,35,0,0 +34,0,252529,0,13,0,3,0,0,0,0,0,48,0,0 +47,2,343579,1,9,1,4,1,0,0,0,0,40,4,0 +19,2,190817,5,10,0,5,3,0,1,0,0,40,0,0 +41,5,151089,5,10,1,1,1,0,0,0,2415,55,0,1 +46,2,186820,5,10,1,4,2,0,1,5013,0,40,0,0 +56,1,210731,7,4,2,5,5,0,0,0,0,20,4,0 +42,2,123816,1,9,2,8,0,1,1,0,0,40,0,0 +25,2,77071,0,13,0,3,3,0,1,0,2339,35,0,0 +42,2,115085,1,9,1,0,1,0,0,0,0,50,0,0 +43,2,170525,0,13,2,3,0,0,1,14344,0,40,0,1 +17,2,209949,2,7,0,5,3,0,1,0,1602,12,0,0 +57,1,34297,7,4,1,10,1,0,0,0,0,40,0,1 +40,2,180985,3,14,1,1,1,0,0,0,0,50,0,1 +62,4,33365,1,9,6,4,0,0,1,0,0,40,8,0 +20,2,197752,5,10,0,0,3,0,0,0,0,16,0,0 +47,2,180551,5,10,1,6,1,0,0,0,0,50,0,0 +40,2,77975,5,10,1,1,1,0,0,0,0,40,0,0 +48,2,94342,0,13,1,10,1,0,0,0,0,55,0,0 +39,5,34180,9,11,1,7,1,0,0,0,0,60,0,1 +46,4,367251,5,10,1,10,1,1,0,0,0,40,0,1 +72,5,172407,10,15,1,3,1,0,0,99999,0,50,0,1 +53,2,303462,1,9,1,8,1,0,0,0,0,30,0,0 +47,3,220269,5,10,1,2,1,0,0,0,0,40,0,1 +40,1,45093,1,9,2,10,0,0,0,0,0,45,8,0 +34,2,101709,1,9,4,6,0,2,0,0,0,40,0,0 +41,2,219591,1,9,0,0,3,0,0,0,0,40,0,0 +41,2,76625,1,9,1,10,1,0,0,0,0,40,0,0 +20,2,342599,5,10,0,2,3,0,0,0,0,35,0,0 +54,4,238257,0,13,0,3,0,0,0,0,0,50,0,0 +39,5,206253,0,13,1,3,2,0,1,0,0,40,0,0 +37,2,172571,1,9,2,8,0,0,0,0,0,40,0,0 +59,2,95165,8,16,1,5,1,0,0,0,0,40,0,0 +69,2,141181,11,3,1,0,1,0,0,1797,0,40,0,0 +24,2,267843,0,13,0,3,3,1,1,0,0,35,0,0 +36,2,181382,9,11,1,8,1,0,0,3103,0,40,0,1 +20,2,132320,5,10,4,10,0,0,0,0,0,40,0,0 +26,1,201138,9,11,0,4,0,0,1,0,0,35,0,0 +48,2,239058,14,8,6,2,4,0,1,0,0,50,0,0 +39,5,239755,10,15,1,3,1,0,0,0,1902,50,0,1 +21,2,176262,6,12,0,4,3,0,1,0,0,18,0,0 +22,2,264738,1,9,0,1,5,0,1,0,0,42,9,0 +34,2,182218,9,11,2,3,4,0,1,0,0,40,0,0 +33,2,318982,5,10,1,1,1,0,0,0,0,45,0,1 +46,2,216666,4,5,1,8,1,0,0,0,0,40,24,0 +47,2,274200,2,7,1,10,1,0,0,7298,0,40,0,1 +65,2,150095,0,13,1,1,1,0,0,0,0,40,0,1 +23,2,192978,1,9,1,2,1,0,0,0,0,40,0,0 +28,2,68021,5,10,0,4,0,0,1,0,0,30,0,0 +34,1,28568,1,9,2,1,0,0,0,0,0,60,0,1 +20,2,115057,5,10,0,4,0,0,0,0,0,40,0,0 +28,2,139568,2,7,0,0,0,0,0,0,0,40,0,0 +52,5,138497,0,13,1,1,1,0,0,0,0,60,0,0 +40,0,182460,3,14,1,3,2,2,1,0,0,38,26,1 +22,2,253310,0,13,0,1,3,0,1,0,0,7,0,0 +29,5,130856,1,9,1,1,1,0,0,0,0,45,0,0 +31,1,389765,7,4,1,3,1,0,0,0,0,60,0,0 +42,3,52781,3,14,1,3,1,0,0,0,1902,40,0,1 +38,2,146178,1,9,0,10,4,1,1,0,0,40,0,0 +22,2,231053,2,7,1,8,1,0,0,0,0,70,0,1 +43,2,483450,4,5,1,1,1,0,0,0,0,40,4,0 +43,5,198316,0,13,1,1,1,0,0,0,0,50,0,1 +33,2,160614,5,10,1,1,1,0,0,0,0,50,0,0 +17,5,325171,12,6,0,4,3,1,0,0,0,35,0,0 +54,1,172898,10,15,1,3,1,0,0,5178,0,50,0,1 +45,2,186473,1,9,2,0,4,0,1,0,0,40,0,0 +55,4,286967,12,6,1,10,1,0,0,0,0,45,0,0 +51,1,111939,1,9,1,6,1,0,0,0,0,35,0,1 +65,3,325089,12,6,2,10,4,0,0,0,0,40,0,0 +21,2,143582,0,13,0,3,3,2,1,0,0,45,0,0 +40,2,308027,1,9,6,4,4,1,1,0,0,40,0,0 +58,2,105060,5,10,0,0,0,1,1,0,0,37,0,0 +53,3,39643,1,9,6,1,0,0,1,0,0,58,0,0 +39,2,186191,3,14,1,3,1,0,0,0,1848,50,0,1 +56,4,267763,1,9,1,4,1,0,0,0,0,40,0,0 +37,2,124293,5,10,1,0,1,0,0,0,0,50,0,0 +44,2,36271,0,13,1,10,1,0,0,0,0,40,0,0 +49,2,143459,4,5,4,2,3,0,0,0,0,38,0,0 +36,2,186376,5,10,1,8,1,2,0,0,0,50,0,1 +59,5,52822,0,13,1,10,1,0,0,0,0,60,0,0 +33,2,104509,1,9,2,0,3,0,1,0,0,40,0,0 +36,2,184456,10,15,0,1,0,0,0,27828,0,50,0,1 +26,2,192302,5,10,1,1,2,0,1,0,0,25,0,0 +22,2,156822,12,6,0,5,0,0,1,0,1762,25,0,0 +25,2,214413,3,14,0,0,3,0,0,0,0,40,0,0 +28,2,108574,5,10,1,0,2,0,1,0,0,15,0,0 +41,2,223934,6,12,2,0,4,0,1,0,0,38,0,0 +45,2,200559,9,11,1,7,1,0,0,0,0,70,0,0 +43,2,137722,1,9,1,2,1,0,0,0,0,40,0,0 +30,2,261677,4,5,0,2,4,1,0,0,0,40,0,0 +33,2,136331,1,9,3,10,4,0,0,0,0,50,0,0 +34,2,329993,5,10,1,0,1,0,0,0,0,40,0,0 +21,2,91819,9,11,0,4,0,0,0,0,0,30,0,0 +31,2,201122,0,13,1,5,1,0,0,0,1902,45,0,1 +48,2,315423,11,3,1,6,1,0,0,0,0,40,0,0 +22,2,103277,5,10,0,0,3,0,1,0,0,20,0,0 +47,2,236805,5,10,2,5,4,0,1,0,0,60,0,0 +27,2,74883,0,13,0,9,0,2,1,0,0,40,11,0 +18,2,115443,2,7,0,2,0,0,0,0,0,25,0,0 +43,2,150528,3,14,1,3,1,0,0,0,0,40,0,1 +36,2,43701,5,10,6,5,0,0,1,0,0,20,0,0 +37,3,419053,1,9,2,10,0,0,0,0,0,40,0,0 +24,2,183594,9,11,0,10,3,0,0,0,0,20,0,0 +24,2,390348,1,9,0,6,0,0,0,0,0,40,0,0 +38,2,36989,0,13,1,4,1,0,0,3908,0,70,0,0 +48,2,247895,0,13,1,1,1,1,0,0,0,40,0,1 +75,2,191446,15,2,1,4,5,1,1,0,0,16,0,0 +43,1,33521,0,13,2,3,0,0,0,0,0,70,0,1 +64,2,46087,0,13,2,1,0,0,1,0,0,50,0,0 +36,2,356824,1,9,2,5,0,0,1,0,0,40,0,0 +53,2,158746,5,10,1,9,1,0,0,0,0,40,0,0 +22,2,153323,5,10,0,3,0,1,0,0,0,20,0,0 +73,1,130391,1,9,0,4,0,0,1,0,0,36,0,0 +46,2,173613,1,9,2,0,0,0,1,0,0,40,0,0 +45,2,362883,1,9,1,10,1,0,0,5013,0,40,0,0 +43,2,182757,1,9,1,10,1,0,0,0,0,40,0,1 +20,2,50397,1,9,0,0,3,1,0,0,0,20,0,0 +43,3,101709,5,10,2,2,0,2,0,0,0,40,0,0 +40,2,145649,1,9,4,5,4,1,1,0,0,25,0,0 +36,2,136343,0,13,1,3,1,0,0,0,0,40,0,1 +64,5,142166,0,13,2,5,0,0,0,0,0,45,0,0 +46,2,127089,5,10,1,3,1,0,0,5178,0,38,0,1 +46,4,124071,3,14,2,1,4,0,1,0,0,65,0,1 +41,4,190368,0,13,0,3,0,0,1,0,0,70,0,0 +28,2,67661,5,10,0,0,5,0,1,0,0,40,0,0 +23,2,62278,5,10,1,5,1,0,0,0,0,45,0,0 +30,3,295010,0,13,0,11,0,0,1,0,0,60,0,1 +44,2,203897,0,13,3,0,0,0,1,0,0,40,1,0 +27,2,265314,1,9,1,6,1,0,0,0,0,45,0,1 +25,2,159603,1,9,0,4,4,0,1,0,0,34,0,0 +29,2,134331,12,6,1,10,1,0,0,0,0,40,0,0 +54,2,123011,1,9,1,8,1,0,0,0,0,40,12,1 +27,2,274964,0,13,0,7,0,0,0,0,0,65,0,0 +34,2,66309,1,9,1,10,1,0,0,0,0,35,0,0 +38,2,73471,5,10,1,5,1,0,0,0,0,50,0,0 +56,2,357118,3,14,1,3,2,0,1,0,0,40,0,1 +35,5,184655,1,9,1,5,1,0,0,0,0,62,0,0 +23,2,175266,5,10,0,10,0,0,0,0,0,40,0,0 +19,2,188008,5,10,0,5,3,1,1,0,0,20,0,0 +42,2,87284,10,15,1,3,1,0,0,7298,0,35,0,1 +46,2,330087,0,13,1,1,1,0,0,15024,0,45,0,1 +27,2,150025,1,9,0,5,0,0,0,0,0,40,5,0 +49,5,330874,5,10,1,5,1,0,0,0,0,70,0,1 +23,2,136824,5,10,0,4,3,0,0,0,0,20,0,0 +24,2,201179,1,9,0,4,3,0,0,0,0,40,0,0 +34,2,324654,1,9,0,8,3,2,0,0,0,40,26,0 +25,3,366207,1,9,0,6,3,0,0,0,0,40,0,0 +33,1,103860,5,10,1,10,1,0,0,0,0,50,0,0 +22,2,106700,6,12,0,0,3,0,1,0,0,27,0,0 +54,4,163557,1,9,0,0,0,0,1,0,0,30,0,0 +39,5,286261,3,14,0,3,0,0,1,0,0,40,0,0 +25,2,123083,0,13,0,3,0,0,1,0,0,40,0,0 +75,5,125197,1,9,1,0,1,0,0,0,0,26,0,0 +28,1,278073,1,9,0,8,5,1,0,0,0,30,0,0 +50,2,133963,0,13,2,5,0,0,1,0,0,50,0,0 +62,1,71467,0,13,1,10,1,0,0,0,0,55,0,1 +40,2,76487,1,9,1,8,1,0,0,0,0,40,0,0 +58,4,215245,0,13,0,3,0,0,1,0,0,37,0,0 +24,3,127185,6,12,1,1,2,0,1,0,0,40,0,0 +21,2,179720,1,9,0,4,5,0,1,0,0,30,0,0 +40,2,88909,0,13,1,1,1,0,0,15024,0,50,0,1 +45,2,341995,9,11,1,3,1,0,0,0,1902,42,0,1 +48,2,173938,1,9,1,1,1,0,0,0,0,60,0,0 +34,2,344275,1,9,0,6,0,0,0,0,0,70,0,0 +23,2,150463,1,9,0,13,4,4,1,0,0,40,24,0 +43,4,209544,3,14,0,1,0,0,1,10520,0,50,0,1 +42,4,201723,5,10,0,10,0,0,0,0,0,40,0,0 +39,1,343476,0,13,1,3,1,0,0,15024,0,50,28,1 +52,5,77392,1,9,1,7,1,0,0,0,0,60,0,0 +56,1,357118,0,13,0,1,0,0,1,0,0,60,0,0 +48,3,167749,1,9,1,0,2,0,1,0,0,40,0,1 +37,1,352882,1,9,2,1,0,2,1,0,0,70,27,1 +25,2,51201,1,9,1,10,1,0,0,0,0,35,0,0 +40,2,365986,0,13,1,2,3,0,0,0,0,40,0,1 +34,2,400416,2,7,0,8,3,1,0,0,0,45,0,0 +52,2,31533,1,9,2,4,0,0,0,0,0,40,0,0 +41,2,106900,0,13,1,9,1,0,0,0,1902,42,0,1 +36,4,192337,1,9,0,4,0,0,0,0,0,40,0,0 +21,2,118712,9,11,0,10,3,0,0,0,1504,40,0,0 +28,2,301654,0,13,0,3,0,0,1,0,0,40,0,0 +20,2,88126,5,10,0,0,3,0,0,0,0,9,7,0 +68,2,165017,1,9,1,3,1,0,0,0,0,40,25,1 +35,2,238342,1,9,1,6,1,0,0,0,0,40,0,0 +32,2,857532,1,9,0,8,3,1,0,0,0,40,0,0 +64,2,134378,3,14,1,1,1,0,0,0,0,50,0,1 +17,2,260797,12,6,0,2,3,0,1,0,0,23,0,0 +25,2,138765,0,13,0,3,0,0,0,0,0,20,0,0 +31,2,247444,9,11,1,8,1,0,0,0,0,40,13,0 +51,0,454063,8,16,1,1,1,0,0,7298,0,40,0,1 +67,2,180539,1,9,1,5,1,0,0,0,0,10,0,0 +42,2,397346,1,9,0,10,0,0,0,3325,0,40,0,0 +29,2,107160,1,9,0,4,0,0,0,0,0,40,0,0 +31,2,262024,1,9,1,8,1,1,0,0,0,40,0,0 +21,2,131230,1,9,1,10,1,0,0,0,0,37,0,0 +67,2,274451,12,6,1,6,1,0,0,0,0,16,0,0 +41,0,365986,1,9,2,11,0,0,0,0,0,40,0,1 +27,2,204515,0,13,0,9,0,0,1,0,0,36,0,0 +51,2,99316,14,8,2,6,4,0,0,0,0,50,0,0 +28,2,268726,1,9,1,10,1,0,0,0,0,46,0,0 +21,2,275395,5,10,0,10,3,0,0,0,0,40,0,0 +28,2,383322,9,11,1,8,1,0,0,0,0,40,0,1 +29,2,126822,1,9,1,4,1,0,0,0,0,35,0,0 +39,5,168355,1,9,1,1,1,0,0,0,0,70,0,0 +21,2,162667,0,13,0,0,0,0,0,0,0,40,13,0 +43,2,373403,9,11,1,10,1,0,0,0,0,40,0,0 +44,1,274562,1,9,0,10,0,0,0,14344,0,40,0,1 +28,2,249362,2,7,1,6,1,0,0,0,0,50,0,0 +31,2,111567,4,5,0,5,0,0,0,0,0,43,0,1 +27,2,145784,5,10,1,0,2,3,1,0,0,45,0,0 +34,0,209317,5,10,1,11,1,0,0,0,0,40,0,0 +25,2,259505,1,9,0,9,0,0,0,0,0,40,0,0 +34,2,345360,0,13,1,9,1,0,0,0,0,40,7,0 +43,4,198096,1,9,1,10,1,0,0,7688,0,40,0,1 +40,5,33126,3,14,1,10,1,0,0,0,0,50,0,0 +21,2,206354,1,9,0,4,4,1,1,0,0,35,0,0 +25,2,1484705,5,10,2,1,4,0,1,0,0,25,0,0 +21,2,26410,1,9,0,0,0,0,1,0,0,40,0,0 +19,1,220901,5,10,0,6,3,0,0,0,0,30,0,0 +49,5,44671,6,12,1,10,1,0,0,0,0,40,0,1 +20,2,38620,5,10,0,4,3,0,0,0,0,20,0,0 +36,2,89040,2,7,1,6,1,0,0,0,0,47,0,0 +32,2,370160,5,10,4,1,4,1,1,0,0,40,0,0 +23,2,208946,5,10,0,0,3,0,0,0,0,32,0,0 +21,2,131230,5,10,0,5,3,0,0,0,0,10,0,0 +25,2,60358,0,13,0,1,3,0,0,0,0,40,0,0 +24,2,209782,0,13,0,5,3,0,1,0,0,40,0,0 +22,2,351952,5,10,0,3,4,0,1,0,0,20,0,0 +26,2,142081,1,9,1,4,2,0,1,0,0,40,4,0 +22,2,164775,4,5,0,8,4,0,0,0,0,40,24,0 +41,4,47858,0,13,1,11,1,0,0,0,0,40,0,1 +18,2,404085,1,9,1,0,2,0,1,0,0,40,0,0 +24,2,218678,0,13,0,5,3,0,0,0,0,40,0,0 +38,2,184655,1,9,1,10,1,0,0,0,1740,48,0,0 +36,2,321760,0,13,0,0,0,0,1,0,0,17,0,0 +45,4,185399,3,14,2,3,3,0,1,0,0,55,0,0 +38,4,409200,5,10,1,9,1,0,0,0,0,40,0,1 +38,2,40077,1,9,1,10,1,0,0,0,0,50,0,1 +34,1,31740,1,9,0,7,0,0,0,0,0,40,0,0 +53,4,233722,6,12,0,0,0,1,0,0,0,40,0,0 +32,2,192039,9,11,1,3,2,0,1,0,0,40,0,1 +17,2,222618,2,7,0,5,3,1,1,0,0,30,0,0 +45,0,213646,0,13,1,1,1,0,0,7298,0,40,0,1 +31,4,194141,1,9,1,11,1,0,0,0,0,48,0,0 +47,0,80282,8,16,1,3,1,0,0,0,0,45,0,0 +27,2,166350,1,9,0,5,0,0,0,0,0,50,0,0 +61,3,60641,5,10,1,0,2,0,1,0,0,30,0,0 +33,2,124827,1,9,1,6,1,0,0,0,0,40,0,0 +67,2,105438,1,9,4,8,5,0,1,0,0,40,0,0 +38,2,85244,0,13,4,10,0,0,0,0,0,40,0,0 +25,2,120535,1,9,2,5,4,0,1,0,0,40,0,0 +33,4,269604,11,3,0,4,4,4,1,0,0,40,22,0 +27,2,247711,1,9,1,0,2,0,1,0,0,40,0,0 +45,2,380922,1,9,1,10,1,0,0,0,0,60,0,1 +24,2,281221,0,13,0,0,5,2,1,0,0,40,18,0 +23,2,269687,9,11,0,9,0,0,0,0,0,40,0,0 +48,2,181758,5,10,2,0,4,0,1,0,0,40,0,0 +61,3,136787,5,10,1,0,1,0,0,0,0,40,0,1 +22,2,107882,1,9,0,3,3,0,1,0,0,20,0,0 +34,2,172579,9,11,2,9,4,0,1,0,0,40,0,0 +32,2,29933,1,9,1,8,1,0,0,5178,0,40,0,1 +35,3,38905,5,10,2,0,0,0,1,0,0,50,0,0 +36,2,168826,12,6,0,10,0,0,0,0,0,40,0,0 +24,2,424034,1,9,0,1,4,0,0,0,0,40,0,0 +60,2,117509,4,5,1,10,1,0,0,0,0,40,0,0 +64,2,69525,1,9,2,10,4,0,0,0,0,20,0,0 +22,2,374116,1,9,0,5,4,0,1,0,0,35,0,0 +27,2,283913,11,3,0,13,0,0,1,0,0,65,7,0 +36,0,147258,5,10,2,6,0,0,0,0,0,60,0,0 +27,2,139903,1,9,0,5,4,1,1,0,0,30,0,0 +52,2,112959,5,10,6,5,0,0,1,0,0,40,0,0 +57,1,264148,1,9,1,7,1,0,0,0,0,45,0,0 +23,2,256211,5,10,0,0,0,2,0,0,0,24,36,0 +29,1,142519,1,9,1,8,1,0,0,0,0,40,0,0 +34,2,281852,1,9,0,6,0,1,0,0,0,80,0,0 +38,2,380543,1,9,0,4,4,1,1,0,0,30,0,0 +50,1,204402,1,9,1,7,1,0,0,0,0,84,0,1 +50,2,192203,2,7,1,6,1,0,0,0,0,40,0,0 +51,1,199005,0,13,1,1,2,0,1,0,0,40,0,1 +17,5,61838,12,6,0,10,3,0,0,0,0,40,0,0 +25,2,210095,2,7,3,2,0,0,1,0,0,40,4,0 +19,2,187352,1,9,1,10,1,0,0,0,0,40,0,0 +43,1,32451,1,9,1,10,1,0,0,0,0,40,0,0 +59,2,140569,5,10,4,5,0,0,0,14084,0,60,0,1 +39,2,87556,3,14,0,3,0,0,0,6849,0,40,0,0 +18,2,79443,4,5,0,8,3,0,0,0,0,40,4,0 +27,2,212622,3,14,0,1,3,0,1,0,0,40,0,0 +39,2,32650,9,11,0,7,0,0,0,0,0,60,0,0 +44,2,125461,0,13,1,5,1,0,0,0,0,40,0,1 +19,2,219867,1,9,0,0,5,0,1,0,0,35,0,0 +32,4,206609,1,9,0,4,3,0,0,0,0,40,0,0 +48,2,101299,1,9,1,10,1,0,0,0,0,40,0,1 +46,2,29437,6,12,1,5,1,0,0,0,0,50,0,0 +65,2,87164,2,7,6,5,5,0,1,0,0,20,0,0 +57,5,146103,0,13,1,3,1,0,0,0,0,45,0,1 +48,2,169324,1,9,0,4,4,1,1,0,0,32,19,0 +46,2,138370,7,4,1,4,1,2,0,0,1651,40,26,0 +27,2,29523,12,6,1,2,1,0,0,0,0,40,0,0 +29,4,383745,5,10,1,11,1,0,0,0,1485,40,0,1 +35,5,189404,5,10,1,5,1,0,0,0,1740,40,0,0 +29,1,267661,1,9,1,7,1,0,0,0,0,70,0,0 +30,4,182926,5,10,1,11,1,0,0,15024,0,40,0,1 +65,2,243858,1,9,6,4,0,0,1,0,0,15,0,0 +47,3,31339,5,10,1,0,1,0,0,0,0,40,0,0 +41,2,204682,1,9,2,10,4,0,0,2174,0,40,28,0 +17,2,73145,4,5,0,10,3,0,1,0,0,16,0,0 +38,4,218184,11,3,1,2,5,0,0,0,0,40,4,0 +38,4,223237,3,14,1,3,1,0,0,0,0,40,0,1 +39,1,93319,1,9,0,5,5,0,1,0,0,4,0,0 +52,2,187356,12,6,1,8,1,0,0,0,0,41,0,0 +46,1,220832,5,10,1,1,1,0,0,0,0,58,0,1 +22,2,211361,0,13,0,1,0,0,1,0,0,30,0,0 +56,2,134195,3,14,0,5,0,0,0,0,0,50,0,0 +37,1,218249,2,7,2,3,4,1,1,0,0,30,0,0 +59,2,70720,0,13,2,5,0,0,0,0,0,55,0,1 +19,1,342384,2,7,1,10,3,0,0,0,2129,55,0,0 +31,2,237317,4,5,0,10,0,4,0,0,0,45,0,0 +22,2,359759,5,10,0,5,0,2,0,0,0,20,11,0 +48,1,181758,8,16,0,3,4,0,1,0,0,60,0,1 +63,5,267101,0,13,1,1,1,0,0,0,0,60,0,0 +33,2,222221,1,9,1,1,1,0,0,7298,0,45,0,1 +53,2,55139,1,9,0,7,0,0,0,0,0,10,0,0 +39,2,101073,6,12,1,5,1,0,0,0,0,24,0,0 +59,2,69884,10,15,3,3,4,0,0,0,0,50,0,0 +45,2,201127,1,9,1,8,1,0,0,0,0,40,0,0 +39,2,164733,5,10,2,0,0,0,1,0,0,45,0,0 +60,0,129447,1,9,6,0,0,0,1,0,0,35,0,0 +38,2,32837,0,13,2,3,4,0,1,0,0,56,0,0 +31,2,200117,1,9,2,0,0,0,0,0,0,40,0,0 +61,1,219183,0,13,1,3,1,0,0,0,0,50,0,1 +26,2,272669,0,13,0,5,0,2,0,0,0,20,27,0 +60,5,336188,10,15,1,3,1,0,0,0,2415,80,0,1 +32,2,176185,5,10,2,1,5,0,0,0,0,60,0,0 +25,4,197728,0,13,0,1,0,0,1,0,0,20,0,0 +55,2,197399,3,14,1,1,1,0,0,99999,0,55,0,1 +66,2,86010,12,6,6,6,0,0,1,0,0,11,0,0 +31,2,228873,1,9,1,10,1,0,0,0,0,40,0,0 +58,5,112945,10,15,0,3,0,0,0,27828,0,40,0,1 +22,2,129172,5,10,0,4,3,0,0,0,0,16,0,0 +46,4,316205,0,13,1,1,1,1,0,0,0,40,0,1 +33,2,226629,5,10,1,4,2,0,1,0,0,35,0,0 +26,0,180886,3,14,1,3,1,0,0,0,0,30,0,0 +42,1,69333,0,13,1,7,1,0,0,0,0,50,0,0 +45,2,213620,1,9,0,4,3,0,1,0,0,40,0,0 +43,2,197397,5,10,1,3,2,4,1,0,0,6,5,0 +27,2,179915,0,13,0,1,3,0,1,0,0,99,0,0 +51,2,339905,1,9,1,5,1,0,0,7688,0,40,0,1 +42,2,112956,1,9,0,6,3,0,0,0,0,40,0,0 +43,1,421837,5,10,1,5,1,0,0,7298,0,50,4,1 +38,2,187999,0,13,1,9,1,0,0,0,0,45,0,1 +44,2,77313,1,9,2,0,4,0,1,0,0,40,0,0 +36,2,231948,1,9,1,10,1,0,0,0,0,64,0,1 +37,2,37109,1,9,1,4,2,2,1,0,0,60,11,0 +29,2,79387,0,13,0,1,0,0,0,0,0,50,0,1 +42,1,177937,0,13,3,1,0,0,0,0,0,45,12,0 +80,2,173488,5,10,6,0,0,0,1,0,0,20,0,0 +61,2,183355,2,7,1,6,1,0,0,0,0,40,0,0 +55,2,147989,5,10,1,10,1,0,0,5013,0,52,0,0 +20,2,289944,5,10,0,4,3,0,1,0,0,25,0,0 +23,2,62278,1,9,0,10,4,0,0,0,0,40,0,0 +48,3,110457,5,10,1,10,1,0,0,0,0,40,0,1 +24,2,295763,0,13,0,1,3,0,1,0,0,50,0,0 +71,0,100063,1,9,1,10,1,1,0,0,0,40,0,0 +49,2,194962,2,7,1,4,2,0,1,0,0,6,0,0 +39,3,227597,1,9,0,12,0,0,0,0,0,50,0,0 +22,2,117606,0,13,0,0,3,0,1,0,0,25,0,0 +67,3,44774,0,13,6,0,0,0,1,0,0,40,0,0 +18,2,177648,1,9,0,5,3,0,1,0,0,25,0,0 +38,2,172571,0,13,1,1,1,0,0,0,1848,54,0,1 +50,2,153931,1,9,2,0,0,0,1,0,0,40,0,0 +56,1,84774,6,12,1,7,2,0,1,0,0,40,0,0 +23,2,157127,5,10,0,4,0,0,1,0,0,20,0,0 +26,2,170786,5,10,1,6,1,0,0,0,0,40,0,0 +32,2,281030,1,9,1,8,1,0,0,0,0,40,0,0 +44,2,203761,0,13,0,3,3,0,0,10520,0,40,0,1 +27,2,167405,1,9,3,7,3,0,1,0,0,40,4,0 +40,4,188436,5,10,1,11,1,0,0,7298,0,40,0,1 +43,2,388849,6,12,1,2,1,0,0,0,0,60,0,0 +31,0,176998,5,10,1,10,1,0,0,0,0,35,0,1 +57,2,200316,5,10,1,10,1,0,0,0,0,40,0,1 +25,2,160300,0,13,0,1,0,0,0,0,0,35,0,0 +22,2,236684,9,11,0,4,3,1,1,0,0,36,0,0 +20,4,247794,9,11,0,0,3,0,1,0,0,35,0,0 +27,2,267325,1,9,1,5,2,0,1,3464,0,40,0,0 +39,2,279490,5,10,2,1,4,0,1,0,0,40,4,0 +27,0,280618,3,14,0,3,0,0,0,0,0,40,0,0 +41,4,248406,1,9,4,6,3,0,0,0,0,40,0,0 +31,4,226494,0,13,0,3,0,0,0,0,0,45,0,0 +41,2,220460,6,12,1,5,1,0,0,0,0,20,0,0 +25,2,108317,0,13,0,1,0,0,0,0,0,40,0,0 +29,0,147256,6,12,0,3,0,1,0,0,0,40,0,1 +22,2,110371,1,9,1,4,3,0,0,0,0,50,0,0 +62,2,114060,7,4,1,11,1,0,0,0,0,91,0,0 +29,3,31161,1,9,2,1,0,4,1,0,0,40,0,0 +44,2,105862,5,10,1,1,2,0,1,0,0,70,0,1 +32,2,402089,0,13,1,0,2,0,1,0,0,2,0,0 +20,2,137300,9,11,0,8,4,0,1,0,0,40,0,0 +65,0,326691,5,10,1,8,1,1,0,0,0,40,0,1 +24,2,275093,1,9,0,2,0,0,1,0,0,36,0,0 +37,1,112497,3,14,1,1,1,0,0,0,0,50,0,1 +43,4,174491,1,9,2,9,0,1,1,0,0,40,0,0 +38,1,114835,0,13,1,5,2,0,1,0,0,60,0,1 +28,2,137898,6,12,0,5,3,0,1,0,0,35,0,0 +33,2,153151,1,9,0,2,3,0,0,4416,0,40,0,0 +32,2,134886,1,9,1,0,2,0,1,0,0,40,0,1 +38,2,193815,3,14,1,1,1,0,0,0,0,45,0,1 +33,2,237833,5,10,2,9,0,0,1,0,0,40,0,0 +42,1,101593,0,13,1,1,1,0,0,0,0,60,0,1 +27,2,164924,1,9,0,10,0,0,0,0,0,40,0,0 +41,2,174201,1,9,2,2,4,0,0,0,0,40,0,0 +47,4,36169,3,14,1,3,1,0,0,0,0,60,0,1 +55,2,144071,2,7,1,1,1,0,0,0,0,45,0,0 +30,1,180859,5,10,0,10,3,0,0,0,0,8,0,0 +54,2,221915,5,10,6,10,4,0,1,0,0,50,0,0 +40,2,26892,0,13,1,0,1,0,0,0,0,40,0,1 +21,2,351084,1,9,0,0,0,0,1,0,0,40,0,0 +34,2,97306,0,13,2,10,4,0,1,0,0,25,0,0 +30,2,185027,0,13,1,3,1,0,0,0,0,40,0,1 +31,2,182539,5,10,0,0,0,0,1,0,0,45,0,0 +22,2,215395,1,9,0,6,0,0,0,0,0,37,0,0 +37,2,186434,1,9,1,4,1,1,0,0,0,40,0,1 +52,4,346668,3,14,0,3,3,0,1,0,0,40,0,0 +57,5,412952,5,10,1,3,1,0,0,0,0,40,0,0 +48,2,167009,5,10,2,0,0,0,1,0,0,48,0,0 +58,2,316000,1,9,1,1,1,0,0,0,0,40,0,1 +35,1,216256,4,5,1,10,1,0,0,0,0,50,0,0 +40,2,341835,1,9,0,1,0,0,1,0,0,45,0,0 +30,2,169841,1,9,2,5,0,0,1,0,0,25,0,0 +26,1,200681,1,9,1,1,1,0,0,0,0,40,31,0 +46,1,456956,1,9,1,3,1,0,0,0,0,60,0,0 +26,3,276075,5,10,1,0,1,1,0,0,0,40,0,0 +50,3,96657,0,13,2,3,4,1,1,0,0,40,0,0 +22,2,374313,1,9,1,6,1,0,0,0,0,50,0,1 +36,2,110998,3,14,6,9,4,2,1,0,0,40,3,0 +30,2,53285,1,9,1,5,1,0,0,0,0,52,0,1 +58,2,104613,6,12,1,1,1,0,0,0,0,50,0,1 +72,2,298070,9,11,4,4,4,0,1,6723,0,25,0,0 +19,2,318822,1,9,0,0,0,0,1,0,0,40,0,0 +29,2,375078,7,4,1,4,2,0,1,0,0,40,4,0 +30,2,210851,5,10,1,10,1,0,0,0,0,40,0,0 +47,1,213745,5,10,2,4,4,0,1,0,0,45,0,0 +51,2,204447,5,10,1,3,1,0,0,0,0,45,0,1 +26,2,318934,12,6,1,2,1,0,0,0,0,40,0,0 +24,2,237386,5,10,0,1,0,0,0,0,0,42,0,0 +44,2,182629,3,14,2,5,0,0,0,0,0,24,10,0 +43,2,144778,1,9,1,1,1,0,0,0,0,50,0,1 +35,2,117166,0,13,0,1,0,0,0,0,0,50,0,0 +51,2,237630,1,9,1,9,1,0,0,7298,0,50,0,1 +41,2,171550,1,9,1,1,1,0,0,0,0,40,0,1 +38,2,165302,5,10,2,0,4,4,1,0,0,40,0,0 +39,0,42186,1,9,1,0,2,2,1,3464,0,20,0,0 +54,2,284952,12,6,4,5,4,0,1,0,0,43,25,0 +62,2,96099,1,9,0,10,0,0,0,0,0,40,0,0 +45,2,198759,8,16,1,1,1,0,0,0,0,60,0,0 +30,2,227886,1,9,0,1,3,1,1,0,0,35,2,0 +32,2,391874,1,9,1,10,1,0,0,0,0,40,0,0 +23,1,184370,1,9,2,4,0,0,1,0,0,40,0,0 +84,4,135839,9,11,6,0,0,0,1,0,0,14,0,0 +46,2,194698,0,13,0,3,3,0,0,0,0,60,0,0 +67,4,342175,3,14,2,0,0,0,1,2009,0,40,0,0 +29,2,67218,0,13,1,3,1,0,0,0,0,40,0,1 +33,2,205152,9,11,0,1,0,0,0,0,0,55,0,1 +23,2,434467,5,10,1,9,1,0,0,0,0,42,0,0 +42,0,404573,10,15,2,3,4,0,1,0,0,40,0,0 +17,2,99462,2,7,0,4,3,3,1,0,0,20,0,0 +60,2,170310,11,3,1,6,1,0,0,0,0,40,0,0 +31,2,199883,14,8,2,6,3,0,0,0,0,40,0,0 +28,2,70034,7,4,0,0,3,0,0,0,0,40,20,0 +31,2,393357,4,5,1,2,1,1,0,0,0,48,0,0 +31,2,72630,0,13,0,1,0,0,0,14084,0,50,0,1 +61,2,223133,1,9,2,2,0,1,1,0,0,40,0,0 +43,0,345969,10,15,1,3,1,0,0,0,0,50,0,1 +40,0,195520,5,10,0,0,4,1,1,0,0,49,0,0 +39,2,257942,1,9,0,1,0,0,0,0,0,40,0,0 +37,4,269300,5,10,3,0,4,1,1,0,0,27,0,0 +47,2,137354,5,10,1,10,1,3,0,0,0,40,0,0 +45,3,232997,5,10,1,6,1,0,0,0,0,65,0,1 +30,2,77266,1,9,1,10,1,0,0,0,0,60,0,0 +30,1,164190,10,15,0,3,3,0,0,0,0,40,0,0 +49,2,153536,5,10,2,3,0,0,0,14084,0,44,0,1 +51,4,26832,1,9,1,10,1,0,0,0,0,40,0,1 +31,2,188096,0,13,0,3,0,0,1,0,0,72,0,1 +48,5,369522,0,13,1,1,2,0,1,0,0,25,0,1 +20,2,110998,5,10,0,0,3,2,1,0,0,30,0,0 +32,2,205152,1,9,1,1,1,0,0,3103,0,40,0,1 +19,2,358631,1,9,0,0,0,0,0,0,0,25,0,0 +50,2,185354,3,14,2,1,0,0,1,0,0,35,0,0 +33,2,336061,1,9,1,1,1,0,0,0,0,50,0,0 +49,2,149949,1,9,2,10,0,0,0,0,1876,40,0,0 +30,2,59496,5,10,1,6,1,0,0,0,0,40,0,0 +23,2,32950,0,13,0,5,0,0,0,0,0,40,0,0 +44,2,109912,8,16,1,1,2,0,1,15024,0,32,0,1 +24,2,199555,9,11,0,5,4,0,0,0,0,5,0,0 +28,2,91299,9,11,0,0,0,2,1,0,0,45,0,0 +56,2,99359,1,9,2,0,4,0,1,0,1617,40,0,0 +38,2,242559,1,9,0,0,0,0,1,0,0,38,0,0 +20,2,286391,5,10,0,0,3,0,1,2176,0,20,0,0 +82,2,132870,1,9,6,1,0,0,1,0,4356,18,0,0 +52,3,22428,0,13,1,11,1,0,0,0,0,60,0,1 +32,2,239150,5,10,0,10,0,1,0,0,0,40,0,0 +37,2,170563,9,11,4,3,4,0,1,0,0,32,0,0 +36,2,173542,0,13,1,3,1,0,0,0,0,40,0,1 +39,2,286026,0,13,1,0,1,0,0,0,0,40,0,1 +30,2,72887,1,9,1,10,3,2,0,3411,0,40,0,0 +49,4,163229,1,9,1,11,1,0,0,0,0,56,0,0 +40,4,165726,9,11,2,1,4,0,1,0,0,40,0,0 +42,2,70055,2,7,1,6,1,0,0,0,0,45,0,0 +35,2,184655,0,13,0,3,0,0,0,0,0,40,0,0 +39,2,139906,1,9,2,4,4,0,1,0,0,81,0,0 +32,4,198211,9,11,3,10,0,0,0,0,0,40,0,0 +22,2,146540,2,7,0,10,0,0,0,0,0,50,0,0 +53,4,132304,5,10,2,0,0,0,1,0,0,40,0,0 +25,2,190916,1,9,0,0,0,0,0,0,0,40,0,0 +44,2,755858,1,9,1,10,1,0,0,0,0,70,0,1 +52,2,127315,3,14,1,3,1,0,0,0,0,40,0,1 +42,0,304302,1,9,1,6,1,3,0,0,0,40,0,0 +34,2,184942,2,7,1,6,1,0,0,0,0,50,0,0 +27,2,267989,5,10,1,8,1,0,0,0,0,40,0,0 +37,2,188377,1,9,0,8,0,1,0,0,0,40,0,0 +39,0,221059,3,14,1,3,5,4,1,7688,0,38,0,1 +26,2,340787,1,9,1,3,1,0,0,0,0,40,0,0 +48,2,140782,3,14,1,1,2,0,1,0,1902,38,0,1 +57,2,169071,1,9,2,5,4,0,1,0,0,28,0,0 +36,1,151094,9,11,4,1,0,0,0,0,0,48,0,0 +27,2,122922,0,13,0,5,0,0,1,0,0,40,0,0 +17,2,151141,2,7,0,2,3,0,0,0,0,15,0,0 +30,2,136651,11,3,1,10,1,0,0,0,0,40,4,0 +37,2,177285,9,11,1,0,2,1,1,0,0,48,0,1 +31,4,128016,0,13,0,5,3,0,1,0,0,40,0,0 +23,2,200318,6,12,0,0,0,0,1,0,0,20,0,0 +32,2,250354,12,6,0,10,5,0,0,0,0,45,0,0 +58,2,191069,1,9,1,5,1,0,0,0,0,40,0,1 +31,2,27856,1,9,0,4,4,0,1,0,0,8,0,0 +44,2,523484,0,13,1,1,1,1,0,0,0,40,0,1 +39,3,257175,0,13,2,9,4,1,1,0,625,40,0,0 +59,2,174864,1,9,1,10,1,0,0,0,1485,45,0,1 +42,2,196029,0,13,1,6,1,0,0,0,0,48,0,1 +45,2,200471,1,9,1,0,1,0,0,0,0,35,0,0 +20,2,353195,1,9,0,10,0,0,0,0,0,35,0,0 +35,2,222868,1,9,1,0,1,0,0,0,0,40,0,0 +50,2,221791,6,12,1,9,1,1,0,0,0,40,0,0 +56,2,197114,1,9,0,2,3,0,0,0,0,28,0,0 +48,2,160220,9,11,1,5,1,0,0,0,0,40,0,1 +58,1,274917,3,14,6,4,0,0,1,0,0,15,0,0 +32,2,348460,9,11,1,10,1,0,0,0,0,50,0,0 +23,2,112683,5,10,0,5,3,0,1,0,0,12,0,0 +48,2,345831,1,9,2,8,0,0,0,0,0,40,0,0 +33,2,105370,1,9,2,11,0,0,0,0,0,70,0,0 +48,2,345006,0,13,0,3,0,0,1,0,0,45,4,0 +55,2,195329,1,9,6,4,0,0,1,2202,0,35,25,0 +40,4,108765,9,11,0,1,4,3,1,0,0,40,0,0 +50,2,138022,5,10,1,3,1,0,0,0,0,40,0,0 +52,1,175029,12,6,1,10,1,0,0,0,0,35,0,0 +19,2,189574,1,9,0,4,0,0,1,0,0,30,0,0 +55,1,141409,12,6,1,5,1,0,0,7688,0,50,0,1 +36,1,186035,10,15,1,5,1,0,0,0,0,30,0,1 +39,2,165235,0,13,4,3,4,2,1,0,0,40,11,1 +22,2,105043,5,10,0,0,4,0,1,0,0,40,0,0 +44,2,230684,0,13,1,1,1,0,0,7688,0,50,0,1 +34,2,345705,1,9,2,10,0,0,0,0,1408,38,0,0 +33,2,248584,5,10,1,4,1,0,0,0,0,50,0,0 +55,2,436861,3,14,2,3,0,0,1,14084,0,40,0,1 +35,2,200153,3,14,1,1,1,0,0,0,0,45,0,1 +50,2,398625,2,7,6,8,0,0,1,0,0,40,0,0 +43,2,114043,5,10,2,0,4,1,1,0,0,40,0,0 +29,2,169544,9,11,0,9,0,0,0,0,0,40,0,0 +56,2,343849,5,10,1,6,1,1,0,0,0,40,0,0 +33,2,162572,0,13,1,3,1,0,0,99999,0,40,0,1 +24,2,291578,1,9,1,5,1,0,0,0,0,50,0,0 +46,2,136162,9,11,2,5,4,0,1,0,0,40,0,0 +60,5,376133,1,9,1,0,2,0,1,15024,0,15,0,1 +48,5,302612,3,14,1,4,1,0,0,0,0,40,0,0 +65,4,240166,2,7,1,6,1,0,0,0,0,35,0,0 +29,2,193152,1,9,0,2,0,0,0,0,1408,40,0,0 +42,2,248094,1,9,1,6,1,0,0,0,1740,43,0,0 +44,2,119281,10,15,1,3,1,0,0,0,0,50,0,1 +73,1,300404,5,10,1,5,1,0,0,0,0,6,0,1 +21,2,82847,5,10,0,9,0,0,1,0,0,50,0,0 +32,5,161153,1,9,1,7,1,0,0,0,1902,55,0,1 +43,3,287008,3,14,1,11,1,0,0,0,0,35,0,1 +21,2,654141,1,9,0,10,0,1,0,0,0,32,0,0 +30,2,252646,5,10,4,6,0,0,0,0,0,20,0,0 +54,2,171924,0,13,1,9,1,0,0,0,0,48,0,0 +19,2,219742,5,10,0,4,3,0,1,0,0,15,0,0 +55,0,153788,5,10,1,0,2,0,1,0,0,37,0,0 +20,2,60639,5,10,0,5,3,0,1,0,0,28,0,0 +53,2,96062,0,13,1,1,1,0,0,0,0,40,34,0 +51,2,165614,3,14,0,3,0,0,0,0,0,55,0,1 +33,2,159888,1,9,1,6,1,0,0,0,0,40,0,0 +62,2,110586,5,10,6,13,4,0,1,0,0,40,0,0 +24,1,143062,1,9,0,4,3,0,0,0,0,30,0,0 +17,5,413557,4,5,0,5,3,0,1,0,0,40,0,0 +26,2,137658,5,10,0,0,0,0,1,0,0,45,0,0 +36,2,398931,1,9,2,10,0,0,0,0,0,40,0,0 +32,2,311764,12,6,1,1,2,0,1,0,0,35,0,0 +58,2,98725,8,16,1,3,1,0,0,0,0,50,0,1 +38,2,140854,0,13,1,9,1,0,0,0,0,40,0,1 +26,3,352768,1,9,2,0,3,0,1,0,0,40,0,0 +60,2,142494,5,10,1,1,1,0,0,15024,0,40,0,1 +27,2,210313,1,9,1,5,1,0,0,0,0,50,24,0 +38,2,194538,9,11,1,8,1,0,0,0,0,48,0,1 +37,5,26698,5,10,1,5,1,0,0,0,1485,44,0,1 +28,2,211032,5,10,0,0,3,0,0,0,0,40,0,0 +38,5,107909,0,13,1,5,1,0,0,0,0,40,0,1 +29,2,136077,1,9,1,5,1,0,0,0,0,60,0,1 +19,2,184737,1,9,0,4,3,0,1,0,1721,40,0,0 +28,2,214689,0,13,0,2,5,0,0,0,0,25,0,0 +40,1,93793,1,9,1,10,1,0,0,0,0,50,0,1 +26,2,247025,9,11,2,10,3,0,0,0,0,40,0,0 +43,2,284403,6,12,1,5,1,1,0,0,0,60,0,0 +29,2,221977,5,10,1,0,2,0,1,0,0,40,0,1 +25,3,339956,5,10,1,11,1,1,0,0,0,40,0,0 +29,2,161097,1,9,1,8,1,1,0,0,0,40,0,1 +60,2,223696,15,2,2,10,0,4,0,0,0,38,21,0 +31,2,234500,0,13,1,0,2,0,1,0,0,40,0,0 +51,4,97005,7,4,1,6,1,0,0,0,0,40,0,0 +18,2,242615,5,10,0,0,3,0,1,0,0,15,0,0 +36,2,174938,0,13,2,9,4,0,0,0,0,20,0,0 +35,2,160120,0,13,1,0,1,2,0,0,0,40,11,1 +48,2,193775,0,13,2,0,3,0,0,0,0,38,0,1 +78,1,59583,7,4,1,7,1,0,0,0,0,25,0,0 +72,2,157913,0,13,1,11,1,0,0,0,0,17,0,0 +24,2,308205,5,10,0,1,3,0,0,0,0,40,0,0 +36,2,201769,2,7,0,11,0,1,0,13550,0,40,0,1 +48,2,330470,5,10,1,2,1,0,0,0,0,30,0,0 +28,2,184078,1,9,2,0,0,0,1,0,0,40,0,0 +26,2,123384,3,14,0,4,3,0,1,0,0,40,0,0 +29,2,330132,0,13,0,5,0,0,1,0,0,60,0,0 +47,2,274720,11,3,1,4,1,1,0,0,0,40,2,0 +50,2,129673,0,13,2,1,0,0,1,0,0,50,0,1 +35,3,205584,11,3,0,10,0,0,0,0,0,40,4,0 +17,2,327127,2,7,0,6,3,0,0,0,0,20,0,0 +41,2,225892,5,10,1,10,1,0,0,0,0,48,0,1 +37,2,224886,1,9,1,6,1,0,0,0,0,42,0,0 +35,4,27763,1,9,1,4,1,3,0,0,0,40,0,0 +56,2,73684,7,4,1,10,1,0,0,0,0,40,20,0 +23,2,107452,5,10,1,6,1,0,0,0,0,40,0,0 +33,2,23871,6,12,2,3,4,0,1,0,0,32,0,0 +79,5,309272,1,9,1,1,1,0,0,0,0,40,0,1 +28,2,469864,0,13,0,3,0,1,0,0,0,40,0,0 +55,2,286230,2,7,2,5,3,0,1,0,0,20,0,0 +59,0,186308,3,14,1,3,1,0,0,0,0,50,0,0 +22,2,113062,0,13,0,3,3,0,1,0,0,40,0,0 +19,2,86150,2,7,0,5,3,2,1,0,0,19,11,0 +41,2,262038,11,3,3,7,0,0,0,0,0,35,4,0 +32,2,279231,9,11,1,0,1,0,0,0,0,40,25,0 +45,2,183786,1,9,2,4,4,0,1,0,0,35,0,0 +61,2,339358,11,3,1,7,5,0,1,0,0,45,4,0 +34,2,287737,0,13,0,5,0,0,1,0,0,40,0,0 +43,1,99203,9,11,1,10,1,0,0,0,0,40,0,0 +38,2,297449,0,13,1,0,1,0,0,7298,0,50,0,1 +35,2,113481,8,16,1,3,1,0,0,0,0,60,0,0 +65,2,204042,1,9,2,11,0,0,0,0,0,20,0,0 +24,2,43387,0,13,1,1,1,0,0,0,0,55,7,1 +37,2,99233,1,9,1,0,1,0,0,0,0,40,0,0 +34,1,313729,5,10,1,7,1,0,0,0,0,50,0,0 +42,2,99679,1,9,1,6,1,0,0,0,0,60,0,1 +18,2,169745,7,4,0,4,3,0,1,0,0,40,0,0 +43,3,19914,5,10,6,1,4,3,1,0,0,15,0,0 +31,2,113543,5,10,1,4,1,0,0,0,0,40,0,1 +19,2,224241,5,10,0,5,3,0,1,0,0,20,0,0 +40,5,137367,5,10,1,1,1,2,0,0,0,50,26,0 +32,2,263908,0,13,1,3,1,0,0,0,0,40,0,0 +47,2,280798,5,10,1,1,1,0,0,0,0,40,0,1 +32,4,203849,5,10,1,6,1,0,0,0,0,40,0,0 +46,5,62546,8,16,4,3,0,0,0,0,0,35,0,0 +40,2,197344,0,13,1,1,1,0,0,0,0,65,0,1 +36,2,93225,0,13,0,10,0,0,0,0,0,35,0,0 +33,2,187560,9,11,1,5,1,0,0,0,0,36,0,0 +23,0,61743,11,3,0,6,0,0,0,0,0,35,0,0 +21,2,186648,12,6,4,8,3,0,0,0,0,40,0,0 +40,2,173321,1,9,1,4,2,1,1,0,0,32,0,0 +53,0,246820,8,16,1,3,1,0,0,0,0,50,0,1 +53,1,291755,5,10,1,6,1,0,0,0,0,72,0,0 +58,2,104945,4,5,1,2,1,1,0,0,0,60,0,0 +51,2,85423,1,9,1,5,1,0,0,0,0,55,0,1 +31,2,214235,1,9,1,4,1,0,0,0,0,65,0,0 +35,1,278632,1,9,1,10,1,0,0,0,0,40,0,0 +31,4,143392,5,10,2,0,0,0,1,0,0,35,0,0 +21,2,277408,5,10,0,4,4,0,1,0,0,35,0,0 +39,1,336793,3,14,1,10,1,0,0,0,0,55,0,1 +36,2,184112,10,15,1,3,2,0,1,15024,0,45,0,1 +51,2,74660,12,6,1,10,1,0,0,0,0,40,0,1 +18,2,395026,2,7,0,4,3,0,0,0,0,12,0,0 +32,2,171215,5,10,2,0,0,0,0,0,0,48,0,0 +56,2,121362,0,13,2,4,0,0,1,0,0,32,0,0 +35,2,409200,6,12,0,11,0,0,0,0,0,40,0,0 +63,2,268965,14,8,6,5,4,0,1,0,0,40,0,0 +61,2,136262,1,9,1,1,1,0,0,0,0,50,0,1 +23,2,141323,5,10,0,4,3,0,0,0,0,40,0,0 +52,4,108083,3,14,1,3,1,0,0,0,0,50,0,1 +19,2,82210,1,9,0,5,0,0,0,0,0,50,0,0 +33,0,400943,3,14,1,3,1,0,0,0,0,50,0,1 +35,2,308489,0,13,1,5,1,1,0,0,0,50,0,0 +35,2,187053,1,9,2,6,0,0,1,0,0,60,0,1 +38,2,75826,10,15,1,3,2,0,1,0,0,40,0,0 +23,2,413345,0,13,0,0,0,0,1,0,0,60,0,0 +22,2,356567,9,11,2,9,0,0,0,0,0,60,0,0 +20,2,223811,1,9,0,2,0,0,0,0,0,40,0,0 +19,2,159313,1,9,0,2,0,0,0,0,0,40,0,0 +47,2,250170,1,9,1,8,1,1,0,0,0,40,0,1 +59,2,135617,2,7,1,10,1,0,0,0,0,40,0,0 +38,2,187346,1,9,0,5,3,0,1,0,0,40,0,0 +36,2,108103,1,9,1,4,1,0,0,0,0,50,0,0 +27,2,255476,11,3,0,4,5,0,0,0,0,40,4,0 +24,2,68577,9,11,1,6,1,0,0,0,0,40,0,0 +35,2,155961,1,9,0,4,3,1,1,0,0,35,2,0 +22,0,264102,5,10,0,4,5,1,0,0,0,39,19,0 +37,2,167777,1,9,1,6,1,0,0,0,0,52,0,0 +36,2,225399,1,9,1,10,1,0,0,7298,0,40,0,1 +28,2,199998,1,9,4,4,0,0,1,0,0,25,0,0 +55,2,199856,1,9,1,5,2,0,1,0,0,50,0,0 +32,2,193042,0,13,1,5,1,0,0,0,0,44,0,0 +47,4,162595,5,10,3,10,5,0,0,0,0,45,0,0 +23,2,208826,0,13,0,4,0,0,1,0,0,40,0,0 +50,4,120190,3,14,2,3,0,0,1,0,0,45,0,0 +40,1,27242,1,9,1,7,1,0,0,0,0,84,0,0 +51,2,348099,1,9,0,8,0,0,1,0,1590,40,0,0 +34,2,185041,1,9,0,3,0,0,1,0,1669,45,0,0 +28,2,309196,0,13,0,11,0,0,1,0,0,40,0,0 +52,0,254285,8,16,1,3,1,0,0,0,1887,70,9,1 +39,5,336226,1,9,1,1,1,0,0,3103,0,60,0,1 +43,2,240698,0,13,1,0,1,0,0,0,0,40,0,1 +36,2,411797,0,13,0,3,3,0,1,0,0,35,0,1 +25,2,178843,0,13,0,3,3,0,1,0,0,15,0,0 +42,2,136177,5,10,2,0,4,0,1,0,0,38,0,0 +35,2,243409,5,10,1,6,1,0,0,0,0,40,9,0 +43,2,258049,3,14,1,1,1,0,0,7688,0,53,0,1 +34,2,164748,1,9,1,10,1,0,0,0,0,40,0,0 +50,0,24185,0,13,1,1,1,0,0,0,0,38,0,1 +30,2,167476,5,10,1,6,1,0,0,0,0,60,0,0 +44,2,106900,3,14,1,3,1,0,0,0,0,44,0,1 +52,2,53497,9,11,1,10,1,0,0,0,0,40,0,0 +35,2,335704,6,12,1,5,1,0,0,0,0,60,0,0 +36,2,211022,9,11,2,3,0,0,0,0,0,40,0,1 +30,2,163003,0,13,0,1,3,2,1,0,0,52,18,0 +36,5,77146,0,13,1,5,1,0,0,15024,0,45,0,1 +39,2,67433,0,13,0,1,0,0,1,0,0,40,0,0 +25,2,458549,15,2,1,7,1,0,0,0,0,96,4,0 +26,2,190469,0,13,0,9,0,0,0,0,0,40,0,0 +20,2,195411,1,9,0,5,3,1,1,0,0,20,0,0 +20,2,216889,5,10,0,11,3,0,0,0,0,40,0,0 +26,2,167350,1,9,0,6,3,0,0,0,0,50,0,0 +24,2,241857,5,10,0,0,0,1,1,0,0,35,0,0 +48,2,125892,0,13,1,9,1,0,0,0,0,40,0,1 +62,2,272209,1,9,2,13,4,1,1,0,0,99,0,0 +48,2,175221,1,9,1,8,1,0,0,0,0,40,0,0 +52,2,180195,0,13,1,5,1,0,0,0,0,40,0,1 +25,2,38090,0,13,0,5,0,0,0,0,0,44,0,0 +58,2,310085,11,3,1,8,1,0,0,0,0,40,0,0 +40,3,118686,0,13,0,3,0,0,1,0,0,45,0,0 +19,2,43937,5,10,0,4,5,0,1,0,0,20,0,0 +37,2,210438,2,7,0,2,0,1,0,0,0,40,0,0 +23,2,176724,2,7,1,8,1,0,0,0,0,40,5,0 +31,1,113364,1,9,2,10,0,0,0,0,0,60,0,0 +64,1,73986,7,4,1,10,1,0,0,0,0,20,0,0 +28,4,197932,5,10,0,0,3,0,1,0,0,16,0,0 +32,2,193285,1,9,0,10,3,0,0,0,0,40,0,0 +49,4,223342,5,10,2,0,0,0,1,0,0,44,0,0 +35,2,49749,5,10,2,0,0,0,1,0,0,40,0,1 +45,2,201865,8,16,1,1,1,0,0,0,0,45,0,1 +39,2,322143,14,8,1,6,1,0,0,15024,0,70,0,1 +46,1,275625,0,13,2,4,4,2,1,0,0,60,27,1 +19,2,206599,5,10,0,0,3,0,1,0,0,16,0,0 +29,2,89813,1,9,1,8,2,0,1,0,0,40,32,0 +25,0,156848,1,9,1,11,3,0,0,0,0,35,0,0 +37,2,162494,0,13,0,0,0,0,1,0,0,40,0,0 +30,2,205407,1,9,0,0,4,0,0,0,0,40,0,0 +28,2,375313,1,9,1,8,1,2,0,0,0,40,11,0 +36,3,930948,5,10,4,0,4,1,1,6497,0,56,0,0 +32,2,127895,5,10,0,1,4,1,1,0,0,35,0,0 +34,2,248754,2,7,0,8,0,0,0,0,0,40,0,0 +34,2,188096,1,9,0,0,0,0,1,0,0,36,0,0 +20,2,216811,5,10,0,5,3,0,1,0,0,40,0,0 +27,5,113870,3,14,0,6,3,0,0,0,0,40,0,0 +36,3,343052,1,9,1,0,2,0,1,0,0,40,0,0 +35,2,280966,5,10,1,5,1,0,0,0,0,40,0,0 +37,2,42044,1,9,2,1,0,0,0,0,0,35,0,0 +32,2,309513,1,9,1,10,1,0,0,0,0,50,0,0 +32,2,163604,3,14,0,3,0,0,1,0,0,20,0,0 +52,2,224198,1,9,2,5,0,0,1,0,0,48,0,0 +50,2,338283,5,10,1,10,1,0,0,0,0,40,0,1 +23,2,242375,1,9,0,4,0,0,1,0,0,30,0,0 +25,2,81286,1,9,1,10,1,0,0,0,0,45,0,0 +21,2,243368,13,1,0,7,0,0,0,0,0,50,4,0 +31,2,217803,1,9,2,5,0,0,1,0,0,32,0,0 +31,1,323020,5,10,1,4,2,0,1,0,0,30,0,0 +41,2,34278,9,11,4,4,0,0,0,0,0,40,0,0 +47,2,184579,5,10,1,9,1,0,0,0,0,60,0,0 +20,2,142673,5,10,0,0,0,0,1,0,0,45,0,0 +29,2,131714,12,6,2,8,0,1,1,0,0,25,0,0 +51,4,74784,5,10,6,0,0,0,1,0,0,40,0,0 +30,4,181372,0,13,1,3,2,0,1,0,0,33,0,1 +48,2,155664,0,13,1,0,1,0,0,0,0,35,0,1 +39,2,174924,1,9,4,1,0,0,0,14344,0,40,0,1 +62,2,113440,0,13,1,5,1,0,0,0,0,35,0,0 +22,2,147227,0,13,0,4,0,0,0,0,0,30,0,0 +46,3,207022,0,13,1,1,1,0,0,7688,0,40,0,1 +51,4,123011,3,14,1,3,1,0,0,0,1977,35,0,1 +20,2,184678,1,9,0,5,0,0,1,0,0,32,0,0 +40,5,182437,6,12,1,5,1,0,0,15024,0,50,0,1 +31,2,98639,0,13,0,9,0,0,0,0,0,40,0,0 +30,2,174201,5,10,0,10,3,0,0,0,0,40,0,0 +52,2,123780,1,9,1,0,2,0,1,0,0,38,0,0 +20,2,374116,1,9,0,3,5,0,1,0,0,40,0,0 +37,4,212005,9,11,1,1,1,0,0,0,0,40,0,1 +65,2,123965,0,13,6,4,0,0,1,0,0,40,0,0 +40,2,242619,0,13,0,3,0,0,0,4650,0,40,0,0 +60,4,138502,0,13,1,11,1,0,0,7298,0,48,0,1 +27,2,113635,1,9,0,10,0,0,0,0,0,35,38,0 +62,2,664366,0,13,1,5,1,0,0,0,0,60,0,1 +53,2,218311,1,9,2,5,0,0,1,0,0,35,0,0 +38,2,278557,0,13,1,5,1,0,0,0,0,50,0,1 +49,2,314773,9,11,1,3,1,0,0,0,0,40,0,0 +21,2,194861,1,9,0,8,3,0,0,0,0,40,0,0 +18,2,400616,5,10,0,0,3,0,0,0,0,40,0,0 +25,2,208117,0,13,0,3,5,0,0,0,0,40,0,0 +36,2,184498,2,7,1,10,1,0,0,0,0,40,0,0 +52,2,117674,1,9,1,1,1,0,0,0,0,55,0,1 +19,2,162621,5,10,0,9,3,0,0,0,0,14,0,0 +23,2,368739,0,13,0,0,0,0,1,0,0,40,0,0 +63,1,196994,0,13,1,5,1,0,0,0,0,15,0,0 +63,1,420629,9,11,1,4,1,0,0,0,0,45,0,0 +62,5,245491,0,13,2,5,0,0,0,99999,0,40,0,1 +51,1,276456,6,12,1,5,1,0,0,3103,0,30,0,1 +76,4,169133,5,10,6,0,0,0,1,0,0,30,0,0 +50,2,99307,1,9,1,10,1,0,0,5013,0,45,0,0 +45,5,120131,1,9,1,10,1,0,0,0,0,50,0,1 +44,5,456236,5,10,2,5,3,0,0,0,0,45,0,1 +51,2,107123,7,4,1,6,1,1,0,0,0,40,0,0 +42,4,125461,0,13,0,1,3,0,0,4650,0,35,0,0 +43,4,36924,3,14,1,3,1,0,0,0,0,40,0,1 +53,2,167065,2,7,1,8,1,0,0,0,0,40,0,0 +29,2,53642,9,11,1,0,1,0,0,0,0,40,0,0 +41,2,154668,5,10,1,3,1,0,0,0,0,40,0,0 +44,3,102238,1,9,2,10,4,0,0,0,0,40,0,0 +35,2,54595,12,6,6,4,0,1,1,0,1980,40,0,0 +27,2,152951,1,9,1,10,1,0,0,0,0,40,0,0 +35,2,257042,5,10,1,3,1,0,0,0,0,50,0,0 +60,2,74243,9,11,6,10,0,0,1,0,0,30,0,0 +49,2,149049,5,10,2,1,0,0,0,14344,0,45,0,1 +33,2,117186,0,13,1,1,1,0,0,0,0,45,0,0 +35,2,178322,0,13,1,5,1,0,0,0,0,40,0,1 +31,0,286911,5,10,1,0,1,0,0,0,0,38,0,0 +54,2,203635,1,9,1,0,1,0,0,7298,0,60,0,1 +57,1,177271,8,16,1,3,1,0,0,0,0,35,0,0 +30,2,149427,4,5,0,10,3,0,0,0,0,45,0,0 +45,2,101656,12,6,0,8,0,2,0,0,0,40,36,0 +41,2,274363,5,10,1,8,1,0,0,7298,0,42,0,1 +25,2,241025,0,13,0,4,3,0,0,0,0,18,0,0 +51,5,338836,5,10,1,1,1,0,0,0,0,40,0,1 +42,2,210534,11,3,4,0,5,0,0,0,0,40,22,0 +28,2,95725,9,11,0,2,0,0,0,0,0,45,0,0 +53,3,167410,0,13,2,9,0,3,0,0,0,40,0,0 +31,2,158162,0,13,0,1,0,0,1,13550,0,50,0,1 +46,2,241935,2,7,1,4,1,1,0,7688,0,40,0,1 +25,3,406955,1,9,0,0,5,0,1,0,0,40,0,0 +47,2,341762,1,9,1,8,1,0,0,0,0,40,0,0 +30,2,38848,1,9,1,6,1,0,0,0,0,40,0,0 +48,2,54744,1,9,1,10,1,0,0,0,0,40,0,0 +22,2,332194,5,10,0,4,3,1,0,0,0,40,0,0 +32,1,154950,5,10,1,10,1,0,0,0,0,30,0,0 +33,1,196342,8,16,0,3,0,0,0,0,0,45,0,1 +31,2,201292,1,9,1,4,1,0,0,0,0,40,0,0 +43,2,339767,5,10,1,4,2,0,1,0,0,20,7,1 +26,2,250066,9,11,0,4,0,0,1,0,0,40,0,0 +34,2,318886,1,9,1,7,1,1,0,0,0,40,0,0 +50,4,124076,0,13,1,3,2,0,1,0,0,40,0,1 +30,0,242122,1,9,4,0,4,1,1,0,0,40,0,0 +17,2,34019,2,7,0,4,3,0,0,0,0,20,0,0 +35,4,230754,3,14,0,3,3,1,1,0,0,40,0,0 +29,2,213842,5,10,1,10,1,0,0,0,0,40,0,0 +27,3,196386,6,12,1,0,1,0,0,4064,0,40,22,0 +34,2,134737,0,13,0,5,3,0,0,0,0,40,0,1 +32,2,515629,1,9,4,2,0,0,1,0,0,40,0,0 +47,3,119199,5,10,2,0,4,0,1,0,0,40,0,0 +40,2,90222,5,10,0,5,0,0,1,0,0,40,0,0 +26,2,28443,9,11,0,4,0,0,1,0,0,40,0,0 +30,2,159442,1,9,0,4,0,0,1,0,0,40,38,0 +54,2,315804,1,9,2,10,0,0,0,0,0,40,0,0 +53,2,135840,0,13,1,3,1,0,0,0,0,55,0,1 +43,2,118001,7,4,4,7,0,1,0,0,0,40,0,0 +25,2,207875,5,10,0,7,3,0,0,0,0,20,0,0 +39,2,164898,1,9,1,10,1,0,0,0,0,40,0,0 +57,4,170066,1,9,1,6,1,0,0,0,0,25,0,1 +47,2,111994,1,9,1,4,1,0,0,0,0,34,0,0 +45,2,166636,1,9,2,4,5,1,1,0,0,35,0,0 +24,0,61737,0,13,0,3,0,0,0,0,0,40,0,0 +32,1,241885,12,6,2,10,0,0,0,0,0,40,0,0 +25,2,234190,5,10,0,5,0,0,0,0,0,35,0,0 +57,2,230899,11,3,4,8,0,0,1,0,0,40,0,0 +28,2,114158,0,13,1,3,2,0,1,0,1977,24,0,1 +28,2,222442,1,9,1,5,1,0,0,0,0,51,1,0 +27,2,157612,0,13,0,3,0,0,1,0,0,55,0,0 +28,2,199903,0,13,0,0,0,0,1,0,0,20,0,0 +44,1,156687,1,9,1,7,1,2,0,0,0,42,28,0 +27,2,369522,1,9,0,8,3,0,0,0,0,45,0,0 +61,2,226297,0,13,1,1,1,0,0,0,0,40,0,0 +25,2,356017,2,7,0,4,0,0,0,0,0,99,0,0 +28,2,189257,4,5,0,2,3,1,1,0,0,24,0,0 +20,2,157541,5,10,0,10,3,0,0,0,0,40,0,0 +33,2,69251,9,11,0,5,3,2,0,0,0,40,11,0 +38,0,272944,1,9,2,4,0,0,0,0,0,40,0,0 +31,2,113667,1,9,0,5,4,1,1,0,0,25,0,0 +40,2,222011,3,14,0,3,0,0,1,0,0,45,0,1 +43,2,191196,5,10,1,1,1,0,0,0,0,55,0,1 +38,2,169104,3,14,1,1,1,0,0,0,0,60,0,1 +19,2,146679,5,10,0,1,3,1,0,0,0,30,0,0 +56,2,226985,6,12,1,4,1,0,0,0,0,50,0,0 +38,2,153066,3,14,2,1,0,0,0,0,0,45,0,1 +22,2,200109,1,9,1,13,2,0,1,4508,0,40,0,0 +18,0,109445,1,9,0,4,3,0,0,0,0,25,0,0 +68,2,99491,5,10,6,4,0,0,1,0,0,20,0,0 +35,2,172571,9,11,2,6,0,0,0,0,0,50,0,0 +32,2,207113,12,6,2,10,4,0,0,0,0,40,0,0 +43,3,192712,5,10,1,3,2,0,1,0,0,40,0,1 +30,2,154297,12,6,0,8,4,1,1,0,0,40,0,0 +62,2,238913,5,10,1,9,1,0,0,2829,0,24,0,0 +38,2,110402,9,11,1,8,1,0,0,0,0,40,0,0 +27,2,207213,1,9,0,2,3,0,0,0,0,40,0,0 +28,2,606111,8,16,0,3,0,0,1,0,0,60,9,1 +26,2,34112,9,11,0,4,0,0,0,0,0,40,0,0 +21,2,119156,5,10,0,8,3,0,0,0,0,20,0,0 +19,2,249787,1,9,0,4,5,1,0,0,0,40,0,0 +20,2,153516,5,10,0,0,3,0,0,0,0,30,0,0 +25,0,260754,0,13,0,11,0,1,0,0,0,40,0,0 +28,1,155621,5,10,0,10,3,0,0,0,0,50,13,0 +36,2,33983,9,11,0,0,0,0,0,0,0,42,0,1 +23,2,306601,0,13,0,10,0,3,0,0,0,40,4,0 +24,2,270075,0,13,1,0,2,0,1,0,0,50,0,0 +23,2,109430,1,9,0,4,0,0,1,0,0,40,0,0 +24,2,187115,0,13,0,3,3,0,1,0,0,20,0,0 +25,1,463667,1,9,0,4,0,0,0,0,0,8,0,0 +24,2,52262,1,9,0,8,0,0,0,0,0,40,0,0 +30,2,144064,1,9,1,1,1,0,0,0,0,62,0,0 +36,2,268620,5,10,1,1,2,0,1,0,0,33,0,0 +45,2,81132,1,9,1,4,1,2,0,0,0,40,11,0 +31,2,323069,6,12,2,5,4,0,1,0,880,45,0,0 +34,2,242984,1,9,0,0,0,0,0,0,0,48,0,0 +65,5,172684,0,13,1,1,1,0,0,0,0,44,4,1 +42,2,103932,9,11,2,3,4,0,1,0,0,40,0,0 +27,0,431637,10,15,0,3,0,0,0,0,0,70,0,0 +40,2,188942,5,10,1,5,2,1,1,0,0,40,5,0 +53,3,170354,5,10,1,0,1,0,0,0,0,40,0,1 +54,2,28518,1,9,1,5,1,0,0,0,0,50,0,1 +30,0,193380,0,13,0,3,5,0,0,0,0,35,0,0 +59,2,175942,1,9,1,6,1,0,0,0,0,45,0,1 +42,1,53956,1,9,2,1,4,0,0,0,0,55,0,0 +23,2,120773,1,9,0,0,0,0,1,0,0,40,0,0 +28,2,96219,0,13,1,4,2,0,1,0,0,15,0,0 +20,2,104164,1,9,0,2,3,0,0,0,0,40,0,0 +22,2,190429,5,10,0,5,0,0,1,0,0,20,0,0 +47,1,228660,5,10,1,10,1,0,0,0,1977,40,0,1 +44,2,368757,5,10,1,8,1,0,0,0,0,40,0,0 +40,2,220563,14,8,2,10,0,0,0,0,0,40,0,0 +37,2,233571,9,11,1,9,2,0,1,0,0,37,0,1 +39,2,187847,1,9,2,8,3,0,0,0,0,50,0,0 +49,2,84298,5,10,1,5,1,0,0,7688,0,40,0,1 +44,1,254303,5,10,2,4,0,0,0,0,0,45,0,0 +27,2,109611,4,5,1,8,2,0,1,0,0,37,20,0 +50,2,189183,1,9,1,0,1,0,0,0,0,40,0,0 +39,2,206951,0,13,1,3,1,0,0,0,0,40,0,1 +41,2,282882,1,9,0,5,4,1,1,0,0,40,0,0 +55,2,377061,0,13,1,11,1,0,0,0,0,40,0,1 +53,2,209906,15,2,1,4,1,1,0,0,0,35,5,0 +53,4,176059,3,14,2,3,4,0,1,0,0,50,0,0 +31,2,279015,3,14,1,1,1,0,0,0,2415,70,18,1 +21,2,347292,1,9,0,10,0,0,0,0,0,40,0,0 +30,2,277314,1,9,4,8,0,1,0,0,0,40,0,0 +53,2,341439,3,14,0,1,0,0,1,0,0,60,0,1 +47,2,209460,5,10,1,10,1,0,0,0,1485,47,0,0 +60,2,114263,0,13,2,1,0,0,1,0,0,40,39,1 +59,2,230899,4,5,4,8,4,0,1,0,0,40,4,0 +37,2,271767,0,13,0,1,0,0,0,0,0,48,0,1 +47,3,20956,0,13,1,10,1,0,0,0,1740,40,0,0 +49,2,39986,4,5,1,10,1,0,0,0,0,40,0,0 +73,4,45784,5,10,0,3,5,0,1,0,0,11,0,0 +58,2,126991,1,9,2,4,4,1,1,0,0,20,0,0 +35,2,207676,5,10,0,2,3,1,0,0,0,40,0,0 +24,0,413345,5,10,1,3,2,0,1,0,0,50,0,0 +62,2,122033,1,9,6,0,0,0,1,0,0,38,0,0 +58,2,169611,1,9,1,0,2,0,1,0,0,40,0,0 +51,2,90363,5,10,1,0,1,0,0,15024,0,40,0,1 +21,2,372636,1,9,0,5,3,1,0,0,0,40,0,0 +30,2,340917,0,13,1,10,1,0,0,0,0,40,0,0 +27,2,34273,9,11,0,3,0,0,1,0,1876,36,8,0 +25,2,161027,0,13,1,9,1,0,0,5178,0,40,0,1 +31,2,99844,1,9,0,10,0,3,0,0,0,45,0,0 +31,2,207685,1,9,0,4,4,1,1,0,0,34,0,0 +44,2,74680,5,10,1,10,1,0,0,5178,0,50,0,1 +52,5,334273,8,16,1,3,1,0,0,99999,0,65,0,1 +30,2,36069,6,12,1,5,1,0,0,0,0,40,0,0 +29,2,100563,1,9,0,6,3,1,0,0,0,40,0,0 +36,2,174308,2,7,2,6,0,0,0,0,0,40,0,0 +54,1,109413,0,13,1,7,1,0,0,0,0,50,0,0 +59,4,212600,5,10,4,11,0,0,0,0,0,40,0,1 +55,2,271710,5,10,0,0,0,0,0,0,0,45,0,0 +22,2,103277,6,12,0,0,3,0,1,0,0,20,0,0 +42,2,318947,1,9,2,8,0,0,1,0,0,40,0,0 +36,2,187167,6,12,1,5,2,0,1,0,0,40,0,0 +32,2,204742,0,13,1,3,1,0,0,0,0,40,0,1 +44,2,282062,7,4,1,10,1,0,0,0,0,40,0,0 +25,2,280093,2,7,3,2,0,0,0,0,0,40,4,0 +31,2,202729,1,9,1,6,1,0,0,0,0,50,0,0 +33,2,205950,1,9,0,4,3,0,0,0,0,40,0,0 +54,1,392286,6,12,1,5,1,0,0,0,0,50,0,1 +42,1,119207,1,9,0,1,0,0,0,0,0,48,0,0 +49,2,195554,1,9,1,6,1,0,0,0,0,44,0,0 +30,2,173005,1,9,1,0,1,0,0,0,0,44,0,0 +54,2,192862,1,9,2,1,4,0,1,0,0,45,0,0 +39,2,164712,5,10,0,6,4,0,0,0,0,40,0,0 +24,2,195808,5,10,0,8,3,0,0,0,0,40,0,0 +21,2,199444,1,9,0,0,3,0,1,0,0,44,0,0 +23,2,126346,4,5,0,4,4,1,1,0,0,30,0,0 +54,2,177675,1,9,2,0,4,0,1,0,0,42,0,0 +23,2,50341,3,14,0,5,0,0,1,0,0,20,0,0 +39,2,237943,1,9,2,8,4,0,0,0,1726,40,0,0 +23,2,126945,5,10,0,3,0,0,0,0,0,25,0,0 +41,2,267252,5,10,1,8,1,1,0,0,1902,40,0,1 +32,2,174704,2,7,0,4,0,1,0,0,0,40,0,0 +57,2,124771,1,9,1,10,1,0,0,0,0,40,0,0 +18,2,200603,1,9,0,0,5,0,1,0,0,30,0,0 +60,0,165827,8,16,1,3,1,0,0,7688,0,60,0,1 +21,2,301199,5,10,0,8,3,0,1,0,0,40,0,0 +53,2,215790,5,10,6,0,5,0,1,0,0,22,0,0 +38,2,87556,0,13,1,1,1,0,0,7688,0,55,0,1 +21,2,111467,5,10,0,2,0,0,0,0,0,40,0,0 +53,2,82646,8,16,2,1,0,0,1,0,0,55,0,1 +24,2,162282,1,9,0,10,0,0,0,0,0,40,0,0 +36,3,239074,6,12,1,4,1,0,0,0,0,40,0,0 +29,2,214925,3,14,0,1,0,1,0,0,0,60,0,0 +23,2,194247,5,10,0,5,0,0,0,0,0,40,0,0 +44,2,211531,5,10,1,1,1,0,0,0,0,50,0,0 +32,4,223267,3,14,1,3,1,0,0,0,0,48,0,0 +25,2,201635,0,13,0,1,0,0,1,0,0,50,0,0 +41,1,188738,1,9,2,10,4,0,0,0,0,27,0,0 +18,2,133055,1,9,0,4,3,0,1,0,0,30,0,0 +57,2,61761,5,10,1,10,1,0,0,0,1672,45,0,0 +62,2,103344,0,13,6,1,0,0,0,10520,0,50,0,1 +29,2,109814,0,13,0,2,3,0,0,0,0,40,0,0 +19,2,225294,1,9,0,4,3,1,1,0,0,40,0,0 +35,1,97277,10,15,1,3,1,0,0,0,0,65,0,1 +52,2,146711,0,13,1,3,1,0,0,0,0,50,0,1 +28,2,286452,12,6,0,8,4,0,1,0,0,40,0,0 +38,2,20308,1,9,0,4,3,0,0,0,0,40,0,0 +42,2,224203,5,10,6,5,4,1,1,0,0,40,0,0 +41,2,225978,0,13,0,3,0,1,0,0,0,40,0,0 +23,2,237720,0,13,0,3,0,0,0,0,0,38,0,0 +31,2,156743,3,14,1,5,1,0,0,0,0,76,0,1 +31,2,509364,11,3,0,8,0,0,0,0,0,45,4,0 +46,2,144351,3,14,1,3,1,0,0,0,0,40,0,1 +18,2,375515,2,7,0,5,3,0,1,0,0,20,0,0 +57,1,103529,3,14,1,9,1,0,0,0,0,38,0,1 +25,2,199472,9,11,0,0,0,0,1,0,0,38,0,0 +32,2,348152,3,14,1,1,1,0,0,0,0,40,0,1 +27,2,221166,4,5,0,7,3,0,0,0,0,40,0,0 +46,3,341762,0,13,1,3,1,0,0,7688,0,45,0,1 +43,0,159449,1,9,0,10,4,0,0,0,0,40,0,0 +56,1,110238,0,13,3,3,0,0,1,0,0,40,0,1 +19,2,458558,1,9,1,10,2,0,1,0,0,40,0,0 +20,3,340217,1,9,0,0,3,0,1,0,0,40,0,0 +42,2,155106,5,10,0,8,0,0,0,0,0,45,0,0 +90,2,90523,1,9,6,6,4,0,0,0,0,99,0,0 +25,2,122756,2,7,4,8,0,1,0,0,0,35,0,0 +27,2,293828,1,9,0,4,0,1,1,0,0,40,2,0 +48,2,299291,1,9,1,6,1,0,0,0,0,44,0,0 +48,3,483261,5,10,0,0,0,1,0,0,0,40,0,0 +27,2,122038,1,9,1,10,1,0,0,0,0,48,0,0 +46,2,160647,0,13,6,9,4,0,1,0,0,38,0,0 +32,2,106541,11,3,1,4,5,0,0,0,0,40,0,0 +22,2,126945,9,11,1,9,1,0,0,0,0,40,0,0 +24,2,188505,0,13,5,3,2,0,1,0,0,40,0,1 +31,2,377850,1,9,1,10,1,0,0,0,0,65,0,0 +20,2,193586,5,10,0,3,0,0,1,0,0,18,0,0 +28,1,315417,10,15,0,3,0,0,0,2176,0,40,0,0 +40,5,57233,1,9,1,1,1,0,0,0,0,60,0,1 +39,2,195253,1,9,1,8,1,0,0,0,0,40,0,1 +54,4,172991,1,9,1,6,1,0,0,0,0,40,0,0 +59,4,223215,5,10,1,11,1,0,0,0,0,42,0,0 +17,2,95799,2,7,0,5,3,0,1,0,0,18,0,0 +25,1,213385,5,10,0,10,3,0,0,0,0,80,0,0 +49,4,202467,1,9,1,11,1,0,0,0,0,40,0,1 +55,1,145574,1,9,2,1,0,0,0,34095,0,60,0,0 +39,2,147548,1,9,1,10,1,0,0,0,0,40,0,0 +67,2,105216,5,10,6,3,0,0,1,0,0,16,0,0 +28,2,77760,1,9,0,4,4,0,0,0,0,40,0,0 +35,2,167990,4,5,1,8,1,0,0,0,0,40,8,0 +44,2,167005,1,9,1,0,1,0,0,0,0,48,0,1 +51,2,108435,3,14,1,3,1,0,0,0,0,47,0,1 +55,2,56645,0,13,6,7,3,2,0,0,0,40,0,0 +45,4,304973,1,9,1,11,1,0,0,0,0,78,0,1 +32,2,42596,1,9,1,10,1,0,0,0,0,48,0,0 +45,2,220641,5,10,2,1,4,0,1,0,0,40,0,0 +45,2,101452,3,14,1,1,1,0,0,15024,0,60,7,1 +35,2,188888,0,13,0,5,0,0,0,0,0,40,0,1 +55,4,168790,1,9,1,6,1,0,0,0,0,44,0,0 +59,2,98361,5,10,1,10,1,0,0,0,0,40,0,1 +22,2,401762,1,9,0,0,0,0,1,0,0,55,0,0 +46,4,160187,3,14,6,1,4,1,1,0,0,35,0,0 +23,2,203715,1,9,0,7,3,0,0,0,0,40,0,0 +47,2,144351,0,13,1,1,1,0,0,0,0,45,0,1 +34,2,420749,1,9,1,10,1,0,0,0,0,30,9,0 +51,2,106151,2,7,2,6,3,0,0,0,0,40,0,0 +40,2,362482,9,11,1,5,1,0,0,0,0,50,0,0 +24,0,38151,5,10,0,0,3,0,0,0,0,12,0,0 +20,2,42706,5,10,0,7,0,0,0,0,0,72,0,0 +44,2,126199,5,10,2,6,4,0,0,1831,0,50,0,0 +26,2,165510,1,9,2,10,4,0,0,0,0,40,0,0 +35,4,216068,1,9,4,0,4,0,1,0,0,38,0,0 +23,2,215624,5,10,0,8,4,2,0,0,0,40,36,0 +40,2,239708,1,9,2,10,0,0,0,0,0,50,0,0 +49,4,199378,1,9,1,11,1,0,0,0,0,40,0,0 +32,2,230420,1,9,0,8,0,0,0,0,0,45,0,0 +28,2,395022,9,11,2,3,4,0,1,0,0,40,0,0 +51,2,338620,3,14,1,1,1,0,0,15024,0,60,0,1 +62,2,210142,9,11,1,1,1,0,0,0,0,50,0,1 +31,2,446358,5,10,1,8,1,0,0,0,0,40,4,0 +47,4,352614,6,12,1,11,1,0,0,0,0,40,0,1 +36,2,293528,9,11,0,9,0,0,1,0,0,3,0,0 +44,0,55395,1,9,0,10,0,0,0,0,0,40,0,0 +46,2,428405,0,13,1,1,1,0,0,0,0,40,0,1 +32,2,126838,1,9,0,10,0,0,0,0,0,40,0,0 +51,1,136836,6,12,2,6,4,1,1,0,0,30,0,0 +48,2,105838,0,13,1,1,1,0,0,0,0,45,0,1 +28,2,139903,0,13,0,8,4,1,1,0,0,40,0,0 +57,5,106103,5,10,1,9,1,0,0,0,0,60,0,1 +33,2,186824,9,11,1,5,1,0,0,0,0,40,0,0 +42,2,350387,1,9,4,8,0,0,0,0,0,15,0,0 +17,2,142912,12,6,0,4,3,0,0,0,0,40,0,0 +31,5,114937,0,13,1,1,1,0,0,0,0,55,0,1 +35,2,147258,5,10,0,8,0,0,0,0,1974,40,0,0 +20,2,451996,1,9,0,2,3,0,0,0,0,40,0,0 +36,2,149833,1,9,1,1,2,0,1,0,0,40,0,0 +24,2,211968,5,10,0,5,0,0,1,0,0,24,0,0 +33,2,287908,5,10,1,6,1,1,0,0,0,50,0,1 +36,2,166549,5,10,1,0,1,0,0,0,0,40,0,0 +31,2,25216,0,13,2,1,4,0,1,0,0,40,0,0 +29,2,286452,6,12,2,5,4,0,1,3418,0,40,0,0 +47,2,162034,0,13,1,5,1,0,0,0,0,60,0,1 +30,2,186932,8,16,1,3,1,0,0,5178,0,75,0,1 +34,2,82938,1,9,1,7,1,0,0,0,0,50,0,0 +23,2,122048,1,9,0,8,5,0,1,0,0,40,0,0 +33,2,118710,9,11,2,0,0,0,0,0,0,40,0,0 +59,2,243226,12,6,2,8,0,0,1,0,0,40,0,0 +67,1,268514,0,13,2,3,0,0,0,0,0,40,0,0 +26,2,365289,1,9,2,8,0,0,0,0,0,40,0,0 +27,2,165365,1,9,1,8,1,2,0,2885,0,40,17,0 +24,2,283757,0,13,0,0,3,0,0,0,0,39,0,0 +44,3,206553,9,11,2,9,0,0,0,0,0,40,0,0 +31,2,113364,1,9,1,10,1,0,0,0,0,40,0,1 +28,2,328949,10,15,1,3,1,0,0,0,0,60,0,0 +19,2,83930,1,9,0,4,3,0,1,0,0,20,0,0 +31,1,325355,0,13,1,1,2,0,1,0,1902,40,0,1 +20,2,131852,1,9,0,0,0,0,1,0,0,40,0,0 +64,2,119506,1,9,2,4,0,0,1,0,0,15,0,0 +47,0,100818,1,9,1,0,2,0,1,0,0,40,0,1 +36,2,162302,5,10,0,0,0,0,1,0,0,35,0,0 +48,2,182211,1,9,1,10,1,0,0,0,0,44,0,1 +19,1,194205,5,10,0,4,3,0,1,0,0,40,4,0 +22,2,141040,1,9,0,5,3,1,1,0,0,35,0,0 +56,2,346033,4,5,2,0,0,0,0,0,0,40,0,0 +22,2,177125,5,10,0,0,0,0,0,0,0,50,0,0 +37,2,241174,0,13,1,3,1,0,0,0,0,99,0,1 +57,4,130532,0,13,6,3,0,0,1,0,0,35,0,0 +38,2,168496,6,12,1,5,1,0,0,0,0,50,0,1 +34,2,362787,1,9,0,8,4,1,1,0,0,40,0,0 +38,3,48123,5,10,2,1,0,0,1,0,0,40,0,0 +30,5,173858,5,10,1,1,1,2,0,0,1902,40,27,1 +32,2,207201,0,13,0,3,0,0,0,0,0,45,0,1 +29,2,37933,14,8,3,4,0,1,1,0,0,40,0,0 +56,2,33323,1,9,1,8,1,0,0,0,0,40,0,0 +42,2,175943,9,11,1,1,2,0,1,7298,0,35,0,1 +71,4,229110,1,9,6,1,5,0,1,0,0,33,0,0 +20,2,113511,2,7,0,6,3,0,0,0,0,40,0,0 +25,2,333677,1,9,0,8,3,0,0,0,0,36,0,0 +61,2,115023,5,10,1,3,1,0,0,0,0,50,0,1 +24,0,133586,0,13,1,1,2,0,1,0,0,40,0,0 +51,2,91137,4,5,0,4,4,1,1,0,0,40,0,0 +27,2,105598,1,9,0,0,0,0,0,0,0,40,0,0 +41,2,352812,5,10,1,1,2,0,1,0,1902,40,0,1 +31,2,204829,1,9,2,8,0,0,0,0,0,40,0,0 +39,2,247733,1,9,2,13,4,1,1,0,0,16,0,0 +51,1,103257,10,15,1,3,1,0,0,0,0,40,0,0 +52,2,178915,1,9,0,1,4,0,1,0,0,40,0,0 +49,2,54260,0,13,1,3,1,0,0,0,0,40,0,1 +43,2,55395,5,10,1,10,1,0,0,0,0,40,0,0 +45,2,233511,0,13,1,1,1,0,0,0,1977,60,0,1 +49,2,318331,1,9,2,8,0,0,0,0,0,40,0,0 +19,2,195985,1,9,0,4,0,0,1,0,0,40,0,0 +44,1,38876,1,9,1,7,1,0,0,0,0,40,0,0 +67,5,81413,1,9,1,6,1,0,0,0,0,40,0,0 +58,2,172618,10,15,1,3,1,0,0,0,0,45,0,1 +36,2,174717,0,13,1,3,1,0,0,7688,0,40,0,1 +67,2,224984,1,9,6,0,0,0,1,15831,0,16,9,1 +61,2,423297,8,16,1,3,1,0,0,0,0,40,0,1 +55,4,88856,7,4,0,4,4,1,1,0,0,40,0,0 +35,3,39207,1,9,0,0,0,0,0,0,0,40,0,0 +35,2,340018,12,6,0,4,4,1,1,0,0,38,0,0 +20,0,30796,5,10,0,0,3,0,1,0,0,10,0,0 +51,2,155403,1,9,1,0,2,1,1,0,0,40,0,0 +23,2,238092,0,13,0,3,3,0,0,0,0,40,0,0 +39,2,225605,1,9,1,7,1,0,0,0,0,24,0,0 +36,2,289148,5,10,2,4,4,0,1,0,0,40,0,0 +47,2,339863,1,9,1,5,1,0,0,0,0,45,0,1 +27,2,178778,0,13,0,5,0,0,0,0,0,80,0,1 +29,2,568490,1,9,1,10,1,0,0,0,0,40,0,0 +21,0,129345,5,10,0,11,0,0,0,0,0,40,0,0 +18,2,447882,5,10,0,0,0,0,1,0,0,20,0,0 +24,2,314165,5,10,0,1,3,0,0,0,0,20,0,0 +39,3,382859,1,9,1,10,1,0,0,0,0,40,0,1 +51,0,82504,5,10,1,1,1,0,0,0,0,40,0,0 +47,2,149700,0,13,1,9,1,0,0,15024,0,40,0,1 +62,2,209844,5,10,2,0,4,0,1,0,0,30,0,0 +49,2,62546,0,13,1,1,1,0,0,0,0,40,0,1 +20,2,228686,2,7,1,4,1,0,0,0,0,40,0,0 +24,2,326587,5,10,0,5,0,0,0,0,0,40,0,0 +25,2,202091,1,9,0,1,3,0,1,0,0,40,0,0 +54,1,310774,0,13,1,5,1,0,0,0,0,40,0,0 +25,2,450246,1,9,0,10,3,0,0,0,0,40,0,0 +43,2,142444,5,10,2,5,4,0,1,0,0,55,0,1 +26,2,82246,0,13,0,1,0,0,0,0,1876,38,0,0 +24,2,192766,1,9,1,2,1,0,0,0,0,40,0,0 +18,2,53109,2,7,0,4,3,3,0,0,0,20,0,0 +45,1,298130,1,9,1,1,1,0,0,0,0,25,0,0 +26,2,135645,0,13,0,5,0,0,0,0,0,40,0,0 +47,2,265275,5,10,0,4,3,0,0,0,0,40,0,0 +21,6,232719,1,9,0,10,3,1,0,0,0,40,0,0 +29,2,167716,1,9,2,4,4,0,1,0,0,99,0,0 +68,2,107627,5,10,1,3,1,0,0,0,0,15,0,0 +21,2,129674,5,10,0,1,0,1,0,0,0,48,4,0 +28,5,114053,5,10,0,1,0,0,0,0,0,30,0,0 +46,2,202560,1,9,1,1,2,0,1,0,0,40,0,1 +35,2,219902,1,9,4,6,4,1,1,0,0,48,0,0 +50,1,192654,12,6,0,10,0,0,0,0,0,25,0,0 +48,5,238966,5,10,2,1,0,0,0,0,0,40,0,0 +59,2,153484,0,13,1,10,1,0,0,15024,0,50,0,1 +23,2,161874,5,10,0,1,3,1,0,0,0,40,0,0 +53,2,260106,1,9,6,5,0,0,1,0,0,30,0,0 +50,5,240374,3,14,1,5,1,0,0,0,0,40,0,1 +53,2,223696,14,8,3,2,0,4,0,0,0,56,21,0 +52,2,176134,1,9,1,8,1,1,0,0,0,48,0,0 +38,2,186959,0,13,1,3,1,0,0,0,0,50,0,0 +43,2,456236,3,14,1,1,1,0,0,0,0,50,0,1 +35,2,98948,0,13,1,4,2,0,1,0,0,32,0,0 +41,2,166662,10,15,1,1,1,0,0,0,0,50,0,1 +22,2,448626,5,10,0,5,3,0,0,0,0,40,0,0 +39,2,167482,1,9,1,4,1,0,0,0,0,60,0,1 +45,2,189792,3,14,1,5,1,0,0,0,0,40,0,1 +31,2,399052,4,5,1,7,2,0,1,0,0,42,0,0 +40,2,104196,0,13,1,3,1,0,0,0,1887,40,0,1 +47,1,152752,11,3,1,6,1,0,0,0,0,20,0,0 +53,2,268545,1,9,1,10,1,1,0,0,0,40,2,0 +53,5,148532,0,13,1,5,1,0,0,0,0,60,0,1 +33,4,281784,0,13,0,9,0,1,0,0,1564,52,0,1 +24,2,225724,0,13,0,0,3,0,1,0,0,20,0,0 +34,2,200192,5,10,0,4,0,0,1,0,0,40,0,0 +46,5,170850,1,9,1,5,1,0,0,0,0,50,0,1 +29,3,224858,5,10,1,11,1,0,0,0,0,60,0,0 +61,0,159908,2,7,6,4,4,0,1,0,0,32,0,1 +31,2,115488,1,9,1,7,1,0,0,0,0,40,0,0 +29,2,1268339,1,9,3,9,3,1,0,0,0,40,0,0 +42,2,195755,1,9,4,10,4,0,0,0,0,40,0,0 +50,3,186272,5,10,1,1,1,0,0,0,0,40,0,0 +34,2,181388,1,9,2,0,0,0,1,0,0,40,0,0 +39,2,177181,7,4,1,6,1,0,0,0,0,40,0,0 +74,2,91488,15,2,1,6,1,1,0,0,0,20,0,0 +40,2,230961,5,10,1,5,1,0,0,0,0,40,0,0 +75,1,309955,10,15,1,3,1,0,0,0,2174,50,0,1 +40,4,63042,0,13,1,3,2,0,1,0,0,40,0,1 +36,2,29814,2,7,1,10,1,0,0,0,0,40,0,0 +28,2,191088,0,13,1,1,2,0,1,0,0,40,0,1 +19,2,63814,5,10,0,0,0,0,1,0,0,18,0,0 +36,2,285865,6,12,4,4,4,1,1,0,0,32,0,0 +50,3,299831,5,10,2,0,4,0,1,0,880,40,0,0 +47,2,162741,6,12,1,3,2,1,1,15024,0,40,0,1 +48,2,204990,1,9,0,9,4,1,1,0,0,33,2,0 +60,5,171315,1,9,2,10,0,0,0,0,0,40,0,0 +30,2,296462,3,14,0,3,0,1,0,0,0,30,0,0 +32,2,103860,0,13,1,1,1,0,0,0,0,50,0,1 +45,4,159816,3,14,1,3,2,0,1,0,1977,35,0,1 +51,2,96586,5,10,1,9,1,0,0,0,0,40,0,1 +53,2,202720,4,5,3,8,4,1,0,0,0,75,19,0 +48,1,379883,3,14,1,1,1,0,0,0,0,40,4,1 +32,2,294121,6,12,2,8,0,0,1,0,0,50,0,0 +31,2,234387,1,9,2,1,4,1,1,0,0,40,0,0 +58,1,154537,0,13,2,4,0,0,1,0,0,20,0,0 +32,2,125856,6,12,1,1,1,0,0,0,0,60,0,1 +32,2,156015,0,13,0,3,0,0,0,0,0,40,0,0 +40,2,116632,0,13,2,5,3,0,0,0,0,80,0,0 +50,2,124963,0,13,1,1,1,0,0,99999,0,55,0,1 +38,1,115215,12,6,4,8,0,0,0,0,0,40,0,0 +30,2,254905,1,9,1,8,1,0,0,0,0,40,0,0 +21,2,195532,1,9,0,0,4,0,1,0,0,40,0,0 +28,2,190067,0,13,0,3,3,0,1,0,1564,40,0,1 +32,2,203674,6,12,2,3,4,0,1,0,880,36,0,0 +25,2,322585,1,9,0,5,0,0,0,0,0,45,0,0 +59,2,246262,5,10,1,9,1,0,0,0,0,40,0,1 +49,2,139268,5,10,0,10,3,0,0,0,0,40,0,0 +36,2,188540,0,13,0,1,0,0,0,0,0,40,0,0 +46,2,94809,5,10,2,13,4,0,1,0,0,30,0,0 +37,4,265038,10,15,1,3,1,0,0,0,0,60,0,1 +48,2,182566,0,13,1,5,1,1,0,0,0,40,0,1 +43,2,220109,5,10,1,4,1,0,0,0,1672,44,0,0 +41,2,208470,1,9,1,1,1,0,0,0,0,40,0,1 +54,2,28683,1,9,1,5,1,0,0,3464,0,40,0,0 +36,2,233571,5,10,2,1,0,0,1,0,0,4,0,0 +29,2,24562,0,13,2,4,4,4,1,0,0,40,0,0 +66,4,36364,1,9,1,10,1,0,0,0,2267,40,0,0 +59,2,168569,10,15,0,3,0,0,0,0,0,50,0,0 +62,2,167098,0,13,1,1,1,0,0,0,0,40,0,1 +29,2,271579,12,6,0,10,0,0,0,0,0,40,4,0 +28,2,191355,0,13,1,5,1,0,0,0,0,45,0,1 +27,2,31659,0,13,1,8,1,0,0,0,1887,60,0,1 +42,0,83411,1,9,1,1,1,0,0,0,0,40,0,1 +60,2,40856,9,11,1,10,1,0,0,0,0,46,0,1 +58,2,115605,3,14,1,3,1,0,0,0,0,50,0,1 +27,2,132326,5,10,1,10,1,0,0,0,0,40,0,0 +45,2,220213,1,9,6,10,0,0,1,0,0,40,0,0 +50,2,172511,5,10,1,10,1,0,0,0,0,40,0,1 +43,2,156745,5,10,1,10,1,1,0,0,0,40,0,0 +39,2,218916,10,15,2,1,0,0,0,0,0,50,0,0 +21,2,306114,5,10,0,0,3,0,0,0,0,20,0,0 +24,2,196675,1,9,1,2,1,1,0,0,0,70,0,0 +59,1,73411,10,15,1,7,1,0,0,0,0,30,0,0 +36,2,184659,1,9,1,8,1,0,0,0,0,40,0,1 +35,2,320451,3,14,1,1,1,2,0,0,0,65,37,1 +33,2,172498,5,10,2,2,3,0,0,0,0,40,0,0 +30,2,131588,1,9,0,10,0,1,1,0,0,45,0,0 +40,2,124520,9,11,2,10,4,0,0,0,0,50,0,1 +26,1,93806,5,10,1,5,1,0,0,0,0,55,0,0 +37,3,173192,9,11,4,0,0,1,0,0,0,40,0,0 +68,1,198554,5,10,2,6,0,0,1,0,0,20,0,0 +45,2,26502,0,13,1,10,1,0,0,0,0,72,0,1 +56,2,225267,1,9,1,3,1,0,0,0,0,40,0,0 +36,2,150042,1,9,0,0,3,0,1,0,0,40,0,0 +50,2,211319,0,13,1,1,1,0,0,7298,0,50,0,1 +38,2,208358,9,11,1,5,1,0,0,0,0,40,0,0 +29,2,58115,0,13,1,5,1,0,0,0,0,41,0,0 +28,2,219267,1,9,0,4,4,0,1,0,0,28,0,0 +39,3,129573,5,10,1,0,1,0,0,0,0,50,0,0 +26,4,27834,0,13,0,11,0,0,0,0,0,40,0,0 +52,5,415037,5,10,2,1,0,0,0,0,0,65,0,1 +52,2,191529,0,13,2,7,0,0,0,0,0,40,0,0 +84,2,132806,1,9,6,4,0,0,1,0,0,13,0,0 +33,3,137059,5,10,0,4,0,0,1,0,0,10,0,0 +46,3,102308,10,15,1,3,1,0,0,15024,0,50,0,1 +30,2,164309,1,9,0,5,0,0,1,0,0,35,0,0 +38,2,40955,0,13,1,3,1,0,0,0,0,40,7,1 +66,2,141085,1,9,6,13,0,0,1,0,0,8,0,0 +62,3,258124,3,14,1,0,1,0,0,0,0,40,25,1 +31,2,467579,0,13,1,1,1,1,0,0,1887,40,0,1 +31,2,145139,0,13,1,10,1,0,0,0,0,40,0,1 +39,2,231141,1,9,1,8,1,0,0,2829,0,40,0,0 +27,2,242207,0,13,0,9,3,0,1,0,0,40,0,0 +38,2,135416,5,10,2,0,3,0,1,0,0,40,0,0 +25,2,267284,1,9,0,2,5,0,0,0,0,40,0,0 +48,2,130812,1,9,1,1,2,0,1,0,0,40,0,0 +45,4,188823,3,14,1,3,1,0,0,0,0,50,0,1 +22,2,200593,5,10,0,5,3,0,0,0,0,40,0,0 +50,2,124094,1,9,1,10,1,0,0,0,0,40,12,0 +21,2,50411,1,9,0,7,0,0,0,0,0,40,0,0 +44,4,101689,5,10,2,0,4,0,1,0,0,40,0,0 +60,1,73091,1,9,4,4,0,1,0,0,1876,50,0,0 +51,2,176969,1,9,1,8,1,0,0,0,0,48,0,0 +30,2,342709,1,9,3,10,5,0,0,0,0,40,0,0 +46,1,368561,6,12,2,10,0,0,0,0,0,40,0,0 +43,2,26915,9,11,1,1,1,0,0,0,0,45,0,1 +57,2,157974,1,9,0,4,0,1,0,0,0,48,0,0 +48,2,109832,3,14,1,3,1,0,0,0,1902,40,0,1 +68,1,195881,1,9,1,7,1,0,0,2414,0,40,0,0 +33,2,183000,5,10,0,4,0,0,0,0,0,24,0,0 +22,6,302347,1,9,0,2,3,0,0,4416,0,40,0,0 +28,2,217200,1,9,0,8,0,0,0,0,0,50,0,0 +32,2,31740,3,14,1,3,1,2,0,0,0,40,3,0 +56,2,35520,1,9,2,10,0,0,0,0,0,42,0,0 +36,2,369843,1,9,1,4,1,0,0,0,0,50,0,0 +34,2,199227,5,10,1,1,1,0,0,0,0,55,0,0 +18,2,144711,1,9,0,5,0,0,1,0,1721,40,0,0 +39,2,382802,12,6,6,8,0,1,0,0,1590,40,0,0 +25,2,254781,0,13,0,1,0,0,1,0,0,40,0,0 +27,1,70657,5,10,0,10,0,0,0,0,0,35,0,0 +56,1,50791,3,14,2,5,0,0,0,0,1876,60,0,0 +33,1,222162,1,9,1,10,1,0,0,0,0,40,0,0 +49,5,94606,8,16,1,3,1,1,0,0,0,60,0,1 +44,1,104196,1,9,1,1,1,0,0,0,0,84,0,0 +30,1,455995,2,7,0,10,0,0,0,0,0,45,0,1 +27,2,166210,1,9,2,10,0,0,0,0,0,50,0,0 +25,2,198986,0,13,0,0,0,0,0,0,0,40,0,1 +30,5,292465,0,13,0,1,0,0,0,0,0,40,0,0 +38,2,99388,6,12,1,4,1,0,0,0,0,40,22,0 +38,2,698363,1,9,1,10,1,0,0,0,0,40,0,0 +46,2,154940,5,10,2,5,4,0,1,0,0,40,0,0 +37,2,401998,1,9,6,8,4,0,1,0,0,20,0,0 +62,2,162825,1,9,1,1,1,0,0,0,0,40,0,1 +55,1,271795,1,9,1,4,1,0,0,0,0,40,0,0 +47,1,134671,1,9,3,10,0,0,0,0,0,40,0,0 +45,2,87583,1,9,1,3,2,0,1,0,0,14,0,0 +50,2,248619,1,9,1,10,1,0,0,0,0,40,0,0 +36,2,130200,1,9,2,8,4,0,0,0,0,40,0,0 +45,2,178922,1,9,0,5,0,0,1,0,0,20,0,0 +23,2,51985,1,9,0,6,0,0,0,0,0,38,0,0 +37,2,125933,6,12,1,1,1,0,0,7688,0,50,0,1 +38,0,104280,8,16,1,3,1,0,0,0,0,55,0,1 +27,2,617860,5,10,0,2,3,1,0,0,0,40,0,0 +29,2,122112,0,13,1,5,2,0,1,0,0,50,0,0 +45,4,181758,3,14,0,3,0,0,1,0,0,40,0,0 +41,5,223671,1,9,1,5,1,0,0,0,1887,55,0,1 +38,1,140117,5,10,0,4,0,0,1,0,0,20,0,0 +27,2,107458,0,13,0,3,0,0,0,0,0,40,0,0 +44,3,306440,1,9,2,10,0,0,0,0,0,40,0,0 +33,3,615893,3,14,1,6,1,1,0,0,0,40,35,0 +28,5,201186,1,9,1,5,1,1,0,99999,0,40,0,1 +32,2,37210,0,13,1,1,1,0,0,0,0,45,0,1 +43,2,196084,3,14,1,3,1,0,0,0,0,55,0,0 +45,4,166181,1,9,2,4,3,1,1,0,0,40,0,0 +52,3,291096,6,12,1,4,1,0,0,7298,0,40,0,1 +24,2,232841,1,9,0,4,0,0,0,0,0,35,0,0 +47,2,408788,9,11,1,3,1,0,0,0,0,40,0,1 +53,5,42924,8,16,2,1,0,0,0,14084,0,50,0,1 +31,2,181091,0,13,1,5,1,0,0,0,0,40,0,1 +30,2,200246,9,11,0,10,0,0,0,0,0,40,0,0 +56,2,282023,1,9,1,0,1,0,0,0,0,40,0,0 +49,3,128990,0,13,1,3,1,0,0,0,0,40,0,1 +38,2,106838,1,9,1,6,1,0,0,0,0,40,0,0 +19,2,144750,5,10,0,0,3,0,0,0,0,18,0,0 +39,2,108140,9,11,1,10,1,0,0,0,0,40,0,0 +38,2,103323,1,9,1,1,1,0,0,0,0,40,0,0 +47,2,268022,1,9,1,6,1,0,0,0,0,55,0,1 +58,2,197114,2,7,1,10,1,0,0,0,0,40,0,0 +27,2,191628,1,9,0,6,0,1,0,2174,0,40,0,0 +59,4,176118,3,14,2,3,0,0,0,0,0,40,0,1 +24,2,42401,0,13,0,5,0,0,0,0,0,47,0,0 +42,2,322385,9,11,1,8,1,0,0,2407,0,40,0,0 +53,0,123011,3,14,1,1,1,0,0,0,0,60,0,1 +35,2,210945,1,9,1,2,1,0,0,0,0,50,0,0 +36,4,130620,1,9,1,0,2,2,1,0,0,40,26,1 +26,2,248990,1,9,1,10,1,0,0,0,0,40,4,0 +33,2,132705,4,5,4,0,0,0,0,0,0,48,0,0 +29,2,94892,5,10,1,3,1,0,0,0,0,40,0,0 +43,2,141858,2,7,1,2,1,0,0,0,0,40,0,0 +35,2,81232,0,13,1,5,1,0,0,15024,0,50,0,1 +48,2,114561,0,13,3,3,5,2,1,0,0,36,11,1 +45,4,191776,3,14,2,3,0,0,1,0,0,40,0,0 +43,2,128354,1,9,2,1,0,0,1,0,0,40,0,0 +27,2,37088,4,5,0,4,3,0,0,0,0,30,0,0 +21,2,414812,7,4,0,10,3,0,0,0,0,40,0,0 +39,2,33983,5,10,1,0,1,0,0,15024,0,40,0,1 +52,1,194995,0,13,1,5,1,0,0,15024,0,55,0,1 +41,5,73431,0,13,6,3,4,0,1,0,0,40,0,0 +48,2,155664,1,9,1,10,1,0,0,7688,0,70,0,1 +53,0,281074,1,9,2,1,0,0,0,0,1092,40,0,0 +33,4,248346,6,12,1,10,1,0,0,0,0,50,0,0 +37,2,167482,12,6,0,10,3,0,0,0,0,35,0,0 +43,3,211763,8,16,4,3,4,1,1,0,0,24,0,1 +20,2,122166,5,10,0,0,0,0,1,0,0,40,0,0 +47,2,370119,10,15,1,3,1,0,0,0,0,50,0,1 +36,1,138940,1,9,1,7,1,0,0,0,0,70,0,0 +41,2,174575,1,9,1,6,1,0,0,0,1887,45,0,1 +67,2,101132,7,4,1,10,1,0,0,1797,0,40,0,0 +38,2,292307,0,13,3,10,0,1,0,0,0,40,21,0 +47,1,248776,3,14,0,1,0,1,0,0,0,25,0,0 +39,2,314007,9,11,1,9,1,0,0,0,0,40,0,0 +36,2,76845,1,9,0,4,3,1,0,0,0,35,0,0 +24,2,148320,5,10,1,0,1,1,0,0,0,40,0,0 +50,1,54261,1,9,1,7,1,0,0,0,0,84,0,0 +21,2,223352,1,9,0,4,0,0,1,1055,0,30,0,0 +21,2,211013,4,5,0,4,3,0,1,0,0,50,4,0 +40,2,209833,1,9,0,10,0,0,0,0,0,40,0,0 +19,2,356272,5,10,0,0,0,0,1,0,0,25,0,0 +38,2,143538,1,9,0,8,0,0,1,0,0,40,0,0 +34,2,242960,9,11,1,10,1,0,0,0,0,50,0,0 +44,4,263871,5,10,2,1,0,0,0,0,0,50,0,0 +20,2,151105,6,12,0,5,3,0,1,0,0,25,0,0 +44,2,207685,1,9,0,1,0,0,0,0,1564,55,7,1 +49,4,46537,1,9,2,0,0,0,1,594,0,10,0,0 +45,5,84324,6,12,1,3,1,0,0,0,0,50,0,1 +24,2,224716,1,9,0,10,3,0,0,0,0,40,0,0 +34,2,186269,1,9,2,0,3,0,0,0,0,40,0,0 +58,1,143731,1,9,1,5,1,0,0,0,0,72,0,1 +39,2,236391,1,9,1,10,1,0,0,0,0,45,0,0 +22,2,54560,1,9,0,4,3,0,0,0,0,40,0,0 +38,2,266325,0,13,1,3,2,0,1,0,0,32,0,1 +32,3,42900,10,15,1,3,1,0,0,15024,0,50,0,1 +45,0,183710,1,9,2,6,0,0,0,0,0,48,0,0 +23,2,278254,1,9,1,8,1,1,0,0,0,45,0,0 +35,2,119992,6,12,1,10,1,0,0,0,0,45,0,0 +52,2,284329,5,10,1,10,1,0,0,0,0,45,0,1 +55,2,368727,5,10,2,10,0,0,0,0,0,40,0,0 +23,2,353696,1,9,0,7,3,0,0,0,0,40,0,0 +22,2,31387,0,13,1,0,3,3,1,2885,0,25,0,0 +27,2,110931,1,9,1,0,1,0,0,0,0,40,0,0 +24,2,169532,6,12,0,0,3,0,1,0,0,15,0,0 +21,2,285522,5,10,0,10,0,0,0,0,0,40,0,0 +49,2,198774,0,13,2,5,5,0,1,0,0,35,0,0 +32,2,123291,14,8,1,8,1,0,0,0,0,40,0,0 +64,2,146110,5,10,6,4,4,0,1,0,0,24,0,0 +37,1,29814,1,9,0,7,4,0,0,0,0,50,0,0 +61,2,195595,7,4,3,8,0,0,0,0,0,40,24,0 +44,2,92649,1,9,1,10,2,0,1,0,0,40,0,1 +53,2,290688,1,9,1,10,1,0,0,0,0,52,0,1 +43,2,427382,3,14,0,3,0,0,0,0,0,50,0,1 +60,0,234854,8,16,1,3,1,0,0,0,1902,40,0,1 +23,2,276568,5,10,0,5,3,0,1,0,0,40,0,0 +25,2,250038,3,14,1,8,0,0,0,0,0,40,4,0 +29,2,150861,1,9,0,0,0,0,1,0,0,40,0,0 +51,2,87205,0,13,2,3,4,0,1,0,0,55,7,0 +47,2,343579,15,2,3,7,0,0,0,0,0,12,4,0 +20,2,94401,1,9,0,1,4,0,1,0,0,40,0,0 +25,2,120238,2,7,1,6,1,0,0,5178,0,40,12,1 +27,2,205440,12,6,1,8,1,0,0,0,0,40,0,0 +23,2,198996,1,9,0,0,0,0,1,0,0,40,0,0 +18,2,294253,1,9,0,4,3,0,1,0,0,27,0,0 +23,2,256628,7,4,1,6,1,0,0,0,0,32,0,0 +59,1,223131,1,9,2,1,0,0,0,0,0,60,0,0 +46,2,207301,1,9,0,0,0,0,1,0,0,37,0,0 +46,4,125457,3,14,1,3,1,1,0,0,0,38,0,1 +36,4,212856,2,7,0,4,4,0,1,0,0,23,0,0 +44,2,197389,1,9,3,8,4,0,1,0,0,40,0,0 +17,2,73338,2,7,0,5,3,0,0,0,0,20,0,0 +27,2,68037,5,10,0,1,0,0,0,0,0,45,0,0 +32,2,185027,5,10,1,5,1,0,0,0,0,40,0,1 +53,2,107123,1,9,2,4,0,1,0,0,0,40,0,0 +22,2,109482,5,10,0,3,3,0,0,0,0,98,0,0 +30,2,174543,6,12,0,3,3,0,1,0,0,40,0,0 +47,1,208407,0,13,1,3,1,0,0,0,2002,30,0,0 +68,1,211584,5,10,1,5,1,0,0,0,0,40,0,1 +39,2,108540,1,9,1,5,1,0,0,0,0,40,0,0 +22,2,202416,0,13,0,0,3,0,1,0,0,40,0,0 +20,2,176178,1,9,0,5,3,0,1,0,0,35,0,0 +21,2,265148,1,9,0,2,5,0,0,0,0,38,2,0 +30,1,303692,1,9,1,1,1,0,0,0,0,75,0,0 +25,2,135845,5,10,0,0,3,0,1,0,0,40,0,0 +23,0,199915,1,9,0,4,3,0,1,0,0,21,0,0 +40,0,150533,0,13,1,3,5,0,0,0,0,40,0,0 +26,3,85482,1,9,0,0,0,2,0,0,0,40,0,0 +57,1,24473,9,11,1,10,1,0,0,0,0,40,0,1 +36,2,272944,9,11,1,1,1,0,0,0,0,60,0,1 +49,0,194895,0,13,2,3,0,0,0,0,0,40,0,0 +58,2,314153,1,9,1,10,1,0,0,0,0,40,0,1 +32,2,176253,5,10,2,1,0,1,0,0,0,40,0,0 +59,2,113959,1,9,1,0,1,0,0,0,0,45,0,1 +42,0,167581,0,13,0,0,5,0,1,0,0,40,0,0 +37,2,79586,0,13,1,1,1,2,0,0,0,40,10,0 +40,2,166662,10,15,1,3,1,0,0,15024,0,45,0,1 +47,2,72896,1,9,1,6,1,0,0,0,0,40,0,0 +56,2,345730,0,13,1,3,1,0,0,0,0,45,0,1 +30,2,302473,1,9,0,0,3,0,1,0,0,40,0,0 +42,2,42346,1,9,6,1,0,1,1,0,0,35,0,0 +21,2,243921,1,9,0,4,3,0,0,0,0,40,0,0 +21,2,131620,1,9,3,8,3,0,1,0,0,40,21,0 +47,2,158924,1,9,1,9,2,0,1,0,0,40,0,0 +22,1,32921,5,10,0,7,3,0,0,0,0,20,0,0 +35,2,252897,6,12,0,0,0,0,1,14344,0,40,0,1 +41,2,155657,2,7,0,2,5,1,1,0,0,40,0,0 +43,3,155106,0,13,1,2,1,0,0,0,0,53,0,0 +60,2,82775,5,10,1,5,1,0,0,0,0,55,0,0 +73,2,26248,7,4,1,5,1,0,0,0,0,30,0,1 +90,2,88991,0,13,1,1,2,0,1,0,0,40,7,1 +62,3,125155,1,9,1,0,1,0,0,0,0,38,0,0 +28,2,218039,1,9,1,10,1,0,0,0,0,40,0,0 +45,2,53524,5,10,1,10,1,0,0,0,0,40,0,0 +19,2,259352,1,9,0,5,0,0,0,0,0,45,0,0 +30,2,296453,1,9,0,10,0,0,0,0,0,35,0,0 +19,2,278915,14,8,0,2,3,1,1,0,0,52,0,0 +23,2,565313,5,10,0,4,3,1,0,2202,0,80,0,0 +22,3,274103,0,13,0,3,3,0,0,0,0,10,0,0 +19,2,271118,1,9,0,0,3,0,1,0,0,28,0,0 +45,3,207107,6,12,2,0,4,2,0,0,2080,40,11,0 +26,4,138597,1,9,0,4,4,1,1,0,0,25,0,0 +42,4,180985,12,6,1,2,1,0,0,99999,0,40,0,1 +62,1,159939,1,9,1,7,1,0,0,0,0,35,0,0 +61,2,110920,12,6,1,5,1,0,0,0,0,40,0,0 +34,2,34862,0,13,2,5,0,3,0,0,1564,60,0,1 +22,4,163205,1,9,0,4,3,0,1,0,0,53,0,0 +56,2,110003,3,14,1,3,1,0,0,0,0,40,0,1 +32,2,229051,5,10,1,3,1,0,0,0,0,40,0,0 +26,2,211596,1,9,2,10,0,0,0,0,0,40,0,0 +32,2,48458,1,9,0,5,3,1,1,0,1669,45,0,0 +58,2,201393,6,12,2,0,0,0,0,0,1876,40,0,0 +25,1,136450,6,12,1,0,2,0,1,0,0,35,0,1 +23,2,193586,5,10,0,0,3,0,1,0,0,25,0,0 +23,2,91189,5,10,1,9,1,0,0,0,0,40,0,0 +54,2,227832,5,10,1,0,1,0,0,0,0,40,0,0 +28,2,271936,5,10,0,1,0,0,1,0,0,35,0,0 +35,2,61343,0,13,1,5,1,0,0,0,0,40,0,1 +30,2,157778,5,10,1,3,1,0,0,0,0,25,0,1 +23,2,201680,14,8,1,10,1,0,0,0,0,40,0,0 +42,2,228320,5,10,1,9,1,0,0,0,0,50,0,1 +72,2,33404,12,6,6,0,0,0,1,0,0,20,0,0 +21,2,103205,1,9,1,8,1,0,0,0,0,40,0,0 +37,2,279029,0,13,0,10,0,0,0,0,0,40,0,0 +54,2,213092,1,9,2,4,0,0,1,0,0,40,0,0 +58,2,126104,3,14,2,0,0,0,1,0,1980,45,0,0 +32,2,119124,0,13,0,3,3,0,0,0,0,40,0,0 +65,2,31924,5,10,6,0,0,0,1,0,0,15,0,0 +65,2,185001,12,6,6,5,0,0,1,0,0,20,0,0 +33,1,34102,1,9,0,4,0,0,1,0,0,35,0,0 +35,2,115214,1,9,0,8,4,0,0,6497,0,65,0,0 +27,2,289484,5,10,0,0,3,0,1,0,0,40,0,0 +34,0,287908,1,9,0,4,3,1,0,0,0,42,0,0 +53,1,158284,1,9,1,5,1,0,0,0,0,70,0,0 +23,2,60668,12,6,1,10,1,0,0,0,0,40,20,0 +43,0,222978,8,16,4,3,4,0,1,0,0,40,0,1 +58,2,244605,9,11,1,1,1,0,0,3908,0,40,0,0 +38,2,150601,12,6,4,0,4,0,0,0,3770,40,0,0 +26,2,199143,1,9,1,2,1,0,0,0,0,50,0,0 +60,2,131681,0,13,1,1,1,0,0,0,0,50,0,1 +28,2,346406,1,9,1,8,1,0,0,0,1672,50,0,0 +33,3,391122,1,9,0,0,3,0,1,0,0,30,0,0 +29,4,280344,5,10,1,6,1,0,0,0,0,40,0,0 +54,0,188809,8,16,0,1,0,0,1,0,0,50,0,1 +41,2,277488,7,4,1,7,1,0,0,0,0,36,0,0 +63,1,181561,5,10,2,1,0,0,0,0,0,50,0,0 +31,2,158545,1,9,1,0,2,0,1,0,0,27,0,0 +23,2,313573,0,13,0,5,3,1,1,0,0,25,0,0 +41,2,268183,10,15,1,3,1,0,0,0,0,45,0,1 +51,2,392286,1,9,1,6,1,0,0,0,0,40,0,1 +59,2,233312,5,10,1,10,1,0,0,0,0,40,0,1 +23,2,520231,5,10,0,3,0,0,1,0,0,45,0,0 +24,1,186831,5,10,0,1,0,1,0,0,0,45,0,0 +67,1,141085,1,9,2,3,0,0,1,0,0,20,0,0 +47,4,198660,0,13,1,3,1,0,0,0,0,40,0,1 +21,2,409230,1,9,0,10,0,0,0,0,0,40,24,0 +38,2,376025,7,4,1,7,1,0,0,0,0,40,0,0 +55,2,80167,0,13,2,3,4,0,1,0,0,40,0,0 +39,2,99357,3,14,2,3,3,0,1,1506,0,40,0,0 +24,2,82847,1,9,4,4,4,0,1,0,0,50,20,1 +24,2,22201,1,9,1,11,1,2,0,0,0,40,15,0 +38,2,275223,5,10,1,5,1,0,0,7298,0,40,0,1 +19,2,117595,1,9,0,4,3,0,0,0,0,24,0,0 +32,2,207668,1,9,1,10,1,0,0,0,0,50,0,0 +63,1,179981,5,10,1,1,1,0,0,0,0,60,0,1 +18,2,192583,5,10,0,5,0,0,1,0,0,30,0,0 +36,2,66304,5,10,1,6,1,0,0,0,0,45,0,0 +41,2,200671,0,13,2,6,3,1,0,6497,0,40,0,0 +57,2,32365,5,10,0,11,0,0,0,0,0,40,0,0 +48,2,28497,1,9,1,10,1,0,0,0,0,40,0,0 +44,2,222978,1,9,2,5,0,0,1,0,1504,40,0,0 +25,2,160261,5,10,0,1,3,2,0,0,0,40,26,0 +48,2,120724,14,8,1,1,1,0,0,0,0,50,0,0 +20,2,91733,5,10,0,5,3,0,1,0,0,8,0,0 +74,1,146929,1,9,1,5,1,0,0,0,0,55,0,0 +44,2,205706,1,9,0,1,0,0,1,0,0,40,0,0 +26,2,181666,5,10,1,8,2,0,1,0,0,40,0,0 +54,4,279452,1,9,1,7,1,0,0,0,0,40,0,0 +39,2,207568,1,9,1,2,1,0,0,0,0,48,0,1 +38,2,22494,5,10,2,0,0,0,1,7443,0,40,0,0 +18,2,210026,12,6,0,4,5,0,1,0,0,40,0,0 +24,2,109869,5,10,0,4,3,0,0,0,0,40,0,0 +19,1,285263,4,5,0,3,0,0,0,0,0,35,4,0 +28,2,192588,1,9,1,8,1,0,0,0,0,40,0,0 +28,2,232945,1,9,4,2,0,4,0,0,0,30,0,0 +49,4,31339,1,9,1,10,1,0,0,0,0,40,0,0 +50,2,305147,0,13,1,10,1,0,0,0,0,40,0,0 +63,2,188914,1,9,6,8,5,1,1,0,0,40,19,0 +58,1,141165,1,9,1,7,1,0,0,0,0,50,0,0 +68,5,136218,1,9,6,4,4,0,1,0,0,15,0,0 +41,3,371382,5,10,1,1,1,1,0,0,0,40,0,1 +27,2,221366,5,10,1,3,1,0,0,3103,0,50,0,1 +24,2,403671,0,13,0,3,0,0,0,0,0,40,0,0 +50,2,193871,0,13,2,1,4,0,1,0,0,40,0,0 +47,2,306183,5,10,2,4,3,0,1,0,0,44,0,0 +54,2,124194,1,9,6,4,4,0,1,0,0,40,0,0 +28,2,69847,0,13,0,0,3,2,1,0,0,30,0,0 +26,0,169323,3,14,0,3,0,0,1,0,0,40,0,0 +35,0,172327,0,13,4,1,0,0,0,0,0,42,0,0 +48,2,118889,1,9,1,5,1,0,0,2885,0,15,0,0 +50,2,166220,6,12,1,5,2,0,1,3942,0,40,0,0 +39,2,186420,1,9,2,0,0,0,1,0,0,40,0,0 +46,2,192779,0,13,0,5,0,0,0,0,0,45,0,1 +41,2,105616,5,10,6,0,4,1,1,0,0,48,0,0 +24,2,141113,7,4,1,5,1,0,0,2580,0,40,0,0 +57,2,160275,1,9,2,10,0,0,0,0,0,40,0,0 +32,2,164507,1,9,0,2,0,0,0,0,0,40,13,0 +41,2,207578,6,12,1,1,1,1,0,0,0,50,3,1 +55,2,314592,1,9,1,10,1,0,0,0,0,40,0,1 +69,2,159522,7,4,2,8,4,1,1,2964,0,40,0,0 +22,2,112130,1,9,0,4,0,1,1,0,0,40,0,0 +45,2,192835,1,9,1,4,1,0,0,3942,0,40,0,0 +33,2,206280,1,9,0,0,0,1,0,0,0,40,0,0 +57,2,308861,5,10,4,5,0,0,1,0,0,40,0,0 +38,1,93206,0,13,1,1,1,2,0,0,1902,65,0,1 +40,2,206066,1,9,1,10,1,0,0,0,0,50,0,0 +48,1,309895,5,10,2,2,3,0,1,0,0,40,0,0 +38,4,216129,5,10,3,1,4,1,1,0,0,35,0,0 +26,0,287420,0,13,0,3,0,0,1,0,0,60,0,0 +24,2,163595,1,9,0,8,3,0,0,0,0,40,0,0 +35,2,170092,1,9,3,4,4,1,1,0,0,20,0,0 +37,2,287031,5,10,1,10,1,0,0,5178,0,75,0,1 +42,2,59474,1,9,2,8,0,0,0,0,0,40,0,0 +37,2,99151,1,9,1,0,2,0,1,0,0,40,0,1 +37,2,206888,1,9,0,1,0,0,1,0,0,50,0,0 +22,2,173736,1,9,1,10,1,0,0,0,0,40,0,0 +24,2,182163,2,7,0,0,0,0,1,0,0,40,9,0 +45,4,311080,5,10,1,0,1,0,0,0,0,40,0,1 +29,1,389857,1,9,0,10,0,0,0,0,0,50,0,1 +23,2,297152,5,10,0,0,3,1,1,0,0,25,0,0 +24,3,130534,0,13,0,1,0,0,0,0,0,40,0,0 +25,2,137301,6,12,0,3,3,0,1,0,0,40,0,0 +58,2,316235,1,9,2,5,5,0,1,0,0,32,0,0 +28,5,32922,9,11,0,5,0,0,0,0,0,60,0,0 +58,2,118303,1,9,6,5,0,0,1,0,0,35,0,1 +18,2,188241,2,7,0,4,3,0,0,0,0,16,0,0 +59,2,236731,7,4,1,11,1,0,0,0,0,40,5,0 +39,2,209397,1,9,2,0,4,0,1,0,0,40,0,0 +53,5,290640,5,10,1,5,1,0,0,0,0,50,0,1 +54,2,221915,10,15,0,3,5,0,1,0,0,65,0,0 +51,2,175246,1,9,1,6,1,0,0,0,0,50,0,1 +59,2,159724,3,14,1,5,1,0,0,7298,0,55,0,1 +42,0,160369,1,9,0,11,0,0,0,0,0,40,0,1 +36,2,461337,5,10,1,0,2,0,1,0,0,40,0,0 +37,2,187311,5,10,0,0,0,0,1,0,0,60,0,0 +32,2,29312,5,10,0,2,3,0,0,0,0,40,0,0 +38,1,197365,1,9,1,9,1,0,0,0,0,50,0,0 +19,2,301747,1,9,4,0,3,0,1,0,0,30,0,0 +55,4,135439,0,13,6,3,0,0,1,0,0,48,0,0 +30,2,340917,1,9,0,10,0,0,0,0,0,40,0,0 +27,2,155057,5,10,1,3,1,0,0,0,0,50,0,1 +44,2,323627,0,13,0,1,0,0,1,0,0,5,0,0 +32,2,131425,0,13,1,8,1,0,0,0,0,50,0,0 +60,2,184242,1,9,3,4,4,0,1,0,0,20,0,0 +28,2,149769,1,9,0,8,0,2,0,0,0,40,14,0 +44,2,124924,1,9,1,1,1,0,0,0,0,40,4,0 +29,2,253003,1,9,0,2,0,0,0,0,0,16,0,0 +57,0,250976,1,9,1,10,1,0,0,0,0,40,0,0 +41,2,104196,5,10,2,6,0,0,0,0,0,60,0,0 +34,1,250182,2,7,1,6,1,0,0,0,0,60,0,0 +44,2,188331,5,10,2,1,4,0,1,0,0,42,0,0 +44,2,187322,0,13,2,6,0,0,0,0,0,40,0,0 +57,2,130714,15,2,1,2,1,0,0,0,0,22,0,0 +37,2,40955,0,13,0,3,0,0,0,0,0,30,0,0 +35,2,107125,0,13,1,3,1,0,0,0,0,16,0,1 +27,2,133937,5,10,0,1,0,0,0,0,0,45,0,0 +41,0,293485,5,10,1,0,2,0,1,3103,0,40,0,1 +37,1,143368,8,16,1,3,1,0,0,0,0,60,0,0 +18,2,51789,5,10,0,4,3,0,0,0,0,8,0,0 +24,0,211049,7,4,0,9,4,0,1,0,0,20,0,0 +53,2,81794,14,8,1,0,2,0,1,0,0,40,0,0 +40,2,139193,1,9,2,8,0,0,0,0,1980,48,0,0 +54,2,150999,5,10,2,8,0,0,0,0,0,60,0,0 +22,2,332657,5,10,0,3,0,0,1,0,0,40,0,0 +44,2,240043,12,6,3,0,4,1,1,0,0,30,0,0 +43,2,186188,5,10,2,1,4,0,1,0,0,45,10,0 +58,0,223400,0,13,1,3,2,0,1,0,0,20,0,1 +59,4,102442,0,13,1,3,2,0,1,0,0,45,0,1 +31,2,236599,0,13,1,1,1,0,0,0,0,45,0,1 +35,2,283237,1,9,0,8,3,0,0,0,0,40,0,0 +17,2,150106,12,6,0,5,3,0,1,0,0,20,0,0 +45,2,102076,5,10,2,3,4,0,1,0,0,32,0,0 +40,2,374764,5,10,2,2,0,0,0,0,0,40,0,0 +35,2,32528,1,9,1,2,1,0,0,0,0,45,0,0 +25,3,50053,0,13,0,9,0,0,0,0,0,45,0,0 +58,2,212864,1,9,2,2,0,0,0,0,0,40,0,0 +39,2,30673,5,10,2,2,0,0,0,0,0,50,0,1 +23,2,419554,1,9,1,1,1,0,0,0,0,54,0,0 +32,0,177216,0,13,0,3,0,0,1,0,0,40,0,0 +48,2,118158,6,12,1,6,1,0,0,0,0,44,0,0 +41,2,116391,0,13,1,2,1,0,0,0,0,40,9,0 +43,2,111895,0,13,1,3,1,0,0,0,0,50,0,1 +18,2,193290,5,10,0,4,3,0,0,0,1721,20,0,0 +24,3,287988,0,13,0,12,0,0,0,0,0,40,0,0 +58,2,147653,5,10,1,0,2,0,1,0,0,32,0,0 +54,2,117674,3,14,1,3,1,0,0,0,0,40,0,1 +60,2,187458,7,4,1,10,1,0,0,0,0,40,0,0 +28,2,410351,5,10,1,7,1,0,0,0,0,40,0,0 +41,2,207578,1,9,1,6,1,0,0,0,0,40,0,1 +27,0,271243,5,10,2,0,4,1,0,0,0,40,2,0 +30,2,188798,5,10,2,4,3,0,1,0,0,20,0,0 +63,4,168656,0,13,2,10,0,1,0,0,0,35,31,0 +33,2,460408,1,9,0,5,0,0,0,3325,0,50,0,0 +34,2,241885,1,9,1,6,1,0,0,0,0,45,0,0 +51,2,194097,1,9,1,11,1,0,0,0,0,40,0,0 +21,2,219137,12,6,0,4,3,1,0,0,0,25,0,0 +50,2,31621,1,9,1,10,1,0,0,0,0,40,0,1 +43,2,207685,1,9,1,8,1,0,0,0,0,40,0,0 +27,2,57052,1,9,1,10,1,0,0,2885,0,40,0,0 +19,2,109854,1,9,0,0,3,0,1,0,0,40,0,0 +17,2,53611,14,8,0,4,3,0,1,0,0,6,0,0 +47,2,344916,6,12,2,6,0,1,0,0,0,40,0,0 +25,4,198813,0,13,0,0,5,1,1,0,0,40,0,0 +71,2,180733,3,14,0,4,0,0,1,0,0,20,0,0 +21,2,188073,1,9,0,8,3,1,1,0,0,40,0,0 +48,2,174829,6,12,1,8,1,0,0,0,0,40,0,0 +57,2,142791,7,4,6,5,5,0,1,0,1602,3,0,0 +58,1,43221,5,10,1,7,1,0,0,0,2415,40,0,1 +34,2,188736,1,9,1,8,5,4,1,0,0,20,13,0 +40,3,112388,3,14,0,3,0,0,0,0,0,40,0,0 +28,2,209641,1,9,0,4,0,0,0,0,0,32,0,0 +42,2,313945,3,14,1,5,1,0,0,0,0,40,16,0 +41,2,152742,9,11,2,9,0,0,1,3325,0,40,0,0 +28,5,153291,1,9,0,0,3,0,1,0,0,35,0,0 +40,2,353432,12,6,2,8,0,0,1,0,0,35,0,0 +23,2,96635,5,10,0,8,3,2,0,0,0,30,0,0 +39,2,150057,3,14,0,5,0,0,0,0,0,50,0,1 +39,2,114844,0,13,0,5,0,0,0,0,1876,50,0,0 +45,2,132847,1,9,0,2,0,0,1,0,0,40,0,0 +50,1,93705,5,10,2,5,0,0,1,0,0,40,0,0 +33,2,309350,1,9,1,0,1,0,0,0,0,40,0,0 +34,2,123084,2,7,1,8,3,0,1,0,0,40,0,0 +55,2,174662,1,9,1,6,1,0,0,0,0,32,0,0 +62,3,177295,1,9,6,0,4,0,1,0,0,40,0,0 +31,2,211880,0,13,1,5,1,0,0,0,0,40,0,0 +35,1,454915,4,5,1,10,1,0,0,0,0,40,0,0 +30,2,232475,1,9,4,10,0,0,0,0,0,40,0,0 +57,5,244605,5,10,1,5,1,0,0,0,0,50,0,1 +50,2,150876,1,9,1,1,1,1,0,0,1887,55,0,1 +51,2,257337,1,9,1,6,1,0,0,0,0,50,0,0 +47,2,329144,1,9,1,5,1,0,0,4386,0,45,0,1 +37,2,116960,0,13,0,3,0,0,0,0,0,45,0,1 +58,2,267663,7,4,1,6,1,0,0,0,0,40,4,0 +39,2,47871,0,13,2,1,4,0,1,0,0,50,0,1 +34,2,295922,5,10,0,8,0,0,0,0,0,40,7,1 +45,2,175625,1,9,4,0,4,0,1,0,0,38,0,0 +42,2,190179,0,13,1,3,1,0,0,99999,0,40,0,1 +40,2,168071,9,11,2,9,0,0,0,3325,0,40,0,0 +39,1,202027,10,15,1,3,1,0,0,0,1977,50,0,1 +36,2,202662,3,14,1,3,1,0,0,0,0,40,0,1 +56,2,101436,1,9,2,0,5,3,1,0,0,35,0,0 +37,2,360743,5,10,1,2,1,1,0,0,0,40,0,1 +60,4,93272,1,9,1,4,1,0,0,0,0,40,0,0 +56,2,145574,1,9,1,10,1,0,0,0,0,40,0,1 +51,2,101722,7,4,1,1,1,3,0,3908,0,47,0,0 +34,2,135785,0,13,0,3,0,0,1,0,0,36,0,0 +19,2,127709,1,9,0,7,3,1,0,0,0,30,0,0 +37,3,448337,1,9,0,1,4,1,1,0,0,40,0,0 +58,2,310320,0,13,1,1,1,0,0,0,0,40,0,1 +33,2,251521,2,7,0,0,0,0,1,0,0,35,0,0 +39,2,255503,0,13,0,1,0,0,0,0,0,40,0,1 +36,2,116608,1,9,0,0,0,0,1,4865,0,40,0,0 +26,2,71009,0,13,0,3,0,2,1,0,0,40,11,0 +22,2,174975,9,11,0,9,3,0,1,0,0,36,0,0 +32,2,108023,3,14,0,0,0,0,0,0,0,40,0,0 +17,2,204018,2,7,0,5,4,0,0,0,0,15,0,0 +68,2,121846,7,4,6,4,4,3,1,0,0,20,0,0 +70,2,278139,1,9,1,5,1,0,0,3432,0,40,0,0 +30,2,114691,1,9,0,7,3,0,0,0,0,40,0,0 +19,0,536725,5,10,0,0,5,0,1,0,0,15,28,0 +51,2,94432,1,9,1,3,1,0,0,0,0,40,0,0 +19,2,286002,5,10,0,0,5,0,0,0,0,30,35,0 +47,2,101684,1,9,1,10,1,0,0,0,0,40,0,0 +41,2,352834,0,13,1,3,1,0,0,7688,0,55,0,1 +36,2,99146,5,10,1,8,1,0,0,0,1887,40,0,1 +30,2,231413,5,10,1,10,1,0,0,0,0,40,0,1 +26,2,158846,1,9,1,8,1,0,0,0,0,45,0,0 +41,4,190786,0,13,2,3,0,0,0,0,0,20,0,0 +25,2,306513,5,10,1,0,1,0,0,0,0,45,0,0 +62,2,152148,4,5,1,4,1,0,0,0,0,40,0,0 +23,2,309580,3,14,0,3,0,0,0,0,0,40,0,0 +25,2,194897,1,9,0,5,3,3,0,6849,0,40,0,0 +30,2,130078,0,13,0,5,0,0,1,0,0,45,0,0 +48,2,39986,1,9,0,2,0,0,0,0,0,40,0,0 +20,2,379198,1,9,0,4,5,4,0,0,0,40,4,0 +51,2,189762,5,10,1,1,2,0,1,0,0,15,0,1 +19,2,178147,5,10,0,2,3,0,0,0,0,10,0,0 +31,2,332379,1,9,0,8,0,0,0,0,0,40,0,0 +36,2,175759,0,13,1,1,1,0,0,7298,0,50,0,1 +40,2,275446,1,9,0,5,3,1,0,0,0,40,0,0 +30,1,278522,2,7,0,7,3,1,0,0,0,40,0,0 +28,1,54683,5,10,0,10,0,0,0,0,1590,40,0,0 +57,2,136107,4,5,1,10,1,1,0,0,0,40,0,1 +18,2,205894,2,7,0,5,3,0,0,0,0,15,0,0 +54,2,210736,1,9,1,10,1,0,0,0,0,40,0,1 +32,2,166634,1,9,1,8,1,1,0,0,0,40,0,0 +52,2,185283,3,14,0,3,0,0,0,0,0,40,0,0 +27,2,180553,1,9,4,8,4,0,1,0,0,40,0,0 +18,2,145005,5,10,0,4,3,0,0,0,0,20,0,0 +37,1,184655,1,9,0,10,0,0,0,0,0,35,0,0 +52,2,358554,1,9,1,8,1,1,0,0,0,40,0,1 +59,2,307423,4,5,0,4,0,1,0,0,0,50,0,0 +27,2,472070,9,11,0,8,0,0,0,0,0,40,0,0 +43,3,115562,1,9,1,8,1,0,0,0,0,40,0,0 +56,2,32446,5,10,1,10,1,0,0,0,0,40,0,1 +44,1,33121,5,10,1,7,1,0,0,0,0,72,0,0 +37,2,183345,9,11,0,10,0,0,0,0,0,45,0,0 +28,2,119793,9,11,2,1,0,0,0,10520,0,50,0,1 +48,1,97883,1,9,4,4,5,0,1,0,0,25,0,0 +58,1,31732,0,13,1,1,1,0,0,0,0,50,0,0 +29,2,206250,1,9,1,10,1,0,0,0,0,45,0,0 +37,2,103323,6,12,1,5,1,0,0,0,0,40,0,0 +35,5,135436,10,15,1,3,1,0,0,0,0,50,0,1 +36,2,376455,9,11,2,10,0,0,0,0,0,38,0,0 +52,2,160703,1,9,1,0,1,0,0,0,0,48,0,0 +30,2,131699,1,9,2,6,0,0,0,0,0,40,0,0 +22,2,243842,4,5,0,10,3,0,0,0,0,40,0,0 +55,1,349910,6,12,1,5,1,0,0,0,0,60,0,0 +61,2,170262,1,9,1,1,2,0,1,15024,0,38,0,1 +33,2,184306,1,9,2,2,4,0,0,0,0,30,0,0 +46,2,224202,5,10,1,5,1,0,0,0,0,50,0,0 +64,2,151540,2,7,6,9,4,0,1,0,0,16,0,0 +28,2,231197,12,6,3,10,4,0,0,0,0,40,4,0 +19,2,279968,1,9,0,0,0,0,1,0,0,42,0,0 +36,2,162651,1,9,4,0,0,0,0,0,0,40,13,0 +43,1,130126,0,13,1,10,1,0,0,0,0,40,0,1 +56,2,161662,0,13,1,1,1,0,0,0,0,42,0,1 +24,4,201664,5,10,0,11,3,0,0,0,0,40,0,0 +40,2,137142,1,9,1,5,1,0,0,0,0,60,0,0 +45,5,122206,6,12,1,1,1,0,0,0,0,50,0,1 +56,4,183169,3,14,6,3,0,0,1,0,0,40,0,0 +35,3,185053,0,13,0,3,3,0,1,0,0,40,0,0 +36,1,408427,10,15,1,3,1,0,0,0,0,60,0,1 +50,1,198581,10,15,1,3,1,0,0,0,0,50,0,1 +61,2,199198,7,4,6,4,0,1,1,0,0,21,0,0 +31,2,184306,9,11,0,6,3,0,0,0,1980,60,0,0 +63,2,172740,5,10,1,3,1,0,0,0,0,40,0,0 +41,2,205153,9,11,1,1,1,0,0,0,0,40,0,0 +48,2,164964,1,9,1,8,1,0,0,0,0,40,0,0 +45,2,162606,1,9,2,5,0,0,1,0,0,35,0,0 +24,2,179627,1,9,1,8,1,0,0,0,0,40,0,0 +34,2,103408,5,10,2,3,0,1,0,0,0,40,9,1 +27,2,36440,0,13,0,5,0,0,1,0,0,40,0,0 +26,2,57512,9,11,0,10,3,0,0,0,0,48,0,0 +27,2,187981,1,9,0,2,3,0,0,0,0,40,0,0 +55,2,393768,9,11,1,1,1,0,0,0,0,40,0,0 +38,2,108726,1,9,1,1,1,0,0,0,0,40,0,1 +31,2,180551,1,9,1,0,2,0,1,0,0,40,0,1 +51,1,176240,6,12,1,5,1,0,0,0,0,40,0,1 +56,2,70720,14,8,1,3,1,0,0,0,0,40,0,1 +39,2,35890,6,12,1,8,1,0,0,0,0,40,0,0 +50,2,283676,5,10,1,10,1,0,0,0,0,40,0,1 +34,4,105540,0,13,1,3,1,0,0,0,2051,40,0,0 +44,2,408717,1,9,2,5,0,0,0,3674,0,50,0,0 +21,2,57916,1,9,0,11,3,0,0,0,0,40,0,0 +37,2,177974,5,10,1,8,1,0,0,0,0,70,0,0 +18,2,115839,14,8,0,0,0,0,1,0,0,30,0,0 +38,2,117802,1,9,1,8,1,0,0,0,0,65,0,1 +19,2,211355,1,9,0,0,3,0,0,0,0,12,0,0 +46,2,173243,1,9,1,10,1,0,0,0,0,40,0,0 +19,2,343200,5,10,0,5,3,0,1,0,0,25,0,0 +22,2,401690,5,10,0,5,3,0,1,0,0,20,4,0 +38,2,196123,1,9,1,10,1,0,0,0,0,50,0,0 +33,2,168981,3,14,2,1,3,0,1,14084,0,50,0,1 +83,1,213866,1,9,6,1,0,0,0,0,0,8,0,0 +34,2,55176,5,10,1,9,1,0,0,0,0,40,0,1 +38,2,153976,1,9,1,10,1,0,0,0,0,40,0,0 +33,2,119176,5,10,6,0,4,0,1,0,0,40,0,0 +27,2,169117,1,9,1,0,2,1,1,0,1887,40,0,1 +38,2,156550,1,9,1,10,1,0,0,0,0,60,0,0 +25,2,109609,5,10,0,4,0,0,0,0,0,25,0,0 +38,2,26698,1,9,1,9,1,0,0,0,0,40,0,0 +52,2,236497,0,13,1,1,1,0,0,0,0,48,0,1 +33,0,306309,3,14,0,3,0,0,0,0,0,50,0,0 +17,2,242773,2,7,0,4,3,0,1,0,0,20,0,0 +28,2,124680,0,13,0,1,0,0,1,6849,0,60,0,0 +52,4,43909,1,9,2,0,4,1,1,0,0,40,0,0 +34,2,112820,1,9,4,2,0,0,0,2463,0,40,0,0 +25,2,148300,0,13,0,3,3,0,1,0,0,15,0,0 +17,2,133449,4,5,0,4,3,1,0,0,0,26,0,0 +22,2,263670,1,9,0,4,3,1,0,0,0,80,0,0 +22,2,276494,1,9,0,2,0,1,0,0,0,40,0,0 +46,2,190115,5,10,1,5,1,0,0,0,1887,40,0,1 +58,2,317479,1,9,2,8,0,1,1,0,0,40,0,0 +39,2,151248,5,10,2,5,5,0,1,0,0,35,0,0 +59,4,130532,5,10,6,4,0,0,1,0,0,40,12,0 +61,2,160062,1,9,1,0,1,0,0,0,0,40,0,0 +32,2,299635,9,11,1,10,1,0,0,0,0,45,0,0 +50,2,171225,0,13,1,1,1,2,0,0,0,40,11,1 +51,2,33304,1,9,1,10,1,0,0,0,0,40,0,0 +20,2,243878,5,10,0,10,3,0,0,0,0,40,0,0 +38,4,181721,0,13,1,1,1,1,0,0,0,40,0,0 +44,3,201435,9,11,1,10,1,1,0,0,0,40,0,1 +28,2,334032,9,11,0,5,0,0,0,0,0,50,0,0 +50,2,220019,3,14,1,3,2,0,1,0,0,40,0,0 +53,2,71772,8,16,2,3,0,0,0,0,0,50,0,0 +42,1,27661,0,13,1,5,1,0,0,0,0,45,0,0 +47,2,191411,3,14,1,3,1,2,0,0,0,45,3,0 +39,2,123945,1,9,1,0,2,0,1,0,0,40,0,1 +38,1,37778,1,9,0,7,0,0,0,0,0,60,0,0 +34,0,171216,0,13,0,3,3,0,0,0,0,50,0,0 +40,2,93955,5,10,1,3,2,0,1,0,0,40,0,0 +63,2,163809,5,10,6,5,0,0,1,0,0,20,0,0 +53,2,346754,5,10,1,1,2,0,1,0,0,40,0,1 +43,2,188436,9,11,2,3,0,0,0,0,0,48,0,0 +28,2,72443,5,10,0,1,0,0,0,0,1669,60,0,0 +68,2,186350,1,9,6,1,0,0,1,0,0,10,0,1 +46,0,394860,0,13,1,3,1,0,0,0,0,38,0,0 +57,2,262642,1,9,0,0,5,0,1,0,0,40,0,0 +38,2,125550,1,9,2,0,0,0,1,0,0,35,0,0 +66,2,192504,3,14,1,5,1,0,0,0,0,40,0,0 +29,2,131310,6,12,0,5,3,0,1,0,0,40,0,0 +54,2,249322,0,13,1,5,1,0,0,7688,0,50,0,1 +38,2,172755,1,9,0,3,0,0,0,0,0,40,0,0 +35,2,209993,2,7,4,13,4,0,1,0,0,8,4,0 +30,2,166961,0,13,0,3,3,0,1,0,0,37,0,0 +39,2,315291,1,9,0,0,4,1,1,0,0,40,0,0 +31,2,284703,3,14,0,3,0,1,0,0,0,40,0,0 +50,2,166565,1,9,1,8,1,0,0,0,0,50,0,0 +30,1,173854,1,9,1,10,1,0,0,0,0,60,0,0 +25,2,189219,0,13,0,5,3,0,1,0,0,40,0,0 +24,2,210781,0,13,0,13,0,0,1,0,0,40,23,0 +59,4,171328,1,9,4,11,5,1,1,0,2339,40,0,0 +45,2,199832,0,13,1,0,1,0,0,0,0,15,0,0 +64,2,251292,11,3,4,4,5,0,1,0,0,20,1,0 +61,2,122246,14,8,1,4,2,0,1,0,0,40,0,0 +42,2,190767,9,11,2,9,4,0,1,0,0,40,0,0 +28,2,278736,11,3,1,8,1,0,0,0,0,40,4,0 +53,2,124963,1,9,2,2,0,0,0,0,0,40,0,0 +33,1,167476,2,7,2,2,0,0,0,0,0,7,0,0 +34,4,246104,3,14,1,3,1,1,0,0,0,40,0,0 +41,2,171615,5,10,1,4,1,0,0,0,0,48,0,0 +67,2,264095,5,10,1,2,1,0,0,9386,0,24,1,1 +46,2,177114,6,12,6,3,4,0,1,0,0,27,0,0 +32,2,146154,1,9,1,5,2,0,1,0,0,40,0,0 +41,2,198196,1,9,1,6,1,0,0,0,0,40,0,0 +30,2,79712,0,13,1,3,1,4,0,0,0,40,0,0 +54,1,154785,0,13,2,1,0,0,0,0,0,50,0,0 +33,2,182423,1,9,2,4,4,1,0,0,0,40,0,0 +34,2,118584,0,13,0,1,0,0,1,0,0,40,0,0 +45,2,197418,5,10,2,0,0,0,1,0,0,48,0,0 +21,2,253190,1,9,0,4,3,0,0,0,0,40,0,0 +25,2,192273,0,13,1,3,1,0,0,0,0,40,0,0 +38,2,129573,1,9,1,10,1,0,0,0,0,41,0,0 +17,2,173807,2,7,0,10,3,0,1,0,0,15,0,0 +35,2,217893,1,9,2,5,0,0,1,0,0,30,0,0 +38,2,102938,0,13,1,10,1,0,0,0,0,40,0,0 +48,4,407495,6,12,1,11,1,0,0,0,0,56,0,1 +25,2,50053,1,9,0,4,0,1,0,0,0,40,28,0 +57,2,233382,3,14,0,1,0,0,0,0,0,40,1,0 +32,2,270968,0,13,2,1,0,0,1,0,0,50,0,1 +39,4,272166,0,13,4,3,0,1,0,0,0,30,0,0 +23,2,199915,0,13,0,0,3,0,1,0,0,35,0,0 +21,2,305781,1,9,0,2,4,0,0,0,0,45,0,0 +47,2,107682,1,9,2,0,4,0,1,0,0,48,0,0 +25,2,188507,7,4,0,8,5,0,1,0,0,40,21,0 +41,3,197069,5,10,3,0,0,1,0,4650,0,40,0,0 +19,2,177839,1,9,0,4,3,0,1,0,0,15,0,0 +24,2,77665,1,9,0,10,0,0,0,0,0,42,0,0 +57,2,127728,0,13,1,1,1,0,0,15024,0,50,0,1 +32,2,106742,1,9,1,6,1,0,0,0,0,40,0,0 +28,1,192838,9,11,1,10,1,0,0,0,0,45,0,0 +40,2,79531,0,13,1,1,1,0,0,0,0,75,0,1 +21,0,337766,5,10,0,3,3,0,0,0,0,20,0,0 +45,1,33234,0,13,1,5,1,0,0,0,0,40,0,1 +55,2,176904,12,6,1,6,1,0,0,0,0,50,0,0 +42,2,172148,5,10,1,0,1,1,0,0,0,40,0,0 +49,2,199058,1,9,1,0,1,0,0,0,0,38,0,0 +38,2,48093,1,9,1,2,1,0,0,0,0,40,0,0 +50,2,143664,0,13,0,1,0,0,0,0,0,40,0,0 +47,2,168337,1,9,1,8,1,0,0,0,0,48,0,1 +39,2,230329,0,13,1,5,1,0,0,0,0,40,8,1 +42,2,376072,1,9,1,6,1,0,0,0,0,30,0,0 +32,2,430175,1,9,2,10,5,1,1,0,0,50,0,0 +44,3,240628,6,12,2,1,0,0,1,2354,0,40,0,0 +50,5,158294,10,15,1,3,1,0,0,99999,0,80,0,1 +55,2,28735,1,9,2,0,4,3,1,0,0,45,0,0 +37,2,167482,1,9,0,8,3,0,0,0,0,40,0,0 +59,2,113203,1,9,2,0,0,0,1,0,0,40,0,0 +56,2,103948,2,7,1,6,1,0,0,0,0,40,0,0 +33,1,310525,14,8,0,10,0,1,0,0,0,32,0,0 +35,2,105138,0,13,1,9,1,0,0,0,0,40,0,1 +44,2,153489,1,9,0,4,4,0,0,0,0,40,0,0 +57,0,254949,1,9,1,1,1,0,0,0,0,40,0,1 +31,2,118149,5,10,0,1,0,1,1,0,0,40,0,0 +18,2,267965,2,7,0,5,0,0,1,0,0,15,0,0 +43,2,50646,1,9,1,10,1,0,0,0,0,70,0,0 +33,2,147700,1,9,1,10,1,4,0,0,0,40,0,0 +18,2,446771,5,10,0,0,3,0,0,0,0,25,0,0 +47,2,168262,0,13,0,0,3,0,0,0,0,40,0,0 +53,2,117058,1,9,2,4,4,0,1,0,0,40,0,0 +59,1,140957,9,11,0,1,0,0,0,0,0,35,0,1 +49,2,268234,12,6,1,1,1,0,0,0,0,40,0,0 +26,2,485117,6,12,0,10,0,0,0,0,0,40,0,0 +25,2,31350,1,9,0,2,0,0,0,0,0,60,7,0 +36,0,210830,3,14,0,3,3,0,1,0,0,30,0,0 +29,2,196420,1,9,0,1,0,0,1,0,0,45,0,0 +52,2,172165,12,6,2,4,5,0,1,0,0,25,0,0 +50,1,186565,0,13,1,5,1,0,0,0,0,50,0,0 +22,2,119359,0,13,0,1,3,2,1,0,0,40,0,0 +44,1,109684,3,14,2,1,4,0,1,0,0,40,0,0 +32,2,169589,9,11,1,2,1,0,0,0,0,40,0,1 +49,2,125421,1,9,2,0,4,0,1,0,0,38,0,0 +31,2,500002,15,2,1,7,1,0,0,0,0,45,4,0 +33,2,224141,1,9,1,4,1,0,0,0,0,40,0,0 +50,2,113290,1,9,1,5,2,0,1,0,0,15,0,0 +26,2,58098,5,10,0,0,0,0,1,0,1974,40,0,0 +55,2,198145,0,13,1,3,1,0,0,7298,0,40,0,1 +49,3,35406,1,9,6,1,0,0,1,0,0,20,0,0 +22,2,199419,1,9,1,5,2,0,1,0,0,40,0,0 +43,2,145441,0,13,1,1,1,0,0,0,0,38,0,1 +58,2,238438,5,10,1,3,1,0,0,0,0,42,0,0 +48,0,212954,3,14,1,3,1,0,0,15024,0,40,0,1 +21,2,56582,2,7,0,4,3,0,0,0,0,50,0,0 +67,4,176931,7,4,6,4,0,0,1,0,0,20,0,0 +39,1,188571,2,7,1,6,1,0,0,0,0,40,0,0 +52,3,312500,9,11,2,7,0,0,1,0,0,40,0,0 +25,2,278404,0,13,0,3,0,0,0,0,0,40,0,0 +27,1,114225,5,10,0,1,0,0,0,0,0,60,0,1 +18,2,184016,2,7,0,5,3,0,1,0,0,20,0,0 +41,4,183009,1,9,1,6,1,1,0,0,0,40,0,1 +59,2,205759,8,16,0,3,0,0,0,0,0,50,0,0 +23,2,462294,6,12,0,4,3,1,0,0,0,44,0,0 +42,2,102085,1,9,2,4,3,0,1,0,0,15,0,0 +54,1,83311,10,15,1,3,1,0,0,0,0,30,0,1 +39,2,248694,1,9,0,10,0,0,0,0,0,60,0,0 +57,4,190747,4,5,1,4,1,0,0,0,0,40,0,0 +51,2,162988,12,6,2,4,4,0,1,0,0,25,0,0 +31,1,156890,7,4,1,10,1,0,0,0,0,40,0,0 +24,2,310380,5,10,3,0,3,1,1,0,0,45,0,0 +35,2,172186,5,10,0,10,3,0,0,0,0,40,0,0 +26,2,311497,0,13,0,1,0,0,1,0,0,40,0,0 +42,5,443508,8,16,1,3,1,0,0,0,0,45,0,1 +31,2,152156,1,9,1,10,1,0,0,0,0,45,0,0 +46,2,155890,0,13,1,6,1,0,0,0,0,40,0,1 +38,0,312528,0,13,1,1,1,0,0,0,0,37,0,0 +51,2,282744,0,13,1,7,1,0,0,0,0,40,8,0 +27,2,205145,1,9,1,8,1,0,0,0,0,40,0,0 +22,2,401451,5,10,1,6,1,0,0,0,0,48,0,1 +25,2,189027,0,13,0,2,3,0,0,0,0,40,0,0 +58,1,35551,0,13,1,1,1,0,0,0,0,70,0,1 +23,2,42706,5,10,0,3,0,0,0,0,0,45,0,0 +63,2,106910,11,3,6,4,5,2,1,0,0,19,11,0 +23,2,53245,4,5,4,4,0,0,0,0,0,40,0,0 +51,2,221672,3,14,1,5,1,0,0,15024,0,50,0,1 +75,2,71898,13,1,0,13,0,2,1,0,0,48,11,0 +52,2,222107,5,10,2,5,4,0,1,0,0,50,0,0 +69,2,277588,1,9,1,5,1,0,0,0,0,10,0,0 +40,3,391744,1,9,0,0,4,1,1,0,0,40,0,0 +34,2,418020,8,16,1,3,1,0,0,0,0,50,0,1 +21,0,39236,5,10,0,3,0,0,1,0,0,8,0,0 +30,2,86808,0,13,0,3,5,0,1,0,0,40,0,0 +46,2,147640,11,3,1,6,1,3,0,0,1902,40,0,0 +21,2,184756,5,10,0,0,3,0,1,0,0,16,0,0 +44,2,191256,1,9,1,8,1,0,0,0,0,40,0,0 +51,0,105943,1,9,1,0,2,0,1,3908,0,40,0,0 +40,2,101272,1,9,2,0,0,0,1,0,0,32,0,0 +33,0,175023,1,9,1,11,1,0,0,0,0,37,0,0 +22,1,357612,1,9,1,10,1,0,0,0,0,60,0,0 +23,2,82777,1,9,1,1,1,0,0,0,0,30,0,0 +75,1,218521,5,10,3,10,0,0,0,0,0,30,0,0 +55,2,179534,2,7,6,2,4,0,1,0,0,40,0,0 +45,2,148549,5,10,2,10,0,0,0,27828,0,56,0,1 +31,2,198069,1,9,0,4,3,0,0,0,0,24,0,0 +49,2,236586,1,9,1,0,1,0,0,0,0,40,0,1 +26,4,167261,0,13,0,3,0,0,1,0,0,40,0,0 +61,2,160942,3,14,1,5,1,0,0,3103,0,50,0,0 +44,2,107584,3,14,1,0,1,0,0,3908,0,50,0,0 +28,4,251854,5,10,0,0,4,1,1,0,0,40,0,0 +51,2,302579,1,9,2,4,5,1,1,0,0,30,0,0 +44,5,64632,8,16,1,3,1,0,0,0,0,60,0,0 +24,2,83141,0,13,0,1,0,0,0,0,0,40,0,0 +46,5,326048,5,10,1,1,1,0,0,0,0,40,0,1 +36,2,83471,1,9,6,4,4,2,1,0,0,20,0,0 +23,2,170070,14,8,0,4,0,0,1,0,0,38,0,0 +25,2,207875,7,4,1,2,1,0,0,0,0,40,4,0 +48,2,119722,5,10,1,5,1,1,0,0,0,8,0,0 +18,2,335665,2,7,0,4,5,1,1,0,0,24,0,0 +25,2,212522,1,9,0,10,5,0,0,0,0,40,0,0 +19,2,42069,1,9,0,6,3,0,0,2176,0,45,0,0 +33,2,236396,1,9,0,0,3,0,0,0,0,35,0,0 +42,2,159911,1,9,2,4,4,0,1,0,0,40,0,0 +22,2,133833,5,10,0,0,3,0,1,0,0,40,0,0 +36,2,226947,0,13,1,3,1,0,0,0,0,40,0,1 +33,2,174201,1,9,0,2,3,0,0,0,0,40,0,0 +34,1,49707,1,9,1,1,1,0,0,0,0,70,0,0 +33,2,201988,3,14,1,3,1,0,0,0,0,45,0,0 +62,1,162347,10,15,1,3,1,0,0,0,0,15,0,1 +30,2,182833,5,10,0,1,3,1,1,0,0,40,0,0 +22,2,383603,5,10,0,0,3,0,1,0,0,40,0,0 +34,2,70466,9,11,2,10,0,0,0,0,0,40,0,0 +43,2,184846,1,9,6,8,4,0,1,0,0,60,0,0 +25,2,176756,0,13,0,10,3,0,0,0,0,40,0,0 +35,2,112512,1,9,6,4,3,0,1,0,0,40,0,0 +28,2,137296,6,12,0,4,0,1,1,0,0,40,0,0 +28,2,37821,5,10,2,5,4,0,1,0,0,45,0,0 +25,2,295108,1,9,0,2,4,1,1,0,0,25,0,0 +40,2,408717,1,9,1,10,1,0,0,0,0,40,0,1 +35,2,255635,4,5,1,10,1,4,0,0,0,40,4,0 +48,1,177783,7,4,0,7,0,0,0,0,0,50,0,0 +63,1,179400,1,9,1,10,1,0,0,2290,0,20,0,0 +31,2,240283,0,13,1,0,2,0,1,0,0,40,0,1 +36,2,410034,6,12,1,10,1,0,0,0,0,45,0,0 +39,2,180667,5,10,1,8,1,0,0,0,0,40,0,0 +24,2,196332,1,9,0,4,3,1,1,0,0,40,0,0 +32,4,159187,0,13,0,3,0,0,0,0,0,35,0,0 +46,2,225065,13,1,1,8,2,0,1,0,0,40,4,0 +19,2,178147,1,9,0,5,3,0,0,0,0,35,0,0 +30,2,272669,5,10,0,9,0,2,0,0,0,40,0,0 +35,2,347491,9,11,0,10,0,0,0,0,0,40,0,0 +33,2,75167,1,9,1,6,1,0,0,0,0,55,0,0 +25,2,133373,1,9,4,10,0,0,0,0,0,40,0,0 +64,4,84737,1,9,1,4,1,2,0,0,0,35,0,1 +18,2,96483,1,9,0,4,3,2,1,0,0,20,0,0 +59,2,368005,2,7,1,10,1,0,0,0,0,40,0,0 +45,0,36032,1,9,2,11,4,1,1,0,0,40,0,0 +30,2,174215,8,16,0,3,0,0,1,0,0,15,0,0 +24,2,228772,11,3,0,8,5,0,1,0,0,40,4,0 +22,2,242912,1,9,0,4,4,0,1,0,0,35,0,0 +49,5,86701,5,10,1,10,1,2,0,0,0,56,0,1 +35,2,166549,14,8,1,8,1,0,0,0,0,40,0,0 +48,4,121622,3,14,0,3,4,0,1,0,1380,40,0,0 +18,2,201613,14,8,0,5,3,0,1,0,0,20,0,0 +35,2,29874,5,10,1,2,1,0,0,0,0,40,0,0 +27,2,168138,1,9,0,1,3,0,0,0,0,40,0,0 +28,2,162404,0,13,0,10,0,1,0,0,0,60,0,0 +26,2,139116,5,10,0,4,3,1,1,0,0,50,0,0 +44,2,192381,0,13,1,3,1,0,0,0,1848,40,0,1 +39,2,370585,1,9,4,8,0,1,0,0,0,40,0,0 +40,0,151038,0,13,2,10,0,0,0,0,0,40,0,0 +70,1,36311,0,13,1,3,1,0,0,20051,0,35,0,1 +34,2,271933,3,14,0,1,4,0,1,0,0,50,0,0 +34,2,182401,6,12,2,0,0,1,0,0,0,40,0,0 +66,2,234743,5,10,1,1,1,0,0,0,0,50,0,0 +40,2,182140,1,9,4,6,4,1,0,0,0,40,0,0 +61,1,215591,1,9,1,1,1,0,0,0,1887,40,0,1 +59,1,96459,7,4,1,10,1,0,0,0,0,40,0,0 +47,2,188081,1,9,1,8,1,0,0,0,0,40,0,1 +33,0,121245,0,13,1,3,1,0,0,0,0,60,0,1 +18,2,127273,2,7,0,4,5,0,0,0,0,20,0,0 +25,2,114345,4,5,0,10,4,0,0,914,0,40,0,0 +22,2,341227,5,10,0,0,0,0,0,0,0,20,0,0 +40,4,166893,0,13,1,11,1,1,0,0,0,40,0,1 +30,2,145231,6,12,2,0,3,0,1,0,1762,40,0,0 +73,1,102510,7,4,1,7,1,0,0,6418,0,99,0,1 +45,1,285335,7,4,1,10,1,0,0,0,0,10,0,0 +23,2,177087,2,7,0,0,4,1,0,0,0,35,0,0 +40,2,240504,0,13,1,5,1,0,0,0,0,45,0,1 +39,2,218490,0,13,1,1,1,0,0,0,1977,40,0,1 +23,2,384651,5,10,1,2,1,0,0,0,0,40,0,0 +51,2,189551,1,9,2,10,3,1,0,0,0,40,0,0 +53,2,194791,1,9,1,7,1,0,0,0,0,45,0,0 +24,2,194630,0,13,0,9,0,0,0,0,0,35,0,0 +53,2,177647,0,13,2,1,4,0,0,0,0,40,0,0 +49,1,51620,8,16,1,3,1,0,0,0,0,60,0,0 +34,2,251421,1,9,1,10,1,0,0,0,0,40,0,0 +37,1,180477,1,9,1,10,1,0,0,0,0,47,0,0 +40,0,391736,9,11,1,10,1,0,0,0,0,40,0,0 +23,0,170091,5,10,0,3,3,0,1,0,0,6,0,0 +36,2,175360,3,14,0,0,0,0,0,13550,0,50,0,1 +35,2,276153,0,13,0,9,0,2,1,4650,0,40,0,0 +53,3,105788,0,13,2,1,4,1,1,0,0,50,0,1 +42,4,248476,5,10,2,6,0,0,0,0,0,65,0,1 +32,2,168443,3,14,1,1,2,0,1,0,0,40,0,0 +33,2,120201,1,9,2,0,3,4,1,0,0,65,0,0 +59,2,114678,1,9,0,10,0,1,0,0,0,60,0,0 +36,2,167440,5,10,1,8,1,0,0,0,0,44,0,0 +37,1,265266,10,15,1,3,1,0,0,0,0,40,1,1 +31,2,212235,5,10,0,5,0,0,0,0,0,45,0,0 +46,2,44671,0,13,1,11,1,0,0,0,0,40,0,0 +44,0,87282,0,13,0,3,0,2,1,0,0,38,0,0 +27,2,112754,0,13,1,1,1,0,0,0,1485,60,0,1 +29,1,322238,1,9,0,7,0,0,0,0,0,40,0,0 +39,2,65382,5,10,1,1,1,0,0,0,0,40,0,0 +62,1,115176,1,9,1,7,1,0,0,0,0,65,0,0 +42,2,409902,1,9,0,1,4,1,1,0,0,25,0,0 +60,4,204062,3,14,1,3,1,0,0,0,0,48,0,1 +35,2,283305,0,13,0,1,0,0,1,0,0,40,0,0 +39,2,435638,5,10,0,8,0,0,0,0,0,40,0,0 +34,5,114733,6,12,1,0,2,0,1,0,0,36,0,0 +22,2,162343,5,10,0,0,5,1,0,0,0,22,0,0 +44,2,79531,9,11,1,10,1,0,0,0,0,40,0,1 +44,0,395078,1,9,2,0,0,0,1,0,0,40,0,0 +49,4,159641,0,13,2,1,4,0,1,0,625,40,0,0 +21,2,159567,1,9,0,8,0,0,0,0,0,50,0,0 +52,2,196894,2,7,4,2,4,0,0,0,0,40,0,0 +39,4,132879,0,13,1,3,1,0,0,0,1887,40,0,1 +23,2,190290,0,13,0,3,3,0,0,0,0,40,0,0 +54,2,102828,1,9,1,10,1,0,0,0,0,49,0,0 +31,2,128493,1,9,2,4,0,0,1,0,0,25,0,0 +30,0,290677,3,14,0,0,0,1,1,0,0,20,0,0 +21,2,283757,5,10,0,5,3,0,0,0,0,40,0,0 +38,4,169104,0,13,1,11,1,2,0,0,0,40,11,1 +51,2,171409,5,10,1,6,1,0,0,0,0,40,0,1 +34,1,319165,8,16,1,3,1,0,0,0,0,50,0,1 +22,2,203182,0,13,0,1,4,0,1,0,0,30,0,0 +26,2,215384,0,13,0,1,0,0,0,0,1974,55,0,0 +26,2,166666,5,10,0,4,0,0,1,0,0,35,0,0 +41,2,156566,5,10,1,10,1,0,0,0,0,40,0,1 +35,2,140564,0,13,1,5,1,0,0,0,0,40,0,1 +27,4,322208,5,10,0,6,3,0,0,0,0,40,0,0 +65,2,420277,5,10,1,11,1,0,0,0,0,40,0,0 +31,2,123430,2,7,1,7,1,0,0,0,0,65,4,0 +45,5,151584,10,15,1,3,1,0,0,0,0,35,0,1 +37,1,348960,6,12,1,6,1,0,0,0,0,50,0,1 +47,2,168232,1,9,1,6,1,0,0,0,1887,45,0,1 +47,5,201699,6,12,1,1,1,0,0,0,0,50,0,1 +33,2,511517,1,9,1,3,1,0,0,0,0,40,0,0 +40,2,118001,12,6,1,10,1,1,0,0,0,40,0,0 +38,2,193961,5,10,1,10,1,2,0,0,0,40,11,1 +21,2,32732,5,10,0,5,0,0,0,0,0,40,0,0 +40,2,223548,1,9,1,0,1,0,0,0,0,40,4,0 +33,2,389932,1,9,2,6,0,1,0,0,0,55,0,0 +29,2,102345,5,10,0,9,0,0,0,0,0,52,0,0 +41,2,107584,5,10,4,6,0,0,0,0,0,35,0,0 +20,0,39478,5,10,0,1,3,0,0,0,0,54,0,0 +34,1,276221,12,6,1,7,1,0,0,0,0,40,0,0 +78,5,385242,0,13,1,1,1,0,0,9386,0,45,0,1 +46,2,235646,1,9,1,10,1,0,0,0,0,40,0,1 +40,2,123306,9,11,1,3,1,0,0,0,0,40,0,1 +59,2,38573,5,10,1,1,1,0,0,0,0,40,0,1 +23,2,216889,1,9,0,2,0,0,0,0,0,40,0,0 +23,2,386705,5,10,0,0,3,0,0,0,0,24,0,0 +47,1,249585,5,10,1,10,1,0,0,0,0,30,0,0 +31,4,47276,0,13,1,4,1,0,0,0,0,38,0,1 +42,1,162758,5,10,1,2,1,0,0,0,0,56,0,1 +46,4,146497,1,9,2,3,0,0,1,0,0,40,0,0 +29,2,190765,1,9,2,8,0,0,0,0,0,44,0,0 +21,2,186314,1,9,1,0,1,0,0,0,0,40,0,0 +55,2,213615,1,9,1,10,1,0,0,0,0,40,0,1 +38,2,162322,9,11,0,9,3,0,1,0,0,40,0,0 +44,0,115932,3,14,1,1,1,0,0,0,0,40,0,0 +61,1,392694,5,10,2,1,0,0,0,0,0,50,0,1 +38,0,143517,0,13,0,1,3,0,0,0,0,40,0,0 +50,5,123429,0,13,1,3,1,0,0,0,0,45,25,1 +53,2,254285,3,14,1,3,1,0,0,0,0,40,0,1 +37,2,238311,1,9,1,8,1,1,0,0,0,36,0,1 +49,2,281647,3,14,1,1,1,0,0,0,0,45,0,1 +30,2,75167,5,10,1,8,1,0,0,0,0,40,0,1 +19,2,252862,9,11,0,3,3,0,1,0,0,40,0,0 +59,1,199240,1,9,2,3,0,0,0,0,0,20,7,0 +43,2,145762,0,13,1,1,1,0,0,0,0,40,0,0 +29,4,142443,0,13,1,3,1,0,0,0,0,60,0,0 +49,2,99361,10,15,1,3,1,0,0,0,0,45,0,0 +36,2,105138,1,9,2,6,0,0,0,0,0,50,0,0 +26,2,183171,2,7,0,4,3,1,0,1055,0,32,0,0 +18,2,151866,5,10,0,5,0,0,1,0,0,20,0,0 +60,2,297261,5,10,6,5,0,0,1,0,0,15,0,0 +43,2,148998,1,9,2,0,4,0,1,0,0,40,0,0 +42,2,143046,1,9,0,4,3,0,1,0,0,40,0,0 +41,2,183850,1,9,2,5,0,0,0,0,0,50,0,0 +55,1,248841,3,14,1,3,1,0,0,0,1977,40,0,1 +31,2,198452,0,13,0,0,3,0,1,0,0,40,0,0 +20,2,161092,5,10,0,2,3,0,0,0,0,40,0,0 +37,2,112497,3,14,1,1,1,0,0,0,0,40,0,1 +51,1,155963,5,10,1,10,1,0,0,0,0,55,0,0 +28,2,147560,5,10,1,5,1,0,0,0,1902,55,0,1 +24,2,376393,9,11,0,5,0,0,1,0,0,40,0,0 +21,0,151790,5,10,0,0,3,0,1,0,0,30,0,0 +21,2,438139,1,9,0,5,0,0,0,0,0,50,0,0 +35,2,214896,1,9,2,0,0,0,1,0,0,45,0,0 +30,2,102821,5,10,1,10,0,0,0,0,0,40,4,0 +44,1,90021,1,9,1,10,1,0,0,0,0,30,0,0 +45,2,77085,0,13,1,10,1,2,0,0,0,40,28,1 +42,2,158555,12,6,1,1,1,0,0,0,0,40,0,0 +32,2,462255,0,13,2,1,0,0,1,0,0,40,0,0 +33,2,144949,1,9,0,2,0,0,0,0,0,40,0,0 +27,2,116207,4,5,1,10,1,0,0,0,0,32,0,0 +17,2,187308,12,6,0,4,3,0,1,0,0,15,0,0 +45,4,189890,1,9,0,0,4,0,1,0,0,40,0,0 +41,2,185267,0,13,1,3,1,0,0,0,0,40,0,0 +19,2,63434,5,10,0,8,0,0,1,0,0,35,0,0 +45,2,1366120,9,11,2,4,0,0,1,0,0,8,0,0 +41,5,495061,8,16,1,3,1,0,0,99999,0,70,0,1 +34,4,134886,1,9,1,4,2,0,1,0,1740,35,0,0 +33,2,129707,0,13,0,0,0,0,0,0,0,60,0,1 +51,2,74784,0,13,2,5,0,0,1,0,0,60,0,0 +33,2,44392,1,9,2,2,3,0,0,0,0,20,0,0 +23,2,406641,5,10,0,2,5,0,1,0,0,18,0,0 +52,2,89041,0,13,3,3,0,0,0,0,0,30,0,1 +25,2,180212,1,9,0,0,4,1,1,0,0,40,0,0 +64,1,178472,4,5,4,6,0,0,0,0,0,45,0,0 +42,2,384236,3,14,1,3,1,0,0,7688,0,40,0,1 +29,2,168470,1,9,0,6,3,0,0,0,0,40,0,0 +26,4,80485,0,13,0,3,0,0,1,0,0,38,0,0 +24,2,216867,12,6,0,4,5,0,0,0,0,30,4,0 +43,3,214541,5,10,1,1,1,0,0,0,0,40,0,1 +38,2,383239,12,6,1,10,1,0,0,3103,0,40,0,1 +28,2,70034,0,13,1,5,1,0,0,0,0,45,0,1 +44,2,128485,9,11,1,10,1,1,0,0,0,40,0,0 +55,2,106740,1,9,1,1,1,0,0,0,0,40,0,1 +52,2,167527,2,7,6,4,4,1,1,0,0,40,0,0 +31,2,19302,0,13,1,3,1,0,0,0,0,40,0,1 +35,2,210150,1,9,2,0,4,0,1,0,0,40,0,0 +39,2,179824,1,9,0,8,4,1,1,0,0,36,0,0 +27,2,420351,1,9,0,6,3,0,0,0,0,40,0,0 +23,0,215443,5,10,0,0,0,0,0,0,0,15,0,0 +26,2,116044,2,7,4,10,5,0,0,2907,0,50,0,0 +33,2,215306,9,11,0,4,0,0,0,0,0,40,1,0 +39,2,108069,5,10,0,10,4,0,1,0,0,40,0,0 +44,2,260046,1,9,2,6,0,0,0,0,0,40,0,0 +38,2,31053,1,9,2,1,4,0,1,0,0,40,0,0 +18,2,362302,14,8,0,4,3,0,0,0,0,15,0,0 +54,2,87205,1,9,6,4,0,0,1,0,0,15,0,0 +45,2,191703,1,9,0,0,3,1,1,0,0,40,0,0 +43,2,242968,3,14,1,1,1,2,0,0,0,40,3,1 +23,4,185575,0,13,0,3,3,0,1,0,0,40,0,0 +37,2,177858,5,10,0,1,0,0,0,2174,0,40,0,0 +33,1,73585,2,7,1,10,1,0,0,0,0,50,0,0 +45,2,301802,0,13,1,6,1,0,0,0,0,50,0,1 +32,5,108467,0,13,0,1,0,0,0,0,0,55,0,0 +47,2,431245,7,4,1,10,1,0,0,0,0,40,0,0 +44,2,157217,6,12,1,3,1,0,0,0,0,40,0,1 +22,2,204935,1,9,0,8,3,0,0,0,0,40,0,0 +17,2,277112,2,7,0,5,3,0,0,0,0,30,0,0 +64,5,59145,8,16,1,1,1,0,0,0,1902,60,0,1 +30,4,159773,0,13,1,11,1,0,0,0,0,45,0,1 +51,2,118793,0,13,1,3,1,0,0,0,0,70,0,1 +26,0,152457,1,9,0,11,0,0,0,0,0,40,0,0 +31,2,187901,5,10,0,5,0,0,1,0,1504,40,0,0 +50,2,266529,2,7,1,10,1,0,0,0,0,40,0,0 +63,2,113756,1,9,0,1,3,0,1,0,0,40,0,0 +48,2,83444,9,11,1,1,1,0,0,0,0,43,0,1 +37,5,30529,0,13,1,5,1,0,0,0,2415,50,0,1 +29,2,198825,1,9,0,1,0,0,1,0,0,38,0,0 +69,2,71489,3,14,1,3,1,0,0,0,0,25,0,0 +56,2,111218,1,9,1,6,1,0,0,0,0,60,0,0 +39,4,203482,3,14,1,3,1,0,0,7298,0,40,0,1 +42,1,352196,1,9,4,4,0,0,1,0,0,22,0,0 +41,3,355918,1,9,1,9,1,0,0,0,0,40,0,1 +45,2,168262,1,9,1,8,1,0,0,0,1887,40,0,1 +23,2,182615,5,10,0,0,3,0,0,0,0,40,0,0 +29,2,211482,0,13,0,3,0,0,0,0,0,50,0,1 +34,2,386370,5,10,1,10,1,0,0,0,0,50,0,0 +46,4,180010,0,13,1,3,2,0,1,0,0,40,0,1 +46,6,142210,1,9,1,8,2,0,1,0,0,25,0,0 +33,2,415706,11,3,4,4,4,0,1,0,0,40,4,0 +46,2,237731,9,11,1,0,1,0,0,0,0,40,0,0 +26,2,343506,1,9,0,4,3,1,1,0,0,40,0,0 +49,4,116163,0,13,2,3,4,0,1,0,0,50,23,0 +55,0,153451,1,9,1,9,2,0,1,0,1887,40,0,1 +35,2,301862,1,9,1,8,1,0,0,0,0,40,0,0 +27,2,33429,5,10,2,0,4,0,1,0,0,40,0,0 +31,2,169583,1,9,0,1,3,0,1,0,0,40,0,0 +47,2,146497,5,10,4,0,4,0,1,0,0,16,9,0 +48,1,383384,1,9,1,10,1,0,0,0,0,40,0,1 +27,2,240809,5,10,0,0,0,0,1,0,0,56,0,0 +38,2,203763,1,9,2,0,0,0,1,0,0,40,0,0 +27,2,218785,1,9,1,1,2,0,1,0,0,40,0,0 +17,2,244602,14,8,0,4,3,0,0,0,0,15,0,0 +44,0,175696,0,13,1,1,1,0,0,0,0,40,0,1 +26,2,101027,1,9,1,5,1,0,0,0,0,48,0,0 +37,2,99270,1,9,0,6,5,0,1,0,0,40,0,0 +49,2,224393,0,13,1,1,1,0,0,0,0,55,0,1 +42,2,192381,1,9,1,10,1,0,0,0,0,40,0,1 +26,2,131686,0,13,0,3,0,0,1,0,0,40,0,0 +44,2,277533,5,10,1,10,1,0,0,0,0,40,0,0 +47,2,72880,3,14,0,3,0,0,1,0,0,40,0,0 +49,2,209057,5,10,2,9,0,0,0,0,0,40,0,0 +17,2,108909,1,9,0,5,3,0,1,0,0,20,0,0 +42,2,74949,5,10,2,3,0,0,0,0,0,40,0,0 +30,2,235639,12,6,1,10,1,0,0,0,0,40,0,0 +36,0,137421,9,11,1,9,1,2,0,0,0,37,37,0 +53,2,122412,0,13,0,3,0,0,1,0,0,40,0,0 +23,2,434894,1,9,1,2,1,1,0,0,0,40,0,0 +35,2,379959,1,9,2,4,0,0,1,0,0,40,0,0 +32,2,95885,2,7,0,10,0,3,0,13550,0,60,0,1 +39,2,225330,0,13,6,3,4,0,1,0,0,50,12,1 +40,2,32627,3,14,1,3,1,0,0,0,0,60,0,0 +28,2,65171,5,10,1,0,1,0,0,0,0,40,0,0 +32,2,193380,1,9,0,6,3,0,0,0,0,40,0,0 +42,2,184823,5,10,0,0,3,0,1,0,0,40,0,0 +35,2,81259,0,13,0,0,0,0,1,0,0,43,0,0 +35,2,301369,14,8,0,8,4,1,1,0,0,40,0,0 +21,2,190968,1,9,0,8,3,0,0,0,0,40,0,0 +71,2,196610,7,4,6,1,0,0,0,6097,0,40,0,1 +31,2,330715,1,9,4,4,0,0,0,0,0,40,0,0 +25,4,77698,5,10,0,0,4,1,1,0,0,40,0,0 +35,2,139770,1,9,0,0,3,0,1,6849,0,40,0,0 +24,2,109053,1,9,0,4,5,0,0,0,0,25,0,0 +69,2,312653,5,10,1,5,1,0,0,0,0,25,0,0 +35,2,331831,0,13,1,5,1,0,0,0,0,40,0,0 +42,2,54202,0,13,0,5,0,0,0,10520,0,50,0,1 +51,2,163948,9,11,1,9,1,0,0,0,0,40,0,1 +48,2,36228,1,9,2,6,0,0,0,0,0,44,0,0 +49,2,160167,9,11,1,0,1,0,0,0,0,40,0,0 +53,2,178356,6,12,1,1,1,0,0,2407,0,99,0,0 +43,2,104196,5,10,1,0,1,0,0,0,0,40,0,0 +53,2,288353,0,13,1,1,1,0,0,0,0,40,0,1 +35,2,187693,1,9,0,8,3,0,0,0,0,40,0,0 +36,2,114988,1,9,0,4,0,0,1,0,0,40,0,0 +34,4,117392,3,14,0,3,0,0,1,0,0,40,0,0 +48,2,121124,5,10,1,4,1,0,0,0,0,40,0,1 +53,2,195638,1,9,2,0,0,0,1,0,0,40,0,0 +37,2,245053,5,10,2,2,3,0,0,0,1504,40,0,0 +49,0,216734,10,15,2,1,0,0,1,0,0,40,0,0 +41,2,49156,1,9,1,10,1,0,0,0,0,40,0,0 +25,2,126133,5,10,0,4,3,0,1,0,0,40,0,0 +24,2,304463,5,10,1,10,1,0,0,0,0,65,0,0 +34,2,214288,1,9,0,10,3,0,0,0,0,40,0,0 +29,2,274969,1,9,0,10,4,0,1,0,0,42,0,0 +23,2,189072,0,13,0,9,0,1,1,0,0,45,0,0 +46,2,128047,5,10,4,5,0,0,0,0,0,42,0,0 +20,2,210338,5,10,0,4,3,0,1,0,0,15,0,0 +63,2,122442,14,8,1,10,1,0,0,0,0,40,0,0 +40,1,167081,3,14,1,5,1,0,0,3103,0,50,0,0 +33,2,251421,6,12,2,3,0,0,0,0,0,50,0,0 +24,3,219519,5,10,0,0,3,1,1,0,0,40,0,0 +36,2,33355,5,10,0,4,3,0,0,0,0,45,0,0 +25,2,441210,1,9,0,3,3,0,0,0,0,40,0,0 +54,4,178356,4,5,1,4,1,0,0,0,0,40,0,0 +50,1,231196,0,13,2,5,0,0,0,0,0,50,0,0 +58,0,40925,0,13,1,1,1,0,0,0,0,40,0,0 +17,2,270587,2,7,0,4,3,0,0,0,0,20,7,0 +40,2,219266,1,9,1,1,1,0,0,7688,0,50,0,1 +27,2,114967,0,13,0,5,3,0,0,0,0,40,0,0 +20,2,344492,1,9,4,5,3,0,1,0,0,26,0,0 +22,2,369387,2,7,1,10,1,0,0,0,0,35,0,0 +80,1,101771,2,7,1,1,1,0,0,0,0,25,0,0 +52,2,137428,1,9,2,6,0,0,0,0,0,45,0,0 +40,3,121012,0,13,1,0,1,0,0,7298,0,48,0,1 +48,2,139290,12,6,4,8,3,0,1,0,0,48,0,0 +62,2,199193,1,9,1,2,1,0,0,0,0,25,0,0 +32,2,286689,6,12,1,9,1,0,0,0,0,42,0,1 +58,3,208640,0,13,1,1,1,0,0,0,0,40,0,1 +37,1,120130,3,14,1,1,1,0,0,0,0,60,0,1 +29,5,241431,8,16,1,3,1,0,0,0,0,35,0,1 +25,2,120450,1,9,0,4,0,0,0,0,0,40,0,0 +26,2,152240,5,10,0,8,3,0,0,0,0,40,0,0 +50,2,200960,5,10,1,5,1,0,0,0,0,50,0,0 +30,3,314310,0,13,1,3,1,0,0,0,0,40,0,1 +30,4,44566,0,13,1,3,1,0,0,0,0,80,0,0 +59,2,21792,1,9,6,4,0,0,1,0,0,10,0,0 +36,2,182074,1,9,0,2,3,0,0,0,0,40,0,0 +37,2,221850,3,14,1,1,1,0,0,0,0,50,16,1 +42,2,240628,0,13,1,1,2,0,1,0,0,40,0,1 +34,2,318641,0,13,1,1,1,1,0,0,0,45,0,1 +27,1,140863,4,5,1,10,1,0,0,0,0,40,0,0 +39,2,129150,0,13,1,9,1,0,0,0,0,50,0,1 +41,2,143003,9,11,1,4,1,2,0,7298,0,60,3,1 +34,1,198664,0,13,1,10,1,2,0,15024,0,70,27,1 +41,2,244945,5,10,1,1,1,0,0,0,0,40,0,0 +50,2,138514,5,10,2,0,4,1,1,0,0,40,0,0 +18,2,92008,1,9,0,2,5,0,1,0,0,28,0,0 +23,2,207415,0,13,0,1,3,0,1,0,0,15,0,0 +26,2,188626,1,9,1,10,1,0,0,0,0,48,0,0 +38,2,257250,5,10,1,6,1,0,0,7298,0,60,0,1 +27,2,133696,5,10,1,3,1,0,0,0,0,88,0,0 +21,2,195919,12,6,0,2,0,4,0,0,0,40,21,0 +41,2,119266,1,9,1,4,1,0,0,0,0,40,0,0 +42,1,140474,6,12,2,10,3,3,0,0,0,35,0,0 +25,2,69739,12,6,0,8,3,0,0,0,0,40,0,0 +43,2,293176,0,13,1,5,1,0,0,0,0,40,0,1 +23,2,217961,5,10,0,2,3,0,0,0,0,15,0,0 +40,4,163725,0,13,1,3,1,0,0,7688,0,40,0,1 +23,2,419394,5,10,0,5,3,1,0,0,0,9,0,0 +18,2,220836,2,7,0,4,0,0,1,0,0,20,0,0 +37,2,334291,0,13,0,1,0,0,0,0,0,50,0,0 +58,2,298601,4,5,1,8,1,1,0,3781,0,40,0,0 +36,2,200360,5,10,0,10,0,0,0,0,0,40,0,0 +36,2,203482,6,12,1,3,1,0,0,0,0,40,0,1 +25,2,99126,9,11,1,3,2,0,1,7688,0,40,0,1 +62,2,109190,0,13,1,1,1,0,0,15024,0,40,0,1 +34,2,34848,5,10,1,6,1,0,0,4064,0,40,0,0 +27,2,29732,0,13,0,3,0,0,1,4865,0,36,0,0 +23,2,87867,1,9,0,5,3,0,0,0,0,35,0,0 +55,2,123515,1,9,2,0,0,0,1,0,0,40,0,0 +42,2,175935,1,9,1,8,1,0,0,0,0,40,0,0 +22,2,229456,1,9,0,0,3,1,1,0,0,38,0,0 +44,2,184105,6,12,1,5,1,0,0,4386,0,40,0,1 +42,4,99554,5,10,1,6,1,0,0,0,0,40,0,0 +21,2,190227,1,9,0,0,4,0,0,0,0,40,0,0 +25,2,29020,6,12,2,0,0,1,1,0,0,45,0,0 +31,2,306459,15,2,4,2,4,0,0,0,0,35,6,0 +42,2,193995,5,10,2,10,0,0,0,0,0,38,0,0 +26,2,105059,4,5,1,10,1,0,0,0,0,20,0,0 +62,2,71751,5,10,1,1,1,0,0,0,1977,98,0,1 +28,2,176683,0,13,1,1,1,0,0,5178,0,50,0,1 +34,2,342709,3,14,1,1,1,0,0,0,0,40,0,0 +51,2,53838,0,13,1,2,1,0,0,0,0,40,0,0 +45,4,209482,3,14,1,3,2,0,1,0,0,45,0,1 +44,2,214242,5,10,1,6,1,0,0,0,0,50,0,1 +35,2,100375,5,10,3,7,3,0,0,0,0,40,0,0 +46,2,149949,7,4,1,6,1,0,0,0,0,40,0,0 +46,2,189762,6,12,0,9,0,0,0,0,0,56,0,0 +46,2,79874,0,13,1,1,1,0,0,0,0,53,0,1 +66,1,104576,0,13,1,1,1,0,0,0,0,8,0,1 +34,0,355700,1,9,4,0,4,0,1,0,0,20,0,0 +26,2,213625,6,12,1,5,1,0,0,0,0,40,0,0 +29,2,204984,1,9,1,10,1,0,0,0,0,40,0,1 +23,2,217169,0,13,0,0,3,0,1,0,0,40,0,0 +46,2,184883,4,5,1,8,2,0,1,0,0,40,0,0 +54,2,57758,3,14,1,5,1,0,0,0,0,68,0,1 +54,1,30908,7,4,1,7,1,0,0,0,0,60,0,0 +71,2,217971,4,5,6,5,4,0,1,0,0,13,0,0 +51,2,160703,14,8,1,10,1,0,0,0,0,45,0,0 +32,2,142675,1,9,0,10,0,0,0,0,0,40,0,0 +57,2,171242,2,7,3,10,0,0,0,0,0,40,8,0 +34,2,376979,4,5,0,10,0,0,0,0,0,40,0,0 +40,2,175935,0,13,2,5,0,0,0,14084,0,40,0,1 +21,2,277530,1,9,0,1,3,0,1,0,0,40,0,0 +50,2,104501,3,14,1,3,1,0,0,0,0,40,0,1 +32,2,94041,9,11,0,10,0,0,0,0,0,44,38,0 +37,4,593246,0,13,1,3,2,0,1,0,0,50,0,1 +19,2,121074,7,4,1,10,1,0,0,0,0,99,0,0 +64,2,192596,1,9,6,0,0,0,1,0,0,30,0,0 +17,2,142457,2,7,0,4,3,1,0,0,0,20,0,0 +37,2,136028,9,11,1,4,1,0,0,0,0,40,0,0 +32,2,216145,5,10,0,10,0,0,0,4650,0,45,0,0 +20,2,157894,5,10,0,4,3,1,0,0,0,20,0,0 +39,1,164593,8,16,0,3,0,0,0,4787,0,40,0,1 +18,2,252993,14,8,0,2,3,0,0,0,0,40,13,0 +42,2,145711,3,14,1,3,1,0,0,0,1902,50,0,1 +43,2,358199,5,10,1,5,1,0,0,3103,0,40,0,1 +42,2,219591,0,13,1,0,1,0,0,0,0,55,0,1 +53,4,205005,0,13,1,3,2,0,1,0,0,60,0,1 +52,2,221936,1,9,1,5,1,0,0,0,0,40,0,0 +51,2,120914,12,6,0,7,3,0,0,0,0,40,0,0 +77,5,155761,5,10,1,5,1,0,0,0,0,8,0,0 +25,2,195914,5,10,0,5,3,1,1,3418,0,30,0,0 +38,4,236687,5,10,0,3,3,0,0,0,0,40,0,0 +20,2,318036,1,9,0,4,0,0,0,0,0,40,0,0 +23,2,53306,1,9,0,10,0,0,0,0,0,30,0,0 +27,2,174645,1,9,0,0,3,0,1,0,0,40,0,0 +19,2,321817,2,7,0,4,3,0,1,0,0,40,0,0 +41,2,206948,0,13,1,5,1,0,0,0,0,40,0,1 +47,3,402975,5,10,1,1,1,1,0,0,0,40,0,0 +42,2,367049,3,14,0,1,0,0,1,4650,0,40,0,0 +36,2,143486,0,13,1,5,1,0,0,0,0,40,0,1 +42,5,27187,3,14,1,7,1,0,0,0,0,60,0,1 +24,2,187717,0,13,0,0,3,0,1,0,0,40,0,0 +22,2,378104,1,9,0,2,3,0,0,0,0,40,0,0 +42,2,252518,10,15,1,1,1,0,0,15024,0,40,0,1 +24,2,326334,0,13,0,3,3,0,0,0,0,20,0,0 +41,2,279914,5,10,1,0,1,0,0,0,0,45,0,1 +29,2,320451,1,9,0,11,0,2,0,0,0,40,11,0 +36,2,207853,1,9,2,10,3,0,0,0,0,40,0,0 +78,5,237294,1,9,6,5,0,0,0,0,0,45,0,1 +43,2,112181,9,11,1,9,2,0,1,0,1902,32,0,1 +34,0,259705,5,10,4,1,3,0,1,0,0,40,0,0 +24,2,449432,14,8,1,10,1,0,0,0,0,40,0,0 +36,3,89083,9,11,1,9,1,0,0,0,0,40,0,0 +49,2,59612,5,10,1,5,1,0,0,0,0,44,0,0 +21,2,129980,4,5,0,6,3,0,0,0,0,40,0,0 +51,2,108233,6,12,4,4,0,1,1,0,0,40,0,0 +30,2,342709,1,9,1,9,1,0,0,0,0,40,0,0 +37,2,126675,1,9,0,10,0,0,0,0,0,40,0,0 +30,2,141118,9,11,0,0,0,0,1,0,0,40,0,0 +46,2,173243,1,9,1,10,1,0,0,0,0,40,0,0 +24,4,161092,1,9,0,4,3,0,0,0,0,40,0,0 +32,2,209691,0,13,1,5,1,0,0,0,0,42,0,1 +36,2,89508,5,10,2,3,0,0,0,0,0,50,0,0 +30,2,399522,2,7,3,2,4,0,1,0,0,40,0,0 +60,0,136939,5,10,1,6,1,0,0,0,0,40,0,0 +56,4,264436,5,10,2,1,0,0,1,0,0,40,0,0 +57,2,199572,2,7,1,8,1,0,0,0,0,40,0,0 +61,3,28291,0,13,1,1,2,0,1,0,0,40,0,0 +50,2,215990,1,9,1,10,1,0,0,0,0,40,0,1 +56,1,179594,1,9,1,1,1,0,0,0,0,48,0,0 +61,5,139391,5,10,1,5,1,0,0,0,1902,35,0,1 +45,2,187370,3,14,2,1,4,0,0,7430,0,70,0,1 +31,2,473133,3,14,1,3,1,0,0,5178,0,40,0,1 +60,1,205246,1,9,0,1,0,1,0,0,2559,50,0,1 +26,2,182308,5,10,1,3,1,0,0,0,0,40,0,0 +56,1,51662,2,7,1,4,2,0,1,0,0,40,0,0 +45,2,289468,2,7,6,4,4,0,1,0,0,40,0,0 +28,2,201954,6,12,0,1,0,0,0,0,0,65,0,1 +45,1,26781,5,10,1,1,1,3,0,0,0,40,0,0 +58,2,100960,4,5,1,2,1,0,0,0,0,40,0,0 +38,2,203761,9,11,0,9,0,0,1,2354,0,40,0,0 +23,2,213811,0,13,0,1,3,0,1,0,0,40,0,0 +49,2,124672,1,9,1,10,1,0,0,0,0,40,0,1 +19,2,219300,5,10,0,5,3,0,1,0,0,25,0,0 +22,2,270436,1,9,0,4,3,0,0,0,0,40,0,0 +23,2,212619,1,9,1,8,1,0,0,0,0,50,0,0 +23,2,193586,1,9,1,0,2,0,1,3908,0,40,0,0 +40,2,84136,1,9,1,10,1,0,0,0,0,25,0,0 +55,3,264834,0,13,0,3,0,0,1,0,0,40,0,0 +34,0,98995,9,11,0,3,0,0,1,0,0,40,0,0 +21,2,278254,1,9,1,8,1,1,0,0,0,40,0,0 +28,2,167987,1,9,0,4,3,0,1,0,0,40,0,0 +43,3,72887,0,13,3,9,0,2,0,0,0,40,0,0 +17,2,176467,4,5,0,6,0,0,0,0,0,20,0,0 +51,1,85902,12,6,6,6,5,0,1,0,0,40,0,0 +37,2,223433,1,9,1,5,1,0,0,0,0,40,0,1 +54,5,108435,0,13,1,5,1,0,0,0,0,50,0,1 +24,2,172496,0,13,0,5,0,0,0,0,0,30,0,0 +35,2,241998,1,9,1,10,1,0,0,0,0,40,0,1 +48,2,245948,1,9,0,8,0,1,1,2174,0,40,0,0 +23,2,187513,9,11,0,8,3,0,0,0,0,40,0,0 +24,2,440138,1,9,0,13,0,0,1,0,0,45,7,0 +24,2,218215,9,11,0,0,3,0,1,0,0,20,0,0 +50,2,158948,7,4,1,10,1,0,0,3411,0,40,0,0 +34,2,94413,1,9,1,6,1,0,0,0,0,40,0,1 +45,2,183598,1,9,2,0,0,0,1,0,0,40,0,0 +36,2,192664,2,7,0,10,3,0,0,0,0,40,0,0 +33,2,392812,0,13,1,1,1,0,0,0,0,45,0,1 +21,2,155818,1,9,0,4,3,0,1,0,0,20,0,0 +32,2,195000,1,9,1,10,1,0,0,0,0,40,0,0 +22,2,308205,11,3,0,7,5,0,0,0,0,40,4,0 +53,2,104879,1,9,1,9,1,0,0,0,0,40,0,1 +36,2,152307,1,9,1,8,1,0,0,0,0,40,0,0 +22,2,145964,0,13,0,5,3,0,0,0,0,40,0,0 +47,2,97419,1,9,1,11,2,1,1,0,0,40,0,0 +30,2,263150,1,9,2,8,4,0,1,0,0,20,0,0 +23,2,151888,5,10,0,5,3,0,0,0,0,40,0,0 +40,2,254167,12,6,4,6,3,0,0,0,0,35,0,0 +45,4,331482,6,12,2,9,3,0,0,0,0,40,0,0 +61,4,177189,0,13,1,3,1,0,0,0,0,42,0,0 +35,2,186886,1,9,2,1,4,0,1,0,0,55,0,0 +20,2,33221,5,10,0,4,3,0,1,0,0,25,0,0 +27,2,188171,12,6,0,0,3,0,0,0,0,60,0,0 +23,2,209770,1,9,0,0,3,0,1,0,0,40,0,0 +65,4,180869,5,10,6,0,0,0,1,0,0,35,0,0 +25,2,190350,1,9,0,0,4,1,1,0,0,40,0,0 +49,2,137192,0,13,1,5,1,2,0,0,1977,50,27,1 +45,2,204057,0,13,2,0,4,0,1,0,0,40,9,0 +46,2,198774,3,14,2,1,4,0,1,0,323,45,0,0 +67,2,134906,1,9,6,5,0,0,1,0,0,32,0,0 +40,2,174515,1,9,6,8,4,0,1,0,0,40,0,0 +51,2,259363,5,10,1,1,1,0,0,0,0,60,0,1 +44,1,201742,0,13,1,1,1,0,0,0,2415,50,0,1 +35,2,209609,1,9,1,6,1,0,0,0,0,60,0,0 +28,2,185127,5,10,0,5,0,0,0,0,0,40,0,0 +44,2,462838,1,9,2,2,0,0,1,0,0,48,0,0 +37,2,176967,5,10,1,10,1,0,0,0,0,50,0,1 +54,2,284129,5,10,1,6,1,0,0,0,0,45,0,1 +33,3,37546,10,15,1,3,2,0,1,0,0,40,0,1 +46,2,116666,1,9,2,1,0,0,1,0,0,40,0,0 +45,2,120724,3,14,1,1,1,0,0,4386,0,40,0,0 +27,2,314240,6,12,0,1,0,0,0,3325,0,40,0,0 +49,2,423222,3,14,1,5,1,0,0,0,0,50,0,1 +51,2,201127,1,9,2,5,0,0,0,0,0,45,0,0 +27,2,202239,1,9,1,2,1,0,0,0,0,40,0,0 +36,2,209629,1,9,1,8,1,0,0,0,0,40,0,0 +59,2,165922,0,13,1,3,1,0,0,15024,0,40,0,1 +24,2,133520,5,10,0,5,3,0,1,0,0,15,0,0 +31,2,176410,1,9,0,4,3,0,1,0,0,38,0,0 +35,3,103214,8,16,0,3,0,3,1,0,0,60,0,1 +34,2,122612,0,13,1,4,2,2,1,7688,0,50,11,1 +50,2,226735,5,10,1,11,1,1,0,0,0,70,0,1 +43,5,151089,1,9,1,5,1,0,0,0,0,50,0,0 +21,2,244312,4,5,0,10,3,0,0,0,0,30,22,0 +33,2,209317,4,5,0,4,0,0,0,0,0,45,22,0 +48,2,99096,5,10,2,0,0,0,1,0,1590,38,0,0 +22,2,374116,1,9,0,13,3,0,1,0,0,36,0,0 +29,2,205249,3,14,1,1,1,2,0,0,0,40,28,0 +42,1,326083,9,11,1,3,1,0,0,0,0,40,0,0 +28,1,183523,1,9,1,10,1,0,0,0,0,50,39,0 +36,2,350783,1,9,0,3,0,0,1,0,0,38,0,0 +66,4,140849,1,9,6,4,0,0,1,0,0,25,0,0 +44,2,175943,0,13,1,3,2,0,1,0,0,20,0,0 +45,4,125933,5,10,2,0,4,1,1,0,0,40,0,0 +49,2,225124,1,9,2,4,3,1,1,0,0,40,0,0 +36,2,272090,0,13,2,3,4,0,1,0,0,45,22,0 +48,2,40666,2,7,1,2,1,0,0,0,0,60,0,0 +19,2,35245,1,9,0,6,3,0,0,0,0,40,0,0 +36,2,167482,0,13,1,0,1,0,0,0,0,40,0,1 +41,2,204662,3,14,1,1,1,0,0,0,0,45,0,1 +32,2,291147,5,10,1,5,1,0,0,0,0,50,0,0 +49,2,179869,1,9,1,10,1,0,0,0,0,40,0,1 +51,1,205100,1,9,1,1,2,0,1,0,0,40,0,0 +20,2,352139,5,10,2,4,3,0,1,0,0,29,0,0 +39,2,111268,0,13,0,0,3,0,1,0,0,40,0,0 +38,2,247111,1,9,1,9,1,0,0,0,0,40,0,1 +19,2,271446,5,10,0,4,3,0,1,0,0,25,0,0 +29,4,132412,0,13,0,2,3,0,0,0,0,40,0,0 +52,5,74712,1,9,1,5,1,2,0,0,0,40,0,1 +22,2,94662,9,11,0,10,0,0,0,0,0,44,0,0 +44,5,33126,5,10,1,1,1,0,0,0,0,80,0,0 +43,2,133584,1,9,2,10,0,0,0,0,0,40,0,0 +41,4,103759,5,10,1,6,1,0,0,3942,0,40,0,0 +40,2,374367,9,11,4,5,0,1,0,0,0,44,0,0 +40,2,179666,0,13,0,1,0,0,0,0,0,30,8,0 +18,2,99219,2,7,0,5,3,0,1,0,0,15,0,0 +57,5,180211,10,15,1,3,1,2,0,0,0,50,18,1 +54,4,219276,0,13,1,1,1,2,0,0,0,40,11,1 +44,2,150011,0,13,2,3,4,0,1,0,0,40,0,0 +20,2,231231,5,10,0,5,0,0,0,0,0,30,0,0 +40,2,182217,5,10,1,4,2,0,1,0,0,40,32,0 +29,2,277342,5,10,0,6,4,0,0,0,0,40,0,0 +22,2,140001,0,13,0,0,0,0,0,0,0,40,0,0 +44,2,99651,3,14,1,1,1,0,0,5178,0,40,0,1 +45,2,223319,5,10,2,5,3,0,0,0,0,45,0,0 +52,2,235307,0,13,1,3,1,0,0,0,0,40,0,1 +57,2,206343,1,9,4,8,0,0,0,2174,0,40,1,0 +51,4,156003,1,9,2,11,0,0,0,0,0,40,0,0 +23,2,529223,0,13,0,5,3,1,0,0,0,10,0,0 +22,2,202871,9,11,1,4,1,0,0,0,0,44,0,0 +37,2,58337,5,10,2,1,0,0,1,0,0,40,0,1 +58,3,298643,1,9,2,0,4,1,1,0,0,40,0,0 +61,2,191188,12,6,6,7,4,0,0,0,0,20,0,0 +30,2,96287,3,14,0,3,0,0,1,0,0,45,0,0 +23,2,104443,5,10,0,0,3,0,1,0,0,40,0,0 +30,2,323054,12,6,2,4,0,3,0,0,0,40,0,0 +18,2,95917,1,9,0,4,3,0,0,0,0,25,8,0 +23,2,49296,1,9,0,2,5,1,0,0,0,40,0,0 +23,2,50953,5,10,0,13,3,0,1,0,0,10,0,0 +57,2,124507,0,13,1,5,1,0,0,0,0,55,0,1 +58,2,239523,1,9,1,1,1,0,0,0,0,45,0,1 +59,1,309124,1,9,1,6,1,0,0,0,0,40,0,1 +27,2,240172,0,13,3,0,0,0,0,0,0,40,0,0 +50,2,105010,0,13,1,7,1,0,0,0,0,45,0,1 +25,2,178478,0,13,0,9,3,0,1,0,0,40,0,0 +33,2,23871,1,9,2,4,4,0,1,0,0,30,0,0 +22,2,362309,5,10,0,4,3,0,0,0,0,35,0,0 +21,2,257781,5,10,0,10,3,0,0,0,1719,30,0,0 +44,2,175669,2,7,1,3,2,0,1,5178,0,36,0,1 +50,2,297906,5,10,1,5,1,2,0,0,0,50,0,1 +44,2,230684,1,9,1,6,1,0,0,0,0,45,0,0 +41,2,170866,0,13,1,1,1,0,0,0,0,50,0,1 +54,4,182543,5,10,6,0,4,0,1,0,0,40,4,0 +60,1,236470,7,4,1,7,1,0,0,0,0,40,0,0 +58,2,33725,3,14,2,3,0,0,0,0,0,20,0,0 +27,2,188941,5,10,1,9,1,0,0,3908,0,40,0,0 +43,2,206878,1,9,0,0,4,0,1,0,0,60,0,0 +33,4,173806,6,12,1,2,1,0,0,0,0,40,0,0 +24,2,190709,5,10,1,6,1,0,0,0,0,65,0,0 +41,2,149102,1,9,0,6,0,0,0,0,0,40,12,0 +21,2,25265,1,9,0,10,3,0,0,0,0,40,0,0 +39,2,100669,5,10,1,10,3,2,0,0,0,40,0,0 +27,5,114158,0,13,0,1,3,0,1,0,0,40,0,0 +50,2,228057,1,9,1,6,1,0,0,0,0,40,0,0 +20,2,54012,1,9,0,2,3,0,0,0,0,40,0,0 +46,3,219967,0,13,1,1,1,0,0,0,0,40,0,1 +49,2,239865,2,7,1,6,1,0,0,0,0,40,0,0 +35,0,119421,0,13,1,1,2,0,1,0,0,35,0,1 +56,1,220187,5,10,1,4,1,0,0,0,0,45,0,1 +41,4,33068,3,14,2,3,0,0,0,0,1974,40,0,0 +41,1,277783,5,10,2,10,0,0,0,0,2001,50,0,0 +42,2,175515,1,9,1,10,1,0,0,0,0,40,0,0 +58,4,271795,7,4,1,10,1,0,0,0,0,40,0,0 +43,2,70055,5,10,1,0,1,0,0,0,0,40,0,0 +25,2,352806,1,9,2,4,0,0,1,0,0,40,4,0 +57,2,266189,1,9,2,0,4,0,1,0,0,42,0,0 +49,2,102945,7,4,6,8,0,0,1,0,0,40,0,0 +23,2,173851,5,10,1,2,1,0,0,0,0,40,0,0 +59,2,144092,1,9,1,10,1,0,0,0,0,40,0,0 +50,2,198681,5,10,1,6,1,0,0,0,0,70,0,1 +33,2,351810,0,13,0,3,0,0,1,0,0,45,4,0 +52,2,180142,3,14,1,9,1,0,0,0,0,45,0,0 +37,5,175360,1,9,1,10,1,0,0,0,0,40,0,1 +30,5,224498,1,9,2,0,4,0,1,0,0,40,0,0 +39,5,154641,1,9,2,10,4,0,0,0,0,60,0,0 +54,4,152540,5,10,2,10,4,0,0,0,0,42,0,0 +52,2,217663,1,9,1,5,1,0,0,0,0,45,0,1 +22,4,138575,1,9,0,11,4,0,0,0,0,56,0,0 +65,2,101104,1,9,1,5,1,0,0,9386,0,10,0,1 +32,2,44677,0,13,0,0,0,0,0,0,0,40,0,0 +25,2,456618,7,4,0,8,4,0,0,0,0,40,22,0 +34,2,227282,5,10,0,10,0,0,0,0,0,40,0,0 +47,2,27624,9,11,0,4,0,0,1,0,0,55,0,0 +24,2,281403,1,9,0,7,3,0,0,0,0,98,0,0 +63,3,39181,8,16,2,1,0,0,1,0,2559,60,0,1 +48,2,377140,11,3,0,13,4,0,1,0,0,35,35,0 +26,2,299810,1,9,0,5,0,0,1,0,0,50,0,0 +28,2,181916,5,10,4,8,0,0,0,0,0,40,0,0 +23,2,237044,1,9,0,4,3,1,0,0,0,12,0,0 +57,5,123053,10,15,1,3,1,2,0,15024,0,50,3,1 +64,0,269512,0,13,2,9,0,0,0,0,0,40,0,0 +28,2,44767,0,13,0,1,3,0,0,0,0,50,0,1 +28,2,67218,7,4,1,5,5,0,0,0,0,40,0,0 +34,2,176992,5,10,1,8,1,0,0,0,0,40,0,0 +38,1,43712,2,7,1,1,1,0,0,0,1887,45,0,1 +44,2,379919,6,12,1,7,1,0,0,0,0,60,0,1 +34,2,104509,9,11,0,3,0,0,1,1639,0,20,0,0 +18,2,212370,1,9,1,10,1,0,0,0,0,25,0,0 +36,2,179666,14,8,1,10,1,4,0,0,0,40,0,0 +73,1,233882,1,9,1,7,1,2,0,0,2457,40,36,0 +24,2,197387,1,9,0,4,3,0,0,0,0,40,4,0 +29,4,220656,0,13,1,1,1,1,0,0,0,40,0,1 +33,2,181091,5,10,1,3,1,0,0,0,0,40,0,0 +57,3,135028,1,9,4,0,5,1,1,0,0,35,0,0 +55,2,106498,12,6,6,6,0,1,1,0,0,35,0,0 +21,2,203003,12,6,1,10,1,0,0,0,0,40,0,0 +36,1,223789,3,14,1,3,1,0,0,0,0,45,0,1 +26,2,184026,5,10,0,3,0,4,0,0,0,50,0,0 +40,2,65866,5,10,2,9,4,0,1,0,213,40,0,0 +32,2,372692,1,9,1,10,1,0,0,0,0,40,0,0 +21,2,45607,5,10,0,4,3,0,1,0,0,40,0,0 +59,0,303176,5,10,1,1,1,0,0,0,2179,40,0,0 +29,2,138190,1,9,0,5,4,1,1,0,1138,40,0,0 +29,1,212895,5,10,2,8,0,0,0,0,0,48,0,0 +59,5,31359,3,14,1,1,1,0,0,15024,0,80,0,1 +58,2,147989,1,9,1,6,1,0,0,0,0,40,0,1 +47,2,145290,1,9,1,8,1,0,0,0,0,45,0,0 +44,2,262684,1,9,2,0,0,0,1,0,1504,45,0,0 +31,2,132601,1,9,0,4,3,0,0,0,0,40,0,0 +42,1,30759,1,9,1,10,1,0,0,0,0,35,0,0 +19,2,319889,1,9,0,4,3,0,0,0,0,25,0,0 +66,2,29431,1,9,1,5,1,0,0,0,0,50,0,0 +41,2,111483,1,9,1,8,1,0,0,0,0,45,0,0 +22,2,184756,5,10,0,5,3,0,1,0,0,30,0,0 +31,2,651396,1,9,0,5,3,0,1,0,1594,30,0,0 +30,2,187560,0,13,0,5,0,0,0,0,0,40,0,0 +36,1,84848,1,9,4,4,0,0,1,0,0,16,0,0 +41,0,88913,6,12,2,3,4,2,1,0,0,36,0,0 +19,2,73190,5,10,0,2,3,0,0,0,0,20,0,0 +60,2,132529,1,9,1,4,1,0,0,0,0,40,0,0 +24,2,214542,2,7,0,6,3,0,0,0,0,40,0,0 +25,2,217006,2,7,1,8,1,0,0,0,0,40,0,0 +52,2,169785,5,10,0,1,0,0,1,0,0,50,0,0 +30,2,75573,0,13,0,1,0,0,1,0,0,45,9,0 +37,2,239171,1,9,1,10,1,0,0,0,0,40,0,1 +55,1,53566,8,16,2,1,0,0,1,0,0,30,0,0 +20,2,117109,5,10,0,0,5,1,1,0,0,24,0,0 +32,2,398019,7,4,0,13,0,0,1,0,0,15,4,0 +18,2,114008,1,9,0,4,3,0,0,0,0,35,0,0 +24,2,204653,5,10,0,10,3,0,0,0,0,40,0,0 +33,4,254935,5,10,1,11,1,0,0,0,0,45,0,0 +57,4,198145,3,14,1,11,1,0,0,0,0,14,0,1 +53,2,174020,3,14,2,3,4,0,1,0,1876,38,0,0 +19,2,451951,1,9,0,5,0,0,1,0,0,40,0,0 +50,4,172175,10,15,1,3,1,0,0,0,0,40,0,1 +27,2,209472,0,13,0,1,0,0,0,0,0,50,0,0 +40,2,336707,9,11,4,10,0,0,1,0,0,60,0,0 +47,5,156728,1,9,1,5,1,0,0,0,0,55,0,0 +39,3,290321,9,11,1,3,1,0,0,0,0,50,0,0 +49,0,206577,5,10,2,0,3,0,0,0,0,40,0,0 +28,1,149324,5,10,1,3,1,0,0,0,0,7,0,0 +50,2,98975,0,13,1,1,1,0,0,15024,0,40,0,1 +28,2,181659,2,7,0,6,3,0,0,0,0,50,0,0 +30,2,174789,1,9,1,5,1,0,0,0,0,40,0,0 +47,2,102308,3,14,1,1,1,0,0,99999,0,50,0,1 +39,2,184801,0,13,1,3,1,0,0,0,0,40,0,1 +37,2,176014,1,9,1,5,1,0,0,0,0,50,0,0 +50,2,256861,1,9,1,5,1,0,0,0,0,80,0,0 +37,2,239397,12,6,1,8,1,0,0,0,0,40,4,0 +26,2,233777,1,9,1,8,1,0,0,0,0,40,0,1 +55,2,236520,9,11,1,10,1,0,0,0,0,40,0,1 +46,2,70754,0,13,1,3,1,0,0,0,0,40,0,1 +32,2,245378,1,9,1,5,1,0,0,0,0,60,0,0 +26,2,176729,0,13,0,10,0,0,0,0,0,45,0,1 +32,2,154120,1,9,1,6,1,0,0,7298,0,40,0,1 +43,2,88913,5,10,0,2,3,2,1,1055,0,40,0,0 +19,2,517036,1,9,2,10,0,0,1,0,0,40,22,0 +38,2,436361,1,9,2,4,0,0,1,0,0,75,0,0 +38,2,231037,11,3,1,5,1,0,0,0,0,40,4,0 +65,2,209831,9,11,1,0,2,0,1,0,0,40,0,0 +70,1,143833,5,10,1,1,1,0,0,0,2246,40,0,1 +44,2,215468,0,13,4,8,4,1,1,0,0,7,0,0 +32,2,200700,5,10,0,5,0,0,0,0,0,50,0,0 +30,4,191777,1,9,0,11,3,1,1,0,0,40,0,0 +49,3,195437,6,12,1,0,1,0,0,0,0,60,0,1 +23,2,149396,1,9,0,0,3,1,1,0,0,40,0,0 +25,2,104746,5,10,1,2,1,0,0,0,0,16,0,0 +19,2,108147,5,10,0,0,3,0,1,0,0,15,0,0 +27,2,238859,9,11,0,10,0,0,0,0,0,40,0,0 +43,0,23157,1,9,0,6,0,0,0,0,0,60,0,0 +38,2,497788,1,9,1,10,1,0,0,0,0,50,0,0 +42,2,141558,3,14,1,3,1,0,0,0,0,60,0,0 +33,3,117963,0,13,0,0,3,0,0,0,0,38,0,0 +30,2,232356,0,13,1,1,1,0,0,0,0,40,0,1 +29,2,157941,0,13,0,9,0,0,0,0,0,40,0,0 +30,2,103642,2,7,1,10,1,0,0,0,0,40,0,0 +26,2,169727,1,9,1,9,1,0,0,0,0,40,0,0 +43,2,274731,0,13,1,3,1,0,0,0,0,40,0,1 +30,2,161572,1,9,1,4,2,0,1,0,0,45,0,0 +38,2,48779,5,10,1,6,1,0,0,0,0,40,0,1 +48,2,141511,3,14,1,1,1,0,0,0,0,40,0,1 +57,2,314153,0,13,1,5,1,0,0,0,1887,55,0,1 +30,2,168334,1,9,1,5,2,0,1,0,0,30,0,0 +42,4,267252,3,14,4,1,4,1,0,0,0,45,0,1 +31,1,312055,1,9,1,1,1,0,0,0,0,70,0,0 +32,2,207937,5,10,0,10,0,0,0,0,0,40,0,0 +28,2,232653,0,13,1,1,1,0,0,0,0,40,0,0 +63,2,246841,1,9,1,2,1,0,0,0,0,40,0,0 +32,2,154087,1,9,1,6,1,0,0,0,0,40,0,0 +20,2,199011,5,10,0,2,3,0,0,0,0,12,0,0 +51,1,205100,3,14,1,3,2,0,1,0,0,30,0,1 +24,2,50400,5,10,1,5,1,3,0,0,0,40,0,0 +41,4,97064,9,11,2,0,4,0,1,0,0,44,0,0 +21,2,65038,1,9,0,8,3,0,0,0,0,40,0,0 +27,2,292472,5,10,0,10,0,2,0,0,1876,45,14,0 +17,2,225211,4,5,0,4,3,1,0,0,0,35,0,0 +45,2,320192,15,2,1,4,2,0,1,0,0,40,0,0 +39,0,119421,1,9,4,0,4,0,1,0,625,35,0,0 +21,2,83580,5,10,0,3,3,3,1,0,0,4,0,0 +29,2,133696,0,13,0,3,0,0,0,8614,0,45,0,1 +39,2,141584,3,14,0,5,0,0,0,0,2444,45,0,1 +42,2,529216,1,9,4,6,5,1,0,0,0,40,0,0 +22,2,390817,11,3,1,10,5,0,0,0,0,40,4,0 +59,2,155976,1,9,6,0,0,0,1,0,0,40,0,0 +40,2,221172,3,14,1,1,1,0,0,0,0,65,0,1 +45,2,270842,5,10,2,4,0,0,1,0,0,40,0,0 +35,2,82622,1,9,2,1,0,0,0,0,0,50,0,0 +58,2,371064,1,9,1,7,1,0,0,0,0,20,0,0 +45,2,54744,5,10,1,10,1,0,0,0,1848,40,0,1 +29,2,22641,1,9,1,8,1,3,0,0,0,45,0,0 +21,2,218957,2,7,0,10,3,0,0,0,0,45,0,0 +51,2,441637,1,9,1,9,1,0,0,0,0,40,0,0 +34,4,143699,5,10,1,4,2,0,1,0,0,40,0,0 +40,2,183096,0,13,2,0,0,0,1,0,0,35,0,0 +45,2,97176,2,7,2,0,4,0,1,0,0,16,0,0 +38,1,122493,12,6,1,5,1,0,0,0,1887,40,0,1 +22,2,311376,0,13,0,0,3,0,1,0,0,40,0,0 +37,2,78928,4,5,1,4,1,0,0,3137,0,40,0,0 +62,2,123582,12,6,2,4,4,0,1,0,0,40,0,0 +32,3,174215,0,13,0,1,0,0,1,0,0,60,0,0 +36,2,183902,0,13,1,3,2,0,1,0,0,4,0,1 +43,2,247880,1,9,0,10,0,0,0,0,0,40,0,0 +37,2,256636,1,9,1,6,1,0,0,0,0,40,0,0 +28,2,22422,1,9,0,6,4,0,0,0,0,55,0,0 +47,4,194360,1,9,1,4,2,0,1,0,0,7,0,1 +59,2,247187,1,9,2,0,0,0,1,0,0,40,0,0 +35,2,63921,1,9,1,8,1,0,0,0,0,40,0,0 +35,2,224889,0,13,1,5,1,0,0,0,0,40,0,0 +29,1,178564,0,13,0,3,5,0,0,0,0,40,0,0 +57,2,47619,6,12,2,3,0,1,1,0,0,40,0,0 +41,2,92775,0,13,1,1,1,0,0,0,0,60,0,1 +37,2,50837,3,14,1,3,1,0,0,0,0,45,0,1 +20,4,235894,5,10,0,7,3,0,0,0,0,40,0,0 +44,2,244974,1,9,1,5,1,0,0,0,0,60,0,0 +20,4,526734,1,9,0,0,0,0,1,0,0,30,0,0 +38,1,243484,0,13,1,0,2,0,1,0,0,28,0,1 +23,2,201664,1,9,1,0,5,0,0,0,0,40,0,0 +24,2,234640,1,9,3,5,3,0,1,0,0,36,0,0 +46,2,268022,0,13,1,5,1,0,0,0,0,40,0,1 +32,4,223267,1,9,1,6,1,0,0,0,0,40,0,0 +21,1,99199,1,9,1,10,1,0,0,0,0,40,0,0 +32,2,137076,5,10,1,5,1,0,0,0,0,40,0,0 +41,2,115411,5,10,2,5,3,0,0,2174,0,45,0,0 +51,2,313146,1,9,1,8,1,0,0,0,0,40,0,0 +69,1,29980,7,4,0,7,5,0,0,1848,0,10,0,0 +39,5,543042,1,9,1,10,1,0,0,5178,0,50,0,1 +43,2,271807,5,10,2,10,0,0,0,0,0,40,0,0 +51,3,97934,0,13,1,7,1,0,0,5178,0,40,0,1 +43,2,191196,1,9,2,4,0,0,0,0,0,40,0,0 +35,1,264627,2,7,2,1,4,0,1,0,0,84,0,0 +32,2,183801,1,9,2,10,3,0,0,0,0,40,0,0 +25,2,209227,0,13,0,3,3,0,1,0,0,21,0,0 +64,2,216208,5,10,6,5,0,0,1,0,0,40,0,0 +28,2,377095,0,13,1,1,2,0,1,0,0,40,0,0 +44,2,317535,15,2,1,11,5,0,0,0,0,40,4,0 +40,2,247880,0,13,1,9,1,0,0,0,0,40,0,1 +21,2,152246,5,10,0,2,3,2,0,0,0,40,11,0 +23,2,428299,1,9,0,10,0,0,0,0,0,40,0,0 +23,2,161708,5,10,0,4,4,0,1,0,0,20,0,0 +19,2,167859,1,9,0,4,3,1,0,0,0,40,0,0 +61,2,85194,5,10,1,9,1,0,0,0,0,25,0,0 +39,2,117683,12,6,1,2,1,0,0,0,0,45,0,0 +51,2,139347,1,9,1,0,2,0,1,7688,0,40,0,1 +25,2,427744,12,6,1,1,1,0,0,0,0,40,0,0 +33,2,122116,1,9,1,5,1,0,0,0,0,45,0,0 +34,0,227931,5,10,2,0,0,0,1,0,0,38,0,0 +54,1,226497,5,10,1,5,1,0,0,0,0,50,0,0 +24,2,83783,0,13,0,9,3,0,1,0,0,40,0,0 +28,2,197113,1,9,0,8,3,4,0,0,0,50,5,0 +33,2,204742,5,10,1,5,1,0,0,0,0,44,0,0 +31,2,213179,1,9,1,6,1,0,0,0,0,60,0,1 +70,5,188260,1,9,1,1,1,0,0,0,0,16,0,0 +43,2,298161,1,9,1,8,2,0,1,0,0,40,35,0 +36,2,143774,5,10,1,0,2,0,1,0,0,12,0,1 +50,4,139296,2,7,0,10,4,0,0,0,0,40,0,0 +21,2,152389,5,10,0,4,0,1,1,0,0,30,0,0 +31,2,309974,5,10,4,9,4,1,1,0,0,40,0,0 +39,2,270059,5,10,2,0,4,0,1,0,0,35,0,0 +29,2,130045,7,4,1,4,2,0,1,0,0,40,0,0 +39,2,188038,5,10,2,2,0,0,0,0,0,40,0,0 +17,2,168203,7,4,0,7,5,4,0,0,0,40,4,0 +46,2,171807,5,10,2,5,4,0,1,0,0,40,0,0 +62,2,186696,1,9,1,10,1,0,0,0,0,40,0,0 +32,2,177531,12,6,2,4,4,1,1,0,0,23,0,0 +28,2,115464,1,9,0,4,3,1,1,0,0,40,0,0 +19,2,501144,5,10,0,5,5,1,1,0,0,40,0,0 +61,4,180079,8,16,1,1,1,0,0,4064,0,40,0,0 +24,4,203924,0,13,1,11,1,0,0,0,0,45,0,0 +38,2,91857,5,10,1,10,1,0,0,0,0,41,0,0 +38,2,229700,3,14,1,3,1,1,0,0,0,40,0,1 +17,2,158704,12,6,0,5,3,0,0,0,0,20,0,0 +28,2,190911,1,9,1,10,1,0,0,0,0,40,0,0 +52,2,139176,1,9,1,5,1,0,0,0,0,8,0,0 +61,2,119684,10,15,1,3,1,0,0,15024,0,20,0,1 +69,2,124930,11,3,1,8,1,0,0,0,2267,40,0,0 +19,2,168693,1,9,0,5,3,0,1,0,0,25,0,0 +26,2,250038,5,10,1,0,1,0,0,0,0,40,0,1 +34,5,353927,5,10,1,1,1,0,0,0,0,40,0,1 +70,2,216390,4,5,1,8,2,0,1,2653,0,40,0,0 +21,2,230248,1,9,0,0,0,0,1,0,0,25,0,0 +43,2,117728,1,9,1,10,1,0,0,0,0,44,0,0 +52,2,115851,1,9,1,10,1,0,0,0,0,40,0,0 +59,2,193335,1,9,1,10,1,0,0,0,0,40,0,1 +21,2,203894,9,11,0,0,3,0,1,0,0,40,0,0 +53,1,100109,3,14,1,1,1,0,0,0,1977,40,0,1 +55,0,157639,5,10,1,11,1,0,0,0,0,40,0,1 +46,5,235320,3,14,2,5,0,0,0,0,0,60,0,1 +36,2,127686,1,9,4,0,4,0,1,0,0,37,0,0 +39,2,28572,1,9,0,2,3,0,0,0,0,48,0,0 +30,2,184687,1,9,0,3,3,0,1,0,0,30,0,0 +22,2,267945,5,10,0,5,3,0,1,0,0,16,0,0 +43,2,131899,0,13,1,1,1,0,0,0,0,40,0,1 +36,2,192614,1,9,2,8,0,0,0,0,0,56,0,0 +36,2,186808,0,13,1,10,3,0,0,0,0,40,0,1 +50,2,44116,1,9,2,10,4,0,1,0,0,40,0,0 +27,3,46442,0,13,0,11,0,0,1,0,0,35,0,0 +46,3,78022,1,9,1,0,1,0,0,0,0,40,0,1 +24,2,417668,0,13,0,3,3,0,0,0,0,20,0,0 +41,2,223763,1,9,2,10,0,0,0,0,0,40,0,0 +68,2,223851,1,9,1,0,1,0,0,0,0,24,0,0 +38,4,115634,5,10,1,1,1,0,0,0,0,40,0,0 +47,2,114459,1,9,1,5,1,0,0,0,0,40,0,1 +41,2,197093,5,10,0,4,0,1,0,0,0,20,0,0 +31,1,357145,8,16,0,3,3,0,1,0,0,48,0,0 +29,2,59231,5,10,1,10,1,0,0,0,0,42,0,0 +26,2,292303,1,9,0,2,3,0,1,0,0,40,0,0 +51,2,122288,5,10,6,8,4,0,1,0,0,36,0,0 +26,3,52322,0,13,0,9,0,4,0,0,0,60,0,0 +27,4,105830,0,13,0,3,0,0,1,0,0,60,0,0 +36,2,107125,1,9,1,9,1,0,0,0,0,50,0,0 +28,3,281860,0,13,0,3,0,0,1,0,0,40,0,0 +53,2,283320,0,13,2,9,0,0,1,0,0,40,0,0 +40,0,26598,0,13,2,3,0,0,0,0,0,40,0,0 +38,2,220783,1,9,2,4,0,0,1,0,0,20,0,0 +53,2,208302,12,6,1,4,1,0,0,0,0,34,0,0 +34,4,172664,1,9,1,10,1,0,0,0,0,40,0,0 +43,2,54611,1,9,2,6,0,0,0,0,0,60,0,0 +64,2,631947,12,6,1,0,1,0,0,0,0,40,0,0 +21,2,394484,5,10,0,0,3,0,1,0,0,40,0,0 +38,3,37683,10,15,0,3,0,2,1,99999,0,57,8,1 +47,4,193012,3,14,2,11,0,1,0,0,0,50,0,1 +48,2,143098,8,16,1,3,1,2,0,0,1902,40,26,1 +57,2,84888,1,9,1,6,1,0,0,0,0,50,0,0 +37,2,188503,0,13,0,0,0,0,1,0,0,35,0,0 +37,2,337778,2,7,2,7,0,0,0,0,0,40,0,0 +51,1,94432,1,9,1,7,1,0,0,0,0,55,0,1 +32,2,168906,6,12,0,0,0,0,1,0,0,40,0,0 +49,2,116143,1,9,1,8,1,0,0,0,0,40,0,0 +52,2,128272,1,9,1,5,1,0,0,0,0,14,0,0 +64,3,301383,6,12,1,1,1,0,0,9386,0,45,0,1 +46,2,174995,1,9,2,0,4,0,1,0,0,45,0,0 +24,0,289909,5,10,1,3,1,0,0,0,0,40,0,0 +39,2,154641,0,13,1,1,1,0,0,0,0,45,0,1 +23,2,209034,1,9,1,8,2,0,1,3942,0,40,0,0 +30,2,203488,5,10,0,10,0,0,0,0,0,44,0,0 +34,2,141118,3,14,2,3,3,0,1,0,0,60,0,1 +30,2,169589,5,10,1,0,1,0,0,0,0,40,0,0 +25,2,137645,0,13,0,5,0,1,1,0,0,40,0,0 +58,4,489085,0,13,1,3,1,1,0,0,0,40,0,0 +32,2,36302,5,10,1,0,1,0,0,0,0,50,0,0 +37,2,253420,1,9,4,4,4,1,1,0,0,25,0,0 +35,2,269300,1,9,4,4,0,1,1,0,0,40,0,0 +18,2,282609,11,3,0,2,5,0,0,0,0,30,6,0 +46,2,346978,0,13,2,3,4,0,1,0,0,40,0,0 +71,2,182395,0,13,0,10,0,0,0,11678,0,45,0,1 +44,2,205051,12,6,2,0,4,0,1,0,0,40,0,0 +45,2,128736,12,6,2,5,0,0,1,0,0,40,0,0 +40,2,236110,14,8,1,3,1,0,0,0,0,40,1,1 +38,2,312271,0,13,1,3,1,0,0,0,0,50,0,1 +52,2,126978,1,9,1,8,2,2,1,0,0,40,26,0 +47,2,204692,1,9,1,10,1,0,0,0,0,40,0,0 +49,2,195956,0,13,2,9,4,0,1,0,0,35,0,0 +59,0,202682,1,9,1,5,1,0,0,0,0,40,0,0 +22,2,231912,9,11,0,0,3,0,1,0,0,37,0,0 +44,4,24982,5,10,1,1,1,0,0,0,0,40,0,1 +76,2,278938,0,13,6,3,0,0,1,0,0,20,0,0 +50,4,36489,12,6,0,4,0,0,0,0,0,40,0,0 +33,4,154874,5,10,1,11,1,0,0,0,0,40,0,0 +43,2,74581,1,9,1,10,1,0,0,0,0,48,0,1 +27,2,311446,1,9,1,0,2,0,1,5178,0,40,0,1 +37,5,162164,1,9,1,10,1,0,0,0,0,40,0,0 +40,2,239708,2,7,1,6,1,0,0,0,0,55,0,0 +49,1,162856,5,10,2,1,0,3,1,0,0,40,0,0 +48,5,85109,5,10,0,10,0,0,0,0,0,45,0,0 +49,2,169042,1,9,4,3,4,0,1,0,625,40,5,0 +22,2,436798,5,10,1,9,1,0,0,0,0,40,0,0 +42,2,345363,1,9,2,1,0,0,1,0,0,40,7,0 +36,2,49837,5,10,2,3,0,0,1,0,0,40,0,0 +30,0,180283,1,9,0,4,0,1,1,0,0,40,0,0 +40,4,95639,1,9,0,10,5,3,0,0,0,40,0,0 +42,2,33155,1,9,1,8,1,0,0,0,0,45,0,0 +56,2,329059,1,9,1,8,1,0,0,0,0,40,25,1 +55,2,24694,5,10,2,3,0,0,1,0,0,40,0,0 +25,2,443855,1,9,1,4,1,0,0,0,0,40,4,0 +33,2,301867,5,10,0,0,4,2,1,0,0,35,0,0 +55,2,226875,1,9,1,5,1,0,0,4064,0,40,0,0 +47,2,362835,0,13,1,5,1,0,0,0,0,60,0,1 +23,2,180339,6,12,0,5,3,0,1,0,0,65,0,0 +55,5,207489,0,13,2,5,0,0,1,0,0,50,9,0 +43,2,336643,1,9,0,1,0,0,1,0,0,50,0,0 +31,2,143653,9,11,1,5,1,0,0,0,0,50,0,0 +62,0,101475,6,12,6,3,0,0,1,0,0,40,0,0 +42,4,263871,1,9,1,0,1,0,0,0,0,8,0,0 +38,1,77820,1,9,1,10,1,0,0,0,0,40,0,1 +29,2,95465,1,9,0,9,0,0,0,0,0,42,0,0 +26,2,257910,5,10,0,4,0,0,0,0,0,60,0,0 +26,2,244372,1,9,1,0,2,0,1,0,0,52,0,1 +37,1,126738,1,9,1,7,1,0,0,0,0,72,0,0 +79,5,97082,14,8,6,5,0,0,0,18481,0,45,0,1 +61,2,133164,7,4,0,4,0,0,0,0,0,48,0,0 +28,1,104617,7,4,0,4,5,0,1,0,0,99,4,0 +60,5,105339,0,13,1,1,1,0,0,7298,0,60,0,1 +51,5,258735,1,9,2,11,0,0,0,0,0,81,0,0 +34,2,182926,1,9,1,10,1,0,0,0,0,43,0,1 +35,2,166193,1,9,2,8,3,0,0,0,0,40,0,0 +27,4,206125,12,6,1,10,1,0,0,0,0,60,0,0 +44,2,346594,1,9,2,4,4,0,1,0,0,40,0,0 +25,2,108301,1,9,4,4,4,0,1,0,0,20,0,0 +32,2,73498,7,4,2,4,4,0,1,0,0,40,0,0 +36,2,129150,5,10,1,3,1,0,0,0,0,20,0,1 +27,2,181280,3,14,0,2,4,0,0,0,0,30,0,0 +40,2,146908,8,16,1,3,1,0,0,0,0,60,0,1 +25,2,164488,0,13,0,9,0,0,0,0,0,40,0,0 +41,2,307468,1,9,1,6,1,0,0,0,0,50,0,0 +30,2,93884,0,13,1,3,1,0,0,0,0,45,0,1 +26,2,279833,0,13,0,1,0,0,0,0,2258,45,0,1 +52,2,137658,2,7,1,8,1,4,0,0,0,40,21,0 +32,2,101562,0,13,0,3,0,0,1,0,0,45,0,0 +33,2,136331,1,9,1,2,1,0,0,0,0,40,0,0 +35,2,259846,1,9,1,10,1,0,0,0,0,55,0,0 +48,2,98719,1,9,6,4,0,0,1,0,0,44,0,0 +62,1,168682,7,4,1,5,1,0,0,0,0,5,0,0 +40,1,198953,6,12,0,3,3,1,1,0,0,2,0,0 +28,2,173673,11,3,0,4,0,0,1,0,0,40,4,0 +23,2,67958,5,10,0,4,0,0,1,0,0,30,0,0 +50,3,98980,0,13,1,1,1,0,0,7298,0,40,0,1 +51,0,94174,5,10,2,0,4,0,1,0,0,35,0,0 +63,1,122442,5,10,1,4,1,0,0,0,0,48,0,0 +63,3,154675,1,9,6,1,0,0,1,0,0,40,0,0 +40,2,116632,1,9,2,5,0,0,0,0,0,60,0,1 +40,2,169031,1,9,0,7,0,0,0,0,0,40,0,0 +41,2,237452,0,13,1,3,2,0,1,0,0,15,1,1 +20,0,126822,5,10,0,3,3,0,1,0,0,15,0,0 +28,2,51461,0,13,1,0,1,0,0,0,1887,40,0,1 +35,2,54953,1,9,1,10,1,0,0,0,0,40,0,0 +31,2,222654,0,13,1,1,1,0,0,0,0,40,0,0 +34,2,37676,0,13,1,5,1,0,0,0,0,50,0,1 +57,2,159319,3,14,1,1,1,0,0,0,0,50,0,1 +28,2,125321,1,9,0,8,0,0,1,0,0,40,0,0 +38,2,209609,5,10,1,9,1,0,0,0,0,40,0,1 +37,2,224947,9,11,0,4,0,0,0,0,0,40,0,0 +43,0,438427,5,10,2,0,0,1,1,0,0,40,0,0 +26,1,384276,1,9,1,1,1,0,0,0,0,40,0,0 +26,2,196805,5,10,1,6,1,1,0,0,0,65,0,0 +27,2,242097,9,11,1,6,1,0,0,0,0,50,0,0 +33,2,184306,0,13,1,3,1,0,0,0,0,45,0,0 +45,2,161954,0,13,0,3,0,0,1,0,0,40,9,0 +65,2,258561,0,13,1,4,1,0,0,0,0,20,0,0 +57,1,95280,5,10,1,5,1,0,0,99999,0,45,0,1 +59,2,212783,1,9,2,4,0,0,1,0,0,38,0,0 +18,2,205004,5,10,0,4,3,0,0,0,0,26,0,0 +44,4,387844,14,8,1,2,1,0,0,0,0,40,0,0 +37,2,83880,5,10,0,10,0,0,0,0,0,40,0,0 +27,2,161155,1,9,1,4,1,0,0,0,0,40,0,0 +43,4,265698,0,13,1,3,2,0,1,0,0,45,0,1 +59,5,146477,10,15,1,3,1,0,0,0,0,40,0,1 +19,2,97261,1,9,0,7,0,0,0,0,0,40,0,0 +36,0,437890,1,9,0,1,4,1,0,0,0,90,0,0 +68,1,133736,5,10,1,5,1,0,0,20051,0,40,0,1 +63,2,169983,2,7,6,5,0,0,1,2176,0,30,0,0 +37,2,126675,5,10,1,1,1,0,0,0,0,57,0,0 +46,4,175754,3,14,2,3,0,0,1,0,1876,60,0,0 +31,2,121768,6,12,2,0,4,0,1,0,0,35,12,0 +23,2,180052,1,9,0,4,3,0,0,0,0,40,0,0 +22,2,124454,5,10,0,5,0,0,0,0,0,30,0,0 +49,2,190115,1,9,1,5,1,0,0,0,1672,44,0,0 +36,2,222584,1,9,2,0,4,1,1,0,0,40,0,0 +38,2,22245,5,10,2,1,0,0,0,0,0,50,0,0 +46,4,114160,3,14,1,1,1,0,0,0,1902,45,0,1 +24,2,228960,6,12,0,0,3,0,1,0,0,40,0,0 +26,2,132572,0,13,0,0,3,1,1,0,0,40,0,0 +47,2,103020,7,4,1,8,2,4,1,0,0,40,5,0 +40,2,187802,5,10,1,2,1,0,0,0,1887,40,0,1 +31,4,50649,3,14,0,3,0,0,1,0,0,50,0,0 +42,2,137698,11,3,3,7,0,0,0,0,0,35,4,0 +48,5,30575,9,11,1,10,1,0,0,0,0,70,0,1 +56,2,202220,5,10,4,9,4,1,1,0,0,38,0,0 +50,2,50178,1,9,1,9,1,0,0,0,0,40,0,1 +17,2,207791,12,6,0,2,3,0,0,0,0,20,0,0 +21,2,540712,1,9,0,4,5,1,0,0,1719,25,0,0 +50,2,321770,1,9,2,0,0,0,1,0,0,40,0,0 +49,2,202053,1,9,2,5,0,0,1,0,0,32,0,0 +34,2,143699,1,9,1,5,2,0,1,0,0,15,0,0 +32,1,115066,1,9,1,5,1,0,0,0,0,60,0,1 +28,2,223751,5,10,1,0,1,0,0,0,0,40,0,1 +62,5,354075,0,13,1,1,1,0,0,0,0,50,0,1 +23,2,32732,0,13,0,3,0,0,0,0,0,15,0,0 +24,0,390867,3,14,0,3,0,1,1,0,0,40,0,0 +31,2,101697,9,11,1,3,2,0,1,0,0,40,0,0 +36,2,279721,1,9,1,6,1,0,0,0,0,40,0,0 +58,2,223400,6,12,1,13,5,0,1,0,0,35,12,0 +39,2,76417,3,14,1,3,1,0,0,0,0,40,0,1 +21,2,78170,1,9,0,10,0,0,0,0,0,42,0,0 +39,2,201410,1,9,1,2,1,0,0,0,0,40,0,0 +21,2,189013,5,10,0,5,3,0,1,0,0,35,0,0 +33,2,119913,9,11,1,3,1,0,0,0,0,40,0,1 +37,2,549174,1,9,1,10,1,0,0,0,0,50,0,1 +29,4,214706,1,9,0,4,4,0,1,0,0,40,0,0 +43,2,234220,1,9,2,8,3,0,1,0,0,40,1,0 +22,2,237720,1,9,0,10,3,0,0,0,0,40,0,0 +25,2,185942,3,14,0,3,3,0,1,0,0,40,0,1 +69,4,286983,5,10,1,4,1,0,0,0,0,40,0,0 +17,2,140027,2,7,0,4,3,0,1,0,0,25,0,0 +54,2,155408,1,9,6,2,4,0,1,0,0,40,0,0 +28,2,158737,14,8,1,8,5,4,0,0,0,40,16,0 +27,4,199471,9,11,0,9,3,0,1,0,0,38,0,0 +35,2,287701,6,12,2,10,4,0,0,0,0,45,0,1 +38,2,137707,9,11,1,9,2,0,1,0,0,40,0,1 +33,0,108116,1,9,1,9,1,0,0,0,0,40,0,0 +26,2,366900,1,9,0,10,3,0,0,0,0,40,0,0 +56,5,187355,5,10,1,5,2,0,1,0,0,60,8,1 +38,2,33105,0,13,1,3,1,3,0,0,0,70,0,1 +51,1,268639,5,10,1,3,2,0,1,0,2057,60,8,0 +26,2,358975,5,10,0,13,0,0,1,0,0,50,39,0 +33,2,199227,0,13,1,1,1,0,0,0,0,55,0,1 +44,2,248249,7,4,1,2,1,0,0,0,0,50,0,0 +36,2,460437,4,5,2,5,0,0,1,0,0,40,0,0 +42,2,187294,5,10,2,10,4,0,0,0,0,40,0,0 +44,2,115932,6,12,1,3,1,0,0,0,0,40,0,0 +44,2,181762,0,13,1,6,1,0,0,15024,0,55,0,1 +21,2,27049,5,10,0,5,3,0,1,0,0,20,0,0 +41,2,806552,5,10,1,5,1,0,0,0,0,50,0,1 +41,2,150755,8,16,1,1,1,0,0,15024,0,50,8,1 +62,2,69867,9,11,1,3,1,0,0,7298,0,50,0,1 +27,2,160786,2,7,4,10,0,0,0,0,0,45,9,0 +38,2,219546,0,13,1,3,1,0,0,0,0,40,0,1 +60,2,24872,5,10,4,6,0,3,1,0,0,30,0,0 +24,2,110371,14,8,0,8,4,0,0,0,0,40,4,0 +22,2,304602,1,9,0,2,3,0,0,0,0,40,0,0 +22,2,238917,15,2,0,8,0,0,0,0,0,24,4,0 +51,2,200618,0,13,1,3,1,0,0,0,0,40,0,0 +31,2,183043,3,14,1,1,1,0,0,0,1977,48,0,1 +42,4,209752,10,15,1,1,1,0,0,0,0,55,0,1 +49,2,196707,1,9,1,8,1,0,0,7298,0,43,0,1 +37,4,98725,0,13,0,9,3,0,1,0,0,42,0,0 +37,1,180150,10,15,1,3,1,0,0,0,0,45,0,1 +66,2,151227,0,13,1,4,1,0,0,0,0,40,0,1 +46,2,282538,9,11,4,8,0,1,1,0,0,40,0,0 +52,2,89534,1,9,1,10,1,0,0,0,0,40,0,1 +23,2,291011,1,9,0,10,0,0,0,0,0,40,0,0 +67,2,166187,1,9,6,1,4,0,0,0,0,38,0,1 +19,2,188669,5,10,0,5,3,0,1,0,0,25,0,0 +37,2,178948,0,13,0,3,0,0,1,0,0,45,0,0 +42,5,188738,1,9,1,1,1,0,0,0,1977,60,25,1 +39,1,160808,5,10,1,4,1,1,0,0,0,40,0,0 +54,2,93605,1,9,1,5,1,0,0,0,1848,40,0,1 +46,2,318331,1,9,1,8,1,0,0,0,0,40,0,0 +33,2,87605,1,9,0,4,4,1,1,0,0,40,0,0 +69,1,89477,5,10,6,7,0,0,1,0,0,14,0,0 +21,2,48301,5,10,0,2,3,0,0,0,0,40,0,0 +27,2,220748,1,9,0,2,5,1,0,0,0,48,0,0 +39,2,387068,1,9,1,1,1,0,0,0,0,40,0,1 +23,2,250743,5,10,2,0,0,1,0,0,0,40,0,0 +26,2,78258,9,11,2,3,4,0,1,0,0,36,0,0 +42,2,31387,8,16,3,3,4,3,1,0,0,40,0,0 +36,2,289190,1,9,2,10,4,0,0,0,0,40,0,0 +24,2,604537,1,9,0,6,4,0,0,0,0,40,4,0 +35,2,328466,4,5,1,4,1,0,0,0,0,40,4,0 +42,2,403187,1,9,2,2,4,1,1,0,0,40,0,0 +37,2,219546,9,11,1,10,1,0,0,4386,0,44,0,1 +41,2,220531,8,16,1,3,1,0,0,0,0,50,0,1 +27,2,204648,9,11,0,8,4,1,1,0,0,40,0,0 +42,1,201908,10,15,1,3,1,0,0,99999,0,50,0,1 +18,2,365683,1,9,0,0,3,0,1,0,0,16,0,0 +41,2,175674,0,13,1,9,1,0,0,0,0,40,0,1 +31,2,203488,1,9,1,2,1,0,0,0,0,40,0,0 +26,2,106406,5,10,1,10,1,0,0,0,0,40,0,0 +67,2,172756,15,2,6,8,0,0,1,2062,0,34,16,0 +37,2,125167,5,10,1,1,1,0,0,0,0,60,0,1 +51,2,249339,1,9,1,10,1,0,0,0,0,40,0,0 +26,2,94652,5,10,0,10,3,3,0,0,0,40,0,0 +40,2,195394,6,12,1,3,1,0,0,7688,0,40,0,1 +25,2,130302,1,9,0,2,4,0,0,0,0,40,0,0 +38,2,66686,9,11,1,8,1,0,0,0,0,40,0,1 +43,2,336042,1,9,4,6,0,0,0,0,0,40,0,0 +23,2,193586,5,10,4,7,5,0,1,0,0,40,0,0 +44,2,325461,0,13,1,1,1,0,0,0,1902,50,0,1 +60,4,313852,3,14,2,3,0,0,1,0,0,25,0,0 +38,4,30509,3,14,0,3,0,0,1,0,1669,55,0,0 +21,4,32639,5,10,0,3,0,0,0,0,0,20,0,0 +18,2,234953,5,10,0,0,3,0,1,0,0,25,0,0 +49,2,120629,0,13,2,1,0,1,1,27828,0,60,0,1 +43,2,350379,11,3,2,13,4,0,1,0,0,40,4,0 +36,2,36423,1,9,1,6,1,0,0,0,0,25,0,1 +31,2,123397,1,9,1,6,2,0,1,5178,0,35,0,1 +38,2,130813,1,9,2,8,5,0,1,0,0,40,0,0 +43,1,35236,5,10,1,7,1,0,0,0,0,84,0,0 +58,2,33350,1,9,2,4,4,0,1,0,0,35,0,0 +55,2,177380,1,9,2,0,0,0,1,0,0,29,0,0 +39,2,216129,6,12,2,1,4,1,1,0,0,35,2,0 +38,2,335104,0,13,2,3,0,0,1,0,0,35,0,0 +54,1,199741,1,9,6,10,0,0,0,0,2001,35,0,0 +57,5,165881,10,15,1,3,1,0,0,0,0,40,0,0 +35,4,387777,6,12,1,11,1,0,0,0,0,52,0,0 +44,1,149943,10,15,1,3,1,2,0,0,0,60,18,1 +36,2,188834,1,9,1,10,1,0,0,0,0,40,0,0 +58,2,290661,1,9,1,10,1,0,0,0,0,40,0,0 +39,2,155603,5,10,0,4,3,1,1,0,2205,40,0,0 +25,2,114838,10,15,0,3,0,0,1,0,0,8,25,0 +54,4,168553,0,13,1,1,1,0,0,0,0,40,0,0 +23,2,103064,0,13,0,9,0,0,1,0,0,40,0,0 +37,2,123833,5,10,0,5,0,0,0,0,0,60,0,0 +60,3,55621,6,12,1,4,1,1,0,0,0,40,0,0 +66,4,189834,7,4,6,4,0,0,1,0,0,20,0,0 +36,2,217926,6,12,1,8,1,1,0,0,0,50,0,0 +29,1,341672,1,9,3,6,5,2,0,0,1564,50,3,1 +29,2,163003,0,13,0,0,3,2,1,2202,0,40,18,0 +25,2,194352,0,13,2,3,0,0,1,0,0,44,0,0 +23,2,393248,5,10,0,0,3,0,0,0,0,40,0,0 +38,2,279315,1,9,0,4,3,1,0,0,0,40,0,0 +33,2,392812,5,10,1,2,1,0,0,0,0,50,0,1 +49,5,34998,5,10,1,7,1,0,0,0,0,60,0,0 +57,5,51016,1,9,1,1,1,0,0,0,0,60,0,1 +57,4,132717,0,13,1,1,1,0,0,0,0,45,0,0 +46,2,186078,5,10,0,8,0,0,1,0,0,45,0,0 +37,5,196123,3,14,1,1,1,0,0,0,0,70,0,1 +43,5,304906,0,13,1,5,1,0,0,0,0,45,0,1 +26,2,41521,1,9,0,4,0,0,1,0,0,35,0,0 +40,2,346847,9,11,4,3,5,0,1,0,0,40,0,0 +39,1,107233,1,9,0,10,5,3,0,0,0,40,0,0 +39,2,150125,6,12,2,4,4,1,1,0,0,40,0,0 +31,2,400535,5,10,1,0,1,0,0,0,0,40,0,0 +31,2,409622,0,13,1,8,1,4,0,0,0,36,4,0 +27,2,136448,0,13,0,0,0,1,1,0,0,40,0,0 +36,1,202950,0,13,1,1,1,0,0,0,0,50,10,0 +40,4,197012,0,13,2,9,0,0,1,8614,0,40,7,1 +57,2,237691,1,9,1,4,1,0,0,0,0,40,4,0 +24,2,170277,1,9,0,4,0,0,1,0,0,35,0,0 +30,2,160784,5,10,0,5,0,0,0,0,0,45,0,0 +28,2,33798,14,8,0,6,0,0,0,0,0,50,0,0 +22,2,197838,0,13,0,1,0,0,0,0,0,40,0,0 +31,2,223212,7,4,0,2,3,0,0,0,0,50,0,0 +33,2,125762,1,9,1,5,1,0,0,0,0,44,0,1 +20,2,283969,5,10,0,2,5,0,0,0,0,15,0,0 +25,2,374163,14,8,1,7,1,4,0,0,0,60,4,0 +49,0,118567,5,10,1,7,1,0,0,0,0,40,0,0 +21,2,147655,1,9,0,4,3,0,1,0,0,35,0,0 +45,2,82797,0,13,1,1,1,0,0,0,0,45,0,1 +36,4,142573,1,9,1,1,1,0,0,0,0,45,0,1 +41,2,235167,11,3,3,13,0,0,1,0,0,32,4,0 +23,2,53245,0,13,0,5,0,0,0,0,1602,12,0,0 +47,2,28035,0,13,1,1,1,0,0,0,0,50,0,1 +41,2,247082,1,9,2,1,0,0,0,0,0,50,0,0 +30,2,123397,1,9,0,2,4,0,1,0,0,40,0,0 +29,4,133327,5,10,0,7,0,0,0,0,0,40,0,0 +31,2,102270,7,4,2,8,4,0,1,0,0,40,0,0 +55,2,240988,4,5,1,8,5,2,0,0,0,40,11,0 +19,2,386378,1,9,0,4,0,0,0,0,0,35,0,0 +31,0,350651,14,8,1,9,2,0,1,0,0,40,0,1 +18,0,76142,2,7,0,4,3,0,0,0,0,8,0,0 +68,2,73773,1,9,6,5,0,0,1,0,0,24,0,0 +36,4,293358,5,10,0,1,4,1,1,0,0,48,0,0 +44,2,146906,10,15,1,3,1,0,0,0,0,50,0,1 +58,1,331474,1,9,1,0,2,0,1,0,0,20,0,1 +20,2,213719,1,9,0,5,3,1,1,0,0,20,0,0 +18,2,101795,12,6,0,2,3,0,0,0,0,40,0,0 +32,2,228265,1,9,0,2,3,0,1,0,0,30,0,0 +49,1,130206,1,9,2,4,0,0,1,0,0,40,0,0 +34,2,324254,1,9,1,8,1,0,0,0,0,40,0,0 +22,2,223019,1,9,0,0,0,0,1,0,0,40,0,0 +40,2,189666,1,9,1,4,1,0,0,0,0,45,0,0 +35,2,139086,1,9,1,2,1,0,0,0,0,40,0,0 +44,1,75065,14,8,1,1,1,2,0,0,0,60,36,0 +55,2,139843,1,9,2,1,0,0,1,0,0,60,0,0 +21,2,34310,9,11,1,10,1,0,0,0,2603,40,0,0 +54,2,346014,5,10,1,10,2,0,1,0,0,40,0,0 +39,4,163278,5,10,0,0,0,0,1,2202,0,44,0,0 +52,2,31460,1,9,2,4,0,0,0,0,0,38,0,0 +57,5,33725,0,13,1,10,1,0,0,0,0,50,0,1 +58,0,300623,1,9,2,0,4,0,1,0,0,40,0,0 +27,4,177072,5,10,0,3,5,0,0,0,0,16,0,0 +41,2,167725,5,10,2,8,0,0,0,0,0,40,0,0 +18,2,131180,2,7,0,3,3,0,1,0,0,16,0,0 +58,2,275859,1,9,6,10,4,0,0,8614,0,52,4,1 +50,2,275181,11,3,2,4,0,0,0,0,0,37,1,0 +31,2,398988,5,10,0,1,0,0,0,0,0,40,0,0 +32,2,222654,12,6,2,8,0,0,0,0,0,40,0,0 +37,1,111129,5,10,1,10,1,0,0,0,0,45,0,0 +26,1,137795,0,13,1,1,1,0,0,0,0,20,0,0 +33,4,242150,9,11,1,9,1,0,0,0,0,50,0,0 +35,0,237873,1,9,0,4,4,1,1,0,0,40,0,0 +44,2,367749,0,13,0,3,0,0,1,0,0,45,4,0 +26,2,206600,0,13,0,10,3,0,0,0,0,40,4,0 +48,3,247043,1,9,2,0,0,0,0,0,0,40,0,0 +40,2,187702,0,13,0,9,0,0,0,0,0,40,0,0 +62,2,41718,12,6,1,5,1,0,0,0,0,35,0,0 +37,2,151835,10,15,1,5,1,0,0,0,0,45,0,1 +18,2,118938,2,7,0,5,3,0,0,0,0,18,0,0 +48,2,224870,1,9,2,8,5,4,1,0,0,38,16,0 +45,2,178341,3,14,1,3,1,0,0,0,0,50,0,0 +35,2,61343,5,10,1,5,1,0,0,0,0,45,0,0 +35,2,36989,1,9,2,10,4,0,0,0,0,40,0,0 +34,1,226296,1,9,1,3,1,0,0,0,0,51,0,0 +29,2,186624,1,9,1,4,2,0,1,0,0,40,1,0 +19,2,172582,5,10,0,5,3,0,0,0,0,30,0,0 +53,0,227392,5,10,1,11,1,0,0,0,0,60,0,0 +49,2,187563,5,10,2,4,0,0,0,0,0,40,0,0 +71,2,137499,1,9,6,5,5,0,1,0,0,16,0,0 +38,2,239397,7,4,1,10,1,0,0,0,0,36,4,0 +39,4,327164,3,14,1,1,1,0,0,0,0,45,0,0 +23,2,140798,0,13,0,0,0,0,1,0,0,40,0,0 +29,5,187450,0,13,1,5,1,0,0,0,0,50,0,1 +52,2,194580,11,3,2,7,4,0,0,0,0,40,0,0 +41,2,372682,5,10,1,0,2,0,1,0,0,40,0,1 +20,2,235442,5,10,0,4,0,0,0,0,0,35,0,0 +30,2,128065,5,10,1,9,1,0,0,0,0,45,0,0 +56,2,91545,12,6,2,0,4,1,1,0,0,36,0,0 +26,2,154604,1,9,2,5,4,0,1,0,0,40,0,0 +36,3,192150,1,9,2,0,4,0,1,0,0,40,0,0 +26,4,216522,0,13,0,3,3,1,1,0,0,42,0,0 +58,2,156040,6,12,1,8,1,1,0,0,1848,40,0,1 +24,2,206861,0,13,0,0,3,0,0,0,0,40,0,0 +41,2,97632,5,10,2,5,0,2,1,0,0,32,0,0 +27,2,189530,5,10,0,5,3,0,0,0,0,35,0,0 +28,0,381789,5,10,4,1,3,0,0,0,2339,40,0,0 +57,5,368797,1,9,1,1,1,0,0,0,0,40,0,0 +21,0,41183,5,10,0,3,3,0,1,0,0,20,0,0 +50,2,191062,1,9,1,2,1,0,0,0,0,40,0,0 +27,2,132963,1,9,1,2,1,1,0,0,0,40,0,0 +58,2,153551,0,13,0,3,0,0,1,0,0,60,0,0 +27,1,66473,0,13,1,1,1,0,0,0,0,50,0,0 +36,2,240323,1,9,4,5,4,1,1,0,0,17,0,0 +68,4,242095,0,13,1,1,1,0,0,20051,0,40,0,1 +33,5,128016,1,9,6,5,4,0,1,0,0,40,0,0 +19,2,29526,5,10,0,4,3,0,1,0,0,18,0,0 +26,2,342953,1,9,4,0,4,1,1,0,0,40,0,0 +37,2,215476,1,9,0,2,4,1,1,0,0,30,0,0 +53,2,231919,1,9,1,8,1,0,0,0,0,45,0,0 +32,2,52537,5,10,0,9,0,1,0,0,0,38,0,0 +18,2,27920,2,7,0,1,3,0,1,0,0,25,0,0 +53,2,153052,1,9,1,10,1,0,0,0,0,40,0,1 +40,1,199303,0,13,1,3,1,0,0,0,0,40,0,0 +50,2,233369,5,10,2,3,4,0,1,0,0,40,0,0 +43,2,345789,0,13,1,3,2,0,1,15024,0,50,0,1 +60,2,238913,0,13,1,5,1,0,0,0,0,46,0,1 +28,1,195607,1,9,1,5,2,0,1,0,0,40,0,0 +34,2,245173,1,9,2,5,0,0,0,0,1669,45,0,0 +37,2,138441,1,9,2,6,0,0,0,0,0,40,0,0 +25,2,67467,1,9,1,9,1,0,0,0,0,40,0,0 +46,2,102569,3,14,1,1,1,0,0,15024,0,65,0,1 +21,2,213341,2,7,3,2,3,0,0,0,1762,40,21,0 +26,2,37202,0,13,0,3,0,0,1,0,0,45,0,0 +47,2,140219,1,9,0,0,5,0,1,0,0,40,0,0 +18,2,298860,14,8,0,2,3,0,0,0,0,20,0,0 +22,2,51362,0,13,0,5,0,0,1,0,0,16,0,0 +36,2,199947,5,10,2,8,3,0,1,0,0,30,0,0 +59,1,32552,1,9,1,6,1,0,0,0,0,48,0,0 +33,2,183845,1,9,1,4,2,0,1,0,0,38,22,0 +33,2,181091,12,6,2,10,0,0,0,0,0,35,7,0 +53,5,135643,0,13,1,0,2,2,1,0,0,50,27,0 +44,0,96249,5,10,1,1,1,0,0,3411,0,40,0,0 +55,2,181220,1,9,1,1,1,0,0,0,0,50,0,0 +56,2,133025,1,9,1,6,1,0,0,0,0,50,0,0 +54,1,124865,5,10,2,5,0,0,1,0,0,35,0,0 +51,2,45599,1,9,2,3,0,0,0,0,0,40,0,0 +31,2,194293,5,10,0,0,0,0,1,2463,0,38,0,0 +43,2,102180,3,14,1,1,1,0,0,0,0,50,0,1 +44,2,121130,1,9,2,4,4,0,1,0,0,40,0,0 +22,2,138768,5,10,0,1,3,0,0,0,0,50,0,0 +43,0,98989,1,9,1,4,1,3,0,0,0,40,0,0 +26,0,126327,6,12,0,0,4,1,1,0,0,40,0,0 +30,2,113364,0,13,0,5,3,0,0,0,0,18,0,0 +30,2,326199,4,5,1,10,1,0,0,2580,0,40,0,0 +46,2,376789,1,9,0,4,0,0,0,0,0,15,0,0 +27,2,137063,0,13,1,5,1,0,0,0,0,50,0,0 +26,2,279145,1,9,1,10,1,0,0,0,0,50,0,0 +36,2,178815,0,13,0,1,0,0,0,8614,0,40,0,1 +25,1,245369,1,9,4,10,3,0,0,0,0,35,0,0 +30,3,49593,10,15,0,3,0,1,1,0,0,40,0,0 +46,0,238648,1,9,1,4,1,1,0,7298,0,40,0,1 +47,2,166181,5,10,1,0,2,1,1,0,0,48,0,1 +66,5,249043,0,13,1,5,1,0,0,5556,0,26,0,1 +43,2,156403,12,6,1,2,1,0,0,0,0,40,0,0 +36,3,186934,0,13,1,0,1,0,0,0,1848,55,0,1 +44,4,387770,5,10,6,0,4,0,1,0,0,15,0,0 +42,2,115511,8,16,1,3,1,0,0,0,0,50,0,0 +39,2,201410,0,13,1,6,1,0,0,0,1977,45,11,1 +36,2,220585,6,12,1,1,1,0,0,0,0,50,0,1 +60,1,282066,0,13,1,1,1,0,0,0,1977,45,0,1 +37,2,280966,5,10,1,8,1,0,0,0,0,50,0,1 +26,2,291586,0,13,0,6,3,0,0,0,0,20,0,0 +24,2,142227,0,13,0,0,0,0,1,0,0,30,0,0 +45,4,148254,3,14,2,3,0,0,1,0,0,35,0,0 +54,2,170562,5,10,1,1,1,0,0,0,0,48,0,1 +22,2,222490,5,10,0,5,3,0,1,0,0,30,0,0 +63,4,57674,3,14,1,3,1,0,0,0,0,48,0,0 +22,2,233624,1,9,1,10,1,0,0,0,0,43,0,0 +27,2,42734,5,10,0,4,0,0,0,0,0,25,0,0 +33,2,233107,4,5,1,10,1,0,0,0,0,33,4,0 +64,2,143110,0,13,6,3,0,0,1,0,0,30,0,0 +50,2,195844,6,12,1,1,1,0,0,0,0,50,0,1 +44,1,115896,9,11,6,3,4,0,1,0,0,40,0,0 +31,2,303851,1,9,1,6,1,0,0,0,0,50,0,0 +44,2,172475,1,9,2,0,0,2,1,0,0,40,36,0 +53,1,30008,12,6,1,7,1,0,0,0,0,35,0,0 +33,4,147921,1,9,6,4,4,0,1,0,0,40,0,0 +34,3,172716,14,8,1,12,1,0,0,0,0,40,0,0 +27,2,155057,1,9,0,6,0,0,0,0,0,70,0,0 +80,1,132728,1,9,0,1,0,0,0,0,0,20,0,0 +31,2,195136,6,12,2,4,0,0,1,0,0,32,0,0 +40,2,377322,1,9,1,10,1,1,0,0,0,40,0,1 +53,4,293941,0,13,1,3,1,0,0,0,0,40,0,0 +58,2,182123,1,9,1,8,1,0,0,0,0,44,0,0 +38,2,32528,5,10,1,1,1,0,0,0,0,40,0,1 +33,2,140206,10,15,1,3,1,0,0,0,0,40,0,1 +48,4,378221,0,13,1,1,1,0,0,0,0,60,4,1 +23,2,211601,5,10,1,1,2,1,1,0,0,40,0,0 +31,1,119411,1,9,0,10,3,0,0,0,0,50,0,0 +52,1,240013,3,14,1,5,1,0,0,0,0,70,0,0 +24,2,95552,1,9,0,9,3,0,0,0,0,40,0,0 +45,1,183710,4,5,1,7,1,0,0,0,0,40,0,0 +36,2,189382,1,9,1,0,2,0,1,0,0,40,0,1 +52,2,380633,11,3,6,4,4,0,1,0,0,40,4,0 +54,2,53407,1,9,1,10,1,0,0,0,0,40,0,0 +39,2,150480,10,15,1,3,1,0,0,0,0,55,0,1 +40,2,175674,0,13,1,5,1,0,0,0,0,50,0,1 +28,2,375313,1,9,0,9,0,2,0,0,0,50,0,0 +23,2,212888,5,10,0,0,0,0,1,0,0,40,0,0 +36,5,487085,7,4,0,10,4,1,0,0,0,40,0,0 +22,2,174461,5,10,0,0,3,0,1,0,0,15,0,0 +55,4,133201,3,14,1,1,1,0,0,0,0,50,0,0 +71,2,77253,1,9,0,2,0,0,0,0,0,17,0,0 +47,2,141511,8,16,1,3,1,0,0,0,0,60,0,1 +17,5,181608,12,6,0,5,3,0,0,0,0,12,0,0 +31,2,127610,0,13,1,1,2,0,1,0,0,50,0,1 +46,2,33842,5,10,1,6,1,0,0,3103,0,40,0,1 +27,2,150080,0,13,0,1,3,0,1,0,0,40,0,0 +39,3,30916,5,10,1,1,1,0,0,0,1902,50,0,1 +40,2,151294,1,9,2,2,0,0,1,0,0,48,0,0 +30,2,48829,1,9,0,5,0,0,1,0,1602,30,0,0 +17,2,193769,4,5,0,4,4,0,0,0,0,20,0,0 +33,2,277455,3,14,0,3,0,0,0,0,0,40,0,0 +72,2,225780,8,16,0,3,0,0,0,0,0,30,0,0 +34,3,436341,5,10,5,0,2,0,1,0,0,40,0,1 +65,2,255386,1,9,0,10,5,2,0,0,0,40,14,0 +36,2,174938,0,13,1,3,1,0,0,0,1887,50,0,1 +32,2,174789,1,9,0,8,4,0,0,0,0,40,0,0 +26,2,245628,5,10,0,0,5,0,0,0,0,40,4,0 +22,2,228752,1,9,0,2,0,0,0,0,0,40,0,0 +47,2,354148,10,15,1,3,1,0,0,99999,0,48,0,1 +31,2,192900,5,10,0,4,0,0,0,0,0,40,0,0 +28,1,190391,0,13,0,5,0,0,0,0,0,50,0,0 +38,2,353263,3,14,0,0,0,0,1,0,0,50,25,1 +34,2,113198,6,12,1,0,1,0,0,0,0,28,0,0 +44,2,207578,0,13,1,3,1,0,0,0,0,35,0,1 +27,2,93206,5,10,0,2,3,2,0,0,0,40,0,0 +50,4,163998,0,13,1,11,1,0,0,0,0,44,0,1 +47,2,111961,1,9,1,4,2,1,1,0,0,30,0,0 +20,2,219122,5,10,0,4,0,0,0,0,0,40,0,0 +24,2,111445,1,9,0,5,0,0,0,0,0,38,0,0 +29,3,309778,5,10,1,9,1,0,0,0,0,40,0,1 +37,4,223020,9,11,0,4,4,1,1,0,0,32,0,0 +42,2,303155,6,12,2,0,0,0,0,0,0,40,0,0 +68,2,159191,5,10,0,0,0,0,1,0,0,40,0,0 +22,4,244408,5,10,0,0,0,2,1,0,0,40,36,0 +72,1,473748,1,9,1,5,1,0,0,0,0,30,0,0 +45,3,71823,5,10,1,0,1,1,0,0,0,20,0,0 +30,4,83066,1,9,1,4,1,1,0,0,0,40,0,0 +33,2,150154,1,9,1,10,1,0,0,0,0,40,0,0 +43,2,190786,1,9,1,4,1,0,0,0,0,40,0,1 +56,2,178033,5,10,6,1,0,0,0,4416,0,60,0,0 +25,1,159909,9,11,1,7,1,0,0,0,0,40,0,0 +41,2,190885,1,9,2,13,0,0,1,0,0,40,24,0 +25,2,243786,0,13,0,4,0,0,1,0,0,37,0,0 +31,0,124020,6,12,1,9,1,0,0,0,0,40,0,1 +36,2,159016,1,9,1,8,1,0,0,0,0,38,0,0 +37,2,183800,0,13,1,1,1,0,0,0,0,40,0,1 +58,1,193434,1,9,1,10,1,0,0,0,0,20,0,0 +26,2,245029,0,13,0,0,0,1,1,0,0,40,0,0 +55,2,98746,5,10,1,9,1,0,0,0,0,50,8,1 +46,3,140664,5,10,1,1,1,0,0,0,0,48,0,1 +44,2,344920,0,13,0,0,0,0,1,0,1617,20,0,0 +44,2,169980,2,7,1,4,1,1,0,0,0,60,0,0 +28,0,155397,0,13,0,1,0,0,0,0,0,55,0,0 +42,2,245317,12,6,1,6,1,0,0,0,0,50,0,0 +41,2,74182,1,9,2,10,0,0,0,0,0,40,0,0 +39,2,280570,0,13,1,1,1,0,0,0,0,45,0,0 +64,1,30664,9,11,1,7,1,0,0,0,0,30,0,0 +20,2,109952,5,10,0,2,3,0,0,0,0,25,0,0 +45,4,192793,5,10,1,11,1,0,0,0,0,40,0,1 +31,2,243442,1,9,1,0,1,0,0,0,0,50,0,0 +36,3,106297,3,14,1,1,1,0,0,0,0,40,0,1 +32,2,328060,4,5,4,4,4,4,1,0,0,40,4,0 +33,1,48702,9,11,1,7,1,0,0,0,0,65,0,0 +51,1,111283,1,9,2,1,0,0,1,99999,0,35,0,1 +36,2,484024,1,9,2,8,4,0,0,0,0,40,0,0 +40,2,208470,1,9,0,10,0,0,0,0,0,40,0,0 +44,2,172032,9,11,1,0,1,0,0,7298,0,51,0,1 +40,2,29927,1,9,2,0,4,0,1,0,0,45,7,0 +46,2,98012,9,11,2,0,0,0,1,0,0,40,0,0 +31,1,108468,10,15,1,3,1,0,0,0,0,60,0,1 +30,2,207301,1,9,0,5,0,0,1,0,1980,40,0,0 +26,2,168403,1,9,1,2,1,0,0,0,0,40,0,0 +25,2,66935,0,13,0,4,5,0,0,0,0,40,0,0 +35,1,42044,6,12,1,10,1,0,0,0,0,40,0,0 +29,2,184806,10,15,0,3,5,0,0,0,0,50,0,0 +39,2,1455435,6,12,4,10,0,0,0,0,0,40,0,0 +44,1,445382,5,10,2,4,4,0,0,0,0,40,0,0 +37,2,278576,1,9,1,8,1,0,0,0,0,60,0,1 +79,1,84979,9,11,1,5,1,0,0,0,0,20,0,1 +36,2,659504,0,13,1,1,1,1,0,0,0,45,0,1 +44,2,136986,5,10,1,10,1,0,0,0,0,60,0,1 +23,2,278107,1,9,1,8,1,0,0,0,1573,30,0,0 +27,2,96219,0,13,0,0,0,0,1,0,0,45,0,0 +46,1,131091,0,13,1,5,1,0,0,0,1902,40,0,1 +58,2,205410,1,9,1,10,1,0,0,0,0,40,0,0 +36,2,416745,6,12,2,1,0,0,0,0,0,48,0,0 +36,2,180667,1,9,1,10,1,0,0,0,1887,60,0,1 +21,2,72119,5,10,0,0,0,0,0,0,0,45,0,0 +41,0,108945,1,9,0,6,0,0,1,14344,0,40,0,1 +49,3,195949,1,9,1,8,1,0,0,0,0,40,0,0 +34,2,101345,0,13,1,5,2,0,1,0,0,40,0,1 +29,2,439263,1,9,1,11,1,0,0,0,0,35,30,0 +63,2,213095,0,13,1,1,1,0,0,0,0,50,0,1 +29,3,59932,0,13,0,3,0,0,1,0,0,40,0,0 +65,2,172815,5,10,1,7,1,0,0,0,0,40,0,0 +26,2,40915,0,13,0,4,0,0,1,0,0,25,0,0 +42,2,139012,8,16,1,3,1,2,0,0,0,40,18,1 +44,2,121781,5,10,2,0,0,2,1,0,0,37,0,0 +41,1,147110,1,9,1,8,1,0,0,0,0,25,0,0 +22,4,237811,6,12,0,0,3,1,1,0,0,35,19,0 +18,2,111476,2,7,0,2,3,0,0,0,0,40,0,0 +33,4,289716,12,6,1,6,1,0,0,0,0,40,0,0 +46,4,141944,0,13,1,3,1,0,0,0,0,38,0,1 +49,2,323773,2,7,1,13,5,0,1,0,0,40,0,0 +41,0,176663,1,9,1,0,2,0,1,0,0,40,0,0 +52,2,155233,5,10,2,0,4,0,1,0,0,40,0,0 +40,2,143327,5,10,4,2,0,0,0,0,0,40,0,0 +53,3,177212,5,10,0,3,4,0,1,0,0,40,0,0 +45,1,123088,1,9,1,10,1,0,0,0,0,50,0,0 +30,4,47085,12,6,1,10,1,0,0,0,0,40,0,0 +56,2,102106,1,9,1,2,1,0,0,0,0,40,0,0 +24,2,235894,1,9,1,10,1,0,0,0,0,40,0,0 +71,1,172046,7,4,1,7,1,0,0,0,0,50,0,0 +20,1,197207,1,9,2,5,0,0,1,0,0,30,0,0 +26,2,152452,0,13,1,9,1,0,0,0,0,50,0,0 +34,2,172928,1,9,1,5,1,0,0,0,0,65,0,0 +49,2,116338,1,9,4,3,4,0,1,0,653,60,0,0 +48,2,276664,8,16,1,3,1,0,0,0,1902,50,0,1 +22,2,59924,1,9,0,4,3,0,1,0,0,40,0,0 +30,2,194141,5,10,2,8,0,0,0,0,1617,40,0,0 +51,2,95128,1,9,2,10,0,0,0,0,0,40,0,0 +46,2,292504,5,10,3,5,4,0,1,0,0,40,0,0 +32,5,45796,1,9,1,1,1,0,0,0,0,45,0,0 +42,2,119359,10,15,1,5,2,3,1,15024,0,40,27,1 +52,0,104280,5,10,1,9,1,0,0,0,0,50,0,0 +57,2,172291,1,9,2,0,5,1,1,0,0,40,0,0 +35,2,180988,5,10,2,0,4,0,1,0,0,39,0,0 +52,2,110748,3,14,1,3,1,0,0,0,0,50,0,1 +36,2,22494,5,10,2,1,4,0,1,0,0,40,0,0 +33,2,267859,5,10,1,1,1,0,0,0,0,40,1,1 +67,4,256821,1,9,2,11,0,1,0,0,0,20,0,0 +31,1,117346,5,10,1,5,1,0,0,0,0,48,0,0 +31,2,62374,1,9,1,3,1,0,0,0,0,50,0,0 +28,2,314659,5,10,0,8,0,0,0,0,0,42,0,0 +36,2,93225,1,9,2,10,0,0,0,0,0,40,0,0 +58,1,165315,1,9,1,5,1,0,0,0,0,35,0,1 +56,2,124771,1,9,1,8,1,0,0,0,0,40,0,0 +35,2,27408,5,10,0,5,0,0,0,0,0,40,0,0 +37,2,198841,9,11,1,10,1,0,0,0,0,40,0,1 +44,2,271792,0,13,3,1,4,0,1,0,0,40,0,0 +26,2,64289,1,9,0,7,3,0,0,0,0,40,0,0 +51,2,183390,1,9,1,6,1,0,0,0,0,40,0,0 +31,2,240771,5,10,1,10,1,0,0,4386,0,50,0,1 +30,2,234919,5,10,0,5,3,0,1,0,0,40,22,0 +20,2,88231,5,10,0,0,0,0,1,0,0,40,0,0 +21,2,154422,5,10,0,0,3,2,1,0,0,40,0,0 +37,2,119098,0,13,1,3,1,0,0,0,0,50,0,1 +53,0,151580,9,11,1,3,1,0,0,4386,0,40,0,1 +54,2,118793,1,9,1,0,1,0,0,0,0,45,0,0 +30,2,271710,0,13,1,5,1,0,0,7298,0,50,0,1 +43,0,308498,1,9,3,1,4,0,1,0,0,40,0,0 +48,2,172695,9,11,2,4,3,0,1,0,0,40,0,0 +42,1,29962,0,13,1,5,1,0,0,0,0,48,0,0 +62,2,200332,1,9,1,8,1,0,0,0,0,40,0,0 +31,2,291702,1,9,1,10,1,0,0,0,0,40,0,0 +22,2,67234,1,9,0,5,0,0,0,0,0,60,0,0 +45,2,168038,0,13,1,1,1,0,0,0,0,32,0,0 +34,2,137814,5,10,4,5,0,0,0,0,0,45,0,0 +64,2,126233,1,9,1,1,1,0,0,0,0,20,0,0 +42,1,79036,0,13,1,7,1,0,0,0,0,65,0,0 +60,1,327474,1,9,1,5,1,0,0,0,0,70,0,0 +44,2,145160,1,9,0,10,5,0,0,0,0,58,0,0 +53,1,33304,10,15,1,3,1,0,0,0,0,38,0,1 +37,2,359001,9,11,1,6,1,0,0,15024,0,50,0,1 +23,2,133515,1,9,0,4,0,0,1,0,0,35,0,0 +28,2,168901,0,13,1,3,1,2,0,0,0,40,18,0 +55,2,750972,7,4,1,10,1,0,0,0,0,41,0,0 +58,2,142924,3,14,0,0,0,0,1,0,0,24,0,1 +74,5,228075,5,10,1,1,1,0,0,20051,0,25,0,1 +27,2,91189,1,9,0,0,3,0,0,0,0,40,0,0 +37,2,290609,1,9,2,0,4,1,1,0,0,40,0,0 +44,1,216921,12,6,1,4,1,0,0,0,0,70,0,0 +23,2,120046,6,12,0,0,3,0,0,0,0,40,0,0 +41,2,324629,0,13,1,1,1,0,0,0,0,40,29,0 +45,2,81132,5,10,1,9,1,2,0,0,0,55,0,1 +29,2,160279,1,9,2,8,4,0,0,0,0,40,0,0 +33,2,229732,0,13,0,5,0,0,0,0,0,45,0,1 +61,4,144723,3,14,1,1,1,0,0,7298,0,60,0,1 +29,2,148431,6,12,1,5,2,4,1,7688,0,45,0,1 +22,2,160398,5,10,0,5,5,0,0,0,0,38,0,0 +28,2,129460,4,5,0,10,0,0,0,0,0,40,22,0 +30,2,252752,0,13,1,3,2,0,1,0,0,40,0,0 +20,2,58222,5,10,0,2,3,0,0,0,0,20,0,0 +45,2,114459,1,9,1,10,1,0,0,0,0,50,0,1 +42,2,223934,6,12,2,1,4,0,1,0,0,40,0,0 +34,2,84119,1,9,0,10,3,0,0,0,0,40,0,0 +31,2,159123,0,13,1,3,1,0,0,0,0,60,0,1 +23,2,195532,0,13,0,1,3,0,1,0,0,40,0,0 +50,2,191299,1,9,1,10,1,0,0,0,0,50,0,0 +40,2,198316,12,6,1,1,1,0,0,0,0,40,0,1 +57,2,162301,1,9,2,0,0,0,1,0,0,45,0,0 +35,2,143152,5,10,1,0,2,0,1,3908,0,27,0,0 +24,2,92609,0,13,0,1,3,0,0,0,0,45,0,0 +27,2,247819,5,10,0,0,0,0,1,0,0,15,0,0 +27,4,229223,5,10,0,11,3,0,1,0,0,40,0,1 +45,5,142719,1,9,1,5,1,0,0,0,0,40,0,0 +80,2,86111,8,16,1,3,1,0,0,0,0,30,0,0 +23,0,35633,5,10,0,4,0,0,0,0,0,50,0,0 +46,2,164749,5,10,1,1,1,0,0,0,0,40,0,1 +38,2,607848,0,13,1,5,1,0,0,0,0,40,0,1 +50,2,173630,1,9,2,5,0,0,0,0,0,60,0,0 +55,2,49737,5,10,1,5,1,0,0,0,0,50,0,0 +72,2,183616,1,9,1,1,2,0,1,0,0,50,7,0 +65,2,129426,5,10,6,0,0,0,1,0,0,40,0,0 +37,2,454915,12,6,2,10,0,0,0,0,0,40,0,0 +39,0,55568,1,9,1,0,2,0,1,0,0,40,0,0 +38,2,29874,9,11,1,10,1,0,0,0,0,40,0,0 +46,2,393715,5,10,1,1,1,0,0,15024,0,50,0,1 +50,2,143953,1,9,1,5,1,0,0,0,0,65,0,1 +54,2,90363,6,12,1,1,1,0,0,0,0,40,0,1 +40,2,53727,3,14,0,5,0,0,0,0,0,50,0,1 +30,2,130021,7,4,1,10,1,0,0,2829,0,40,0,0 +50,2,173630,1,9,1,7,1,0,0,0,0,35,0,0 +28,2,410351,5,10,0,10,0,0,0,0,0,30,0,0 +34,2,399386,9,11,1,10,1,0,0,0,0,53,0,0 +55,2,157932,1,9,2,2,0,0,0,0,0,40,0,0 +20,2,133061,1,9,0,2,3,0,0,0,0,40,0,0 +21,2,107895,5,10,0,0,0,0,0,0,0,35,0,0 +39,2,63021,5,10,2,4,0,0,1,0,0,20,0,0 +43,2,186144,1,9,1,10,1,0,0,0,0,40,0,1 +33,4,27959,1,9,0,4,4,3,0,0,0,40,0,0 +26,2,179569,5,10,0,0,0,0,1,0,0,40,0,0 +45,0,101299,8,16,1,3,1,0,0,0,0,40,0,1 +31,0,113129,5,10,0,4,3,0,1,0,0,65,0,0 +32,2,316470,11,3,1,10,1,0,0,0,0,60,4,0 +60,1,89884,1,9,1,5,1,0,0,0,0,50,0,0 +41,2,32121,1,9,1,8,1,0,0,0,0,40,0,1 +21,2,315303,5,10,0,4,3,1,0,0,0,20,0,0 +27,2,254500,5,10,2,0,4,1,1,0,0,36,0,0 +33,2,419895,11,3,2,2,4,0,0,0,0,40,4,0 +43,2,159549,1,9,1,10,1,0,0,0,0,40,0,0 +27,2,160786,2,7,1,10,1,0,0,0,1902,40,0,1 +18,1,258474,12,6,0,7,3,0,0,0,0,40,0,0 +48,1,370119,5,10,1,1,1,0,0,0,0,40,0,1 +37,2,50837,7,4,2,1,0,0,0,0,0,50,0,0 +58,2,137506,1,9,1,8,1,0,0,0,0,40,0,0 +57,2,548256,14,8,1,6,1,1,0,7688,0,40,0,1 +42,4,175642,0,13,0,0,0,0,1,99999,0,40,0,1 +24,2,183594,1,9,0,0,5,0,0,0,0,40,0,0 +26,2,341353,0,13,0,4,5,0,0,0,0,15,0,0 +43,5,247981,1,9,2,10,4,0,0,5455,0,50,0,0 +34,2,193565,2,7,1,10,1,0,0,0,0,40,0,0 +38,2,39606,0,13,1,1,2,0,1,0,0,40,0,0 +51,1,127149,2,7,1,7,1,0,0,0,0,45,0,1 +49,1,182752,8,16,1,3,2,0,1,0,0,35,0,1 +26,2,269060,0,13,0,0,3,0,1,0,0,40,0,0 +28,2,179949,1,9,2,6,4,1,1,0,0,20,0,0 +22,3,32950,5,10,1,5,1,0,0,0,1902,37,0,0 +26,2,160445,1,9,2,10,0,0,0,0,0,40,0,0 +45,2,223999,4,5,1,4,1,0,0,0,1848,40,0,1 +39,2,81487,5,10,2,1,4,0,1,0,625,40,0,0 +23,2,314539,1,9,1,5,1,0,0,0,0,40,0,0 +42,4,100793,0,13,1,3,1,0,0,0,0,60,0,1 +39,3,255407,1,9,1,10,1,0,0,0,0,40,0,0 +43,3,92775,9,11,2,10,0,0,0,0,0,40,0,0 +33,1,33308,5,10,0,7,0,0,0,0,0,70,0,0 +68,0,493363,0,13,1,1,1,0,0,0,0,20,0,0 +32,2,107218,0,13,0,0,0,2,0,0,0,40,0,0 +25,2,123586,5,10,0,0,4,4,0,0,0,40,0,0 +53,2,158352,11,3,1,4,5,0,1,0,0,24,25,0 +38,2,76317,9,11,1,1,1,0,0,0,0,55,0,1 +20,2,122346,1,9,0,8,3,0,0,0,0,40,0,0 +26,2,463194,1,9,1,10,1,0,0,0,0,40,0,0 +23,2,162228,1,9,0,6,3,0,0,0,0,40,0,0 +43,0,115005,1,9,2,9,0,0,1,0,0,40,0,0 +29,0,183285,5,10,0,11,0,0,0,0,0,36,0,0 +34,2,169605,12,6,4,4,4,0,1,0,0,36,0,0 +24,2,450695,5,10,0,5,3,0,0,0,0,35,0,0 +44,4,124692,3,14,1,3,1,0,0,0,0,35,0,1 +19,2,63918,5,10,0,0,0,0,0,0,0,40,0,0 +47,2,102569,0,13,1,0,1,0,0,0,0,40,0,1 +40,2,289309,5,10,2,4,0,0,1,0,0,48,0,0 +45,2,101825,1,9,6,5,4,0,1,0,0,45,0,0 +43,2,206833,1,9,4,2,4,1,1,0,0,45,0,0 +50,2,145333,8,16,2,3,5,0,0,10520,0,50,0,1 +29,2,206351,0,13,0,3,0,0,0,0,0,40,0,0 +47,2,198200,0,13,0,1,0,0,0,0,0,50,0,0 +24,2,140001,1,9,0,5,3,0,0,0,0,35,22,0 +21,2,143604,1,9,0,0,3,0,1,0,0,40,0,0 +30,1,146161,1,9,1,1,1,0,0,0,1887,50,0,1 +74,1,192413,10,15,2,3,5,0,0,0,0,40,0,0 +70,1,139889,5,10,1,7,1,0,0,2653,0,70,0,0 +27,2,104917,9,11,1,10,1,0,0,0,0,40,0,0 +32,4,161478,0,13,2,0,4,2,1,0,0,46,0,0 +30,2,35644,2,7,1,2,1,0,0,0,0,50,0,0 +29,4,116751,9,11,2,11,4,0,0,0,0,56,0,0 +18,2,238867,2,7,0,2,3,0,0,0,1602,40,0,0 +31,2,265706,1,9,1,10,1,0,0,7298,0,40,0,1 +39,0,179668,5,10,1,11,1,0,0,0,0,70,0,0 +21,2,57951,5,10,0,4,3,0,1,0,0,30,0,0 +31,2,176711,1,9,1,6,1,0,0,0,0,38,0,0 +33,4,368675,5,10,1,11,1,0,0,0,0,40,0,0 +39,2,216149,10,15,2,3,0,0,0,0,0,70,0,1 +29,2,173851,1,9,1,10,1,0,0,0,0,40,0,0 +34,2,90705,5,10,1,9,1,0,0,0,1485,40,0,0 +52,0,216342,0,13,6,1,4,0,1,0,0,55,0,0 +35,2,140752,1,9,0,5,0,0,0,0,0,25,0,0 +33,2,116508,12,6,1,10,1,0,0,0,0,40,0,0 +43,2,180303,0,13,1,1,1,2,0,0,0,50,0,1 +51,4,110327,0,13,1,1,1,0,0,0,0,40,0,1 +36,2,185607,1,9,0,4,4,0,1,0,0,30,0,0 +17,4,244856,2,7,0,3,3,0,1,0,0,40,0,0 +32,2,198068,1,9,1,10,1,0,0,0,0,40,0,0 +39,2,97136,1,9,0,8,4,1,1,0,0,40,0,0 +19,5,164658,5,10,0,7,3,0,0,0,0,60,0,0 +54,2,235693,2,7,2,0,0,0,0,0,0,40,0,1 +45,2,197038,0,13,2,3,0,0,0,0,0,50,0,1 +47,4,97419,0,13,2,3,0,1,1,0,0,40,0,0 +49,1,208872,1,9,1,7,1,0,0,0,1672,98,0,0 +32,2,205528,1,9,2,0,4,0,1,0,0,40,0,0 +28,5,146042,1,9,1,10,1,0,0,0,0,50,0,0 +39,5,222641,0,13,1,5,1,0,0,0,0,40,0,0 +27,5,376936,1,9,0,5,0,0,0,0,0,50,0,0 +42,4,138077,3,14,1,3,2,0,1,0,0,38,0,1 +24,2,155913,0,13,1,3,1,0,0,0,0,44,0,0 +45,2,36006,0,13,1,10,1,0,0,0,0,45,0,1 +19,2,214678,1,9,0,4,3,0,0,0,0,30,0,0 +46,2,369538,12,6,1,6,1,0,0,0,0,40,0,1 +50,2,166565,1,9,1,6,1,0,0,0,0,40,0,0 +32,2,257043,1,9,0,0,0,0,1,0,0,42,0,0 +47,5,181130,10,15,1,3,1,0,0,99999,0,50,0,1 +43,1,38876,1,9,1,7,1,0,0,0,0,50,0,0 +29,2,187073,0,13,0,10,0,0,0,0,0,40,0,0 +90,2,313749,0,13,0,3,3,0,1,0,0,10,0,0 +41,2,331651,10,15,1,1,2,0,1,0,0,50,28,1 +24,2,243368,13,1,0,7,0,0,0,0,0,36,4,0 +24,2,32921,5,10,0,7,3,0,0,0,0,50,0,0 +24,2,117167,5,10,0,4,0,0,1,0,0,53,0,0 +35,2,401930,1,9,1,0,2,0,1,0,1887,42,0,1 +30,2,114691,0,13,0,0,5,0,0,0,0,40,0,0 +46,2,99385,0,13,4,1,4,0,1,0,0,40,0,0 +19,4,210308,5,10,0,0,3,0,1,0,1721,30,0,0 +39,2,252327,4,5,4,10,3,0,0,0,0,35,4,0 +43,2,90582,1,9,1,6,1,0,0,0,0,40,0,0 +35,2,190194,1,9,0,0,0,0,1,0,0,40,0,0 +65,2,264188,1,9,6,5,0,0,1,0,0,24,0,0 +34,2,243776,1,9,2,10,4,0,0,0,0,40,0,0 +41,2,67065,9,11,1,5,1,0,0,0,0,40,0,0 +24,1,204209,5,10,0,7,3,0,0,0,0,60,0,0 +24,2,226668,1,9,0,4,0,3,0,0,0,35,0,0 +34,5,174215,3,14,0,1,0,0,1,4787,0,45,23,1 +33,2,315143,1,9,1,5,1,0,0,0,0,40,1,1 +37,2,118681,1,9,0,8,0,0,0,0,0,38,5,0 +39,1,208109,1,9,1,6,1,0,0,0,0,60,0,1 +58,2,116901,1,9,2,4,4,0,1,0,0,25,0,0 +36,1,405644,1,9,1,10,1,0,0,0,0,35,4,0 +33,3,293550,5,10,1,9,2,0,1,4064,0,40,0,0 +42,4,328581,3,14,1,3,1,0,0,0,0,55,0,0 +57,2,158827,1,9,4,10,4,0,0,0,0,40,0,0 +67,3,65475,1,9,1,9,1,0,0,0,0,40,0,1 +23,2,159709,1,9,2,10,0,0,0,0,0,40,0,0 +35,2,140474,5,10,1,3,1,3,0,0,0,40,0,0 +43,2,144778,0,13,1,3,1,0,0,0,0,55,25,1 +39,1,83242,5,10,1,7,1,0,0,0,0,60,0,0 +36,2,143385,1,9,0,10,0,0,0,0,0,40,0,0 +29,4,167544,6,12,2,4,4,0,1,0,0,13,0,0 +25,2,122175,1,9,0,2,3,0,0,0,0,40,0,0 +54,2,378747,12,6,4,6,4,1,0,0,0,45,0,1 +24,2,230475,1,9,1,10,1,0,0,0,0,44,0,0 +50,5,120781,0,13,1,5,1,2,0,0,0,60,27,1 +70,2,206232,12,6,1,8,1,0,0,0,0,50,0,0 +61,2,298400,0,13,2,5,0,1,0,4787,0,48,0,1 +51,3,163671,0,13,1,1,1,0,0,0,1902,40,0,0 +38,1,140583,3,14,1,7,1,0,0,0,0,70,0,0 +51,2,137253,1,9,2,3,4,0,1,0,0,40,0,1 +28,2,246974,1,9,0,4,0,0,0,0,0,40,0,0 +66,1,182470,10,15,1,3,1,0,0,0,0,25,0,1 +57,5,107617,1,9,4,7,0,0,0,0,0,60,0,1 +29,2,250819,5,10,0,0,0,0,1,0,0,40,0,0 +21,2,196508,5,10,0,5,3,1,1,0,0,40,0,0 +42,2,367533,12,6,1,10,3,4,0,0,0,43,0,1 +74,2,188709,10,15,1,3,1,0,0,99999,0,50,0,1 +50,2,271160,5,10,2,5,0,0,1,0,0,40,0,0 +65,2,173674,1,9,2,4,5,0,1,0,0,14,0,0 +44,2,322391,2,7,4,4,4,1,1,0,0,30,0,0 +34,2,209691,9,11,1,3,1,0,0,4386,0,50,0,1 +17,2,104232,12,6,0,4,3,0,0,0,0,10,0,0 +43,2,88233,5,10,1,6,1,0,0,0,0,60,0,0 +32,2,240888,6,12,2,0,4,0,1,0,0,40,0,0 +54,2,169719,0,13,1,5,1,0,0,3103,0,40,0,1 +20,2,129240,5,10,0,0,3,0,1,0,0,20,0,0 +23,2,160968,5,10,0,3,3,0,0,0,0,10,0,0 +34,2,236861,1,9,1,4,1,0,0,0,0,45,0,0 +30,2,109282,5,10,0,5,3,0,0,0,0,20,0,0 +32,2,215047,7,4,1,8,1,0,0,0,0,40,0,0 +40,2,115932,0,13,1,3,1,0,0,0,0,60,38,1 +28,2,55360,5,10,0,10,0,1,0,0,0,40,0,0 +44,2,224658,1,9,1,10,1,0,0,0,0,45,0,1 +29,4,376302,9,11,1,9,2,0,1,0,0,35,35,1 +28,2,183597,8,16,0,3,0,0,0,594,0,50,9,0 +37,2,115289,5,10,1,1,1,0,0,0,0,40,0,0 +56,5,258883,5,10,1,10,1,0,0,0,0,40,0,0 +27,2,69132,0,13,0,3,0,0,0,0,0,40,0,0 +34,2,207301,1,9,2,8,4,0,1,0,0,20,0,0 +37,2,179671,1,9,2,10,0,0,0,0,0,40,0,0 +66,1,140456,0,13,1,5,1,0,0,0,0,40,0,1 +19,2,327397,1,9,0,3,3,0,0,0,0,30,0,0 +60,2,200235,9,11,2,3,4,0,1,0,0,40,0,0 +54,1,108435,5,10,1,6,1,0,0,2829,0,30,0,0 +47,2,195978,1,9,1,10,1,0,0,0,0,40,0,1 +47,2,329144,5,10,2,3,0,0,0,0,0,48,0,1 +48,5,250674,9,11,1,10,1,0,0,0,0,60,0,0 +50,5,132716,5,10,1,1,1,0,0,0,0,50,9,1 +62,2,174201,4,5,6,4,4,1,1,0,0,25,0,0 +45,2,167617,5,10,1,4,1,0,0,0,0,40,0,0 +55,4,254949,1,9,1,2,1,0,0,0,0,40,0,0 +62,2,319582,1,9,6,5,0,0,1,0,0,32,0,0 +25,2,248990,12,6,1,8,1,0,0,0,0,40,24,0 +49,2,144396,2,7,2,1,0,0,1,0,0,38,0,0 +32,0,200469,5,10,0,11,4,1,1,3887,0,40,0,0 +25,3,55636,1,9,0,2,0,3,0,0,0,40,0,0 +39,2,185624,5,10,1,8,1,0,0,0,0,50,0,0 +27,4,125442,5,10,1,1,1,0,0,0,0,50,0,0 +43,2,160943,1,9,1,4,1,1,0,0,0,40,0,1 +30,2,243841,1,9,2,4,5,2,1,0,0,40,27,0 +21,2,34616,5,10,0,5,3,0,1,0,0,20,0,0 +33,2,235847,10,15,1,1,2,0,1,0,0,40,0,1 +33,2,174789,5,10,0,0,0,0,0,0,0,50,0,0 +33,2,280111,2,7,0,0,4,1,1,0,0,38,0,0 +70,2,236055,7,4,6,4,0,0,1,0,0,35,0,0 +25,2,237865,5,10,0,4,3,1,0,0,0,42,0,0 +17,2,194612,2,7,0,4,3,0,0,0,0,25,0,0 +20,2,173851,5,10,0,7,3,0,0,0,0,40,0,0 +19,2,372483,5,10,0,4,5,1,0,0,0,35,0,0 +71,3,422149,5,10,1,1,1,0,0,20051,0,40,0,1 +31,2,174201,6,12,1,1,1,0,0,0,0,40,0,0 +26,2,272618,0,13,1,5,1,0,0,0,0,55,0,0 +52,2,74660,3,14,1,1,1,0,0,0,0,40,0,0 +26,2,201481,0,13,0,1,0,0,1,0,0,40,0,0 +38,2,175232,1,9,2,8,0,0,0,0,0,45,0,0 +25,2,336440,5,10,0,4,0,0,0,0,0,40,0,0 +22,2,46645,0,13,0,3,0,0,1,0,0,9,0,0 +48,0,31141,5,10,1,11,1,0,0,0,1902,40,0,1 +53,2,281425,1,9,1,10,1,0,0,0,0,40,0,1 +30,1,31510,6,12,2,10,0,0,0,0,0,50,0,0 +44,2,310255,5,10,1,10,1,0,0,0,0,60,0,1 +32,3,82393,0,13,1,3,1,2,0,0,0,56,0,1 +59,1,190514,2,7,1,10,1,0,0,0,0,20,0,0 +49,2,165513,5,10,2,2,4,1,1,0,0,40,0,0 +31,2,226696,1,9,0,10,0,0,0,0,0,50,0,1 +53,2,195813,11,3,1,10,1,4,0,5178,0,40,5,1 +44,2,165815,4,5,0,8,0,0,0,0,0,40,0,0 +36,2,123983,0,13,1,3,1,2,0,0,0,55,28,1 +36,2,235371,1,9,0,5,0,0,1,0,0,40,0,0 +37,2,147258,4,5,1,8,1,0,0,0,0,50,0,1 +67,5,171564,1,9,1,3,2,0,1,20051,0,30,7,1 +29,2,255949,0,13,0,5,4,1,0,0,0,40,0,0 +52,2,186272,1,9,2,5,0,0,0,0,0,40,0,0 +37,2,282872,1,9,1,10,1,0,0,0,1628,40,0,0 +21,2,111676,5,10,0,4,0,0,1,0,0,40,0,0 +36,2,199501,5,10,2,1,4,1,1,0,0,38,0,0 +24,2,151443,1,9,0,8,5,1,1,0,0,30,0,0 +31,2,145935,1,9,0,1,3,1,0,0,0,40,0,0 +54,3,230387,1,9,6,0,4,0,1,0,0,35,0,0 +44,2,127592,0,13,1,9,1,0,0,0,0,40,0,0 +18,2,210828,5,10,0,2,3,4,0,0,0,30,0,0 +41,2,297186,1,9,1,6,2,0,1,0,0,40,0,0 +37,5,116554,3,14,2,1,0,0,1,0,0,70,0,0 +26,0,147719,0,13,0,3,0,2,0,0,0,20,3,0 +68,1,89011,8,16,1,3,1,0,0,0,0,50,8,0 +31,2,38158,5,10,1,5,1,0,0,0,0,40,0,0 +48,2,178686,1,9,2,10,0,0,0,0,0,40,0,0 +26,2,155752,5,10,1,8,1,1,0,0,0,40,0,0 +63,2,100099,4,5,1,6,1,0,0,0,0,40,0,0 +19,2,231688,5,10,0,8,3,0,0,0,0,20,0,0 +42,5,50122,1,9,1,5,1,0,0,0,0,60,0,0 +64,3,86837,6,12,1,4,1,2,0,0,0,40,0,1 +32,2,113364,0,13,0,6,0,0,0,0,0,40,0,0 +50,2,289390,1,9,1,10,1,0,0,0,0,47,0,0 +73,2,77884,1,9,1,7,1,2,0,0,0,40,11,0 +32,2,390157,0,13,0,3,0,1,1,0,0,40,0,0 +53,2,89587,5,10,1,6,1,0,0,7298,0,45,0,1 +58,2,234328,0,13,2,5,0,0,0,0,0,40,0,0 +37,4,365430,5,10,1,10,1,0,0,5178,0,40,0,1 +24,2,410439,5,10,0,10,3,0,0,0,0,15,0,0 +53,2,129525,0,13,1,1,1,0,0,0,0,50,0,1 +23,2,166527,5,10,0,1,3,4,1,0,0,40,0,0 +30,2,210906,1,9,1,1,5,0,1,0,0,40,0,0 +38,2,405284,0,13,0,4,3,0,1,0,0,35,0,0 +28,2,138269,1,9,0,10,0,0,0,0,0,40,0,0 +19,2,25429,14,8,0,4,3,0,1,0,0,20,0,0 +45,2,231672,1,9,1,8,1,1,0,0,0,40,0,0 +26,2,258550,0,13,0,0,3,0,0,0,0,40,0,0 +33,2,268147,4,5,0,5,4,0,1,0,0,40,0,0 +54,2,37289,3,14,1,1,2,0,1,0,0,55,0,1 +23,2,157951,5,10,0,1,0,0,1,0,0,50,0,0 +43,5,225165,1,9,1,5,1,0,0,0,0,55,0,1 +37,2,238049,4,5,0,13,0,0,1,0,0,30,22,0 +31,2,197252,7,4,1,4,1,0,0,0,0,40,4,0 +56,5,216636,14,8,1,1,1,0,0,0,1651,40,0,0 +25,2,183575,2,7,0,10,3,0,0,0,0,40,0,0 +17,2,19752,2,7,0,4,3,1,1,0,0,25,0,0 +37,2,103925,1,9,6,0,4,0,1,0,0,68,0,0 +60,2,31577,9,11,1,9,1,0,0,0,0,40,0,0 +59,3,61298,0,13,3,1,0,0,1,0,0,40,0,0 +59,3,190541,1,9,1,10,1,0,0,0,0,40,0,1 +46,1,366089,10,15,1,3,1,0,0,15024,0,40,0,1 +24,2,216129,1,9,0,10,3,0,0,0,1408,50,0,0 +29,2,51944,1,9,1,4,2,0,1,4386,0,40,0,1 +33,1,67482,9,11,2,4,4,0,1,0,0,99,0,0 +23,0,279243,5,10,0,11,0,0,0,0,0,40,0,0 +20,2,278391,5,10,0,0,3,0,0,0,0,25,35,0 +60,2,349898,1,9,6,4,0,0,1,0,0,44,0,0 +44,2,219441,12,6,0,5,4,4,1,0,0,35,21,0 +18,2,173255,1,9,0,6,3,0,0,1055,0,25,0,0 +52,3,29623,14,8,0,4,4,1,1,0,0,40,0,0 +31,2,217460,1,9,2,10,0,0,0,0,0,45,0,0 +30,2,163604,0,13,6,3,4,0,1,0,0,55,0,1 +33,2,163110,1,9,1,2,1,0,0,3781,0,40,0,0 +20,2,238685,5,10,0,4,0,0,1,0,0,32,0,0 +33,2,213308,9,11,4,0,3,1,1,0,0,50,0,0 +25,2,193773,1,9,0,4,0,1,1,0,0,35,0,0 +63,2,114011,1,9,4,10,0,0,1,0,0,20,0,0 +63,1,52144,5,10,6,1,0,0,0,0,0,35,0,0 +43,2,347934,1,9,4,5,0,0,1,0,0,30,0,0 +58,2,293399,2,7,6,8,0,0,1,0,0,40,0,0 +35,2,127306,9,11,0,0,3,0,1,14344,0,40,0,1 +42,2,366180,5,10,1,1,1,0,0,0,0,55,0,1 +20,4,188950,5,10,0,11,3,0,0,0,0,25,0,0 +35,2,189382,1,9,2,10,0,0,0,0,0,40,0,0 +62,2,24515,4,5,1,1,1,0,0,0,0,40,0,0 +41,2,283116,1,9,2,10,4,0,1,1506,0,50,0,0 +43,1,182217,0,13,1,3,2,0,1,0,0,35,0,0 +19,2,552354,14,8,0,8,3,0,0,0,0,40,0,0 +46,2,163021,1,9,0,0,3,0,1,0,0,40,0,0 +47,2,61885,0,13,1,3,1,0,0,15024,0,50,0,1 +36,1,182898,0,13,1,1,1,0,0,7298,0,40,0,1 +45,2,183092,6,12,0,0,0,1,1,0,0,40,0,0 +48,2,30289,12,6,1,10,1,0,0,0,0,30,0,0 +29,2,77572,6,12,0,0,0,2,1,0,0,40,0,0 +48,0,118330,0,13,1,1,1,0,0,5178,0,40,0,1 +36,2,469056,1,9,2,5,4,1,1,0,0,25,0,0 +58,2,145574,2,7,1,10,1,0,0,0,0,40,0,0 +43,2,302041,1,9,0,0,0,1,1,0,0,40,0,0 +59,2,32552,0,13,1,10,1,0,0,0,0,4,0,0 +42,2,185413,0,13,1,1,1,0,0,0,0,40,0,0 +33,3,26543,9,11,1,9,1,0,0,0,0,40,0,1 +23,3,163870,5,10,0,12,5,0,0,0,0,40,0,0 +21,2,240063,5,10,0,2,3,0,0,0,0,25,0,0 +48,2,208748,11,3,2,8,4,4,1,0,0,40,21,0 +32,4,84119,1,9,1,10,1,0,0,0,0,40,0,0 +31,2,84130,5,10,1,0,1,0,0,0,0,50,0,1 +66,4,261062,3,14,6,3,0,0,1,0,0,40,0,0 +23,4,336010,0,13,0,0,0,0,0,0,0,32,0,0 +52,2,389270,5,10,1,0,2,0,1,0,0,35,0,1 +17,2,138293,2,7,0,2,3,0,0,0,0,15,0,0 +35,2,240389,5,10,1,5,1,0,0,0,0,43,0,1 +39,2,190297,8,16,1,3,1,0,0,99999,0,55,0,1 +24,2,149457,5,10,0,0,4,0,1,0,0,40,0,0 +45,2,81534,1,9,1,4,1,2,0,0,0,84,28,1 +25,2,378322,1,9,0,10,0,0,0,0,2001,50,0,0 +29,3,196912,0,13,0,3,0,1,0,0,0,40,0,0 +56,2,116143,0,13,1,0,1,0,0,5178,0,44,0,1 +34,1,80933,1,9,2,7,0,0,0,0,0,40,0,0 +64,4,190660,1,9,2,10,0,0,0,0,0,40,0,1 +27,2,120155,1,9,1,0,1,0,0,0,0,39,0,0 +47,2,167159,1,9,2,8,0,0,0,4650,0,40,0,0 +36,2,58343,0,13,1,9,1,0,0,3103,0,42,0,1 +44,3,161240,1,9,2,8,0,0,0,0,0,40,0,0 +31,2,126402,1,9,0,7,0,1,1,0,0,60,0,0 +23,2,148709,1,9,1,0,5,0,1,0,0,35,0,0 +45,4,318280,5,10,1,3,1,0,0,7688,0,50,0,1 +31,4,80058,1,9,0,8,3,0,0,0,0,64,0,0 +45,2,274689,12,6,1,10,1,0,0,0,0,60,0,0 +33,2,217460,6,12,1,3,1,0,0,0,0,40,0,1 +33,4,33727,3,14,1,3,2,0,1,0,0,40,0,0 +30,1,166961,5,10,1,0,2,0,1,0,0,20,0,1 +25,2,146117,5,10,0,8,0,0,0,0,0,42,0,0 +70,1,124449,3,14,1,1,1,0,0,0,2246,8,0,1 +22,2,50163,4,5,0,6,3,0,0,0,0,40,0,0 +30,2,235271,0,13,1,5,1,0,0,0,0,40,0,1 +46,2,121124,6,12,1,1,1,0,0,15024,0,50,0,1 +43,1,144218,14,8,1,6,1,0,0,0,0,60,0,0 +37,2,94334,7,4,0,8,3,0,1,0,0,25,0,0 +59,5,169982,5,10,1,1,1,0,0,15024,0,60,0,1 +51,1,35295,1,9,0,7,4,0,0,0,0,45,0,0 +47,2,133969,0,13,1,1,1,2,0,2885,0,65,28,0 +36,2,35429,5,10,1,1,1,0,0,0,0,60,0,0 +73,4,205580,11,3,1,3,1,0,0,0,0,6,0,0 +32,4,177794,3,14,0,3,0,0,1,0,0,40,0,0 +34,2,167474,1,9,1,5,1,0,0,0,0,50,0,0 +51,4,35211,1,9,1,6,1,3,0,0,0,40,0,0 +20,2,117244,1,9,0,8,4,0,1,0,0,45,0,0 +57,2,194850,5,10,1,4,1,4,0,0,0,40,4,0 +19,2,144911,5,10,0,4,3,0,0,0,0,20,0,0 +45,2,197240,14,8,1,5,1,0,0,7688,0,40,0,1 +55,2,101338,12,6,1,10,1,0,0,0,0,40,0,0 +60,2,148522,5,10,1,10,1,3,0,0,0,40,0,0 +19,2,97261,1,9,0,7,0,0,0,0,0,40,0,0 +35,2,166606,1,9,1,9,1,0,0,0,0,40,0,0 +20,2,229414,1,9,0,8,3,0,1,0,0,30,0,0 +34,4,209213,0,13,0,3,5,1,0,0,0,15,0,0 +26,2,291968,10,15,1,3,1,0,0,0,1977,40,0,1 +73,3,127858,5,10,6,9,0,0,1,3273,0,40,0,0 +27,2,302406,3,14,1,3,1,0,0,0,0,55,0,0 +37,1,29054,9,11,0,7,3,0,0,0,0,84,0,0 +73,1,336007,1,9,1,5,1,0,0,0,0,40,0,0 +46,3,349230,9,11,1,9,1,0,0,0,1848,40,0,1 +36,4,101481,1,9,0,0,0,0,0,0,0,40,0,0 +54,1,46704,1,9,1,7,1,0,0,0,0,60,0,1 +49,2,233639,2,7,1,4,1,0,0,0,0,50,0,0 +68,4,31725,1,9,1,7,1,0,0,0,0,40,0,0 +34,2,54850,0,13,0,1,0,0,0,0,1590,50,0,0 +30,2,293512,9,11,0,3,0,1,0,0,0,40,0,0 +28,2,375655,0,13,0,5,4,0,0,0,0,50,0,0 +28,2,105817,2,7,1,1,1,0,0,0,0,50,0,1 +25,4,203408,5,10,1,4,1,0,0,0,0,40,0,0 +26,2,162302,5,10,0,8,0,2,0,0,0,40,11,0 +40,2,163455,5,10,1,9,1,0,0,0,0,55,0,1 +32,4,100135,1,9,2,0,4,0,1,0,0,40,0,0 +18,2,102182,14,8,0,13,0,0,1,0,0,30,0,0 +36,2,414683,0,13,1,3,1,1,0,0,0,40,0,0 +26,2,194352,0,13,0,3,3,0,1,0,0,40,0,0 +24,2,194096,1,9,0,3,3,0,1,0,0,45,0,0 +90,4,153602,1,9,1,4,1,0,0,6767,0,40,0,0 +20,2,215495,5,10,0,0,3,0,1,0,0,40,4,0 +27,2,164607,0,13,4,9,3,0,0,0,0,50,0,0 +58,4,34878,0,13,2,3,0,0,1,0,0,50,0,0 +37,2,126569,3,14,1,1,1,0,0,0,1977,40,0,1 +28,2,22422,1,9,0,1,0,0,0,0,0,40,0,0 +36,4,178222,0,13,2,3,0,0,1,0,0,60,0,0 +45,4,56841,1,9,1,10,1,0,0,0,0,40,0,1 +23,2,300275,1,9,0,5,0,0,0,0,0,48,0,0 +69,4,197288,1,9,1,1,1,0,0,0,0,35,0,0 +58,1,157786,1,9,1,1,1,0,0,0,0,40,0,0 +22,2,110684,1,9,0,0,3,0,0,0,0,20,0,0 +58,1,140729,0,13,1,7,1,0,0,0,0,35,0,0 +53,3,90127,5,10,1,11,1,0,0,0,0,60,0,1 +44,5,37997,1,9,1,7,1,0,0,0,0,60,0,0 +31,2,61308,12,6,0,4,0,0,0,0,0,40,0,0 +46,2,171199,0,13,2,8,4,4,1,0,0,40,5,0 +48,2,128432,1,9,1,4,1,0,0,0,0,40,0,0 +46,3,195023,5,10,4,0,4,0,1,0,0,40,0,0 +43,2,122473,4,5,0,8,4,1,1,0,625,40,0,0 +43,2,171888,5,10,2,0,0,0,1,0,0,40,0,0 +17,5,183784,12,6,0,5,3,0,0,0,0,15,0,0 +20,2,219262,5,10,0,5,3,0,0,0,0,40,0,0 +22,2,71379,5,10,0,3,0,0,1,0,0,35,0,0 +35,2,96824,5,10,2,4,4,0,1,0,0,40,0,0 +29,2,242597,0,13,0,9,0,0,0,0,0,40,0,0 +25,2,204536,1,9,0,10,0,0,0,0,0,35,0,0 +54,2,143804,12,6,1,8,1,0,0,0,0,40,0,0 +23,2,80680,5,10,1,5,3,0,1,0,0,16,0,0 +36,2,301227,11,3,4,13,4,4,1,0,0,35,4,0 +26,1,201930,1,9,1,10,1,0,0,0,0,50,0,0 +25,4,176616,1,9,0,4,3,0,0,0,0,40,0,0 +46,2,353219,4,5,2,4,4,0,1,0,0,40,0,0 +41,2,126076,5,10,2,10,0,0,1,0,0,50,0,0 +31,2,156493,1,9,0,3,3,0,0,0,0,40,0,0 +48,3,435503,3,14,1,3,1,0,0,0,0,40,0,1 +52,5,561489,3,14,2,1,0,1,1,0,0,50,0,0 +22,3,100345,1,9,0,2,3,0,0,0,0,43,0,0 +18,2,36275,1,9,0,10,3,0,0,0,0,25,0,0 +46,2,110794,5,10,0,0,0,0,1,0,0,40,0,0 +34,4,143766,5,10,0,11,3,0,0,0,0,40,0,0 +30,3,76313,1,9,1,12,5,3,0,0,0,48,0,0 +31,2,121308,2,7,0,4,0,0,0,0,0,40,0,0 +21,2,216672,1,9,1,10,1,0,0,0,0,40,0,0 +41,1,89942,1,9,2,5,0,0,0,3674,0,45,0,0 +45,0,103406,0,13,1,1,1,0,0,0,1977,60,0,1 +30,0,158291,0,13,0,0,0,0,0,0,0,40,0,0 +21,2,455361,4,5,0,4,4,0,0,0,0,35,4,0 +44,2,225263,5,10,2,5,4,0,1,0,1408,46,0,0 +54,2,225307,2,7,2,10,3,0,1,0,0,50,0,1 +36,2,286115,1,9,1,10,1,0,0,0,0,40,0,1 +50,2,187830,0,13,0,1,0,0,0,0,0,50,0,1 +26,2,142506,0,13,0,3,4,1,1,0,0,35,0,0 +47,4,148576,10,15,1,3,1,0,0,0,0,35,0,0 +36,2,185325,1,9,0,4,3,0,0,0,0,37,0,0 +32,1,27939,5,10,1,5,1,3,0,0,0,60,0,0 +21,2,383603,12,6,0,4,0,0,1,0,0,35,0,0 +30,2,140790,1,9,1,5,1,0,0,0,0,45,0,0 +34,2,226629,1,9,0,13,0,0,1,0,0,40,4,0 +51,2,228516,1,9,3,10,0,0,0,0,0,45,13,0 +55,1,119762,12,6,1,6,1,0,0,0,0,50,0,0 +43,2,299197,5,10,1,0,1,0,0,0,0,40,0,0 +37,2,149297,1,9,0,2,0,3,0,0,0,30,0,0 +28,4,202558,5,10,0,1,3,0,1,0,0,40,0,0 +39,2,175232,5,10,1,3,1,0,0,0,0,50,0,0 +35,1,157473,1,9,1,10,1,0,0,0,0,40,0,0 +26,2,105787,1,9,0,10,3,0,0,0,0,36,0,0 +68,2,144056,1,9,1,0,1,0,0,3818,0,40,0,0 +46,2,45363,10,15,2,3,0,0,0,0,2824,40,0,1 +21,2,205838,1,9,0,4,3,0,0,0,0,37,0,0 +23,2,115326,5,10,0,5,3,0,1,0,0,20,0,0 +17,2,186890,12,6,1,5,3,0,1,0,0,30,0,0 +23,4,304386,1,9,0,4,0,0,1,0,0,40,0,0 +34,2,24529,1,9,6,0,4,0,0,0,0,15,0,0 +33,2,183557,6,12,0,3,0,0,1,0,0,40,0,0 +31,2,342730,6,12,4,6,0,0,0,0,0,45,0,0 +56,1,67841,1,9,1,5,1,0,0,0,0,40,0,0 +21,2,351381,1,9,0,0,3,0,1,0,0,40,0,0 +45,2,293691,1,9,2,0,0,2,1,0,1590,40,28,0 +41,5,220821,0,13,1,1,1,0,0,7688,0,40,0,1 +26,2,190027,12,6,2,2,0,0,1,0,0,30,0,0 +41,2,343944,2,7,6,4,4,0,1,0,0,40,0,0 +46,5,110457,3,14,1,1,1,0,0,0,0,55,0,1 +47,0,72333,1,9,2,0,4,2,1,0,0,40,0,0 +43,1,193494,10,15,1,3,1,0,0,0,0,60,0,1 +35,2,334999,1,9,1,5,1,0,0,0,0,45,0,0 +44,1,274363,1,9,2,5,0,0,0,0,0,50,0,0 +58,5,113806,0,13,1,1,1,0,0,7688,0,30,0,1 +25,2,52536,6,12,2,9,3,0,1,0,1594,25,0,0 +44,2,187720,9,11,0,10,4,0,0,0,0,40,0,0 +57,2,104996,5,10,0,10,0,0,0,0,0,42,0,0 +24,2,214555,5,10,1,2,1,0,0,0,0,40,0,0 +38,2,52963,0,13,0,0,0,0,1,0,0,50,0,0 +33,2,190511,7,4,2,2,0,0,0,2176,0,35,0,0 +25,2,75821,5,10,0,3,3,0,1,0,0,40,0,0 +33,2,123291,1,9,1,8,1,0,0,0,0,84,0,1 +50,4,226497,5,10,1,11,1,0,0,0,0,52,0,1 +35,2,282979,1,9,1,5,1,0,0,5178,0,50,0,1 +36,2,166549,0,13,2,0,0,0,0,0,0,55,0,1 +27,2,187746,5,10,0,4,3,0,1,0,0,40,0,0 +22,2,157145,9,11,0,10,3,0,0,0,0,50,0,0 +30,2,227551,1,9,1,6,1,0,0,0,0,40,0,0 +90,2,115306,3,14,0,1,3,0,1,0,0,40,0,0 +39,2,169249,1,9,4,4,5,1,0,0,0,40,0,0 +34,0,221966,0,13,0,3,0,0,0,0,0,45,0,0 +39,2,224566,0,13,1,1,1,0,0,0,0,60,0,1 +19,2,28119,5,10,0,4,3,0,1,0,0,4,0,0 +19,2,323810,12,6,0,10,0,0,0,0,0,40,0,0 +29,2,210498,1,9,1,10,1,0,0,0,0,40,0,0 +66,1,174995,6,12,1,10,1,0,0,2290,0,30,39,0 +38,2,161141,5,10,1,9,1,0,0,0,0,45,0,0 +44,2,210534,11,3,1,2,1,0,0,0,0,40,4,0 +34,1,112650,7,4,0,10,3,0,0,0,0,40,0,0 +35,0,318891,6,12,6,1,0,0,1,0,0,40,0,0 +29,4,375655,0,13,0,3,0,0,0,0,0,40,0,0 +22,2,228465,1,9,1,6,1,1,0,0,0,40,0,0 +73,2,183213,9,11,6,3,0,0,0,25124,0,60,0,1 +35,4,177305,5,10,1,1,1,0,0,0,2377,40,0,0 +41,2,34037,1,9,0,2,0,0,0,0,0,40,0,0 +27,1,116613,5,10,1,4,2,0,1,0,0,50,0,0 +25,2,175540,1,9,0,0,0,0,0,0,0,50,0,0 +47,2,150768,0,13,2,2,0,0,0,0,1564,51,0,1 +36,2,176634,0,13,1,5,2,0,1,0,0,35,0,1 +36,2,209993,15,2,6,4,5,0,1,0,0,20,4,0 +25,4,206002,1,9,2,9,4,0,1,0,0,40,0,0 +37,2,201259,2,7,2,6,0,0,0,0,0,65,0,0 +26,4,202286,0,13,0,9,3,0,0,0,0,40,0,0 +53,2,96062,5,10,1,1,1,0,0,0,1740,40,0,0 +36,4,578377,3,14,1,3,2,0,1,0,0,40,0,0 +30,2,509500,0,13,0,9,0,0,1,4787,0,45,0,1 +53,4,324021,5,10,2,4,0,0,1,0,0,40,0,0 +37,1,107737,1,9,1,10,1,0,0,0,0,45,0,0 +41,0,129865,1,9,2,10,4,0,0,0,0,40,0,0 +53,2,103586,0,13,1,2,1,0,0,0,0,55,0,0 +23,2,187513,5,10,0,4,3,0,0,0,0,32,0,0 +28,2,172891,1,9,1,7,1,0,0,0,0,50,0,0 +53,4,207449,12,6,1,4,1,0,0,0,0,40,0,0 +32,2,209103,1,9,1,6,1,0,0,0,0,20,0,1 +33,2,408813,0,13,0,0,0,0,1,0,0,50,0,0 +27,2,209292,1,9,0,5,5,1,1,0,0,32,21,0 +52,2,144361,9,11,1,10,1,0,0,0,1902,40,0,1 +31,2,209538,5,10,1,0,1,0,0,0,0,55,0,0 +27,2,244402,6,12,0,1,0,0,1,0,0,40,0,1 +44,2,889965,1,9,1,2,2,0,1,3137,0,30,0,0 +37,1,298444,3,14,1,3,1,0,0,0,0,40,0,0 +39,2,163237,1,9,1,10,1,0,0,0,0,60,0,0 +18,2,311795,14,8,0,5,3,1,1,0,0,20,0,0 +42,2,155972,1,9,1,2,1,0,0,0,0,40,0,1 +49,2,291783,0,13,1,10,1,0,0,0,0,40,0,1 +35,2,153535,1,9,2,2,4,1,1,0,0,36,0,0 +43,2,249771,1,9,1,6,1,2,0,0,0,99,0,0 +43,2,462180,10,15,1,3,1,0,0,99999,0,60,0,1 +31,2,308540,5,10,1,10,1,0,0,0,0,40,0,1 +27,2,34701,0,13,0,4,0,0,0,0,0,40,0,0 +46,3,106252,5,10,2,0,0,0,1,0,0,40,0,0 +54,2,138944,1,9,1,5,1,0,0,0,0,44,0,0 +37,2,140713,5,10,1,0,1,1,0,0,0,40,2,1 +53,4,216931,5,10,1,11,1,0,0,4386,0,40,0,1 +26,2,162312,5,10,0,0,0,2,0,0,0,20,11,0 +59,5,253062,10,15,1,3,1,0,0,0,0,55,0,1 +36,3,359249,5,10,4,0,0,1,0,0,0,40,0,0 +32,2,231413,1,9,1,8,1,0,0,0,0,40,0,1 +53,4,197054,3,14,1,3,1,0,0,0,0,40,0,1 +26,2,130931,1,9,0,0,3,1,1,0,0,40,0,0 +35,2,30565,1,9,5,4,2,0,1,0,0,40,0,1 +48,2,105138,1,9,2,1,4,2,1,0,0,40,0,0 +30,4,178383,5,10,4,2,0,1,0,0,0,40,0,0 +38,2,241998,14,8,1,10,1,0,0,7688,0,40,0,1 +58,1,196403,1,9,1,1,2,0,1,0,0,10,0,1 +44,2,232421,1,9,3,6,0,4,0,0,0,32,8,0 +30,2,130369,9,11,4,3,4,0,1,0,0,40,0,0 +68,1,336329,1,9,1,1,1,0,0,0,0,10,0,0 +26,4,337867,0,13,0,3,3,1,1,0,0,40,0,0 +26,4,104614,0,13,0,3,3,0,1,0,0,40,0,0 +41,2,223548,15,2,1,8,1,0,0,0,0,40,4,0 +48,2,64479,0,13,2,1,0,0,0,0,0,47,0,0 +55,2,284095,1,9,2,5,0,0,1,0,0,37,0,0 +41,2,428499,2,7,1,10,1,0,0,0,1485,50,0,1 +52,2,208302,1,9,1,5,1,0,0,0,0,36,0,0 +31,1,182177,1,9,1,10,1,0,0,0,1902,40,0,1 +54,4,129972,9,11,1,11,1,0,0,0,0,38,0,1 +31,1,186420,3,14,4,9,0,0,1,0,0,25,0,0 +31,5,203488,0,13,1,1,1,0,0,0,0,50,0,1 +47,2,128796,1,9,1,10,1,0,0,0,0,40,0,1 +40,2,55395,9,11,1,3,1,0,0,0,0,40,0,1 +46,0,314770,5,10,2,0,4,0,1,0,0,48,0,0 +45,2,135044,1,9,2,8,0,0,1,0,0,40,0,0 +39,2,319248,12,6,0,4,4,0,1,0,0,25,4,0 +34,4,236415,5,10,0,0,4,0,1,0,0,18,0,0 +56,2,81220,5,10,0,0,0,0,1,0,0,40,8,0 +47,2,151087,1,9,4,3,5,4,1,0,0,40,5,0 +35,2,322171,5,10,1,4,2,0,1,0,0,40,0,1 +25,2,190628,5,10,1,10,1,0,0,0,0,40,13,0 +43,4,106982,0,13,4,3,4,0,1,0,0,40,0,0 +59,2,227856,0,13,1,5,1,0,0,0,0,37,0,1 +63,2,266083,7,4,1,6,1,0,0,0,0,60,0,1 +32,2,257068,5,10,3,6,0,0,1,0,0,37,0,0 +43,5,150533,9,11,1,1,5,0,0,0,0,50,0,1 +27,2,211184,1,9,0,0,0,0,1,0,0,52,0,0 +21,2,136610,14,8,0,2,3,0,0,0,0,32,0,0 +44,3,244054,5,10,2,1,4,0,0,0,0,60,0,1 +40,1,240698,1,9,1,10,1,0,0,0,0,60,0,0 +65,2,172906,1,9,6,0,4,0,1,0,0,40,0,0 +50,2,238959,5,10,1,0,1,0,0,0,0,45,0,1 +51,0,172022,3,14,0,3,0,0,0,0,0,40,0,1 +44,3,218062,5,10,2,0,4,1,1,0,0,40,0,0 +20,2,201799,5,10,0,5,3,0,1,0,0,13,0,0 +29,2,150717,9,11,0,1,0,0,0,0,0,40,0,0 +50,2,94391,9,11,1,10,1,0,0,0,0,50,0,1 +50,4,153064,1,9,1,1,1,0,0,5178,0,40,0,1 +43,2,156771,12,6,1,0,1,0,0,0,0,40,0,0 +23,2,216639,0,13,0,9,0,0,1,0,0,40,0,0 +41,2,82161,1,9,1,6,1,0,0,0,0,40,0,0 +58,1,310014,0,13,1,7,1,0,0,0,0,25,0,0 +50,0,133014,9,11,1,3,1,0,0,0,0,40,0,0 +37,1,36214,0,13,1,10,1,0,0,0,0,65,0,1 +21,2,399022,1,9,0,7,3,0,0,0,0,24,0,0 +33,2,179758,1,9,1,5,2,0,1,0,0,20,0,0 +52,2,48947,5,10,2,0,4,0,1,0,0,45,0,0 +47,2,201865,1,9,1,6,1,0,0,0,0,40,0,0 +45,1,319122,0,13,0,5,0,0,0,14084,0,45,0,1 +34,2,155151,5,10,1,10,1,0,0,0,0,40,0,1 +39,2,24106,5,10,1,5,1,0,0,0,0,40,11,1 +31,2,257863,5,10,2,4,0,0,1,0,0,15,0,0 +45,2,379393,5,10,2,9,0,0,1,0,0,45,0,0 +45,1,152752,9,11,1,11,1,0,0,0,0,3,0,0 +34,2,154874,1,9,0,8,0,0,0,4416,0,30,0,0 +27,2,154210,2,7,3,5,3,2,0,0,0,35,3,0 +37,2,335716,1,9,2,5,4,0,1,0,0,40,0,0 +20,2,94744,1,9,0,0,3,1,1,0,0,20,0,0 +32,2,133861,0,13,0,1,0,0,0,13550,0,48,0,1 +24,2,240137,15,2,0,2,0,0,0,0,0,55,4,0 +39,2,80004,1,9,1,2,1,0,0,0,0,40,0,0 +18,2,109702,5,10,0,5,3,0,1,0,0,30,0,0 +62,1,39610,5,10,1,7,1,0,0,0,0,80,0,0 +24,2,90046,0,13,4,1,0,0,1,0,0,40,0,0 +37,2,193855,1,9,1,6,1,0,0,0,0,45,0,0 +46,2,206889,0,13,6,0,0,0,1,0,0,25,0,0 +44,2,86298,1,9,2,10,0,0,0,0,0,40,0,0 +53,2,149650,1,9,0,5,0,0,0,0,2559,48,0,1 +25,2,323139,0,13,0,2,3,0,0,0,0,35,0,0 +24,2,36058,0,13,0,5,0,0,0,0,0,50,0,0 +61,2,163393,1,9,1,6,1,0,0,0,0,20,0,0 +45,4,93535,3,14,2,3,4,0,1,0,0,40,0,0 +33,1,112952,5,10,0,10,3,0,0,0,0,48,0,0 +48,2,182541,0,13,1,3,1,0,0,15024,0,45,0,1 +26,4,73392,1,9,0,2,3,3,0,0,0,30,0,0 +68,2,195868,0,13,1,5,1,0,0,20051,0,40,0,1 +24,2,276851,1,9,2,11,3,0,1,0,1762,40,0,0 +31,4,33124,0,13,0,3,0,0,1,0,0,50,0,0 +55,2,419732,5,10,2,4,4,0,1,0,0,38,0,0 +46,2,171095,6,12,2,5,4,0,1,0,0,38,0,0 +58,2,199278,0,13,2,1,0,0,0,0,0,38,0,0 +56,2,235205,1,9,6,4,4,0,1,0,0,40,0,0 +45,3,168232,0,13,0,0,0,0,0,0,0,55,0,1 +24,2,145964,0,13,0,1,4,0,0,0,0,40,0,1 +35,4,72338,1,9,2,7,3,2,0,0,0,56,0,0 +51,2,153870,1,9,1,9,1,0,0,0,0,40,0,1 +47,2,323798,10,15,1,3,1,0,0,15024,0,55,0,1 +17,2,198830,2,7,0,0,5,0,1,0,0,10,0,0 +21,2,267040,12,6,0,3,4,1,1,0,0,40,0,0 +45,2,167187,0,13,0,3,0,0,1,0,0,40,0,1 +42,2,230684,1,9,1,5,1,0,0,5178,0,50,0,1 +56,2,659558,14,8,6,4,4,1,1,0,0,40,0,0 +39,2,181661,1,9,1,2,1,0,0,0,0,40,0,0 +31,2,186144,7,4,0,8,0,4,1,0,0,40,4,0 +20,3,178517,5,10,0,9,0,0,0,0,0,40,0,0 +65,1,131417,11,3,1,7,1,0,0,1797,0,21,0,0 +44,2,57233,5,10,1,3,1,0,0,0,0,45,0,0 +33,2,379798,1,9,1,10,1,0,0,0,0,40,0,0 +25,2,122175,0,13,1,3,1,0,0,0,0,45,0,1 +38,2,107302,1,9,1,1,1,0,0,0,0,50,0,0 +31,4,127651,12,6,0,6,5,0,0,0,1741,40,0,0 +33,1,102884,0,13,1,5,3,0,0,0,0,20,0,0 +49,1,241753,1,9,2,4,4,0,1,0,0,40,0,0 +28,2,173611,1,9,0,1,3,0,1,0,0,40,0,0 +29,2,232666,1,9,1,10,1,0,0,0,0,40,0,0 +23,2,352207,9,11,0,4,3,0,0,0,0,20,0,0 +37,1,241998,0,13,1,3,1,0,0,0,0,5,0,1 +52,2,279129,5,10,0,3,0,0,0,0,0,37,0,1 +27,2,177057,1,9,0,8,0,0,0,0,0,40,0,0 +47,2,155659,5,10,1,10,1,0,0,7688,0,55,0,1 +21,2,251603,1,9,0,0,0,0,1,0,0,40,0,0 +41,3,19914,0,13,1,0,2,2,1,0,0,40,11,1 +61,2,115023,5,10,1,0,1,0,0,0,0,40,0,1 +32,2,101709,0,13,1,3,1,2,0,0,0,40,0,1 +21,2,313702,5,10,0,5,0,0,0,0,0,40,0,0 +63,2,250068,14,8,1,5,1,0,0,0,0,40,0,1 +34,2,227359,5,10,1,4,1,0,0,0,0,42,0,0 +21,0,196827,6,12,0,9,3,0,0,0,0,10,0,0 +44,2,118550,1,9,2,4,4,0,1,0,0,33,0,0 +26,2,285004,0,13,0,1,0,2,0,0,0,35,27,0 +36,2,280169,3,14,1,1,1,0,0,0,0,50,0,1 +52,2,76860,1,9,1,2,1,2,0,0,0,8,11,0 +44,1,167280,0,13,1,5,1,0,0,0,0,40,0,0 +42,2,334783,1,9,1,3,2,0,1,0,0,40,0,0 +31,2,226443,0,13,0,3,0,0,0,0,0,40,0,0 +30,2,366065,5,10,0,10,4,1,0,0,0,40,0,0 +23,2,225724,5,10,0,3,3,0,1,0,0,25,0,0 +81,0,132204,15,2,6,4,0,0,1,0,0,20,0,0 +38,2,197711,12,6,2,8,0,2,1,0,0,40,20,0 +21,2,30619,5,10,0,1,0,0,1,0,0,38,0,0 +28,4,335015,1,9,1,10,1,0,0,0,0,40,0,0 +34,2,61272,0,13,0,1,0,0,1,0,0,40,0,0 +47,2,106544,1,9,0,4,0,0,1,0,0,40,0,0 +36,2,144169,1,9,1,10,1,0,0,0,0,50,0,0 +27,2,40295,1,9,0,6,0,0,0,0,0,99,0,0 +56,2,266091,0,13,0,3,0,0,1,2907,0,52,1,0 +42,0,192397,5,10,2,0,3,0,1,0,0,38,0,0 +43,2,114351,1,9,2,10,0,0,0,0,0,35,0,0 +53,2,132304,1,9,2,8,0,0,1,0,0,40,32,0 +58,2,128162,1,9,2,5,0,0,1,0,0,24,0,0 +19,2,125938,14,8,0,4,3,0,0,0,0,40,22,0 +37,2,170174,1,9,1,1,1,0,0,0,0,46,0,1 +41,1,203451,5,10,2,3,0,0,1,0,0,15,0,0 +31,2,109917,7,4,4,10,0,0,1,0,0,40,0,0 +31,2,114937,0,13,1,3,1,0,0,0,0,35,0,0 +53,4,231196,1,9,1,0,1,0,0,0,0,40,0,0 +19,2,238474,5,10,0,5,3,0,0,0,0,25,0,0 +56,2,314149,8,16,1,3,1,0,0,0,0,50,0,1 +55,3,31728,5,10,1,0,2,0,1,0,0,40,0,1 +51,2,360131,11,3,1,10,5,0,1,0,0,40,0,0 +62,2,141308,5,10,0,0,0,0,1,0,0,40,0,0 +43,2,83411,5,10,1,5,1,0,0,0,0,50,0,1 +28,4,296537,1,9,1,10,1,0,0,0,0,45,0,0 +46,2,193047,1,9,1,1,1,0,0,0,0,40,0,1 +62,0,39630,0,13,1,3,1,0,0,0,0,40,0,0 +57,4,213975,1,9,6,4,4,0,1,0,0,30,0,0 +60,4,259803,0,13,1,3,2,0,1,0,0,45,0,1 +23,3,55465,5,10,0,2,0,0,0,0,0,40,0,0 +47,2,181307,5,10,1,5,1,0,0,99999,0,60,0,1 +21,2,211301,5,10,0,0,3,0,1,0,0,8,0,0 +51,2,200450,1,9,1,2,1,0,0,0,0,48,0,0 +61,4,176731,1,9,1,2,1,0,0,0,0,40,0,0 +52,1,140985,0,13,1,0,2,0,1,99999,0,30,0,1 +76,2,125784,0,13,1,1,1,0,0,0,0,40,0,0 +24,2,152176,5,10,0,2,0,0,0,0,0,39,0,0 +31,1,111423,0,13,0,10,0,0,0,0,0,55,0,0 +43,2,130126,0,13,1,1,1,0,0,15024,0,50,0,1 +58,3,30111,5,10,6,3,4,3,1,0,0,40,0,0 +19,2,272800,14,8,0,0,3,0,1,0,0,25,0,0 +44,2,195881,5,10,2,1,5,0,1,0,0,45,0,0 +41,4,170924,5,10,0,3,5,0,0,0,0,7,0,0 +21,2,131473,5,10,0,5,3,2,0,0,0,20,36,0 +40,2,149466,1,9,2,2,0,1,0,0,0,35,0,0 +25,2,190418,5,10,0,4,3,0,0,0,0,30,8,0 +62,4,167889,8,16,6,3,4,0,1,0,0,40,10,0 +42,2,177989,1,9,1,10,1,0,0,0,0,40,0,0 +35,2,186035,9,11,0,9,0,0,0,0,0,40,0,0 +19,2,195805,1,9,0,5,3,0,1,0,0,12,0,0 +60,2,54800,1,9,1,4,2,0,1,0,0,40,0,0 +20,2,100605,1,9,0,5,3,4,0,0,0,40,5,0 +23,2,253190,6,12,1,2,1,0,0,0,0,25,0,0 +18,2,203301,1,9,0,0,3,0,1,0,0,40,0,0 +40,2,175696,5,10,1,1,1,0,0,0,0,45,0,1 +19,2,278304,5,10,0,4,3,0,1,0,0,15,0,0 +51,2,93193,1,9,2,3,0,0,1,0,0,40,0,0 +41,4,158688,0,13,1,11,1,0,0,0,0,50,0,0 +18,2,327612,12,6,0,4,3,0,1,0,0,20,0,0 +41,2,210844,5,10,3,5,4,1,1,0,0,40,0,0 +27,2,147340,5,10,0,1,3,0,1,0,0,40,0,0 +71,1,130436,15,2,2,10,0,0,1,0,0,28,0,0 +25,2,206600,14,8,1,8,1,0,0,0,0,40,22,0 +73,2,284680,1,9,2,4,0,0,1,0,0,20,0,0 +45,2,127738,5,10,1,4,1,0,0,0,0,40,0,0 +25,2,213412,5,10,1,5,1,0,0,0,0,40,0,1 +50,2,287927,1,9,1,3,2,0,1,0,0,16,0,0 +44,2,249332,1,9,1,6,1,0,0,0,0,40,16,0 +44,4,290403,9,11,2,11,3,0,1,0,0,40,1,0 +49,2,54772,1,9,1,10,1,0,0,3103,0,45,0,1 +44,5,56651,5,10,1,1,1,0,0,7688,0,45,0,1 +42,3,178470,1,9,2,0,0,0,1,0,0,40,0,0 +20,2,62865,1,9,0,13,0,0,1,0,0,45,0,0 +66,2,107196,1,9,6,9,0,0,1,0,0,18,0,0 +19,2,86860,5,10,0,1,3,0,0,0,0,15,0,0 +60,2,130684,5,10,1,10,1,0,0,0,0,55,0,0 +46,2,164682,9,11,4,3,0,0,0,0,0,40,0,0 +42,2,198316,9,11,2,10,0,0,0,0,0,35,0,0 +59,2,261816,5,10,2,1,0,0,1,0,0,52,31,0 +58,2,280309,6,12,1,1,1,0,0,5178,0,60,0,1 +47,2,97176,1,9,2,0,4,0,1,0,0,40,0,0 +58,2,95835,5,10,1,9,1,0,0,0,0,36,0,0 +19,2,136306,2,7,0,7,3,0,0,0,0,24,0,0 +28,2,65171,5,10,1,9,1,0,0,0,0,70,0,0 +37,2,25864,1,9,4,3,4,3,1,0,0,40,0,0 +30,2,149531,1,9,1,10,1,0,0,0,0,50,0,0 +36,2,33887,5,10,2,3,0,0,0,0,0,40,0,0 +45,2,172822,2,7,2,6,0,0,0,0,2824,76,0,1 +59,2,106748,7,4,1,4,2,0,1,0,0,99,0,0 +45,2,131826,5,10,1,2,1,0,0,0,0,40,0,0 +53,4,216691,8,16,2,3,0,0,1,10520,0,40,0,1 +37,2,133328,1,9,2,5,4,0,1,0,0,40,0,0 +26,2,164737,5,10,0,5,0,0,1,0,0,40,0,0 +53,4,99064,4,5,1,10,1,0,0,0,0,40,0,0 +44,0,59460,1,9,1,4,2,0,1,0,0,15,0,0 +27,2,208725,0,13,0,10,3,0,0,0,0,40,0,0 +22,2,138513,5,10,0,10,3,0,0,0,0,40,0,0 +41,2,121055,1,9,2,6,0,0,0,0,0,40,0,0 +53,2,149784,1,9,1,8,1,0,0,0,0,40,0,0 +58,2,114495,1,9,1,1,1,0,0,0,0,40,0,0 +32,2,212276,0,13,1,3,1,0,0,0,0,60,0,1 +32,2,440129,5,10,1,2,1,0,0,0,0,38,4,0 +47,2,98012,3,14,1,3,2,0,1,7688,0,40,0,1 +27,2,145284,1,9,1,7,1,0,0,0,0,40,0,0 +25,2,177147,5,10,0,2,0,0,0,0,0,40,0,0 +40,2,141537,12,6,2,8,0,1,1,0,0,40,0,0 +36,1,48093,5,10,1,5,1,0,0,0,0,92,0,0 +23,4,314819,1,9,0,6,3,0,0,0,0,40,0,0 +44,2,123572,4,5,1,8,1,1,0,0,0,40,0,0 +19,2,170800,1,9,0,10,3,0,0,0,0,60,0,0 +42,2,332401,0,13,0,5,0,0,0,0,0,40,0,0 +60,1,193038,5,10,1,7,1,0,0,0,0,15,0,0 +41,2,351161,1,9,1,5,1,0,0,0,1848,45,0,1 +45,3,106910,1,9,0,6,4,2,1,0,0,40,0,0 +52,0,314627,3,14,2,3,0,2,1,0,0,40,0,0 +28,2,115945,8,16,0,0,3,0,0,0,0,18,0,0 +83,5,272248,1,9,2,5,0,0,0,0,0,20,0,0 +17,2,167878,2,7,0,4,3,0,0,0,0,20,0,0 +27,2,176972,9,11,0,10,0,0,0,0,0,40,0,0 +35,1,31095,9,11,0,7,0,0,0,0,0,60,0,0 +40,2,130834,5,10,0,0,0,0,1,0,0,40,0,0 +23,2,207415,6,12,1,5,2,0,1,0,0,25,0,0 +51,4,264457,2,7,1,2,1,1,0,0,0,40,0,0 +51,2,340588,15,2,1,4,1,0,0,0,0,54,4,0 +28,2,107411,1,9,0,1,0,0,1,0,0,45,0,0 +53,2,290640,1,9,1,4,1,0,0,0,0,50,9,1 +29,2,106179,0,13,0,0,0,0,1,0,0,35,8,0 +19,2,247679,1,9,0,10,0,0,0,0,0,45,0,0 +30,2,171598,0,13,3,5,0,0,1,0,0,50,0,0 +23,2,234460,7,4,0,8,3,1,1,0,0,40,21,0 +66,2,196674,0,13,1,5,1,0,0,0,0,15,0,1 +27,2,182540,2,7,0,10,0,0,0,0,0,40,0,0 +35,2,172694,1,9,1,8,1,1,0,0,0,40,0,0 +17,2,29571,14,8,0,2,3,0,0,0,0,15,0,0 +27,2,130438,1,9,0,8,0,0,0,0,0,40,0,0 +27,2,213421,10,15,0,3,0,0,0,0,0,50,0,0 +44,4,189956,0,13,1,11,2,1,1,15024,0,40,0,1 +64,2,133144,1,9,1,6,1,0,0,0,0,16,0,0 +62,5,24050,1,9,6,5,0,0,1,0,0,15,0,0 +26,2,276967,5,10,1,5,1,0,0,0,0,40,0,0 +40,2,184857,1,9,4,8,4,0,0,0,0,40,0,0 +40,2,145160,8,16,1,3,1,0,0,0,0,40,0,1 +35,2,192251,1,9,2,0,3,0,1,0,0,40,0,0 +25,2,190650,0,13,0,3,3,2,0,0,0,40,18,0 +52,4,255927,5,10,6,0,0,0,1,0,0,24,0,0 +46,2,99086,5,10,1,0,2,0,1,0,0,40,0,1 +30,2,216811,1,9,1,10,1,3,0,0,0,40,0,0 +52,2,110563,5,10,1,1,1,0,0,0,0,40,0,1 +28,2,120471,1,9,0,6,0,4,0,0,0,40,0,0 +17,2,183066,12,6,0,4,3,0,1,0,0,25,0,0 +46,0,298786,5,10,0,4,3,1,1,0,0,40,0,0 +45,2,297884,0,13,2,1,0,0,0,0,0,40,0,1 +21,2,253612,5,10,0,3,3,0,1,1055,0,32,0,0 +18,1,207438,1,9,1,4,2,0,1,0,0,40,0,0 +17,2,148522,2,7,0,4,3,0,0,0,1721,15,0,0 +90,2,139660,5,10,2,5,4,1,1,0,0,37,0,0 +23,2,165474,5,10,0,10,0,0,0,0,0,40,0,0 +41,2,120277,0,13,1,3,1,0,0,0,0,40,0,1 +19,1,67929,5,10,0,7,3,0,0,0,0,50,0,0 +69,2,229418,1,9,1,6,1,0,0,0,0,40,0,0 +23,3,41356,6,12,0,1,4,0,1,0,0,32,0,0 +28,2,185127,5,10,0,9,0,0,0,0,0,54,0,0 +37,2,109133,6,12,1,5,1,0,0,0,1977,45,0,1 +57,2,148315,1,9,1,5,1,0,0,0,0,30,0,0 +30,4,145692,5,10,0,11,0,1,0,0,1974,40,0,0 +48,2,210424,1,9,4,0,4,0,1,914,0,40,0,0 +73,2,198526,1,9,6,4,5,0,1,0,0,32,0,0 +25,2,521400,11,3,0,8,5,0,0,0,0,40,4,0 +33,2,100882,3,14,0,1,0,0,0,0,0,40,0,1 +36,2,124818,1,9,1,8,1,0,0,0,0,40,0,0 +28,2,190836,1,9,1,10,1,0,0,3411,0,40,0,0 +57,2,71367,1,9,2,4,4,0,1,0,0,40,0,0 +31,2,303032,5,10,0,4,4,1,1,0,0,40,0,0 +40,0,390781,1,9,2,4,0,1,1,0,0,48,0,0 +32,2,54782,5,10,0,3,3,0,1,0,0,40,0,0 +26,2,213081,1,9,0,0,4,1,1,0,0,40,2,0 +27,5,89718,5,10,4,5,3,0,1,0,0,40,0,0 +17,2,225106,12,6,0,4,3,0,1,0,1602,18,0,0 +29,2,253262,5,10,0,10,0,0,1,0,0,40,0,0 +18,2,78181,2,7,0,4,3,0,1,0,0,30,0,0 +20,2,158206,5,10,0,5,0,0,0,0,0,30,0,0 +18,0,391257,5,10,0,4,0,0,1,0,0,40,0,0 +56,2,134756,1,9,0,4,0,1,1,0,0,40,0,0 +40,2,183404,5,10,4,4,4,0,1,0,0,8,0,0 +46,2,192793,5,10,2,1,0,0,0,0,0,40,0,0 +53,2,89400,5,10,6,1,4,0,1,0,0,40,0,0 +50,2,237868,3,14,1,1,1,0,0,0,0,50,0,1 +23,2,139187,2,7,0,2,3,0,0,0,0,50,0,0 +40,2,126701,0,13,3,1,0,0,0,0,0,40,0,1 +54,5,172175,5,10,1,6,1,0,0,0,0,40,0,1 +45,2,164210,5,10,2,1,0,0,1,0,0,40,0,0 +53,4,608184,1,9,1,6,1,1,0,0,0,40,0,1 +50,4,425804,0,13,2,1,0,0,1,0,0,40,0,1 +40,5,92036,0,13,1,10,1,0,0,0,0,40,0,0 +36,0,77146,3,14,0,3,0,0,0,0,0,40,0,0 +25,1,191803,6,12,0,5,0,0,0,0,0,50,0,0 +29,2,54932,1,9,1,8,1,0,0,0,0,40,0,0 +29,2,251694,0,13,0,7,3,0,0,0,0,50,0,0 +22,2,268145,0,13,0,5,0,0,1,0,0,40,0,0 +56,2,104842,0,13,2,3,4,1,1,0,0,50,19,0 +60,4,227332,3,14,1,1,1,0,0,0,0,40,0,1 +37,2,212512,1,9,1,8,1,0,0,3464,0,50,0,0 +53,2,133436,7,4,2,8,0,0,1,0,0,40,0,0 +23,0,309055,5,10,0,0,3,0,1,0,0,20,0,0 +18,2,59202,1,9,0,13,5,0,1,0,0,10,0,0 +36,2,32709,5,10,2,5,0,0,1,3325,0,45,0,0 +67,5,73559,1,9,1,1,1,0,0,9386,0,50,0,1 +31,2,117963,1,9,0,2,0,0,0,0,0,60,0,0 +26,2,169121,0,13,1,5,1,0,0,0,0,48,0,1 +18,2,308889,2,7,0,0,5,2,1,0,0,20,0,0 +45,4,144940,3,14,2,3,4,1,1,0,0,40,0,0 +64,2,102041,2,7,1,5,1,0,0,0,0,40,0,0 +26,2,335998,1,9,0,5,0,0,1,0,0,38,0,0 +53,2,29557,5,10,2,3,0,0,1,0,0,40,0,0 +27,2,210313,1,9,0,2,5,0,0,0,0,28,24,0 +32,2,190784,5,10,2,8,4,3,0,0,0,40,0,0 +49,1,107597,1,9,2,1,4,0,1,14084,0,30,0,1 +59,2,97168,12,6,1,10,1,0,0,0,0,40,0,1 +44,2,155930,3,14,1,3,1,0,0,7688,0,55,0,1 +61,1,181033,1,9,1,7,1,0,0,0,0,60,0,0 +46,0,170165,1,9,4,0,4,0,1,0,0,37,0,0 +32,2,178835,1,9,0,0,0,0,0,0,0,40,0,0 +29,2,118230,1,9,0,5,0,0,1,0,0,35,0,0 +48,2,149640,3,14,0,1,0,0,0,0,0,40,0,0 +32,2,30271,5,10,2,1,4,0,1,0,0,30,0,0 +21,2,154165,1,9,0,2,3,0,1,0,0,35,0,0 +50,1,341797,10,15,1,3,1,0,0,0,0,50,0,1 +44,4,145246,3,14,1,3,1,0,0,0,0,44,0,1 +51,2,280093,1,9,4,0,5,0,1,0,0,40,0,0 +42,2,373469,1,9,1,10,1,0,0,0,0,40,0,1 +27,2,199172,0,13,0,11,3,0,1,0,0,40,0,0 +70,1,177199,1,9,1,1,1,0,0,0,0,3,0,0 +33,2,258932,1,9,2,1,0,0,1,0,0,40,0,0 +65,1,139960,1,9,1,7,1,0,0,10605,0,60,0,1 +32,2,116677,1,9,1,10,1,0,0,0,0,40,0,0 +30,2,59496,5,10,2,3,4,0,1,0,0,40,0,0 +43,5,34218,5,10,1,1,1,0,0,0,0,40,0,0 +31,2,200246,4,5,0,4,3,0,0,0,0,40,0,0 +64,3,316246,0,13,2,0,0,1,1,0,0,40,0,0 +37,4,239161,5,10,4,11,3,4,0,0,0,52,0,0 +49,1,173411,1,9,2,5,0,0,0,0,0,40,0,0 +29,2,259226,2,7,0,8,3,0,0,0,0,48,0,0 +35,4,195516,1,9,2,1,0,0,0,0,0,40,0,0 +37,2,200598,6,12,1,3,1,0,0,0,1740,45,0,0 +42,0,160369,3,14,1,3,1,0,0,0,0,50,0,1 +23,2,147253,6,12,0,5,0,0,0,0,0,40,0,0 +35,4,199674,1,9,0,4,4,1,1,0,0,40,0,0 +29,0,198493,9,11,1,11,1,0,0,0,0,40,0,1 +23,2,377121,5,10,0,4,4,0,1,0,0,25,0,0 +45,2,513660,0,13,0,3,0,0,0,0,0,40,0,0 +38,2,82552,1,9,0,2,0,0,0,594,0,50,0,0 +23,2,171705,1,9,0,5,4,0,1,0,0,48,0,0 +39,1,315640,0,13,0,5,3,2,0,0,0,60,10,0 +45,2,266860,3,14,1,1,1,0,0,15024,0,50,0,1 +68,2,192829,6,12,2,1,0,0,1,0,0,43,0,0 +60,3,237317,9,11,2,3,4,0,0,4934,0,40,0,1 +41,2,327606,14,8,4,10,0,1,0,0,0,40,0,0 +48,2,34845,1,9,2,10,5,0,0,0,0,40,0,0 +33,2,58582,1,9,1,8,1,0,0,0,0,40,0,0 +48,2,155659,9,11,1,10,1,0,0,0,0,40,0,0 +23,4,210029,5,10,0,0,3,0,1,0,0,20,0,0 +26,2,381618,4,5,1,10,1,0,0,0,0,45,0,0 +55,5,298449,0,13,1,1,1,0,0,0,2415,50,0,1 +35,0,226789,3,14,1,3,1,0,0,0,0,75,0,0 +52,2,210736,5,10,1,1,1,0,0,3103,0,55,0,1 +46,0,111163,1,9,4,0,4,0,1,0,0,38,0,0 +18,2,92112,1,9,0,4,3,0,1,0,0,30,0,0 +62,4,136787,1,9,2,6,5,0,0,0,0,40,0,0 +22,2,29810,5,10,0,6,3,0,1,0,0,30,0,0 +40,2,360884,5,10,1,0,2,0,1,7298,0,40,0,1 +26,2,266022,5,10,1,5,1,0,0,0,0,50,0,0 +35,2,142874,6,12,3,5,3,1,1,0,0,36,0,0 +25,1,72338,1,9,0,5,4,2,1,0,0,40,0,0 +41,2,424478,5,10,1,10,1,1,0,0,0,45,0,1 +59,2,189721,0,13,1,2,1,0,0,0,0,40,25,1 +37,2,34180,1,9,1,10,1,0,0,0,0,40,0,0 +38,2,183279,5,10,1,10,1,0,0,0,0,43,0,0 +23,2,259109,6,12,1,4,2,0,1,0,0,40,5,0 +67,1,148690,3,14,6,3,0,0,0,18481,0,2,0,1 +60,2,125019,0,13,2,3,0,0,1,8614,0,48,0,1 +39,5,172538,0,13,1,3,1,0,0,0,0,50,0,1 +32,1,410615,1,9,1,6,1,0,0,0,1887,60,0,1 +26,2,322547,0,13,0,3,0,0,1,0,0,45,0,0 +39,2,300760,1,9,2,9,4,0,1,0,0,50,0,0 +28,2,232782,5,10,0,0,0,0,1,0,0,40,0,0 +29,2,174645,2,7,2,10,4,0,1,0,0,52,0,0 +43,2,164693,9,11,1,10,1,0,0,0,0,50,0,0 +23,2,206861,5,10,0,9,3,0,0,0,0,25,0,0 +32,2,195602,0,13,1,5,1,0,0,0,1977,45,0,1 +33,1,422960,5,10,1,3,2,0,1,0,0,60,0,1 +45,2,116360,1,9,2,4,0,1,1,0,0,35,0,0 +48,2,278530,1,9,2,10,4,0,0,0,0,40,0,0 +43,4,188291,10,15,1,3,1,0,0,15024,0,45,0,1 +50,1,163948,1,9,1,6,1,0,0,0,0,40,0,1 +63,2,64544,0,13,0,9,0,0,0,0,0,40,0,1 +55,2,101468,1,9,1,10,1,0,0,3103,0,40,0,1 +22,2,107882,0,13,0,1,3,0,1,0,0,35,0,0 +32,1,182691,1,9,0,4,4,0,0,0,0,60,0,0 +27,2,203776,6,12,1,1,1,0,0,0,0,55,0,0 +22,2,201268,0,13,0,5,3,0,1,0,0,15,0,0 +44,2,29762,1,9,2,6,0,0,0,0,0,68,0,0 +34,2,186346,1,9,4,4,0,0,1,0,0,40,0,0 +28,2,196690,1,9,0,8,0,0,1,0,0,40,0,0 +40,2,99604,3,14,1,3,2,0,1,15024,0,24,0,1 +45,2,194772,5,10,1,6,1,0,0,0,0,55,0,0 +17,2,95446,12,6,0,4,3,0,0,0,0,15,0,0 +53,1,257126,14,8,1,10,1,0,0,0,0,45,0,0 +58,2,194733,6,12,1,10,1,0,0,0,0,40,0,1 +55,1,98361,1,9,0,10,3,0,0,0,0,35,0,0 +44,4,124924,9,11,0,10,0,0,0,0,0,44,0,0 +40,1,111971,1,9,1,10,1,0,0,0,0,30,0,0 +58,1,130714,3,14,1,1,1,0,0,0,0,50,0,0 +38,2,208358,1,9,1,10,1,0,0,0,0,40,0,1 +62,2,147627,4,5,0,13,0,1,1,1055,0,22,0,0 +31,2,149507,9,11,1,10,1,0,0,3464,0,38,0,0 +31,2,164870,2,7,1,10,1,0,0,0,0,40,4,0 +30,2,236861,1,9,0,1,0,0,0,0,1876,45,0,0 +37,2,220314,1,9,2,0,4,0,1,0,0,40,4,0 +38,4,329980,1,9,0,10,0,0,0,0,1876,40,8,0 +58,4,318537,14,8,1,7,1,0,0,0,0,40,0,0 +30,2,183284,0,13,1,1,1,0,0,0,0,50,0,1 +28,2,334368,9,11,0,3,0,0,1,4650,0,40,0,0 +46,2,109227,5,10,2,1,4,0,1,0,0,70,0,0 +34,2,118551,0,13,0,9,0,0,1,0,0,40,0,0 +39,5,163057,5,10,2,10,0,0,0,0,0,99,0,0 +61,5,253101,5,10,6,5,0,0,1,0,0,20,0,0 +30,1,20098,9,11,2,8,0,0,1,0,0,40,0,0 +31,2,196227,1,9,4,4,0,0,1,0,0,40,0,0 +21,2,175374,1,9,0,0,3,0,0,0,0,40,0,0 +50,2,234037,1,9,1,8,1,0,0,0,0,58,0,0 +47,2,341762,1,9,0,0,0,0,0,0,0,33,0,0 +20,2,174714,1,9,0,2,3,0,0,0,0,40,0,0 +23,2,222835,0,13,0,4,3,0,1,0,0,30,0,0 +46,2,251786,15,2,4,4,0,0,1,0,0,40,4,0 +20,2,164219,1,9,0,2,3,0,0,0,0,45,0,0 +33,2,251120,0,13,1,5,1,0,0,7688,0,50,0,1 +30,2,236993,5,10,0,0,4,0,1,0,0,30,0,0 +43,4,105896,5,10,2,11,4,0,1,0,0,40,0,0 +23,2,211527,5,10,0,2,3,0,0,0,0,60,0,0 +25,2,185287,5,10,0,0,0,0,0,0,0,40,0,0 +50,2,31014,1,9,1,3,2,0,1,0,0,40,0,1 +44,2,151985,3,14,1,1,2,0,1,0,0,24,0,1 +26,2,89389,5,10,2,3,0,0,1,0,0,40,0,0 +35,2,406051,8,16,0,3,0,0,1,0,0,80,0,1 +48,1,171986,1,9,2,3,0,0,0,0,0,15,0,0 +26,2,167848,1,9,0,8,0,1,0,0,0,40,0,0 +41,4,213019,3,14,2,3,4,0,1,0,0,40,0,0 +25,2,211424,0,13,0,4,3,0,0,0,0,40,0,0 +33,2,168981,9,11,0,3,4,0,1,0,0,55,0,0 +24,2,122348,0,13,1,1,2,0,1,0,0,40,0,0 +31,2,139753,0,13,3,0,0,0,1,0,0,40,0,0 +24,4,176178,6,12,0,3,3,0,1,0,0,2,0,0 +41,2,145220,4,5,0,13,4,0,1,0,0,40,13,0 +38,4,188612,5,10,1,10,1,0,0,0,0,45,0,0 +19,2,445728,1,9,0,10,0,0,0,0,0,40,0,0 +19,2,318002,1,9,0,0,3,0,0,0,0,40,0,0 +24,2,235722,1,9,0,4,0,0,0,0,0,40,0,0 +67,2,212705,3,14,3,1,0,0,0,0,0,55,0,1 +49,2,411273,12,6,2,8,0,1,0,0,0,40,0,0 +35,2,103986,9,11,1,9,1,0,0,0,0,40,0,1 +44,2,203761,5,10,1,1,1,0,0,0,0,45,0,1 +22,2,116800,6,12,0,11,3,0,0,0,0,60,0,0 +21,0,99199,5,10,0,1,3,0,0,0,0,10,0,0 +50,2,162327,5,10,1,2,1,0,0,0,0,50,0,0 +44,4,100479,6,12,1,3,1,0,0,0,0,48,0,0 +36,4,32587,5,10,1,0,1,3,0,0,0,40,0,0 +30,3,321990,5,10,1,0,1,0,0,7298,0,48,1,1 +52,2,108914,1,9,1,5,1,0,0,0,0,40,0,1 +35,1,61343,1,9,1,10,1,0,0,0,0,90,0,0 +48,4,81154,9,11,0,11,4,0,0,0,0,48,0,0 +23,2,162945,1,9,1,5,1,0,0,0,2377,40,0,0 +37,2,225504,3,14,0,5,0,0,0,0,0,50,0,0 +44,5,191712,3,14,1,3,1,0,0,0,2415,55,0,1 +44,2,176063,1,9,1,6,1,0,0,0,0,50,0,1 +36,2,198587,0,13,2,3,0,0,0,0,0,40,0,0 +26,0,34965,5,10,1,1,1,0,0,0,0,12,0,0 +31,5,467108,0,13,0,3,0,0,0,0,0,45,0,1 +29,2,204984,1,9,1,10,1,0,0,0,0,50,0,0 +53,2,217568,1,9,6,10,4,1,1,0,0,40,0,0 +52,2,48343,9,11,1,1,1,0,0,0,0,40,0,0 +55,2,193130,1,9,1,2,1,0,0,0,1887,40,0,1 +31,2,253354,12,6,1,5,1,0,0,0,0,40,0,0 +55,2,191367,1,9,1,5,1,0,0,0,0,40,0,0 +48,2,148995,3,14,1,3,1,0,0,0,0,55,0,1 +20,2,123901,1,9,0,10,3,0,1,0,0,40,0,0 +50,4,117496,1,9,1,0,2,0,1,7298,0,30,0,1 +45,5,32356,0,13,1,1,1,0,0,0,0,51,0,0 +17,2,206506,12,6,0,2,5,0,0,0,0,10,22,0 +38,2,218729,1,9,2,4,0,0,1,0,0,25,0,0 +43,2,52498,1,9,2,1,4,0,1,0,0,40,0,1 +22,2,136767,1,9,1,10,1,0,0,0,0,30,0,0 +63,2,219540,1,9,2,10,0,0,1,0,0,40,0,0 +36,2,114059,0,13,1,1,1,0,0,0,0,45,0,0 +56,2,247337,0,13,1,3,1,0,0,0,0,50,0,1 +43,0,310969,10,15,1,3,1,1,0,0,0,40,0,0 +41,2,171546,0,13,1,9,1,0,0,0,0,45,0,1 +41,2,217455,1,9,2,0,4,0,1,0,0,40,0,0 +36,2,410489,0,13,2,3,0,0,0,0,0,45,0,0 +59,2,146391,8,16,1,3,1,0,0,0,0,50,0,1 +46,4,165484,6,12,1,1,1,0,0,0,0,44,0,1 +23,2,184271,0,13,0,3,0,0,1,0,0,36,0,0 +46,1,231347,5,10,4,3,0,0,0,0,0,20,0,0 +53,2,95469,0,13,1,0,1,0,0,0,1902,40,0,1 +47,2,244025,1,9,0,8,4,3,0,0,0,56,5,0 +46,3,46537,3,14,0,3,0,0,1,0,0,40,0,0 +47,2,205730,1,9,1,10,1,0,0,0,0,56,0,1 +29,2,383745,1,9,1,8,1,0,0,0,1887,30,0,1 +32,2,328199,9,11,2,1,4,0,1,0,0,40,0,0 +90,2,84553,1,9,1,8,1,0,0,0,0,40,0,0 +23,2,123983,9,11,0,3,3,2,0,0,0,40,0,0 +23,2,167868,9,11,0,0,0,0,1,0,0,40,0,0 +44,2,225879,5,10,1,0,2,4,1,0,0,30,4,1 +81,5,247232,12,6,1,1,2,0,1,2936,0,28,0,0 +17,2,143791,12,6,0,4,3,1,1,0,0,12,0,0 +56,2,177271,9,11,1,9,1,0,0,0,0,40,0,1 +58,3,129786,12,6,1,10,1,0,0,0,0,40,0,0 +45,2,31339,0,13,1,0,1,0,0,0,0,45,0,1 +25,2,236267,1,9,1,2,1,0,0,0,0,40,0,0 +36,2,130620,0,13,1,3,2,2,1,0,0,35,11,1 +32,2,208180,9,11,1,9,2,0,1,0,0,24,0,1 +25,2,292058,1,9,0,4,5,0,0,0,0,30,0,0 +29,3,142712,5,10,1,0,1,0,0,0,0,40,0,1 +23,2,119665,1,9,0,0,0,0,0,0,0,60,0,0 +41,2,116825,3,14,1,3,1,0,0,0,0,55,0,1 +48,0,201177,0,13,1,1,1,1,0,0,0,40,0,1 +29,2,118337,1,9,1,6,1,0,0,0,0,60,0,0 +55,2,289257,5,10,1,10,1,0,0,0,0,40,0,0 +30,2,190912,2,7,1,2,1,2,0,0,1651,40,36,0 +45,2,140581,5,10,6,4,4,1,1,0,0,40,0,0 +50,2,174102,1,9,2,10,3,0,0,0,0,40,5,0 +22,2,316509,1,9,0,10,0,0,0,0,0,50,0,0 +80,4,20101,1,9,6,4,4,3,1,0,0,32,0,0 +30,2,187279,1,9,1,2,1,0,0,0,0,44,0,0 +20,2,259496,5,10,0,5,3,0,1,0,0,20,0,0 +29,1,181466,1,9,1,5,1,0,0,0,0,35,0,0 +56,2,178202,5,10,1,8,1,0,0,0,0,40,0,0 +63,2,188976,0,13,1,0,1,0,0,0,0,40,0,0 +20,2,203027,1,9,0,2,3,0,0,0,0,40,0,0 +38,0,142022,1,9,1,0,2,1,1,0,0,40,0,0 +31,2,119033,1,9,1,10,1,0,0,0,0,40,0,0 +21,2,216181,5,10,0,5,3,0,0,0,0,35,0,0 +47,2,178341,12,6,1,8,1,0,0,0,0,46,0,1 +25,4,244408,0,13,0,9,4,2,1,0,0,40,36,0 +31,2,198953,5,10,4,0,4,1,1,0,0,38,0,0 +28,2,173110,1,9,0,1,0,0,1,0,0,40,0,0 +38,2,66326,1,9,1,6,1,0,0,0,0,99,0,0 +30,4,181091,0,13,1,11,1,0,0,0,0,40,0,0 +39,5,135500,1,9,1,1,1,0,0,0,1977,40,0,1 +26,2,86483,5,10,0,1,0,0,1,0,0,40,0,0 +47,2,167787,1,9,0,0,5,0,1,0,0,40,0,0 +27,1,208577,1,9,0,10,0,0,0,0,2258,50,0,0 +43,2,216697,5,10,1,11,1,4,0,0,0,32,0,0 +32,4,118457,0,13,0,3,0,0,0,0,0,55,0,0 +20,2,298635,5,10,0,5,3,2,0,0,0,30,11,0 +21,4,212780,14,8,0,2,4,1,1,0,0,20,0,0 +32,2,159187,9,11,0,3,0,0,0,0,0,40,0,0 +37,2,237995,9,11,2,8,0,1,0,0,0,48,0,0 +45,2,160724,1,9,1,10,1,2,0,0,0,40,36,0 +37,5,183800,6,12,1,5,1,0,0,0,1887,40,0,1 +24,2,161198,0,13,0,3,0,0,0,0,0,25,0,0 +23,2,214542,5,10,0,7,3,0,0,0,0,40,0,0 +40,2,203761,1,9,1,8,1,0,0,0,0,40,0,1 +38,2,161141,5,10,1,10,1,0,0,0,0,48,0,1 +71,2,180117,12,6,1,8,1,0,0,0,0,40,0,0 +51,2,317396,5,10,2,0,4,0,1,0,0,40,0,0 +52,1,237868,5,10,0,0,4,0,0,0,0,5,0,0 +30,2,323069,0,13,0,5,0,0,1,0,0,40,0,0 +34,2,181091,1,9,1,10,1,0,0,7688,0,40,0,1 +38,2,309122,12,6,2,8,0,0,1,0,0,40,0,0 +43,3,105936,9,11,0,3,0,0,1,13550,0,40,0,1 +43,2,40024,2,7,0,6,0,0,0,0,0,42,0,0 +36,3,192443,5,10,0,1,0,1,0,13550,0,40,0,1 +24,0,184216,5,10,0,0,3,0,1,0,0,40,0,0 +55,2,205422,12,6,1,4,2,1,1,0,0,40,0,0 +51,2,22211,3,14,1,3,1,0,0,0,1902,60,0,1 +43,4,196308,1,9,2,1,4,3,1,0,0,40,0,0 +28,2,389713,1,9,2,11,0,0,0,0,0,40,0,0 +54,2,82566,6,12,1,5,1,0,0,0,0,45,0,0 +47,2,199058,5,10,1,3,1,0,0,0,0,40,0,1 +47,2,160440,0,13,1,5,1,0,0,0,0,55,0,1 +47,2,76034,5,10,1,4,1,0,0,0,0,57,0,1 +38,2,188503,5,10,0,0,4,0,1,6497,0,35,0,0 +60,1,92845,11,3,1,7,1,0,0,0,0,40,0,0 +19,2,29083,1,9,0,5,3,3,1,0,0,25,0,0 +22,2,234474,5,10,0,0,3,1,1,0,0,25,0,0 +55,4,107308,3,14,1,3,1,0,0,0,0,40,0,1 +44,2,111891,5,10,4,5,5,1,1,0,0,35,0,0 +53,1,145419,15,2,1,1,1,0,0,7688,0,67,25,1 +44,4,193425,3,14,1,3,2,0,1,4386,0,40,0,1 +28,3,188278,0,13,0,11,0,0,0,0,0,50,0,0 +30,4,303485,5,10,0,6,4,1,1,0,0,40,0,0 +39,4,67187,1,9,0,1,3,3,1,0,0,40,0,0 +43,0,114508,1,9,2,1,4,0,1,0,0,40,0,0 +24,2,204172,0,13,0,5,5,0,1,0,0,40,0,0 +27,4,162973,9,11,0,11,0,0,0,0,0,56,0,0 +64,1,192695,11,3,1,7,1,0,0,0,0,70,8,0 +41,4,89172,5,10,1,7,1,0,0,0,0,40,0,1 +28,2,163320,1,9,0,6,3,0,0,0,0,40,0,0 +61,2,128230,1,9,1,3,1,0,0,0,0,30,0,0 +27,2,246440,2,7,2,8,4,0,1,0,0,40,0,0 +49,2,50567,5,10,2,0,0,0,1,0,0,32,0,0 +20,2,117476,5,10,1,10,1,0,0,0,0,40,0,0 +41,2,315834,0,13,0,3,0,0,1,0,1876,40,0,0 +28,4,214881,1,9,1,10,1,0,0,0,0,40,0,0 +36,2,195516,1,9,2,8,0,0,0,0,0,40,0,0 +44,1,218653,0,13,2,10,3,0,0,0,0,40,0,0 +51,2,87205,0,13,1,0,2,0,1,7688,0,20,0,1 +40,2,164647,5,10,2,3,4,1,1,0,0,38,0,0 +19,2,129151,1,9,0,10,0,0,1,0,0,40,0,0 +54,2,319697,5,10,1,3,2,0,1,0,0,40,0,0 +55,1,193374,1,9,2,10,0,0,0,0,0,40,0,0 +57,2,167864,9,11,6,3,0,0,1,0,0,40,0,0 +29,2,197932,5,10,4,13,0,0,1,0,0,30,24,0 +51,2,102904,1,9,2,5,4,0,1,0,0,43,0,0 +44,2,216907,1,9,2,4,0,0,0,0,0,37,0,0 +35,4,331395,9,11,1,11,1,0,0,0,0,42,0,0 +40,2,171424,1,9,2,6,0,0,0,0,0,40,0,0 +46,2,35406,7,4,4,4,0,0,1,0,0,32,0,0 +25,2,238964,5,10,1,10,1,0,0,0,0,60,0,1 +33,2,213002,0,13,0,3,0,0,0,0,1408,36,0,0 +32,2,27882,5,10,0,8,5,0,1,0,2205,40,40,0 +22,2,340543,1,9,0,9,0,0,1,0,0,40,0,0 +39,2,70240,5,10,1,5,2,2,1,0,0,40,11,0 +18,1,87169,1,9,0,7,3,2,0,0,0,40,0,0 +43,2,253759,1,9,2,0,4,1,1,0,0,45,0,0 +46,2,194431,1,9,0,9,5,0,0,0,0,40,0,0 +63,2,137843,5,10,1,5,1,0,0,7298,0,48,0,1 +59,2,182460,0,13,1,1,1,0,0,0,0,60,0,1 +40,4,26929,3,14,0,3,0,0,1,0,0,40,0,0 +23,2,399022,1,9,0,4,3,0,0,0,0,35,0,0 +36,2,218490,9,11,1,5,1,0,0,0,0,60,0,0 +48,2,164423,1,9,2,8,4,0,1,0,0,40,0,0 +43,2,124436,5,10,1,3,2,0,1,0,0,40,0,1 +18,2,60981,12,6,0,4,3,0,1,0,0,30,0,0 +17,2,70868,2,7,0,10,3,0,0,0,0,16,0,0 +53,2,228500,1,9,1,8,1,0,0,0,0,40,0,1 +36,0,76767,5,10,2,1,0,0,1,0,0,39,0,0 +20,2,218178,1,9,0,2,0,0,0,0,0,40,0,0 +22,2,615367,0,13,0,5,0,0,1,0,0,60,0,0 +34,2,150324,0,13,1,3,1,0,0,0,0,40,0,1 +39,2,51264,2,7,2,4,3,0,0,0,0,40,0,0 +57,2,197642,5,10,6,4,0,0,1,0,0,40,0,0 +30,2,229895,12,6,2,4,4,0,1,0,0,40,0,0 +37,2,167415,10,15,1,3,1,0,0,0,0,60,0,1 +51,2,166934,1,9,1,8,1,0,0,0,0,40,0,1 +38,2,305597,1,9,0,6,4,0,0,0,0,40,0,0 +34,2,301591,1,9,0,1,4,0,1,0,0,35,0,0 +47,3,229646,1,9,3,0,0,1,1,0,0,40,5,0 +28,1,51461,1,9,1,7,1,0,0,0,0,40,0,0 +25,2,206600,12,6,0,4,0,0,0,0,0,24,35,0 +25,2,176836,5,10,0,1,0,0,1,0,0,60,0,0 +50,2,204447,3,14,1,1,1,0,0,15024,0,65,0,1 +50,2,33304,1,9,1,10,1,0,0,0,0,40,0,1 +43,2,174051,0,13,1,10,1,0,0,0,0,48,0,0 +27,2,38918,1,9,0,6,0,0,0,0,1876,75,0,0 +32,2,170017,1,9,1,10,1,0,0,0,0,50,0,0 +44,2,98466,12,6,0,7,4,0,0,0,0,35,0,0 +19,2,188864,1,9,0,5,4,1,1,0,0,20,0,0 +53,5,137815,5,10,6,1,0,0,0,0,0,40,0,1 +21,2,43475,1,9,0,11,0,0,0,0,0,40,0,0 +26,2,557236,1,9,0,6,0,0,0,0,0,40,0,0 +68,2,32779,1,9,1,6,1,0,0,0,419,12,0,0 +31,2,161765,5,10,1,5,1,0,0,0,2051,57,0,0 +32,2,207668,0,13,0,1,5,0,0,0,2444,50,0,1 +33,2,171215,3,14,0,0,3,0,0,0,0,40,0,0 +24,2,183751,2,7,1,10,1,0,0,0,0,65,0,0 +30,2,149507,1,9,1,5,1,0,0,0,0,42,0,0 +49,2,98092,1,9,1,10,1,0,0,0,0,40,0,1 +18,2,123714,2,7,0,2,0,1,0,0,0,40,0,0 +30,0,190385,5,10,0,0,0,0,1,0,0,37,0,0 +51,2,334273,1,9,1,10,1,0,0,0,0,40,0,0 +52,2,343440,5,10,1,3,1,0,0,0,0,40,0,0 +52,2,208302,1,9,2,4,5,0,0,0,0,30,0,0 +23,4,280164,1,9,0,4,3,1,0,0,0,32,0,0 +23,1,174714,12,6,0,10,0,0,0,0,0,60,0,0 +36,2,184655,1,9,1,8,1,0,0,0,0,48,0,0 +19,2,140459,2,7,0,10,5,0,0,0,0,25,0,0 +53,1,108815,1,9,1,10,1,0,0,0,0,60,0,0 +17,2,152652,2,7,0,2,3,0,0,0,0,25,0,0 +69,2,269499,1,9,6,2,0,0,1,0,0,8,0,0 +46,4,33373,0,13,2,3,4,0,1,0,0,40,0,0 +33,2,243674,1,9,4,9,0,0,0,0,0,46,0,0 +40,2,225432,5,10,1,8,1,0,0,0,0,45,0,0 +29,4,195520,3,14,1,3,1,0,0,0,0,40,0,0 +41,2,70092,5,10,2,0,4,0,1,0,0,38,0,0 +22,2,189888,1,9,1,5,1,0,0,0,0,45,0,0 +28,2,64307,7,4,1,10,1,0,0,0,0,40,0,0 +31,2,94235,0,13,1,10,1,0,0,0,0,46,0,0 +35,2,62333,0,13,0,3,0,0,1,0,0,40,0,0 +38,2,260997,5,10,1,8,1,1,0,0,0,40,0,0 +17,2,146268,12,6,0,4,3,0,1,0,0,10,0,0 +39,2,147258,12,6,1,10,1,0,0,0,0,40,0,0 +27,1,207948,5,10,0,4,0,1,0,0,0,40,0,0 +50,2,180607,1,9,0,0,3,0,1,0,0,40,0,0 +56,4,104996,1,9,1,6,1,0,0,0,0,40,0,0 +80,1,562336,1,9,1,7,1,0,0,0,0,20,0,0 +38,1,334366,5,10,1,7,2,0,1,0,0,15,0,0 +52,0,142757,1,9,1,11,1,1,0,0,0,40,0,1 +26,4,220656,0,13,0,3,3,1,0,0,0,38,7,0 +43,2,96483,1,9,2,4,3,2,1,0,0,40,27,0 +45,2,51744,0,13,0,1,0,0,1,0,0,42,0,0 +41,5,114967,9,11,1,1,1,1,0,0,0,40,0,1 +30,2,393965,6,12,2,0,0,0,1,0,0,25,0,0 +24,2,41838,5,10,1,10,1,0,0,2407,0,40,0,0 +43,4,143046,5,10,2,4,4,0,1,0,0,20,0,0 +44,2,209174,0,13,1,1,1,0,0,0,0,70,0,1 +54,2,183248,1,9,2,6,0,1,0,0,0,40,0,0 +23,2,102942,0,13,0,3,3,0,1,0,2258,40,0,1 +33,1,427474,1,9,1,5,1,0,0,0,0,60,0,1 +18,2,338632,2,7,0,4,3,0,0,0,0,16,0,0 +38,2,89559,5,10,4,3,4,0,1,0,0,40,9,0 +41,1,32533,9,11,1,7,1,0,0,0,0,45,0,0 +66,5,112376,7,4,1,10,1,0,0,0,0,40,0,1 +60,1,44915,3,14,2,3,4,0,1,0,0,10,0,0 +24,4,111450,12,6,0,10,4,1,0,0,0,65,19,0 +61,2,171429,2,7,2,4,4,0,1,0,0,36,0,0 +35,4,190964,0,13,1,10,1,0,0,0,0,40,0,0 +19,2,109005,5,10,0,3,3,0,1,0,0,40,0,0 +52,2,404453,1,9,0,0,4,1,1,0,0,40,0,0 +38,1,280169,0,13,1,5,1,0,0,7298,0,50,0,1 +39,1,163204,1,9,1,5,1,0,0,0,0,40,0,0 +33,1,192256,0,13,1,10,1,0,0,0,0,50,0,0 +52,2,181755,1,9,2,0,4,0,1,0,0,40,0,0 +41,2,183105,1,9,4,8,4,0,1,0,0,44,1,0 +37,2,335168,5,10,1,5,1,0,0,0,0,55,0,0 +38,4,86643,0,13,1,3,1,0,0,0,0,45,0,1 +27,2,180262,5,10,0,1,0,0,1,0,0,40,0,0 +38,2,127865,3,14,0,0,4,0,1,0,0,40,0,0 +38,1,146042,0,13,1,3,1,2,0,3103,0,60,0,1 +49,1,102110,1,9,1,9,1,0,0,0,0,30,0,1 +22,2,202745,1,9,0,8,5,0,0,0,0,55,0,0 +40,3,199303,6,12,1,3,1,0,0,0,0,40,0,1 +20,2,266467,1,9,1,10,1,0,0,0,0,40,0,0 +34,3,345259,8,16,0,3,0,0,1,0,0,99,0,0 +24,2,204935,3,14,0,0,0,0,0,0,0,56,0,0 +58,3,244830,0,13,4,3,0,0,0,4787,0,40,0,1 +24,2,190457,5,10,0,0,3,0,1,0,0,40,0,0 +43,2,180138,1,9,0,10,0,0,0,0,0,45,0,0 +38,2,166585,1,9,0,1,3,0,1,0,0,40,0,0 +42,2,29962,1,9,1,10,1,0,0,0,0,40,0,0 +27,2,191129,5,10,1,8,1,0,0,0,0,40,0,0 +18,2,378707,12,6,0,5,3,0,1,0,0,20,0,0 +37,2,116358,1,9,0,10,5,3,0,27828,0,48,0,1 +48,2,240629,1,9,2,6,0,0,0,0,0,65,0,0 +40,2,233320,7,4,4,4,0,0,1,0,0,25,0,0 +50,5,302708,0,13,1,1,1,2,0,7688,0,50,28,1 +57,2,29375,1,9,4,5,0,3,1,0,0,35,0,0 +36,4,137314,5,10,1,11,1,0,0,0,0,60,0,1 +41,2,140886,1,9,1,7,1,0,0,0,0,40,0,0 +90,2,226968,7,4,1,8,1,0,0,0,0,40,0,0 +66,2,151793,7,4,6,4,0,1,1,0,0,10,0,0 +34,1,56460,1,9,1,7,2,0,1,0,2179,12,0,0 +23,2,72887,1,9,0,10,3,2,0,0,0,1,36,0 +35,2,261646,1,9,1,11,1,0,0,0,0,55,0,0 +32,2,178615,1,9,1,10,1,0,0,2407,0,40,0,0 +33,2,295589,0,13,0,3,0,1,0,0,0,50,0,1 +32,5,377836,9,11,1,1,1,0,0,0,0,40,0,0 +31,2,56510,5,10,1,10,1,2,0,0,0,40,0,0 +32,1,337696,5,10,1,5,1,0,0,0,0,50,0,0 +40,2,183765,1,9,1,4,1,0,0,0,0,40,0,0 +27,1,107846,1,9,0,11,0,0,0,0,0,30,0,0 +34,4,22641,1,9,0,11,0,3,0,0,0,40,0,0 +35,2,204590,9,11,1,4,2,1,1,0,0,40,0,1 +29,2,114801,5,10,1,1,1,0,0,0,0,40,0,0 +41,2,190591,1,9,4,4,4,1,1,0,0,20,0,0 +33,0,220066,8,16,1,3,2,0,1,0,0,48,0,1 +52,2,128378,0,13,1,3,1,0,0,0,0,40,0,1 +20,2,157595,1,9,1,10,1,0,0,0,0,40,0,0 +18,4,152171,2,7,0,11,3,0,0,0,0,10,0,0 +49,2,240841,7,4,2,4,4,0,1,0,0,35,0,0 +58,2,94345,1,9,1,5,1,0,0,0,0,40,0,0 +23,1,289116,1,9,2,4,4,0,1,0,0,50,0,0 +59,2,176647,1,9,1,10,1,0,0,0,0,40,0,1 +49,1,79627,5,10,1,1,1,0,0,0,0,40,0,0 +23,4,210781,0,13,0,3,3,0,1,0,0,15,0,0 +20,2,493443,2,7,0,2,0,0,0,0,0,40,0,0 +36,2,86459,9,11,1,1,1,0,0,0,1887,50,0,1 +64,2,312242,5,10,6,1,0,0,1,0,0,3,0,0 +34,2,185408,5,10,0,1,0,0,1,0,0,40,0,0 +63,2,101077,6,12,3,0,5,0,1,0,0,35,0,0 +51,2,147200,1,9,0,0,0,1,1,0,0,40,0,0 +40,0,166327,5,10,2,0,0,1,1,0,0,35,0,0 +55,2,178644,4,5,1,10,1,0,0,0,0,55,0,0 +30,2,158420,0,13,0,8,0,0,0,0,0,25,0,0 +32,1,37232,10,15,1,3,1,0,0,7688,0,45,0,1 +55,2,141877,0,13,1,8,1,0,0,0,0,40,0,0 +47,4,81654,5,10,2,1,0,0,0,0,0,56,0,1 +50,2,177705,0,13,2,4,0,0,0,0,0,40,0,0 +42,2,124792,1,9,1,10,1,1,0,7688,0,45,0,1 +32,1,129497,5,10,1,10,1,0,0,0,0,55,0,1 +60,2,114413,6,12,1,5,1,0,0,0,0,30,0,0 +53,2,189511,1,9,1,10,1,0,0,0,0,40,0,0 +58,2,111625,0,13,6,1,4,0,0,8614,0,40,0,1 +45,2,246431,0,13,0,3,0,0,0,0,0,30,0,0 +31,2,147654,1,9,0,1,3,0,0,0,0,40,0,0 +32,1,443546,1,9,0,10,0,0,0,0,0,40,0,0 +37,2,281751,5,10,2,4,4,0,1,0,0,30,0,0 +28,2,263128,5,10,0,0,0,0,1,0,0,60,0,0 +26,2,292692,14,8,0,10,0,0,0,0,0,40,4,0 +47,5,96798,1,9,1,1,1,0,0,0,0,80,0,1 +34,2,430554,5,10,1,1,1,0,0,0,0,50,0,1 +42,2,317078,1,9,2,8,0,1,0,0,0,40,0,0 +48,2,108557,0,13,1,9,2,0,1,99999,0,40,0,1 +32,2,207400,1,9,0,8,4,1,1,0,0,40,0,0 +35,2,187089,9,11,1,1,2,0,1,0,0,42,0,1 +46,4,398986,8,16,1,3,2,0,1,0,1902,52,0,1 +38,2,238980,5,10,1,4,1,0,0,0,0,40,0,0 +35,2,183800,0,13,1,0,1,0,0,0,0,40,0,1 +45,2,287190,6,12,2,0,4,1,0,0,0,35,0,0 +31,2,111363,0,13,0,1,0,0,0,0,0,40,0,0 +52,5,260938,5,10,1,1,1,0,0,0,0,60,0,1 +20,2,183594,5,10,0,2,3,0,0,0,0,50,0,0 +24,2,172496,3,14,0,9,0,0,0,0,0,50,0,0 +29,2,389713,9,11,1,10,1,0,0,0,0,40,0,1 +23,2,174413,0,13,0,1,0,0,1,0,0,40,0,0 +34,0,189843,1,9,1,0,1,0,0,0,0,40,0,0 +54,2,198546,3,14,6,0,4,0,1,0,0,38,0,0 +21,2,82497,5,10,0,4,0,0,1,0,0,30,0,0 +23,2,193090,0,13,0,0,3,0,1,0,0,30,0,0 +79,2,172220,7,4,6,13,0,0,1,2964,0,30,0,0 +55,2,208451,3,14,1,1,1,0,0,0,0,40,0,1 +60,2,163729,1,9,2,9,4,0,1,2597,0,40,0,0 +37,2,434097,6,12,2,10,0,1,0,0,0,40,0,0 +47,2,192053,1,9,2,6,0,0,0,0,1590,40,0,0 +20,0,178628,5,10,0,0,3,0,0,0,0,40,0,0 +53,2,96827,0,13,0,4,0,0,0,0,0,40,8,0 +34,2,154667,1,9,1,8,2,0,1,0,0,40,0,0 +43,2,160246,5,10,2,3,4,1,1,0,0,40,0,0 +24,1,166036,5,10,1,6,1,0,0,0,0,60,0,0 +23,2,186813,1,9,0,11,3,3,0,0,0,40,0,0 +29,2,162312,9,11,0,8,0,4,0,0,0,40,0,0 +58,2,183893,5,10,2,0,4,1,1,0,0,40,0,0 +40,2,111829,3,14,0,0,3,0,1,0,0,40,0,0 +43,3,175669,5,10,1,0,2,0,1,0,0,40,0,0 +25,0,104097,3,14,0,1,0,0,0,0,0,40,0,0 +23,4,117618,0,13,0,3,3,0,0,0,0,24,0,0 +34,5,202450,1,9,1,10,1,0,0,0,0,50,0,0 +26,2,109570,5,10,4,5,4,0,1,0,0,35,0,0 +60,2,101096,8,16,0,3,0,0,1,0,0,65,0,1 +39,2,236391,1,9,1,6,1,0,0,0,0,50,0,1 +21,2,136975,1,9,0,4,3,0,0,0,0,40,0,0 +45,2,167523,1,9,1,6,1,0,0,0,2179,45,0,0 +33,2,240979,5,10,0,1,0,0,0,0,0,40,0,0 +26,2,248612,0,13,0,1,0,0,0,0,0,70,0,1 +39,2,151023,5,10,2,0,4,0,1,114,0,45,0,0 +29,2,236436,6,12,0,3,0,0,1,8614,0,40,0,1 +52,2,61735,2,7,1,4,1,0,0,0,0,40,0,0 +34,2,243165,0,13,1,4,1,0,0,0,0,30,0,1 +24,2,388885,1,9,0,8,0,0,0,0,0,48,0,0 +77,5,84979,8,16,1,7,1,0,0,20051,0,40,0,1 +34,1,87209,3,14,1,7,1,0,0,0,0,60,0,0 +53,1,168539,4,5,1,7,1,0,0,0,0,70,0,0 +31,2,179013,1,9,4,10,0,1,0,0,0,40,0,0 +58,2,196643,1,9,2,5,0,0,1,0,0,15,0,0 +50,1,68898,3,14,1,5,1,0,0,7688,0,55,0,1 +32,2,156464,1,9,1,10,1,0,0,0,0,40,0,0 +57,2,35884,1,9,2,4,0,0,1,0,0,40,0,0 +32,2,182714,1,9,0,5,0,0,1,0,0,45,0,0 +77,2,344425,4,5,1,13,2,1,1,0,0,10,0,0 +37,1,177277,5,10,0,10,0,0,0,0,0,40,0,0 +51,2,70767,1,9,1,0,5,0,1,0,0,40,0,0 +33,1,520078,6,12,2,5,4,1,0,0,0,60,0,0 +53,4,321770,1,9,3,6,5,0,1,0,0,35,0,0 +32,2,158416,1,9,2,5,0,0,0,0,0,50,0,0 +30,2,312667,5,10,1,10,1,0,0,0,0,40,0,0 +19,2,208656,5,10,0,0,3,0,1,594,0,20,0,0 +33,2,31481,0,13,3,4,4,0,1,0,0,24,0,0 +31,2,259531,9,11,0,0,0,0,1,0,0,40,0,0 +28,2,186239,5,10,0,0,4,1,1,0,0,40,0,0 +19,2,162954,14,8,0,4,3,0,1,0,0,20,0,0 +27,2,249315,1,9,1,5,1,0,0,0,0,60,0,0 +21,2,308237,11,3,1,2,1,0,0,0,0,40,4,0 +24,2,103064,0,13,0,3,0,0,1,0,0,40,0,0 +46,2,185847,1,9,2,6,0,0,0,0,0,54,0,0 +31,2,168521,0,13,0,1,0,0,1,0,0,40,0,0 +60,2,198170,5,10,1,6,1,0,0,0,0,40,0,1 +21,2,353628,12,6,4,5,4,1,1,0,0,38,0,0 +31,2,272069,9,11,2,6,0,0,0,0,0,40,0,0 +26,2,22328,0,13,1,5,1,0,0,0,0,40,0,1 +46,2,309212,1,9,2,13,0,0,1,0,0,25,0,0 +25,5,148888,1,9,1,1,1,0,0,0,0,60,0,1 +23,4,324637,5,10,0,0,0,0,0,0,0,30,0,0 +53,5,55139,3,14,1,1,1,0,0,0,0,40,0,1 +29,2,119004,1,9,1,0,2,0,1,0,2179,40,0,0 +45,2,252079,5,10,1,3,1,0,0,0,0,50,0,1 +70,2,315868,0,13,2,0,0,0,0,0,0,40,0,0 +55,5,392325,0,13,1,5,1,0,0,99999,0,60,0,1 +40,0,174283,8,16,1,3,1,0,0,0,1887,50,0,1 +17,2,126832,12,6,0,4,3,0,0,0,0,30,0,0 +18,2,126071,1,9,0,10,3,0,0,0,0,40,0,0 +34,2,265706,3,14,0,5,4,0,0,0,0,60,0,1 +41,2,282964,5,10,2,0,0,0,1,0,0,40,0,0 +28,2,328518,0,13,0,0,0,0,0,0,0,40,0,0 +23,0,283499,1,9,0,11,3,0,0,0,0,40,0,0 +32,2,286675,5,10,0,1,5,0,0,0,0,40,0,0 +56,2,136472,7,4,1,8,1,1,0,0,0,48,0,0 +36,2,132879,1,9,2,1,4,0,0,0,0,45,0,0 +26,2,314798,1,9,0,0,0,0,0,0,0,50,0,0 +62,2,143943,0,13,6,9,4,0,1,0,0,7,0,0 +35,2,134367,6,12,2,0,4,0,1,0,0,40,0,0 +25,4,366796,0,13,0,3,0,0,1,0,0,40,0,0 +28,2,195573,1,9,1,6,1,0,0,0,0,50,0,0 +21,2,33616,5,10,0,0,3,0,1,0,0,25,0,0 +31,2,164190,12,6,1,6,1,0,0,0,0,40,0,0 +23,2,380281,6,12,0,4,3,0,0,0,0,25,13,0 +58,5,190763,0,13,1,3,1,0,0,0,0,40,0,1 +55,4,209535,3,14,1,3,1,0,0,0,0,40,0,1 +54,2,156003,1,9,1,10,1,0,0,0,0,40,0,0 +33,2,55699,1,9,1,6,1,0,0,3908,0,40,0,0 +28,2,183151,2,7,1,2,1,0,0,7688,0,40,0,1 +40,2,198790,2,7,1,8,1,0,0,0,0,30,0,0 +33,1,272359,0,13,1,5,1,0,0,7298,0,80,0,1 +27,2,236481,10,15,0,3,0,2,0,0,0,10,3,0 +55,2,143266,1,9,2,0,4,0,0,0,0,25,0,0 +53,2,192386,1,9,4,6,4,0,0,0,0,45,0,0 +23,2,99543,14,8,0,6,0,0,0,0,0,46,0,0 +66,2,169435,1,9,6,10,0,0,0,0,0,16,0,0 +34,1,34572,9,11,1,1,1,0,0,0,0,60,0,1 +39,2,119272,12,6,2,6,0,0,0,0,0,40,0,0 +21,2,211601,5,10,0,0,3,1,1,0,0,40,0,0 +26,2,154785,5,10,3,0,3,4,1,0,0,35,0,0 +21,2,213041,1,9,0,0,3,0,1,0,0,40,1,0 +59,2,229939,1,9,1,5,1,0,0,0,0,40,0,0 +61,2,175331,12,6,1,6,1,0,0,0,0,40,0,0 +30,2,226443,0,13,1,5,1,0,0,0,0,50,0,1 +22,2,46561,9,11,1,8,1,0,0,0,0,40,0,0 +47,2,161311,1,9,2,8,4,0,1,0,0,30,0,0 +50,2,98215,1,9,2,4,0,0,0,0,0,40,0,0 +67,2,118363,0,13,2,1,0,0,1,0,2206,5,0,0 +59,4,181242,12,6,1,10,1,0,0,0,0,40,0,0 +35,2,356238,6,12,0,4,0,0,1,0,0,80,0,1 +56,1,39380,5,10,3,7,0,0,1,27828,0,20,0,1 +34,2,269723,1,9,2,1,4,0,1,2977,0,50,0,0 +63,2,34098,12,6,6,7,4,0,1,0,0,56,0,0 +48,2,50880,5,10,1,10,1,0,0,0,0,40,9,0 +41,3,356934,5,10,1,3,1,0,0,0,0,44,0,1 +26,2,276309,5,10,0,2,3,1,1,0,0,20,0,0 +47,2,175925,12,6,1,5,1,0,0,0,2179,52,0,0 +29,1,164607,9,11,1,7,1,0,0,0,0,50,0,0 +30,2,224462,1,9,0,2,3,0,0,0,0,40,0,0 +19,2,92863,1,9,0,5,3,0,0,0,0,20,0,0 +27,2,179565,0,13,0,0,0,0,1,0,0,37,0,0 +59,1,31137,1,9,1,7,1,0,0,0,0,70,0,0 +19,2,199495,1,9,0,10,3,0,0,0,0,40,0,0 +45,2,175262,4,5,1,2,1,2,0,0,0,40,3,0 +37,2,220585,1,9,0,0,0,0,0,0,0,40,0,0 +44,4,231793,8,16,3,3,4,0,1,0,0,38,0,0 +34,3,191342,0,13,1,0,1,2,0,0,0,38,0,0 +30,2,186420,0,13,0,9,0,0,1,0,0,35,0,0 +30,2,328242,0,13,1,1,1,2,0,0,0,40,37,1 +56,2,279340,2,7,4,4,0,1,1,0,0,40,0,0 +19,2,174478,1,9,0,4,3,0,1,0,0,40,0,0 +37,2,151771,7,4,1,10,1,0,0,0,0,40,0,0 +45,2,145636,3,14,1,1,1,0,0,0,1977,43,0,1 +21,2,120326,5,10,0,0,3,0,1,0,0,40,0,0 +34,1,246439,1,9,1,7,1,0,0,0,0,45,0,0 +27,2,144133,0,13,1,1,5,0,0,0,0,50,0,0 +44,4,145522,3,14,0,3,0,0,1,0,0,40,0,0 +33,2,312055,0,13,0,1,0,0,0,0,0,40,0,0 +32,2,235847,5,10,0,1,5,0,1,0,0,50,0,0 +37,2,187748,5,10,1,10,1,0,0,0,0,40,0,0 +26,2,396482,0,13,0,5,0,0,1,0,0,48,0,0 +49,2,261688,1,9,1,10,1,0,0,5013,0,60,0,0 +20,2,39477,5,10,0,3,0,0,1,0,0,30,0,0 +37,2,143058,5,10,1,10,1,0,0,0,0,40,0,0 +22,2,216867,11,3,1,10,1,0,0,0,0,48,4,0 +44,2,230592,0,13,0,9,0,0,0,0,0,35,0,0 +30,4,40338,1,9,1,10,1,0,0,0,0,40,0,0 +55,4,115457,1,9,1,4,1,0,0,0,0,40,0,0 +36,2,374983,2,7,1,8,1,0,0,0,0,40,0,0 +29,2,285419,14,8,0,9,0,0,0,0,0,40,0,0 +45,0,187581,9,11,1,11,1,0,0,0,0,40,0,0 +38,5,299036,0,13,1,5,1,0,0,0,0,55,0,1 +42,2,68729,5,10,0,10,0,2,0,0,0,40,0,0 +27,2,333990,9,11,0,1,3,0,1,0,0,40,0,0 +20,2,117767,5,10,0,0,3,0,0,0,0,25,0,0 +43,2,184378,0,13,1,3,1,0,0,0,0,35,0,0 +21,2,232591,1,9,0,0,3,0,0,0,0,40,0,0 +33,2,143851,0,13,0,3,0,0,1,0,0,40,0,0 +36,1,89622,1,9,1,10,1,0,0,0,0,80,0,1 +34,2,202498,14,8,1,4,1,0,0,0,0,40,21,0 +54,2,343242,5,10,1,1,1,0,0,0,0,44,0,1 +30,2,460408,1,9,1,10,1,0,0,0,0,40,0,1 +63,2,205246,1,9,1,8,1,1,0,0,0,40,0,0 +36,2,230329,0,13,1,1,1,0,0,0,0,50,0,1 +25,2,197871,0,13,0,1,0,0,0,0,0,50,0,0 +55,2,194290,1,9,2,10,0,0,0,0,0,40,0,0 +44,2,191814,5,10,1,3,1,0,0,0,0,45,0,1 +41,2,95168,1,9,0,8,4,1,1,0,0,40,0,0 +47,2,386136,6,12,1,3,1,0,0,0,0,40,0,1 +41,2,152529,0,13,0,3,0,0,0,0,0,40,0,1 +35,2,214891,1,9,1,6,1,4,0,0,0,40,21,0 +18,2,133654,1,9,0,0,3,0,1,0,0,40,0,0 +23,2,147548,1,9,2,4,4,0,1,0,0,30,0,0 +57,2,73051,0,13,1,1,1,0,0,0,0,40,0,0 +56,1,60166,15,2,0,1,0,3,0,0,0,65,0,0 +25,5,454934,5,10,0,5,3,0,1,0,0,35,0,0 +35,1,185621,0,13,0,3,3,0,1,0,0,40,0,0 +61,2,101500,9,11,1,0,1,0,0,0,0,40,0,0 +36,0,36397,0,13,2,3,0,0,1,0,0,55,0,0 +18,2,276540,14,8,0,5,3,1,1,0,0,15,0,0 +21,2,293968,5,10,3,5,3,1,1,0,0,20,0,0 +32,4,186993,1,9,1,6,1,0,0,0,0,40,0,0 +52,2,232132,14,8,1,8,1,0,0,0,0,45,0,1 +48,2,176917,1,9,1,10,1,0,0,0,0,55,0,0 +40,2,105936,0,13,2,3,0,0,1,0,0,40,0,0 +35,2,105821,1,9,1,1,1,0,0,5178,0,40,0,1 +42,2,178074,1,9,2,0,0,0,1,0,0,40,0,0 +34,2,191930,5,10,1,8,1,1,0,0,0,40,0,0 +27,2,130807,6,12,1,9,1,0,0,0,0,40,0,0 +47,1,94100,0,13,0,7,0,0,0,0,0,65,0,0 +65,1,144822,4,5,1,10,1,0,0,0,0,45,0,0 +61,5,102191,3,14,6,1,4,0,1,0,0,99,0,0 +18,2,90934,5,10,0,5,3,0,0,0,0,28,0,0 +48,2,173243,8,16,1,3,1,0,0,0,0,45,0,1 +26,2,258768,5,10,0,6,0,1,0,2174,0,75,0,0 +30,2,189759,0,13,0,5,0,0,0,0,0,40,0,0 +68,1,69249,1,9,1,7,1,0,0,0,0,50,0,1 +23,2,133061,1,9,1,5,1,0,0,0,0,80,0,0 +65,1,175202,1,9,1,1,1,0,0,0,0,24,0,0 +32,2,27051,0,13,1,0,1,0,0,0,0,44,0,0 +44,2,60414,3,14,1,1,1,0,0,0,0,40,0,1 +48,4,317360,3,14,1,3,2,0,1,0,0,40,0,1 +24,2,258298,9,11,0,9,0,0,0,0,0,45,0,0 +58,2,174040,5,10,0,7,0,0,0,0,0,40,0,0 +32,4,177566,5,10,3,3,0,0,0,0,0,50,9,0 +54,2,162238,3,14,2,1,0,0,0,0,0,50,0,1 +35,2,87556,3,14,0,3,0,0,0,0,0,45,0,1 +35,2,144322,6,12,2,1,0,0,1,0,0,50,0,0 +24,2,190015,1,9,0,5,3,0,0,0,0,40,0,0 +50,2,183173,1,9,1,3,1,0,0,99999,0,40,0,1 +38,1,151322,1,9,4,10,0,0,0,0,0,40,0,0 +57,4,47392,1,9,1,1,1,0,0,0,0,40,0,1 +38,2,107125,5,10,0,5,0,0,0,0,0,60,0,0 +49,2,265295,1,9,0,10,0,0,0,0,0,40,0,0 +25,2,189219,0,13,0,9,3,0,1,0,0,16,0,0 +56,2,147989,5,10,3,6,0,0,0,0,0,40,0,0 +32,2,185732,2,7,2,4,4,0,1,0,0,40,0,0 +22,2,153516,0,13,0,3,0,0,0,0,0,40,0,0 +33,2,216145,1,9,1,10,1,0,0,0,0,40,0,0 +42,2,202872,5,10,2,0,4,0,1,0,0,12,0,0 +62,1,39630,1,9,1,6,1,0,0,0,0,48,0,0 +26,4,206721,0,13,0,11,3,0,0,0,0,40,0,0 +46,2,358585,5,10,2,10,4,0,0,0,0,40,0,1 +33,2,377283,0,13,4,5,0,0,1,0,0,50,0,1 +65,6,172949,1,9,1,6,1,0,0,2414,0,20,0,0 +46,2,110171,5,10,1,10,1,0,0,7688,0,40,0,1 +43,4,223861,9,11,2,1,0,0,1,0,0,40,0,0 +43,2,163455,1,9,1,10,1,0,0,0,0,40,0,1 +35,2,183892,12,6,1,10,1,0,0,0,0,40,0,0 +48,2,47022,1,9,6,2,5,0,1,0,0,48,0,0 +55,3,145401,0,13,1,1,1,0,0,0,0,40,0,1 +45,2,387074,9,11,1,10,1,0,0,0,0,40,0,0 +56,2,105363,0,13,1,1,1,0,0,4508,0,40,0,0 +59,3,195467,3,14,0,1,0,0,0,0,0,40,0,0 +56,4,170217,1,9,1,10,1,0,0,0,0,40,0,0 +21,2,156807,1,9,0,4,3,1,0,0,0,10,0,0 +26,2,255193,2,7,1,1,1,0,0,3411,0,40,0,0 +38,2,273640,1,9,0,4,4,0,1,0,0,40,0,0 +27,2,191177,5,10,0,0,3,0,1,0,0,40,0,0 +48,5,184787,7,4,1,10,1,0,0,0,0,50,0,1 +37,0,239409,3,14,1,3,1,0,0,0,0,60,0,1 +63,1,404547,1,9,1,10,1,0,0,0,0,30,0,0 +27,0,23740,1,9,0,6,0,3,0,0,0,38,0,1 +20,2,382153,5,10,0,5,3,0,0,0,0,25,0,0 +26,2,164488,3,14,1,3,1,0,0,0,1887,40,0,1 +51,1,168539,6,12,1,1,1,0,0,0,0,40,0,0 +28,2,189530,6,12,1,3,1,0,0,0,0,40,0,1 +39,2,89419,9,11,2,4,0,3,1,0,0,40,13,0 +35,2,224512,3,14,1,5,1,0,0,0,0,55,0,1 +65,2,85787,7,4,1,10,1,0,0,0,0,40,0,0 +54,4,279881,9,11,1,6,1,1,0,0,0,40,0,0 +39,2,194287,7,4,0,4,3,0,0,0,1602,35,0,0 +24,2,141040,5,10,0,0,3,1,1,0,0,40,0,0 +36,2,222294,0,13,0,1,0,2,1,0,0,40,0,0 +52,2,38795,1,9,2,10,0,0,0,0,0,40,0,1 +64,2,182979,1,9,1,8,1,0,0,0,0,40,0,0 +43,2,223277,5,10,2,10,0,0,0,0,0,40,0,0 +44,2,67065,9,11,0,13,0,0,0,594,0,25,0,0 +47,3,160647,1,9,4,0,4,0,1,0,0,40,0,0 +32,2,45796,14,8,1,2,1,0,0,0,0,40,0,0 +20,2,110597,5,10,0,5,3,0,1,0,0,30,0,0 +33,2,166961,5,10,0,0,0,0,1,0,0,38,0,0 +52,2,318975,1,9,2,0,4,0,1,0,0,40,1,0 +49,2,305657,7,4,1,8,1,0,0,0,0,40,0,0 +31,2,120857,1,9,1,5,2,0,1,0,0,18,0,0 +62,1,158712,1,9,0,4,4,0,1,0,0,6,0,0 +44,2,304530,5,10,2,10,0,0,0,0,0,55,0,0 +28,4,327533,1,9,1,11,1,0,0,3908,0,40,0,0 +68,4,233954,3,14,6,3,4,1,1,0,0,40,0,1 +40,3,26880,5,10,0,0,4,0,1,0,0,40,0,0 +46,2,70754,7,4,0,2,0,0,0,0,0,50,0,0 +22,2,184665,1,9,0,8,3,0,1,0,0,40,0,0 +37,1,245372,0,13,2,9,0,0,0,0,0,15,0,0 +62,2,252668,3,14,0,3,0,0,0,0,0,70,0,0 +37,2,86551,0,13,1,1,1,0,0,0,0,50,0,1 +35,2,241998,1,9,0,5,0,0,0,4787,0,40,0,1 +44,2,106900,1,9,1,5,1,0,0,0,0,68,0,0 +41,2,204235,9,11,1,5,1,0,0,0,0,40,0,1 +36,4,127772,0,13,2,3,4,0,0,0,0,40,0,0 +26,2,117217,0,13,2,4,0,0,1,0,0,45,0,0 +48,3,215389,1,9,1,6,1,1,0,0,0,40,0,1 +21,2,198050,1,9,0,4,0,0,1,0,0,28,0,0 +39,2,173476,10,15,1,10,1,0,0,7688,0,40,0,1 +38,2,217349,9,11,2,3,0,0,1,14344,0,40,0,1 +44,2,377018,9,11,1,10,1,0,0,0,0,40,0,1 +56,2,99894,12,6,1,5,2,2,1,0,0,30,28,1 +25,2,170786,4,5,0,6,5,0,0,0,0,40,0,0 +32,4,250585,0,13,0,3,0,0,1,0,0,50,0,0 +47,2,198769,5,10,0,0,0,0,1,0,0,40,0,1 +26,2,306513,5,10,0,2,3,0,0,0,0,40,0,0 +31,2,178623,0,13,0,3,0,1,1,14084,0,60,0,1 +23,2,109307,9,11,0,1,3,0,0,0,0,40,0,0 +41,3,106982,5,10,2,3,4,0,1,0,0,40,0,1 +55,1,396878,5,10,1,1,1,1,0,0,0,25,0,0 +23,2,344278,5,10,2,1,4,0,1,0,0,25,0,0 +45,2,203653,1,9,1,0,1,1,0,7298,0,40,0,1 +42,4,227890,0,13,1,1,1,0,0,0,1485,40,0,0 +29,2,107812,5,10,0,3,0,0,0,0,0,15,0,0 +48,2,185143,3,14,1,1,1,0,0,0,0,40,0,0 +36,2,143068,5,10,2,10,4,0,0,0,0,40,0,0 +52,5,114758,0,13,1,5,1,0,0,15024,0,50,0,1 +46,2,266337,9,11,2,10,4,0,0,0,0,40,0,0 +34,2,321787,5,10,0,0,3,0,0,0,0,40,0,0 +27,0,21306,6,12,0,0,0,0,1,0,0,40,9,0 +18,2,271935,1,9,0,8,3,0,1,0,0,40,0,0 +18,2,148952,5,10,0,4,3,0,1,0,0,24,0,0 +42,2,196626,7,4,1,10,1,0,0,0,0,40,0,0 +36,2,199439,3,14,1,1,1,0,0,0,0,45,0,1 +52,5,81436,10,15,1,5,1,0,0,0,0,40,0,1 +44,5,352971,0,13,1,1,1,0,0,0,0,45,0,1 +53,2,375134,5,10,1,5,1,0,0,0,0,60,0,1 +36,2,206521,0,13,1,5,1,0,0,0,0,60,0,1 +27,2,330466,0,13,0,9,5,2,0,0,0,40,0,0 +52,2,208302,1,9,1,8,1,0,0,0,0,60,0,0 +60,1,135285,3,14,1,3,1,0,0,0,0,40,0,0 +41,2,171615,6,12,1,9,1,0,0,0,0,45,0,1 +64,1,149698,10,15,1,3,1,0,0,0,0,40,0,1 +25,2,71351,15,2,0,4,5,0,0,0,0,25,22,0 +63,2,84737,7,4,1,4,1,2,0,0,0,40,27,0 +54,4,375134,9,11,2,10,0,0,0,0,0,40,0,0 +21,2,207103,1,9,0,2,3,0,0,0,0,40,0,0 +27,2,199314,0,13,0,0,0,0,0,0,0,40,12,0 +63,1,289741,3,14,1,7,1,0,0,41310,0,50,0,0 +37,2,240837,1,9,2,4,0,0,1,0,0,30,0,0 +22,2,283499,1,9,0,6,0,0,0,0,0,35,0,0 +54,2,97778,7,4,1,10,1,0,0,0,0,40,0,0 +54,2,21698,12,6,2,4,4,0,1,0,0,40,0,0 +60,4,232618,1,9,1,4,1,0,0,0,0,40,0,0 +19,2,175820,2,7,0,2,3,0,0,0,0,25,0,0 +25,4,63996,1,9,2,0,0,0,1,0,0,40,0,0 +51,4,182985,1,9,1,0,2,0,1,0,0,40,0,0 +47,3,380127,1,9,0,1,0,0,1,0,0,40,0,0 +44,1,111483,12,6,0,10,3,0,0,0,0,50,0,0 +57,2,96346,1,9,6,3,0,0,1,0,0,57,0,0 +22,2,317528,5,10,0,5,3,0,0,0,0,34,0,0 +36,0,223020,5,10,2,4,4,1,1,0,0,20,0,0 +39,2,115076,5,10,1,8,1,0,0,0,0,40,0,0 +49,2,133969,8,16,1,3,1,4,0,0,0,50,0,1 +41,2,173858,1,9,1,4,1,2,0,0,0,40,26,0 +35,2,193241,5,10,1,0,1,0,0,0,0,38,0,0 +40,5,50644,6,12,2,5,4,0,1,1506,0,40,0,0 +30,2,178841,0,13,0,1,0,0,1,0,0,40,0,0 +25,2,177017,1,9,0,5,0,0,0,0,1504,37,0,0 +25,2,253267,5,10,1,0,1,1,0,0,1902,36,0,1 +37,2,202027,3,14,1,0,1,0,0,7688,0,50,0,1 +53,1,321865,10,15,2,3,0,0,0,0,0,60,0,1 +34,1,321709,6,12,0,3,0,0,1,0,0,25,0,0 +18,2,210574,1,9,0,5,3,0,1,0,0,20,0,0 +45,2,474617,1,9,2,5,4,1,0,5455,0,40,0,0 +19,2,264390,5,10,0,0,3,0,1,0,2001,40,0,0 +33,5,144949,0,13,1,5,1,0,0,0,0,65,0,0 +45,0,90803,5,10,1,0,1,0,0,0,0,40,0,0 +43,0,126701,0,13,1,1,1,0,0,0,0,35,0,1 +40,2,178417,1,9,1,10,1,0,0,0,0,35,0,0 +41,1,197176,0,13,1,7,1,0,0,0,0,75,0,1 +25,2,182227,1,9,1,10,1,0,0,0,1579,40,0,0 +22,2,117606,0,13,0,0,3,0,1,0,0,32,0,0 +52,2,349502,5,10,0,0,4,0,0,0,0,45,0,0 +45,3,81487,5,10,1,0,1,0,0,0,0,40,5,1 +32,0,169583,8,16,0,3,0,0,1,0,0,70,0,0 +26,2,485117,0,13,0,6,3,0,0,0,0,20,0,0 +24,2,35603,5,10,2,4,0,1,0,0,0,40,0,0 +37,2,175390,1,9,2,8,4,1,1,0,0,40,0,0 +49,2,184986,1,9,2,4,0,0,1,0,0,40,0,0 +43,4,174395,3,14,1,3,1,0,0,0,0,50,0,0 +35,2,187711,1,9,0,8,0,0,0,0,0,40,0,0 +37,2,189878,10,15,1,3,1,0,0,0,0,50,0,1 +17,2,224073,2,7,0,5,3,0,0,0,0,20,0,0 +48,2,159726,1,9,1,6,1,0,0,0,0,55,0,1 +26,2,456618,5,10,0,0,3,0,0,2597,0,40,0,0 +35,2,202397,0,13,1,10,1,2,0,0,0,40,11,1 +21,2,206681,5,10,0,5,3,0,1,0,0,15,0,0 +54,2,222020,12,6,2,4,0,0,0,0,0,70,0,0 +40,2,137304,0,13,2,0,0,1,1,0,0,40,0,0 +51,2,141645,5,10,4,1,0,1,1,0,0,40,0,0 +60,1,218085,1,9,1,4,2,1,1,0,0,50,0,0 +22,2,52596,5,10,0,5,3,0,0,0,0,8,0,0 +20,2,197997,1,9,0,7,3,0,0,0,0,40,0,0 +21,2,191444,2,7,0,7,4,0,0,0,0,40,0,0 +21,2,40767,5,10,0,2,0,0,0,0,0,40,0,0 +43,2,172577,5,10,2,0,0,0,1,0,0,44,0,0 +36,2,241998,0,13,1,10,1,0,0,0,0,50,0,1 +65,0,215908,1,9,1,0,1,0,0,0,2174,40,0,1 +48,2,212120,1,9,1,8,1,0,0,0,0,40,0,1 +37,2,109133,3,14,4,1,0,0,0,27828,0,60,10,1 +20,2,224424,14,8,0,8,3,0,0,0,0,40,0,0 +41,0,214985,1,9,2,1,0,0,1,0,0,40,0,0 +55,1,147098,4,5,1,10,1,0,0,0,0,50,0,0 +39,4,149833,0,13,2,3,4,0,1,0,0,40,0,0 +41,3,253770,5,10,1,6,2,0,1,7298,0,40,0,1 +80,2,252466,9,11,1,10,1,0,0,0,0,24,0,0 +59,0,132717,12,6,1,7,1,0,0,0,0,40,0,0 +52,2,138944,2,7,1,10,1,0,0,0,0,40,0,1 +39,2,280570,0,13,1,1,1,0,0,3103,0,50,0,1 +56,1,144380,5,10,3,3,0,1,0,0,0,50,0,0 +69,4,660461,1,9,6,0,0,1,1,0,0,20,0,0 +49,2,177211,0,13,1,1,1,0,0,0,0,50,0,1 +33,2,197424,1,9,1,1,1,0,0,5013,0,40,0,0 +28,5,31717,1,9,1,1,1,0,0,0,0,45,0,1 +49,2,296849,5,10,1,1,1,0,0,0,0,40,0,1 +51,4,193720,1,9,3,2,4,0,0,0,0,40,0,0 +42,2,106698,5,10,2,4,4,0,1,0,0,32,0,0 +66,2,214469,1,9,6,0,0,0,1,0,0,13,0,0 +44,2,185798,9,11,4,10,5,0,0,0,0,48,0,1 +26,2,333108,1,9,2,5,0,0,0,0,0,40,0,0 +43,2,35210,5,10,2,0,4,0,1,0,0,40,0,0 +28,2,140845,12,6,0,8,0,0,1,0,155,40,0,0 +17,2,170455,2,7,0,5,3,0,1,0,0,8,0,0 +52,2,298215,0,13,1,10,1,0,0,0,0,50,0,1 +24,2,404416,5,10,0,2,0,0,0,0,0,40,0,0 +65,2,143175,5,10,6,5,5,0,1,0,0,45,0,0 +36,1,409189,5,10,1,10,1,0,0,0,0,40,0,1 +19,2,285750,1,9,0,2,5,0,0,0,0,30,0,0 +43,2,235556,5,10,3,5,0,0,0,0,0,45,4,0 +39,4,170382,3,14,1,3,2,0,1,0,0,50,7,1 +48,2,195437,2,7,1,6,1,0,0,0,0,40,0,1 +50,4,191130,9,11,1,11,1,0,0,0,0,40,0,1 +21,2,231160,5,10,0,4,3,0,0,0,0,25,0,0 +36,2,47310,1,9,0,4,0,1,1,0,0,40,0,0 +33,2,214635,1,9,1,4,1,1,0,0,0,36,19,0 +50,3,65160,0,13,1,1,1,0,0,0,0,40,0,0 +49,0,423222,3,14,1,5,1,0,0,99999,0,80,0,1 +70,5,272896,8,16,1,1,1,0,0,0,0,40,0,1 +39,2,232854,1,9,2,6,0,0,0,0,0,40,0,0 +44,2,442035,5,10,2,3,0,0,1,0,0,40,0,0 +32,2,127875,0,13,1,9,2,0,1,0,0,40,0,1 +40,2,283724,4,5,0,10,5,1,0,0,0,49,0,0 +46,2,403911,1,9,1,10,1,1,0,0,1902,40,0,1 +40,2,177027,0,13,1,4,2,2,1,7688,0,52,28,1 +47,2,249935,2,7,2,10,3,0,0,0,0,8,0,0 +19,2,533147,1,9,0,0,0,0,0,0,0,30,0,0 +22,2,137862,5,10,0,0,5,0,1,0,0,16,0,0 +20,2,249543,5,10,0,11,3,0,1,0,0,16,0,0 +46,4,230979,0,13,2,3,0,0,1,4787,0,25,0,1 +41,2,137126,0,13,1,3,1,0,0,0,1977,45,0,1 +17,2,147339,12,6,0,3,3,4,1,0,0,15,0,0 +41,2,256647,1,9,1,8,1,1,0,0,0,40,0,0 +28,2,111696,1,9,4,10,0,0,0,0,1974,40,0,0 +24,2,285457,1,9,0,4,0,0,0,0,0,40,0,0 +33,2,303867,5,10,1,1,1,0,0,0,0,50,0,0 +44,3,113597,5,10,1,1,1,0,0,0,0,55,0,1 +26,1,151626,1,9,0,3,3,1,1,0,0,40,0,0 +47,1,26145,9,11,1,5,1,0,0,0,0,40,0,1 +24,2,176189,1,9,1,8,1,0,0,0,0,40,0,0 +58,3,497253,0,13,1,1,1,1,0,0,0,40,0,1 +41,2,41090,1,9,1,10,1,0,0,0,2002,60,0,0 +38,1,282461,7,4,1,5,1,0,0,0,0,35,0,1 +21,2,225541,5,10,0,0,0,0,1,0,0,40,0,0 +33,2,203488,5,10,0,1,3,0,0,0,0,45,0,0 +40,2,99373,12,6,2,8,4,0,1,0,0,40,0,0 +47,4,109705,1,9,2,1,0,0,1,0,0,40,0,0 +41,2,144947,0,13,2,1,4,1,1,0,0,40,0,0 +38,2,617898,0,13,1,7,1,0,0,0,0,50,0,0 +50,2,38310,7,4,2,4,5,0,1,0,0,40,0,0 +45,2,248993,1,9,3,7,5,1,0,0,0,40,0,0 +33,2,69311,1,9,0,2,0,0,0,0,0,40,0,0 +34,3,143766,6,12,0,0,0,0,0,0,0,40,0,0 +65,2,213477,3,14,2,5,0,0,0,0,0,28,0,0 +24,2,275691,2,7,0,6,3,0,0,0,0,39,0,0 +26,2,59367,0,13,0,8,5,0,0,0,0,40,0,0 +55,2,35551,1,9,2,10,0,0,0,0,0,40,0,0 +66,2,236784,0,13,2,3,4,0,1,0,0,8,1,0 +43,4,193755,0,13,1,3,1,0,0,0,0,40,0,0 +37,2,315291,0,13,0,0,5,1,1,0,0,40,0,0 +22,2,290504,1,9,1,10,1,0,0,0,0,40,0,0 +21,2,256240,2,7,1,8,1,0,0,0,0,40,0,0 +27,2,178709,3,14,0,8,0,0,1,0,0,40,0,0 +48,2,449354,1,9,1,0,1,0,0,4386,0,45,0,1 +24,2,187937,0,13,0,3,4,0,1,0,0,40,0,0 +53,4,188772,1,9,6,4,0,0,1,0,0,30,0,0 +26,2,157617,1,9,1,10,1,0,0,0,0,40,12,0 +60,2,96099,5,10,1,5,1,0,0,0,0,40,0,1 +21,2,122322,5,10,0,4,3,0,1,0,0,60,0,0 +39,2,409189,11,3,1,4,1,0,0,0,0,40,4,0 +45,2,175925,5,10,1,1,1,0,0,0,0,60,0,1 +76,1,236878,1,9,1,10,1,0,0,0,0,30,0,0 +19,2,216647,5,10,0,4,0,0,1,0,0,30,0,0 +34,2,300681,5,10,1,3,1,1,0,0,0,40,2,1 +54,2,327769,5,10,2,10,0,0,0,0,0,40,0,0 +23,2,194723,0,13,0,0,0,0,1,0,0,40,0,0 +44,4,31251,7,4,2,2,0,0,0,0,0,40,0,0 +27,2,212506,5,10,2,0,4,1,1,0,0,40,0,0 +23,2,23037,14,8,0,2,3,3,0,0,0,40,0,0 +37,1,29054,1,9,1,7,1,0,0,0,0,50,0,0 +41,2,92733,1,9,1,10,1,0,0,0,0,40,0,1 +21,0,184678,5,10,0,0,3,0,1,0,0,35,0,0 +37,3,32528,1,9,1,0,1,0,0,0,0,40,7,1 +63,2,125954,1,9,0,8,0,0,0,2174,0,40,0,0 +35,2,73715,2,7,1,10,1,0,0,0,0,40,0,0 +41,2,287037,5,10,0,7,0,0,0,0,0,40,0,0 +50,1,64667,1,9,2,3,0,2,1,0,0,60,36,0 +26,5,366662,1,9,0,5,3,0,0,0,0,50,0,0 +36,4,113337,5,10,1,9,1,0,0,0,0,42,0,1 +47,2,387468,5,10,1,3,1,0,0,0,0,40,32,1 +51,2,384248,5,10,2,1,4,1,1,0,0,50,0,0 +41,2,332703,1,9,2,0,0,4,1,0,625,40,0,0 +40,2,198873,10,15,1,3,2,0,1,15024,0,30,0,1 +32,2,317809,0,13,1,1,1,0,0,4064,0,50,0,0 +37,4,160910,0,13,1,0,1,0,0,7298,0,40,0,1 +40,5,182629,0,13,2,1,0,0,0,0,0,40,0,0 +56,2,267652,0,13,1,10,1,0,0,0,0,40,0,0 +50,2,410186,1,9,1,10,1,0,0,0,0,40,0,0 +28,2,365411,4,5,1,8,1,0,0,0,0,42,0,0 +28,2,205337,1,9,1,8,1,0,0,0,0,40,0,0 +19,1,100999,2,7,0,0,3,0,1,0,0,30,0,0 +44,2,197462,1,9,1,8,1,0,0,0,0,40,0,0 +42,1,199143,10,15,2,3,4,0,1,7430,0,44,0,1 +47,2,191978,5,10,1,1,1,0,0,0,0,40,0,1 +31,2,50178,5,10,1,8,1,0,0,0,0,40,0,0 +61,2,72442,2,7,1,4,1,0,0,0,0,40,0,1 +21,2,248512,5,10,0,0,3,0,1,0,0,40,0,0 +26,2,178140,0,13,1,4,1,0,0,0,0,45,0,1 +58,2,354024,1,9,1,0,2,0,1,0,0,40,0,1 +35,2,143589,0,13,3,3,0,2,1,0,0,40,11,0 +35,2,219902,9,11,0,0,0,1,1,0,0,40,0,0 +29,4,419722,6,12,0,0,0,0,0,3674,0,40,0,0 +40,2,154374,3,14,1,3,1,0,0,7688,0,40,0,1 +33,2,132601,0,13,1,5,1,0,0,0,0,55,0,1 +38,1,29430,5,10,2,8,4,0,0,0,0,40,0,0 +50,1,30731,9,11,0,4,0,0,0,0,0,50,0,0 +66,2,210825,5,10,1,9,1,0,0,0,0,40,0,1 +36,4,251091,5,10,1,11,1,0,0,0,0,40,0,1 +33,2,219034,2,7,0,5,0,0,1,0,0,40,0,0 +55,3,35723,3,14,1,1,1,0,0,0,0,60,0,1 +46,2,358886,1,9,1,8,1,0,0,0,0,40,0,0 +36,2,248708,6,12,0,10,0,0,0,0,0,40,0,0 +30,2,30063,1,9,2,4,4,0,1,0,0,32,0,0 +29,2,253799,14,8,0,1,0,0,0,0,0,42,7,0 +24,2,59146,1,9,4,5,4,0,1,0,0,48,0,0 +42,1,343609,5,10,4,4,4,1,1,0,0,50,0,0 +26,2,216010,1,9,4,1,3,0,1,0,0,40,0,0 +37,2,164526,0,13,1,3,1,0,0,0,0,40,0,0 +27,2,150958,11,3,0,7,4,0,0,0,0,48,24,0 +26,2,244495,1,9,1,10,1,0,0,0,0,48,0,0 +23,2,199336,9,11,0,10,4,0,0,0,0,50,0,0 +60,2,151369,3,14,1,1,1,0,0,0,0,60,0,1 +49,3,118701,1,9,2,0,4,1,1,0,0,40,0,0 +46,2,219611,5,10,1,0,1,0,0,0,0,40,0,0 +21,2,184568,1,9,0,8,0,0,0,0,0,40,0,0 +48,1,246891,10,15,1,10,1,0,0,0,0,60,0,0 +70,5,243436,4,5,2,5,0,0,0,0,0,45,0,0 +44,4,68318,3,14,0,3,3,0,1,0,0,55,0,0 +58,2,56331,0,13,1,5,1,0,0,0,0,40,0,0 +41,2,190591,6,12,2,1,0,1,1,0,0,40,2,0 +54,2,140359,7,4,2,8,4,0,1,0,3900,40,0,0 +42,5,23510,3,14,2,1,4,2,0,0,2201,60,3,1 +28,2,122540,12,6,2,2,0,0,0,0,0,40,0,0 +65,2,212562,2,7,1,2,1,0,0,0,0,20,0,0 +35,1,112497,1,9,1,10,5,0,0,0,0,35,38,0 +82,2,147729,11,3,6,4,4,0,0,0,0,20,0,0 +48,1,296066,5,10,1,6,1,0,0,0,0,50,0,1 +44,2,148138,8,16,1,1,1,2,0,15024,0,40,28,1 +68,2,50351,3,14,0,0,0,0,1,6360,0,20,0,0 +42,2,306496,1,9,1,4,1,0,0,0,0,40,0,0 +24,2,210029,1,9,0,0,0,0,1,0,2001,37,0,0 +54,2,163894,5,10,1,2,1,1,0,0,0,40,0,0 +22,2,113936,5,10,0,2,3,0,0,0,0,40,0,0 +43,1,316820,5,10,1,7,1,0,0,0,0,84,0,0 +17,2,53367,4,5,0,4,3,0,1,0,0,35,0,0 +46,1,95256,1,9,2,6,0,0,0,0,0,50,0,0 +59,2,127728,5,10,1,9,1,0,0,0,0,40,0,1 +37,2,66686,1,9,1,2,1,0,0,0,0,40,0,0 +57,5,199768,1,9,1,5,1,0,0,0,1902,30,0,1 +31,2,154297,1,9,0,5,4,1,1,0,0,24,0,0 +23,2,103064,1,9,0,0,3,0,1,0,0,40,0,0 +17,2,93235,14,8,0,4,3,0,1,0,1721,25,0,0 +63,2,440607,13,1,1,3,1,4,0,0,0,30,4,0 +44,2,212894,10,15,2,3,0,0,0,0,0,55,0,1 +30,2,167990,10,15,1,3,1,0,0,0,0,60,0,1 +23,2,378460,5,10,0,3,3,0,0,0,0,20,0,0 +44,2,151089,3,14,1,3,1,0,0,0,1887,60,0,1 +24,2,153583,5,10,0,5,3,0,1,0,0,40,0,0 +34,2,114639,5,10,0,2,5,0,0,0,0,20,0,0 +37,2,344480,5,10,1,10,1,0,0,0,0,65,0,0 +24,2,188300,2,7,0,8,4,0,1,0,0,40,0,0 +32,2,105938,1,9,2,8,3,1,1,0,0,40,0,0 +42,1,217826,1,9,1,10,1,1,0,0,0,25,2,0 +20,2,379525,5,10,0,4,3,0,1,0,0,10,0,0 +34,0,177331,5,10,1,3,1,1,0,4386,0,40,0,1 +37,2,127918,5,10,0,6,4,0,1,0,0,20,5,0 +47,3,27067,1,9,2,0,0,0,1,0,0,40,0,0 +25,2,250038,4,5,0,7,5,0,0,0,0,45,4,0 +36,1,36270,1,9,1,7,1,0,0,0,1977,65,0,1 +60,2,308608,1,9,1,5,1,0,0,0,0,50,0,0 +64,5,213574,1,9,1,10,1,0,0,2635,0,10,0,0 +32,4,235109,0,13,1,0,2,0,1,0,0,40,0,0 +33,0,374905,12,6,1,4,1,0,0,0,0,40,0,0 +71,2,118876,0,13,0,1,0,0,1,0,0,14,0,0 +55,4,223716,5,10,2,1,0,3,1,0,0,40,0,0 +85,1,166027,1,9,6,5,0,0,1,0,0,50,0,0 +39,2,198654,10,15,1,3,1,2,0,0,2415,67,3,1 +25,2,109080,5,10,0,10,3,0,0,0,0,55,0,0 +58,2,104333,5,10,1,10,1,0,0,0,0,40,0,1 +57,2,195876,1,9,1,10,1,0,0,0,0,40,0,0 +30,2,390879,9,11,2,3,4,0,1,0,0,36,0,0 +19,2,197748,2,7,2,5,4,0,1,0,0,20,0,0 +40,2,442045,5,10,1,3,1,0,0,0,0,40,0,1 +28,2,44216,1,9,0,11,4,3,1,0,0,40,0,0 +43,3,114537,0,13,1,3,1,0,0,0,0,40,0,0 +19,2,274830,1,9,0,4,3,0,1,0,0,15,0,0 +24,2,321763,1,9,0,1,0,0,0,0,0,38,0,0 +34,2,213226,0,13,0,5,0,0,0,0,0,65,0,1 +22,2,167787,1,9,0,4,0,0,1,0,0,40,0,0 +64,1,352712,9,11,1,7,1,0,0,0,0,55,0,0 +26,2,213412,2,7,1,10,1,0,0,0,0,40,0,0 +80,2,202483,1,9,3,0,0,0,1,0,0,16,0,0 +79,4,146244,8,16,6,3,4,0,1,0,0,40,0,0 +58,1,450544,0,13,1,1,1,0,0,0,0,40,0,1 +43,2,81243,0,13,2,9,0,0,0,0,1876,40,0,0 +43,2,195258,1,9,1,10,1,0,0,0,0,40,0,1 +46,2,57929,1,9,2,4,0,0,0,0,0,25,0,0 +35,2,953588,1,9,1,1,2,0,1,0,0,40,0,1 +51,2,99064,9,11,1,10,1,0,0,5013,0,40,0,0 +52,4,194788,3,14,2,1,0,0,1,4787,0,60,0,1 +43,5,155293,0,13,1,5,1,0,0,0,0,60,0,1 +68,2,204082,5,10,6,1,0,0,1,0,0,45,0,0 +34,0,216283,0,13,1,3,2,0,1,0,0,45,0,1 +37,2,355856,0,13,1,10,1,2,0,0,0,40,14,1 +22,2,297380,1,9,0,5,3,1,1,0,0,40,0,0 +32,2,425622,1,9,1,6,1,0,0,0,0,55,0,0 +65,1,145628,12,6,1,10,1,0,0,0,0,40,0,0 +28,2,115549,5,10,0,8,3,0,0,0,0,60,0,0 +40,5,142444,0,13,0,3,0,0,1,0,0,45,0,0 +40,2,134026,2,7,0,4,5,0,0,0,0,40,0,0 +52,2,177366,1,9,4,4,5,0,1,0,0,20,0,0 +35,2,38245,5,10,1,10,1,0,0,0,0,60,0,0 +62,1,215944,11,3,1,7,1,0,0,0,0,30,0,0 +49,2,115784,9,11,1,2,1,0,0,0,0,45,0,0 +49,2,170165,1,9,2,8,5,0,1,0,0,55,0,0 +47,2,355320,0,13,1,3,1,0,0,15024,0,40,0,1 +45,2,116163,1,9,4,1,0,0,1,0,0,40,0,0 +37,2,405644,15,2,3,7,5,0,0,0,0,77,4,0 +36,4,223433,9,11,1,11,1,0,0,0,0,53,0,1 +36,2,41624,12,6,1,10,1,0,0,0,0,70,4,0 +44,2,151089,0,13,1,3,1,0,0,0,1902,50,0,1 +51,0,285747,3,14,1,3,1,0,0,0,1977,60,0,1 +25,0,108542,5,10,1,11,1,0,0,0,0,40,0,0 +28,1,212318,1,9,0,10,0,0,0,0,0,55,0,0 +57,2,173090,1,9,6,5,4,0,1,0,0,32,0,0 +46,2,26781,1,9,1,10,1,3,0,0,0,40,0,0 +59,2,31782,12,6,1,6,1,0,0,0,0,45,0,1 +28,2,189241,2,7,1,2,3,0,0,0,0,40,0,0 +25,2,164229,1,9,2,4,0,0,0,2597,0,40,0,0 +35,2,240467,1,9,3,0,4,1,1,0,0,40,0,0 +27,2,263614,6,12,1,10,1,0,0,0,0,45,0,1 +29,2,74500,0,13,1,5,1,0,0,0,0,40,0,1 +43,3,263502,1,9,2,0,0,0,0,0,0,40,0,0 +38,3,47707,1,9,0,0,3,1,1,0,0,40,0,0 +26,2,231638,5,10,0,0,3,0,1,0,0,40,0,0 +36,2,111128,1,9,4,10,3,0,0,0,0,40,0,0 +37,2,152307,5,10,1,8,1,0,0,0,0,40,0,1 +41,2,184466,2,7,1,11,1,0,0,0,0,55,0,0 +44,2,216411,9,11,4,3,0,0,1,0,0,40,21,0 +48,1,324173,9,11,2,1,0,0,1,0,0,50,0,0 +35,4,300681,1,9,1,11,1,1,0,7298,0,35,0,1 +43,4,598995,0,13,2,3,4,1,1,0,0,42,0,0 +57,3,140711,0,13,1,3,1,0,0,0,0,40,0,1 +44,4,262241,1,9,1,0,5,0,1,0,0,40,0,0 +28,2,308136,1,9,0,4,3,0,0,0,0,40,0,0 +55,2,148590,12,6,6,10,4,1,1,0,0,40,0,0 +52,2,195635,1,9,1,8,1,0,0,0,2051,38,0,0 +30,2,228406,1,9,4,0,4,1,1,0,0,40,0,0 +31,2,136398,8,16,1,3,1,2,0,0,0,50,15,1 +50,5,175070,10,15,1,3,1,0,0,0,0,45,0,1 +43,1,34007,0,13,1,7,1,0,0,0,0,70,0,1 +33,2,121195,1,9,0,8,0,4,0,0,0,50,0,0 +23,3,216853,9,11,1,2,1,0,0,0,0,25,0,0 +35,2,81280,0,13,1,7,1,0,0,0,0,65,29,1 +18,2,212936,5,10,0,4,3,0,0,0,0,15,0,0 +33,4,220430,0,13,1,11,1,1,0,0,0,70,0,1 +30,3,73514,0,13,0,1,5,2,1,0,0,45,0,0 +21,2,307371,5,10,0,11,3,0,0,0,0,15,0,0 +36,4,380614,0,13,1,0,2,0,1,0,0,35,9,1 +38,2,119992,5,10,1,3,1,0,0,0,0,40,0,0 +33,2,192002,3,14,1,1,1,0,0,7298,0,60,8,1 +24,2,327518,9,11,1,10,1,0,0,0,0,45,0,0 +24,2,220323,5,10,1,3,1,1,0,0,0,40,0,0 +39,2,421633,5,10,2,11,4,1,1,0,0,30,0,0 +43,2,154210,1,9,1,4,1,2,0,2829,0,60,26,0 +43,1,35034,0,13,1,3,1,0,0,0,0,21,0,0 +30,0,270218,0,13,0,0,3,1,1,0,0,40,0,0 +25,2,254933,2,7,1,6,1,0,0,0,0,40,0,0 +45,2,61751,1,9,1,4,2,0,1,0,0,35,0,0 +22,2,137876,5,10,0,11,0,0,0,0,0,20,0,0 +73,2,336007,0,13,1,3,1,0,0,0,2246,40,0,1 +26,2,222539,5,10,1,10,1,0,0,0,0,40,0,1 +24,2,233856,1,9,0,8,5,1,0,0,0,45,0,0 +18,2,198616,14,8,0,10,3,0,0,594,0,20,0,0 +35,2,202027,0,13,1,2,1,0,0,7298,0,35,0,1 +22,2,203182,5,10,4,5,4,0,1,0,0,43,0,0 +28,2,221317,5,10,1,2,1,0,0,0,0,40,4,0 +38,2,186934,5,10,1,10,1,0,0,0,0,45,0,0 +40,4,179580,1,9,1,0,2,0,1,0,0,40,0,0 +32,2,26803,5,10,1,8,1,0,0,0,0,84,0,1 +42,2,344624,1,9,1,6,1,0,0,0,1902,50,0,1 +31,0,59969,1,9,1,0,5,0,1,0,0,35,0,0 +33,2,162930,0,13,1,3,1,0,0,0,0,50,25,0 +54,1,192654,0,13,2,6,0,0,0,0,0,65,0,0 +63,2,117681,1,9,2,7,0,0,0,0,0,25,0,0 +67,1,179285,0,13,1,5,1,0,0,0,0,30,0,0 +47,2,217161,1,9,2,4,0,1,1,0,0,14,0,0 +67,5,116517,0,13,6,4,4,0,1,0,0,35,0,0 +33,2,170336,1,9,1,0,2,4,1,0,0,19,0,0 +33,4,256529,1,9,4,4,3,0,1,0,0,80,0,0 +25,4,227886,0,13,1,0,1,0,0,0,0,40,0,0 +25,2,141706,5,10,0,0,0,0,1,0,0,40,0,0 +35,2,361888,5,10,2,8,4,0,0,0,0,40,0,0 +54,2,185407,1,9,1,10,1,0,0,7688,0,40,0,1 +35,1,176101,1,9,1,7,1,0,0,0,0,80,0,1 +18,2,216730,2,7,0,4,3,0,0,0,0,12,0,0 +30,2,609789,2,7,1,7,1,0,0,0,0,60,4,0 +29,2,136017,12,6,0,10,0,0,0,0,0,48,0,0 +41,2,58880,0,13,1,3,2,0,1,7688,0,10,0,1 +40,2,285787,6,12,1,9,1,0,0,0,0,40,0,1 +46,2,173243,5,10,1,9,1,0,0,5178,0,40,0,1 +39,2,160916,6,12,1,9,2,0,1,0,0,45,0,0 +42,2,227397,0,13,1,0,2,0,1,0,0,40,0,1 +49,1,111066,0,13,1,10,1,0,0,0,0,50,0,1 +23,2,189924,5,10,0,4,3,0,1,0,0,40,0,0 +34,2,31740,7,4,1,6,1,0,0,0,0,40,0,0 +42,1,120837,1,9,1,10,1,0,0,0,2042,48,0,0 +31,2,172304,5,10,1,10,1,0,0,0,0,50,0,1 +31,2,86492,9,11,1,6,1,0,0,0,0,30,0,1 +90,2,206667,3,14,1,3,2,0,1,0,0,40,0,1 +27,1,153546,0,13,0,3,3,0,1,0,0,40,0,0 +30,1,115932,1,9,0,10,0,0,0,99999,0,50,0,1 +27,4,151626,1,9,0,3,3,1,1,0,0,40,0,0 +27,1,37302,2,7,1,1,1,0,0,0,0,50,0,0 +28,2,109001,1,9,0,10,0,0,0,0,0,40,0,0 +40,2,195488,1,9,0,0,3,0,1,0,0,45,0,0 +43,4,216116,3,14,4,3,4,1,1,0,0,37,0,0 +26,2,118497,1,9,1,6,1,0,0,0,0,50,0,0 +48,1,101233,9,11,1,4,2,0,1,0,0,15,0,0 +41,2,349703,6,12,1,7,1,2,0,0,0,40,0,0 +32,2,226883,1,9,1,10,1,0,0,0,0,40,9,0 +23,2,214635,1,9,0,10,0,0,0,0,0,40,0,0 +35,2,169672,2,7,1,5,1,0,0,0,0,65,0,0 +42,2,71458,5,10,1,1,1,0,0,0,0,50,0,0 +27,0,142621,0,13,0,3,0,0,1,4101,0,40,0,0 +34,2,125279,1,9,1,6,1,0,0,0,0,40,0,0 +25,2,197303,0,13,0,3,3,0,1,0,0,40,0,0 +46,4,148995,0,13,0,3,3,0,0,4787,0,45,0,1 +34,2,69251,5,10,1,4,1,2,0,0,0,40,11,0 +39,2,160123,1,9,6,0,0,0,1,0,0,40,0,0 +25,2,323229,0,13,0,0,0,0,0,0,0,40,0,0 +45,2,138626,9,11,2,1,0,0,0,2174,0,50,0,0 +46,2,102359,0,13,2,3,0,0,0,0,0,40,0,0 +23,2,151888,1,9,2,10,0,0,0,4650,0,50,38,0 +37,2,404661,5,10,0,1,0,1,0,0,0,40,0,0 +38,1,185325,1,9,1,2,1,0,0,0,0,40,0,1 +35,1,230268,5,10,1,4,1,0,0,0,0,40,0,0 +49,5,38819,0,13,1,5,1,0,0,0,0,50,0,1 +37,2,380614,6,12,1,3,2,0,1,0,0,13,0,1 +45,2,319637,1,9,2,4,4,0,1,0,0,40,0,0 +71,2,149040,14,8,0,4,0,0,1,0,0,40,0,0 +44,2,320984,0,13,1,5,1,0,0,0,0,60,0,1 +38,2,81965,9,11,0,9,0,0,1,0,0,40,0,0 +42,4,182302,1,9,1,10,1,0,0,0,0,40,0,0 +29,2,53434,9,11,1,1,1,0,0,0,0,60,0,1 +48,2,216214,2,7,1,8,1,0,0,0,0,40,0,0 +56,5,24127,9,11,1,5,1,0,0,0,0,54,0,1 +32,3,115066,1,9,1,9,1,0,0,0,0,40,0,0 +19,2,120277,1,9,0,4,0,0,1,0,0,30,0,0 +57,1,134286,5,10,4,5,0,0,0,0,0,35,0,0 +55,2,26716,12,6,0,6,0,0,0,0,0,60,0,0 +66,2,117746,0,13,1,5,1,0,0,0,0,50,0,1 +26,2,206199,1,9,0,0,3,1,0,0,0,40,0,0 +58,5,89922,9,11,1,1,1,0,0,15024,0,40,0,1 +62,2,69867,0,13,1,3,1,0,0,0,0,55,0,1 +31,2,109020,0,13,0,3,4,4,0,0,0,40,0,0 +25,2,130302,1,9,1,8,1,0,0,0,0,40,0,0 +38,2,156728,0,13,1,0,1,0,0,0,0,56,0,0 +33,2,424719,0,13,2,1,0,0,1,0,0,40,0,0 +51,3,217647,5,10,2,3,0,1,1,0,0,40,0,0 +20,2,33087,9,11,0,7,3,0,0,0,0,40,0,0 +40,3,241895,1,9,1,0,1,0,0,0,0,40,0,0 +20,2,38455,12,6,0,4,0,0,0,0,0,40,0,0 +41,4,81054,5,10,2,1,4,0,1,0,0,25,0,0 +44,2,163215,14,8,2,8,4,0,1,0,0,40,0,0 +35,2,156728,1,9,1,7,1,0,0,0,0,40,0,0 +35,1,127930,1,9,3,7,0,0,0,0,0,60,0,0 +46,3,227310,5,10,0,0,4,1,1,0,0,40,0,0 +24,2,96844,5,10,0,0,0,0,1,0,0,17,0,0 +18,2,245199,5,10,0,4,3,0,0,0,0,40,0,0 +37,2,46385,1,9,1,8,1,0,0,0,0,40,0,0 +58,2,186385,8,16,0,3,0,0,0,0,0,8,0,0 +55,2,252714,9,11,1,0,1,0,0,0,0,40,0,0 +68,2,154897,1,9,0,5,0,0,1,0,0,30,0,0 +41,2,320744,0,13,1,3,1,0,0,0,0,40,0,1 +50,2,138852,3,14,1,1,1,0,0,15024,0,50,0,1 +48,2,102092,1,9,1,10,1,0,0,0,0,40,0,0 +45,2,278151,1,9,1,11,1,0,0,0,0,40,0,0 +43,2,338290,5,10,1,3,1,0,0,0,0,40,0,0 +37,2,34378,5,10,1,10,1,0,0,0,0,35,0,0 +43,2,91959,0,13,1,1,1,0,0,0,0,45,0,1 +36,2,265881,1,9,2,8,4,0,1,0,0,40,0,0 +60,2,276009,1,9,1,4,1,2,0,0,0,30,11,0 +27,2,193898,1,9,2,10,0,0,0,0,0,50,0,0 +36,2,139364,0,13,1,5,1,0,0,0,0,50,0,1 +47,0,306473,6,12,1,6,1,0,0,0,0,40,0,0 +33,2,37232,5,10,0,10,0,0,0,0,0,80,0,0 +19,0,56424,14,8,0,6,3,1,0,0,0,20,0,0 +33,2,165235,0,13,0,4,0,2,1,0,0,35,15,0 +34,2,153326,0,13,1,3,1,0,0,0,0,40,0,1 +33,2,106976,1,9,2,4,4,0,1,0,0,40,0,0 +57,2,109015,5,10,2,5,0,0,1,0,0,48,0,0 +59,2,154100,3,14,0,5,0,0,1,27828,0,45,0,1 +36,2,183739,1,9,1,10,3,0,1,0,2002,40,0,0 +60,2,367695,6,12,1,0,1,0,0,0,0,40,0,1 +33,4,156015,9,11,1,9,1,0,0,0,0,40,0,0 +41,2,185132,0,13,0,3,0,0,1,0,0,45,0,0 +20,1,188274,5,10,0,3,3,0,0,0,0,10,0,0 +28,4,50512,0,13,0,3,0,0,1,2202,0,50,0,0 +24,0,147719,3,14,0,3,0,2,0,0,0,20,3,0 +31,2,414525,14,8,0,7,0,1,0,0,0,60,0,0 +38,2,289148,1,9,3,10,4,0,1,0,0,40,0,0 +40,2,176069,0,13,2,3,0,0,1,0,0,45,0,0 +55,0,199713,0,13,1,3,1,0,0,0,0,15,0,0 +49,2,297884,1,9,1,8,1,0,0,4064,0,50,0,0 +33,2,204829,1,9,2,6,0,0,0,0,0,45,0,0 +24,4,32950,0,13,0,3,0,0,0,0,0,35,0,0 +46,2,233511,0,13,2,10,0,0,0,0,0,48,0,0 +20,2,210781,5,10,0,0,3,0,1,0,0,20,0,0 +50,2,190762,11,3,1,2,1,0,0,0,0,40,4,0 +22,2,83315,1,9,0,0,4,0,0,0,0,40,0,0 +32,5,343872,5,10,1,6,1,1,0,0,0,35,19,0 +46,2,185385,1,9,1,5,1,0,0,0,0,65,0,1 +39,2,80324,5,10,1,1,1,0,0,0,1977,62,0,1 +26,2,357933,5,10,0,0,3,0,1,0,0,15,0,0 +20,2,211293,5,10,0,5,3,1,1,0,0,14,0,0 +37,5,199265,5,10,1,1,1,0,0,0,0,50,0,0 +40,2,202872,5,10,2,0,4,0,1,0,0,24,0,0 +22,2,195075,5,10,0,4,3,0,1,0,0,38,0,0 +32,2,317378,0,13,0,1,3,0,1,10520,0,40,0,1 +41,2,187802,5,10,2,9,0,0,0,0,0,50,0,0 +24,2,97212,6,12,1,0,2,0,1,0,0,40,0,0 +40,2,47902,1,9,1,1,1,0,0,0,0,40,0,0 +37,0,76767,10,15,1,3,2,0,1,0,0,39,0,1 +42,2,172297,3,14,1,0,1,0,0,0,1902,40,0,1 +56,2,274475,4,5,6,5,4,0,1,0,0,40,0,0 +20,2,105244,5,10,0,2,0,0,0,0,0,50,0,0 +55,4,165695,1,9,2,0,4,0,0,0,0,40,0,0 +29,2,253801,1,9,0,10,5,0,0,0,0,40,0,0 +37,2,305597,1,9,2,10,0,0,0,0,0,40,0,0 +61,1,352448,0,13,1,6,1,0,0,0,0,60,0,0 +26,2,242768,0,13,0,3,0,0,0,0,0,38,0,0 +49,5,201080,5,10,2,10,0,0,0,0,0,55,0,0 +18,4,159032,7,4,0,7,3,0,0,0,0,40,0,0 +30,2,149568,4,5,0,7,5,1,0,0,0,40,0,0 +24,0,155775,1,9,1,9,1,0,0,0,0,40,0,0 +37,2,120074,1,9,0,6,0,0,0,0,0,40,0,0 +37,4,257588,1,9,2,0,4,0,1,0,0,40,0,0 +36,2,177907,5,10,1,8,1,0,0,0,0,65,0,0 +40,2,309311,1,9,1,7,1,0,0,0,0,40,0,0 +44,1,138975,1,9,1,10,1,0,0,0,0,55,0,0 +43,1,187778,1,9,1,10,1,0,0,0,0,20,0,0 +19,2,35865,5,10,0,2,0,0,1,0,0,35,0,0 +50,2,234373,3,14,1,1,2,0,1,0,1485,40,0,0 +39,2,144688,1,9,1,0,2,1,1,0,0,50,0,0 +43,2,248094,1,9,2,10,4,0,0,0,0,40,0,0 +43,2,248094,1,9,1,8,1,0,0,0,0,40,0,0 +40,2,213821,3,14,0,3,0,0,0,0,0,40,0,1 +31,0,55849,5,10,0,10,0,0,0,0,0,40,0,0 +25,2,121712,0,13,2,10,0,0,0,0,0,40,0,0 +30,3,164552,0,13,0,3,0,0,0,0,1876,40,0,0 +55,2,223127,4,5,1,7,1,0,0,0,0,40,0,0 +55,2,190514,7,4,1,0,1,0,0,0,0,75,0,0 +29,2,203797,5,10,1,1,1,1,0,0,0,40,0,0 +28,2,378460,0,13,0,0,0,0,0,10520,0,60,0,1 +30,2,105908,1,9,1,10,1,0,0,0,0,40,0,0 +33,2,232356,1,9,1,5,1,0,0,0,1672,55,0,0 +23,2,210526,1,9,0,0,3,0,0,0,0,40,0,0 +71,2,193530,2,7,0,13,0,0,1,0,0,75,0,0 +21,2,43535,5,10,0,5,0,0,1,0,0,40,0,0 +49,2,183013,1,9,1,7,1,0,0,0,0,40,0,0 +31,2,113364,6,12,1,8,1,0,0,0,0,20,0,0 +27,2,197380,6,12,0,3,0,0,0,0,0,40,0,0 +27,2,298635,3,14,1,3,1,2,0,0,0,40,37,1 +26,2,213385,5,10,0,4,0,0,0,0,0,20,0,0 +17,2,31007,12,6,0,4,3,0,1,0,0,30,0,0 +26,2,35917,5,10,0,6,0,0,0,0,0,50,0,0 +45,2,99385,1,9,2,0,0,0,1,0,0,40,8,0 +50,2,48358,1,9,1,10,1,0,0,7688,0,40,0,1 +31,2,241885,1,9,0,7,4,0,0,0,0,45,0,0 +51,2,24344,6,12,0,0,0,0,1,0,0,40,0,0 +56,2,149686,4,5,6,8,4,0,1,0,0,40,0,0 +24,0,154432,0,13,0,8,0,0,0,0,0,35,0,0 +29,2,331875,14,8,0,2,0,0,0,0,0,40,21,0 +26,2,259585,5,10,0,5,0,0,0,0,0,24,0,0 +51,2,104748,5,10,1,1,1,0,0,0,0,45,0,0 +32,4,144949,1,9,1,11,1,0,0,0,0,40,0,0 +47,0,199512,0,13,1,1,1,0,0,0,0,40,0,1 +30,2,302438,1,9,0,8,0,0,0,0,0,40,0,0 +49,3,115784,5,10,1,10,1,0,0,0,0,40,0,0 +40,2,96509,5,10,1,3,1,3,0,0,0,40,0,1 +62,2,226733,1,9,1,0,1,0,0,0,0,40,0,1 +43,5,244945,0,13,1,3,1,0,0,0,0,60,0,0 +76,2,243768,11,3,0,2,0,0,0,0,0,20,0,0 +35,2,186934,0,13,1,5,1,0,0,0,0,50,0,1 +27,2,89813,1,9,0,2,3,0,1,0,0,40,0,0 +54,5,129432,0,13,1,1,1,0,0,15024,0,40,0,1 +55,1,184702,1,9,1,5,1,0,0,0,0,40,0,0 +21,2,275291,5,10,0,5,3,0,0,0,0,12,0,0 +20,2,258298,5,10,0,2,3,0,0,0,0,20,0,0 +39,2,139743,1,9,4,0,0,0,1,0,0,20,0,0 +26,2,102476,0,13,0,3,3,0,0,10520,0,64,0,1 +20,2,103840,1,9,0,8,3,0,1,0,0,42,0,0 +28,2,274579,1,9,1,6,1,0,0,0,0,60,0,0 +56,3,156842,5,10,4,4,0,1,0,0,0,40,0,0 +39,2,101020,14,8,1,8,1,0,0,0,0,40,0,0 +44,3,68729,0,13,1,1,1,2,0,0,0,40,0,1 +55,2,141326,1,9,1,10,1,0,0,0,0,40,0,1 +54,1,168723,1,9,1,5,1,0,0,0,0,40,0,0 +30,2,347166,0,13,0,3,0,0,0,13550,0,45,0,1 +34,4,213722,1,9,1,11,1,0,0,0,0,57,0,1 +42,2,196797,1,9,0,6,4,1,1,0,0,38,0,0 +50,5,207246,5,10,4,1,4,0,1,0,0,75,0,0 +34,3,199934,5,10,1,0,1,1,0,0,0,40,0,1 +23,2,272185,9,11,0,10,3,0,0,0,0,33,0,0 +47,2,266281,2,7,0,8,4,1,1,6849,0,40,0,0 +57,2,96779,11,3,1,10,1,0,0,0,0,40,0,0 +33,2,188352,3,14,0,3,0,1,0,0,0,50,0,0 +37,2,359131,1,9,2,10,4,0,1,0,0,48,0,0 +53,2,198824,0,13,0,1,4,0,1,0,0,40,0,0 +27,0,68393,0,13,0,0,0,0,1,0,0,40,0,0 +47,2,115613,1,9,1,10,1,0,0,0,0,50,0,1 +42,2,45363,6,12,1,3,1,0,0,0,0,50,0,0 +39,2,121590,5,10,0,3,0,1,0,4787,0,40,0,1 +58,4,292379,0,13,1,1,1,0,0,0,0,40,0,0 +20,2,482732,1,9,0,0,5,0,0,0,0,24,0,0 +19,2,198663,1,9,0,8,5,0,0,0,0,40,0,0 +39,2,230329,1,9,1,10,1,0,0,0,0,35,0,0 +51,2,29887,1,9,2,1,0,0,0,0,0,44,0,0 +52,2,194259,1,9,2,5,0,0,1,0,0,40,9,0 +53,2,126368,5,10,0,0,0,0,1,0,0,50,0,1 +50,2,108446,5,10,1,5,1,0,0,0,0,40,0,0 +36,2,220696,1,9,2,8,0,0,0,0,0,40,0,0 +30,2,32008,0,13,0,9,0,0,1,0,0,72,0,0 +50,2,185846,1,9,1,5,1,0,0,0,0,55,0,1 +76,2,127016,7,4,6,13,0,0,1,0,0,40,0,0 +46,1,102308,0,13,1,5,1,0,0,0,2415,40,0,1 +24,2,157894,5,10,0,2,3,1,0,0,0,40,0,0 +26,2,345405,1,9,1,5,1,0,0,2885,0,40,0,0 +56,1,94156,10,15,1,3,1,0,0,0,1977,50,0,1 +50,2,145409,0,13,1,3,1,0,0,15024,0,40,0,1 +22,2,190968,5,10,1,10,1,0,0,2407,0,40,0,0 +23,4,212803,0,13,0,3,0,0,1,0,0,35,0,0 +51,2,168660,1,9,1,1,1,0,0,0,0,50,0,0 +58,2,234481,12,6,1,6,1,0,0,0,0,40,0,0 +38,2,131461,4,5,1,4,2,1,1,0,0,24,19,0 +45,2,408773,5,10,1,8,1,0,0,0,0,40,0,1 +55,1,126117,1,9,6,5,0,0,0,0,0,40,0,0 +45,2,155489,5,10,1,5,1,0,0,0,0,60,0,1 +42,2,296749,5,10,2,8,0,0,0,0,0,45,0,0 +44,0,185832,0,13,1,0,1,0,0,0,0,46,0,1 +60,2,43235,0,13,1,3,1,0,0,0,0,50,0,1 +27,2,213152,5,10,0,5,0,0,0,0,0,40,0,0 +25,4,334267,5,10,1,1,1,0,0,0,0,40,0,1 +43,2,64631,1,9,1,1,1,0,0,15024,0,50,0,1 +44,4,193882,9,11,0,9,0,0,0,0,1340,40,0,0 +63,2,71800,7,4,6,4,0,0,1,0,0,41,0,0 +46,4,170092,3,14,0,3,0,0,1,0,0,43,0,0 +47,2,198223,5,10,1,1,1,0,0,0,0,40,0,0 +37,2,359796,5,10,2,5,0,1,0,0,0,40,0,0 +43,2,110556,1,9,4,1,4,1,1,0,0,40,0,0 +46,2,196858,3,14,1,3,1,0,0,0,0,35,0,1 +61,1,224784,6,12,3,1,0,0,1,0,0,90,0,0 +53,3,271544,1,9,1,0,1,1,0,0,1977,40,0,1 +44,2,221172,1,9,0,10,0,0,0,0,0,30,0,0 +54,2,256916,1,9,1,1,1,0,0,0,0,45,0,0 +22,2,157332,5,10,0,3,3,0,1,0,0,40,0,0 +47,3,192894,1,9,1,6,1,1,0,0,0,50,0,1 +18,2,240183,1,9,0,4,3,0,1,0,0,20,0,0 +25,2,204338,12,6,1,10,1,0,0,0,0,40,4,0 +24,2,122166,5,10,0,0,3,0,1,0,0,40,10,0 +37,4,397877,0,13,1,0,1,0,0,0,0,40,0,1 +51,2,115066,5,10,2,0,4,0,1,0,2547,40,0,1 +35,1,170174,1,9,1,10,1,0,0,7298,0,60,0,1 +59,2,171015,5,10,0,0,3,0,1,0,0,34,0,0 +46,2,91262,5,10,3,10,0,2,0,0,0,40,11,0 +45,4,127678,9,11,1,11,1,0,0,0,0,60,0,1 +19,2,263338,1,9,0,4,3,0,0,0,0,15,0,0 +22,2,129508,1,9,0,0,3,0,1,0,0,28,0,0 +41,2,192107,0,13,1,10,1,0,0,0,0,40,0,0 +33,1,93930,1,9,1,1,1,0,0,0,0,40,0,0 +26,3,207537,1,9,0,0,0,1,1,0,0,40,0,0 +22,2,138542,5,10,1,2,1,0,0,0,0,35,0,0 +29,1,116207,1,9,1,3,1,0,0,0,0,65,0,1 +22,2,198244,1,9,0,0,0,0,1,0,0,39,0,0 +34,2,90614,6,12,1,9,1,0,0,0,2042,10,0,0 +23,2,211160,14,8,1,2,3,0,0,0,0,40,0,0 +20,2,194630,1,9,1,0,1,0,0,3781,0,50,0,0 +25,2,161478,0,13,0,3,0,2,1,0,0,40,0,0 +59,2,144071,1,9,1,0,1,0,0,0,0,40,0,1 +44,2,167005,5,10,1,10,1,0,0,4386,0,55,0,0 +55,2,342121,5,10,1,9,1,0,0,0,0,40,0,0 +77,1,71676,5,10,6,0,0,0,1,0,1944,1,0,0 +42,2,124692,3,14,1,1,1,0,0,0,0,40,0,1 +47,2,147236,1,9,1,10,1,0,0,0,0,40,0,1 +42,2,145175,5,10,1,8,1,0,0,0,0,40,0,0 +45,2,259323,5,10,1,10,1,0,0,0,0,40,0,0 +23,2,154978,1,9,1,4,1,0,0,0,0,40,24,0 +23,2,127768,5,10,0,10,0,0,0,0,0,40,0,0 +52,2,98588,1,9,1,10,1,0,0,0,0,40,0,0 +49,2,192894,1,9,1,10,1,0,0,0,0,40,0,1 +20,2,194848,5,10,0,10,3,0,0,0,0,40,0,0 +20,2,34446,1,9,0,4,0,0,1,0,0,20,0,0 +23,4,177265,1,9,0,4,3,0,1,0,0,45,0,0 +30,2,142977,5,10,2,10,0,0,0,0,0,65,0,0 +45,2,241350,1,9,1,2,1,0,0,0,0,48,0,1 +30,2,154882,10,15,6,4,0,0,0,0,0,35,0,0 +17,2,60562,4,5,0,4,3,0,1,0,0,20,0,0 +22,2,142566,1,9,0,5,0,0,0,0,0,40,0,0 +25,2,176162,0,13,0,2,3,0,0,0,0,40,0,0 +52,2,186303,5,10,1,1,1,0,0,15024,0,55,8,1 +40,2,237671,5,10,1,9,2,0,1,0,0,40,0,1 +58,2,68624,1,9,1,1,1,0,0,0,0,45,0,0 +30,2,229504,1,9,1,10,1,0,0,0,0,50,0,0 +59,2,340591,12,6,1,2,1,0,0,3942,0,40,0,0 +29,2,262208,5,10,0,4,0,1,1,0,0,30,2,0 +26,2,236008,9,11,2,3,4,0,1,0,0,40,0,0 +39,4,214284,0,13,6,3,4,2,1,0,0,10,28,0 +33,2,169496,0,13,1,1,1,0,0,0,0,50,0,1 +22,2,195179,5,10,0,5,3,0,0,0,0,24,0,0 +25,2,469697,5,10,1,10,3,0,0,0,0,40,0,0 +44,2,214415,5,10,4,3,4,1,1,0,0,40,0,0 +35,2,452283,1,9,2,5,3,0,1,0,0,40,0,0 +40,2,244172,1,9,1,2,1,0,0,0,0,40,0,0 +19,2,231972,2,7,0,0,3,0,1,0,0,20,0,0 +37,2,412296,1,9,1,10,1,0,0,0,0,35,4,1 +32,2,30497,9,11,1,9,1,0,0,0,0,40,0,0 +52,1,189216,1,9,2,6,0,0,0,0,0,65,0,0 +36,2,268292,1,9,1,10,1,0,0,0,0,41,0,0 +38,2,69306,5,10,2,10,4,0,1,0,0,40,0,0 +57,0,111224,0,13,2,8,0,1,0,0,0,39,0,0 +22,0,309348,5,10,0,0,0,0,1,0,0,15,0,0 +20,2,210781,5,10,0,0,3,0,1,0,0,35,0,0 +40,2,286750,2,7,4,8,0,1,0,0,0,36,0,0 +36,1,321274,0,13,1,7,1,0,0,0,0,50,0,0 +27,2,192936,1,9,2,0,4,0,1,0,0,40,0,0 +52,2,72743,1,9,3,0,0,0,1,0,0,50,0,0 +43,2,187861,1,9,4,6,4,0,1,0,0,44,0,0 +35,2,179579,1,9,1,6,1,0,0,0,0,40,0,0 +29,2,663394,1,9,1,7,1,1,0,0,0,40,0,0 +27,2,302422,5,10,0,8,3,0,0,0,0,40,0,0 +49,4,37353,3,14,1,1,1,0,0,0,0,40,0,1 +26,1,109609,5,10,4,10,0,0,0,0,0,30,0,0 +47,2,184402,1,9,2,4,0,0,0,0,0,32,0,0 +20,2,224640,5,10,0,0,3,0,1,0,0,40,0,0 +19,2,405526,1,9,0,2,3,0,0,0,0,40,0,0 +34,2,36385,3,14,0,3,0,0,0,0,2258,50,0,0 +20,2,147884,1,9,0,0,3,0,1,0,0,40,0,0 +23,2,164231,2,7,4,3,3,0,0,0,0,35,0,0 +25,2,383306,0,13,0,5,0,0,0,0,0,40,0,0 +21,2,417668,1,9,0,2,3,0,0,0,0,36,0,0 +25,2,161007,1,9,0,8,3,0,0,0,0,40,0,0 +63,0,99823,5,10,1,11,1,0,0,0,0,32,0,0 +25,2,37379,0,13,0,9,0,0,1,0,0,50,0,0 +28,2,148645,1,9,0,8,3,0,1,0,0,40,0,0 +39,2,180477,3,14,0,3,0,0,0,0,0,60,0,1 +28,2,123147,5,10,0,9,0,0,1,4865,0,40,0,0 +30,2,111415,0,13,1,1,1,0,0,0,0,45,0,1 +41,4,107327,9,11,2,3,4,0,1,0,0,40,0,0 +52,4,146565,6,12,2,4,0,0,1,4865,0,30,0,0 +36,2,267556,1,9,1,10,1,0,0,4064,0,40,0,0 +47,2,284871,0,13,1,1,1,0,0,0,1887,40,0,1 +27,2,194690,4,5,0,4,3,0,0,0,0,50,4,0 +32,3,145983,5,10,1,9,2,0,1,0,0,40,0,0 +52,2,163998,1,9,1,5,1,0,0,99999,0,45,0,1 +50,2,128478,1,9,1,6,1,0,0,0,0,70,0,0 +21,2,250647,5,10,0,0,5,0,0,0,0,30,35,0 +60,2,226949,1,9,2,0,4,0,1,0,0,37,0,0 +47,2,157901,2,7,1,4,1,3,0,0,0,36,0,0 +54,1,33863,1,9,1,7,1,0,0,0,0,60,0,1 +32,4,40444,3,14,0,3,0,0,0,0,0,50,0,0 +61,2,54373,5,10,1,5,1,0,0,0,0,40,0,0 +21,2,52753,1,9,0,10,0,0,0,0,1504,40,0,0 +29,1,104423,5,10,1,1,5,0,0,4386,0,45,0,1 +36,4,305714,1,9,0,4,4,1,1,0,0,70,0,0 +38,4,167440,1,9,1,6,1,0,0,0,0,20,0,0 +59,2,291529,12,6,6,8,0,0,0,0,0,52,0,0 +43,2,243380,5,10,1,0,1,0,0,0,0,40,0,0 +19,2,38619,2,7,0,8,0,0,0,0,0,10,0,0 +42,2,230684,0,13,1,3,1,0,0,5013,0,40,0,0 +33,2,132601,5,10,1,1,1,0,0,0,0,45,0,0 +47,2,193285,1,9,1,4,2,1,1,5013,0,40,0,0 +51,2,279156,1,9,1,1,1,0,0,7298,0,40,0,1 +28,2,339372,5,10,0,5,0,0,0,0,0,40,0,0 +61,2,101265,5,10,2,0,4,0,1,0,0,43,0,0 +23,2,117789,0,13,0,3,0,0,1,0,0,60,0,0 +31,2,312667,4,5,1,10,1,0,0,0,0,40,0,0 +38,1,255503,2,7,2,1,0,0,0,0,0,55,0,0 +21,2,221955,4,5,0,2,5,0,0,0,0,40,4,0 +22,2,139190,1,9,0,10,3,0,0,0,0,50,0,0 +35,2,185556,3,14,1,3,1,0,0,0,1887,40,0,1 +53,3,84278,0,13,1,1,1,0,0,0,0,48,0,1 +40,2,114580,1,9,1,1,2,0,1,0,0,24,0,1 +36,2,185405,1,9,1,0,1,0,0,0,0,50,0,1 +33,1,199539,1,9,1,6,1,0,0,0,0,65,0,0 +23,2,346480,1,9,0,0,0,0,1,0,0,50,0,0 +51,4,349431,1,9,1,10,1,0,0,4386,0,40,0,1 +31,2,219619,1,9,0,5,5,0,0,0,0,48,0,0 +28,4,127491,1,9,4,0,0,0,1,5721,0,40,0,0 +26,1,253899,0,13,2,5,0,0,0,0,0,40,0,0 +32,2,155232,0,13,2,11,0,1,0,0,0,60,0,1 +43,2,182437,0,13,0,3,0,0,0,0,0,45,0,1 +19,2,530454,1,9,0,4,0,0,1,0,0,50,0,0 +46,2,101430,2,7,2,2,4,1,1,0,0,40,0,0 +49,4,358668,8,16,1,3,1,0,0,0,0,45,0,1 +31,2,90668,12,6,0,4,0,0,1,0,0,40,0,0 +45,2,126141,0,13,1,1,1,0,0,0,0,40,0,1 +41,2,238355,11,3,1,7,1,0,0,0,0,40,4,0 +22,2,194031,5,10,0,4,3,0,1,0,0,15,0,0 +25,2,117833,0,13,0,3,0,0,1,0,1876,40,0,0 +46,2,249686,10,15,4,3,0,0,0,0,0,50,0,1 +44,1,219591,5,10,1,10,1,0,0,0,0,40,0,0 +25,2,221757,1,9,1,8,1,0,0,0,0,40,0,0 +30,2,80625,0,13,0,1,0,0,0,0,0,40,0,0 +54,2,185407,0,13,1,1,1,0,0,0,0,60,0,1 +34,2,163110,0,13,1,10,1,0,0,0,0,45,0,1 +30,2,159187,0,13,1,3,1,0,0,0,1902,55,0,1 +21,2,100462,9,11,0,1,3,0,1,2174,0,60,0,0 +27,2,192936,0,13,0,3,0,0,1,0,0,40,0,0 +29,2,145011,5,10,0,10,3,0,0,0,0,40,0,0 +60,5,181196,5,10,1,1,1,0,0,0,0,40,0,1 +36,1,37778,3,14,1,7,1,0,0,0,0,70,0,0 +27,2,60288,3,14,0,5,3,0,1,0,0,40,0,0 +57,1,84231,5,10,1,4,1,0,0,0,0,48,0,0 +24,2,52028,15,2,1,4,3,2,1,0,0,5,36,0 +63,2,318763,5,10,2,10,4,0,0,0,0,22,0,0 +29,2,168138,0,13,1,11,1,0,0,0,0,40,0,1 +34,2,113530,0,13,1,1,1,0,0,0,0,40,0,0 +27,2,321896,1,9,0,4,0,0,0,0,0,40,0,0 +31,2,145791,9,11,2,9,4,0,1,0,0,40,0,0 +31,2,131425,0,13,1,10,1,0,0,0,0,40,0,0 +55,2,145214,5,10,2,0,4,0,1,4650,0,20,0,0 +64,4,142166,1,9,1,10,1,0,0,0,0,99,0,0 +20,2,494784,1,9,0,5,5,1,1,0,0,35,0,0 +44,1,172479,1,9,1,7,1,0,0,15024,0,60,0,1 +35,2,184655,2,7,2,6,0,0,0,0,0,50,0,0 +41,4,26669,5,10,2,1,0,0,1,0,0,40,0,0 +38,2,191479,5,10,2,1,3,1,1,0,0,40,0,0 +64,0,111795,0,13,1,10,1,0,0,0,0,45,0,1 +42,2,242564,7,4,0,2,0,1,0,0,2205,40,0,0 +31,2,364657,5,10,1,1,1,0,0,0,0,50,9,1 +42,1,436107,6,12,1,6,1,0,0,0,0,50,0,0 +35,2,272476,6,12,1,4,2,0,1,0,0,35,0,1 +36,3,47310,5,10,2,1,4,1,1,0,0,40,0,1 +23,2,283796,14,8,0,8,5,0,0,0,0,30,4,0 +20,2,161092,5,10,0,0,3,0,0,0,0,14,0,0 +26,4,265230,0,13,0,3,0,1,1,0,0,40,0,0 +56,3,61885,0,13,0,6,0,1,0,0,2001,65,0,0 +40,2,150471,6,12,2,4,0,0,1,0,0,40,0,0 +19,2,183041,2,7,0,2,3,0,0,0,0,24,0,0 +33,2,176673,1,9,0,8,0,1,1,0,0,40,0,0 +45,3,235891,6,12,0,0,0,0,0,0,0,40,13,0 +41,2,163287,1,9,1,3,1,0,0,7688,0,43,0,1 +29,2,164040,1,9,1,4,1,0,0,0,0,40,0,0 +46,4,324561,3,14,1,3,2,0,1,0,0,45,0,1 +48,2,99127,6,12,1,6,1,0,0,0,0,45,0,0 +38,2,334999,1,9,1,5,1,0,0,0,0,45,0,0 +29,2,543477,5,10,0,0,3,1,1,0,0,40,0,0 +35,2,65876,1,9,1,10,1,0,0,0,0,40,0,0 +59,4,105866,0,13,1,11,1,1,0,0,0,30,0,0 +27,2,214858,1,9,1,4,3,0,0,0,0,40,0,0 +43,2,154076,5,10,1,2,1,0,0,0,0,40,0,1 +70,2,280307,0,13,1,1,1,0,0,0,0,20,1,0 +30,2,97723,1,9,0,8,3,0,0,0,0,45,0,0 +24,2,233499,5,10,1,6,1,0,0,0,0,40,0,1 +76,4,259612,1,9,1,11,1,0,0,0,0,15,0,0 +25,2,236977,1,9,4,10,3,0,0,0,0,40,4,0 +39,2,347814,6,12,0,4,3,0,1,0,0,56,0,0 +36,4,197495,0,13,2,3,4,1,1,0,0,40,0,0 +23,2,227594,14,8,0,8,3,0,1,0,0,40,0,0 +60,2,165441,7,4,2,8,4,0,1,0,0,40,0,0 +54,2,167552,15,2,1,10,1,1,0,0,0,40,19,1 +20,2,396722,5,10,0,5,0,0,1,0,0,40,0,0 +22,3,146538,1,9,0,0,3,0,0,0,0,40,0,0 +24,2,51973,0,13,0,3,3,0,1,0,0,20,0,0 +41,2,144778,1,9,1,10,1,0,0,0,0,40,0,0 +35,2,169672,5,10,1,10,1,0,0,0,0,40,0,0 +23,2,240137,11,3,0,2,0,0,0,0,0,55,4,0 +54,0,103179,8,16,1,1,1,0,0,0,1902,50,0,1 +17,2,172050,2,7,0,2,3,0,0,0,0,16,0,0 +43,2,178976,1,9,0,0,4,0,1,0,0,40,0,0 +33,2,176185,14,8,2,10,0,0,0,0,2258,42,0,0 +38,3,172571,5,10,2,0,0,0,0,0,0,40,0,1 +54,1,226735,1,9,1,4,1,1,0,0,0,45,0,0 +39,2,148015,1,9,0,8,0,1,1,0,0,52,0,0 +32,2,199529,5,10,4,9,0,3,0,0,1980,40,0,0 +61,4,35001,7,4,1,0,1,0,0,2885,0,40,0,0 +22,2,88126,0,13,0,1,3,0,0,0,0,40,0,0 +34,2,226296,1,9,1,4,1,0,0,0,0,40,0,1 +18,2,452452,12,6,0,13,3,1,1,0,0,20,0,0 +20,2,378546,1,9,0,10,3,0,0,0,0,25,0,0 +53,3,186087,1,9,2,9,4,0,0,0,0,40,0,0 +32,2,27856,5,10,0,0,0,0,1,0,0,40,0,0 +68,1,234859,5,10,1,4,1,0,0,0,0,30,0,0 +28,2,71733,5,10,4,4,4,0,1,0,0,15,0,0 +28,2,207473,5,10,1,6,1,0,0,0,0,40,22,0 +54,2,179291,5,10,1,3,1,1,0,0,0,56,19,1 +25,2,209286,5,10,1,10,1,0,0,0,0,40,0,0 +30,2,122889,3,14,1,3,1,2,0,0,0,50,3,1 +33,2,112358,5,10,0,4,0,0,0,0,0,32,0,0 +49,2,176341,0,13,0,9,4,2,1,0,0,40,3,0 +58,2,247276,7,4,6,4,0,4,1,0,0,30,0,0 +45,2,276087,9,11,1,3,1,0,0,0,0,24,0,1 +67,2,257557,7,4,1,6,1,1,0,10566,0,40,0,0 +69,5,106395,1,9,1,4,1,0,0,0,0,40,0,1 +61,2,167138,1,9,2,1,0,0,1,0,0,40,0,0 +34,2,213887,5,10,1,10,1,0,0,0,0,40,0,0 +28,2,185647,5,10,1,10,1,0,0,0,0,45,0,0 +19,2,143360,1,9,0,8,3,0,1,0,0,34,0,0 +31,1,176862,5,10,1,10,1,0,0,0,0,40,0,0 +32,3,97614,5,10,0,1,0,0,0,0,0,40,0,0 +53,2,196763,6,12,0,1,0,0,1,0,0,60,0,0 +46,2,306183,1,9,0,0,4,0,1,0,0,37,0,0 +43,1,343061,7,4,1,7,1,0,0,4508,0,40,1,0 +39,2,348521,5,10,1,7,1,0,0,0,2415,99,0,1 +59,2,195835,7,4,2,6,0,0,0,0,0,40,0,0 +19,2,106273,5,10,0,5,3,0,1,0,0,38,0,0 +40,2,222756,5,10,1,8,1,0,0,0,0,40,0,1 +63,5,110610,12,6,1,7,1,0,0,0,0,50,0,0 +46,2,247286,5,10,2,5,4,0,1,0,0,40,0,0 +22,2,219042,12,6,0,8,4,0,0,0,0,40,0,0 +36,2,224566,6,12,0,3,0,0,0,0,1669,45,0,0 +57,2,204751,5,10,1,10,1,0,0,0,0,40,0,1 +58,2,113398,1,9,0,4,5,0,0,0,0,25,0,0 +59,2,258579,5,10,1,6,1,0,0,3103,0,35,0,1 +36,2,162424,1,9,1,10,1,0,0,0,0,45,0,0 +29,2,263005,3,14,1,1,1,0,0,0,0,45,9,0 +49,5,26502,0,13,2,3,4,0,0,6497,0,45,0,0 +42,2,369131,6,12,1,5,1,0,0,0,0,55,0,1 +43,4,114859,5,10,1,6,1,0,0,0,0,17,0,0 +46,2,405309,1,9,1,1,1,0,0,0,0,40,0,0 +43,4,323627,5,10,0,1,0,0,1,0,0,12,0,0 +40,2,106698,6,12,2,6,4,0,1,0,0,40,0,0 +43,2,51506,14,8,1,6,1,0,0,0,0,40,0,0 +48,2,117251,1,9,6,0,0,0,1,0,0,32,0,0 +26,2,106705,1,9,0,2,3,1,0,0,0,28,0,0 +30,2,217296,9,11,1,0,2,0,1,0,0,35,0,0 +58,2,34788,5,10,1,5,1,0,0,0,1887,40,0,1 +43,2,143368,1,9,2,7,0,1,0,0,0,40,0,0 +53,4,86600,1,9,1,4,1,1,0,0,0,40,0,0 +74,0,117017,5,10,4,5,0,0,0,0,0,16,0,0 +45,2,55720,0,13,1,3,1,0,0,0,0,40,0,1 +32,0,481096,11,3,0,8,3,0,1,0,0,10,0,0 +38,2,186145,5,10,1,5,2,0,1,0,0,40,0,1 +42,1,96524,0,13,1,5,1,0,0,0,0,40,0,1 +24,4,187397,5,10,0,11,4,4,0,1151,0,40,0,0 +63,2,181153,1,9,1,5,1,0,0,0,0,35,0,0 +25,4,375170,5,10,0,0,3,1,1,0,0,35,0,0 +37,2,360743,5,10,1,10,1,1,0,0,0,40,0,0 +28,1,420054,1,9,1,10,1,0,0,0,0,40,25,0 +31,2,137681,5,10,1,4,1,0,0,0,0,40,0,0 +46,2,28419,10,15,1,3,1,0,0,99999,0,50,0,1 +44,2,101214,0,13,2,5,4,0,0,0,0,44,0,1 +42,4,213019,3,14,0,3,0,0,1,0,0,40,0,1 +45,2,207540,8,16,4,1,4,0,0,0,0,40,0,1 +52,2,145333,0,13,2,5,0,0,0,0,0,60,0,0 +40,2,107306,0,13,1,1,1,0,0,0,0,40,0,1 +26,2,195327,1,9,0,5,3,0,0,0,0,40,0,0 +17,2,175465,12,6,0,4,3,0,1,0,0,14,0,0 +27,2,197905,5,10,1,4,1,0,0,0,0,40,0,0 +71,5,118119,5,10,1,1,1,0,0,20051,0,50,0,1 +35,2,172571,0,13,1,3,1,0,0,0,0,50,0,0 +17,2,25051,12,6,0,4,3,0,0,0,0,16,0,0 +26,2,210714,1,9,1,6,1,0,0,0,0,52,0,1 +22,2,183083,5,10,0,8,0,0,1,0,0,35,0,0 +51,2,99185,0,13,1,1,1,0,0,0,0,60,0,1 +33,2,283921,5,10,1,10,1,0,0,0,0,40,0,0 +41,4,396467,6,12,1,1,1,1,0,0,0,50,0,1 +50,2,158680,3,14,1,1,1,0,0,0,0,50,0,1 +26,2,202091,1,9,1,0,2,0,1,0,0,40,0,0 +21,2,285127,1,9,0,2,0,1,1,0,0,40,0,0 +53,2,218630,1,9,1,8,1,0,0,0,0,40,0,1 +32,5,99309,1,9,1,1,1,0,0,0,0,40,0,1 +19,2,165505,5,10,0,5,3,0,1,0,0,20,0,0 +22,2,122272,0,13,0,0,3,0,1,0,0,35,0,0 +58,2,147707,1,9,1,1,1,0,0,15024,0,60,0,1 +47,3,44257,0,13,3,1,0,0,0,0,0,60,0,1 +51,5,194995,5,10,1,1,1,0,0,0,0,45,0,1 +42,0,345969,0,13,1,1,1,0,0,0,0,48,0,1 +28,2,31842,0,13,0,1,3,0,0,0,0,40,0,0 +29,2,143582,1,9,1,0,2,2,1,0,0,35,36,0 +50,2,161438,1,9,1,1,1,0,0,0,0,50,0,1 +22,2,317019,5,10,0,4,0,0,1,0,0,30,0,0 +47,1,158451,5,10,2,4,0,0,1,0,0,45,0,0 +60,2,225883,5,10,6,5,4,0,1,0,0,27,0,0 +46,1,176319,1,9,1,5,3,0,1,7298,0,40,0,1 +58,5,258883,0,13,1,3,1,0,0,0,0,60,0,1 +62,2,26966,5,10,6,0,0,0,1,0,0,40,0,0 +59,2,35411,1,9,6,8,0,0,1,0,0,40,0,0 +41,2,190885,1,9,4,4,4,0,1,0,0,40,4,0 +31,2,182162,1,9,1,0,2,0,1,0,0,37,0,0 +18,2,352640,1,9,0,0,3,0,1,0,0,40,0,0 +64,1,213945,1,9,1,10,1,0,0,0,0,50,0,0 +51,1,135102,1,9,1,6,1,0,0,0,0,65,0,0 +47,1,102583,0,13,0,5,0,0,0,0,0,35,0,0 +68,2,225612,0,13,6,5,0,0,0,0,0,35,0,1 +32,2,241802,1,9,1,4,2,4,1,0,0,40,0,0 +39,2,347434,4,5,1,2,1,0,0,0,0,43,4,0 +37,2,305259,6,12,2,1,0,0,1,0,0,48,0,0 +29,2,140830,1,9,0,4,3,0,1,0,0,40,0,0 +44,2,291568,1,9,1,7,1,4,0,0,0,40,0,0 +46,2,203067,10,15,1,3,1,0,0,0,0,40,0,1 +40,1,155106,4,5,1,10,1,0,0,0,0,40,0,1 +52,4,100226,0,13,1,0,2,0,1,0,0,40,0,1 +40,2,63503,0,13,1,1,1,0,0,0,0,40,0,1 +61,2,95929,4,5,2,4,0,0,0,0,0,40,0,0 +30,2,187618,1,9,1,1,1,0,0,0,0,50,0,0 +61,1,92178,2,7,1,4,1,0,0,0,0,40,0,0 +33,2,220362,9,11,1,6,1,0,0,0,0,84,0,1 +32,4,209900,0,13,1,3,1,0,0,0,0,65,0,1 +32,2,272376,6,12,0,0,0,0,1,0,0,40,0,0 +32,1,173854,0,13,2,3,5,0,0,0,0,35,0,1 +37,2,278924,1,9,2,5,0,0,0,0,0,40,0,0 +53,2,324568,2,7,1,10,1,0,0,0,0,45,0,0 +51,5,124963,3,14,1,5,1,0,0,0,0,40,0,1 +29,2,211299,9,11,0,5,0,1,0,0,0,45,0,0 +48,2,192791,1,9,1,8,1,0,0,0,0,40,0,0 +69,2,182862,1,9,0,6,0,0,0,15831,0,40,0,1 +28,2,46868,3,14,0,9,0,0,1,0,0,40,0,0 +55,4,31365,0,13,6,3,0,0,1,0,0,40,0,1 +45,2,148171,9,11,1,10,1,0,0,15024,0,40,0,1 +18,2,142647,5,10,0,4,3,0,1,0,0,20,0,0 +60,2,116230,7,4,1,10,1,0,0,0,0,40,0,0 +19,2,495982,5,10,0,0,3,0,0,0,0,10,0,0 +18,2,334026,2,7,0,10,3,0,0,0,0,25,0,0 +33,2,268571,5,10,1,4,1,0,0,0,0,40,0,0 +33,2,213813,5,10,2,9,4,0,1,0,0,40,0,0 +29,2,241667,3,14,0,3,0,0,1,0,0,45,0,0 +37,2,160920,5,10,1,5,1,0,0,0,0,45,0,0 +50,2,107265,1,9,1,6,1,0,0,0,0,50,0,1 +28,2,129460,12,6,6,0,4,0,1,0,2238,35,0,0 +23,2,167424,5,10,0,4,3,0,1,0,0,35,0,0 +47,2,270079,7,4,1,10,1,0,0,0,0,40,0,0 +21,2,325923,5,10,0,9,3,0,0,0,0,35,0,0 +19,2,194905,5,10,0,4,3,0,1,0,0,12,0,0 +47,4,183486,0,13,1,3,2,0,1,0,0,50,0,1 +36,3,153066,3,14,1,3,1,0,0,0,0,40,0,1 +62,5,56248,0,13,1,7,1,0,0,0,2415,60,0,1 +65,2,105252,1,9,1,9,1,0,0,0,0,40,0,1 +46,1,168195,10,15,1,3,1,0,0,0,1902,45,0,1 +35,2,167735,2,7,0,10,3,0,0,6849,0,40,0,0 +50,2,146310,4,5,1,8,1,0,0,0,0,40,0,0 +20,2,256504,5,10,0,5,3,0,1,0,0,6,0,0 +17,2,121425,2,7,0,0,3,0,1,0,0,16,0,0 +33,2,146440,5,10,1,10,1,0,0,0,1740,40,0,0 +53,1,98829,0,13,1,3,1,0,0,0,0,50,0,0 +47,5,239321,0,13,1,5,1,0,0,0,0,40,0,1 +62,5,134768,3,14,1,5,1,0,0,0,0,35,0,0 +35,2,556902,1,9,2,4,0,1,0,0,0,40,0,0 +27,2,47907,0,13,0,0,0,0,1,0,0,43,0,0 +23,2,114357,1,9,0,9,3,0,0,0,0,50,0,0 +27,2,189462,3,14,0,3,0,0,1,0,1504,45,0,0 +39,2,90646,9,11,2,0,4,0,1,0,0,40,0,0 +25,2,232914,0,13,1,0,2,1,1,0,0,38,0,0 +24,2,192201,5,10,0,1,0,1,1,0,0,20,0,0 +23,2,27776,1,9,1,4,1,0,0,0,0,40,0,0 +29,2,137476,0,13,1,3,2,0,1,0,0,35,0,1 +30,2,100734,0,13,1,3,2,0,1,0,0,38,0,0 +34,2,111746,1,9,4,10,0,0,0,0,0,45,20,0 +32,2,184833,12,6,4,10,4,0,1,0,0,40,0,0 +18,2,414721,2,7,0,4,3,1,0,0,1602,23,0,0 +20,2,151780,9,11,0,5,0,1,1,0,0,35,0,0 +38,0,203628,0,13,1,3,1,0,0,0,0,45,0,1 +18,2,137363,14,8,0,4,3,0,1,0,0,20,0,0 +41,2,172307,4,5,1,10,1,0,0,0,0,40,0,0 +21,2,273403,9,11,0,4,0,0,1,0,0,50,0,0 +36,0,37931,1,9,1,11,1,0,0,0,0,48,0,1 +61,2,97030,5,10,2,4,0,0,1,0,0,30,0,0 +30,2,54608,5,10,1,8,1,0,0,0,0,48,0,0 +26,2,108542,5,10,1,0,1,0,0,0,0,40,0,1 +27,2,253814,0,13,1,9,2,0,1,0,0,40,0,1 +45,2,421412,1,9,1,8,1,0,0,0,0,45,0,1 +47,2,207140,1,9,2,0,0,0,1,0,0,38,0,0 +19,2,138153,5,10,0,0,3,0,1,0,0,10,0,0 +29,2,46987,1,9,0,0,0,0,1,0,0,55,0,0 +51,5,183173,1,9,1,1,1,0,0,0,0,70,0,1 +34,4,229531,6,12,1,3,1,0,0,0,0,60,0,0 +42,1,320744,1,9,1,5,1,0,0,3908,0,45,0,0 +26,2,257405,11,3,0,7,5,1,0,0,0,40,4,0 +20,0,432052,5,10,0,2,0,0,0,0,0,15,0,0 +43,2,397280,6,12,0,3,0,0,0,0,0,50,0,1 +20,2,38001,5,10,0,4,3,0,1,0,0,20,0,0 +27,2,101618,1,9,1,1,1,0,0,0,0,50,0,0 +46,3,332727,5,10,1,10,1,0,0,0,0,40,0,1 +39,2,115215,1,9,0,6,3,0,0,0,0,40,0,0 +33,2,178449,5,10,0,0,0,0,0,0,0,49,0,0 +42,2,185267,9,11,1,0,1,0,0,0,0,32,0,0 +23,2,410439,1,9,0,0,3,0,0,0,0,25,0,0 +29,2,85572,0,13,1,1,2,0,1,0,0,42,0,1 +27,2,83517,1,9,0,6,3,0,0,0,0,60,0,0 +43,1,194726,1,9,2,10,3,0,0,0,0,35,0,0 +23,2,322674,5,10,0,2,0,0,0,0,0,40,0,0 +40,4,34540,3,14,2,3,4,0,1,0,0,44,0,0 +35,4,211073,5,10,1,11,1,0,0,0,0,61,0,1 +30,2,194901,1,9,0,5,5,0,0,0,0,40,0,0 +59,2,117059,2,7,1,6,1,3,0,0,0,40,0,0 +65,1,78875,5,10,1,1,1,0,0,2290,0,40,0,0 +28,2,51461,3,14,1,3,1,0,0,0,0,60,0,0 +79,2,266119,0,13,1,5,1,0,0,0,0,40,0,0 +43,4,92374,3,14,1,3,2,1,1,0,0,35,0,1 +54,2,175262,7,4,1,8,1,0,0,0,0,40,0,0 +27,2,208249,1,9,1,2,1,0,0,0,0,62,0,0 +30,2,196385,0,13,1,3,1,0,0,15024,0,35,0,1 +34,2,146980,1,9,3,4,4,0,1,0,0,65,0,0 +18,2,112974,2,7,0,3,5,0,0,0,0,3,0,0 +40,1,175943,9,11,1,3,2,0,1,0,1977,15,0,1 +28,2,163265,4,5,1,5,1,0,0,4508,0,40,0,0 +18,2,210932,1,9,0,0,3,0,1,0,0,40,0,0 +46,2,145290,5,10,1,10,1,0,0,0,0,40,0,0 +23,2,198992,1,9,0,0,3,0,1,0,0,35,0,0 +41,3,36651,3,14,1,1,1,0,0,0,1848,40,0,1 +48,2,190072,5,10,2,1,0,0,0,0,0,50,0,1 +29,2,49087,0,13,0,3,0,0,0,0,0,50,0,0 +41,2,126622,2,7,2,2,4,0,1,0,0,40,0,0 +41,2,174189,4,5,4,4,0,0,0,0,0,40,0,0 +34,2,118605,6,12,1,3,1,0,0,0,0,55,0,0 +49,1,377622,6,12,2,5,0,0,0,0,0,50,0,0 +49,2,157272,1,9,4,5,4,0,0,0,0,50,0,0 +30,2,78530,1,9,0,2,0,0,0,0,0,40,0,0 +28,2,190391,0,13,0,5,0,0,0,0,0,40,0,0 +62,0,162678,0,13,1,1,1,0,0,0,0,40,0,0 +41,2,103980,5,10,1,3,1,0,0,0,0,52,0,0 +20,2,293726,5,10,0,10,0,0,0,0,0,40,0,0 +61,2,98350,13,1,3,4,0,2,0,0,0,40,26,0 +30,2,207668,0,13,0,9,0,0,0,0,0,60,39,0 +29,3,41013,10,15,0,3,0,0,1,0,0,55,0,0 +50,2,188186,3,14,2,5,0,0,1,0,1590,45,0,0 +44,3,320071,1,9,1,10,1,0,0,0,0,40,0,1 +25,2,306908,0,13,1,3,1,0,0,0,0,45,0,1 +62,2,167652,9,11,2,5,0,0,1,0,0,40,0,0 +57,2,173580,5,10,6,8,4,0,1,0,0,40,0,0 +35,2,273612,0,13,0,1,0,0,0,0,0,45,0,0 +26,2,195555,0,13,0,5,0,0,1,0,0,40,0,0 +60,2,186446,7,4,1,8,2,0,1,0,0,40,0,0 +22,2,418405,5,10,1,10,1,0,0,0,0,40,0,0 +26,2,183965,1,9,0,10,0,0,0,0,0,40,0,0 +26,2,354784,5,10,0,0,3,0,0,0,0,20,0,0 +44,2,198096,0,13,1,5,1,0,0,7688,0,40,0,1 +32,2,732102,0,13,0,1,0,0,0,0,0,40,0,0 +66,1,97847,0,13,1,5,1,0,0,0,0,50,0,0 +24,2,196678,13,1,0,8,3,0,1,0,0,30,0,0 +19,2,320014,5,10,0,4,3,0,0,0,0,25,0,0 +54,5,298215,0,13,1,1,1,0,0,0,0,50,0,1 +37,2,295127,1,9,0,8,0,0,0,0,0,40,0,0 +38,2,368140,0,13,1,1,1,0,0,0,0,50,0,1 +34,2,212163,5,10,1,5,1,0,0,0,0,25,0,0 +35,1,108198,1,9,2,10,3,3,0,0,0,15,0,0 +42,3,294431,3,14,1,3,1,0,0,0,0,40,0,0 +47,3,202560,0,13,1,1,2,0,1,0,0,40,0,1 +29,5,266070,0,13,2,3,0,0,1,0,0,80,0,0 +34,2,346122,1,9,0,9,0,0,0,0,0,40,0,0 +38,5,308686,0,13,1,3,1,0,0,0,0,70,0,1 +62,5,236096,1,9,2,1,0,1,0,0,0,40,0,0 +35,2,187711,1,9,1,10,1,0,0,0,0,40,0,0 +37,2,238959,1,9,1,0,2,0,1,0,0,40,0,0 +47,2,93557,1,9,1,7,1,0,0,0,0,40,0,0 +37,2,329980,5,10,1,10,1,0,0,0,0,40,0,0 +22,2,125010,9,11,0,13,0,0,1,0,0,30,0,0 +60,5,90915,2,7,1,6,1,0,0,0,0,40,0,1 +31,2,289731,5,10,1,10,1,0,0,0,0,40,0,0 +63,2,206052,1,9,1,10,1,0,0,0,0,40,0,0 +30,2,191385,2,7,1,8,1,0,0,0,0,40,0,0 +40,5,191429,10,15,1,3,1,0,0,15024,0,40,0,1 +35,1,199753,5,10,1,4,1,0,0,0,0,60,0,0 +50,4,92486,5,10,1,10,1,0,0,0,0,40,0,0 +18,2,171088,5,10,0,5,3,0,1,0,0,10,0,0 +33,2,112820,9,11,1,11,1,0,0,0,0,40,0,0 +59,1,32855,7,4,1,7,1,0,0,0,0,70,0,0 +17,2,142964,2,7,0,4,3,0,0,0,0,20,0,0 +47,2,89146,1,9,1,6,1,3,0,0,0,40,0,1 +26,2,291968,0,13,0,3,0,0,0,0,0,40,0,0 +32,4,29235,5,10,1,11,2,0,1,0,0,40,23,1 +55,2,238216,1,9,1,10,1,0,0,0,0,40,0,0 +36,0,323726,5,10,0,9,4,1,1,0,0,40,0,0 +54,2,141663,1,9,1,0,1,0,0,0,0,40,0,1 +32,2,118551,3,14,0,1,0,0,1,0,0,45,0,1 +52,4,35092,8,16,1,1,1,0,0,0,0,40,0,1 +39,2,139703,1,9,3,5,4,1,1,0,0,28,2,0 +39,3,206190,1,9,0,1,4,0,1,0,0,45,0,0 +59,1,178353,1,9,1,1,1,0,0,0,0,50,0,1 +55,3,169133,0,13,2,3,4,0,0,0,0,40,0,0 +54,1,103179,1,9,1,6,1,0,0,0,0,60,0,1 +31,2,354464,1,9,1,4,1,0,0,0,0,40,0,0 +30,2,60426,1,9,1,0,3,3,1,0,0,40,0,0 +47,3,98726,0,13,3,1,0,0,1,0,0,40,0,0 +31,2,133861,6,12,2,1,0,0,0,0,0,40,0,0 +32,1,180303,0,13,2,10,4,2,0,0,0,47,10,0 +33,2,221324,9,11,0,8,4,1,1,0,0,40,0,0 +31,2,325658,1,9,2,10,4,0,0,0,0,40,0,0 +32,2,210562,1,9,1,8,1,0,0,0,0,40,0,0 +46,2,152249,1,9,3,4,0,0,0,0,0,35,4,0 +29,2,178649,1,9,3,4,0,0,1,0,0,20,23,0 +41,0,48997,1,9,1,6,1,1,0,0,0,40,0,0 +39,2,243409,1,9,1,1,1,0,0,0,0,60,0,1 +34,2,162442,1,9,1,0,2,0,1,0,0,20,0,1 +23,2,203078,0,13,0,0,3,1,0,0,0,24,0,0 +53,5,155983,3,14,1,5,1,0,0,0,0,65,0,1 +45,1,182677,1,9,3,10,0,2,0,0,0,40,15,0 +47,2,105381,1,9,2,5,0,0,1,0,0,40,0,0 +42,2,210275,3,14,2,9,4,1,1,4687,0,35,0,1 +53,2,150980,5,10,1,8,1,0,0,3137,0,40,0,0 +38,5,141584,1,9,2,5,4,0,0,0,0,55,0,0 +26,2,113571,1,9,0,6,0,0,0,0,0,70,0,0 +18,2,154089,2,7,0,2,3,0,0,0,0,20,0,0 +43,2,50197,12,6,4,4,0,1,1,0,0,40,0,0 +26,2,132572,0,13,0,0,3,1,1,0,0,32,0,0 +47,2,238185,0,13,2,0,0,0,1,0,0,40,0,0 +26,2,112754,9,11,1,10,1,0,0,0,0,65,0,1 +32,0,213389,5,10,2,11,4,0,1,0,1726,38,0,0 +48,5,287647,8,16,1,3,1,0,0,7688,0,55,0,1 +39,2,150061,3,14,2,1,4,1,1,15020,0,60,0,1 +58,5,143266,0,13,1,3,1,0,0,0,0,40,0,0 +55,1,68006,7,4,0,4,5,0,1,0,0,60,0,0 +40,2,287079,1,9,0,7,0,0,0,0,0,55,0,0 +33,2,223212,1,9,2,10,4,0,0,0,0,40,0,0 +74,1,173929,8,16,3,3,0,0,0,0,0,25,0,1 +49,1,182211,1,9,6,7,0,0,0,0,0,55,0,0 +56,1,62539,2,7,6,4,4,0,1,0,0,65,34,1 +29,2,157612,0,13,0,3,0,0,1,14344,0,40,0,1 +25,2,305472,6,12,0,8,3,1,0,0,0,48,0,0 +57,2,548256,14,8,1,0,1,1,0,0,0,40,0,0 +29,2,40295,1,9,1,3,1,0,0,0,0,40,0,0 +28,2,112403,1,9,0,10,4,0,0,2354,0,40,0,0 +59,2,31137,1,9,1,10,1,0,0,0,0,40,0,1 +30,2,116138,0,13,0,1,0,0,0,27828,0,60,0,1 +19,2,201743,5,10,0,4,3,0,1,0,0,20,0,0 +40,2,240027,5,10,0,5,4,1,1,0,0,45,0,0 +28,2,129882,5,10,0,0,4,1,1,0,0,40,0,0 +20,2,107658,5,10,0,9,0,0,1,0,0,10,8,0 +58,2,136841,0,13,1,3,2,0,1,99999,0,35,0,1 +19,2,146679,5,10,0,1,3,1,0,0,0,30,0,0 +24,3,42251,0,13,0,3,0,0,1,0,0,30,0,0 +31,2,113838,1,9,1,8,1,0,0,0,0,45,0,0 +28,1,282398,1,9,2,10,0,0,0,0,0,35,0,0 +41,2,33331,1,9,1,10,1,0,0,0,0,45,0,0 +23,3,41031,5,10,0,5,0,0,1,0,0,35,0,0 +46,2,155489,1,9,1,8,1,0,0,0,0,43,0,1 +33,2,53042,14,8,0,10,3,1,0,0,0,40,0,0 +34,2,174789,5,10,1,4,1,0,0,0,0,50,0,0 +47,4,203067,0,13,2,3,0,0,0,0,0,50,0,0 +81,2,177408,1,9,1,1,1,0,0,0,2377,26,0,1 +45,2,216626,1,9,6,8,4,4,0,0,0,40,13,0 +35,2,93034,1,9,0,8,0,2,0,0,0,40,14,0 +59,1,188003,0,13,6,3,0,0,1,0,0,50,0,1 +46,4,65535,0,13,1,1,1,0,0,0,0,48,0,1 +39,2,366757,1,9,1,10,1,0,0,0,0,35,0,0 +23,2,414545,5,10,0,8,3,1,0,0,0,40,0,0 +25,2,295919,6,12,0,0,4,0,1,0,0,40,0,0 +37,2,34378,15,2,0,4,0,0,0,0,0,40,0,0 +49,5,58359,5,10,1,1,1,0,0,15024,0,50,0,1 +25,2,476334,1,9,1,5,1,0,0,0,0,48,0,0 +32,2,255424,0,13,1,5,1,0,0,0,0,60,0,1 +34,4,175856,5,10,0,10,0,0,0,0,0,40,0,0 +40,2,124692,0,13,1,1,1,0,0,0,0,40,0,1 +33,2,118551,1,9,2,0,4,0,1,0,0,40,0,0 +31,2,288566,0,13,1,9,1,0,0,0,0,43,0,1 +61,2,137733,5,10,2,4,0,0,0,0,0,25,0,0 +22,2,39432,1,9,1,10,1,0,0,0,0,40,0,0 +29,2,138537,9,11,1,10,1,2,0,0,0,40,17,0 +37,2,709445,1,9,4,10,5,1,0,0,0,40,0,0 +35,2,194809,2,7,2,8,4,0,1,0,0,40,0,0 +52,5,89041,3,14,1,1,1,0,0,15024,0,60,0,1 +18,2,159561,2,7,0,6,3,0,0,0,0,20,0,0 +37,2,236328,12,6,1,10,1,0,0,0,0,48,0,0 +46,2,269045,10,15,1,3,1,1,0,0,0,40,0,1 +47,3,323798,0,13,1,1,1,0,0,0,0,40,0,1 +55,2,463072,0,13,1,3,1,0,0,0,0,60,0,1 +25,5,98756,5,10,2,0,3,0,1,0,0,50,0,0 +50,0,161075,1,9,6,9,4,1,1,0,0,40,0,0 +18,2,192485,14,8,0,2,3,1,0,0,0,20,0,0 +25,2,201579,4,5,0,10,0,0,0,0,0,40,4,0 +23,2,117606,0,13,0,3,0,0,1,0,0,40,0,0 +47,1,237731,1,9,1,7,1,0,0,2829,0,65,0,0 +37,2,60313,1,9,0,10,4,0,0,0,0,40,0,0 +37,2,270059,5,10,2,0,4,0,1,25236,0,25,0,1 +19,2,240686,2,7,0,5,3,0,1,0,0,25,0,0 +52,4,124793,14,8,1,10,1,0,0,0,0,40,0,0 +25,1,113948,9,11,1,4,2,0,1,0,0,45,0,0 +21,2,147655,1,9,0,0,3,0,1,0,0,40,0,0 +41,1,38876,9,11,1,7,1,0,0,0,0,60,0,0 +55,2,117299,1,9,1,10,1,0,0,7688,0,40,0,1 +24,2,136310,5,10,1,9,1,0,0,0,0,40,0,0 +41,3,153132,0,13,1,3,1,0,0,0,0,38,0,1 +23,2,197552,5,10,0,5,3,0,1,0,0,35,0,0 +33,2,69748,1,9,1,1,2,0,1,0,0,40,0,0 +29,2,175738,0,13,0,1,0,0,1,0,0,45,0,1 +50,0,78649,5,10,3,0,4,3,1,0,0,40,0,0 +48,2,155659,9,11,1,10,1,0,0,7688,0,40,0,1 +19,3,215891,5,10,0,0,3,0,1,0,0,10,0,0 +40,2,144928,5,10,2,10,0,0,0,0,0,40,0,0 +30,2,33688,1,9,0,6,4,0,1,0,1669,70,0,0 +65,2,262446,2,7,1,4,1,0,0,0,0,20,0,0 +44,3,191295,0,13,1,1,1,1,0,0,0,48,0,0 +32,2,279173,0,13,2,5,0,0,0,0,0,45,0,0 +41,2,153031,5,10,1,5,1,0,0,0,0,65,0,1 +28,2,202239,7,4,1,3,1,0,0,0,0,55,0,0 +44,3,469454,9,11,1,11,1,0,0,7298,0,48,0,1 +39,4,164156,6,12,2,4,4,0,1,0,0,55,0,0 +59,2,196482,1,9,6,0,4,0,1,0,0,40,0,0 +31,2,176185,3,14,1,1,1,0,0,0,0,60,23,1 +34,2,287315,1,9,2,8,0,0,0,0,0,40,0,0 +20,2,117210,1,9,0,2,3,0,0,0,0,40,0,0 +33,2,41610,0,13,1,3,1,0,0,0,0,40,0,0 +52,2,160703,8,16,1,3,1,0,0,0,0,65,0,1 +31,2,80511,6,12,2,9,0,0,1,0,0,44,0,0 +39,2,219155,1,9,1,8,1,0,0,0,0,43,0,0 +35,2,106347,1,9,1,1,1,0,0,0,0,45,0,0 +37,1,68899,1,9,1,10,1,0,0,0,2129,40,0,0 +44,1,163985,10,15,1,3,1,0,0,0,0,32,0,1 +28,2,270887,6,12,0,5,0,0,0,0,0,65,0,0 +17,2,205726,2,7,0,5,3,0,1,0,0,15,0,0 +23,2,218899,0,13,0,5,3,0,1,0,0,60,0,0 +35,2,186183,1,9,1,6,1,0,0,15024,0,80,0,1 +19,2,248749,5,10,0,5,3,0,0,0,0,20,0,0 +30,2,197558,1,9,1,2,1,0,0,0,0,40,0,0 +27,2,176514,0,13,0,0,0,0,1,0,0,40,0,0 +27,2,128730,9,11,0,1,0,0,0,10520,0,65,34,1 +37,2,215503,1,9,1,1,1,0,0,4386,0,45,0,1 +44,2,226129,9,11,1,3,1,0,0,0,0,50,0,1 +34,2,175856,0,13,1,1,1,0,0,3103,0,55,0,1 +43,2,281138,1,9,4,8,0,0,1,0,0,40,0,0 +41,2,98061,1,9,2,6,0,0,0,0,0,40,0,0 +34,1,260560,1,9,0,10,0,0,0,0,0,50,0,0 +23,2,289909,5,10,0,0,0,0,0,0,0,45,0,0 +51,2,59590,1,9,1,0,2,0,1,0,0,20,0,0 +24,2,236769,6,12,0,1,3,0,0,0,0,40,0,0 +38,1,423616,1,9,1,5,2,0,1,0,0,24,0,1 +24,2,291407,1,9,1,6,1,1,0,0,0,40,0,0 +53,5,100029,8,16,1,3,1,0,0,0,0,40,0,1 +33,2,204494,5,10,1,1,1,0,0,0,0,56,0,1 +24,2,201680,1,9,0,10,3,0,0,0,0,40,0,0 +45,2,154308,3,14,1,1,1,1,0,0,0,40,0,1 +31,2,150324,2,7,2,7,0,0,0,0,0,50,0,0 +38,4,331609,5,10,6,6,0,1,1,0,0,47,0,0 +28,2,100829,0,13,1,1,2,0,1,0,0,50,0,1 +38,2,203169,9,11,1,10,1,0,0,0,0,50,0,1 +25,2,122075,0,13,0,1,0,0,0,0,0,50,0,0 +29,2,178778,5,10,0,4,0,0,0,0,0,40,0,0 +29,2,276345,1,9,0,3,0,0,1,0,0,50,0,0 +48,2,233511,1,9,1,6,1,0,0,0,0,50,0,1 +24,2,289448,9,11,0,0,3,2,1,0,0,40,11,0 +31,2,173350,1,9,0,4,0,0,1,0,0,30,0,0 +36,2,130589,5,10,2,1,0,0,0,0,0,45,0,0 +62,2,94318,0,13,1,3,1,0,0,0,0,50,0,1 +25,2,297531,0,13,0,5,3,0,1,0,0,40,0,0 +55,2,129762,1,9,2,0,4,0,1,0,0,40,0,0 +21,2,182614,5,10,0,5,5,0,1,0,0,40,12,0 +60,2,120067,4,5,1,7,1,0,0,0,0,45,0,0 +41,2,182370,6,12,2,10,3,0,0,0,0,40,0,0 +43,0,60949,1,9,1,10,1,0,0,0,0,40,0,0 +30,2,190511,1,9,1,8,1,0,0,0,0,40,0,1 +47,2,188195,5,10,1,3,1,0,0,0,0,40,0,0 +50,2,89534,1,9,1,8,1,0,0,0,0,40,0,0 +41,5,125831,1,9,1,5,1,0,0,0,1887,55,0,1 +23,2,183358,1,9,0,10,0,0,0,0,0,40,5,0 +30,2,251120,6,12,0,5,0,0,0,0,0,40,7,0 +35,2,108946,1,9,2,9,4,0,1,0,0,40,0,0 +25,2,93223,5,10,2,3,4,0,1,0,0,35,0,0 +61,2,147393,10,15,1,1,1,0,0,0,0,20,0,0 +35,0,225385,1,9,2,3,4,0,1,0,0,40,0,0 +35,3,23892,1,9,2,3,4,0,1,0,0,40,0,0 +38,2,179668,1,9,1,11,1,0,0,0,0,40,32,0 +27,1,404998,9,11,0,10,3,0,0,0,0,40,0,0 +51,2,68882,15,2,6,4,4,0,1,0,0,35,20,0 +55,1,194065,6,12,2,5,0,0,1,0,0,40,0,0 +45,2,357540,0,13,1,5,1,0,0,0,2002,55,0,0 +33,2,185336,9,11,1,0,2,1,1,0,0,40,0,0 +25,0,152503,5,10,0,9,0,1,0,0,0,40,0,0 +52,2,167794,8,16,1,1,1,0,0,0,0,38,0,1 +46,2,96552,5,10,2,8,3,0,1,0,0,17,0,0 +34,2,169527,5,10,1,5,2,0,1,4386,0,20,0,0 +52,0,254285,0,13,1,3,1,0,0,0,0,40,0,0 +47,2,32509,5,10,2,4,4,0,1,0,0,40,0,0 +46,2,125492,0,13,2,3,0,1,1,0,0,40,0,0 +36,5,186035,5,10,1,5,1,0,0,0,0,60,0,1 +34,2,191856,5,10,1,1,2,0,1,7298,0,40,0,1 +36,2,215503,1,9,0,10,0,0,0,0,0,65,0,0 +31,2,187560,1,9,0,0,0,0,0,2174,0,40,0,0 +31,1,252752,1,9,1,4,2,0,1,0,2415,40,0,1 +38,4,210991,0,13,1,10,1,0,0,0,1740,40,0,0 +57,4,190748,5,10,2,1,4,0,1,0,0,35,0,0 +24,2,117767,6,12,0,5,3,0,0,0,0,20,0,0 +37,2,301070,1,9,2,7,4,0,0,0,0,45,0,0 +69,1,204645,5,10,1,10,1,0,0,9386,0,72,0,1 +39,2,186183,3,14,1,3,1,0,0,0,0,40,0,1 +38,2,131808,9,11,2,10,4,0,0,0,0,40,0,0 +34,0,156292,1,9,0,2,0,1,0,0,0,40,0,0 +21,2,124589,1,9,0,5,3,0,1,0,0,40,0,0 +21,2,262819,5,10,0,4,0,0,1,0,0,20,0,0 +61,2,95500,1,9,1,6,1,0,0,0,0,40,0,0 +35,2,241306,1,9,1,0,1,0,0,0,0,45,0,0 +29,2,238680,5,10,0,5,0,1,0,0,0,55,31,0 +41,4,168071,1,9,2,1,3,0,0,0,0,45,0,0 +52,2,168001,3,14,2,3,0,0,1,0,0,40,0,1 +38,2,97759,14,8,0,4,4,0,1,0,0,17,0,0 +51,1,107096,1,9,1,7,1,0,0,0,0,50,0,0 +55,2,76860,1,9,1,4,5,2,0,0,0,40,11,0 +20,2,70076,5,10,0,8,3,0,1,0,0,40,0,0 +23,2,312017,5,10,0,1,0,0,0,0,0,40,0,0 +24,2,174138,6,12,1,10,1,0,0,0,0,40,0,0 +48,2,125892,0,13,2,1,5,0,0,0,0,40,0,0 +22,2,210474,1,9,0,4,0,0,1,0,0,40,0,0 +22,0,157332,5,10,0,4,3,0,1,0,0,15,0,0 +28,2,30771,5,10,0,0,4,1,1,0,0,40,0,0 +28,2,319768,3,14,1,5,1,0,0,0,0,45,23,1 +34,2,209101,0,13,1,1,1,0,0,5178,0,55,0,1 +25,2,324609,1,9,0,0,0,1,0,0,0,40,0,0 +48,2,268234,1,9,2,10,0,0,0,0,0,50,0,0 +32,4,178109,1,9,1,11,1,0,0,0,0,43,0,0 +31,2,25955,4,5,0,10,3,3,0,0,0,35,0,0 +56,4,129762,5,10,2,0,0,0,1,0,0,35,0,0 +22,1,108506,9,11,0,7,0,3,0,0,0,75,0,0 +27,2,241607,0,13,0,9,5,0,0,0,0,50,0,0 +27,3,214385,1,9,0,0,0,1,1,0,0,40,0,0 +30,4,183000,3,14,1,3,1,0,0,0,0,45,0,0 +33,2,290763,5,10,0,5,0,0,1,0,0,40,0,0 +50,2,171924,0,13,1,3,1,0,0,0,0,43,0,1 +19,2,97189,5,10,0,5,3,0,1,0,0,22,0,0 +42,2,195096,1,9,1,5,1,0,0,4064,0,40,0,0 +37,3,329088,1,9,1,0,1,1,0,0,0,40,0,0 +26,2,58371,1,9,0,0,3,0,0,0,0,40,0,0 +43,2,35824,5,10,4,3,4,0,1,0,0,40,0,0 +47,2,173271,1,9,2,0,4,0,1,0,0,40,0,0 +26,2,391349,0,13,1,0,2,0,1,0,0,40,0,1 +24,2,86153,5,10,0,0,0,0,1,0,0,40,0,0 +34,2,295855,2,7,2,4,0,0,1,0,0,70,0,0 +33,1,327902,1,9,1,6,1,0,0,0,0,45,0,0 +35,2,285102,3,14,0,3,0,2,1,0,0,40,18,1 +57,2,178353,1,9,1,10,1,0,0,0,0,50,0,1 +45,2,28119,1,9,1,0,1,0,0,0,0,7,0,0 +42,2,197522,5,10,4,8,4,1,1,0,0,40,0,0 +25,2,108542,0,13,0,1,3,0,0,0,0,35,0,0 +56,2,179781,1,9,1,1,1,0,0,0,0,40,0,1 +25,2,126974,1,9,0,10,3,0,0,0,0,40,0,0 +23,2,180060,0,13,0,8,3,0,0,0,0,50,0,0 +35,4,38948,5,10,1,11,1,0,0,0,0,50,0,0 +28,2,271572,4,5,0,4,5,0,0,0,0,52,0,0 +41,2,177305,6,12,1,10,1,0,0,0,0,60,0,1 +26,2,238367,1,9,0,10,0,0,0,0,0,40,0,0 +37,2,172232,1,9,2,4,0,1,1,0,0,30,0,0 +22,2,153805,1,9,0,4,4,4,0,0,0,20,5,0 +30,2,26543,0,13,2,4,0,0,0,0,0,40,0,0 +42,2,109067,0,13,4,9,0,0,0,0,0,40,0,0 +38,2,213716,9,11,2,4,0,0,1,0,0,30,0,0 +27,2,185670,0,13,1,5,1,0,0,0,0,60,0,1 +43,3,233851,1,9,1,0,2,0,1,0,0,40,0,1 +41,2,193524,1,9,1,10,1,0,0,0,1485,40,0,0 +25,2,213385,1,9,0,0,0,0,0,0,0,40,0,0 +23,2,38238,0,13,0,4,3,0,0,0,0,40,0,0 +68,2,104438,0,13,1,3,1,0,0,0,0,40,38,1 +17,2,202344,12,6,0,4,3,0,0,0,0,25,0,0 +45,1,43434,0,13,0,1,0,0,1,0,0,40,0,0 +45,2,102147,9,11,2,1,0,0,0,0,0,40,0,1 +30,2,231826,5,10,1,5,1,0,0,0,0,40,0,1 +49,0,247378,5,10,2,3,0,0,1,0,0,20,0,0 +42,2,78765,5,10,1,10,1,0,0,3103,0,45,0,1 +29,2,184078,1,9,0,4,5,0,1,0,0,40,0,0 +21,4,102942,5,10,0,4,0,0,1,0,2001,40,0,0 +20,2,258430,5,10,0,4,3,0,1,0,0,19,0,0 +59,2,244554,2,7,2,4,0,1,1,0,0,35,0,0 +26,2,252565,12,6,1,10,1,0,0,0,0,55,0,0 +25,2,262778,3,14,0,4,0,0,1,0,0,37,0,0 +33,2,162572,1,9,1,6,1,0,0,0,0,55,0,1 +35,2,65706,1,9,2,4,4,0,1,0,0,40,0,0 +45,3,102569,1,9,1,10,1,0,0,0,0,40,0,1 +66,2,350498,5,10,1,5,1,0,0,0,0,28,0,0 +33,2,142383,6,12,0,5,0,4,0,0,0,36,0,0 +38,2,229236,1,9,1,6,1,4,0,0,0,40,5,0 +72,2,56559,1,9,1,5,1,0,0,0,0,12,0,0 +21,2,27049,5,10,0,0,3,0,1,0,0,12,0,0 +39,2,36376,5,10,1,7,1,0,0,0,0,60,0,0 +41,2,194360,1,9,1,10,1,0,0,0,1887,40,0,1 +22,2,246965,5,10,0,3,0,0,0,0,0,12,0,0 +49,5,191277,5,10,1,1,1,0,0,15024,0,50,0,1 +24,2,268525,0,13,0,0,0,0,0,0,0,32,0,0 +25,2,456604,2,7,1,8,1,0,0,0,0,40,0,0 +26,2,223464,5,10,1,0,1,0,0,0,0,40,0,0 +50,2,341797,1,9,2,10,0,0,0,0,0,40,0,0 +23,2,174461,1,9,0,4,0,0,1,0,0,40,0,0 +41,2,392167,12,6,2,5,0,0,0,0,0,48,0,0 +60,2,210064,1,9,2,11,0,0,0,0,0,40,0,0 +77,4,177550,0,13,1,0,1,0,0,3818,0,14,0,0 +62,2,143312,5,10,2,4,0,0,1,0,0,60,0,0 +22,2,326334,5,10,0,10,3,0,0,0,0,35,0,0 +37,2,179088,5,10,2,0,0,0,1,0,0,40,0,0 +17,2,207637,2,7,0,2,3,0,0,0,0,10,0,0 +52,3,37289,3,14,0,0,0,0,1,0,0,40,0,1 +31,2,36069,1,9,0,10,0,0,0,0,0,35,0,0 +23,3,53245,0,13,0,3,0,0,0,0,0,40,0,0 +27,5,399904,1,9,0,10,5,0,0,0,0,50,4,0 +38,5,199346,5,10,1,1,2,0,1,0,0,45,0,0 +23,2,343019,12,6,0,4,0,0,1,0,0,40,0,0 +22,0,232742,5,10,0,0,4,1,1,0,0,40,0,0 +61,1,390472,1,9,1,7,1,0,0,0,0,40,0,0 +55,2,290124,11,3,1,8,1,0,0,0,0,40,4,0 +23,2,242912,5,10,0,4,3,0,1,4650,0,40,0,0 +39,2,70240,11,3,3,4,4,2,1,0,0,40,11,0 +38,4,286405,8,16,1,1,1,0,0,0,1887,50,0,1 +25,2,153841,5,10,0,0,3,0,1,0,0,40,0,0 +25,2,137367,0,13,0,5,4,2,0,0,0,44,11,0 +66,2,313255,5,10,1,5,1,0,0,0,0,24,0,0 +30,2,100734,5,10,1,0,2,0,1,0,0,40,0,0 +32,2,248584,1,9,0,7,3,0,0,0,0,40,0,0 +43,2,60001,5,10,1,5,1,0,0,0,0,40,0,1 +18,2,335065,7,4,0,5,3,0,0,0,0,30,4,0 +20,2,219262,2,7,0,10,0,0,0,0,0,60,0,0 +20,2,186830,1,9,0,6,5,1,0,0,0,45,0,0 +34,2,226385,3,14,2,1,4,1,1,0,0,40,0,0 +33,2,609789,6,12,3,8,4,0,0,0,0,40,0,0 +40,2,307767,1,9,1,5,1,0,0,0,0,60,0,0 +33,2,217460,1,9,1,5,1,0,0,0,0,60,0,1 +30,2,104052,1,9,0,8,0,0,0,0,1741,42,0,0 +41,4,160893,13,1,0,2,3,0,1,0,0,30,0,0 +20,2,68358,5,10,0,0,3,0,1,0,0,12,0,0 +40,1,243636,0,13,1,5,1,0,0,0,0,50,0,1 +44,1,71269,0,13,2,1,0,0,0,0,0,40,0,0 +50,2,71898,11,3,1,8,2,2,1,0,0,35,11,0 +30,4,115040,1,9,1,2,5,0,0,0,0,25,0,0 +45,2,111994,5,10,2,5,0,0,0,4650,0,40,0,0 +25,2,210794,0,13,0,3,3,0,1,0,0,40,0,0 +25,2,570821,5,10,1,8,1,0,0,0,0,40,0,0 +55,0,169482,1,9,1,7,1,0,0,0,0,40,0,1 +26,2,63577,5,10,0,4,0,0,1,0,0,30,0,0 +22,2,208946,5,10,0,8,0,0,0,0,0,40,0,0 +41,1,26598,1,9,2,10,0,0,0,0,0,40,0,0 +21,2,189203,9,11,0,11,0,0,0,0,0,40,0,0 +39,2,183892,1,9,1,8,1,0,0,0,0,40,0,0 +18,2,188616,2,7,0,5,3,0,0,0,0,15,0,0 +60,2,116707,2,7,2,11,0,0,0,0,0,40,0,0 +22,2,99199,5,10,0,2,3,0,0,0,0,20,0,0 +39,4,183620,5,10,0,11,0,1,1,0,0,40,0,1 +34,2,110476,1,9,1,0,1,0,0,0,0,40,0,0 +53,2,150726,5,10,2,0,0,0,1,0,0,40,0,0 +27,2,214695,1,9,0,5,3,1,0,0,0,60,0,0 +37,2,172694,5,10,1,2,1,1,0,0,0,50,0,0 +25,2,344804,1,9,1,4,1,0,0,0,0,50,4,0 +33,2,319422,5,10,1,6,1,0,0,0,0,60,30,0 +34,0,327902,0,13,1,3,1,0,0,0,0,55,0,0 +35,2,438176,9,11,0,4,0,0,1,0,0,65,0,0 +51,2,197656,5,10,1,1,1,0,0,0,0,45,0,1 +33,2,219838,12,6,1,7,1,0,0,0,0,40,0,0 +57,1,35561,1,9,1,7,1,0,0,0,0,60,0,1 +56,2,190257,7,4,1,2,1,0,0,0,0,40,0,0 +34,2,156464,0,13,2,1,0,0,0,0,0,85,7,1 +36,2,65624,0,13,0,3,0,0,0,0,0,40,0,0 +46,2,201699,1,9,1,10,1,0,0,0,0,40,0,1 +55,2,349910,1,9,1,7,1,0,0,0,0,45,0,1 +88,1,187097,10,15,1,1,1,0,0,0,0,40,0,0 +60,1,264314,5,10,1,1,1,0,0,0,0,35,13,0 +40,1,282678,3,14,4,1,4,0,1,0,0,20,0,0 +21,2,188923,5,10,0,5,3,0,1,0,0,55,0,0 +46,2,114797,1,9,1,8,2,1,1,0,0,36,0,0 +56,2,245215,8,16,1,3,1,0,0,0,0,50,0,0 +36,1,36270,1,9,2,6,0,0,0,0,0,60,0,0 +67,1,107138,5,10,1,5,1,0,0,0,0,40,0,0 +35,2,77820,5,10,1,10,1,0,0,0,0,60,0,0 +20,2,39477,5,10,0,7,0,0,1,0,0,40,0,0 +34,2,58305,1,9,1,10,1,0,0,0,1573,40,0,0 +23,2,359759,1,9,0,10,3,2,0,0,0,40,11,0 +19,2,44797,5,10,0,7,0,0,1,0,0,15,0,0 +25,2,164488,5,10,0,2,3,0,0,0,0,40,0,0 +53,2,48413,1,9,1,10,1,0,0,0,0,40,0,0 +31,1,36592,1,9,1,7,1,0,0,0,0,91,0,0 +33,2,280923,7,4,1,2,1,0,0,0,0,40,4,0 +33,3,29617,5,10,2,4,0,1,0,0,0,40,0,0 +45,5,208802,10,15,2,3,4,0,0,25236,0,36,0,1 +35,2,189240,5,10,2,4,4,1,1,0,0,40,0,0 +36,2,181705,2,7,1,6,1,0,0,0,0,40,0,0 +36,2,147548,1,9,1,8,1,0,0,0,0,85,0,0 +51,1,306784,1,9,1,1,1,0,0,0,0,30,0,0 +45,0,190406,10,15,2,3,4,1,0,25236,0,36,0,1 +24,2,230229,11,3,0,8,5,0,0,0,0,40,4,0 +28,2,46987,9,11,0,9,3,0,1,2174,0,36,0,0 +63,2,301108,2,7,1,5,1,0,0,0,0,22,0,0 +35,2,263081,1,9,1,10,1,1,0,0,0,60,0,1 +25,1,37741,0,13,1,1,2,0,1,0,0,40,0,0 +36,2,115834,9,11,1,1,2,0,1,7298,0,55,0,1 +44,2,150076,1,9,0,4,0,0,0,0,0,30,0,0 +49,1,148254,1,9,2,7,0,0,1,0,0,28,0,0 +52,2,183611,15,2,1,7,1,0,0,0,0,40,0,0 +27,2,258768,0,13,0,2,0,1,0,0,0,40,0,0 +35,2,287658,5,10,0,0,4,1,0,0,0,40,0,0 +51,2,95946,0,13,1,3,1,0,0,0,0,50,0,1 +49,2,31267,7,4,1,10,1,0,0,0,0,40,0,0 +35,4,302149,0,13,1,5,1,2,0,7298,0,40,11,1 +28,2,250135,5,10,2,1,0,0,1,0,0,40,0,0 +37,2,176073,5,10,2,10,0,0,0,0,0,50,0,0 +65,2,23580,0,13,2,0,0,0,1,0,0,40,0,0 +24,2,163665,0,13,0,4,3,0,1,0,0,40,0,0 +30,3,43953,6,12,0,3,0,0,1,0,0,40,0,0 +38,2,144860,1,9,1,10,1,0,0,0,0,65,0,0 +58,1,61474,1,9,1,5,1,0,0,0,0,55,0,1 +57,2,141570,3,14,1,1,1,1,0,0,1977,40,0,1 +40,2,225660,0,13,1,1,2,0,1,0,0,45,0,1 +42,2,336891,5,10,2,0,0,1,1,0,0,40,0,0 +31,1,210164,1,9,1,1,1,0,0,0,0,40,0,1 +17,2,171080,14,8,0,2,3,0,0,0,0,20,0,0 +42,2,143342,5,10,2,8,0,0,1,0,0,40,0,0 +25,2,281627,3,14,0,3,0,0,1,0,0,40,0,0 +40,2,409922,5,10,1,3,1,0,0,7298,0,40,0,1 +29,2,157262,3,14,0,1,0,0,1,0,0,45,0,0 +31,2,144949,0,13,1,3,1,0,0,0,0,40,0,1 +71,4,303860,3,14,6,1,0,0,0,2050,0,20,0,0 +34,2,104293,0,13,0,0,3,0,1,0,0,40,0,0 +25,2,195481,1,9,1,0,5,0,0,0,0,40,0,0 +40,2,193995,1,9,1,4,1,0,0,0,0,30,0,0 +67,2,105216,5,10,6,0,0,0,1,0,0,25,0,0 +40,2,147206,1,9,1,10,1,0,0,0,0,40,0,1 +18,2,173585,1,9,0,5,3,1,1,0,0,18,0,0 +38,2,187870,0,13,1,3,1,0,0,7298,0,50,0,1 +38,2,248919,2,7,1,10,1,0,0,0,0,40,24,0 +42,2,280410,1,9,1,4,1,1,0,0,0,40,19,0 +36,0,170861,1,9,4,4,3,0,1,0,0,32,0,0 +23,1,409230,15,2,1,5,5,0,0,0,0,40,0,0 +56,2,340171,1,9,1,6,1,1,0,0,0,40,0,0 +36,2,41017,5,10,1,1,1,0,0,0,0,52,0,1 +22,2,416356,5,10,0,10,4,0,0,0,0,40,0,0 +39,2,261504,14,8,2,0,4,0,1,0,0,40,0,0 +36,0,205555,10,15,2,3,3,2,1,0,0,40,11,0 +44,2,245317,5,10,1,10,1,0,0,0,0,56,0,1 +38,2,153685,2,7,2,8,4,1,1,0,0,52,0,0 +37,2,99374,12,6,1,6,1,0,0,0,0,55,0,0 +57,4,139452,1,9,2,0,0,0,1,0,0,16,0,0 +54,2,227832,14,8,1,10,1,0,0,0,0,40,0,0 +18,1,213024,5,10,0,7,3,0,0,0,0,30,0,0 +63,1,33487,7,4,1,10,1,0,0,0,0,40,0,0 +38,5,187934,1,9,1,4,2,0,1,0,0,20,12,0 +26,2,421561,2,7,1,4,5,0,0,0,0,25,0,0 +40,2,109969,2,7,2,4,5,0,1,0,0,20,0,0 +20,2,116830,1,9,0,8,0,0,0,0,0,40,0,0 +39,2,117166,12,6,1,8,1,0,0,2635,0,40,0,0 +28,2,106951,1,9,0,2,0,0,0,0,0,42,0,0 +30,2,89625,5,10,1,3,2,2,1,0,0,5,0,1 +42,2,194537,1,9,2,8,4,0,1,0,0,40,0,0 +42,2,144002,1,9,2,6,0,0,0,0,0,50,0,0 +21,2,202214,1,9,0,8,0,0,1,0,0,40,0,0 +40,2,109762,5,10,2,10,4,0,0,0,0,40,0,0 +36,2,292570,2,7,0,8,4,0,1,0,0,40,0,0 +67,2,105252,5,10,2,0,0,0,0,7978,0,35,0,0 +65,2,94552,5,10,2,0,0,0,1,0,0,40,0,0 +50,4,46401,0,13,2,3,4,0,1,0,0,50,0,0 +18,2,151150,12,6,0,7,3,0,0,0,0,27,0,0 +31,2,197689,1,9,0,4,0,1,1,0,0,38,0,0 +36,5,180477,5,10,1,1,1,0,0,0,0,50,0,1 +20,2,181761,1,9,0,0,3,0,1,0,0,40,0,0 +34,2,381153,1,9,1,6,1,0,0,0,0,40,0,0 +24,2,165474,1,9,1,4,1,0,0,0,0,39,0,0 +38,3,190174,1,9,2,3,4,0,1,0,0,40,0,0 +17,2,295991,12,6,0,0,3,0,1,0,0,20,0,0 +52,6,198262,1,9,1,0,2,0,1,0,0,30,0,0 +34,2,190385,3,14,0,3,0,0,1,0,0,40,0,1 +49,2,262116,10,15,1,3,1,0,0,0,0,48,0,0 +45,2,178922,4,5,0,4,0,0,1,0,0,15,0,0 +46,2,192963,0,13,1,0,1,2,0,0,2415,35,11,1 +34,5,209538,0,13,1,5,1,0,0,0,0,50,0,1 +21,1,103277,14,8,1,0,2,0,1,4508,0,30,20,0 +17,2,216086,2,7,0,4,3,0,1,0,0,30,0,0 +23,2,636017,5,10,0,4,3,1,0,0,0,40,0,0 +32,2,155781,5,10,1,2,1,0,0,0,0,40,0,0 +22,2,136873,5,10,0,10,0,0,0,0,0,40,0,0 +48,0,122066,1,9,1,0,1,0,0,0,0,35,0,1 +27,0,346406,0,13,0,3,4,0,0,0,0,50,0,0 +43,2,117915,3,14,0,0,0,0,0,0,0,40,0,0 +44,2,19914,1,9,1,4,2,2,1,0,0,50,11,0 +55,2,255364,5,10,1,1,1,0,0,0,0,60,0,1 +31,2,703107,1,9,0,8,0,1,0,0,0,40,0,0 +34,2,62374,1,9,0,10,0,0,0,0,0,48,0,0 +34,2,96245,1,9,2,7,0,0,0,0,0,40,0,0 +37,2,348796,0,13,2,4,0,0,0,0,0,40,0,0 +21,2,136873,5,10,0,3,3,0,0,0,0,10,0,0 +35,2,388252,9,11,1,0,1,1,0,0,0,40,0,0 +28,2,47783,5,10,2,4,0,0,1,0,0,30,0,0 +62,2,194167,1,9,2,8,0,0,1,2174,0,40,0,0 +40,3,544792,5,10,1,7,1,0,0,0,0,40,0,0 +34,2,434463,0,13,0,8,0,0,1,0,0,39,0,0 +32,2,317219,3,14,0,3,0,0,1,0,1590,40,0,0 +70,2,221603,5,10,6,5,0,0,1,0,0,34,0,0 +23,2,233711,1,9,1,4,1,0,0,0,0,50,0,0 +30,2,111567,1,9,0,10,3,0,0,0,0,48,0,0 +57,2,79830,1,9,1,10,1,2,0,0,0,40,0,0 +34,1,192259,10,15,1,3,1,0,0,0,0,35,0,1 +24,2,239663,12,6,1,4,1,0,0,0,0,40,4,0 +41,4,34987,0,13,1,3,1,0,0,0,0,35,0,1 +38,1,409189,7,4,1,5,1,0,0,0,0,40,4,0 +48,2,135525,6,12,2,0,0,0,1,0,0,40,0,0 +43,2,152159,0,13,1,8,1,1,0,0,0,40,0,0 +18,2,141363,5,10,0,4,0,0,1,0,0,40,0,0 +35,2,214816,0,13,1,1,1,0,0,0,0,40,0,1 +42,2,42907,1,9,2,8,4,0,0,0,0,48,0,0 +30,2,161815,5,10,2,4,4,0,1,0,0,35,0,0 +42,2,127314,0,13,1,9,1,0,0,0,0,45,0,1 +48,2,395368,5,10,2,2,5,1,0,0,0,40,0,0 +70,2,184176,1,9,2,4,0,0,1,0,0,28,0,0 +37,2,112660,4,5,2,10,3,0,0,0,0,35,0,0 +51,2,183709,9,11,4,3,4,0,1,0,0,40,0,0 +35,2,434114,1,9,1,2,1,0,0,0,0,40,4,0 +59,1,165315,0,13,1,3,1,0,0,99999,0,43,0,1 +57,2,190997,0,13,1,1,1,0,0,0,0,50,0,1 +26,2,335533,1,9,0,10,3,0,0,0,0,20,0,0 +26,2,176146,11,3,4,10,0,4,0,0,0,35,4,0 +19,2,272063,1,9,0,2,3,0,0,0,0,35,0,0 +34,2,169564,1,9,2,8,4,0,1,0,0,40,0,0 +56,2,188856,0,13,0,1,0,0,1,8614,0,55,0,1 +25,2,69847,0,13,0,0,3,2,1,0,0,40,0,0 +46,1,198759,10,15,1,3,1,0,0,0,2415,80,0,1 +22,2,175431,1,9,1,4,1,0,0,0,0,20,0,0 +72,1,284120,5,10,1,5,1,0,0,0,0,40,0,0 +36,2,109133,1,9,1,10,1,0,0,0,0,40,0,0 +28,2,167336,1,9,1,1,2,0,1,0,0,45,0,1 +37,2,282951,1,9,1,3,1,0,0,0,0,40,0,0 +42,2,303155,0,13,1,1,1,0,0,0,0,50,0,1 +44,2,261899,5,10,1,8,1,0,0,0,0,44,0,0 +33,2,168030,5,10,1,3,2,0,1,7298,0,21,0,1 +53,0,71417,8,16,1,3,1,0,0,0,0,40,0,0 +28,2,239130,5,10,0,1,0,0,0,0,0,50,0,0 +69,2,200560,0,13,1,2,1,0,0,0,0,20,0,0 +20,2,157541,5,10,0,4,3,0,0,0,0,27,0,0 +33,2,255004,5,10,0,5,0,0,0,0,0,50,0,0 +47,2,230136,1,9,1,4,1,1,0,0,0,60,0,1 +50,4,124963,1,9,1,10,1,0,0,0,1977,35,0,1 +22,2,39615,5,10,0,3,0,0,0,0,0,45,0,0 +20,2,47678,1,9,0,10,3,0,0,0,0,40,0,0 +42,4,281315,0,13,0,3,0,0,0,0,0,50,0,0 +23,2,176123,1,9,0,9,5,2,0,0,0,40,36,0 +32,2,235862,5,10,2,1,0,0,1,0,0,45,0,0 +41,2,142579,0,13,6,5,4,1,0,0,0,50,0,0 +35,2,38294,1,9,1,10,1,0,0,0,0,40,0,0 +40,2,111483,3,14,1,1,1,0,0,0,0,50,0,1 +25,2,189850,5,10,0,8,3,1,0,0,0,40,0,0 +34,0,145874,8,16,1,9,1,2,0,0,0,20,26,0 +23,2,139012,9,11,0,6,3,2,0,0,0,40,27,0 +30,4,211654,3,14,1,3,1,0,0,0,0,40,0,1 +55,4,173090,3,14,6,3,4,0,1,0,0,45,0,0 +26,2,104834,3,14,0,3,0,0,1,0,1669,40,0,0 +39,2,32146,3,14,0,3,0,0,0,0,0,60,0,0 +52,2,282674,1,9,1,6,1,3,0,0,0,40,0,1 +42,2,190403,5,10,4,1,0,0,0,0,0,60,8,0 +25,2,247025,0,13,0,5,0,0,0,3325,0,48,0,0 +27,2,198258,0,13,0,5,3,0,0,0,0,35,0,0 +30,1,172748,7,4,0,10,3,0,0,0,0,40,0,0 +23,0,287988,0,13,0,3,0,0,0,10520,0,40,0,1 +47,1,122307,0,13,1,5,1,0,0,0,1887,40,0,1 +18,2,170183,1,9,0,4,3,0,1,0,0,20,0,0 +52,2,150812,5,10,2,0,4,0,1,0,0,35,0,0 +24,2,241185,1,9,0,5,0,0,1,0,0,48,0,0 +58,5,174864,1,9,1,5,1,0,0,0,0,55,0,1 +35,2,30529,1,9,0,0,0,0,0,0,0,40,0,0 +31,2,301637,9,11,0,7,3,0,0,0,0,40,0,0 +46,2,423222,5,10,1,10,1,0,0,3103,0,60,0,1 +43,2,214781,3,14,1,3,1,0,0,5178,0,40,0,1 +21,2,242912,1,9,0,4,5,0,1,0,0,35,0,0 +52,2,191529,5,10,1,1,1,0,0,0,1740,60,0,0 +24,2,117363,0,13,0,5,3,0,1,0,0,35,0,0 +22,2,333158,1,9,0,8,0,0,1,0,0,48,0,0 +39,2,193260,5,10,1,0,1,2,0,0,0,25,4,0 +34,0,278378,1,9,1,6,1,1,0,0,0,40,0,0 +58,2,111394,0,13,1,3,1,0,0,0,0,40,0,1 +26,2,102476,0,13,0,0,3,0,0,0,0,25,0,0 +29,2,26451,1,9,1,2,1,3,0,0,0,40,0,0 +28,2,210945,6,12,1,0,2,1,1,0,0,35,19,0 +62,4,115023,5,10,1,8,1,0,0,0,0,40,0,0 +54,2,53833,11,3,1,6,1,0,0,0,0,40,0,1 +36,2,150057,5,10,1,1,1,0,0,0,0,65,0,0 +18,2,128086,14,8,0,2,3,0,0,0,0,18,0,0 +25,2,28473,9,11,1,10,1,0,0,0,0,40,0,0 +48,2,155509,5,10,0,10,0,1,1,0,0,40,0,0 +30,2,171889,10,15,0,9,3,0,1,0,0,24,0,0 +41,4,185057,1,9,2,1,4,0,1,0,0,40,0,0 +59,2,277034,1,9,2,9,4,0,0,0,0,60,0,1 +36,2,166606,2,7,1,10,1,0,0,0,0,40,0,0 +30,2,97453,1,9,2,5,4,0,1,0,0,54,0,0 +27,2,136094,1,9,0,2,3,0,0,0,0,40,0,0 +30,2,182771,0,13,0,4,0,2,0,0,0,15,26,0 +47,2,418961,9,11,2,5,4,1,1,0,0,25,0,0 +39,2,106961,1,9,1,5,1,0,0,0,0,40,0,1 +31,2,81846,1,9,1,0,1,2,0,0,0,40,0,0 +44,2,105936,6,12,2,0,4,0,1,0,0,40,0,0 +37,2,36425,1,9,0,4,0,0,1,0,0,40,0,0 +28,2,595088,5,10,1,10,1,0,0,0,0,63,0,0 +38,2,149018,1,9,1,10,1,0,0,0,0,40,0,0 +26,2,229613,1,9,2,8,0,0,1,0,0,40,0,0 +44,2,33521,5,10,1,1,1,0,0,0,0,40,0,1 +40,2,70539,5,10,1,5,1,0,0,4386,0,50,0,0 +53,0,105728,1,9,1,4,2,3,1,0,0,28,0,1 +31,2,193215,5,10,1,1,3,0,0,0,0,50,0,0 +18,2,137363,1,9,0,0,3,0,1,0,0,40,0,0 +43,5,104892,1,9,1,7,1,0,0,0,0,45,0,0 +30,2,149427,1,9,0,10,3,0,0,0,0,35,0,0 +19,0,176634,1,9,0,0,3,0,1,0,0,40,0,0 +36,2,183279,1,9,1,10,1,0,0,0,0,40,0,0 +25,2,202091,3,14,0,3,3,0,1,0,0,60,0,0 +36,2,123151,2,7,1,10,1,0,0,0,0,60,0,0 +22,2,168187,5,10,0,4,4,0,1,0,0,50,0,0 +42,3,33521,0,13,1,3,1,0,0,0,0,40,0,0 +33,0,243678,5,10,0,9,0,0,1,0,0,40,0,0 +38,2,164898,1,9,0,10,0,0,0,0,0,40,0,0 +33,0,290614,1,9,1,4,1,0,0,0,0,40,0,0 +52,1,199265,1,9,2,10,0,1,0,0,0,40,0,0 +30,2,207668,5,10,0,5,3,0,0,0,0,30,0,0 +18,0,30687,5,10,0,0,3,0,0,0,0,10,0,0 +17,2,438996,12,6,0,4,5,0,0,0,0,40,4,0 +48,2,152915,5,10,0,0,0,0,1,0,0,40,0,0 +46,4,297759,5,10,2,9,0,0,1,0,0,40,0,0 +55,2,171242,1,9,2,1,0,0,0,0,0,60,0,1 +28,2,206088,0,13,0,5,0,0,1,0,0,40,0,0 +33,2,182792,1,9,2,4,4,0,1,0,0,40,0,0 +44,2,167725,1,9,1,5,1,0,0,0,0,24,0,0 +43,2,160674,1,9,2,1,4,0,1,0,0,40,0,0 +42,2,194710,5,10,0,1,0,0,1,0,0,40,0,0 +39,2,255027,9,11,2,1,4,1,1,0,0,40,0,0 +23,2,204641,12,6,0,2,4,0,0,0,0,50,0,0 +20,0,177787,5,10,0,4,3,0,1,0,0,20,0,0 +29,2,54932,5,10,2,10,4,0,0,0,0,35,0,1 +54,1,91506,5,10,1,5,1,0,0,0,0,65,0,0 +34,2,198634,9,11,0,0,0,0,1,0,0,40,0,0 +30,2,227146,0,13,1,5,1,0,0,0,0,40,0,1 +59,2,135647,2,7,1,5,1,0,0,0,0,60,0,0 +40,2,55508,7,4,2,7,4,0,1,0,0,40,0,0 +37,2,174912,1,9,4,10,3,0,0,0,0,40,0,0 +45,2,175925,1,9,1,10,1,0,0,0,0,40,0,0 +55,1,157486,3,14,1,3,1,0,0,7298,0,40,0,1 +49,4,329144,5,10,1,11,1,0,0,0,0,44,0,1 +49,1,102318,6,12,2,1,0,0,0,0,0,25,0,0 +30,3,266463,1,9,1,0,1,0,0,0,0,40,0,1 +56,3,107314,5,10,2,0,0,1,1,0,0,40,0,0 +29,2,114158,5,10,0,3,0,0,1,0,0,40,0,0 +33,2,124052,1,9,1,10,1,0,0,0,0,40,0,0 +25,2,144301,5,10,0,5,3,0,0,0,0,42,0,0 +28,2,176683,9,11,1,9,1,0,0,0,0,70,0,1 +23,2,234663,1,9,0,8,0,0,0,0,0,40,0,0 +39,1,178948,1,9,1,7,2,0,1,0,0,50,0,0 +37,1,607848,0,13,1,9,1,0,0,0,0,40,0,1 +39,2,202937,3,14,0,3,0,0,1,0,0,40,0,1 +32,3,83413,0,13,1,0,1,0,0,0,0,35,0,1 +26,2,212798,0,13,0,1,0,0,1,0,0,45,0,0 +57,3,192258,5,10,2,0,3,0,0,0,0,40,0,0 +36,2,112497,4,5,1,5,3,0,0,0,0,50,0,1 +30,2,97521,0,13,1,5,1,0,0,0,0,50,0,1 +27,2,160972,1,9,1,10,1,0,0,0,0,50,0,0 +21,2,322931,5,10,0,10,0,0,0,0,0,55,0,0 +22,2,403519,1,9,1,8,1,0,0,0,0,40,0,0 +43,4,330174,1,9,1,10,1,0,0,0,0,40,0,0 +20,2,278155,5,10,0,0,3,0,0,0,0,40,0,0 +30,2,39054,1,9,1,1,1,0,0,0,0,65,0,1 +57,2,170287,3,14,1,9,1,0,0,0,0,40,0,1 +42,2,336643,9,11,4,3,4,0,1,0,0,40,0,0 +29,2,264166,9,11,2,4,4,0,1,0,0,45,13,0 +44,4,433705,1,9,1,11,1,0,0,0,0,52,0,1 +28,2,27044,6,12,2,1,0,0,1,0,0,43,0,0 +42,2,165599,1,9,1,2,1,0,0,0,0,40,0,1 +26,2,159759,0,13,0,4,3,0,0,0,0,40,0,0 +29,2,385092,5,10,2,3,3,0,1,0,0,36,0,0 +42,2,188808,0,13,2,0,4,0,0,0,0,30,0,0 +30,2,167476,1,9,1,6,1,0,0,0,0,50,0,0 +21,0,194096,5,10,0,4,3,0,1,0,0,10,0,0 +59,2,182460,1,9,1,1,1,0,0,0,0,30,0,1 +56,2,232139,1,9,2,6,0,0,0,0,0,40,0,0 +39,2,341741,13,1,0,4,0,0,1,0,0,12,0,0 +21,2,206008,5,10,0,0,3,1,0,0,0,50,0,0 +48,2,344415,0,13,3,3,0,0,0,0,0,37,0,1 +35,0,372130,1,9,1,11,1,1,0,0,0,40,0,0 +43,2,27766,0,13,4,1,4,0,0,0,0,60,0,1 +23,2,140764,9,11,0,4,3,0,1,0,0,15,0,0 +41,2,22201,0,13,1,1,1,2,0,0,0,40,28,1 +35,5,187046,3,14,1,0,1,0,0,0,0,50,0,0 +22,2,137591,5,10,0,5,3,0,0,0,0,35,0,0 +53,2,274276,1,9,2,0,0,0,1,0,0,40,0,0 +42,2,341757,5,10,0,8,0,0,1,0,0,40,0,0 +36,2,218542,1,9,4,0,4,1,1,0,0,40,0,0 +44,4,190020,0,13,1,3,1,0,0,0,0,50,0,0 +27,2,221436,0,13,1,0,2,0,1,0,0,40,1,1 +39,1,52187,1,9,1,1,1,0,0,0,0,40,0,0 +59,2,158776,4,5,1,8,1,0,0,0,0,40,0,0 +34,4,51543,5,10,0,4,0,0,0,0,0,48,0,0 +17,2,146329,14,8,0,5,3,0,1,0,0,23,0,0 +31,2,397467,1,9,1,10,1,0,0,0,0,40,0,0 +59,2,105592,5,10,1,1,1,0,0,0,0,12,0,0 +39,2,78171,5,10,3,0,4,3,1,0,0,40,0,0 +46,0,55377,0,13,1,3,1,1,0,0,0,40,0,1 +31,2,258932,1,9,3,4,0,0,1,0,0,80,25,0 +27,2,38606,0,13,0,5,0,0,0,0,1504,45,0,0 +18,2,219841,2,7,0,2,3,0,0,0,0,12,0,0 +46,2,156926,5,10,1,1,1,0,0,0,0,60,0,1 +55,2,160362,0,13,1,0,1,0,0,0,0,40,0,1 +48,2,192161,0,13,2,2,0,0,0,0,0,43,0,0 +53,2,208570,1,9,1,5,2,0,1,0,0,26,0,0 +44,1,182771,0,13,1,1,1,2,0,0,0,48,27,1 +43,2,151089,5,10,1,6,1,0,0,0,0,50,0,0 +50,2,163002,1,9,4,0,5,0,1,0,0,40,0,0 +56,2,155657,7,4,2,8,0,0,1,0,0,20,29,0 +27,2,217530,1,9,1,8,1,0,0,0,0,40,4,0 +20,2,244406,1,9,0,0,3,1,1,0,0,40,0,0 +18,4,152182,12,6,0,11,3,0,1,0,0,6,0,0 +34,2,55717,1,9,1,10,1,0,0,0,1848,50,0,1 +38,2,201454,5,10,2,0,4,0,1,0,0,40,0,0 +40,5,144371,0,13,1,10,1,0,0,0,0,15,0,0 +55,2,277034,5,10,2,11,0,0,0,0,0,40,0,0 +35,1,462832,1,9,1,10,2,1,1,0,0,40,0,1 +26,2,200681,1,9,0,8,3,0,0,0,0,40,0,0 +54,0,119565,0,13,1,1,1,0,0,0,0,40,5,1 +22,2,192017,1,9,0,0,3,0,0,0,0,40,0,0 +52,4,84808,1,9,2,0,4,1,1,0,0,40,0,0 +33,2,100154,12,6,4,2,0,0,0,0,0,40,0,0 +42,2,169383,3,14,1,3,1,0,0,0,0,40,0,1 +19,6,43887,1,9,0,7,3,0,0,0,0,10,0,0 +45,2,54260,5,10,2,10,4,0,0,0,0,99,0,0 +53,1,159876,1,9,1,10,1,1,0,3103,0,72,0,0 +46,2,160474,1,9,2,0,4,0,1,0,1590,43,0,0 +25,2,476334,5,10,1,10,1,0,0,0,0,40,0,0 +90,2,52386,0,13,0,3,0,2,0,0,0,40,0,0 +33,2,83671,1,9,0,5,3,1,1,0,0,40,0,0 +45,2,172960,5,10,2,11,0,0,0,0,0,70,0,0 +47,2,191957,1,9,1,5,1,1,0,0,0,40,0,1 +38,4,40955,3,14,0,3,0,0,0,0,0,43,0,0 +37,2,175643,1,9,1,7,1,0,0,0,0,30,0,0 +53,0,197184,3,14,1,1,1,0,0,0,0,70,0,1 +56,2,187295,0,13,1,3,1,0,0,0,0,40,0,1 +18,2,40822,2,7,0,2,3,0,0,0,0,15,0,0 +50,2,240496,5,10,2,9,0,0,1,0,0,36,0,0 +26,2,51961,0,13,0,0,0,1,0,0,0,20,0,0 +36,2,174887,5,10,0,9,0,0,1,0,0,40,0,0 +37,2,95855,2,7,2,2,0,0,1,0,0,40,0,0 +32,2,362259,0,13,0,1,0,0,1,0,0,40,0,0 +38,1,30916,6,12,1,5,1,0,0,0,0,60,0,0 +62,2,153148,1,9,2,4,0,0,1,0,0,84,0,0 +46,2,167915,1,9,1,10,1,0,0,0,0,40,0,0 +41,2,45156,1,9,0,8,0,0,0,2174,0,41,0,0 +37,2,98776,1,9,1,7,1,0,0,0,0,15,0,0 +38,2,183800,6,12,1,0,1,0,0,0,0,40,0,0 +35,2,54595,14,8,0,5,0,1,1,0,0,40,0,0 +34,2,79637,0,13,0,1,3,3,1,0,0,40,0,0 +50,2,126566,1,9,1,2,1,1,0,0,0,40,0,0 +28,2,233796,5,10,1,0,2,0,1,7298,0,32,0,1 +67,4,191800,0,13,2,0,4,1,1,6360,0,35,0,0 +34,1,527162,5,10,1,1,1,0,0,0,0,30,0,0 +19,2,139466,5,10,0,5,3,0,1,0,0,25,0,0 +23,2,64520,1,9,0,0,3,0,0,0,0,30,0,0 +50,2,97741,1,9,1,8,1,0,0,0,0,45,0,1 +45,4,160173,3,14,1,1,1,0,0,7688,0,50,0,1 +17,2,350995,14,8,0,4,3,0,0,0,0,16,0,0 +25,2,143267,1,9,0,0,0,0,1,0,0,48,0,0 +21,2,346341,5,10,0,3,0,0,1,0,0,40,0,0 +50,2,172175,10,15,1,3,1,0,0,0,0,50,0,1 +17,2,153035,12,6,0,5,3,0,1,0,0,20,0,0 +63,2,200127,1,9,6,0,0,0,1,0,0,40,0,0 +31,4,204470,3,14,0,3,0,0,0,0,0,43,0,0 +45,2,353012,1,9,2,6,0,0,0,0,0,40,0,0 +25,2,194342,1,9,0,8,3,0,0,0,0,40,0,0 +20,2,57898,14,8,0,7,3,0,0,0,0,40,0,0 +42,2,269028,8,16,1,3,1,0,0,0,0,40,23,0 +56,2,83922,5,10,1,10,1,0,0,0,0,40,0,1 +47,2,160647,1,9,0,7,4,0,1,0,0,46,0,0 +69,2,125437,1,9,2,4,0,0,1,0,0,32,0,0 +42,2,246011,0,13,1,3,2,0,1,0,0,55,0,0 +19,2,216937,1,9,0,2,5,4,1,0,0,60,24,0 +56,1,66356,5,10,1,7,1,0,0,0,0,50,0,0 +33,2,154981,0,13,1,0,1,0,0,0,1902,50,0,1 +61,3,197311,3,14,6,3,4,0,1,0,0,40,0,0 +38,2,301743,1,9,2,4,0,0,1,0,0,35,0,0 +50,1,401118,1,9,1,10,1,0,0,99999,0,50,0,1 +39,2,98776,5,10,2,1,0,0,0,0,0,50,0,1 +35,1,32528,1,9,1,6,1,0,0,0,0,50,0,0 +27,2,177119,5,10,2,0,4,0,1,0,0,44,0,0 +40,5,193524,5,10,1,7,1,0,0,0,0,40,0,1 +59,0,192258,8,16,1,3,1,0,0,0,0,40,0,1 +42,3,214838,1,9,1,9,1,0,0,0,0,30,0,1 +59,2,176011,5,10,4,0,4,0,0,0,0,40,0,0 +54,5,147239,8,16,1,3,1,0,0,0,0,60,0,1 +38,2,159179,5,10,1,1,1,0,0,0,1902,50,0,1 +53,2,155963,0,13,1,5,1,0,0,0,0,30,0,0 +20,2,360457,5,10,0,1,3,0,1,0,0,30,0,0 +54,3,114674,5,10,1,1,1,0,0,0,0,40,0,1 +41,1,95708,3,14,0,1,0,2,0,0,0,45,0,1 +33,4,100734,1,9,2,9,0,0,1,0,0,55,0,0 +35,2,188972,1,9,6,1,4,0,1,0,0,30,0,0 +22,2,162667,1,9,0,2,3,0,0,0,0,50,20,0 +45,1,28497,0,13,1,7,1,0,0,0,1485,70,0,1 +29,2,180758,3,14,0,3,0,0,0,0,0,40,0,0 +56,1,346635,3,14,2,5,4,0,1,0,2339,60,0,0 +23,2,46645,0,13,0,3,0,0,1,0,0,25,0,0 +30,2,203258,1,9,0,4,0,0,1,0,0,35,0,0 +17,2,134480,2,7,0,13,3,0,1,0,0,25,0,0 +35,4,85548,5,10,4,0,4,3,1,0,0,40,0,0 +25,2,195994,15,2,0,13,0,0,1,0,0,40,24,0 +42,0,148316,9,11,1,11,1,0,0,0,0,40,0,1 +42,2,227466,1,9,0,4,5,1,0,0,0,40,0,0 +19,2,68552,1,9,0,2,3,0,0,0,0,30,0,0 +32,2,252257,6,12,0,0,0,0,1,0,0,45,0,0 +44,2,30126,5,10,2,0,4,0,1,0,0,40,0,0 +53,2,304353,5,10,1,10,1,0,0,0,0,36,0,1 +47,1,171968,0,13,6,1,4,2,1,0,0,60,15,0 +24,2,205839,5,10,0,2,3,0,0,0,0,40,0,0 +30,0,218640,5,10,1,3,2,1,1,0,0,40,0,1 +42,2,150568,1,9,4,5,4,0,1,0,0,45,0,0 +19,2,382738,1,9,0,4,3,1,1,0,0,40,0,0 +37,1,138940,2,7,0,7,3,0,0,0,0,37,0,0 +26,1,258306,12,6,1,7,1,0,0,0,0,99,0,0 +25,4,190107,1,9,0,7,3,0,0,0,1719,16,0,0 +52,2,152373,5,10,1,5,1,0,0,0,0,40,0,0 +50,4,141875,1,9,1,6,1,0,0,0,0,40,0,0 +32,2,157289,1,9,3,2,5,0,0,0,0,40,0,0 +37,2,184498,1,9,1,6,1,0,0,0,0,40,0,0 +42,4,109684,3,14,0,3,0,0,1,0,1741,35,0,0 +47,2,199832,1,9,1,10,1,0,0,0,0,40,0,0 +47,2,23545,5,10,1,2,1,0,0,0,0,40,0,0 +28,2,175710,0,13,1,1,2,0,1,0,0,40,0,1 +27,2,52028,0,13,1,1,2,2,1,0,0,40,27,0 +61,1,315977,1,9,1,6,1,1,0,0,0,40,0,0 +47,2,202322,11,3,1,2,1,0,0,0,0,40,4,0 +30,2,251825,6,12,0,8,4,1,1,0,0,40,0,0 +54,2,202115,1,9,1,8,2,0,1,0,0,40,0,1 +56,4,216824,10,15,1,0,1,2,0,0,0,40,11,1 +69,2,145656,5,10,6,0,0,0,1,0,0,24,0,0 +30,2,137076,1,9,1,6,1,0,0,0,0,40,0,1 +36,2,152621,5,10,1,10,1,0,0,0,0,40,8,1 +42,1,27242,2,7,1,7,1,0,0,0,0,60,0,0 +45,3,358242,0,13,1,3,1,0,0,0,0,45,0,1 +39,2,184117,0,13,1,3,2,0,1,7688,0,20,0,1 +26,2,300290,2,7,2,0,3,0,1,0,0,40,0,0 +28,4,149991,0,13,1,11,1,1,0,0,0,42,0,1 +31,2,189759,3,14,1,5,1,0,0,0,0,40,0,1 +32,2,339482,11,3,4,7,5,0,0,0,0,60,4,0 +51,2,100933,1,9,0,1,5,0,1,0,0,40,0,0 +29,2,354558,1,9,1,5,1,0,0,0,0,60,0,0 +38,4,162613,3,14,0,3,0,0,1,0,2258,60,0,0 +64,2,285052,5,10,6,1,0,0,1,0,0,10,0,0 +26,0,175044,5,10,0,11,3,0,0,0,0,40,0,0 +68,2,45508,11,3,3,5,0,0,0,0,0,22,0,0 +32,2,173351,1,9,1,10,1,0,0,0,0,48,0,0 +29,2,173611,5,10,0,5,3,0,1,0,0,40,0,0 +21,2,143062,1,9,0,8,3,0,0,0,0,40,0,0 +26,2,377754,1,9,0,8,0,0,0,0,0,40,0,0 +52,2,152373,1,9,1,8,1,0,0,2105,0,40,0,0 +31,2,193477,1,9,1,10,1,0,0,0,0,55,0,0 +29,4,277323,1,9,0,11,4,0,0,0,0,45,0,0 +19,2,69182,5,10,0,4,3,0,1,0,0,27,0,0 +51,2,219599,1,9,1,8,2,0,1,0,0,40,0,0 +45,2,129371,4,5,4,4,4,4,1,0,0,40,33,0 +20,2,470875,1,9,1,5,3,1,0,0,0,32,0,0 +40,2,201734,5,10,0,2,0,0,0,0,0,48,0,0 +43,2,58447,8,16,1,3,1,0,0,99999,0,55,0,1 +52,4,91689,5,10,1,6,1,0,0,0,0,40,0,0 +46,2,166546,5,10,2,0,0,0,1,0,0,24,0,0 +24,2,293324,1,9,1,8,1,0,0,0,0,40,0,0 +20,2,219262,4,5,0,6,0,0,0,0,0,50,0,0 +38,1,403391,0,13,1,1,1,0,0,0,0,60,0,0 +44,2,367749,0,13,0,3,0,0,1,0,0,45,4,0 +24,2,128487,0,13,0,0,0,0,1,0,0,40,0,0 +32,0,111363,10,15,1,3,1,0,0,0,0,75,0,1 +49,2,240869,7,4,0,4,5,0,0,0,0,35,0,0 +36,2,163278,3,14,0,3,0,0,1,0,0,40,0,0 +31,2,416415,1,9,4,0,0,0,0,0,0,45,0,0 +46,2,251243,5,10,2,1,0,0,1,0,0,40,0,0 +46,4,167159,5,10,1,11,1,0,0,0,0,70,0,1 +29,2,161857,1,9,3,4,0,4,1,0,0,40,13,0 +37,2,160035,1,9,1,10,1,0,0,0,0,40,0,0 +28,1,112403,0,13,0,11,3,0,0,0,0,40,0,0 +48,2,238726,1,9,6,0,4,0,1,0,0,40,0,0 +52,2,164530,2,7,2,8,0,1,1,0,0,20,0,0 +19,2,456572,1,9,0,7,5,0,0,0,0,35,0,0 +31,1,177675,0,13,1,3,1,0,0,0,0,40,0,1 +47,2,246739,0,13,1,1,1,0,0,99999,0,55,0,1 +37,2,102953,1,9,1,10,1,0,0,0,0,40,0,0 +46,2,155489,6,12,1,10,1,0,0,0,0,44,0,1 +51,1,156802,1,9,1,7,1,0,0,3103,0,60,0,1 +50,2,168212,3,14,1,10,1,0,0,0,1902,45,0,1 +38,2,331395,7,4,1,7,1,0,0,3942,0,84,20,0 +40,4,261497,1,9,1,10,1,1,0,0,0,35,0,0 +58,2,365511,5,10,2,8,0,4,0,0,0,40,4,0 +36,2,187999,1,9,1,10,1,0,0,0,0,40,0,1 +26,4,190350,0,13,0,3,3,1,1,0,0,35,0,0 +49,2,168262,12,6,2,4,0,0,0,0,0,48,0,0 +39,0,122011,3,14,1,3,2,0,1,5178,0,38,0,1 +46,2,165953,0,13,1,0,1,0,0,0,0,45,0,1 +26,2,375980,1,9,4,5,4,1,1,0,0,37,0,0 +40,3,406463,3,14,0,9,0,0,1,0,0,40,0,0 +53,0,231472,8,16,1,3,1,0,0,0,0,40,0,1 +60,1,78913,5,10,1,1,1,0,0,0,0,50,0,0 +28,2,69107,1,9,1,2,1,1,0,0,0,40,0,0 +31,2,169002,1,9,1,2,1,0,0,0,0,55,0,0 +45,2,229967,1,9,2,1,0,0,0,13550,0,50,0,1 +34,2,422836,1,9,2,3,4,0,0,0,0,40,4,0 +27,0,230922,3,14,0,1,0,0,0,0,0,40,32,0 +40,2,195892,5,10,2,6,0,1,1,0,0,40,0,0 +68,2,163346,1,9,6,8,0,0,1,0,0,32,0,0 +51,2,82566,1,9,1,10,1,0,0,0,0,50,0,0 +55,2,86505,1,9,1,9,1,0,0,0,0,20,0,0 +43,2,178780,6,12,1,1,1,0,0,0,0,45,0,1 +23,0,173945,0,13,0,3,3,0,1,0,0,27,0,0 +48,2,176810,1,9,1,4,1,0,0,0,0,40,0,0 +42,5,23813,5,10,1,3,1,3,0,2885,0,30,0,0 +51,5,210736,1,9,0,1,0,0,0,10520,0,40,0,1 +32,2,343789,1,9,1,8,1,0,0,5013,0,55,0,0 +34,2,113838,5,10,1,5,1,0,0,0,0,45,0,1 +31,4,121055,1,9,1,10,1,0,0,0,0,70,0,1 +17,2,566049,12,6,0,4,3,0,0,0,0,8,0,0 +37,2,67433,1,9,1,0,2,0,1,0,0,40,0,1 +26,2,39014,14,8,1,13,2,4,1,0,0,40,21,0 +17,2,51939,2,7,0,5,3,0,1,0,0,15,0,0 +34,2,100669,0,13,1,6,1,2,0,0,0,40,0,1 +46,2,155659,2,7,1,10,1,0,0,0,1902,40,0,1 +41,4,32185,3,14,1,1,1,0,0,0,0,40,0,1 +59,2,138370,12,6,3,11,0,2,0,0,0,40,3,0 +50,1,172281,1,9,1,1,1,0,0,7688,0,50,0,1 +46,2,180505,1,9,1,8,1,1,0,0,0,40,0,0 +45,2,168262,3,14,2,3,0,0,0,0,0,40,0,0 +27,2,85126,1,9,0,8,0,0,1,0,0,40,0,0 +31,2,113838,0,13,1,3,1,0,0,0,0,50,0,0 +32,2,197457,1,9,2,9,4,0,1,1471,0,38,0,0 +28,2,197905,1,9,1,10,1,0,0,0,0,50,0,0 +32,2,316589,0,13,1,1,1,0,0,0,0,40,0,1 +36,2,336367,6,12,0,1,4,0,0,0,0,50,0,0 +39,5,143123,9,11,1,10,1,0,0,0,2415,40,0,1 +23,2,209955,1,9,0,10,0,0,0,0,0,40,0,0 +44,2,210013,1,9,1,6,1,0,0,0,0,40,0,1 +37,2,224541,5,10,1,6,1,0,0,0,0,40,0,0 +36,2,275653,7,4,3,8,4,0,1,2977,0,40,5,0 +45,2,88061,2,7,3,8,4,2,1,0,0,40,27,0 +43,3,195897,1,9,1,7,1,0,0,7298,0,40,0,1 +49,2,43206,10,15,0,3,0,0,1,0,0,55,0,1 +37,2,202950,1,9,1,6,1,0,0,0,0,40,0,1 +26,2,154093,1,9,0,6,3,1,0,0,0,40,0,0 +34,2,112115,10,15,1,3,1,0,0,0,1977,55,0,1 +51,2,355954,5,10,1,10,1,0,0,0,0,60,0,1 +24,2,379418,5,10,0,0,0,0,1,0,0,40,0,0 +67,1,286372,0,13,1,6,1,0,0,0,0,40,0,0 +40,2,48087,1,9,1,5,1,0,0,7298,0,45,0,1 +32,2,387270,1,9,1,5,2,0,1,0,0,40,0,1 +21,2,270043,5,10,0,4,3,0,1,0,0,16,0,0 +39,1,65738,5,10,1,4,2,0,1,0,0,15,0,1 +33,2,159888,2,7,1,10,1,0,0,0,0,40,0,0 +48,2,278039,1,9,2,5,0,0,0,0,0,60,0,0 +21,2,265434,5,10,0,3,3,0,1,0,0,30,0,0 +68,5,52052,9,11,6,5,0,0,1,25124,0,50,0,1 +24,2,208882,1,9,0,10,0,1,0,0,0,40,0,0 +24,2,229393,2,7,0,7,4,0,0,2463,0,40,0,0 +23,2,53513,0,13,0,1,3,0,1,0,0,45,0,0 +40,2,225193,1,9,1,2,1,0,0,0,0,63,0,0 +48,2,166809,0,13,3,1,0,0,1,0,0,50,0,1 +42,1,175674,1,9,1,5,1,0,0,0,0,60,0,0 +45,3,368947,0,13,0,11,0,1,1,0,0,40,0,0 +31,2,194901,1,9,1,5,1,0,0,0,0,50,0,1 +53,2,203173,9,11,1,1,1,0,0,0,0,45,0,0 +25,2,267431,0,13,0,3,3,1,1,0,0,55,0,0 +32,2,111836,5,10,1,4,1,1,0,0,0,50,0,0 +41,5,149102,0,13,1,1,1,0,0,0,0,35,0,1 +57,4,121111,1,9,2,0,4,0,1,0,0,40,0,0 +25,2,130397,12,6,0,7,4,3,0,0,0,40,0,0 +40,2,212847,5,10,1,8,1,0,0,0,2179,40,0,0 +17,2,184198,2,7,0,5,3,0,1,0,0,13,0,0 +17,2,121287,4,5,0,10,3,0,0,0,0,40,0,0 +82,5,120408,5,10,6,5,0,0,0,0,0,20,0,0 +40,2,164678,6,12,2,3,4,0,1,0,0,32,0,0 +26,2,388812,5,10,0,5,0,1,0,0,0,35,0,0 +37,2,294919,5,10,2,6,0,0,0,0,0,40,0,0 +25,2,101684,12,6,1,6,1,0,0,0,0,40,0,0 +65,2,36209,12,6,1,2,1,0,0,0,0,22,0,1 +39,2,123983,0,13,2,5,0,2,0,0,0,40,26,0 +36,1,340001,1,9,1,10,1,0,0,0,0,40,0,0 +37,1,203828,1,9,1,5,1,0,0,0,0,45,0,0 +23,2,183789,1,9,0,5,3,0,0,0,0,40,0,0 +34,2,305619,1,9,1,10,1,0,0,0,0,40,0,1 +63,1,174181,0,13,1,3,1,0,0,0,0,20,0,0 +59,2,131869,1,9,6,4,0,0,1,0,0,35,0,0 +49,1,43479,5,10,1,10,1,0,0,0,0,40,0,0 +17,2,118792,2,7,0,5,3,0,1,0,0,9,0,0 +28,2,272913,12,6,1,2,1,0,0,0,0,30,4,0 +45,3,222011,0,13,1,2,1,0,0,0,0,40,0,0 +40,5,301007,0,13,1,3,1,0,0,0,0,60,0,0 +45,2,197731,1,9,1,8,1,0,0,0,0,40,0,0 +20,2,173736,4,5,0,8,3,0,0,0,0,40,0,0 +59,4,93211,0,13,1,1,2,0,1,0,0,22,0,1 +41,2,24763,1,9,2,6,4,0,0,7443,0,40,0,0 +49,4,219021,5,10,2,1,4,0,0,0,0,48,0,1 +37,2,137229,9,11,2,5,0,0,0,0,0,45,0,1 +31,1,281030,1,9,1,10,1,0,0,0,0,45,0,0 +21,2,234108,5,10,0,2,3,0,0,0,0,40,0,0 +27,2,46868,0,13,0,9,0,0,1,0,0,15,0,0 +51,2,173291,1,9,2,4,0,0,1,0,0,40,0,0 +46,2,305160,15,2,1,2,1,0,0,0,0,40,4,0 +48,2,212954,5,10,1,10,1,0,0,0,0,60,0,1 +39,4,112284,3,14,2,3,0,0,1,0,0,40,0,0 +50,2,164198,6,12,1,2,1,1,0,15024,0,45,0,1 +41,2,152958,1,9,1,10,1,0,0,0,0,40,0,1 +21,2,145389,5,10,0,3,0,0,1,0,0,25,0,0 +54,5,119570,6,12,1,5,1,0,0,0,0,50,0,1 +40,2,272343,1,9,1,0,2,0,1,0,0,40,0,1 +44,2,187720,1,9,1,10,1,0,0,0,0,41,0,0 +50,2,145409,1,9,1,6,1,0,0,0,0,50,0,1 +42,2,208726,5,10,2,1,4,0,1,0,0,45,0,0 +34,2,203488,1,9,0,10,0,0,0,0,0,40,0,0 +46,2,330416,5,10,1,0,1,0,0,0,0,40,0,0 +35,2,25803,1,9,1,10,1,0,0,0,0,40,0,0 +38,2,171150,6,12,1,3,1,0,0,0,0,40,0,1 +37,2,82576,10,15,2,3,0,0,0,14084,0,36,0,1 +30,2,329425,1,9,1,10,1,0,0,0,0,40,0,0 +22,2,185452,0,13,0,1,3,0,1,0,0,40,0,0 +21,2,201179,1,9,0,0,3,0,0,0,0,40,0,0 +40,2,182268,13,1,3,0,3,0,0,0,0,40,0,0 +56,1,95763,1,9,1,10,1,0,0,0,0,55,0,0 +48,2,125892,4,5,1,8,1,0,0,0,0,40,12,0 +21,2,121407,9,11,0,4,3,0,1,0,0,36,0,0 +52,2,373367,2,7,6,10,0,0,0,0,0,40,0,0 +60,4,165982,3,14,1,1,1,0,0,0,0,50,0,1 +45,2,165484,8,16,1,3,1,0,0,0,0,50,0,1 +30,2,156890,1,9,1,8,1,0,0,0,0,45,0,0 +31,2,156763,1,9,1,5,1,0,0,2829,0,40,0,0 +36,2,219814,4,5,1,10,1,0,0,0,0,35,24,0 +42,2,171841,10,15,1,3,1,0,0,0,0,60,0,0 +28,4,168524,3,14,1,3,2,0,1,7688,0,35,0,1 +62,2,205643,10,15,1,10,1,0,0,0,0,45,0,1 +45,2,102559,9,11,1,10,1,0,0,0,0,40,8,1 +47,2,60267,0,13,1,1,1,0,0,0,0,38,0,1 +43,2,388725,6,12,1,5,1,0,0,0,0,40,0,0 +24,2,215712,5,10,0,4,0,0,0,0,0,35,0,0 +44,2,171722,1,9,4,4,4,0,1,0,0,39,0,0 +25,2,193051,1,9,0,1,3,0,0,0,0,25,0,0 +21,2,305446,5,10,0,1,0,0,0,0,0,40,0,0 +29,2,146949,9,11,1,3,1,0,0,0,0,43,0,0 +21,2,322144,5,10,0,4,0,0,0,0,0,40,0,0 +41,5,75742,10,15,1,3,1,0,0,0,0,45,22,1 +55,1,95149,5,10,1,6,1,0,0,0,0,99,0,0 +42,2,68469,1,9,1,10,1,0,0,0,0,40,0,0 +63,1,27653,1,9,1,7,1,0,0,0,0,35,0,0 +21,2,410439,5,10,0,5,3,0,0,0,0,24,0,0 +45,2,228570,1,9,1,5,2,0,1,0,0,35,0,0 +21,2,141453,1,9,0,4,3,0,1,0,0,40,0,0 +34,2,88215,3,14,1,3,2,2,1,0,0,40,26,1 +53,2,48641,14,8,0,4,0,4,1,0,0,35,0,0 +45,2,185385,1,9,1,8,1,0,0,0,0,40,0,0 +47,2,341471,1,9,2,13,0,0,1,0,0,4,0,0 +41,2,163322,2,7,2,1,4,0,1,0,0,36,0,0 +35,2,99357,0,13,1,1,2,0,1,0,1977,30,0,1 +43,5,602513,3,14,1,1,1,0,0,0,0,50,0,1 +53,4,287192,15,2,1,4,1,0,0,0,0,32,4,0 +34,2,215047,5,10,0,1,0,0,0,0,0,45,0,0 +46,3,97863,9,11,1,0,1,0,0,5178,0,40,0,1 +59,2,308118,6,12,6,1,0,0,1,0,0,40,0,1 +53,2,137192,0,13,2,1,4,2,0,0,0,50,0,0 +33,2,275369,7,4,4,2,0,1,0,0,0,35,19,0 +45,2,99971,1,9,1,6,1,0,0,0,0,50,0,0 +48,5,103713,3,14,1,5,1,0,0,0,0,40,0,1 +42,2,253770,5,10,2,0,4,0,1,0,0,40,0,0 +55,2,162205,1,9,1,6,1,0,0,5178,0,72,0,1 +46,1,31267,1,9,1,6,1,0,0,0,0,50,0,0 +17,2,198146,2,7,0,5,3,0,1,0,0,16,0,0 +23,2,178207,5,10,0,2,4,3,1,0,0,35,0,0 +21,2,317175,1,9,0,6,0,0,0,0,0,60,0,0 +53,3,221791,1,9,2,10,0,1,0,0,0,40,0,0 +61,5,187124,1,9,1,1,1,0,0,0,0,20,0,1 +58,0,280519,1,9,2,4,3,1,0,0,0,40,0,0 +36,2,207568,1,9,1,10,1,0,0,0,0,50,0,0 +45,4,192684,5,10,2,0,4,1,1,0,0,38,0,0 +39,2,103260,0,13,1,10,2,0,1,0,0,30,0,1 +39,2,191227,0,13,2,1,0,0,1,13550,0,50,0,1 +48,5,382242,8,16,1,1,2,0,1,0,0,40,0,1 +41,2,106900,0,13,1,9,1,0,0,0,0,38,0,0 +30,2,48520,6,12,1,3,1,0,0,0,2002,40,0,0 +50,2,55527,6,12,2,10,0,1,0,0,0,45,0,0 +51,1,246820,1,9,1,10,1,0,0,7298,0,48,0,1 +23,2,33884,5,10,4,5,4,0,1,0,0,40,0,0 +41,2,29762,5,10,1,10,1,0,0,0,0,60,0,0 +47,3,168109,1,9,1,0,1,0,0,0,0,70,0,0 +51,2,207449,0,13,1,1,1,0,0,0,0,55,0,0 +60,5,189098,1,9,1,4,1,0,0,0,0,40,0,0 +51,2,194259,0,13,2,9,4,0,1,0,0,40,0,0 +20,4,194630,5,10,0,4,0,0,0,0,0,40,0,0 +29,4,179681,1,9,0,6,3,0,1,0,0,37,0,0 +42,0,136996,5,10,1,11,1,1,0,0,0,48,0,0 +32,2,143604,1,9,2,4,0,1,1,0,0,16,0,0 +19,2,243373,14,8,0,5,5,0,0,1055,0,40,0,0 +34,2,261799,9,11,1,0,1,1,0,0,0,45,0,1 +48,2,143281,1,9,6,8,0,0,1,0,0,48,0,0 +38,2,185556,5,10,1,10,1,0,0,0,0,40,25,0 +38,2,111499,10,15,0,3,0,0,1,0,0,50,0,1 +40,1,280433,0,13,1,10,1,0,0,0,0,50,0,0 +39,2,37314,3,14,0,1,0,0,0,0,0,50,0,1 +26,2,270151,0,13,0,5,0,0,1,0,0,40,0,0 +23,0,96748,5,10,0,3,3,0,0,0,0,10,0,0 +20,2,164775,11,3,0,2,5,0,0,0,0,40,24,0 +49,2,190319,0,13,3,0,0,3,0,0,0,40,11,0 +23,2,213115,1,9,0,0,3,1,1,0,0,40,0,0 +47,2,156926,0,13,1,1,1,0,0,0,0,45,8,1 +43,2,112967,5,10,1,11,1,0,0,0,0,40,0,0 +56,2,35373,5,10,2,4,0,0,0,0,0,30,0,0 +60,1,220342,2,7,1,7,1,0,0,0,0,35,0,0 +29,2,163167,1,9,2,5,3,0,0,0,0,40,0,0 +25,2,404951,0,13,0,1,0,1,1,0,0,38,0,0 +39,2,122032,9,11,0,8,0,0,0,0,0,40,0,0 +37,2,143582,9,11,0,0,0,4,1,4101,0,35,0,0 +38,2,108140,0,13,0,1,0,0,0,2202,0,45,0,0 +47,2,251508,1,9,2,9,0,0,1,0,0,36,0,0 +50,1,197054,10,15,2,5,0,0,0,0,0,50,0,1 +64,1,36960,1,9,1,7,1,0,0,0,0,40,0,1 +35,2,165930,5,10,1,10,1,0,0,0,0,40,0,0 +42,2,214503,0,13,1,3,1,0,0,0,0,44,0,1 +51,2,110458,0,13,4,3,0,0,0,0,0,40,0,0 +21,2,202125,1,9,0,4,0,0,0,0,0,40,0,0 +53,1,284329,3,14,2,1,0,0,0,0,0,50,0,1 +29,2,192924,9,11,2,0,0,0,1,0,0,40,0,0 +37,2,340614,3,14,1,3,1,0,0,0,0,50,0,1 +20,2,196678,14,8,0,0,3,0,1,0,0,40,0,0 +18,2,266489,5,10,0,1,0,0,0,0,0,50,0,0 +57,2,61474,5,10,1,1,1,0,0,7688,0,45,0,1 +27,2,215955,5,10,1,0,1,0,0,2829,0,40,0,0 +23,5,215395,9,11,0,10,0,0,0,0,0,50,0,0 +36,5,183898,0,13,2,5,0,0,0,0,0,60,0,0 +48,2,97176,1,9,2,0,5,0,1,0,0,40,0,0 +40,2,145160,5,10,1,8,1,0,0,0,0,43,0,0 +51,2,357949,0,13,2,3,0,0,1,0,0,16,0,0 +59,2,177120,4,5,1,4,1,0,0,0,0,40,0,0 +32,2,288229,5,10,1,5,5,2,1,0,0,40,34,0 +39,2,509060,5,10,2,4,0,0,0,0,0,40,0,0 +32,2,47932,1,9,1,2,1,0,0,0,0,40,0,0 +38,2,103925,1,9,1,0,2,0,1,0,0,40,0,1 +44,0,183829,0,13,0,0,0,0,1,0,0,38,0,0 +51,2,138852,1,9,1,9,1,0,0,0,0,40,0,0 +54,2,188186,1,9,0,4,5,0,1,0,0,20,39,0 +22,2,34616,5,10,0,5,0,0,1,0,0,30,0,0 +19,2,220819,1,9,0,7,3,0,1,0,0,40,0,0 +31,3,281540,6,12,1,9,1,0,0,0,0,45,0,0 +53,2,47396,1,9,1,10,1,0,0,0,0,40,0,0 +28,2,141350,0,13,1,1,1,0,0,0,0,45,0,0 +19,2,331433,1,9,0,11,0,0,0,0,0,32,0,0 +40,3,346532,5,10,1,0,1,1,0,0,0,40,0,1 +21,2,241367,5,10,0,0,3,0,0,0,0,10,0,0 +39,2,216256,0,13,1,1,1,0,0,0,0,60,25,1 +40,4,153031,3,14,1,3,1,0,0,7298,0,35,0,1 +36,2,116138,1,9,1,3,1,2,0,0,0,40,14,0 +18,2,193166,4,5,0,5,3,0,1,0,0,42,0,0 +32,5,275094,0,13,1,5,1,0,0,7688,0,55,4,1 +50,2,81548,1,9,1,3,1,0,0,0,0,40,0,0 +18,2,167979,2,7,0,5,3,0,0,0,0,15,0,0 +19,2,67759,1,9,0,8,3,0,0,0,0,43,0,0 +53,2,200190,5,10,2,10,0,0,0,0,0,40,0,1 +49,2,403112,1,9,2,4,4,1,1,0,0,32,0,0 +31,2,142675,5,10,0,1,3,0,0,0,0,40,0,0 +47,1,88500,1,9,1,7,1,0,0,0,0,35,0,0 +35,4,145308,5,10,1,4,1,0,0,0,0,40,0,0 +47,4,204377,5,10,0,4,3,0,1,0,0,20,0,0 +43,1,260696,3,14,2,3,0,0,1,0,0,20,0,0 +51,2,231181,5,10,0,8,0,0,0,0,0,21,0,0 +54,2,260052,3,14,1,3,1,0,0,0,0,40,0,1 +76,4,178665,4,5,1,4,1,0,0,0,0,30,0,0 +33,2,226267,7,4,0,5,0,0,0,0,0,43,4,0 +19,2,111232,14,8,0,6,3,0,0,0,0,15,0,0 +49,2,87928,9,11,1,10,1,0,0,5013,0,40,0,0 +26,2,212748,1,9,1,6,1,0,0,0,0,40,0,0 +23,2,110677,5,10,0,4,3,0,1,0,0,15,0,0 +49,2,139268,1,9,1,10,1,0,0,7298,0,40,0,1 +24,2,306779,5,10,0,5,0,0,0,0,0,65,0,0 +48,2,318331,1,9,0,5,3,0,0,0,0,40,0,0 +36,0,143385,5,10,1,11,1,0,0,0,0,40,0,0 +33,2,288273,14,8,4,0,4,0,1,1471,0,40,0,0 +31,2,167725,0,13,1,3,1,2,0,15024,0,48,11,1 +53,2,94081,0,13,1,1,1,0,0,0,0,44,0,1 +22,2,194723,0,13,0,0,3,0,1,0,0,10,0,0 +43,2,163985,1,9,1,10,1,0,0,0,0,40,0,0 +31,2,189759,6,12,1,0,1,0,0,0,0,40,25,0 +53,0,195922,3,14,2,3,0,0,1,0,0,40,0,0 +36,3,54159,0,13,1,1,1,0,0,0,0,45,0,0 +47,4,166863,1,9,1,1,1,0,0,0,0,40,0,1 +52,2,104501,5,10,1,3,1,0,0,0,0,40,9,1 +39,2,210626,1,9,2,8,4,0,1,0,0,40,0,0 +24,2,448026,0,13,0,5,3,0,0,0,0,40,0,0 +17,4,170916,12,6,0,11,3,0,1,0,1602,40,0,0 +53,4,283602,3,14,1,3,2,0,1,15024,0,40,0,1 +21,2,189749,5,10,0,5,3,0,0,0,0,40,0,0 +29,2,90934,0,13,0,3,3,2,0,0,0,64,11,1 +34,0,253121,0,13,1,3,1,0,0,0,0,40,0,0 +28,2,181776,5,10,0,0,0,0,1,0,0,40,0,0 +61,2,162397,0,13,1,5,1,0,0,0,0,40,0,1 +20,2,70708,1,9,1,2,1,0,0,0,0,60,0,0 +47,0,103406,1,9,1,9,1,0,0,0,0,40,0,0 +40,2,224658,0,13,1,5,1,0,0,0,0,45,0,1 +26,4,213451,5,10,0,4,3,1,1,0,0,10,2,0 +53,2,139671,5,10,1,10,1,0,0,0,0,40,0,1 +26,2,36201,0,13,0,5,0,0,0,0,0,50,0,0 +39,2,237713,10,15,1,5,1,0,0,0,2415,99,0,1 +17,4,173497,2,7,0,3,3,1,0,0,0,15,0,0 +46,2,375606,8,16,0,3,0,0,0,0,0,40,0,1 +34,2,203488,0,13,1,5,1,0,0,15024,0,40,0,1 +45,1,107231,0,13,2,3,0,0,0,0,0,45,23,0 +23,2,216811,1,9,0,0,3,0,1,0,0,16,0,0 +41,2,288679,1,9,1,10,1,0,0,0,0,40,0,0 +26,2,105516,0,13,0,5,0,0,1,0,0,40,0,0 +28,1,282972,0,13,0,3,0,0,1,0,0,4,0,0 +18,5,117372,2,7,0,5,3,0,0,0,0,15,0,0 +38,2,112497,1,9,0,3,0,0,0,0,0,40,0,1 +28,2,192384,0,13,1,5,1,0,0,0,0,40,0,1 +49,2,43348,3,14,0,3,0,0,0,0,0,40,0,1 +29,2,181822,0,13,0,5,0,0,0,0,0,40,0,0 +43,4,216070,3,14,1,1,2,3,1,0,0,50,0,1 +34,0,112062,3,14,0,3,4,0,1,0,0,40,0,0 +30,2,218551,9,11,1,5,1,0,0,0,0,45,0,1 +25,2,404616,0,13,1,1,1,0,0,0,0,40,0,1 +27,2,169460,0,13,1,1,1,0,0,0,0,40,0,0 +25,2,240081,1,9,0,5,3,1,0,0,0,40,0,0 +22,2,147655,5,10,0,0,3,0,1,0,0,40,0,0 +49,2,60751,1,9,1,11,1,0,0,0,0,40,0,0 +44,1,194636,1,9,1,10,1,0,0,3137,0,50,0,0 +37,1,154641,6,12,1,7,1,0,0,2105,0,50,0,0 +39,2,491000,0,13,0,1,5,1,0,0,0,45,0,0 +33,2,399088,1,9,2,6,4,0,1,0,0,40,0,0 +41,1,186909,3,14,1,5,2,0,1,0,1902,35,0,1 +65,2,105491,0,13,1,1,1,0,0,99999,0,40,0,1 +40,2,34987,0,13,0,5,0,0,0,0,0,53,0,0 +31,2,288983,5,10,0,11,0,0,0,0,0,40,0,0 +28,2,266070,5,10,0,1,0,0,1,0,0,40,0,0 +71,2,110380,1,9,1,5,1,0,0,0,2467,52,0,0 +25,4,31873,0,13,0,0,0,0,1,0,0,40,0,0 +25,2,294400,7,4,1,10,1,0,0,0,0,60,0,0 +36,1,175769,10,15,1,10,1,0,0,0,0,60,0,0 +56,2,182273,1,9,1,8,1,0,0,0,0,40,0,0 +34,2,106541,5,10,1,8,1,0,0,0,0,40,0,0 +39,2,138192,0,13,1,10,1,0,0,0,0,40,0,1 +31,2,196791,10,15,2,3,0,0,1,0,0,45,0,1 +22,2,223019,1,9,0,0,3,0,1,0,0,20,0,0 +44,2,109273,5,10,0,10,0,0,0,0,0,38,0,0 +60,1,95490,1,9,1,5,1,0,0,0,0,45,0,0 +65,2,149131,2,7,2,8,5,0,0,0,0,40,0,0 +44,2,219155,5,10,1,5,1,0,0,0,0,50,7,1 +53,4,82783,1,9,2,1,0,0,0,0,0,40,0,0 +28,2,214858,1,9,1,6,1,0,0,0,0,40,0,0 +41,2,170230,0,13,2,1,4,0,1,0,0,45,0,0 +35,2,90406,2,7,1,5,2,0,1,0,0,40,0,0 +41,5,299813,4,5,1,5,2,0,1,0,0,70,21,0 +28,2,188064,1,9,1,10,1,0,0,0,0,35,8,0 +53,2,246117,1,9,1,10,1,0,0,0,0,40,4,0 +26,2,132749,5,10,0,4,3,0,1,0,0,45,0,0 +28,4,201099,1,9,0,6,3,1,1,0,0,40,0,0 +27,2,97490,5,10,2,10,4,0,1,0,0,40,0,0 +27,2,221252,1,9,0,0,0,3,1,0,0,8,0,0 +26,2,116991,1,9,1,10,1,0,0,0,0,40,0,1 +53,2,161691,1,9,6,5,0,0,1,0,0,35,0,0 +34,2,107793,1,9,1,10,1,0,0,0,0,40,9,1 +50,5,194514,3,14,0,3,0,1,0,0,0,50,33,0 +30,2,278502,1,9,2,0,4,1,1,0,0,62,0,0 +47,2,343742,1,9,4,10,4,1,0,0,0,40,0,0 +55,3,31965,5,10,1,0,1,0,0,0,0,40,0,0 +35,2,174308,5,10,0,6,3,0,0,0,0,40,0,0 +39,5,372525,3,14,1,1,1,0,0,0,0,60,0,1 +30,2,75167,0,13,1,1,1,0,0,0,0,55,0,0 +39,2,176296,1,9,1,6,1,1,0,0,1887,40,0,1 +19,2,93518,5,10,0,5,3,0,1,0,0,20,0,0 +57,1,25124,1,9,1,4,1,0,0,0,0,60,0,0 +21,2,112137,5,10,0,3,5,2,1,0,0,20,27,0 +25,1,21472,5,10,0,4,0,0,1,0,0,22,0,0 +32,2,90969,9,11,1,6,1,0,0,0,0,45,0,1 +26,2,149734,1,9,4,10,4,1,1,0,1594,40,0,0 +42,2,52849,5,10,1,8,1,0,0,0,0,40,0,0 +39,1,106347,5,10,2,5,4,0,0,0,0,47,0,0 +48,2,199735,0,13,2,13,0,0,1,0,0,44,9,0 +24,2,488541,5,10,0,4,4,1,1,0,0,35,0,0 +46,2,403911,9,11,1,10,1,1,0,0,0,40,0,1 +53,2,172991,5,10,1,5,1,0,0,0,0,25,0,0 +36,3,210945,5,10,1,0,1,0,0,0,0,70,0,0 +34,2,157446,1,9,2,10,4,0,0,0,0,45,0,0 +25,2,109390,1,9,0,6,3,0,0,0,0,70,0,0 +33,2,134886,5,10,0,0,3,0,1,99999,0,30,0,1 +45,2,144579,0,13,1,3,1,0,0,0,0,40,0,1 +31,3,203488,6,12,0,0,0,0,0,0,0,40,0,0 +21,2,202871,1,9,0,8,3,0,0,0,0,20,0,0 +33,2,175412,4,5,2,10,4,0,0,114,0,55,0,0 +44,2,336906,5,10,2,0,4,0,1,0,0,40,0,0 +34,2,177596,9,11,1,1,2,0,1,0,0,40,5,1 +30,2,79448,5,10,2,0,4,0,1,0,0,10,0,0 +32,4,191731,5,10,0,0,4,1,1,0,0,40,0,0 +29,2,133937,0,13,1,3,1,0,0,0,0,40,0,1 +20,2,219211,5,10,0,4,3,0,0,0,0,20,0,0 +35,0,94529,1,9,2,11,4,0,1,0,0,40,0,0 +35,2,247547,1,9,4,3,5,1,1,0,0,40,0,0 +29,2,29361,1,9,0,4,0,0,1,0,0,38,0,0 +21,2,166851,1,9,0,8,5,0,0,0,0,40,0,0 +43,3,197069,0,13,1,3,1,0,0,0,0,40,11,1 +33,2,153588,1,9,1,8,1,0,0,0,0,40,0,0 +61,3,151369,10,15,1,3,1,0,0,0,0,50,0,1 +42,2,174112,3,14,0,3,0,0,1,0,0,40,0,0 +33,2,520033,14,8,1,0,2,0,1,0,0,40,0,0 +35,0,194828,5,10,0,3,3,1,1,0,0,40,0,0 +22,2,126613,5,10,0,5,3,0,1,0,0,20,0,0 +61,2,26254,1,9,2,1,0,0,1,0,0,40,0,0 +28,2,54042,9,11,0,4,0,0,1,2463,0,35,0,0 +24,2,67804,1,9,0,4,3,1,0,0,0,40,0,0 +58,4,53481,3,14,0,3,0,0,0,0,0,35,0,0 +42,2,412379,1,9,1,2,1,0,0,0,0,40,0,0 +56,2,220187,5,10,1,5,1,0,0,0,0,45,0,1 +25,2,268222,1,9,4,2,4,1,1,0,0,40,0,0 +59,2,99131,1,9,1,0,2,0,1,0,0,40,0,0 +65,1,115498,0,13,1,5,1,0,0,3818,0,10,0,0 +57,2,317847,3,14,2,1,0,0,0,0,2824,50,0,1 +36,2,98389,6,12,1,1,1,0,0,0,0,44,0,1 +42,2,173704,5,10,1,5,1,0,0,0,1887,50,0,1 +18,2,115443,2,7,1,10,1,0,0,0,0,40,0,0 +28,2,65078,1,9,1,10,1,0,0,0,0,40,0,1 +20,2,24896,1,9,1,0,2,0,1,0,0,20,0,0 +19,2,184710,5,10,0,9,3,0,0,0,0,30,0,0 +28,2,410450,0,13,2,4,4,0,1,0,0,48,7,1 +37,2,83893,9,11,1,0,1,0,0,0,0,40,0,0 +23,2,113309,5,10,0,6,0,0,0,0,0,40,0,0 +60,2,160625,5,10,2,10,0,0,0,0,0,47,0,0 +17,4,340043,14,8,0,0,3,0,1,0,0,12,0,0 +37,4,48976,0,13,0,3,0,0,1,4865,0,45,0,0 +29,0,243875,9,11,2,0,3,0,0,0,0,40,0,0 +34,2,554206,1,9,4,6,0,1,0,0,0,20,0,0 +37,1,205359,5,10,1,1,2,0,1,0,0,15,0,0 +47,0,167281,0,13,1,4,1,0,0,0,0,40,0,0 +22,2,35663,1,9,0,4,0,0,1,0,0,40,0,0 +61,2,357437,1,9,1,4,1,0,0,0,0,40,0,0 +57,2,390856,11,3,1,7,1,0,0,0,0,45,4,0 +33,3,331615,8,16,1,3,1,0,0,0,1848,40,0,1 +54,2,202415,1,9,1,10,1,0,0,0,0,40,0,1 +40,2,180032,3,14,0,3,0,0,1,0,1669,40,0,0 +40,2,77247,14,8,1,10,1,0,0,0,0,50,0,1 +40,4,101795,1,9,0,11,0,0,0,0,0,42,0,0 +35,2,272019,2,7,1,10,1,0,0,0,2057,40,0,0 +32,2,198068,2,7,0,6,3,0,0,0,0,40,0,0 +49,1,199326,5,10,1,5,1,0,0,0,0,50,0,0 +31,2,178841,1,9,0,0,0,0,1,0,0,40,0,0 +58,2,136951,0,13,1,0,1,2,0,0,0,40,11,0 +26,5,109240,0,13,0,1,0,0,0,0,0,50,0,0 +35,1,128876,7,4,1,7,1,0,0,0,0,40,0,0 +25,2,103358,5,10,0,8,3,0,0,0,0,40,3,0 +43,2,354408,14,8,1,0,1,1,0,0,0,40,0,0 +32,2,206051,5,10,0,0,0,0,0,0,0,35,0,0 +45,2,155659,0,13,1,3,1,0,0,0,0,60,0,1 +48,2,143299,1,9,0,8,0,1,0,0,0,40,0,0 +31,2,252210,11,3,0,4,3,0,0,0,0,40,4,0 +28,2,398918,1,9,0,9,0,0,0,0,0,40,0,0 +50,1,240612,0,13,2,3,0,0,1,0,0,60,0,0 +22,2,429346,1,9,0,0,5,1,0,0,0,40,0,0 +19,2,123718,5,10,0,5,3,0,1,0,0,20,0,0 +38,2,455379,0,13,1,1,1,0,0,0,0,63,0,1 +23,2,376416,1,9,0,6,3,0,0,0,0,40,0,0 +24,5,234663,0,13,0,1,3,0,0,0,0,40,0,0 +26,2,282142,9,11,1,1,2,0,1,0,0,40,0,0 +45,0,208049,1,9,2,9,4,0,1,0,0,40,0,0 +88,2,68539,5,10,2,0,4,0,1,0,0,40,0,0 +19,2,126501,2,7,0,0,3,3,1,0,0,15,27,0 +24,2,186452,1,9,0,1,0,0,0,0,0,50,0,0 +48,2,165267,12,6,1,7,1,1,0,0,0,40,0,0 +46,2,124733,5,10,1,10,1,2,0,0,0,40,36,0 +31,5,149726,1,9,1,10,1,0,0,0,0,50,0,0 +58,2,41374,1,9,6,0,4,3,0,0,0,40,0,0 +35,4,329759,1,9,1,10,1,0,0,0,0,40,0,0 +36,2,212433,1,9,0,10,3,1,0,0,0,40,0,0 +36,2,185099,10,15,1,3,1,0,0,0,0,55,0,1 +47,4,126754,3,14,1,3,1,0,0,0,0,40,0,1 +30,2,118056,5,10,3,1,4,0,1,0,0,45,0,0 +30,4,200892,3,14,1,3,1,0,0,0,0,40,0,0 +30,5,84119,0,13,0,1,3,0,0,0,0,43,0,0 +23,4,197918,5,10,0,11,3,0,0,0,0,40,0,1 +41,1,150533,10,15,1,3,1,0,0,0,0,50,0,1 +52,2,443742,5,10,2,1,0,0,0,0,0,60,0,0 +27,2,104423,6,12,0,0,0,0,0,0,0,40,0,0 +59,2,169133,1,9,1,10,1,0,0,0,0,45,0,0 +21,2,185551,1,9,0,5,3,0,1,0,0,36,0,0 +60,2,174486,1,9,6,8,0,0,1,0,0,40,0,0 +69,0,50468,10,15,1,0,1,0,0,0,0,34,0,1 +24,2,196943,1,9,0,5,3,0,0,0,0,40,0,0 +19,2,120691,1,9,0,5,3,1,0,0,0,25,0,0 +60,0,198815,6,12,1,3,1,0,0,0,0,20,4,0 +64,2,22186,5,10,6,9,0,0,1,0,0,35,0,0 +39,5,188069,9,11,1,1,1,0,0,0,0,60,0,1 +51,2,233149,6,12,1,1,1,0,0,0,0,45,0,1 +51,2,138358,12,6,2,10,0,1,1,0,0,35,0,0 +25,2,338013,5,10,2,9,0,0,1,0,0,40,0,0 +37,2,166339,5,10,2,9,4,0,1,0,0,40,0,0 +74,1,392886,1,9,6,7,0,0,1,0,0,14,0,0 +26,0,141838,0,13,1,1,1,1,0,0,0,40,0,1 +23,2,520759,1,9,0,4,0,1,0,0,0,30,0,0 +57,5,37345,10,15,1,3,1,0,0,0,0,36,0,1 +20,2,387779,2,7,0,6,3,0,0,0,0,15,0,0 +37,2,201531,1,9,1,7,1,0,0,0,0,40,0,0 +46,2,123598,0,13,1,5,1,0,0,0,0,40,0,0 +39,2,380614,5,10,2,3,0,0,1,0,0,45,0,1 +40,2,83859,1,9,6,8,3,0,1,0,0,30,0,0 +50,0,24790,1,9,1,2,1,0,0,0,0,40,0,0 +25,2,266820,13,1,0,7,0,0,0,0,0,35,4,0 +44,2,85440,1,9,1,0,1,0,0,0,0,45,0,0 +41,2,421837,1,9,1,6,1,0,0,0,0,40,0,0 +30,1,404062,1,9,1,3,1,0,0,0,1977,15,0,1 +38,2,224566,9,11,1,2,1,0,0,0,0,50,0,0 +54,2,294991,12,6,1,2,1,0,0,0,0,40,0,0 +40,3,189610,1,9,2,0,0,1,1,0,0,52,0,0 +37,2,219141,2,7,1,2,1,1,0,7688,0,40,0,1 +46,3,20956,0,13,1,1,1,0,0,15024,0,40,0,1 +38,2,70995,1,9,2,3,0,0,0,0,0,45,0,0 +20,2,215232,5,10,0,1,3,0,1,0,0,10,0,0 +35,2,56201,5,10,1,7,1,0,0,0,0,40,4,0 +62,2,98076,0,13,1,1,1,0,0,0,0,40,0,1 +34,2,351810,0,13,0,3,0,0,1,0,0,45,1,0 +56,1,144351,1,9,1,6,1,0,0,0,0,90,0,0 +30,0,137613,3,14,1,3,1,2,0,0,0,20,18,0 +17,2,54257,2,7,0,0,3,0,1,0,0,20,0,0 +18,1,230373,2,7,0,4,3,0,1,594,0,4,0,0 +35,2,98389,2,7,1,7,1,0,0,0,0,40,0,0 +21,2,184135,1,9,0,8,3,1,0,0,0,1,0,0 +46,1,140121,1,9,2,10,3,0,0,0,0,50,0,0 +33,1,24504,5,10,1,10,1,0,0,0,0,60,0,0 +27,2,129528,5,10,0,5,0,0,1,0,0,40,0,0 +36,2,415578,5,10,1,10,1,0,0,0,0,40,0,1 +42,2,97142,7,4,1,6,1,0,0,0,0,40,0,0 +35,2,201328,1,9,1,6,1,0,0,0,0,50,0,0 +25,2,256620,0,13,4,1,0,0,0,0,0,40,0,0 +47,3,96854,0,13,1,3,1,0,0,0,0,40,0,1 +44,0,141858,10,15,1,3,1,0,0,15024,0,75,0,1 +51,3,20795,1,9,1,6,1,0,0,7688,0,40,0,1 +53,2,95519,1,9,1,3,1,0,0,0,0,42,0,1 +47,2,112791,1,9,1,11,1,0,0,0,0,40,0,0 +20,2,291407,2,7,0,2,3,1,0,0,0,40,0,0 +32,2,239659,5,10,4,8,4,1,1,0,0,70,0,0 +28,2,183151,1,9,1,10,1,0,0,0,0,50,0,0 +52,2,143807,1,9,2,5,0,0,1,0,0,40,0,0 +35,2,186934,3,14,4,3,0,0,0,0,0,40,0,1 +30,2,170065,5,10,1,10,1,0,0,0,0,40,0,0 +33,2,108328,5,10,0,0,0,0,1,6849,0,50,0,0 +21,2,204596,5,10,0,4,3,0,1,0,0,20,0,0 +56,2,193453,0,13,1,3,1,0,0,0,1902,65,0,1 +45,2,148995,0,13,1,10,1,0,0,15024,0,40,0,1 +20,2,85041,5,10,0,1,3,0,1,0,0,20,0,0 +62,4,140851,1,9,1,4,1,0,0,0,0,40,0,1 +24,2,196280,0,13,0,5,0,0,1,0,0,30,0,0 +52,3,38973,0,13,4,0,4,1,1,0,0,40,0,0 +23,2,39182,1,9,1,5,1,0,0,0,0,40,0,0 +36,2,198841,3,14,1,1,1,0,0,0,0,40,0,1 +40,2,694812,5,10,0,10,0,0,0,0,0,40,0,0 +30,2,247444,5,10,1,8,1,0,0,0,0,40,35,0 +41,2,294270,4,5,1,6,1,0,0,0,0,35,0,0 +59,2,195820,1,9,1,6,1,0,0,0,0,40,0,1 +27,2,329426,3,14,0,1,0,0,0,0,0,37,0,0 +41,2,116103,5,10,0,1,0,0,0,0,0,50,0,0 +27,2,206903,0,13,0,2,4,0,0,0,0,35,0,0 +50,2,217577,1,9,6,8,4,0,1,0,0,40,0,0 +29,2,337693,11,3,0,4,3,0,1,0,0,40,22,0 +38,2,204501,0,13,1,1,1,0,0,0,0,55,0,1 +30,2,169186,1,9,0,8,3,0,0,0,0,60,0,0 +48,2,109421,0,13,1,3,1,0,0,0,0,55,0,0 +39,4,267893,6,12,1,10,1,1,0,7298,0,40,0,1 +40,2,200479,9,11,1,3,1,0,0,0,0,40,0,0 +27,4,221317,2,7,1,10,1,0,0,0,0,40,4,0 +59,1,132925,3,14,1,10,1,0,0,0,0,40,0,1 +34,2,170769,1,9,1,0,1,0,0,0,0,50,0,1 +47,5,186410,10,15,0,4,0,0,0,0,0,60,0,1 +64,5,307786,15,2,1,5,1,0,0,0,0,20,0,0 +29,2,380560,4,5,1,8,1,0,0,0,0,40,4,0 +38,4,147258,1,9,0,6,0,0,0,0,0,40,0,0 +42,2,212894,0,13,1,5,1,0,0,0,1887,40,0,1 +49,2,124356,0,13,1,5,1,0,0,0,0,60,0,1 +53,2,98791,5,10,1,9,1,0,0,0,0,40,0,0 +35,2,216473,5,10,1,0,1,0,0,0,0,50,0,1 +38,2,107303,1,9,1,10,1,0,0,0,0,40,0,0 +36,2,152744,0,13,2,5,5,2,1,0,0,40,27,0 +34,1,100079,0,13,1,5,1,2,0,0,0,55,3,0 +24,2,117779,0,13,0,3,0,0,0,0,0,10,39,0 +23,2,197613,5,10,0,0,0,0,1,0,0,40,0,0 +21,2,411068,5,10,0,0,3,0,1,0,0,35,0,0 +47,2,192984,5,10,6,0,4,0,1,0,0,40,0,0 +59,2,66356,7,4,0,7,4,0,0,4865,0,40,0,0 +33,3,137184,6,12,2,1,4,0,0,0,0,50,0,1 +63,1,231105,5,10,1,8,1,0,0,0,0,35,0,1 +18,4,146586,1,9,0,4,3,0,0,0,0,60,0,0 +32,2,32406,0,13,0,3,0,0,1,0,0,50,0,0 +19,2,206777,1,9,0,2,5,0,0,0,0,40,0,0 +27,4,133495,1,9,0,3,3,0,0,0,0,40,0,0 +40,2,34722,5,10,2,6,0,0,0,0,0,48,0,1 +38,1,133299,6,12,1,6,1,0,0,0,0,40,0,0 +20,2,24967,1,9,0,7,3,0,0,0,0,47,0,0 +35,1,171968,1,9,4,6,0,0,0,0,0,70,0,0 +22,2,412156,5,10,0,0,3,0,1,0,0,40,0,0 +40,2,51290,3,14,1,3,1,0,0,0,0,50,0,1 +34,2,198265,5,10,1,9,1,0,0,3103,0,40,0,1 +23,2,293565,12,6,0,2,0,0,0,0,0,40,0,0 +26,2,226288,0,13,0,0,0,0,0,0,0,40,0,0 +53,5,110445,5,10,1,7,1,0,0,0,0,60,0,0 +34,2,160634,5,10,1,10,1,0,0,0,0,40,0,1 +39,2,174242,1,9,1,10,1,0,0,0,0,40,0,0 +25,2,390316,4,5,1,10,1,0,0,0,0,40,4,0 +18,2,298860,2,7,0,5,3,0,0,0,0,20,0,0 +65,2,171584,0,13,0,1,0,0,0,0,0,40,0,0 +49,1,232664,0,13,0,1,3,0,1,0,0,40,0,0 +64,2,63676,12,6,1,4,1,1,0,0,0,40,0,0 +68,2,170376,0,13,1,1,1,0,0,0,0,40,0,1 +56,1,175964,5,10,2,4,0,0,1,0,0,40,0,0 +68,3,422013,1,9,2,3,0,0,1,0,3683,40,0,0 +35,2,105813,0,13,1,3,1,0,0,0,0,48,0,1 +50,3,306707,1,9,0,0,4,1,1,0,0,12,0,0 +45,2,177543,1,9,2,0,4,0,1,0,0,28,0,0 +43,2,320277,0,13,1,1,1,0,0,0,0,40,0,0 +39,2,129495,5,10,4,0,4,1,1,0,0,40,0,0 +37,2,257042,1,9,2,10,4,0,0,1506,0,40,0,0 +45,2,275995,0,13,1,9,1,0,0,0,0,50,0,1 +36,2,280440,6,12,0,9,4,0,1,0,0,45,0,0 +26,2,371556,5,10,0,0,0,0,1,0,0,40,0,0 +36,2,408229,0,13,0,3,0,0,1,0,0,32,0,0 +47,2,149337,0,13,0,0,0,0,0,0,0,60,0,0 +34,2,209297,1,9,0,8,0,1,0,0,2001,40,0,0 +53,2,355802,5,10,6,5,4,0,1,0,0,30,0,0 +32,2,165949,0,13,2,8,0,0,1,0,1590,42,0,0 +44,1,112507,11,3,1,10,1,0,0,0,0,40,0,0 +25,2,462869,1,9,0,2,5,0,0,0,0,40,4,0 +35,2,413648,11,3,0,7,4,0,0,0,0,36,0,0 +34,2,29235,6,12,2,3,0,0,1,0,0,40,0,0 +42,2,149823,5,10,1,10,1,0,0,0,0,40,0,0 +47,2,39530,1,9,2,4,0,0,1,0,0,4,0,0 +23,2,197387,1,9,0,10,3,0,0,0,0,37,4,0 +56,4,255406,1,9,2,1,0,0,1,0,0,40,0,0 +50,2,43764,8,16,1,3,1,0,0,15024,0,50,0,1 +38,2,168322,1,9,1,6,1,0,0,0,0,60,0,0 +46,2,278322,9,11,1,1,1,0,0,0,0,40,0,1 +47,2,115813,6,12,4,0,4,0,1,0,0,57,0,0 +38,1,184456,1,9,1,4,1,0,0,3464,0,80,25,0 +42,2,289636,1,9,1,6,1,0,0,0,0,46,0,0 +48,2,101684,1,9,1,5,1,0,0,0,0,40,0,0 +27,2,133425,1,9,0,1,0,0,1,0,0,50,0,0 +40,2,349405,9,11,1,3,2,0,1,0,0,36,0,0 +53,2,124076,8,16,1,3,2,0,1,99999,0,37,0,1 +75,1,165968,9,11,6,1,0,0,1,0,0,30,0,0 +39,2,185099,0,13,1,3,1,0,0,0,0,48,0,1 +46,3,268281,6,12,2,0,4,0,1,0,0,40,0,0 +51,2,154949,1,9,6,8,0,1,1,0,0,40,0,0 +34,2,176711,1,9,2,4,3,0,0,0,0,40,0,0 +23,2,165064,5,10,1,5,1,0,0,0,0,40,0,0 +32,2,213750,9,11,0,4,0,0,0,0,0,45,0,0 +45,1,77132,5,10,0,5,0,0,0,0,0,55,0,0 +21,2,109667,5,10,0,4,3,0,0,0,0,40,0,0 +36,2,162164,1,9,1,10,1,0,0,0,0,44,0,0 +40,2,219591,12,6,1,10,1,0,0,0,0,50,0,0 +68,2,236943,4,5,2,7,0,1,0,0,0,20,0,0 +40,2,89226,0,13,1,5,1,0,0,0,0,40,0,1 +20,2,124751,5,10,0,0,3,0,1,0,0,24,0,0 +48,4,144122,3,14,2,3,0,0,1,0,0,40,0,1 +27,2,98769,0,13,0,5,0,0,0,0,0,45,0,0 +57,3,170066,9,11,0,9,0,0,0,0,0,40,0,0 +54,5,162439,1,9,1,1,1,0,0,0,0,98,0,1 +47,2,22900,1,9,2,4,0,0,1,0,0,40,0,0 +30,4,102130,5,10,1,10,1,0,0,0,0,40,0,0 +35,2,381583,5,10,1,10,1,4,0,0,0,45,0,1 +56,4,198277,14,8,0,2,0,0,0,0,0,40,0,0 +20,2,243178,1,9,0,2,3,0,0,0,0,28,0,0 +38,4,177305,0,13,1,3,1,0,0,0,0,38,0,0 +19,2,167149,5,10,0,5,3,0,1,0,0,25,0,0 +31,2,382368,5,10,0,0,0,0,0,0,0,40,9,0 +44,4,277144,0,13,0,3,3,0,0,0,0,60,0,0 +21,0,145651,5,10,0,5,3,1,1,0,1602,12,0,0 +41,2,171351,5,10,1,10,1,0,0,0,0,40,0,0 +18,2,265099,2,7,0,4,3,0,1,0,0,16,0,0 +23,2,105617,4,5,0,6,3,0,0,0,0,40,0,0 +37,4,217689,5,10,1,4,1,3,0,0,0,32,0,0 +43,1,73883,0,13,2,5,4,0,0,0,0,45,0,0 +31,2,339482,15,2,1,8,1,0,0,0,0,40,4,0 +40,2,326232,5,10,2,6,4,0,0,0,0,40,0,1 +27,2,106316,10,15,2,3,0,0,1,0,0,12,0,0 +64,4,198728,5,10,0,6,4,0,0,0,0,40,0,0 +31,3,126501,9,11,0,3,3,0,0,0,0,40,0,0 +48,2,233802,3,14,1,1,1,1,0,0,0,45,0,0 +37,1,204501,0,13,1,5,1,0,0,0,0,20,8,1 +28,2,208249,5,10,2,9,0,0,0,0,0,24,0,0 +42,2,188693,5,10,1,10,1,0,0,0,0,40,0,0 +60,5,93272,7,4,1,5,1,0,0,0,0,60,0,0 +17,2,159299,2,7,0,4,3,0,1,0,0,20,0,0 +46,2,35136,12,6,2,0,3,1,0,0,0,40,0,0 +18,2,139576,1,9,0,0,3,0,1,0,0,40,0,0 +22,2,252355,1,9,0,4,0,0,0,0,0,27,0,0 +44,1,83812,0,13,2,1,0,0,0,0,0,60,0,0 +36,2,89718,1,9,1,5,1,0,0,0,0,40,0,0 +65,2,222810,9,11,2,1,0,0,1,0,0,40,0,0 +26,2,456618,1,9,0,4,0,0,0,0,0,40,4,0 +21,2,296158,12,6,1,4,1,0,0,0,0,25,0,0 +41,2,162140,1,9,2,10,0,0,0,0,2339,40,0,0 +28,2,36601,5,10,0,4,4,0,1,0,0,35,0,0 +27,2,195337,5,10,0,8,0,0,1,0,0,40,0,0 +19,0,282721,5,10,0,4,0,1,0,0,0,12,0,0 +40,2,206049,5,10,1,6,1,0,0,0,0,40,0,0 +19,2,223392,1,9,0,2,3,0,0,0,0,15,0,0 +40,2,27821,9,11,1,6,1,0,0,2829,0,40,0,0 +37,2,131827,1,9,0,10,4,0,0,0,0,40,0,0 +33,2,549413,5,10,1,0,1,1,0,0,0,40,0,1 +34,2,69491,1,9,1,4,1,0,0,0,0,40,0,0 +44,4,193755,6,12,0,11,0,0,0,0,0,40,0,0 +33,2,598802,5,10,2,0,4,1,1,0,0,40,0,0 +72,4,259762,1,9,1,1,1,0,0,2290,0,10,0,0 +19,2,266255,1,9,0,5,3,0,1,0,0,40,0,0 +59,2,32954,9,11,2,3,0,0,1,0,0,36,0,0 +40,2,291808,1,9,2,11,0,1,1,0,0,40,0,0 +35,2,190728,1,9,2,3,4,0,1,0,0,40,0,0 +22,2,59184,6,12,0,0,0,0,0,0,0,45,0,0 +41,2,196456,3,14,0,3,0,0,1,0,0,40,0,0 +59,2,147989,5,10,1,9,1,0,0,0,0,50,0,1 +50,2,195784,14,8,2,2,4,0,0,0,0,40,0,0 +21,2,202214,6,12,0,0,0,0,1,0,0,10,0,0 +40,5,225165,1,9,1,1,1,0,0,0,0,40,0,0 +22,2,54825,1,9,0,5,0,0,0,0,0,40,0,0 +43,2,188905,11,3,4,8,0,0,1,0,0,40,4,0 +17,2,132636,2,7,0,6,3,0,1,0,0,16,0,0 +42,4,228320,7,4,2,4,0,0,0,0,0,40,0,0 +37,2,415500,5,10,1,8,1,1,0,0,0,40,0,1 +43,2,255635,11,3,1,8,1,4,0,0,0,40,4,0 +46,2,96080,4,5,4,10,4,0,1,0,0,40,0,0 +50,4,339547,10,15,1,0,1,2,0,0,0,40,17,1 +47,1,126500,7,4,1,5,1,0,0,0,0,40,5,0 +31,2,511289,1,9,0,7,0,0,0,2907,0,99,0,0 +33,2,159574,7,4,1,0,1,0,0,0,0,45,0,0 +27,2,224105,1,9,1,8,1,0,0,7298,0,40,0,1 +59,1,128105,1,9,1,7,1,0,0,0,0,35,0,0 +39,4,89508,1,9,1,10,1,0,0,0,0,40,0,1 +29,2,370242,5,10,1,10,1,0,0,0,0,40,0,0 +26,2,67257,0,13,6,1,0,0,1,0,0,55,0,0 +24,2,62952,1,9,0,10,3,0,0,0,0,40,0,0 +25,2,111058,5,10,0,0,0,0,0,0,1980,40,0,0 +30,2,29235,5,10,0,0,5,0,1,0,0,20,0,0 +52,0,101119,2,7,1,6,1,0,0,0,0,40,0,0 +51,3,140516,3,14,1,3,1,0,0,0,0,40,0,1 +30,2,159888,0,13,0,5,0,0,0,0,0,60,0,1 +23,2,166371,5,10,0,9,3,0,0,0,0,60,0,0 +37,0,160910,8,16,1,3,1,0,0,0,0,45,0,0 +25,0,257064,5,10,1,0,1,1,0,0,0,38,0,0 +49,1,181307,10,15,1,3,1,0,0,15024,0,65,0,1 +30,2,83253,1,9,1,3,1,0,0,0,0,55,0,0 +40,2,128700,5,10,2,0,4,0,1,0,0,40,0,0 +20,2,243010,1,9,0,8,5,4,0,0,0,32,0,0 +35,1,37778,9,11,1,7,1,0,0,3103,0,55,0,0 +24,2,132320,0,13,0,1,3,0,0,0,0,45,0,0 +32,2,234755,1,9,4,10,4,1,0,0,0,40,0,0 +35,2,142616,1,9,4,4,3,1,1,0,0,30,0,0 +20,2,148509,1,9,0,4,0,0,1,0,0,40,0,0 +29,0,240738,1,9,1,10,1,0,0,0,0,40,0,1 +25,2,32276,1,9,0,10,3,0,0,0,0,28,0,0 +50,4,163921,7,4,1,6,1,0,0,0,0,40,0,0 +24,2,464103,1,9,0,0,0,0,0,0,0,50,0,0 +30,4,327825,1,9,2,11,3,0,1,0,0,32,0,0 +37,2,267085,5,10,1,0,1,0,0,0,0,40,0,0 +50,2,266945,1,9,1,8,2,0,1,3137,0,40,22,0 +20,2,234663,1,9,0,2,3,0,0,0,0,30,0,0 +49,1,189123,1,9,1,10,1,0,0,5013,0,50,0,0 +55,2,104996,7,4,1,6,1,0,0,0,0,50,0,0 +61,2,101265,14,8,6,8,4,0,1,0,0,40,25,0 +22,2,184975,1,9,3,4,3,0,1,0,0,3,0,0 +23,2,246965,6,12,0,0,0,0,0,0,0,12,0,0 +43,2,227065,1,9,0,3,0,0,0,4650,0,40,0,0 +39,2,301867,0,13,2,0,0,2,1,0,0,24,11,0 +21,2,185948,5,10,0,5,3,0,0,0,0,35,0,0 +52,5,134854,1,9,1,1,1,0,0,0,0,40,0,1 +30,2,281030,9,11,1,5,1,0,0,4064,0,40,0,0 +42,2,126701,0,13,2,0,4,0,0,9562,0,45,0,1 +50,1,95949,0,13,1,10,1,0,0,0,0,50,0,0 +51,1,88528,6,12,2,1,4,0,1,0,0,99,0,0 +47,2,24723,12,6,2,1,0,3,1,0,0,45,0,0 +45,2,184581,1,9,1,8,1,0,0,0,0,40,0,0 +48,3,100067,5,10,6,4,4,1,1,0,0,40,0,0 +36,2,182863,0,13,1,1,1,0,0,0,0,50,0,1 +61,2,85434,1,9,1,6,1,0,0,0,0,40,0,0 +72,2,158092,0,13,2,5,0,0,0,0,0,30,0,0 +19,2,104844,5,10,0,5,3,0,1,0,0,15,0,0 +39,2,106183,1,9,2,4,4,3,1,6849,0,40,0,0 +24,2,89347,2,7,0,8,0,0,1,0,0,40,0,0 +44,2,157236,5,10,3,2,4,0,0,0,0,40,12,0 +19,2,261259,1,9,0,2,3,0,0,0,0,20,0,0 +20,2,286166,1,9,0,5,0,0,0,0,0,48,0,0 +23,2,122272,1,9,0,10,3,0,1,0,0,40,0,0 +58,2,248739,1,9,1,7,1,0,0,0,0,53,0,1 +20,2,224238,14,8,0,10,3,0,0,0,0,40,0,0 +62,2,138157,1,9,1,1,1,0,0,0,0,12,0,0 +25,2,148460,1,9,0,0,3,1,1,4416,0,40,5,0 +67,2,236627,0,13,1,3,1,0,0,0,0,2,0,0 +37,4,191364,6,12,1,1,1,0,0,0,0,40,23,1 +36,2,353524,1,9,2,1,3,0,1,1831,0,40,0,0 +38,2,391040,9,11,4,9,4,0,1,0,0,20,0,0 +23,2,134997,1,9,2,4,4,0,1,0,0,80,0,0 +28,2,392487,1,9,1,5,2,0,1,0,0,40,0,0 +25,2,216724,1,9,2,1,3,0,0,0,0,40,0,0 +41,1,174395,8,16,1,3,1,0,0,15024,0,55,0,1 +63,2,383058,0,13,1,5,1,0,0,0,1848,40,0,1 +60,1,96073,1,9,1,10,1,0,0,0,0,30,0,0 +31,5,103435,1,9,1,1,1,0,0,0,0,50,0,0 +29,1,96718,1,9,1,10,1,0,0,0,0,37,0,0 +37,2,178948,0,13,1,1,2,0,1,7688,0,45,0,1 +51,2,173987,4,5,1,5,1,0,0,0,0,40,0,0 +45,2,34419,5,10,1,1,1,0,0,7298,0,40,0,1 +27,2,224849,1,9,1,10,1,0,0,0,0,40,0,0 +18,2,249857,5,10,0,4,3,0,0,0,0,20,0,0 +34,2,340458,1,9,2,8,4,0,1,0,0,40,0,0 +66,1,427422,8,16,1,5,1,0,0,0,2377,25,0,1 +36,2,175643,1,9,1,10,1,0,0,0,0,35,0,0 +35,2,297485,0,13,2,1,4,0,1,0,0,40,0,0 +27,2,232954,1,9,1,5,1,0,0,0,0,45,0,0 +29,2,326330,5,10,2,1,3,0,1,1831,0,40,0,0 +25,2,109419,1,9,0,0,3,0,1,0,0,40,0,0 +22,2,127768,5,10,0,4,3,0,0,0,0,32,0,1 +41,2,252986,5,10,1,10,1,0,0,0,0,48,0,1 +20,2,380544,6,12,0,6,3,0,0,0,0,20,0,0 +52,2,306108,1,9,1,8,1,0,0,0,0,40,0,0 +34,2,232855,5,10,4,4,4,1,1,0,0,37,0,0 +44,2,130126,10,15,2,3,0,0,0,0,0,45,0,1 +50,2,194231,3,14,2,5,0,0,1,0,0,40,0,1 +49,5,197038,0,13,1,1,1,0,0,0,0,50,0,1 +71,0,26109,10,15,1,4,1,0,0,0,0,28,0,0 +20,2,285671,1,9,0,4,5,1,0,0,0,25,0,0 +59,5,103948,1,9,1,5,1,0,0,0,0,60,0,1 +41,2,439919,11,3,1,7,1,0,0,3411,0,40,4,0 +38,2,40319,5,10,2,1,0,0,1,0,0,42,0,0 +55,4,159028,1,9,1,6,1,0,0,0,0,40,0,0 +17,2,98675,4,5,0,4,4,0,1,0,0,20,0,0 +45,2,90758,0,13,1,1,1,0,0,0,0,55,0,1 +43,1,75435,1,9,2,10,4,3,0,0,0,30,0,0 +19,2,219189,14,8,0,4,3,0,0,0,0,25,0,0 +33,2,203463,1,9,2,4,3,0,1,0,0,40,0,0 +63,2,187635,1,9,0,1,0,0,0,0,0,40,0,0 +39,1,154641,1,9,2,7,0,0,0,8614,0,50,0,1 +34,2,27153,1,9,1,6,1,0,0,0,0,40,0,0 +31,2,150324,6,12,0,8,4,0,0,0,0,40,0,0 +21,2,83704,14,8,1,10,1,0,0,0,0,40,0,0 +23,2,176262,9,11,0,0,5,0,1,0,0,36,0,0 +20,2,179423,5,10,0,2,3,0,1,0,0,8,0,0 +45,2,168038,0,13,2,5,0,0,0,0,0,60,0,1 +59,2,108765,1,9,1,6,1,0,0,0,0,50,0,0 +58,2,146477,3,14,1,1,1,0,0,15024,0,40,34,1 +66,4,188220,1,9,6,0,4,0,1,0,0,35,0,1 +37,2,292855,9,11,1,3,2,0,1,0,1887,35,0,1 +29,2,114870,5,10,2,10,3,0,0,0,0,40,0,0 +32,0,77723,0,13,2,1,0,2,1,0,0,40,0,0 +39,2,284166,0,13,1,3,1,0,0,0,1902,50,0,1 +57,2,133902,1,9,6,1,4,0,1,0,0,45,0,0 +57,2,191318,3,14,1,3,1,0,0,0,0,40,0,1 +50,5,67794,1,9,3,5,0,0,0,0,0,60,0,0 +44,5,357679,0,13,1,7,1,0,0,15024,0,65,0,1 +56,2,117872,9,11,1,10,1,1,0,0,0,40,0,1 +26,2,55929,3,14,0,1,0,0,1,0,0,48,0,0 +26,1,34307,9,11,0,7,3,0,0,0,0,65,0,0 +33,2,246038,0,13,1,3,1,0,0,0,0,40,0,1 +36,1,147258,9,11,1,7,1,0,0,0,0,60,0,1 +45,2,329144,5,10,1,5,1,0,0,0,0,40,0,1 +56,4,52953,8,16,2,3,0,0,1,0,1669,38,0,0 +23,2,216181,5,10,0,5,3,0,0,0,0,36,10,0 +23,2,391171,5,10,0,4,0,1,0,0,0,25,0,0 +35,4,223242,0,13,2,3,0,0,0,0,0,40,0,0 +39,2,103925,0,13,1,3,2,0,1,7688,0,32,0,1 +45,2,38240,1,9,2,10,0,0,0,0,0,40,0,0 +21,2,148444,5,10,0,5,3,0,1,0,0,25,0,0 +56,0,110257,1,9,1,0,1,0,0,0,0,40,0,0 +31,3,101345,1,9,0,2,3,0,1,0,0,40,0,0 +44,2,268098,14,8,0,6,0,1,0,0,0,36,0,0 +31,2,288825,1,9,1,2,1,0,0,5013,0,40,0,0 +20,2,162688,1,9,0,2,3,0,0,0,0,38,0,0 +44,3,184099,1,9,1,0,1,0,0,0,0,40,0,1 +19,2,307496,5,10,0,4,3,0,1,0,0,23,0,0 +23,2,267955,5,10,0,5,0,0,1,0,0,40,0,0 +21,2,283969,1,9,0,10,3,0,0,0,0,40,4,0 +29,0,204516,3,14,1,3,1,0,0,0,0,15,0,0 +33,2,167771,5,10,4,4,0,0,1,0,0,30,0,0 +46,2,345073,1,9,2,1,0,0,0,0,0,48,0,1 +36,5,306156,5,10,1,5,1,0,0,15024,0,60,0,1 +70,1,37203,3,14,1,3,1,0,0,9386,0,30,0,1 +19,2,185097,1,9,0,2,0,0,1,0,0,37,0,0 +29,2,144808,5,10,1,1,3,1,1,0,0,40,0,0 +34,2,187203,6,12,0,5,4,0,0,0,0,50,0,0 +26,2,125089,5,10,0,1,0,0,0,0,0,40,0,0 +30,2,289458,0,13,0,1,0,0,1,0,0,40,0,0 +34,2,144798,5,10,0,0,0,0,1,0,0,40,0,0 +28,2,207513,1,9,0,5,3,0,0,0,0,48,0,0 +76,2,199949,0,13,1,0,1,0,0,20051,0,50,0,1 +19,2,213024,14,8,0,2,3,0,0,0,0,40,0,0 +45,2,213140,12,6,1,10,1,0,0,2829,0,40,0,0 +24,1,83374,5,10,0,3,0,2,0,0,0,30,0,1 +37,2,192939,0,13,1,10,1,0,0,0,0,40,0,1 +24,2,424494,0,13,1,3,1,0,0,0,0,30,0,0 +24,2,215243,0,13,0,0,0,0,1,0,0,42,0,0 +40,2,30682,1,9,1,8,1,0,0,0,0,45,0,1 +20,2,306639,5,10,0,2,3,0,0,0,0,20,0,0 +23,4,218678,2,7,1,2,1,0,0,0,0,40,0,0 +25,2,219130,5,10,0,4,0,4,1,0,0,40,0,0 +64,2,180624,6,12,0,3,5,0,1,0,0,30,0,0 +53,4,200190,3,14,1,3,1,0,0,0,1977,55,0,1 +28,2,194472,5,10,1,0,3,0,1,0,0,40,0,0 +52,4,205767,3,14,1,3,1,1,0,0,0,40,0,1 +28,2,249870,10,15,0,3,0,1,0,0,0,50,0,0 +31,2,211242,6,12,1,1,1,0,0,0,0,55,0,1 +77,2,149912,0,13,0,3,0,0,1,0,0,10,0,0 +22,2,85389,1,9,0,9,3,0,0,0,0,40,0,0 +38,2,329980,0,13,0,1,0,0,0,0,0,55,0,0 +25,4,249214,5,10,0,0,4,1,1,0,0,40,0,0 +50,2,257126,1,9,1,10,1,0,0,0,0,40,0,1 +53,4,204397,1,9,1,1,1,0,0,0,0,60,0,0 +24,2,291979,1,9,0,7,0,0,0,0,0,40,0,0 +33,2,138667,1,9,1,0,1,0,0,0,0,50,0,1 +57,3,42298,3,14,1,1,1,1,0,15024,0,40,0,1 +39,2,375452,10,15,1,1,2,0,1,15024,0,48,0,1 +30,2,94413,5,10,2,6,0,0,0,0,0,30,0,0 +31,3,166626,1,9,1,0,1,0,0,0,0,40,0,1 +39,0,326566,5,10,0,6,3,1,0,0,0,40,0,0 +30,2,165503,0,13,0,5,3,0,1,0,0,65,0,0 +48,2,102597,5,10,4,0,4,0,1,0,0,44,0,0 +39,2,177277,1,9,1,8,1,0,0,0,0,45,0,1 +34,2,198103,1,9,0,6,3,0,0,0,1980,40,0,0 +45,2,260490,3,14,1,1,1,0,0,0,0,50,0,1 +32,2,237478,2,7,2,8,4,0,1,0,0,40,0,0 +40,3,36885,5,10,0,0,0,0,1,0,0,50,0,0 +17,2,166242,12,6,0,4,3,0,1,0,0,15,0,0 +25,2,274228,1,9,1,9,1,0,0,0,0,84,0,0 +42,2,185145,5,10,1,6,1,0,0,0,0,57,0,0 +66,2,28367,0,13,1,13,5,0,0,0,0,99,0,0 +63,1,28612,1,9,6,5,0,0,0,0,0,70,0,0 +43,2,191429,7,4,1,4,1,0,0,0,0,25,0,0 +26,2,459548,1,9,0,2,0,0,0,0,0,20,4,0 +23,2,65481,1,9,1,8,2,0,1,0,0,40,0,1 +39,2,186130,10,15,1,1,1,0,0,0,0,55,0,1 +47,5,350759,1,9,1,1,1,0,0,0,0,40,0,1 +36,2,359678,1,9,0,8,0,1,1,0,0,48,0,0 +35,2,220595,1,9,1,10,1,0,0,0,0,40,0,0 +25,2,29599,1,9,0,7,0,0,0,0,0,40,0,0 +21,0,299153,5,10,0,0,3,0,1,0,0,15,0,0 +46,2,75256,1,9,1,13,2,0,1,0,0,40,0,0 +43,2,143583,12,6,1,2,1,1,0,0,0,40,0,0 +31,0,207505,8,16,1,3,1,0,0,0,1977,70,0,1 +41,2,308550,1,9,2,10,4,0,1,0,0,60,0,0 +50,2,145717,1,9,6,0,4,0,1,0,0,35,0,0 +36,2,334366,2,7,4,1,0,0,1,0,0,32,0,0 +45,1,155489,7,4,1,1,1,0,0,0,0,65,0,1 +50,2,197322,2,7,1,1,1,0,0,0,0,50,0,1 +52,2,194259,7,4,1,1,2,0,1,0,0,50,0,0 +40,2,346189,8,16,1,3,1,0,0,0,0,40,0,1 +55,2,98361,0,13,1,1,1,0,0,15024,0,55,0,1 +51,5,162943,10,15,1,3,1,0,0,0,0,40,0,1 +30,2,19302,5,10,1,3,1,0,0,7688,0,40,0,1 +56,0,67662,3,14,2,3,0,0,1,0,0,39,0,0 +35,2,126675,1,9,1,1,1,0,0,0,0,48,0,0 +55,1,278228,12,6,1,5,1,0,0,0,0,35,0,0 +30,2,169152,1,9,0,9,4,0,1,0,0,40,0,0 +34,2,204052,1,9,0,10,0,0,0,0,0,40,0,0 +36,2,215392,9,11,1,3,2,0,1,0,0,40,0,1 +43,5,83348,1,9,1,10,1,0,0,0,0,60,0,0 +24,4,196816,5,10,0,11,0,0,0,0,0,50,0,0 +30,2,541343,12,6,1,4,1,1,0,0,0,40,0,0 +33,4,55921,9,11,0,11,0,0,0,0,0,70,0,0 +29,3,119848,0,13,0,3,0,0,1,0,0,40,0,0 +50,2,160572,1,9,1,8,1,0,0,3137,0,47,0,0 +18,2,25837,2,7,0,3,3,0,0,0,0,15,0,0 +20,2,236592,2,7,0,5,3,0,1,0,0,25,0,0 +45,0,199326,3,14,1,3,1,0,0,0,0,45,0,1 +45,2,175958,10,15,1,1,1,0,0,0,0,40,0,1 +41,2,198965,1,9,1,8,1,0,0,0,0,40,0,0 +42,4,193537,7,4,3,4,0,0,1,0,0,35,5,0 +24,2,438839,0,13,0,5,0,0,0,0,0,40,0,0 +22,2,298227,1,9,0,2,4,0,0,0,0,35,0,0 +28,2,271466,1,9,1,1,1,0,0,0,0,45,0,1 +23,2,335570,5,10,0,2,3,0,0,0,0,35,0,0 +21,2,206891,7,4,0,7,3,0,1,0,0,38,0,0 +23,2,162551,0,13,0,0,0,2,1,0,0,20,0,0 +45,2,145637,5,10,2,0,4,0,1,0,0,48,0,0 +41,2,101290,1,9,2,5,4,0,1,0,0,40,0,0 +49,3,229376,1,9,1,0,1,0,0,0,0,40,0,1 +38,2,439592,5,10,0,4,3,1,1,0,0,40,0,0 +37,2,161141,1,9,0,2,0,0,0,0,0,40,0,0 +70,2,304570,0,13,6,8,5,2,0,0,0,32,11,0 +24,2,103277,1,9,0,0,0,0,1,2597,0,40,0,0 +28,4,407672,0,13,0,3,0,0,1,0,0,40,0,0 +24,2,73928,9,11,0,0,3,2,1,0,0,20,0,0 +83,5,240150,12,6,1,7,1,0,0,20051,0,50,0,1 +69,2,230417,8,16,1,3,1,0,0,0,0,40,26,1 +37,2,260093,1,9,0,0,4,1,1,0,0,40,0,0 +28,2,96020,0,13,0,1,0,0,1,0,0,40,0,0 +54,2,104421,5,10,2,0,0,0,1,0,0,40,0,0 +71,2,152307,1,9,1,1,1,0,0,0,2377,45,0,1 +56,0,93415,1,9,6,0,4,2,1,0,0,40,0,0 +42,1,269733,3,14,1,5,1,0,0,99999,0,80,0,1 +21,2,202871,1,9,0,5,3,0,0,0,0,44,0,0 +29,2,169683,9,11,1,3,1,0,0,0,0,40,0,0 +32,2,340917,0,13,0,3,0,0,0,0,0,50,0,1 +31,2,329874,5,10,0,0,0,0,0,0,0,40,0,0 +38,2,43770,5,10,4,4,0,0,1,4650,0,72,0,0 +55,0,120781,8,16,1,3,1,2,0,0,0,40,3,1 +48,2,138069,1,9,1,6,1,0,0,0,0,45,0,0 +58,1,33309,1,9,6,7,0,0,0,0,0,80,0,0 +23,2,76432,5,10,0,0,0,0,1,0,0,40,0,0 +28,0,277635,5,10,0,0,0,0,1,0,0,50,0,0 +49,4,123088,5,10,1,1,1,0,0,0,0,46,0,0 +51,2,57698,1,9,3,4,4,0,1,0,0,40,0,0 +23,2,181820,1,9,4,10,3,0,0,0,0,53,0,0 +40,1,98985,1,9,2,1,0,1,0,0,0,50,0,0 +59,2,98350,1,9,2,4,0,2,0,0,0,40,26,0 +47,2,125120,0,13,2,10,0,0,1,0,0,50,0,0 +37,2,243409,1,9,1,6,1,0,0,0,0,50,0,0 +39,2,58972,6,12,2,1,4,0,0,1506,0,40,0,0 +43,2,62857,5,10,1,10,1,0,0,0,0,60,0,0 +40,2,283174,9,11,1,7,1,0,0,0,0,60,0,0 +48,2,107373,12,6,1,6,1,0,0,0,0,40,0,1 +29,2,201155,4,5,0,5,0,0,1,0,0,48,0,0 +48,2,187505,5,10,1,5,1,0,0,0,0,50,0,1 +37,2,61778,0,13,0,7,0,0,0,0,0,30,0,0 +19,2,223648,1,9,0,5,0,0,0,4101,0,48,0,0 +28,2,149652,12,6,0,4,3,1,1,0,0,30,0,0 +56,2,170324,11,3,1,10,1,1,0,0,0,40,33,0 +45,2,165937,1,9,2,6,3,0,0,0,0,60,0,0 +60,0,114060,5,10,1,11,1,0,0,0,0,40,0,0 +53,0,58913,3,14,1,1,1,0,0,0,0,42,0,1 +37,0,378916,1,9,1,0,1,0,0,0,0,40,0,0 +31,2,241885,1,9,1,4,1,0,0,0,0,40,0,0 +29,2,224421,9,11,5,7,1,0,0,0,0,44,0,1 +39,2,315565,1,9,1,6,1,1,0,0,0,40,1,0 +31,4,153005,0,13,1,3,1,0,0,0,0,40,0,1 +42,2,98211,0,13,1,1,1,0,0,15024,0,45,0,1 +17,2,198606,2,7,0,2,3,0,1,0,0,16,0,0 +19,2,260333,1,9,0,4,3,0,1,0,0,20,0,0 +24,2,219510,0,13,0,4,0,2,0,0,0,32,0,0 +62,2,266624,1,9,1,7,1,0,0,6418,0,40,0,1 +34,2,136862,15,2,0,4,5,0,1,0,0,40,24,0 +47,5,215620,3,14,1,1,1,0,0,15024,0,55,0,1 +58,2,187067,0,13,0,3,0,0,1,0,0,62,8,0 +23,2,325921,9,11,0,3,0,0,1,0,0,36,0,0 +33,2,268127,1,9,0,4,4,1,1,0,0,40,0,0 +76,2,142535,1,9,6,0,0,0,0,0,0,6,0,0 +40,2,177083,1,9,2,1,4,0,1,0,0,50,0,0 +28,2,77009,7,4,2,4,4,0,1,0,0,50,0,0 +41,2,306405,5,10,1,9,2,0,1,0,0,40,0,0 +46,4,303918,1,9,1,11,1,0,0,7688,0,96,0,1 +22,3,262819,5,10,0,0,0,0,1,0,0,40,0,0 +29,2,49087,9,11,1,2,1,0,0,0,0,40,0,0 +26,2,53833,1,9,0,4,4,0,0,0,0,40,0,0 +31,2,1033222,0,13,0,0,0,0,0,8614,0,40,0,1 +22,2,81145,1,9,0,4,0,0,1,0,0,25,0,0 +41,2,215479,5,10,0,6,0,1,0,0,0,43,0,0 +29,2,113464,1,9,0,6,5,4,0,0,0,40,21,0 +60,2,109530,9,11,1,9,1,0,0,7298,0,40,0,1 +72,3,217864,1,9,1,0,1,0,0,0,0,40,0,1 +41,5,117721,5,10,1,7,1,0,0,0,0,65,0,0 +19,2,199484,5,10,0,4,3,0,1,0,0,25,0,0 +25,2,248851,0,13,0,4,3,0,0,0,0,40,0,0 +24,2,116968,0,13,0,1,0,0,0,0,0,45,0,0 +59,2,366618,4,5,1,4,1,0,0,0,0,30,0,0 +17,2,240143,2,7,0,10,3,0,0,0,0,30,0,0 +25,2,120238,5,10,1,5,1,0,0,2885,0,43,0,0 +29,2,247053,1,9,4,4,0,0,1,0,0,40,0,0 +43,2,180599,1,9,1,10,1,0,0,0,0,55,0,0 +29,4,190330,5,10,0,4,3,0,1,0,0,10,0,0 +29,0,199450,5,10,2,0,4,1,0,0,0,40,0,0 +32,4,199539,5,10,1,11,1,0,0,0,0,40,0,1 +50,1,29231,1,9,1,1,1,0,0,0,0,45,0,1 +43,2,33126,5,10,1,1,1,0,0,0,0,50,0,0 +41,2,102085,1,9,0,8,4,0,1,0,0,40,0,0 +32,2,212064,0,13,1,1,2,0,1,0,0,40,0,1 +54,0,166774,3,14,0,3,0,0,1,0,0,45,0,1 +65,2,95303,1,9,1,1,1,0,0,0,0,40,0,1 +70,5,247383,5,10,1,1,1,0,0,0,0,40,0,1 +53,2,229465,3,14,1,1,1,0,0,0,0,55,0,1 +37,2,135436,0,13,1,1,1,0,0,0,1977,60,0,1 +21,2,180052,5,10,0,6,3,0,0,0,0,30,0,0 +20,2,214387,1,9,0,8,3,0,0,0,0,40,0,0 +47,0,149337,1,9,2,0,4,0,0,0,0,38,0,0 +26,2,208326,1,9,1,1,1,0,0,3942,0,45,0,0 +31,2,34374,10,15,0,3,0,0,0,0,0,50,0,0 +45,1,58683,5,10,1,6,1,0,0,0,0,40,0,0 +35,2,403037,1,9,4,0,4,0,1,0,0,40,0,0 +55,2,32365,0,13,1,1,1,0,0,0,0,45,0,1 +49,2,155489,3,14,1,3,1,0,0,0,0,50,0,1 +33,5,289886,1,9,0,4,4,2,0,0,0,40,36,0 +19,2,101549,5,10,0,4,3,0,0,0,0,15,0,0 +48,5,51579,0,13,1,1,1,0,0,0,0,60,0,1 +41,2,40151,5,10,2,10,0,0,0,0,0,40,0,1 +29,2,244721,0,13,1,9,1,0,0,0,0,35,0,1 +47,4,228372,3,14,1,3,1,0,0,0,0,48,0,1 +53,4,236873,3,14,1,1,1,1,0,0,0,40,0,1 +19,2,250249,5,10,0,0,3,0,1,0,0,10,0,0 +71,2,93202,1,9,2,4,0,0,1,0,0,16,0,0 +29,2,176723,5,10,0,5,4,0,1,0,0,25,0,0 +43,4,175526,5,10,1,4,1,0,0,0,0,40,0,0 +23,2,91842,0,13,0,1,0,0,1,0,0,30,0,0 +52,2,71768,5,10,2,0,0,0,1,0,0,40,0,0 +56,2,181220,0,13,1,5,1,0,0,0,0,40,0,1 +28,2,204516,12,6,0,10,0,0,0,0,0,40,0,0 +44,1,89172,0,13,1,3,1,0,0,0,0,80,0,0 +37,3,143547,0,13,0,3,0,0,1,0,0,40,0,0 +30,2,310889,9,11,1,1,1,0,0,0,0,50,0,1 +31,4,150324,1,9,1,10,1,0,0,0,0,40,0,0 +20,2,216472,5,10,0,5,3,0,1,0,0,25,0,0 +64,2,212838,1,9,1,5,1,0,0,0,0,65,0,1 +45,2,168283,1,9,1,4,1,0,0,0,0,40,0,0 +40,2,187702,5,10,0,1,0,0,0,0,0,50,0,1 +19,2,60661,1,9,0,2,3,0,0,0,0,52,0,0 +54,2,115284,0,13,2,1,4,0,0,0,0,45,0,1 +61,5,98350,8,16,1,1,1,2,0,0,0,40,18,1 +18,2,195372,2,7,0,4,3,0,1,0,0,20,0,0 +33,2,111567,9,11,0,10,0,0,0,0,0,40,0,0 +51,2,244572,1,9,4,4,0,1,1,0,0,37,0,0 +54,2,230919,1,9,1,10,1,0,0,0,0,40,0,0 +24,2,282604,5,10,1,11,5,0,0,0,0,24,0,0 +54,2,320196,5,10,2,1,4,0,1,0,0,40,9,0 +42,2,201466,0,13,1,1,1,0,0,0,0,45,0,1 +51,3,254211,3,14,6,5,4,0,0,0,0,50,22,1 +41,2,599629,5,10,1,0,2,1,1,0,0,40,0,1 +47,4,219632,6,12,4,1,0,0,0,0,1408,40,0,0 +31,0,161631,5,10,2,0,4,0,1,0,0,40,0,0 +21,2,202373,9,11,0,10,3,1,0,0,0,40,0,0 +52,2,169549,5,10,2,1,4,0,1,0,0,40,0,0 +20,2,127185,5,10,0,3,3,0,1,0,0,15,0,0 +18,2,184277,1,9,0,5,3,0,1,0,0,25,0,0 +58,2,119751,1,9,1,13,5,2,1,0,0,60,11,0 +23,2,294701,1,9,0,0,4,0,1,0,0,40,0,0 +21,2,26842,5,10,0,5,0,0,1,0,0,20,0,0 +43,0,114537,9,11,1,11,1,0,0,0,0,40,0,0 +53,2,126386,1,9,2,8,3,0,0,0,0,40,0,0 +18,2,163787,1,9,1,1,2,0,1,0,0,40,0,0 +44,2,98211,0,13,1,1,1,0,0,0,0,40,0,1 +31,2,175509,0,13,0,3,0,0,0,0,0,50,0,0 +48,2,159854,15,2,1,4,1,0,0,0,0,40,0,0 +55,5,120920,3,14,2,3,0,0,1,0,0,35,0,0 +24,2,187551,5,10,0,0,3,1,1,0,0,20,0,0 +41,0,27305,3,14,1,3,1,0,0,0,0,40,0,1 +35,2,216711,1,9,1,10,1,0,0,0,0,40,0,1 +47,4,218596,9,11,2,0,0,0,1,0,0,40,0,0 +54,2,280292,5,10,1,5,1,0,0,0,0,32,0,0 +40,2,200496,0,13,4,5,0,0,0,0,0,40,0,0 +56,1,78090,5,10,2,5,4,0,1,0,0,48,0,0 +23,2,118693,9,11,0,9,0,0,0,0,0,40,0,0 +34,1,203488,1,9,1,10,1,0,0,0,0,60,0,0 +27,4,172091,1,9,0,10,4,1,0,0,0,40,0,0 +32,2,113364,0,13,0,3,0,0,0,0,0,40,0,1 +72,1,139889,5,10,1,7,1,0,0,0,0,74,0,0 +43,4,301638,14,8,1,6,1,0,0,0,1579,40,0,0 +32,2,110279,6,12,2,3,4,1,1,0,0,35,0,0 +53,2,242859,5,10,4,0,3,0,0,0,0,40,1,0 +18,2,132986,14,8,0,4,3,0,0,0,0,10,0,0 +38,2,254439,12,6,6,6,4,1,0,114,0,40,0,0 +41,3,187462,9,11,2,0,3,1,1,0,0,40,0,0 +29,2,264961,1,9,0,10,3,0,0,0,0,45,0,0 +47,2,47247,5,10,1,0,2,0,1,0,0,40,0,0 +56,4,571017,5,10,1,0,2,0,1,0,0,15,0,0 +28,2,416577,1,9,1,10,1,1,0,2829,0,40,0,0 +55,0,296991,10,15,1,3,1,0,0,15024,0,40,0,1 +50,0,45961,0,13,3,3,0,0,0,6849,0,40,0,0 +47,2,302711,2,7,2,0,4,0,1,0,0,40,0,0 +42,5,50356,1,9,1,1,1,0,0,0,0,40,0,0 +22,2,199336,5,10,0,8,3,0,0,0,0,25,0,0 +42,2,341178,11,3,1,4,1,0,0,0,0,44,4,0 +42,3,70240,5,10,2,1,4,2,1,0,0,40,0,0 +46,2,229394,1,9,2,1,0,0,1,0,0,40,0,0 +45,2,390368,5,10,1,5,1,1,0,15024,0,99,0,1 +55,2,82098,1,9,1,1,1,2,0,0,0,55,0,0 +57,2,170411,0,13,1,11,1,0,0,0,0,40,0,1 +25,2,109532,14,8,0,10,3,0,0,0,0,40,0,0 +43,2,142682,1,9,1,6,1,0,0,0,0,30,21,0 +34,5,127651,0,13,2,7,0,0,0,0,0,60,0,0 +27,4,236472,0,13,2,3,5,0,1,0,0,40,0,0 +25,2,176047,1,9,0,8,3,0,1,2176,0,40,0,0 +37,2,111499,5,10,0,1,0,0,1,0,0,40,0,0 +48,2,425199,5,10,2,5,4,0,0,0,0,45,0,0 +38,2,229009,1,9,1,4,1,0,0,0,0,45,0,0 +17,2,232713,12,6,0,10,0,0,0,594,0,30,0,0 +70,2,141742,9,11,1,8,1,0,0,9386,0,50,0,1 +37,2,234807,1,9,2,0,4,0,1,0,0,37,0,0 +45,2,738812,1,9,1,10,1,0,0,0,0,46,0,0 +56,2,204816,1,9,1,5,1,0,0,0,0,55,0,1 +64,2,342494,1,9,1,8,1,0,0,0,0,40,0,0 +35,4,226311,5,10,2,0,3,0,1,0,0,38,0,0 +23,2,143062,1,9,0,5,3,0,0,0,0,40,0,0 +42,4,125155,1,9,1,11,1,0,0,0,0,90,0,0 +23,2,329925,5,10,0,2,3,0,0,0,0,30,0,0 +56,4,212864,1,9,1,6,1,0,0,0,0,40,0,1 +41,2,214242,0,13,1,3,1,0,0,0,1887,40,0,1 +47,1,191175,11,3,1,5,1,0,0,0,2179,50,4,0 +21,2,118693,5,10,0,2,3,0,0,0,0,40,0,0 +29,2,253593,1,9,0,10,3,1,0,0,0,40,0,0 +32,0,206051,5,10,3,7,3,0,0,0,0,50,0,0 +72,2,497280,4,5,6,4,4,1,1,0,0,20,0,0 +69,1,240562,10,15,1,3,1,0,0,99999,0,40,0,1 +19,2,140985,5,10,0,0,5,0,0,0,0,25,0,0 +25,4,191921,0,13,0,10,3,0,0,0,0,25,0,0 +56,2,204049,5,10,1,5,1,0,0,0,1848,50,0,1 +42,2,331651,3,14,0,3,0,0,1,8614,0,50,0,1 +58,2,142158,0,13,2,1,4,0,1,0,0,35,0,0 +24,2,249046,0,13,0,9,3,0,0,0,0,40,0,0 +41,2,213019,9,11,1,9,2,0,1,0,0,38,0,1 +40,2,199599,12,6,1,1,1,0,0,0,0,40,0,1 +25,2,28008,6,12,2,0,4,0,1,0,0,40,0,0 +43,5,82488,0,13,1,5,3,2,1,0,0,40,11,1 +36,2,117073,1,9,0,10,3,0,0,0,0,40,0,0 +41,2,325786,1,9,1,8,1,0,0,0,0,40,0,0 +31,2,37546,0,13,0,3,0,0,1,0,0,40,0,0 +22,2,204226,1,9,0,1,3,0,1,0,0,40,0,0 +36,2,133299,9,11,1,10,1,0,0,0,0,40,0,0 +42,2,29702,12,6,1,8,1,0,0,0,0,40,0,0 +29,2,307812,1,9,1,10,1,0,0,0,0,60,0,0 +25,2,174545,1,9,0,0,4,0,1,0,0,46,0,0 +23,2,233472,0,13,0,1,0,0,0,0,0,40,0,0 +34,2,184147,1,9,4,5,4,1,1,0,0,20,0,0 +27,2,198188,1,9,1,0,1,0,0,2580,0,45,0,0 +32,2,447066,0,13,1,5,1,1,0,15024,0,50,0,1 +33,2,200246,5,10,3,3,0,0,0,0,0,40,0,0 +38,2,166585,0,13,2,1,0,0,1,0,0,55,0,0 +39,2,53569,9,11,1,10,1,0,0,0,0,40,0,0 +50,2,167065,0,13,1,1,1,0,0,0,0,40,0,1 +32,2,113364,5,10,0,0,0,0,0,0,0,30,0,0 +40,3,219266,1,9,1,1,1,0,0,0,0,40,0,1 +58,3,200042,5,10,1,1,1,0,0,15024,0,40,0,1 +20,2,205975,1,9,0,0,3,0,1,0,0,20,0,0 +56,2,65325,0,13,1,0,1,0,0,0,0,50,0,0 +30,4,194740,0,13,1,11,1,0,0,0,0,40,0,0 +39,2,99065,5,10,2,1,4,0,1,0,0,39,0,0 +25,2,212793,6,12,0,3,0,0,0,0,0,50,0,1 +33,2,112941,1,9,1,8,1,0,0,0,0,40,0,1 +41,0,187322,0,13,0,3,0,0,0,0,0,40,0,0 +50,2,283676,5,10,2,10,0,0,0,0,0,40,0,0 +44,2,173682,5,10,1,6,1,0,0,0,0,40,0,0 +27,2,168470,0,13,0,1,0,0,0,0,0,40,0,0 +27,2,186454,0,13,0,3,0,2,0,13550,0,40,0,1 +58,2,141807,11,3,1,8,1,0,0,0,0,40,25,0 +25,2,245628,5,10,0,9,3,0,0,0,0,15,4,0 +31,2,264864,1,9,1,8,2,3,1,0,0,40,0,0 +39,2,262841,1,9,1,1,1,0,0,0,0,50,0,1 +55,2,37438,9,11,1,10,1,0,0,0,0,40,0,1 +22,2,170800,9,11,0,4,3,0,1,0,0,12,0,0 +44,2,152150,6,12,4,1,0,0,0,0,0,40,0,0 +44,2,159580,14,8,2,6,0,0,1,0,0,40,0,0 +61,2,477209,7,4,1,7,1,0,0,0,0,54,0,0 +32,2,70985,9,11,1,8,1,0,0,0,0,40,0,0 +35,2,241998,0,13,1,1,1,0,0,0,0,45,0,1 +28,2,249541,5,10,1,10,1,0,0,0,0,40,0,0 +57,2,135339,0,13,1,1,1,2,0,0,0,40,11,1 +32,2,44675,8,16,1,3,1,0,0,0,0,65,0,1 +46,0,247992,7,4,0,4,0,1,1,0,0,40,0,0 +26,1,221626,1,9,1,4,2,0,1,0,1579,20,0,0 +43,5,48087,1,9,1,10,1,0,0,0,0,40,0,0 +62,4,114045,1,9,2,4,0,0,1,0,0,35,0,0 +60,0,69251,3,14,1,3,1,2,0,0,0,38,26,1 +67,2,192670,1,9,2,5,0,0,1,0,0,20,0,0 +19,2,268392,1,9,0,5,4,1,1,0,0,30,0,0 +48,2,431513,12,6,1,10,1,0,0,0,0,65,0,1 +19,0,37332,1,9,0,0,0,0,1,0,0,20,0,0 +19,2,35865,5,10,0,4,0,0,1,0,0,30,0,0 +43,2,183891,1,9,2,1,4,0,1,0,0,40,0,0 +31,2,150309,8,16,1,3,2,0,1,0,0,90,0,0 +65,2,93318,5,10,1,1,2,0,1,0,0,45,0,0 +32,2,171814,1,9,0,8,0,0,1,0,0,40,0,0 +36,0,183735,3,14,1,3,1,0,0,0,0,40,0,1 +41,2,353541,1,9,1,8,1,0,0,0,0,40,4,0 +33,4,152351,5,10,1,11,1,0,0,3908,0,40,0,0 +34,2,345705,0,13,1,5,1,0,0,0,1977,50,0,1 +27,2,223751,5,10,0,10,0,0,0,0,0,45,0,0 +75,5,164570,2,7,0,1,0,0,0,0,0,50,0,0 +51,2,110747,1,9,1,10,1,0,0,0,1887,40,0,1 +47,2,34458,1,9,1,7,1,0,0,0,0,40,0,0 +31,2,254293,5,10,0,3,0,0,0,0,0,40,0,0 +40,2,270147,3,14,0,1,0,0,1,0,0,40,0,1 +48,2,195491,1,9,2,5,0,0,1,0,0,30,0,0 +36,4,255454,0,13,0,11,0,1,0,0,0,40,0,0 +18,2,126125,1,9,0,4,3,0,0,0,0,20,0,0 +33,2,618191,1,9,0,1,0,0,1,0,0,40,0,0 +34,2,163110,3,14,1,5,1,0,0,0,0,40,0,0 +51,2,145409,5,10,1,10,1,0,0,3103,0,48,0,1 +39,0,235379,6,12,2,3,0,0,1,0,0,40,0,0 +20,2,55465,1,9,0,4,3,0,0,0,0,35,0,0 +67,4,181220,5,10,2,0,0,1,1,0,0,20,0,0 +42,2,26672,9,11,0,0,0,0,1,0,0,60,0,0 +59,2,98361,2,7,1,8,1,0,0,0,0,40,0,0 +31,4,219883,1,9,0,11,0,1,0,0,0,40,0,0 +19,2,376683,5,10,0,4,4,1,1,2036,0,30,0,0 +47,2,33865,5,10,2,1,0,0,1,0,0,48,0,0 +68,2,168794,7,4,1,4,1,0,0,0,0,30,0,0 +30,2,94245,5,10,1,2,1,0,0,0,0,40,0,0 +34,2,34572,1,9,0,2,0,0,0,0,0,60,0,0 +49,2,348751,7,4,1,8,1,0,0,0,0,40,0,0 +38,2,65382,5,10,1,10,1,0,0,0,0,40,0,1 +60,2,116707,5,10,1,5,1,0,0,7298,0,40,0,1 +24,2,140001,0,13,0,0,0,0,0,0,0,40,0,0 +18,2,166889,5,10,0,2,3,1,1,0,1602,35,0,0 +24,2,117789,0,13,0,1,3,0,1,0,0,40,0,0 +21,2,238917,11,3,1,4,1,0,0,0,0,40,4,0 +48,4,242923,1,9,1,9,2,0,1,0,1848,40,0,1 +52,4,330799,4,5,1,4,2,0,1,0,0,40,0,0 +48,2,209460,1,9,2,2,0,0,0,0,0,40,0,0 +40,3,75313,0,13,1,3,1,0,0,7688,0,66,0,1 +20,2,184779,5,10,0,9,3,0,1,0,0,20,0,0 +31,2,139000,1,9,2,5,4,0,1,0,0,25,0,0 +30,2,361742,5,10,1,1,1,0,0,0,0,50,0,0 +51,2,203435,1,9,0,2,3,0,1,0,0,40,0,0 +29,2,100579,9,11,2,1,0,0,1,0,0,40,0,0 +56,1,356067,3,14,0,5,0,0,0,0,0,16,0,0 +46,2,87250,0,13,4,9,4,0,1,0,0,40,0,0 +41,2,264663,5,10,4,3,3,0,1,0,3900,40,0,0 +29,2,255817,11,3,0,4,5,0,1,0,0,40,22,0 +48,1,243631,1,9,1,1,1,2,0,0,0,30,27,0 +34,5,544268,1,9,2,5,0,0,1,0,0,50,0,0 +42,1,98061,9,11,1,1,1,0,0,0,0,50,0,0 +25,2,95691,1,9,0,4,4,0,1,0,0,30,13,0 +47,2,145868,2,7,2,4,4,1,1,0,0,40,0,0 +23,2,65038,1,9,0,5,3,0,0,0,0,40,0,0 +43,4,227734,9,11,1,6,1,0,0,0,0,22,0,0 +19,4,176831,5,10,0,4,3,1,1,0,0,35,0,0 +22,2,211678,1,9,0,2,3,0,0,0,0,40,0,0 +40,4,157240,0,13,2,3,4,0,1,0,0,70,0,0 +41,1,145441,9,11,1,10,1,0,0,0,0,40,29,0 +71,5,66624,0,13,1,1,1,0,0,0,2392,60,0,1 +42,2,76487,1,9,1,0,1,0,0,0,0,45,0,0 +31,0,557853,0,13,0,0,0,0,0,0,0,47,0,0 +58,1,118253,1,9,1,7,1,0,0,0,0,70,0,0 +36,2,146625,2,7,6,4,4,1,1,0,0,12,0,0 +31,2,174201,1,9,1,6,1,0,0,0,0,65,0,0 +41,2,121130,1,9,0,0,0,0,1,0,0,40,0,0 +35,2,385847,5,10,1,10,1,0,0,0,0,40,0,0 +28,2,114158,0,13,0,3,3,0,1,0,0,15,0,0 +27,2,381789,14,8,1,7,3,0,0,0,0,55,0,0 +17,2,82041,2,7,0,2,3,0,0,0,0,40,8,0 +35,1,115618,1,9,2,5,0,0,0,0,0,50,0,1 +45,1,106110,5,10,1,4,2,0,1,0,0,99,0,0 +44,2,267521,0,13,2,0,4,0,1,0,0,40,0,0 +27,2,90692,9,11,0,4,0,2,1,0,0,40,11,0 +51,2,57101,4,5,1,10,1,0,0,0,0,40,0,0 +49,2,236913,1,9,6,4,0,0,1,0,0,45,0,0 +64,1,388625,12,6,1,3,1,0,0,0,0,10,0,1 +54,1,261207,7,4,2,6,0,0,0,0,0,45,1,0 +43,2,245487,1,9,1,10,1,4,0,0,0,40,4,0 +32,2,262153,1,9,2,10,4,0,0,0,0,35,0,0 +36,2,225516,6,12,0,5,0,1,0,10520,0,43,0,1 +26,1,68729,1,9,0,5,5,2,0,0,0,50,0,1 +37,2,126954,0,13,1,1,1,0,0,0,0,50,0,1 +38,2,85074,6,12,2,0,4,0,1,0,0,40,0,0 +26,2,383306,14,8,1,10,1,0,0,0,0,40,0,0 +50,2,128143,0,13,1,10,1,0,0,0,1887,50,0,1 +47,2,185041,5,10,1,10,1,0,0,7298,0,40,0,1 +42,2,99373,1,9,2,8,0,0,1,0,0,40,0,0 +66,4,157942,1,9,6,6,0,1,1,0,0,40,0,0 +43,2,241928,1,9,4,0,0,1,1,0,0,32,0,0 +37,2,348739,0,13,1,3,1,0,0,0,0,45,0,1 +37,2,95654,12,6,2,1,4,0,1,0,0,35,0,0 +25,2,367306,5,10,0,9,3,0,1,0,0,40,0,0 +29,2,270421,0,13,1,10,1,0,0,0,0,50,0,1 +50,1,156951,6,12,1,8,1,0,0,3103,0,40,0,1 +42,0,39239,3,14,0,3,0,0,0,0,0,70,0,0 +32,2,72744,1,9,0,10,3,0,0,0,0,40,0,0 +42,0,367292,5,10,1,11,1,0,0,0,0,40,0,1 +41,1,408498,1,9,1,1,1,0,0,0,0,50,0,0 +25,2,361493,0,13,0,5,0,0,0,3325,0,40,0,0 +65,5,157403,1,9,1,5,1,0,0,0,0,50,0,0 +32,2,231263,5,10,1,8,1,0,0,0,0,50,0,0 +32,2,244147,1,9,0,10,4,0,0,0,0,10,0,0 +24,2,220944,5,10,1,10,1,0,0,0,0,60,0,0 +51,3,314007,1,9,2,1,0,0,1,0,0,40,0,0 +28,2,33374,2,7,3,4,4,0,1,0,0,35,0,0 +32,5,345489,5,10,1,1,1,0,0,0,0,55,0,1 +77,2,83601,10,15,1,1,1,0,0,0,0,40,0,0 +47,2,162302,1,9,2,0,4,0,1,0,0,20,0,0 +26,2,112847,1,9,0,2,0,0,0,0,0,40,0,0 +20,2,147344,5,10,0,2,3,0,0,0,0,20,0,0 +57,0,183657,5,10,1,3,1,1,0,0,0,35,0,1 +40,2,130760,8,16,1,3,1,0,0,0,0,45,0,0 +50,2,163948,3,14,1,5,1,0,0,0,0,40,0,1 +19,2,316797,7,4,1,2,3,0,0,0,0,45,4,0 +54,3,332243,14,8,1,0,1,0,0,0,0,40,0,0 +51,4,195844,5,10,1,11,1,0,0,0,0,40,0,1 +51,4,387250,0,13,1,0,1,0,0,0,0,50,0,1 +38,0,188303,5,10,1,11,1,0,0,7688,0,40,0,1 +17,2,178953,14,8,0,5,3,0,1,0,0,20,0,0 +32,2,398988,0,13,0,1,0,0,0,0,0,40,0,0 +29,2,535978,5,10,1,10,1,0,0,0,0,45,0,0 +42,2,296982,5,10,2,5,4,0,0,0,0,40,0,0 +40,2,231991,1,9,2,1,4,0,1,0,0,40,0,0 +27,2,295799,5,10,1,10,1,0,0,0,0,40,0,0 +22,0,201569,0,13,0,3,3,0,1,0,0,20,0,0 +58,2,193568,2,7,6,4,0,0,1,0,0,40,0,0 +61,2,97128,0,13,1,5,1,0,0,0,0,45,0,1 +42,2,203393,0,13,1,10,2,1,1,0,0,35,0,1 +49,2,138370,3,14,3,11,0,2,0,0,0,40,3,0 +43,2,91949,1,9,2,8,0,1,1,0,0,40,0,0 +46,2,228372,0,13,2,5,4,0,0,0,0,40,0,1 +28,2,132191,1,9,1,6,1,0,0,0,0,45,0,1 +39,1,274683,5,10,1,5,1,0,0,7688,0,50,0,1 +50,4,196307,5,10,1,10,1,0,0,7688,0,40,0,1 +57,2,195835,5,10,3,0,0,0,0,0,0,40,0,0 +47,2,185399,1,9,1,4,2,0,1,0,0,38,0,0 +79,1,103684,1,9,1,7,1,0,0,0,0,40,0,0 +40,2,140559,1,9,1,13,2,0,1,0,0,45,0,0 +35,3,110188,0,13,1,3,1,2,0,0,0,40,36,0 +35,4,668319,0,13,1,1,1,0,0,0,1740,80,0,0 +30,2,112358,0,13,1,4,1,0,0,0,0,60,0,1 +26,2,151810,12,6,0,7,0,1,0,0,0,40,0,0 +49,2,48120,1,9,0,6,4,1,1,1506,0,40,0,0 +48,2,144844,1,9,1,10,1,0,0,0,0,40,0,0 +22,2,205839,5,10,0,4,0,0,0,0,0,45,0,0 +22,2,113760,2,7,0,4,3,0,1,0,0,30,0,0 +50,2,138358,12,6,4,0,0,1,1,0,0,47,2,0 +47,1,216657,1,9,1,7,1,0,0,0,0,60,0,0 +36,2,278576,1,9,1,6,1,0,0,0,0,50,0,0 +44,2,174373,6,12,1,10,1,0,0,0,0,40,0,1 +73,2,220019,4,5,6,4,4,0,1,0,0,9,0,0 +34,2,303867,0,13,1,3,1,0,0,0,0,40,0,1 +37,2,154210,5,10,1,10,1,2,0,0,0,40,37,0 +46,2,202560,5,10,1,0,2,0,1,0,0,40,0,1 +29,2,423024,11,3,1,7,1,0,0,0,0,40,4,0 +24,2,206671,9,11,1,10,1,0,0,0,0,40,0,0 +29,0,245310,5,10,0,3,0,0,0,0,0,35,0,0 +18,2,31983,14,8,0,0,3,0,1,0,0,20,0,0 +41,2,124956,0,13,2,1,4,1,1,0,0,90,0,1 +59,2,118358,1,9,1,10,1,0,0,0,0,40,0,1 +27,2,491421,11,3,0,7,4,0,0,0,0,50,0,0 +50,2,151580,6,12,1,10,1,0,0,0,0,45,0,0 +25,2,248990,15,2,0,8,0,0,0,0,0,24,4,0 +42,2,157425,0,13,2,1,4,0,1,0,0,45,0,0 +36,2,221650,5,10,1,10,1,0,0,0,0,40,28,0 +62,2,88055,5,10,1,0,1,0,0,0,0,60,0,1 +71,2,216608,9,11,0,0,0,0,1,0,0,40,0,0 +38,2,682947,0,13,2,1,0,0,0,0,0,55,0,1 +44,2,228124,1,9,3,0,4,1,1,0,0,40,0,0 +49,1,171540,5,10,1,7,1,0,0,0,0,60,0,0 +60,5,210827,0,13,1,3,1,0,0,7688,0,40,0,1 +28,1,410351,1,9,1,1,1,0,0,0,0,40,12,0 +26,2,163747,0,13,0,5,0,0,1,0,0,55,0,0 +18,2,108892,2,7,0,2,3,0,0,0,0,12,0,0 +43,2,180096,9,11,1,10,1,0,0,0,0,50,0,1 +65,4,153890,14,8,6,1,0,0,0,2009,0,44,0,0 +23,2,117480,12,6,0,10,3,0,0,0,0,44,0,0 +21,2,163333,5,10,0,4,3,0,1,0,0,35,0,0 +20,1,306710,1,9,0,7,3,0,0,0,0,40,0,0 +19,2,150553,5,10,0,5,3,2,1,0,0,18,11,0 +77,2,123959,1,9,6,0,0,0,1,0,0,32,0,0 +32,2,24961,9,11,1,9,1,0,0,0,0,40,0,0 +37,4,327120,5,10,1,6,1,0,0,0,0,30,0,0 +29,1,33798,1,9,1,6,1,0,0,0,0,45,0,0 +59,2,81929,8,16,1,3,1,0,0,0,2415,45,0,1 +22,2,298489,5,10,0,10,3,0,0,0,0,40,0,0 +31,2,144064,1,9,1,10,1,0,0,0,0,48,0,1 +59,1,195835,1,9,1,5,1,0,0,0,0,60,0,0 +29,3,184723,5,10,0,4,0,0,1,0,0,40,0,1 +56,2,265086,1,9,1,10,1,0,0,0,0,50,0,1 +19,2,235909,5,10,0,0,3,0,1,0,0,20,0,0 +37,2,42645,1,9,1,7,1,0,0,0,0,40,0,0 +58,0,279878,3,14,1,1,1,0,0,0,0,40,0,1 +41,2,104892,3,14,1,1,1,0,0,0,0,40,0,1 +29,2,137063,1,9,0,5,4,0,0,0,0,38,0,0 +38,1,58972,1,9,1,1,1,0,0,0,0,50,0,0 +36,2,126675,3,14,1,3,1,0,0,0,1977,50,0,1 +19,2,286435,5,10,0,10,3,0,0,594,0,40,0,0 +46,2,191389,1,9,1,1,2,0,1,0,0,28,0,1 +42,2,183241,3,14,1,3,2,0,1,0,0,45,0,1 +29,2,91547,5,10,0,5,0,0,1,0,0,40,0,0 +42,2,52781,0,13,1,3,1,0,0,7688,0,40,0,1 +29,2,210959,6,12,1,0,1,0,0,0,0,40,0,0 +47,2,365516,3,14,2,3,4,0,1,0,0,40,0,0 +37,2,112271,2,7,1,10,1,0,0,0,0,40,0,1 +39,2,269455,1,9,1,7,1,0,0,0,0,45,0,0 +46,2,164379,0,13,2,5,4,1,1,0,0,35,0,1 +28,2,109621,6,12,1,6,1,0,0,0,0,40,0,0 +36,2,104858,5,10,1,7,1,0,0,0,0,56,0,1 +39,2,99270,1,9,2,0,3,0,1,0,0,40,0,0 +44,2,193524,5,10,1,3,1,0,0,0,0,40,0,0 +60,0,313946,1,9,1,4,1,0,0,0,0,40,0,0 +35,2,162358,0,13,0,1,0,0,1,0,0,50,0,1 +59,2,200700,0,13,1,10,1,1,0,0,0,48,0,1 +21,2,116489,5,10,0,5,3,0,1,0,0,60,0,0 +22,2,118310,6,12,0,3,3,0,1,0,0,16,0,0 +31,2,352465,5,10,1,1,1,0,0,15024,0,50,0,1 +40,2,107433,0,13,1,1,1,0,0,0,1977,50,0,1 +33,2,296538,1,9,1,5,1,0,0,0,0,45,0,1 +41,4,195897,3,14,1,3,1,0,0,0,0,60,0,0 +31,1,216283,6,12,1,4,2,0,1,0,0,35,0,1 +62,2,345780,9,11,2,4,0,0,0,0,0,40,0,0 +43,2,216685,1,9,1,3,2,0,1,0,0,35,0,0 +28,4,210945,0,13,0,3,0,1,1,0,0,60,0,0 +43,2,184321,12,6,1,8,1,1,0,0,1887,40,0,1 +55,1,322691,3,14,1,5,1,0,0,3103,0,55,0,1 +42,2,192712,1,9,4,4,4,0,1,0,0,25,0,0 +23,2,178272,0,13,0,3,0,0,1,0,0,40,0,0 +55,3,321333,5,10,1,0,1,0,0,0,0,40,0,1 +44,5,120277,0,13,1,1,1,0,0,99999,0,45,0,1 +19,2,294029,2,7,0,5,3,4,1,0,0,32,35,0 +23,2,112819,1,9,0,8,3,0,0,0,0,40,0,0 +41,2,152636,1,9,2,10,4,0,1,0,0,50,0,0 +51,2,134808,1,9,4,2,4,0,1,0,0,40,0,0 +49,2,64216,1,9,2,6,0,0,0,0,0,90,0,0 +29,0,214284,3,14,0,3,4,2,1,0,0,20,18,0 +25,2,469572,5,10,0,3,0,0,0,8614,0,40,0,1 +44,1,282722,10,15,1,3,1,0,0,99999,0,50,0,1 +17,2,231439,2,7,0,2,3,0,0,0,0,30,0,0 +42,5,120277,3,14,1,1,1,0,0,0,0,40,0,1 +21,2,364685,2,7,0,9,3,0,1,0,0,35,0,0 +26,2,18827,5,10,0,6,0,0,0,0,0,40,0,0 +24,2,169129,5,10,0,3,0,0,0,0,0,40,0,0 +30,2,202051,0,13,1,1,1,0,0,0,0,42,0,1 +19,2,574271,1,9,0,2,3,0,0,0,0,28,0,0 +65,0,29276,7,4,6,4,5,0,1,0,0,24,0,0 +52,1,104501,5,10,1,9,1,0,0,0,0,60,0,1 +17,2,394176,12,6,0,2,3,0,0,0,0,20,0,0 +27,2,85625,1,9,0,4,3,0,0,0,0,22,0,0 +53,2,340723,10,15,0,3,0,0,1,0,0,40,0,0 +24,2,149342,0,13,0,5,0,0,1,0,0,40,0,0 +37,2,73715,5,10,1,10,1,0,0,0,0,40,0,1 +34,2,143083,9,11,1,0,2,0,1,0,0,18,0,0 +40,4,290660,6,12,2,1,0,0,0,8614,0,50,0,1 +49,4,98738,1,9,1,10,1,0,0,0,0,40,0,1 +86,2,149912,3,14,0,0,0,0,1,0,0,40,0,0 +49,2,309033,9,11,1,3,2,0,1,15024,0,60,0,1 +43,1,96129,2,7,1,2,1,0,0,0,0,60,0,0 +47,2,216096,5,10,3,1,4,0,1,0,0,35,5,0 +32,2,171091,1,9,1,6,1,0,0,0,0,50,0,1 +30,1,79303,9,11,1,7,1,0,0,0,0,60,0,0 +25,4,182380,1,9,0,10,3,0,0,0,0,40,0,0 +42,2,36271,0,13,1,5,1,0,0,0,0,40,0,1 +60,2,118197,5,10,1,10,1,0,0,0,0,65,0,0 +46,2,269652,5,10,1,10,1,0,0,4386,0,38,0,1 +39,4,193815,5,10,1,11,1,0,0,0,0,40,0,1 +28,2,141957,6,12,1,9,1,0,0,0,1887,70,0,1 +26,2,222637,12,6,0,10,0,0,0,0,0,55,5,0 +27,2,118230,5,10,0,0,3,0,1,0,0,40,0,0 +59,2,174040,5,10,2,3,4,0,0,0,0,40,0,0 +64,0,105748,1,9,1,7,1,0,0,0,0,40,0,0 +90,1,82628,1,9,0,1,0,0,0,2964,0,12,0,0 +51,2,205100,5,10,2,5,0,0,1,0,0,45,0,1 +36,2,107916,1,9,1,6,1,0,0,0,2002,40,0,0 +39,2,130620,7,4,3,8,4,4,1,0,0,40,21,0 +47,1,235646,3,14,1,3,1,0,0,0,0,40,0,1 +32,2,53277,3,14,1,1,1,0,0,0,0,60,0,1 +24,2,456460,6,12,1,0,2,0,1,0,0,40,0,0 +23,2,293091,1,9,0,5,3,0,0,0,0,30,0,0 +62,2,210935,1,9,1,4,1,0,0,0,0,20,0,0 +35,1,233533,0,13,4,10,0,0,0,0,0,65,0,0 +27,2,95647,0,13,0,3,3,2,0,0,0,40,0,0 +49,2,199763,5,10,2,8,0,0,1,0,0,35,0,0 +18,2,74539,12,6,0,5,0,0,0,0,0,20,0,0 +19,2,84610,5,10,0,4,3,0,1,0,0,30,0,0 +63,5,96930,6,12,1,5,1,0,0,0,0,40,0,1 +54,2,115602,1,9,1,4,2,1,1,0,0,40,0,0 +24,2,237341,5,10,1,3,2,0,1,0,0,40,0,1 +61,2,143800,12,6,1,6,1,0,0,0,0,50,0,1 +50,5,163921,1,9,1,5,1,0,0,0,0,48,0,1 +36,2,68273,0,13,1,5,1,0,0,0,0,40,0,1 +21,2,113163,5,10,0,0,3,0,0,0,0,50,0,0 +38,5,478829,10,15,1,3,1,0,0,99999,0,50,0,1 +30,2,345705,5,10,1,1,5,0,0,0,0,40,0,0 +22,2,385077,1,9,0,10,3,0,0,2907,0,40,0,0 +33,2,192286,5,10,2,0,0,2,1,0,0,52,0,0 +39,4,236391,1,9,1,8,1,0,0,0,0,38,0,1 +42,2,106679,1,9,1,10,1,0,0,0,0,50,0,1 +42,4,46094,0,13,2,6,0,0,0,0,0,33,0,0 +29,2,194940,0,13,1,1,1,0,0,0,0,40,0,0 +35,2,341643,0,13,0,5,0,0,0,0,0,55,0,0 +23,2,210474,5,10,0,4,3,0,1,0,0,30,0,0 +28,2,76313,5,10,1,10,1,3,0,0,0,60,0,0 +34,2,115858,1,9,2,0,3,0,1,0,0,40,0,0 +40,2,55191,5,10,0,0,0,1,1,0,0,40,0,0 +67,1,364862,1,9,6,4,0,0,1,0,0,30,0,0 +49,2,334787,1,9,1,4,1,0,0,0,0,40,0,0 +34,2,205733,1,9,0,0,0,0,1,0,0,40,0,0 +26,2,333677,0,13,0,1,3,0,0,2463,0,35,0,0 +25,2,208591,1,9,0,8,3,0,0,0,0,40,0,0 +40,2,341204,5,10,2,1,4,0,1,1831,0,30,0,0 +56,1,115422,1,9,1,7,1,0,0,0,0,40,0,0 +35,5,111319,6,12,1,5,1,0,0,0,1887,45,0,1 +54,2,816750,1,9,1,10,1,0,0,0,2051,40,0,0 +25,2,167835,0,13,0,1,0,0,1,3325,0,40,0,0 +28,2,92262,0,13,1,5,1,0,0,0,0,40,0,0 +31,2,91964,0,13,0,1,0,0,0,0,0,40,0,0 +45,2,107682,1,9,2,0,4,0,1,0,0,40,0,0 +52,0,135388,1,9,1,10,1,0,0,5013,0,40,0,0 +39,1,597843,3,14,0,3,0,0,1,0,0,50,13,0 +19,2,389942,1,9,0,5,0,0,0,0,0,40,0,0 +23,2,442274,14,8,0,0,4,0,0,0,0,40,0,0 +23,2,595461,7,4,0,10,0,0,0,0,0,40,4,0 +52,2,284329,9,11,1,3,1,0,0,15024,0,40,0,1 +33,1,127894,10,15,1,3,1,0,0,0,0,60,0,1 +35,2,196899,0,13,0,2,0,2,1,0,0,50,19,0 +58,2,212534,1,9,1,10,1,0,0,0,0,40,0,0 +61,2,71209,1,9,1,10,1,0,0,0,0,45,0,1 +39,2,237943,0,13,1,1,1,0,0,99999,0,70,0,1 +38,2,190759,2,7,1,10,1,0,0,0,0,40,0,0 +59,2,100313,1,9,1,1,1,0,0,0,1887,40,0,1 +41,2,344624,0,13,2,1,0,0,0,0,0,50,0,1 +19,2,87497,2,7,0,6,5,0,0,0,0,10,0,0 +22,2,236907,5,10,0,2,3,0,0,0,0,20,0,0 +59,2,169639,6,12,6,1,4,0,1,0,0,40,0,0 +37,2,105803,1,9,1,10,1,0,0,3103,0,45,0,1 +31,2,149507,14,8,1,10,1,0,0,0,0,43,0,0 +18,2,294387,2,7,0,2,0,0,0,0,0,40,0,0 +20,2,161708,5,10,0,5,3,0,1,0,0,35,0,0 +28,2,282389,1,9,0,6,0,0,0,0,0,60,0,0 +28,2,64940,5,10,0,4,3,0,1,0,0,30,0,0 +49,2,195727,0,13,1,1,1,0,0,0,0,40,0,0 +38,4,37931,1,9,1,11,1,0,0,0,0,40,0,1 +19,2,170720,1,9,0,5,3,0,0,0,0,20,0,0 +43,2,152958,0,13,1,1,1,0,0,7298,0,40,0,1 +28,2,312372,1,9,1,1,1,1,0,15024,0,40,0,1 +41,2,39581,5,10,2,0,0,1,1,0,0,24,22,0 +50,2,206862,3,14,1,1,1,0,0,0,0,65,0,1 +46,2,216934,0,13,2,0,0,0,0,0,0,40,20,0 +20,2,143062,5,10,0,7,3,0,0,0,0,40,0,0 +45,2,242391,0,13,1,1,1,0,0,0,0,60,0,1 +28,2,165030,5,10,0,1,0,0,1,0,0,50,0,0 +37,2,199251,5,10,1,4,2,0,1,0,0,40,0,0 +46,1,353012,8,16,1,3,1,0,0,0,1902,50,0,1 +66,2,174491,1,9,1,2,1,0,0,0,0,40,0,0 +38,2,203138,0,13,1,0,2,0,1,0,0,50,0,1 +25,2,220220,2,7,0,2,3,0,0,0,0,45,0,0 +55,3,305850,10,15,1,1,1,0,0,15024,0,40,0,1 +48,4,273402,7,4,1,6,1,0,0,0,1902,40,0,0 +56,2,201344,5,10,6,10,4,0,1,0,0,38,0,0 +47,1,218676,3,14,1,1,1,0,0,0,0,45,0,0 +55,1,141807,0,13,1,1,1,0,0,0,0,40,0,1 +41,0,222434,6,12,1,11,1,0,0,0,0,40,0,0 +47,2,266860,5,10,1,5,1,0,0,0,0,65,0,1 +40,2,34113,1,9,0,1,0,3,0,6849,0,43,0,0 +41,2,159549,0,13,1,5,1,0,0,0,0,40,0,0 +21,2,195248,5,10,0,5,3,4,1,0,0,20,0,0 +52,2,109413,1,9,0,5,0,0,0,0,0,40,0,0 +62,2,195343,8,16,2,3,4,0,0,15020,0,50,0,1 +46,2,185291,2,7,1,2,1,0,0,0,0,45,0,1 +35,1,114366,0,13,1,3,1,0,0,0,0,40,0,0 +29,2,169631,1,9,3,0,3,0,1,0,0,40,0,0 +21,2,163870,12,6,1,4,1,0,0,3908,0,40,0,0 +35,2,312232,1,9,4,10,0,0,0,0,0,50,0,0 +46,2,229737,0,13,1,5,1,0,0,0,0,50,3,1 +35,2,161637,8,16,1,3,1,2,0,0,1902,40,18,1 +34,2,106014,5,10,2,10,0,0,0,0,0,60,0,0 +21,2,25265,9,11,0,8,0,0,0,0,0,30,0,0 +29,2,71860,1,9,1,7,1,0,0,0,0,60,0,0 +41,5,94113,3,14,1,1,1,0,0,0,0,60,0,1 +51,1,208003,1,9,1,5,1,0,0,0,0,40,0,0 +22,2,113550,1,9,0,0,3,0,1,0,0,40,0,0 +47,2,83046,0,13,0,1,0,0,0,0,0,40,0,0 +42,5,277488,10,15,1,3,1,0,0,15024,0,65,0,1 +19,2,205830,1,9,0,4,3,0,1,0,0,40,22,0 +46,2,273575,0,13,1,6,1,0,0,15024,0,40,0,1 +23,2,245147,5,10,0,2,3,1,0,0,0,40,0,0 +49,2,274720,1,9,1,10,1,1,0,0,0,40,0,0 +58,1,163047,0,13,2,3,0,0,1,0,0,40,0,0 +41,0,47902,0,13,1,0,1,0,0,0,0,50,0,1 +50,2,128798,0,13,1,9,1,0,0,0,0,40,0,1 +77,2,154205,1,9,6,0,0,0,1,0,0,10,0,0 +27,2,176683,9,11,1,4,1,0,0,0,0,60,0,0 +29,5,104737,1,9,1,10,1,0,0,0,0,60,0,0 +54,2,349340,13,1,1,10,1,2,0,0,0,40,3,0 +39,0,218249,5,10,4,3,4,1,1,0,0,37,0,0 +32,2,281540,5,10,1,9,1,0,0,0,0,50,0,0 +36,3,112847,0,13,1,3,1,2,0,0,0,40,0,0 +24,4,126613,0,13,0,3,3,0,1,0,0,20,0,0 +50,1,145419,3,14,1,5,1,0,0,7688,0,45,0,1 +32,1,34572,1,9,2,7,0,0,0,0,0,65,0,0 +26,2,104045,0,13,0,1,0,0,1,0,0,40,0,0 +38,2,359001,9,11,1,3,1,0,0,0,0,42,0,0 +47,2,105273,0,13,6,10,4,1,1,6497,0,40,0,0 +31,2,201122,5,10,1,1,1,0,0,0,0,40,0,1 +38,2,160035,1,9,1,10,1,0,0,0,0,55,0,0 +50,2,167886,5,10,1,5,1,0,0,0,0,40,0,1 +18,2,32059,2,7,0,2,3,0,0,0,0,40,0,0 +59,5,200453,3,14,1,5,1,0,0,0,0,40,0,0 +56,1,403072,5,10,1,10,1,0,0,0,0,50,0,1 +34,2,37210,1,9,0,0,3,0,0,0,0,50,0,0 +32,2,199416,0,13,1,3,1,0,0,0,0,40,0,0 +29,2,413227,0,13,0,4,0,0,0,0,0,35,0,0 +42,2,226902,0,13,1,9,1,0,0,0,0,45,0,1 +37,2,195189,5,10,2,4,4,1,1,0,0,40,0,0 +36,2,116608,1,9,2,1,0,0,1,0,0,40,0,0 +59,2,99131,3,14,6,1,0,0,1,0,0,40,0,1 +32,2,553405,0,13,1,5,1,0,0,99999,0,50,0,1 +52,4,186117,1,9,1,11,1,0,0,0,0,56,0,1 +29,0,67053,1,9,0,4,0,2,0,0,0,40,15,0 +39,2,347960,10,15,0,3,0,0,1,14084,0,35,0,1 +39,2,325374,5,10,0,0,0,0,0,0,0,40,0,0 +69,2,130413,0,13,6,1,0,0,1,2346,0,15,0,0 +43,2,111949,1,9,1,4,2,0,1,0,0,35,0,0 +39,2,278557,9,11,1,10,1,0,0,0,1628,48,0,0 +19,2,194905,5,10,0,4,3,0,1,0,0,30,0,0 +60,4,195453,9,11,1,1,1,0,0,0,0,60,0,1 +51,2,282549,1,9,1,8,1,1,0,3137,0,40,0,0 +75,2,316119,5,10,6,3,0,0,1,0,0,8,0,0 +37,0,252939,9,11,0,3,4,1,1,5455,0,40,0,0 +20,2,316043,2,7,0,4,3,1,0,594,0,20,0,0 +58,3,319733,1,9,1,6,1,0,0,0,0,70,0,0 +21,0,99199,3,14,0,6,3,0,0,0,0,15,0,0 +28,2,204600,1,9,4,11,5,0,0,0,0,40,0,0 +40,2,173307,12,6,1,8,1,0,0,0,0,40,0,0 +45,1,34446,1,9,1,6,1,0,0,0,0,50,0,0 +40,1,237293,10,15,1,3,2,0,1,15024,0,40,0,1 +41,2,175642,5,10,0,10,0,0,1,0,0,40,0,0 +58,2,203735,1,9,2,1,4,0,1,0,0,40,0,0 +44,4,171589,9,11,1,10,1,0,0,7688,0,40,0,1 +26,2,197967,1,9,1,5,1,0,0,0,0,65,0,0 +29,2,413297,6,12,0,5,0,0,0,0,0,45,4,0 +45,2,240841,3,14,0,3,0,0,1,0,0,40,0,0 +23,2,152189,6,12,0,4,0,0,0,0,0,40,0,0 +39,0,85874,1,9,2,0,4,0,1,0,0,40,0,0 +45,1,176814,8,16,1,3,1,0,0,15024,0,40,0,1 +51,4,133336,3,14,1,3,1,0,0,15024,0,40,0,1 +22,2,362623,1,9,0,2,3,0,0,0,0,40,0,0 +28,2,30912,1,9,1,0,1,0,0,0,0,40,0,0 +23,2,35448,5,10,0,4,4,0,1,0,0,25,0,0 +33,2,173248,1,9,1,4,1,1,0,0,0,35,0,0 +37,2,49626,9,11,1,9,1,0,0,0,0,43,0,0 +19,2,102723,5,10,0,0,3,0,1,0,0,40,0,0 +35,2,168322,2,7,1,7,1,0,0,0,0,40,0,0 +62,2,131117,7,4,2,9,4,0,1,0,0,38,13,0 +25,2,110138,1,9,0,4,0,0,0,0,0,40,0,0 +21,2,107452,1,9,0,10,5,0,0,0,0,40,0,0 +32,2,160594,5,10,0,4,3,0,0,0,0,35,0,0 +32,4,186784,0,13,1,3,2,0,1,5013,0,45,0,0 +70,4,334666,1,9,6,0,0,0,1,0,0,12,0,0 +57,2,104272,2,7,1,10,1,0,0,0,0,40,0,0 +31,2,19491,5,10,0,10,0,0,0,0,0,40,0,0 +37,2,128715,0,13,1,1,1,0,0,0,0,60,0,1 +34,2,128063,1,9,2,4,4,0,1,0,0,36,0,0 +26,1,37023,5,10,1,7,1,0,0,0,0,78,0,0 +44,2,68748,5,10,1,5,1,0,0,0,0,48,0,0 +66,2,140576,7,4,1,10,1,0,0,0,0,40,0,0 +39,4,327435,1,9,2,10,4,0,1,0,0,40,0,0 +31,2,202729,1,9,1,8,1,0,0,0,0,40,0,1 +53,2,277471,9,11,1,9,1,0,0,0,0,40,0,1 +36,2,189670,1,9,1,8,2,0,1,0,0,50,0,0 +61,2,204908,4,5,1,10,1,0,0,0,0,40,0,0 +43,2,171841,0,13,1,5,1,0,0,0,0,40,0,1 +38,2,78247,5,10,1,1,1,0,0,0,0,40,0,0 +26,2,68895,1,9,0,0,0,0,0,0,0,50,4,0 +27,2,56658,1,9,1,2,1,3,0,0,0,8,0,0 +58,4,259216,4,5,2,4,0,0,1,0,0,40,0,0 +37,0,270278,1,9,2,0,4,0,1,0,0,12,5,0 +56,2,238806,7,4,1,10,1,0,0,0,0,26,0,0 +36,2,111128,5,10,4,1,0,0,0,0,0,60,0,1 +29,2,119429,1,9,0,10,0,1,0,0,0,40,0,0 +28,2,73037,12,6,0,6,4,0,0,0,0,30,0,0 +61,1,84409,8,16,1,3,1,0,0,0,0,40,0,1 +66,1,274451,4,5,1,7,1,0,0,0,0,25,0,1 +31,2,246439,5,10,1,7,1,0,0,7298,0,50,0,1 +21,2,124242,6,12,0,4,3,0,1,0,0,40,0,0 +67,1,123393,1,9,1,6,1,0,0,6418,0,58,0,1 +26,2,159732,1,9,6,6,0,0,0,0,0,40,0,0 +21,2,161415,5,10,0,10,0,0,0,0,0,50,0,0 +33,2,157568,1,9,1,8,1,0,0,0,0,40,0,0 +33,2,168030,1,9,2,4,4,0,1,0,0,32,0,0 +59,0,349910,0,13,1,1,1,0,0,10605,0,50,0,1 +82,5,130329,7,4,1,7,1,0,0,0,0,50,0,0 +34,0,56964,8,16,1,3,2,0,1,0,0,50,0,1 +29,2,370509,0,13,1,1,1,0,0,0,0,50,23,1 +19,2,106306,5,10,2,4,3,0,1,0,0,40,0,0 +57,1,56480,1,9,1,1,1,0,0,0,0,1,0,0 +41,2,115932,5,10,1,1,1,0,0,99999,0,50,0,1 +55,2,154580,12,6,1,4,1,1,0,2580,0,40,0,0 +27,2,404421,5,10,0,2,0,1,0,0,0,40,0,0 +33,2,194901,1,9,0,10,0,0,0,0,0,45,0,0 +43,0,164790,5,10,2,0,0,1,0,0,0,50,0,1 +72,3,94242,5,10,6,9,0,0,1,0,0,16,0,0 +68,1,365020,1,9,1,5,1,0,0,0,0,40,0,0 +29,2,160512,1,9,4,0,3,0,1,0,0,40,0,0 +41,2,170331,0,13,1,3,1,0,0,0,0,60,0,0 +30,2,101266,1,9,1,11,1,0,0,0,0,40,0,0 +31,2,100252,0,13,2,4,0,2,0,99999,0,70,0,1 +54,2,217718,11,3,3,4,4,1,1,0,0,30,19,0 +32,2,170154,6,12,4,1,4,0,1,25236,0,50,0,1 +56,2,105281,1,9,6,5,0,0,1,0,1974,40,0,0 +41,0,283917,9,11,1,3,1,0,0,0,0,35,0,1 +48,2,39530,1,9,2,0,0,0,1,0,0,40,0,0 +66,1,212185,7,4,1,7,1,0,0,0,0,48,0,0 +25,5,90752,0,13,0,5,0,0,1,0,0,50,0,0 +31,2,202450,1,9,1,8,1,0,0,0,1573,40,0,0 +32,2,168138,6,12,2,5,0,0,0,2597,0,48,0,0 +51,2,159755,0,13,1,1,1,0,0,7688,0,40,0,1 +42,2,191765,1,9,0,0,5,1,1,0,2339,40,33,0 +31,2,340880,10,15,1,3,1,0,0,0,0,60,0,1 +43,1,113211,1,9,1,1,2,0,1,0,0,40,0,0 +42,2,134509,5,10,0,6,4,1,1,0,0,40,0,0 +20,0,147280,1,9,0,4,5,4,0,0,0,40,0,0 +40,2,145441,0,13,1,3,1,0,0,0,0,40,0,1 +65,2,398001,1,9,6,0,0,0,1,0,0,20,0,0 +53,2,31588,0,13,1,3,1,0,0,0,0,52,0,1 +56,2,189975,5,10,1,10,1,0,0,0,1902,60,0,1 +51,0,231495,8,16,1,1,1,0,0,7688,0,55,0,1 +44,2,186916,3,14,1,1,1,0,0,0,0,50,0,1 +49,5,213140,1,9,1,1,1,0,0,0,1902,60,0,1 +47,2,176893,1,9,2,10,0,1,0,8614,0,44,0,1 +22,2,115244,6,12,1,3,2,0,1,0,0,40,0,0 +53,2,313243,5,10,4,10,0,0,0,0,2444,45,0,1 +41,4,169995,5,10,2,11,0,0,0,0,0,20,0,0 +19,2,198459,1,9,0,0,3,0,0,0,2001,40,0,0 +27,4,66824,0,13,0,3,0,3,1,3325,0,43,0,0 +48,1,52240,9,11,1,1,2,0,1,0,0,25,0,1 +52,2,35305,7,4,0,4,3,0,1,0,0,7,0,0 +61,0,186451,10,15,1,3,1,0,0,0,1902,40,0,1 +45,1,160724,0,13,1,1,1,2,0,0,0,45,26,1 +29,2,210464,4,5,1,8,1,0,0,0,0,40,0,0 +41,2,207685,5,10,2,4,0,0,0,0,0,21,0,0 +38,2,233717,5,10,2,1,4,1,0,0,0,60,0,0 +32,2,222205,5,10,1,3,2,0,1,0,0,40,0,1 +37,2,167613,1,9,1,4,1,0,0,0,0,40,0,0 +55,2,148773,12,6,1,8,1,0,0,0,0,40,0,0 +62,4,68268,1,9,1,6,1,0,0,0,0,40,0,0 +48,2,174533,1,9,1,8,1,0,0,0,0,40,0,0 +43,2,273230,5,10,1,1,1,0,0,0,0,50,0,1 +25,2,187502,1,9,0,5,3,1,0,0,0,24,0,0 +47,2,209320,1,9,4,4,0,0,1,0,0,40,0,0 +49,1,56841,0,13,1,7,1,0,0,0,0,70,0,0 +55,2,254627,1,9,1,4,1,0,0,0,0,40,0,0 +42,2,42703,1,9,2,0,4,0,1,0,0,40,0,0 +40,2,374137,1,9,2,0,3,0,0,0,0,40,0,0 +34,2,196385,9,11,1,1,1,0,0,0,0,40,0,0 +38,2,192930,1,9,4,5,4,0,1,0,0,10,0,0 +39,2,99527,1,9,1,10,1,0,0,0,0,40,0,1 +45,2,185437,6,12,2,10,0,0,1,0,0,55,0,0 +43,2,247162,6,12,0,5,3,0,0,0,0,40,0,0 +32,3,131534,1,9,0,1,0,1,1,0,0,40,0,0 +18,2,184693,5,10,0,4,3,0,1,0,0,20,4,0 +27,2,704108,3,14,0,3,0,0,0,0,0,40,0,0 +57,2,220262,6,12,2,9,0,0,1,0,0,40,0,0 +38,2,95654,1,9,1,0,2,0,1,0,0,60,0,0 +67,2,89346,0,13,1,3,1,0,0,0,0,40,0,1 +26,2,94392,2,7,4,4,4,0,1,0,0,20,0,0 +21,2,334113,1,9,0,8,3,0,0,0,0,40,0,0 +17,2,32763,12,6,0,4,3,0,0,0,0,15,0,0 +31,2,136651,1,9,1,10,1,0,0,0,0,40,4,0 +51,1,240236,6,12,4,5,0,1,0,0,0,30,0,0 +29,2,53271,0,13,1,1,1,0,0,0,0,40,0,1 +28,2,31493,0,13,0,10,3,0,0,0,0,40,0,1 +32,2,195891,6,12,1,3,1,0,0,0,0,45,0,1 +31,4,209103,5,10,1,11,1,0,0,3464,0,45,0,0 +26,2,211424,5,10,1,2,1,0,0,0,0,40,0,1 +28,4,84657,0,13,2,3,0,0,1,0,0,40,0,0 +40,2,151408,3,14,0,3,0,0,1,0,0,40,0,0 +51,2,106819,7,4,0,2,3,0,0,0,0,19,0,0 +62,2,132917,5,10,1,6,1,1,0,0,0,20,0,0 +54,2,146834,12,6,1,8,1,0,0,0,0,60,0,0 +55,2,164332,1,9,4,4,0,0,1,0,0,16,0,0 +24,2,30656,1,9,0,2,0,0,0,0,0,20,0,0 +27,2,113501,3,14,0,0,3,0,0,0,0,45,0,0 +18,2,165316,1,9,0,6,3,0,0,0,0,30,0,0 +22,2,233955,0,13,0,3,0,3,1,14344,0,40,0,1 +21,2,126613,1,9,0,5,0,0,1,0,0,40,0,0 +44,1,361280,5,10,1,5,1,2,0,0,0,80,11,1 +38,2,165472,0,13,1,3,1,0,0,0,0,40,0,1 +39,2,99452,0,13,1,3,1,0,0,0,0,50,0,1 +27,2,84977,1,9,1,10,1,0,0,0,0,40,0,0 +35,2,240458,2,7,2,10,0,1,0,0,0,40,0,0 +51,2,230858,5,10,1,10,1,0,0,0,1977,60,0,1 +60,2,123218,5,10,1,4,1,0,0,0,0,40,0,0 +38,2,115289,1,9,1,8,1,0,0,0,0,40,0,0 +37,2,373895,5,10,4,2,0,1,0,0,0,35,0,0 +43,2,152617,5,10,2,0,3,0,1,0,0,40,0,0 +49,0,72619,5,10,2,0,4,0,1,0,0,50,0,0 +17,2,41865,12,6,0,4,3,0,1,0,0,25,0,0 +32,2,190228,1,9,0,4,0,0,0,0,0,60,0,0 +23,2,193090,0,13,0,3,0,0,1,0,0,38,0,0 +28,2,138692,0,13,1,3,1,0,0,0,1887,40,0,1 +83,5,153183,0,13,1,1,1,0,0,0,2392,55,0,1 +25,2,181896,0,13,0,0,3,0,1,0,0,40,0,0 +42,2,268183,0,13,1,1,1,0,0,0,1485,60,0,0 +46,4,213668,2,7,0,4,0,0,0,0,0,40,0,0 +29,2,99369,0,13,0,3,0,4,1,0,0,50,0,0 +44,2,104196,3,14,1,1,1,0,0,0,0,45,0,1 +60,1,176839,10,15,1,5,1,0,0,0,0,45,0,1 +30,4,99502,9,11,2,11,4,3,1,0,0,40,0,0 +24,2,183410,5,10,0,5,3,0,1,0,0,17,0,0 +17,2,25690,12,6,0,4,3,0,1,0,0,10,0,0 +31,2,188961,6,12,0,9,3,0,1,0,0,40,0,0 +52,2,114971,5,10,1,10,1,0,0,0,0,40,0,1 +39,2,121468,0,13,0,1,3,2,1,0,0,35,0,0 +73,5,191540,0,13,1,5,1,0,0,0,0,50,0,1 +38,2,146398,1,9,0,4,4,1,1,0,0,24,0,0 +48,2,193553,1,9,2,4,0,1,1,0,0,20,0,0 +60,2,121127,12,6,6,5,0,0,1,0,0,40,0,0 +26,2,389856,1,9,0,6,0,0,0,0,0,40,0,0 +20,2,290504,1,9,0,4,5,0,0,0,0,40,0,0 +54,0,137065,8,16,0,1,0,0,1,0,0,40,0,1 +50,4,212685,1,9,1,4,1,1,0,0,0,40,0,0 +20,2,71475,5,10,0,0,3,0,1,0,0,40,0,0 +23,2,111450,5,10,0,0,5,1,0,0,0,22,0,0 +35,2,225860,9,11,1,10,1,0,0,0,0,40,0,1 +43,2,129853,12,6,0,8,0,1,0,0,0,40,0,0 +50,2,99925,1,9,1,0,1,0,0,0,0,32,0,0 +58,2,227800,15,2,4,7,0,1,0,0,0,50,0,0 +55,0,111130,6,12,2,0,3,2,0,0,0,40,0,0 +29,2,100764,0,13,1,1,1,0,0,0,0,45,0,1 +47,2,275095,5,10,2,8,0,0,1,0,0,40,0,0 +39,2,147500,1,9,1,3,2,1,1,0,0,40,0,0 +63,4,150079,1,9,1,0,2,0,1,0,0,35,0,1 +27,2,140863,1,9,0,6,0,0,0,0,0,60,0,0 +38,2,193372,5,10,0,1,3,0,1,0,0,40,0,0 +25,2,196771,1,9,0,2,0,0,0,0,0,65,0,0 +31,2,231826,1,9,1,4,1,0,0,0,0,52,4,0 +40,3,196456,5,10,0,0,3,0,1,0,0,40,0,0 +42,2,34037,8,16,0,3,0,0,0,0,0,50,0,0 +52,2,174964,1,9,1,5,1,0,0,0,0,40,0,1 +46,2,91608,0,13,1,0,1,0,0,0,0,40,0,1 +31,2,403468,5,10,4,4,4,0,1,0,0,50,4,0 +33,2,112900,1,9,2,4,4,0,1,0,0,40,0,0 +58,2,242670,1,9,0,0,4,0,1,0,0,40,0,0 +52,4,187830,1,9,2,9,4,0,0,4934,0,36,0,1 +25,1,368115,0,13,0,1,0,0,0,13550,0,35,0,1 +54,2,343242,0,13,1,5,1,0,0,0,0,40,0,1 +46,2,113390,3,14,1,0,1,0,0,0,1740,60,0,0 +28,2,200733,1,9,1,10,1,0,0,0,0,40,0,0 +24,1,236769,7,4,1,10,1,0,0,0,0,40,0,0 +39,2,22494,0,13,0,1,0,0,1,0,0,40,0,0 +60,3,129379,5,10,1,9,1,0,0,0,0,40,0,0 +22,2,239098,1,9,0,4,4,0,1,0,0,40,0,0 +27,2,167501,0,13,0,1,3,0,1,0,0,40,0,0 +35,2,77146,0,13,1,5,1,0,0,0,0,45,0,1 +47,2,82797,0,13,1,3,1,0,0,0,0,50,0,0 +33,1,134886,0,13,1,3,2,0,1,0,0,50,0,1 +40,5,218558,0,13,1,1,1,0,0,0,0,45,0,1 +38,2,207568,0,13,1,1,1,0,0,5178,0,40,0,1 +26,2,196899,6,12,4,10,0,4,1,0,0,40,0,0 +54,1,200960,0,13,1,5,1,0,0,0,0,50,0,1 +60,2,232337,7,4,2,8,0,0,0,0,0,40,0,0 +32,2,98656,3,14,0,1,0,0,1,0,0,40,0,0 +19,0,194260,5,10,0,0,3,0,1,0,0,15,0,0 +31,2,234976,2,7,0,0,4,0,1,0,0,48,0,0 +29,2,349116,1,9,4,5,4,0,1,0,0,25,0,0 +39,2,175390,1,9,0,5,4,1,1,0,0,40,0,0 +26,2,214637,1,9,2,4,4,0,1,0,0,35,0,0 +27,2,185127,9,11,0,1,3,0,0,0,0,40,0,0 +52,2,98752,4,5,6,0,4,0,1,0,0,40,0,0 +50,4,218382,5,10,2,4,4,1,1,0,0,40,0,0 +51,2,153486,1,9,1,8,1,0,0,0,0,45,0,1 +51,3,174102,1,9,1,0,1,0,0,0,0,40,0,1 +40,2,137142,1,9,1,5,1,0,0,0,0,40,0,1 +61,2,241013,7,4,6,7,0,1,0,0,0,40,0,0 +35,2,267798,1,9,2,10,4,0,0,0,0,40,0,0 +31,2,263561,3,14,1,1,1,0,0,0,0,40,0,1 +43,2,113324,1,9,1,10,1,0,0,0,1902,40,0,1 +20,2,39764,1,9,0,2,3,0,0,0,0,40,0,0 +35,2,172186,5,10,4,10,0,0,0,0,0,40,0,0 +30,2,460408,5,10,1,5,1,0,0,0,1672,45,0,0 +42,1,185129,10,15,1,3,1,0,0,0,1887,40,0,1 +51,2,61270,1,9,1,2,1,0,0,0,0,40,0,1 +39,5,124685,3,14,2,1,0,2,0,0,0,99,28,1 +69,1,76968,4,5,1,7,1,0,0,0,0,25,0,0 +29,3,37933,5,10,0,0,4,1,1,2174,0,40,0,0 +21,2,38772,5,10,0,5,3,0,0,0,0,20,0,0 +24,2,172496,0,13,0,9,0,0,0,0,0,55,0,0 +55,2,306164,1,9,1,4,1,1,0,0,0,40,0,0 +42,1,33795,1,9,1,10,1,0,0,0,0,45,0,0 +48,2,47686,2,7,1,4,2,0,1,0,0,40,0,0 +31,2,193132,0,13,0,9,0,0,1,0,0,42,0,0 +52,2,400004,9,11,1,1,1,0,0,0,0,40,0,1 +30,2,101283,5,10,0,4,0,0,1,0,0,40,0,0 +29,2,192384,1,9,0,10,0,0,0,0,0,40,0,0 +32,2,113838,5,10,1,2,1,0,0,0,0,40,0,0 +47,2,278322,5,10,1,3,1,0,0,7688,0,40,0,1 +56,2,199713,4,5,1,10,1,0,0,0,0,40,0,0 +40,2,236021,5,10,1,6,1,0,0,0,0,40,0,0 +20,2,138938,5,10,0,3,3,0,1,0,0,10,0,0 +36,2,126946,5,10,4,10,0,0,0,0,0,40,0,0 +45,2,44791,0,13,0,3,0,0,0,0,0,40,0,0 +38,2,31964,4,5,1,0,1,0,0,0,0,40,0,0 +60,0,352156,10,15,1,3,1,0,0,0,0,40,0,1 +70,1,205860,3,14,1,1,1,1,0,0,0,40,0,0 +21,2,113106,5,10,0,4,3,0,1,0,0,30,0,0 +57,2,89182,1,9,6,0,0,0,1,0,0,40,0,0 +33,2,250782,1,9,1,8,1,0,0,0,0,48,0,0 +37,2,193855,1,9,1,10,1,0,0,0,1902,50,0,0 +50,1,132716,10,15,1,1,1,0,0,99999,0,50,0,1 +68,2,218637,5,10,1,5,1,0,0,0,2377,55,0,1 +28,2,177955,2,7,1,0,2,0,1,0,0,40,4,0 +32,2,198660,5,10,1,10,1,0,0,0,0,40,0,0 +30,2,207937,10,15,2,3,0,0,0,10520,0,50,0,1 +18,2,168740,2,7,0,2,3,0,0,0,0,30,0,0 +45,2,199625,5,10,2,3,4,0,1,0,0,20,0,0 +22,2,213902,1,9,0,0,4,0,1,0,0,40,4,0 +38,2,208379,0,13,0,8,0,0,1,0,0,8,0,0 +37,2,113120,9,11,2,3,0,0,1,0,0,40,0,0 +23,2,57827,0,13,0,7,0,0,0,0,0,40,0,0 +59,2,515712,7,4,1,10,1,0,0,0,0,40,0,0 +48,5,54190,10,15,1,3,1,0,0,15024,0,40,0,1 +53,5,134793,5,10,1,1,1,0,0,15024,0,50,0,1 +18,2,396270,1,9,0,0,3,0,0,0,0,25,0,0 +30,2,231620,0,13,0,5,0,0,1,0,0,40,4,0 +50,2,174655,5,10,1,5,1,0,0,0,0,45,0,1 +38,1,344480,1,9,1,10,1,0,0,4064,0,40,0,0 +48,2,176732,4,5,2,5,0,0,1,0,0,40,0,0 +60,2,143932,1,9,1,10,1,0,0,0,0,40,0,0 +46,2,551962,1,9,4,2,4,0,1,0,0,50,30,0 +39,2,257942,0,13,1,5,1,0,0,0,0,60,0,1 +55,4,253062,5,10,1,3,1,0,0,0,0,40,0,1 +17,2,193748,2,7,0,5,3,0,0,0,0,15,0,0 +46,2,368561,0,13,1,5,1,0,0,0,0,55,0,1 +50,2,192964,1,9,2,5,4,0,1,0,0,65,0,0 +32,2,217304,0,13,0,11,0,1,0,0,0,30,0,0 +18,2,120029,1,9,0,4,3,0,1,0,0,40,0,0 +34,2,62124,1,9,4,4,0,1,0,0,0,40,0,0 +50,2,94885,0,13,2,3,0,0,0,0,0,45,0,1 +32,2,192565,2,7,1,1,1,0,0,0,0,55,0,0 +23,4,220912,0,13,0,3,0,1,1,0,0,40,0,0 +26,2,184120,0,13,0,3,0,0,0,0,0,50,0,0 +46,2,140782,6,12,2,3,0,0,1,0,0,50,0,0 +43,5,170785,5,10,1,5,1,0,0,0,0,55,0,0 +32,2,90705,1,9,1,6,1,0,0,0,0,60,0,1 +37,0,108293,6,12,2,3,4,0,1,0,0,38,0,0 +48,2,168283,5,10,1,6,1,0,0,0,0,45,0,1 +28,2,339372,0,13,0,0,0,0,0,0,1408,40,0,0 +43,2,193672,1,9,1,8,1,0,0,0,0,40,0,0 +51,4,143865,12,6,6,4,0,0,1,0,0,24,0,0 +30,2,209317,1,9,0,8,0,0,0,0,0,50,21,0 +34,0,204461,3,14,1,3,1,0,0,0,0,50,0,1 +34,2,137088,1,9,1,10,5,3,0,0,0,40,0,0 +41,2,149102,0,13,1,1,1,0,0,0,0,60,0,1 +53,2,182855,12,6,2,0,4,0,1,0,0,48,0,0 +42,2,572751,13,1,1,10,1,0,0,0,0,40,35,0 +18,2,83451,1,9,0,4,3,0,1,0,0,30,0,0 +81,2,98116,0,13,6,5,0,0,0,0,0,50,0,1 +40,2,119225,9,11,1,3,1,0,0,0,0,40,0,0 +26,2,134888,0,13,0,9,3,0,1,0,0,35,0,0 +20,2,745817,5,10,0,9,3,0,1,0,0,15,0,0 +41,2,88368,1,9,0,5,0,0,1,0,0,50,0,0 +49,0,122066,3,14,1,3,1,0,0,0,0,45,0,1 +22,2,363219,5,10,0,4,0,0,1,0,0,20,0,0 +46,2,84402,0,13,2,3,0,0,0,0,0,45,0,1 +56,2,34626,5,10,2,1,0,0,1,0,1980,40,0,0 +35,2,150042,1,9,1,1,2,0,1,0,0,40,0,1 +34,2,48014,0,13,4,1,0,0,1,0,0,35,0,0 +29,4,177398,3,14,1,3,2,0,1,0,0,40,0,1 +35,2,422933,0,13,0,4,0,0,0,0,0,37,0,0 +29,2,131088,5,10,1,1,1,0,0,0,0,40,0,0 +21,2,178255,5,10,0,0,0,0,1,0,0,30,13,0 +52,1,129311,5,10,1,1,1,0,0,0,0,95,0,1 +45,2,473171,1,9,1,10,1,0,0,0,0,40,0,0 +43,2,236985,1,9,1,10,1,1,0,0,0,40,0,0 +35,2,207568,12,6,0,4,3,0,0,0,0,40,0,0 +30,2,85708,1,9,1,0,1,0,0,0,0,40,0,0 +45,2,98765,1,9,0,8,4,0,1,0,0,40,8,0 +29,2,192283,5,10,0,4,5,0,1,0,0,20,0,0 +29,0,271012,12,6,0,4,3,1,1,0,0,40,0,0 +33,2,189265,0,13,0,1,0,0,1,0,0,40,0,0 +17,2,321880,12,6,0,4,3,1,0,0,0,15,0,0 +52,2,177465,1,9,2,5,4,0,1,0,0,25,0,0 +24,2,127647,5,10,4,0,4,0,1,0,0,35,0,0 +32,0,119033,1,9,1,6,1,0,0,0,0,40,0,1 +40,2,289748,0,13,0,1,0,0,1,4650,0,48,0,0 +33,2,284531,0,13,0,5,0,0,1,0,0,40,0,0 +30,2,251120,7,4,0,10,0,0,0,0,0,38,0,0 +28,2,113870,1,9,0,0,0,0,0,0,0,40,0,0 +62,6,170114,6,12,1,7,1,0,0,0,0,50,0,0 +46,4,121124,0,13,1,11,1,0,0,15024,0,40,0,1 +32,2,328199,9,11,0,9,0,0,1,0,0,64,0,0 +26,2,206307,1,9,1,10,1,0,0,0,0,40,0,1 +41,5,236021,0,13,1,3,1,0,0,15024,0,40,0,1 +57,3,170603,5,10,1,0,1,0,0,0,0,40,0,1 +52,2,74275,5,10,1,5,1,0,0,7298,0,45,0,1 +35,1,112271,0,13,1,1,1,0,0,0,0,50,0,1 +19,2,118306,1,9,0,2,3,0,0,0,0,16,0,0 +49,2,126754,0,13,0,1,0,0,0,0,0,45,0,1 +38,2,205359,2,7,1,0,2,0,1,0,0,32,0,0 +30,2,398662,1,9,0,8,3,0,0,0,0,40,0,0 +32,2,202498,2,7,1,2,1,0,0,0,0,40,13,0 +32,2,105650,1,9,1,1,2,0,1,0,0,50,0,1 +46,2,191204,9,11,0,1,3,0,1,0,0,40,0,0 +22,2,56582,1,9,0,7,0,0,0,0,0,50,0,0 +47,4,51579,5,10,1,11,1,0,0,0,0,50,0,0 +57,1,152030,5,10,1,5,2,0,1,0,0,25,0,1 +47,2,227310,5,10,2,0,4,1,1,0,0,40,0,0 +41,2,55854,0,13,1,3,1,0,0,0,0,56,0,1 +36,4,28996,1,9,1,6,1,0,0,0,0,40,0,0 +32,2,160634,0,13,1,7,1,0,0,0,0,60,0,0 +37,2,222450,2,7,3,4,5,0,0,0,0,40,22,0 +36,5,180419,1,9,1,7,1,0,0,0,0,45,0,0 +64,2,116084,1,9,1,10,1,0,0,2635,0,40,0,0 +17,2,202521,12,6,0,4,3,0,0,0,0,15,0,0 +23,2,186014,5,10,0,0,3,0,1,0,0,15,0,0 +40,2,88368,5,10,2,0,4,0,1,914,0,40,0,0 +42,0,190044,0,13,1,1,1,0,0,15024,0,50,0,1 +37,1,35330,1,9,1,4,1,0,0,0,0,42,0,0 +35,3,84848,5,10,0,2,4,0,1,0,0,40,0,0 +56,1,176280,1,9,2,4,0,0,0,0,0,50,0,0 +52,2,145271,0,13,1,10,1,2,0,0,0,40,0,0 +37,4,108320,0,13,1,9,1,0,0,0,0,45,0,1 +48,0,106377,8,16,1,3,1,0,0,0,0,65,0,1 +24,2,258730,1,9,2,4,3,0,1,0,0,40,28,0 +33,2,58305,9,11,1,10,1,0,0,0,0,40,0,0 +39,2,341672,9,11,1,9,1,2,0,0,0,40,11,0 +34,2,176648,1,9,2,0,0,1,0,0,0,42,0,0 +23,2,481175,5,10,0,1,3,4,0,0,0,24,30,0 +49,2,187454,1,9,1,5,1,0,0,99999,0,65,0,1 +18,2,25837,1,9,0,4,0,0,0,0,0,25,0,0 +20,2,385077,14,8,0,8,3,0,0,0,0,40,0,0 +54,2,68985,3,14,1,5,1,0,0,0,0,55,0,1 +19,2,181572,5,10,0,0,3,0,0,0,0,40,0,0 +53,2,23698,1,9,1,10,1,0,0,0,0,46,0,1 +28,2,162298,1,9,0,10,3,0,0,0,0,40,0,0 +35,2,144608,1,9,1,8,1,0,0,0,0,40,0,0 +20,2,250630,5,10,0,5,0,0,1,0,0,20,0,0 +31,2,150441,5,10,2,0,0,0,1,0,0,50,0,0 +37,2,189251,8,16,4,3,4,0,1,0,0,40,0,0 +64,2,260082,14,8,1,10,1,0,0,0,0,40,13,0 +42,2,139126,5,10,1,9,1,0,0,0,0,40,0,1 +27,2,50132,5,10,2,5,0,0,0,0,0,50,0,0 +36,1,167691,5,10,0,4,4,0,1,0,0,50,0,0 +36,2,77820,5,10,1,10,1,0,0,0,0,40,0,1 +23,2,156513,1,9,0,2,3,1,0,0,0,40,0,0 +46,2,248059,1,9,1,10,1,0,0,3464,0,40,0,0 +24,2,283092,2,7,0,10,0,1,0,0,0,35,2,0 +22,2,175883,1,9,0,0,3,0,1,0,0,40,0,0 +62,2,232308,0,13,1,1,1,0,0,0,0,40,0,1 +19,2,269991,1,9,0,4,3,0,0,0,0,40,5,0 +20,2,305446,1,9,0,4,3,0,0,0,0,30,0,0 +57,2,78707,1,9,0,0,3,0,1,0,0,40,0,0 +19,2,351802,1,9,0,8,3,0,0,0,0,35,0,0 +37,4,196529,3,14,1,3,2,0,1,0,0,45,0,1 +35,5,175769,1,9,1,5,1,0,0,0,0,65,0,1 +17,2,153021,14,8,0,5,3,0,1,0,0,20,0,0 +36,4,331902,5,10,2,0,4,0,1,0,0,35,0,0 +50,2,279461,5,10,1,6,1,0,0,0,0,40,0,1 +35,2,145704,1,9,1,3,2,0,1,3942,0,35,0,0 +27,0,205499,8,16,0,3,0,0,0,0,0,77,0,0 +28,2,293926,1,9,1,10,1,0,0,0,1740,30,0,0 +29,1,69132,10,15,2,3,0,0,0,99999,0,60,0,1 +25,2,113099,1,9,4,10,0,1,0,0,0,40,0,0 +47,5,206947,6,12,6,1,0,0,1,0,0,67,0,0 +29,0,159782,3,14,1,3,2,0,1,0,0,45,0,1 +19,2,410543,1,9,0,0,0,0,1,0,0,40,0,0 +49,2,34446,5,10,1,6,1,0,0,0,0,40,0,0 +31,2,209101,10,15,1,3,1,0,0,0,0,25,0,1 +43,3,95902,6,12,1,3,2,1,1,0,0,40,0,0 +56,1,214323,2,7,1,10,1,0,0,0,0,40,0,0 +42,2,236323,1,9,2,10,4,0,1,0,0,40,0,0 +45,3,201127,5,10,1,3,1,0,0,0,0,56,0,1 +40,2,142886,0,13,6,1,4,0,1,0,0,40,0,0 +44,2,77313,5,10,2,0,4,0,1,0,0,38,0,0 +36,2,187098,1,9,2,0,4,0,1,0,0,40,0,0 +19,2,196857,5,10,0,5,3,0,1,0,0,20,0,0 +53,4,155314,1,9,1,0,2,0,1,0,0,40,0,1 +72,1,203289,5,10,1,10,1,0,0,0,0,35,0,0 +46,2,117059,9,11,1,6,1,3,0,0,0,60,0,0 +33,2,178587,5,10,4,3,4,0,1,0,0,37,0,0 +22,2,82393,4,5,0,2,3,2,0,0,0,40,11,0 +46,2,72896,4,5,1,8,1,0,0,0,0,43,0,0 +33,2,134886,1,9,0,5,3,0,1,0,0,20,0,0 +32,2,223212,13,1,1,8,1,0,0,0,0,40,4,0 +52,1,174752,1,9,2,10,0,0,0,0,0,40,0,0 +27,2,230563,1,9,0,0,3,0,1,0,0,40,0,0 +48,0,353824,1,9,1,11,1,0,0,0,0,72,0,1 +22,2,117363,5,10,0,0,0,0,1,0,0,35,0,0 +25,2,285367,1,9,2,4,0,0,0,0,0,50,0,0 +38,2,198170,9,11,1,5,1,0,0,0,0,40,0,0 +37,2,38948,1,9,1,6,1,0,0,0,0,50,0,0 +49,2,188515,5,10,2,0,4,0,1,0,0,40,0,0 +40,1,177810,0,13,1,10,1,0,0,0,0,30,0,0 +48,2,188432,1,9,1,8,1,0,0,3103,0,46,0,1 +31,2,178506,5,10,0,0,4,1,1,0,0,40,0,0 +40,1,129298,1,9,1,4,1,0,0,0,0,45,0,0 +25,2,165315,1,9,2,5,4,0,1,0,0,37,0,0 +68,2,117236,0,13,1,1,1,0,0,20051,0,45,0,1 +19,2,63434,14,8,0,7,3,0,1,0,0,30,0,0 +35,5,140854,1,9,0,6,0,0,0,0,0,60,0,0 +28,2,133043,1,9,2,0,4,0,1,0,0,50,0,0 +53,2,113176,1,9,2,5,0,0,1,2597,0,40,0,0 +33,2,259301,5,10,1,6,1,0,0,0,0,41,0,0 +20,2,196643,1,9,0,2,3,0,0,0,0,40,0,0 +45,1,364365,0,13,0,5,0,0,1,0,0,35,0,0 +36,2,269318,0,13,1,1,1,0,0,0,0,50,0,1 +34,2,108454,5,10,1,1,1,0,0,0,0,45,0,0 +32,2,171637,5,10,0,0,3,0,1,0,0,40,0,0 +19,2,183589,5,10,0,6,3,0,0,0,0,25,0,0 +24,2,107801,1,9,0,0,3,0,1,0,0,40,0,0 +34,2,179877,5,10,1,8,1,0,0,0,0,40,0,1 +32,2,168981,1,9,0,0,5,0,1,0,0,35,0,0 +37,2,120590,1,9,1,10,1,0,0,0,0,45,0,1 +31,2,310773,5,10,4,5,4,0,1,0,0,40,4,0 +21,2,197050,5,10,0,4,3,0,1,0,0,35,0,0 +47,2,159726,1,9,1,6,1,0,0,0,0,85,0,1 +23,2,210797,5,10,1,10,1,0,0,0,0,40,0,0 +33,2,55291,3,14,1,1,1,0,0,0,0,40,0,1 +17,2,276718,1,9,0,0,3,0,0,0,0,20,0,0 +67,2,336163,1,9,1,2,1,0,0,0,0,24,0,0 +57,2,112840,3,14,1,3,1,0,0,0,0,55,0,1 +17,2,165918,2,7,0,2,3,0,0,0,0,20,30,0 +53,2,165745,1,9,1,10,1,0,0,0,0,40,0,0 +25,1,259299,5,10,1,10,1,0,0,3103,0,50,0,1 +24,0,197731,1,9,1,6,1,0,0,0,0,49,0,1 +48,1,197702,5,10,1,6,1,0,0,0,0,40,0,0 +51,2,162238,3,14,1,1,1,0,0,0,1887,47,0,1 +38,2,213260,1,9,4,11,0,1,0,0,0,40,0,0 +51,2,53833,1,9,1,3,1,0,0,0,0,46,0,1 +18,2,89419,1,9,0,9,3,0,1,0,0,10,0,0 +23,2,119704,5,10,4,5,4,0,1,0,0,40,0,0 +42,2,433170,5,10,1,10,1,0,0,0,0,60,0,1 +39,2,172538,1,9,0,8,4,0,0,0,0,40,0,0 +39,2,158956,5,10,0,4,4,1,1,0,0,40,0,0 +21,1,25631,5,10,0,7,3,0,0,0,0,40,0,0 +26,2,476558,7,4,0,10,0,0,0,0,0,40,4,0 +54,3,35576,5,10,1,10,1,0,0,0,0,40,0,0 +34,2,203463,5,10,2,5,0,0,1,0,0,40,0,0 +32,0,317647,1,9,0,6,3,0,0,0,0,40,0,0 +59,1,170411,7,4,1,6,1,0,0,0,0,40,0,0 +54,2,220055,0,13,6,5,4,0,1,0,0,40,0,0 +54,2,231482,0,13,1,1,1,0,0,0,0,40,0,0 +67,2,335979,1,9,6,5,0,0,1,991,0,18,0,0 +33,2,279173,1,9,1,3,1,0,0,0,0,60,0,0 +37,2,89559,1,9,1,0,2,0,1,0,0,40,0,0 +47,2,161950,0,13,2,4,0,0,1,0,0,25,9,0 +51,2,131068,1,9,2,4,0,0,1,0,0,40,0,0 +45,2,219632,1,9,1,6,1,0,0,0,0,40,0,0 +19,2,175507,1,9,0,4,0,0,1,0,0,30,0,0 +58,5,182062,8,16,1,3,1,0,0,0,0,24,0,1 +27,2,287476,1,9,0,10,0,1,0,3325,0,40,0,0 +36,2,206253,5,10,0,4,0,0,1,0,1617,40,0,0 +51,2,21698,1,9,0,0,0,0,1,0,0,40,0,0 +45,1,328051,3,14,0,3,0,0,1,0,0,60,0,0 +32,2,356689,1,9,2,0,4,0,0,3887,0,40,0,0 +59,2,121865,1,9,2,4,0,1,1,0,0,40,0,0 +45,1,420986,0,13,1,3,1,0,0,0,0,40,0,1 +54,2,288992,12,6,2,3,4,0,0,14344,0,68,0,1 +29,4,188909,0,13,0,3,3,1,1,0,0,42,0,0 +28,2,213081,2,7,0,4,0,1,1,0,0,40,2,0 +18,1,157131,2,7,0,5,3,0,1,0,0,40,0,0 +49,2,98010,0,13,2,3,0,0,1,0,0,50,0,0 +46,2,207677,1,9,2,10,0,0,0,0,0,30,0,0 +56,2,266091,0,13,0,3,0,0,1,0,0,45,4,0 +41,2,106627,6,12,2,1,4,1,1,0,0,50,0,0 +50,5,167793,10,15,1,3,1,0,0,0,2415,60,0,1 +74,1,206682,5,10,1,3,1,0,0,0,1648,35,0,0 +30,2,243165,1,9,1,1,1,0,0,0,0,40,0,0 +62,2,201928,1,9,6,10,4,1,1,0,0,40,0,0 +19,2,128346,1,9,0,8,3,0,1,0,0,40,0,0 +29,2,197288,1,9,1,0,2,1,1,0,0,40,0,0 +36,2,245521,7,4,1,7,1,0,0,0,0,35,4,0 +36,2,129591,1,9,0,4,0,0,0,0,0,40,0,0 +51,4,47415,6,12,1,0,2,0,1,0,1628,30,0,0 +37,1,188563,5,10,1,1,1,0,0,4386,0,50,0,1 +29,1,184710,1,9,1,10,1,0,0,0,0,40,0,0 +17,2,63734,12,6,0,2,3,0,0,0,0,20,0,0 +18,2,111256,1,9,0,0,3,0,1,0,0,20,0,0 +40,5,111483,0,13,0,3,3,0,0,0,0,40,0,0 +26,5,266639,0,13,0,0,0,0,1,0,0,40,0,0 +42,1,93853,5,10,1,10,1,0,0,0,0,45,0,0 +32,2,184207,1,9,2,10,0,0,0,0,0,40,0,0 +33,2,238002,4,5,1,6,5,0,0,0,0,40,4,0 +43,2,196545,0,13,1,8,1,0,0,0,1902,40,0,1 +47,2,144844,1,9,1,10,1,0,0,0,0,40,0,0 +37,2,280500,5,10,0,9,3,1,1,0,0,40,0,0 +37,2,409189,1,9,1,4,1,0,0,0,0,30,4,0 +50,2,23686,5,10,1,0,5,0,1,0,0,35,0,1 +19,2,229756,1,9,0,5,3,0,0,0,0,50,0,0 +32,4,95530,5,10,1,4,1,0,0,0,0,40,0,0 +44,4,73199,9,11,2,9,4,2,0,0,0,40,0,0 +20,2,196745,5,10,0,4,3,0,1,0,0,16,0,0 +29,2,79481,5,10,0,9,0,0,1,0,0,40,0,0 +34,2,100950,9,11,0,3,4,0,1,0,0,40,9,0 +44,4,56651,0,13,1,1,1,0,0,0,0,52,0,0 +18,2,186954,2,7,0,4,3,0,1,0,0,20,0,0 +22,2,264874,5,10,0,9,5,0,1,0,0,40,0,0 +39,0,183092,8,16,2,3,0,0,1,0,0,40,0,1 +26,4,273399,5,10,0,11,0,0,0,0,0,40,30,0 +21,2,177526,5,10,0,4,3,0,0,0,0,40,0,0 +49,4,31267,0,13,1,3,1,0,0,0,0,50,0,0 +24,2,321666,6,12,0,8,3,0,0,0,0,20,0,0 +25,2,283515,5,10,0,11,0,0,0,0,0,60,0,0 +30,2,54608,6,12,1,3,1,0,0,0,0,40,0,0 +52,2,162238,0,13,1,3,1,0,0,0,0,38,0,1 +30,2,175931,1,9,1,10,1,0,0,0,0,40,0,0 +20,2,236804,1,9,0,0,0,0,0,0,0,40,0,0 +31,2,168782,1,9,2,2,0,0,0,0,0,40,0,0 +44,2,227065,0,13,1,1,1,0,0,0,0,40,0,1 +46,5,285335,5,10,1,5,1,0,0,0,0,60,0,1 +31,2,259705,1,9,0,7,3,0,1,0,0,40,0,0 +57,2,24384,7,4,6,4,0,0,1,0,0,10,0,0 +58,2,322013,1,9,1,10,1,0,0,0,0,40,0,0 +41,2,49797,1,9,1,10,1,0,0,0,0,40,0,0 +23,2,52566,1,9,0,0,0,0,1,0,0,40,0,0 +47,2,266275,1,9,2,4,4,0,1,0,0,40,0,0 +72,1,285408,10,15,1,3,1,0,0,0,2246,28,0,1 +26,1,177858,0,13,2,1,0,0,0,0,1876,38,0,0 +45,3,183804,5,10,0,0,3,0,0,0,0,40,0,0 +48,2,107231,10,15,1,1,1,0,0,99999,0,50,0,1 +23,2,173679,5,10,0,2,0,0,0,0,0,40,0,0 +20,4,163965,1,9,0,4,4,1,1,0,0,40,0,0 +18,2,173585,2,7,0,4,3,0,0,0,0,15,30,0 +27,2,172009,0,13,0,1,0,0,1,0,0,40,0,0 +25,2,44363,1,9,0,2,0,0,0,0,0,35,0,0 +45,2,246392,1,9,0,13,4,1,1,0,0,30,0,0 +53,2,167033,5,10,0,1,0,1,1,0,0,40,0,0 +54,2,143822,5,10,1,10,1,0,0,0,0,45,0,1 +41,2,37869,1,9,1,5,1,0,0,0,1902,40,0,1 +23,2,447488,4,5,0,8,5,0,0,0,0,35,4,0 +17,2,239346,12,6,0,4,3,0,0,0,0,18,0,0 +42,2,245975,1,9,1,10,1,0,0,0,0,40,0,0 +61,2,34632,14,8,3,3,0,0,0,0,0,40,0,0 +57,2,121362,5,10,6,0,4,0,1,0,2258,38,0,1 +21,0,24008,5,10,0,10,3,0,0,0,0,35,0,0 +44,2,165492,5,10,1,5,1,0,0,0,0,40,0,1 +48,2,326048,6,12,2,4,0,0,0,0,0,44,0,0 +46,2,250821,10,15,2,7,4,0,0,0,0,48,0,0 +37,1,154641,1,9,0,7,0,0,0,0,0,86,0,0 +35,2,198202,1,9,0,1,0,0,1,0,0,54,0,0 +27,4,170504,0,13,0,6,0,0,1,0,0,40,0,0 +28,2,191342,5,10,0,5,0,4,0,0,0,40,3,0 +19,2,238969,1,9,0,2,3,0,0,0,0,10,0,0 +63,1,344128,0,13,1,5,1,0,0,0,0,50,0,1 +36,0,168894,9,11,3,11,3,0,1,0,0,40,9,0 +20,2,203263,14,8,0,4,3,0,0,0,0,35,0,0 +28,0,89564,0,13,1,11,1,0,0,0,0,50,0,0 +58,2,97562,1,9,1,5,2,0,1,0,0,38,0,0 +48,2,336540,1,9,1,5,1,0,0,0,0,40,0,0 +39,2,139647,5,10,2,1,4,0,1,0,0,56,0,0 +38,2,160192,1,9,1,10,1,0,0,0,2051,44,0,0 +50,4,320386,6,12,2,3,0,0,1,0,0,40,0,0 +35,2,32126,0,13,0,3,0,0,1,0,0,40,0,0 +45,1,275445,0,13,2,1,4,0,0,0,0,50,0,0 +38,5,54953,5,10,1,10,1,0,0,0,0,38,0,0 +54,2,103580,6,12,2,1,4,0,1,0,0,55,0,1 +42,2,245565,0,13,0,3,3,0,1,0,0,12,7,0 +63,2,207385,5,10,1,5,1,0,0,0,0,30,0,0 +21,2,355287,4,5,0,8,0,0,0,0,0,48,4,0 +46,4,207677,0,13,1,11,1,0,0,0,0,40,0,1 +43,2,102114,5,10,0,0,4,1,1,0,0,40,0,0 +35,1,60269,1,9,1,1,1,0,0,0,0,60,0,0 +37,2,278632,4,5,1,6,1,0,0,0,0,40,0,0 +51,2,355551,1,9,0,10,4,0,1,0,0,45,4,0 +45,2,246891,0,13,1,1,1,0,0,0,0,72,8,1 +19,2,124486,14,8,0,4,3,0,0,0,1602,20,0,0 +61,2,191417,4,5,6,1,0,1,0,0,0,65,0,0 +21,2,184543,1,9,0,5,0,0,1,0,0,40,0,0 +45,2,122206,1,9,1,6,1,0,0,0,0,40,0,0 +38,2,229015,0,13,1,1,1,0,0,0,0,50,0,1 +28,2,130067,0,13,1,3,2,0,1,0,0,40,0,1 +40,4,306495,0,13,1,3,1,0,0,0,0,35,0,0 +32,2,232855,1,9,0,8,4,1,1,0,0,40,0,0 +55,4,171328,5,10,3,0,4,1,1,0,0,35,0,0 +64,2,144182,1,9,6,3,0,0,1,0,0,23,0,0 +34,2,102858,1,9,4,0,4,0,0,0,0,40,0,0 +58,2,209438,5,10,2,4,4,1,1,0,0,40,0,0 +46,2,74895,6,12,1,10,1,0,0,0,1485,55,0,0 +44,2,184378,9,11,1,1,1,0,0,0,0,40,0,0 +31,2,446512,5,10,4,4,4,1,1,0,0,40,0,0 +31,3,113688,1,9,0,8,4,0,1,0,0,40,0,0 +39,2,333305,5,10,1,5,2,0,1,0,0,45,0,1 +19,2,118535,14,8,0,5,3,0,1,0,0,18,0,0 +56,2,76142,1,9,2,4,4,0,1,0,0,40,0,0 +53,4,38795,4,5,1,1,1,0,0,0,0,40,0,0 +69,2,203313,1,9,6,4,0,0,1,991,0,18,0,0 +62,2,247483,5,10,1,5,1,0,0,0,0,40,0,1 +62,0,198686,1,9,1,4,1,0,0,0,0,40,0,0 +39,2,56118,1,9,2,4,4,0,1,0,0,40,0,0 +45,3,359808,6,12,0,1,0,0,0,0,0,40,0,0 +29,2,231554,5,10,1,0,1,1,0,0,0,50,0,0 +33,2,34848,5,10,1,4,1,0,0,0,0,40,0,0 +34,2,199934,5,10,1,8,1,1,0,7298,0,40,0,1 +29,2,196243,1,9,0,8,0,0,1,0,0,40,0,0 +65,5,66360,2,7,1,1,1,0,0,6418,0,35,0,1 +18,2,189487,5,10,0,5,3,0,1,0,0,35,0,0 +22,2,194848,1,9,0,7,3,0,0,0,0,40,0,0 +30,2,167309,0,13,1,0,1,0,0,0,1902,40,0,1 +44,2,192878,0,13,1,8,1,0,0,0,0,40,0,1 +48,2,70209,5,10,2,3,4,0,1,0,0,20,0,0 +52,3,123011,1,9,2,0,0,0,0,0,0,45,0,0 +53,1,135339,0,13,1,1,1,2,0,7688,0,20,26,1 +48,3,497486,1,9,3,0,4,0,1,1471,0,40,0,0 +25,2,178478,0,13,0,0,3,0,1,0,0,40,0,0 +41,2,149909,0,13,1,5,1,0,0,7688,0,50,0,1 +37,2,103323,1,9,0,10,0,0,0,0,0,40,0,0 +55,2,239404,12,6,1,6,1,1,0,0,0,45,0,0 +67,2,165082,1,9,0,0,0,0,1,0,0,38,0,0 +36,2,389725,5,10,2,0,0,0,0,0,0,45,0,0 +47,2,374580,1,9,4,5,0,0,1,0,0,52,0,0 +25,2,259300,0,13,0,5,0,0,1,0,0,16,0,0 +19,2,277695,4,5,0,7,5,0,0,0,0,16,4,0 +24,2,230248,7,4,4,8,3,0,0,0,0,40,0,0 +30,1,196342,5,10,0,5,3,0,0,0,0,25,0,0 +17,2,160968,2,7,0,0,3,0,0,0,0,16,0,0 +28,2,115438,0,13,0,0,3,0,0,0,0,40,0,0 +34,2,231043,9,11,1,0,1,0,0,3908,0,45,0,0 +35,2,129597,5,10,1,5,1,0,0,0,0,46,0,0 +24,4,387108,5,10,1,11,1,1,0,0,0,40,0,0 +43,2,105936,1,9,1,0,2,0,1,0,0,35,0,1 +55,2,125000,3,14,2,1,4,0,0,0,0,40,0,1 +22,2,229456,5,10,0,0,3,1,1,0,0,35,0,0 +20,2,230113,5,10,0,4,3,0,0,0,0,50,0,0 +44,2,106698,1,9,2,4,4,0,1,0,0,40,0,0 +38,2,133454,6,12,0,10,0,0,0,0,0,40,0,0 +53,2,295520,4,5,6,5,4,1,1,0,0,25,0,0 +26,2,151551,5,10,4,5,3,3,0,2597,0,48,0,0 +58,2,100313,5,10,1,11,1,0,0,0,1902,40,0,1 +23,2,320294,1,9,0,1,0,0,0,0,0,40,0,0 +53,2,162381,15,2,1,6,1,0,0,0,0,50,0,0 +35,2,183898,1,9,2,10,4,0,0,2354,0,40,0,0 +41,5,32016,1,9,1,5,1,0,0,0,0,62,0,0 +31,2,117028,1,9,1,8,1,0,0,0,0,40,0,0 +50,2,280278,1,9,6,3,4,1,1,0,0,40,0,0 +57,2,342906,4,5,1,5,1,1,0,0,0,55,0,1 +25,2,181598,2,7,1,9,1,0,0,0,0,40,0,0 +23,2,224059,1,9,1,8,1,0,0,0,0,40,0,0 +48,2,148549,0,13,0,1,0,0,0,0,0,50,0,0 +34,2,97355,5,10,2,5,0,0,1,0,0,60,0,0 +43,5,140988,0,13,1,5,5,2,0,0,0,45,3,0 +20,2,148409,5,10,0,5,5,0,0,1055,0,20,0,0 +40,4,150755,0,13,1,3,1,0,0,99999,0,75,0,1 +27,2,87006,5,10,1,0,2,0,1,0,1579,40,0,0 +35,2,112158,12,6,1,10,1,0,0,0,0,40,0,0 +33,2,121488,0,13,0,5,0,0,1,0,0,40,0,0 +57,0,283635,5,10,2,10,0,0,1,0,0,40,0,0 +43,2,69758,6,12,1,9,1,2,0,0,0,40,0,0 +40,2,199900,6,12,1,1,1,0,0,0,1848,55,0,1 +54,2,88019,5,10,2,6,0,0,0,0,0,55,0,0 +28,2,31935,5,10,2,0,0,0,1,0,0,40,0,0 +32,2,323055,1,9,1,10,1,0,0,0,0,40,0,0 +49,2,189498,1,9,1,5,1,0,0,0,0,50,0,1 +52,2,89041,1,9,1,10,1,0,0,0,0,40,0,0 +41,2,112507,12,6,1,6,1,0,0,0,0,60,0,0 +19,2,236940,1,9,0,7,3,0,0,0,0,40,0,0 +33,2,278514,1,9,2,10,3,0,1,0,0,42,0,0 +25,2,258379,0,13,1,3,2,0,1,0,0,32,0,0 +44,2,162028,2,7,2,5,4,0,1,0,0,44,0,0 +20,2,197997,5,10,0,3,3,0,0,0,0,40,0,0 +46,2,98350,12,6,3,4,0,2,0,0,0,37,26,0 +39,2,165848,1,9,1,5,1,0,0,0,0,50,0,0 +34,2,178615,1,9,0,2,0,0,0,0,0,40,0,0 +19,2,228939,1,9,0,2,3,0,0,0,0,35,0,0 +27,2,210498,1,9,1,10,1,0,0,5178,0,40,0,1 +53,2,154891,4,5,1,6,1,0,0,0,0,40,0,0 +46,2,165937,9,11,2,8,4,0,0,0,0,40,0,0 +39,2,160120,5,10,0,8,5,2,0,0,0,40,11,0 +30,2,382368,1,9,1,2,1,0,0,0,0,40,0,0 +53,2,123011,3,14,1,1,1,0,0,0,0,45,0,1 +33,2,119033,4,5,1,2,1,0,0,0,0,40,0,0 +22,2,496856,5,10,1,1,2,0,1,0,0,40,0,0 +44,2,194049,5,10,2,4,4,1,1,0,0,35,0,0 +30,2,299223,5,10,2,5,4,3,1,0,0,40,0,0 +66,2,174788,5,10,2,0,0,0,1,0,0,20,0,0 +39,2,176101,0,13,1,10,1,0,0,0,0,40,0,0 +37,2,38948,1,9,1,3,1,0,0,0,0,50,0,1 +34,2,271933,1,9,1,2,2,0,1,0,0,40,0,0 +17,2,122041,2,7,0,10,3,0,0,0,0,20,0,0 +43,2,115932,0,13,0,5,0,0,0,0,0,60,0,1 +46,2,265105,0,13,1,3,1,0,0,0,0,50,0,1 +17,2,100828,2,7,0,4,0,0,0,0,0,20,0,0 +60,2,121319,7,4,1,8,1,0,0,3137,0,40,12,0 +63,2,308028,3,14,1,9,1,0,0,5013,0,40,0,0 +42,2,213214,6,12,1,5,1,0,0,0,0,40,0,0 +30,2,348618,4,5,1,10,1,4,0,0,0,40,4,0 +33,2,275632,1,9,1,6,1,0,0,0,0,40,0,0 +43,2,239161,5,10,1,5,1,3,0,0,0,40,0,0 +20,2,215495,4,5,0,1,5,0,1,0,0,40,4,0 +30,2,214063,5,10,0,7,5,1,0,0,0,72,0,0 +37,2,122493,1,9,1,6,1,0,0,0,0,45,0,0 +49,1,175622,0,13,1,3,1,0,0,0,0,40,0,1 +65,2,153522,1,9,6,4,4,0,1,0,0,17,0,0 +35,2,258339,10,15,1,3,1,0,0,0,0,55,0,1 +27,2,119793,0,13,1,10,1,0,0,0,0,40,0,0 +33,2,133503,1,9,1,5,1,0,0,0,1977,45,0,1 +18,2,162840,14,8,0,5,3,0,1,0,0,20,0,0 +41,4,67671,3,14,1,3,1,0,0,0,0,50,0,0 +38,2,188888,0,13,0,1,0,0,0,0,1340,40,0,0 +45,2,140644,1,9,1,8,1,0,0,0,0,40,0,0 +33,2,245659,5,10,4,4,4,0,1,0,0,38,22,0 +47,2,104068,1,9,2,3,4,3,1,0,0,40,0,0 +30,2,337908,6,12,1,0,2,1,1,0,0,20,0,0 +36,2,161141,6,12,1,3,1,0,0,0,0,40,0,0 +21,2,162228,1,9,0,5,3,0,0,0,0,30,0,0 +44,2,116391,0,13,0,3,0,0,0,0,0,40,0,0 +33,2,314310,1,9,3,5,0,0,0,0,0,20,0,0 +29,2,308136,5,10,1,10,1,0,0,0,0,40,0,0 +45,2,194698,5,10,1,10,1,0,0,0,0,40,0,1 +29,4,302422,9,11,0,11,0,0,0,0,1564,56,0,1 +27,2,289147,0,13,0,3,3,0,1,0,0,40,0,0 +21,2,229826,5,10,1,8,1,0,0,0,0,20,0,0 +49,5,246739,5,10,1,10,1,0,0,0,0,45,0,1 +35,2,188041,5,10,1,1,1,0,0,0,0,50,0,0 +47,2,187440,1,9,1,10,1,0,0,5178,0,40,0,1 +37,4,105266,5,10,1,6,1,0,0,0,0,40,0,0 +37,2,249208,9,11,1,3,1,0,0,0,0,48,0,1 +26,2,203492,1,9,2,10,0,0,0,0,0,40,0,0 +55,3,146477,5,10,1,10,1,0,0,0,0,45,0,0 +47,2,201699,6,12,1,5,1,0,0,5178,0,50,0,1 +59,2,205949,1,9,4,10,4,3,1,0,0,40,0,0 +70,2,90245,1,9,6,0,4,0,1,0,0,5,0,0 +53,3,177647,1,9,1,9,1,0,0,0,0,40,23,1 +39,2,126494,1,9,2,3,4,0,1,0,0,40,0,0 +38,2,257735,4,5,1,2,1,0,0,0,0,40,0,0 +33,2,1161363,5,10,4,9,4,0,1,0,0,50,13,0 +28,2,221452,1,9,0,0,0,0,0,0,0,40,0,0 +74,2,260669,12,6,2,4,0,0,1,0,0,1,0,0 +40,2,192344,0,13,1,0,1,0,0,0,0,40,0,1 +35,2,80479,9,11,2,5,0,0,0,0,0,40,0,0 +35,1,108808,1,9,2,10,0,0,0,0,0,50,0,0 +41,2,175674,5,10,1,5,1,0,0,0,0,40,0,1 +38,2,272950,5,10,0,5,0,0,0,0,0,50,0,0 +29,1,160786,12,6,1,10,1,0,0,0,0,35,0,1 +46,1,122206,1,9,1,1,1,0,0,0,0,50,0,0 +46,2,121168,1,9,2,10,0,0,1,0,0,40,0,0 +40,2,209547,0,13,1,3,1,0,0,0,0,60,0,1 +29,3,244473,0,13,1,1,1,0,0,7688,0,40,0,1 +39,2,176296,6,12,1,11,1,1,0,0,0,60,0,0 +31,2,91666,1,9,0,1,3,0,0,0,0,60,0,0 +50,4,191025,3,14,2,1,0,0,1,4650,0,70,0,0 +31,0,63704,0,13,0,3,0,0,1,0,0,40,0,0 +27,2,31659,5,10,1,10,1,0,0,0,0,45,0,0 +27,2,191230,5,10,0,2,0,1,0,0,0,25,0,0 +28,2,56340,0,13,0,3,0,0,1,0,0,20,0,0 +21,2,221157,1,9,0,4,3,1,1,0,0,30,0,0 +57,4,143910,0,13,2,1,0,0,0,0,0,40,0,0 +56,4,435836,3,14,2,3,0,0,1,0,0,40,0,0 +48,2,209182,13,1,4,4,4,0,1,0,0,40,22,0 +36,5,107218,5,10,2,5,4,2,0,0,0,55,0,0 +51,2,55500,14,8,1,6,1,0,0,0,0,40,0,0 +39,4,357962,6,12,0,6,0,0,0,0,0,48,0,0 +43,2,200355,1,9,1,6,1,0,0,0,0,70,0,1 +51,4,184542,1,9,1,8,1,0,0,0,0,40,0,0 +43,0,206927,1,9,1,3,1,0,0,0,0,40,0,0 +44,2,54310,3,14,1,3,1,0,0,7298,0,40,0,1 +35,2,208165,1,9,2,1,4,0,1,0,0,50,0,0 +40,2,146908,1,9,1,3,1,0,0,0,1902,40,0,1 +39,2,318416,12,6,4,4,3,1,1,0,0,12,0,0 +23,2,69911,13,1,0,4,3,0,1,0,0,15,0,0 +26,2,305304,2,7,1,8,1,0,0,0,0,40,0,0 +25,4,295289,1,9,0,3,3,1,1,0,0,40,0,0 +29,2,275110,5,10,4,2,0,1,0,0,0,42,0,0 +30,2,339773,1,9,0,8,0,0,0,0,0,45,0,0 +57,0,399246,0,13,1,0,1,2,0,0,1485,40,26,0 +37,5,51264,9,11,1,5,1,0,0,0,0,40,0,1 +39,2,49020,0,13,1,5,1,0,0,3103,0,48,0,1 +37,2,178100,3,14,0,1,0,0,1,0,0,40,0,1 +21,2,176178,5,10,0,5,3,0,1,0,0,16,0,0 +25,0,180884,5,10,1,0,2,1,1,0,0,40,0,0 +61,0,130466,1,9,6,0,4,3,1,0,0,40,0,0 +59,2,328525,1,9,1,0,1,0,0,2414,0,15,0,0 +28,2,142712,1,9,0,2,3,0,0,0,0,40,0,0 +24,2,176321,5,10,0,0,4,0,1,0,0,40,0,0 +47,2,145041,1,9,1,8,1,0,0,0,0,40,1,1 +29,2,95423,1,9,5,6,1,0,0,0,0,80,0,0 +49,1,215096,4,5,2,4,0,0,1,0,0,20,0,0 +41,4,177599,0,13,2,3,4,0,1,0,0,35,0,0 +33,2,123920,5,10,0,1,0,1,1,0,0,40,0,0 +40,2,46990,8,16,1,3,2,0,1,0,1977,20,0,1 +32,2,388672,5,10,2,2,0,0,0,0,0,16,0,0 +48,2,149210,0,13,2,5,0,1,0,0,0,40,0,1 +24,2,134787,5,10,0,5,3,0,1,0,0,40,0,0 +50,2,185407,9,11,1,9,1,0,0,0,0,38,0,1 +31,0,86143,1,9,0,11,5,2,0,0,0,40,0,0 +23,2,41721,9,11,1,10,1,0,0,0,0,55,0,1 +35,2,195744,1,9,1,4,1,0,0,0,0,40,0,0 +50,4,96062,1,9,1,11,1,0,0,0,0,40,0,0 +39,2,215150,4,5,2,2,0,0,0,0,0,50,0,0 +52,2,270728,7,4,1,4,1,0,0,0,0,48,1,0 +44,2,75012,1,9,1,7,1,0,0,0,0,80,0,0 +43,2,206139,0,13,1,3,1,0,0,0,0,50,0,1 +39,2,50700,1,9,1,3,1,0,0,0,0,40,0,0 +33,2,224258,7,4,0,7,0,0,0,0,0,40,4,1 +31,2,240441,3,14,0,1,0,0,0,0,1564,40,0,1 +40,1,406811,5,10,1,3,2,0,1,0,0,40,0,1 +28,4,34452,10,15,1,3,1,0,0,0,0,40,0,0 +19,2,361341,14,8,0,3,0,2,1,0,0,25,15,0 +35,2,78247,9,11,1,10,1,0,0,0,0,50,0,0 +44,2,106900,0,13,1,3,1,0,0,0,0,60,0,0 +40,1,165108,0,13,1,0,1,0,0,0,0,40,7,0 +20,2,406641,5,10,0,0,3,0,1,0,0,35,0,0 +55,2,171467,1,9,2,10,4,1,0,0,0,48,0,1 +30,2,341187,7,4,4,6,0,0,0,0,0,35,0,0 +38,2,119177,1,9,1,5,1,0,0,0,0,55,0,1 +75,2,104896,1,9,1,5,1,0,0,2653,0,20,0,0 +17,2,342752,2,7,0,4,3,0,0,0,0,15,0,0 +20,2,47541,5,10,0,5,3,0,0,0,0,30,0,0 +25,2,233461,6,12,0,9,0,0,0,0,0,30,0,0 +27,2,303954,0,13,1,5,1,0,0,0,0,45,0,0 +19,2,163015,5,10,0,5,3,0,1,0,0,20,0,0 +21,2,75763,5,10,1,5,2,3,1,0,0,40,0,0 +19,2,43003,5,10,0,4,3,0,0,0,0,20,0,0 +42,2,328239,5,10,0,4,0,0,0,0,0,40,0,0 +28,2,130856,12,6,1,10,1,0,0,0,0,36,0,0 +47,1,190072,5,10,1,10,1,0,0,0,0,40,10,1 +59,2,170148,5,10,2,4,4,0,1,0,0,32,0,0 +50,2,104501,1,9,1,10,1,0,0,0,0,40,0,1 +48,5,213140,1,9,1,1,1,0,0,0,0,80,0,0 +33,4,175509,1,9,1,11,1,0,0,0,0,40,0,0 +27,2,173611,6,12,0,5,0,0,1,0,0,40,0,0 +45,2,148995,8,16,0,3,0,0,0,99999,0,30,0,1 +24,2,64520,7,4,0,5,3,0,0,0,0,40,0,0 +31,2,139822,1,9,1,0,2,0,1,0,0,40,0,1 +24,2,258700,11,3,0,7,5,1,0,0,0,40,4,0 +29,2,34796,1,9,0,1,0,0,0,0,0,40,0,0 +24,2,124963,1,9,0,8,3,0,0,0,0,30,0,0 +24,2,65743,0,13,0,0,0,0,1,0,0,30,0,0 +28,2,161087,5,10,0,1,0,1,1,0,0,45,2,0 +36,3,203836,5,10,1,2,1,0,0,0,0,50,0,0 +58,0,110199,7,4,1,6,1,0,0,0,0,40,0,0 +51,2,316059,5,10,2,1,0,0,1,0,0,36,0,0 +42,2,255667,5,10,1,10,1,0,0,0,0,50,0,1 +39,2,193689,5,10,1,8,1,0,0,0,0,40,0,0 +26,2,60722,0,13,0,3,3,2,1,0,0,40,0,0 +39,2,187847,5,10,0,10,0,0,0,0,0,40,0,0 +28,2,233275,0,13,0,3,0,0,0,0,0,45,0,0 +51,2,215404,0,13,1,3,1,3,0,15024,0,40,0,1 +45,2,201865,0,13,3,1,4,0,0,0,0,40,0,0 +45,2,118889,9,11,1,10,1,0,0,0,0,40,0,0 +23,0,368739,0,13,0,3,0,0,1,0,0,40,0,0 +38,2,123833,5,10,0,4,0,0,0,0,1408,40,0,0 +38,2,171344,2,7,3,6,3,0,0,0,0,36,4,0 +39,2,153976,5,10,1,8,1,0,0,0,0,40,0,0 +52,2,374883,9,11,0,7,0,0,0,0,0,50,0,0 +17,2,167658,14,8,0,5,3,0,1,0,0,6,0,0 +31,2,348504,0,13,1,1,1,0,0,0,0,50,0,0 +22,2,258509,1,9,0,6,3,1,0,0,0,24,0,0 +47,0,108890,1,9,2,0,4,0,1,1831,0,38,0,0 +28,2,188236,5,10,0,0,0,0,1,0,0,40,0,0 +41,2,425049,1,9,1,6,1,0,0,0,0,50,0,1 +29,2,142555,3,14,0,3,0,1,0,0,0,42,0,0 +42,1,29320,10,15,2,3,4,0,0,0,0,60,0,1 +52,3,207841,5,10,1,0,1,0,0,0,0,40,0,0 +35,2,187329,0,13,0,3,0,0,1,0,0,40,0,0 +28,2,270973,6,12,0,0,3,0,1,0,0,40,0,0 +46,2,197332,3,14,1,3,1,0,0,7688,0,46,0,1 +45,4,160187,1,9,3,0,4,1,1,0,0,40,0,0 +21,2,197918,1,9,0,6,3,0,0,0,0,40,0,0 +74,2,192290,12,6,1,0,1,0,0,0,0,20,0,0 +29,2,241895,1,9,1,6,5,0,0,0,0,40,0,0 +39,4,164515,1,9,2,0,4,0,1,0,0,40,0,0 +44,2,147206,5,10,1,10,1,0,0,7688,0,45,0,1 +23,5,306868,0,13,0,7,0,0,0,0,0,40,0,0 +32,4,169837,6,12,2,1,0,1,1,0,0,40,0,0 +43,2,185057,1,9,2,1,0,0,1,0,0,30,0,1 +23,2,240049,13,1,0,4,0,2,1,0,0,40,17,0 +18,2,164441,5,10,0,0,3,0,1,0,0,38,0,0 +38,2,179314,1,9,1,2,1,0,0,0,0,40,0,0 +33,2,319854,0,13,4,3,0,0,0,4650,0,35,0,0 +19,5,148955,5,10,0,4,3,2,1,0,0,35,27,0 +23,2,32950,5,10,0,6,0,0,0,4101,0,40,0,0 +37,2,206699,1,9,2,9,3,0,0,0,0,45,0,0 +25,2,385646,1,9,0,7,3,0,0,0,0,40,0,0 +45,2,168598,14,8,1,0,2,1,1,3103,0,40,0,1 +32,2,97306,0,13,0,0,0,0,1,0,0,48,0,0 +18,1,29582,2,7,0,10,3,0,0,0,0,40,0,0 +25,2,220284,1,9,0,6,4,0,0,0,0,40,4,0 +53,2,240914,5,10,1,10,1,0,0,0,0,40,0,0 +33,2,115496,8,16,1,3,1,0,0,0,0,60,0,1 +27,2,105817,0,13,0,10,0,0,0,0,0,45,0,0 +24,0,330836,1,9,1,11,1,0,0,0,0,40,0,0 +54,1,36327,7,4,1,8,1,0,0,0,0,50,0,0 +23,2,33423,5,10,0,5,0,0,1,0,0,30,0,0 +45,2,75673,9,11,6,0,0,2,1,0,0,40,0,0 +36,2,185744,5,10,1,1,2,0,1,0,0,35,0,1 +36,2,186035,2,7,1,10,1,0,0,5178,0,40,0,1 +44,4,196456,3,14,0,3,0,0,1,0,1669,40,0,0 +24,2,111450,1,9,0,6,4,1,0,0,0,40,0,0 +39,2,115289,5,10,2,5,3,0,0,0,1380,70,0,0 +50,2,74879,1,9,3,2,4,0,1,0,0,40,0,0 +38,2,117312,1,9,1,1,2,0,1,15024,0,40,0,1 +58,2,272902,0,13,6,1,4,0,1,0,0,40,0,0 +44,5,220230,1,9,1,4,1,1,0,0,0,48,0,0 +24,2,90934,0,13,0,5,3,2,0,0,0,55,0,0 +52,5,234286,1,9,1,1,1,0,0,15024,0,40,0,1 +46,2,364548,0,13,2,5,0,0,0,8614,0,40,0,1 +50,5,283676,8,16,1,3,1,0,0,15024,0,60,0,1 +34,2,195602,6,12,1,10,1,0,0,0,0,44,0,0 +40,2,70761,6,12,0,9,0,1,0,0,0,40,0,0 +53,2,142717,0,13,2,0,4,0,1,0,0,40,0,0 +24,2,124242,1,9,0,0,3,0,1,0,0,40,0,0 +26,2,287797,5,10,1,10,1,0,0,0,0,45,0,0 +22,2,188274,6,12,0,2,3,0,0,0,0,40,0,0 +36,2,171968,1,9,1,10,1,0,0,0,0,40,0,0 +36,2,218490,0,13,1,3,1,0,0,0,0,45,9,1 +43,4,94937,0,13,1,3,2,0,1,0,0,28,0,0 +60,2,109511,7,4,1,2,1,0,0,0,0,40,0,0 +49,4,269527,3,14,1,3,1,0,0,7298,0,40,0,1 +34,1,120672,7,4,0,2,4,1,0,0,0,10,0,0 +46,2,130779,5,10,1,0,1,0,0,0,0,40,0,0 +46,4,441542,0,13,1,6,1,1,0,0,0,40,0,0 +69,2,114801,1,9,1,4,1,0,0,0,0,20,0,0 +32,2,180284,12,6,1,10,1,0,0,0,0,40,0,1 +40,4,27444,0,13,0,3,0,0,0,0,0,50,0,1 +61,2,180382,11,3,1,2,1,0,0,3411,0,45,0,0 +56,2,143266,5,10,1,1,1,0,0,0,0,40,0,1 +47,2,139268,1,9,1,9,1,0,0,0,0,40,0,0 +29,2,126208,1,9,1,8,1,1,0,0,0,40,0,0 +37,2,186191,1,9,1,8,1,0,0,0,0,46,0,0 +51,2,197163,10,15,0,3,0,0,1,0,2559,50,0,1 +44,0,193524,3,14,1,1,1,0,0,0,1902,40,0,1 +33,2,181388,1,9,4,4,4,0,1,0,0,40,0,0 +51,1,124963,10,15,2,3,0,0,0,0,0,80,0,1 +24,2,188925,9,11,1,8,1,0,0,0,0,40,0,0 +37,1,149230,9,11,0,4,3,0,1,0,0,40,0,0 +40,2,388725,5,10,2,1,0,0,0,0,0,40,0,0 +34,2,113543,3,14,0,1,3,0,0,0,0,40,0,0 +69,3,143849,2,7,6,0,0,0,1,0,0,20,0,0 +41,1,97277,9,11,2,4,4,0,1,0,0,10,0,0 +40,2,199303,1,9,1,10,1,0,0,0,0,40,0,0 +57,2,124852,5,10,0,2,3,1,0,0,0,40,0,0 +26,2,50053,0,13,1,1,1,0,0,0,0,55,0,0 +53,2,97005,1,9,1,10,1,0,0,0,0,46,0,1 +39,2,337898,0,13,2,1,0,0,0,0,0,55,0,0 +51,3,124076,0,13,6,0,0,0,1,0,0,40,0,0 +56,3,277420,0,13,1,1,1,0,0,0,0,40,5,1 +51,2,280278,12,6,4,0,4,1,1,0,0,40,0,0 +17,2,241185,14,8,0,3,3,0,0,0,0,20,0,0 +42,2,202188,5,10,2,1,0,0,1,0,1741,50,0,0 +42,2,198422,5,10,2,0,3,0,1,0,0,40,0,0 +29,2,82242,10,15,0,3,4,0,0,27828,0,45,9,1 +33,2,178429,0,13,1,3,1,0,0,0,0,40,0,1 +43,2,212847,5,10,2,8,0,0,0,0,0,40,0,0 +64,1,219661,10,15,1,3,1,0,0,0,0,9,0,1 +40,2,321856,1,9,2,6,0,0,0,0,0,60,0,1 +21,2,313873,11,3,0,2,0,0,0,0,0,40,4,0 +31,2,144064,5,10,1,1,1,0,0,0,0,40,0,0 +60,2,139586,9,11,6,1,4,2,1,0,0,40,0,1 +32,2,419691,14,8,1,5,1,0,0,0,0,40,0,1 +27,2,195562,1,9,0,10,3,1,0,0,0,20,0,0 +40,2,205706,1,9,1,1,2,0,1,0,0,40,0,0 +27,2,131310,1,9,1,4,2,0,1,0,0,40,0,1 +18,2,54440,5,10,0,4,3,0,0,0,0,30,0,0 +43,2,200734,1,9,4,4,0,1,1,0,0,40,0,0 +52,2,81859,1,9,1,8,1,0,0,0,0,48,0,1 +31,2,159589,1,9,0,4,0,0,0,0,0,85,0,0 +28,2,300915,1,9,1,6,1,0,0,0,0,60,0,0 +44,2,185057,3,14,0,3,0,0,1,0,0,35,0,0 +37,1,42044,5,10,1,7,1,0,0,0,0,84,0,0 +35,2,166416,0,13,1,1,1,0,0,0,0,50,0,1 +42,2,212737,4,5,4,10,4,1,0,0,0,40,0,0 +18,2,236069,12,6,0,4,3,1,0,0,0,10,0,0 +46,5,216414,3,14,1,5,1,0,0,0,1977,60,0,1 +54,3,27432,1,9,1,0,1,0,0,0,0,40,0,1 +54,2,145419,1,9,1,5,1,0,0,0,1672,50,0,0 +56,2,147202,5,10,2,0,0,0,1,0,0,45,9,0 +27,2,29261,5,10,0,5,4,0,0,0,0,50,0,0 +26,2,359543,0,13,0,0,3,0,1,0,0,40,4,0 +41,4,227644,5,10,1,10,1,0,0,0,0,40,0,0 +32,2,188154,5,10,2,8,4,0,1,0,0,40,0,0 +18,2,110142,1,9,0,0,3,0,1,0,0,30,0,0 +36,2,186415,1,9,1,2,1,0,0,0,0,65,0,0 +37,2,175720,12,6,0,2,0,0,0,0,0,40,0,0 +31,2,172865,11,3,0,7,3,0,0,0,0,25,4,0 +46,2,35969,0,13,1,1,1,0,0,0,0,51,0,0 +24,2,433330,1,9,2,8,0,0,0,0,0,40,0,0 +25,5,160261,0,13,0,1,3,2,0,0,0,35,18,0 +55,2,189528,11,3,1,10,1,0,0,0,0,50,0,0 +64,4,113324,1,9,6,1,0,0,0,0,0,40,0,0 +30,4,118500,0,13,0,3,0,0,1,0,0,40,0,0 +65,2,89681,3,14,0,3,0,0,0,0,0,99,0,0 +46,3,199925,0,13,2,3,0,0,0,0,0,40,0,0 +45,2,102308,3,14,1,1,1,0,0,15024,0,60,0,1 +18,2,444607,5,10,0,5,3,0,1,0,0,25,0,0 +32,2,176998,0,13,1,1,1,0,0,0,0,40,0,0 +34,0,366198,8,16,1,3,1,0,0,0,0,45,9,1 +35,2,180686,1,9,1,10,1,0,0,3137,0,40,0,0 +26,2,108019,1,9,0,10,3,0,0,3325,0,40,0,0 +24,2,153542,5,10,0,5,5,0,0,0,0,35,0,0 +45,1,210364,1,9,1,5,1,0,0,15024,0,80,0,1 +36,2,185394,12,6,0,2,0,0,1,0,0,34,0,0 +44,2,222703,7,4,1,8,1,4,0,0,0,40,35,0 +23,2,183945,5,10,0,0,0,0,1,0,0,60,0,0 +57,2,161964,1,9,1,10,1,0,0,0,0,55,0,0 +41,1,375574,5,10,1,5,1,0,0,0,0,60,4,1 +20,4,312427,1,9,1,11,1,1,0,0,0,30,5,0 +32,2,53373,5,10,1,10,1,0,0,0,0,36,0,0 +60,2,166330,1,9,1,4,2,0,1,99999,0,40,0,1 +38,5,124665,0,13,0,10,0,0,1,0,0,20,0,0 +29,2,146719,1,9,0,6,0,0,1,0,0,45,0,0 +22,2,306593,1,9,0,10,3,0,0,0,0,40,0,0 +21,2,156687,5,10,0,5,3,2,0,0,0,30,3,0 +40,4,153489,1,9,1,4,5,0,0,3137,0,40,0,0 +59,2,231377,5,10,1,1,1,0,0,0,1848,45,0,1 +45,0,127089,3,14,2,1,0,0,0,0,0,45,0,0 +76,4,329355,1,9,6,4,0,0,1,0,0,13,0,0 +45,2,178319,0,13,1,8,1,0,0,0,0,40,0,1 +49,4,304246,3,14,4,3,4,0,1,0,0,70,0,0 +36,4,174640,9,11,0,11,0,1,1,0,0,60,0,1 +22,2,148294,2,7,0,10,3,0,0,0,0,35,0,0 +47,2,298037,9,11,2,3,4,0,1,0,0,44,0,0 +26,2,98155,1,9,5,5,1,0,0,0,0,55,0,0 +21,2,102766,5,10,2,10,3,0,0,0,0,40,0,0 +27,2,78529,1,9,0,6,3,0,1,0,0,15,0,0 +26,2,136309,0,13,0,4,0,0,0,0,0,40,0,0 +20,2,275357,9,11,0,9,3,0,1,0,0,25,0,0 +31,1,33117,3,14,0,3,0,0,0,0,0,45,7,0 +57,4,199546,3,14,2,4,4,1,1,0,0,40,0,0 +39,2,184128,2,7,2,5,5,0,1,0,0,40,0,0 +36,2,337039,6,12,0,9,0,1,0,14344,0,40,7,1 +66,2,126511,5,10,1,1,1,0,0,0,0,45,0,0 +34,4,325792,5,10,1,10,1,0,0,0,0,40,0,0 +21,2,119474,1,9,0,4,5,0,1,0,0,40,0,0 +40,2,153238,0,13,1,1,1,0,0,0,1902,32,0,1 +49,4,321851,6,12,2,0,0,0,1,0,0,30,0,0 +48,1,108557,5,10,2,5,0,0,1,3325,0,60,0,0 +19,0,67217,5,10,0,4,0,0,0,594,0,24,0,0 +42,2,195508,2,7,1,6,1,1,0,0,0,40,0,0 +59,2,102193,1,9,1,6,1,0,0,0,0,45,0,0 +63,2,20323,5,10,2,4,0,0,1,0,0,40,0,0 +26,2,122206,1,9,0,10,5,0,0,0,0,40,0,0 +41,2,200652,4,5,2,4,5,0,1,0,0,35,0,0 +42,2,173590,5,10,1,0,1,0,0,0,1628,40,0,0 +19,2,184121,1,9,0,4,3,0,0,0,0,20,0,0 +45,4,53123,2,7,1,4,2,0,1,0,0,25,0,0 +47,2,175990,1,9,1,4,2,0,1,0,0,30,0,1 +47,2,316101,1,9,2,0,0,0,1,0,0,40,0,0 +34,2,34080,9,11,1,10,1,0,0,0,0,40,7,0 +49,1,219718,0,13,1,5,1,0,0,15024,0,40,0,1 +36,2,126954,1,9,2,6,0,0,0,0,0,40,0,0 +53,2,99185,1,9,6,10,4,0,0,0,0,40,0,1 +39,2,120074,1,9,2,2,0,0,0,0,0,40,0,0 +52,1,77336,9,11,1,10,1,0,0,0,0,40,0,0 +18,2,60981,5,10,0,5,3,0,1,2176,0,35,0,0 +59,2,77884,9,11,0,10,0,2,0,0,0,40,0,0 +50,2,65408,1,9,1,10,1,0,0,0,0,50,0,1 +31,2,173279,0,13,1,9,1,2,0,0,0,40,0,1 +41,1,157686,5,10,1,1,1,0,0,0,0,40,0,1 +45,2,277434,6,12,6,9,4,0,0,0,0,40,0,1 +54,4,184620,3,14,2,3,0,0,1,0,0,40,0,0 +22,2,34443,1,9,0,7,0,0,0,0,0,25,0,0 +50,2,268553,1,9,1,6,1,0,0,7298,0,40,0,1 +43,2,459342,1,9,2,0,0,0,1,0,0,40,0,0 +48,4,148549,0,13,1,3,1,0,0,0,0,40,0,0 +24,2,254293,0,13,0,1,0,0,0,2174,0,45,0,0 +54,2,104501,5,10,1,5,1,0,0,15024,0,40,0,1 +26,2,238367,1,9,1,0,1,0,0,0,0,40,0,0 +53,2,180439,0,13,1,10,1,0,0,0,0,40,0,1 +51,5,100029,8,16,1,3,1,0,0,15024,0,40,0,1 +54,2,215990,3,14,1,1,1,0,0,0,1887,44,0,1 +32,0,111567,1,9,1,10,1,0,0,0,0,49,0,1 +46,2,319163,1,9,1,10,1,1,0,0,0,40,0,0 +52,4,378045,1,9,2,0,0,0,1,0,0,45,0,0 +44,2,177083,1,9,2,0,0,0,1,0,0,40,0,0 +56,5,119891,5,10,1,1,1,0,0,0,1672,40,0,0 +57,2,127779,1,9,1,1,1,0,0,0,0,40,0,0 +35,2,299353,1,9,0,4,4,1,1,0,0,40,0,0 +30,2,63861,6,12,0,9,0,0,1,0,0,40,0,0 +29,2,112403,5,10,0,2,0,0,0,0,0,35,0,0 +49,2,83610,0,13,1,1,1,0,0,7688,0,66,0,1 +28,2,452808,12,6,0,2,0,0,0,0,0,40,0,0 +30,2,176871,5,10,4,0,4,1,1,0,0,40,0,0 +45,2,100651,1,9,2,4,0,0,0,0,1980,40,0,0 +17,2,266134,12,6,0,4,3,0,0,0,0,12,0,0 +54,4,196307,12,6,1,0,1,0,0,0,0,40,0,0 +31,2,87891,5,10,1,0,1,0,0,0,0,40,0,0 +54,2,182314,8,16,1,1,1,0,0,0,1977,50,0,1 +37,2,179671,4,5,1,2,1,0,0,0,0,50,0,0 +34,2,27494,1,9,2,10,0,3,0,0,0,48,0,1 +38,2,338320,0,13,1,3,1,0,0,0,0,40,8,0 +51,2,199688,5,10,1,1,1,0,0,0,0,45,0,0 +41,2,96635,1,9,0,1,0,2,0,0,0,60,0,0 +24,2,165064,5,10,0,2,0,0,0,0,0,40,0,0 +56,5,109856,0,13,1,1,1,0,0,15024,0,50,0,1 +33,2,82393,1,9,0,10,3,2,0,0,0,40,0,0 +31,2,209538,12,6,1,8,1,0,0,0,0,40,0,0 +27,2,209891,5,10,0,2,0,1,0,0,0,50,0,0 +32,1,56026,0,13,1,5,5,0,0,0,0,45,0,0 +35,2,210844,6,12,1,1,1,0,0,0,0,40,5,0 +43,2,117158,5,10,1,10,1,0,0,0,0,45,0,1 +40,2,193144,1,9,2,4,4,0,1,0,0,36,0,0 +19,1,137578,1,9,0,4,3,0,0,0,0,53,0,0 +23,2,234108,6,12,0,2,3,0,0,0,0,32,0,0 +40,2,155767,1,9,4,8,4,0,0,0,0,40,0,0 +59,2,110820,1,9,2,10,0,0,0,0,0,38,0,1 +43,2,403276,1,9,1,10,1,0,0,0,0,40,0,0 +53,2,123092,1,9,6,8,0,0,1,0,0,40,0,0 +26,2,165673,1,9,1,5,1,0,0,0,0,40,0,0 +68,5,182131,5,10,1,1,1,0,0,10605,0,20,0,1 +41,2,204415,0,13,1,5,1,0,0,0,0,48,0,1 +32,1,92531,1,9,2,10,4,0,0,0,0,40,0,0 +25,0,157028,0,13,0,1,0,0,0,0,0,40,0,0 +20,2,228649,1,9,0,4,3,0,0,0,0,40,0,0 +22,2,147253,5,10,0,4,0,0,0,0,0,15,0,0 +33,2,160784,12,6,1,10,1,0,0,0,0,40,0,0 +26,4,163189,5,10,1,4,5,0,0,0,0,40,0,0 +29,2,146343,1,9,0,4,4,1,1,0,0,25,0,0 +20,2,225811,1,9,0,5,3,0,1,0,0,23,0,0 +58,2,374108,5,10,2,3,4,0,1,0,0,40,0,0 +32,2,93930,1,9,2,8,0,0,0,0,0,40,0,0 +23,2,412248,6,12,0,4,0,0,1,0,0,25,0,0 +30,2,427474,4,5,1,4,1,0,0,0,0,40,4,0 +67,0,160158,5,10,1,7,1,0,0,0,0,8,0,0 +26,2,159603,6,12,0,0,4,0,1,0,0,32,0,0 +53,1,101017,1,9,1,1,1,0,0,0,0,35,0,0 +27,4,163862,1,9,1,6,1,0,0,0,0,60,0,0 +29,6,212588,5,10,1,7,3,0,0,0,0,65,0,0 +38,0,321943,8,16,1,3,1,0,0,0,0,40,0,1 +17,2,317702,4,5,0,4,3,1,1,0,0,40,0,0 +48,2,287480,3,14,1,9,1,0,0,0,0,40,0,1 +28,2,168514,6,12,1,1,2,0,1,0,0,40,0,0 +18,2,88642,5,10,0,5,3,0,0,0,0,15,0,0 +28,2,227104,5,10,2,5,0,0,0,0,0,30,0,0 +34,2,157289,5,10,1,10,1,0,0,0,0,40,0,0 +62,2,213321,1,9,1,3,1,0,0,0,0,40,0,1 +46,2,294907,11,3,1,8,1,0,0,0,0,40,4,0 +30,2,251411,5,10,2,0,4,0,1,0,0,40,0,0 +20,2,183594,5,10,0,6,3,0,0,0,0,40,0,0 +29,2,189565,1,9,0,1,0,0,0,2174,0,50,0,0 +55,2,217802,5,10,1,0,1,1,0,0,0,25,0,0 +20,2,388156,5,10,0,3,3,0,0,0,0,24,0,0 +54,2,447555,12,6,1,6,1,1,0,0,0,40,0,0 +27,2,204098,12,6,0,10,0,0,0,0,0,30,0,0 +43,2,193882,5,10,0,0,0,0,0,0,0,55,0,0 +48,0,49595,3,14,2,11,0,0,0,0,0,72,0,0 +34,2,228873,0,13,0,1,3,0,0,0,0,40,0,0 +29,2,176027,0,13,0,3,0,0,1,0,0,40,0,0 +37,2,39606,9,11,2,5,4,0,1,0,0,40,0,0 +56,2,178353,5,10,1,3,1,0,0,0,0,40,0,1 +58,2,160662,12,6,1,10,1,0,0,0,0,40,0,1 +54,5,196328,0,13,1,5,1,1,0,0,0,40,2,0 +45,2,20534,5,10,4,10,0,0,0,0,0,41,0,0 +29,5,156815,1,9,1,4,1,0,0,0,0,40,0,0 +26,2,360252,6,12,1,0,2,0,1,0,0,40,0,0 +43,2,245056,1,9,1,0,1,1,0,0,0,40,0,1 +33,4,422718,1,9,1,4,1,0,0,0,0,40,0,0 +45,1,118081,5,10,1,4,1,0,0,3103,0,42,0,0 +25,2,262978,5,10,0,5,0,0,0,0,0,30,0,0 +25,2,187577,1,9,1,10,1,0,0,0,0,40,0,0 +37,2,160920,6,12,1,0,1,0,0,0,0,40,0,0 +20,2,194247,1,9,0,1,0,0,0,0,0,25,0,0 +39,2,134367,3,14,1,3,2,0,1,0,1977,24,0,1 +17,2,123335,12,6,0,5,3,0,1,0,0,20,0,0 +27,4,332249,1,9,0,7,3,0,0,0,0,40,0,0 +26,2,358124,1,9,0,4,5,1,1,0,0,40,0,0 +55,2,208019,11,3,1,8,1,0,0,0,0,40,4,0 +39,2,318452,2,7,1,3,1,0,0,0,0,60,0,0 +41,2,207779,1,9,4,4,0,0,1,0,0,40,0,0 +34,2,238376,15,2,1,10,1,0,0,0,0,40,4,0 +51,2,673764,9,11,1,1,1,0,0,0,0,50,0,1 +40,2,133974,5,10,2,8,3,0,0,0,0,40,0,0 +58,2,138285,6,12,1,10,1,0,0,0,1740,40,0,0 +23,2,152140,1,9,0,5,0,0,1,0,0,40,0,0 +45,4,287920,3,14,1,3,1,0,0,0,0,50,0,1 +51,2,289572,0,13,1,5,1,0,0,7688,0,50,0,1 +43,0,78765,5,10,2,1,4,0,0,0,0,40,0,0 +25,0,99076,0,13,0,4,0,0,1,2597,0,50,0,0 +36,1,224886,0,13,1,1,1,0,0,2407,0,40,0,0 +58,2,206532,1,9,1,10,1,0,0,0,0,50,0,0 +33,2,129529,1,9,2,8,0,0,0,0,0,40,0,0 +60,4,202473,9,11,1,4,1,0,0,0,0,40,0,0 +24,2,162312,1,9,0,5,3,2,0,0,0,40,27,0 +45,2,72844,1,9,2,1,0,0,1,0,0,46,0,0 +49,2,206947,1,9,2,0,0,0,1,0,0,40,0,0 +19,2,64112,14,8,0,0,0,0,1,0,0,40,0,0 +34,0,20057,5,10,3,0,4,2,1,0,0,38,11,0 +42,0,222884,0,13,2,0,0,0,0,0,0,40,0,0 +25,2,132683,1,9,0,13,0,0,1,0,0,50,0,0 +59,1,144071,11,3,1,4,1,0,0,2580,0,15,22,0 +28,2,148429,1,9,1,8,1,0,0,2885,0,40,0,0 +19,2,168601,2,7,0,4,5,0,0,0,0,30,0,0 +31,0,78291,0,13,0,3,0,0,1,0,0,40,0,0 +58,3,243929,0,13,0,3,0,0,0,0,0,48,0,0 +47,1,185673,1,9,1,1,1,0,0,0,0,50,0,1 +30,2,121142,0,13,0,5,0,0,0,0,0,40,0,1 +41,2,173858,7,4,1,10,1,2,0,0,0,40,26,0 +43,2,334991,5,10,4,6,4,0,0,4934,0,51,0,1 +48,2,93476,1,9,4,0,0,0,1,0,2001,40,0,0 +44,2,174283,0,13,1,5,1,0,0,0,0,50,0,1 +44,2,128676,5,10,0,0,0,1,1,0,0,40,0,0 +24,2,205844,0,13,0,1,3,1,1,0,0,40,0,0 +28,2,62535,1,9,1,10,1,0,0,0,0,43,0,0 +50,2,240612,1,9,3,1,4,0,1,0,0,10,0,0 +33,2,176992,5,10,1,10,1,0,0,0,0,40,0,1 +23,4,254127,0,13,0,3,5,0,1,0,0,50,0,0 +46,2,128460,12,6,1,2,1,0,0,0,0,40,0,0 +21,0,56582,5,10,0,9,3,0,0,0,0,10,0,0 +52,2,153751,4,5,4,4,0,1,1,0,0,30,0,0 +26,2,284343,0,13,0,3,0,0,0,0,0,50,0,0 +27,0,312692,0,13,0,9,0,0,0,0,0,12,0,0 +28,2,111520,2,7,0,8,4,0,1,0,0,40,35,0 +50,5,304955,0,13,1,5,1,0,0,0,0,60,0,1 +28,2,288598,1,9,1,10,1,0,0,0,0,35,0,0 +61,1,117387,2,7,1,1,1,0,0,0,0,20,0,0 +32,2,230484,7,4,4,5,4,0,1,0,0,35,0,0 +30,3,319280,5,10,0,10,0,0,0,0,0,40,0,0 +51,4,186416,0,13,2,0,0,0,1,0,0,40,0,0 +40,4,147372,5,10,0,11,0,0,0,0,2444,40,0,1 +36,2,145933,1,9,0,1,0,0,0,0,2258,70,0,0 +28,2,110164,5,10,2,4,5,1,0,0,0,24,0,0 +49,2,225454,6,12,1,3,1,0,0,0,0,45,0,1 +61,1,220342,7,4,1,6,1,0,0,0,0,30,0,0 +41,1,144002,0,13,1,1,1,0,0,0,0,60,0,1 +55,2,225365,1,9,6,4,4,0,1,0,0,30,0,0 +36,2,187983,0,13,1,3,2,0,1,0,0,40,0,0 +21,2,89991,5,10,0,0,3,0,1,0,0,40,0,0 +57,1,225913,5,10,1,6,1,0,0,0,0,45,0,1 +49,5,229737,10,15,1,3,1,0,0,99999,0,37,0,1 +59,2,145574,2,7,1,0,1,0,0,0,0,40,0,0 +41,2,274363,5,10,4,5,0,0,0,0,0,80,0,1 +59,2,365390,5,10,1,10,1,0,0,0,0,40,0,0 +20,2,266467,1,9,0,4,3,0,0,0,0,25,0,0 +42,2,183384,5,10,2,0,0,1,1,0,0,40,0,0 +41,4,112797,3,14,2,3,4,0,1,0,0,60,0,0 +45,3,76008,0,13,1,1,1,0,0,0,0,50,0,1 +42,4,186909,6,12,1,1,2,0,1,0,0,45,0,1 +25,2,25497,0,13,1,3,1,0,0,0,0,40,0,0 +45,2,102771,1,9,1,10,1,0,0,0,1887,40,0,1 +58,1,248841,1,9,1,5,1,0,0,15024,0,40,0,1 +39,2,30916,1,9,1,10,1,0,0,0,0,40,0,0 +34,2,123270,1,9,1,10,1,0,0,0,0,40,0,1 +22,1,210165,5,10,0,10,0,0,0,0,0,40,0,0 +44,2,222596,1,9,2,9,0,0,0,0,0,50,0,1 +53,5,188067,5,10,6,5,4,0,1,0,0,40,0,0 +27,2,250314,4,5,1,11,1,0,0,0,0,40,24,0 +60,2,205934,1,9,4,4,0,0,1,0,0,25,0,0 +46,2,186172,0,13,1,3,1,0,0,3103,0,40,0,1 +56,5,98418,10,15,1,3,1,0,0,99999,0,40,0,1 +36,2,329980,0,13,0,1,0,0,0,27828,0,40,0,1 +56,2,147653,1,9,2,0,4,0,1,0,0,32,0,0 +29,5,168221,0,13,1,1,1,0,0,0,1740,70,0,0 +19,2,151801,12,6,0,2,3,0,0,0,0,39,0,0 +38,2,177154,1,9,1,4,1,0,0,0,0,40,0,0 +40,3,73883,5,10,1,9,1,0,0,0,0,40,0,1 +52,2,175714,6,12,1,1,1,0,0,0,0,55,0,1 +22,2,43535,5,10,1,1,2,0,1,0,0,40,0,0 +32,0,104509,1,9,2,4,0,0,1,0,0,25,0,0 +27,2,118230,0,13,0,1,3,0,1,0,0,40,0,0 +25,2,152046,0,13,0,3,3,0,1,0,0,40,24,0 +36,2,52327,3,14,1,3,1,4,0,0,0,40,10,1 +22,2,218886,14,8,0,2,3,3,0,0,0,40,0,0 +32,1,84119,1,9,1,10,1,0,0,0,0,45,0,0 +37,2,189674,0,13,4,1,4,1,1,0,0,40,0,0 +22,2,222993,1,9,0,3,3,0,0,0,0,54,0,0 +29,2,47429,1,9,1,0,2,0,1,0,0,40,0,1 +42,2,144995,13,1,0,2,0,0,0,0,0,25,0,0 +45,2,187969,9,11,0,5,0,0,1,0,0,38,0,0 +33,2,288398,0,13,2,0,0,0,1,0,0,45,0,0 +39,2,114591,5,10,4,3,4,0,1,0,0,40,0,0 +27,2,167737,14,8,0,8,0,0,0,0,0,45,0,0 +53,4,248834,0,13,1,3,2,0,1,0,0,50,0,1 +30,2,165686,0,13,0,4,0,0,1,0,0,40,0,0 +52,1,40200,5,10,6,10,0,1,0,0,0,35,0,0 +43,5,117158,0,13,1,5,1,0,0,15024,0,60,0,1 +47,4,216657,3,14,0,3,0,0,0,0,0,35,0,1 +61,2,124242,1,9,1,11,1,1,0,0,0,40,3,0 +39,4,239119,3,14,2,3,0,1,0,0,0,40,21,0 +47,2,190072,5,10,2,5,4,0,0,0,0,50,0,0 +19,2,378114,1,9,1,10,1,0,0,0,0,25,0,0 +37,2,236990,5,10,1,8,1,0,0,3464,0,40,0,0 +31,2,101761,1,9,1,10,1,0,0,0,0,51,0,0 +69,1,37745,9,11,1,5,1,0,0,0,0,8,0,0 +29,2,130438,1,9,1,8,1,0,0,0,0,40,0,0 +24,2,100605,5,10,0,8,3,4,0,0,0,14,0,0 +42,2,220776,1,9,4,2,4,0,0,0,0,40,12,0 +30,4,154950,0,13,1,11,1,0,0,0,0,72,0,1 +28,2,192283,3,14,3,5,0,0,1,0,0,80,0,1 +27,2,210765,9,11,0,2,0,0,0,0,0,40,0,0 +53,2,147476,1,9,2,1,0,1,1,0,0,40,0,0 +35,0,193241,1,9,1,10,1,0,0,0,1651,40,0,0 +22,2,109053,14,8,1,6,1,0,0,0,0,40,0,0 +25,2,265618,1,9,4,11,3,1,0,0,0,40,0,0 +38,4,172855,0,13,1,3,2,1,1,0,1887,40,0,1 +27,2,68848,0,13,0,0,4,0,1,0,0,35,0,0 +30,2,229051,4,5,1,4,1,0,0,0,0,37,0,0 +27,2,106039,0,13,2,3,3,0,1,0,0,50,0,0 +25,2,112835,0,13,0,3,0,0,0,0,0,40,0,0 +32,2,283400,1,9,0,8,0,0,1,0,0,40,0,0 +70,2,195739,12,6,6,10,4,0,0,0,0,45,0,0 +50,2,36480,1,9,1,1,1,0,0,0,0,40,0,0 +40,2,303291,5,10,1,4,2,0,1,0,0,35,0,0 +34,2,293900,2,7,3,10,0,1,0,0,0,55,0,0 +57,1,165922,1,9,1,10,1,0,0,0,0,50,0,0 +39,2,65738,3,14,0,4,0,0,1,0,0,32,0,0 +49,2,175070,5,10,2,4,4,0,1,0,0,40,0,0 +43,2,339814,5,10,1,3,1,0,0,5178,0,40,0,1 +26,2,150132,1,9,0,0,0,0,1,0,0,45,0,0 +31,2,377374,5,10,2,0,4,1,1,0,0,40,28,0 +60,1,166153,5,10,1,5,1,0,0,0,0,50,0,0 +46,2,110171,3,14,1,3,1,0,0,15024,0,50,0,1 +26,2,94477,5,10,1,6,1,0,0,7298,0,55,0,1 +27,2,194243,10,15,0,3,3,0,1,0,0,40,0,0 +31,2,106347,5,10,1,0,2,1,1,0,0,40,0,0 +59,2,214865,1,9,6,1,4,0,1,0,0,50,0,0 +18,2,96445,5,10,0,4,3,0,1,0,0,24,0,0 +22,2,102632,5,10,1,1,1,0,0,0,0,45,0,0 +24,2,209034,6,12,1,5,3,0,1,0,0,20,0,0 +53,0,153486,12,6,1,6,1,0,0,0,0,40,0,1 +43,2,144371,1,9,1,2,1,0,0,0,0,42,0,1 +24,2,186213,5,10,1,9,1,0,0,0,0,50,0,1 +60,2,188236,12,6,6,9,4,0,1,0,0,40,0,0 +24,2,418405,1,9,1,10,1,0,0,0,0,40,0,0 +52,3,125796,1,9,0,0,0,1,0,0,0,40,0,0 +32,2,183304,9,11,1,6,1,0,0,0,0,99,0,1 +34,2,329587,12,6,4,4,0,0,1,0,0,35,0,0 +35,4,182570,6,12,1,11,1,0,0,0,0,40,0,1 +38,2,446654,4,5,3,2,0,0,0,0,0,40,4,0 +34,1,254304,1,9,1,7,1,0,0,4508,0,90,0,0 +53,4,131258,10,15,0,3,0,0,1,0,0,50,0,1 +23,2,103632,1,9,0,0,0,0,1,0,0,40,0,0 +40,2,241895,5,10,1,0,1,0,0,0,0,40,0,0 +40,2,244945,1,9,1,10,1,0,0,0,0,40,0,0 +50,2,20795,1,9,1,7,1,0,0,0,0,60,0,1 +17,2,347322,12,6,0,5,3,0,1,0,0,20,0,0 +53,4,103995,0,13,2,3,0,0,1,0,1876,54,0,0 +32,2,53206,0,13,2,10,0,0,0,0,0,50,0,1 +18,2,57108,2,7,0,5,3,0,0,0,0,16,0,0 +62,2,177791,12,6,2,4,3,0,1,0,0,40,0,0 +45,2,33794,3,14,1,4,1,0,0,0,0,40,0,0 +46,2,249935,8,16,1,3,1,0,0,0,0,70,0,0 +73,1,241121,7,4,1,7,1,0,0,0,0,40,0,0 +64,2,98586,8,16,1,3,1,0,0,0,0,60,0,1 +26,2,181920,0,13,1,3,2,0,1,0,0,45,0,1 +23,2,434467,1,9,0,5,0,0,0,0,0,48,0,0 +30,2,113364,1,9,0,8,5,0,0,0,0,40,36,0 +51,2,249706,5,10,2,0,4,0,1,0,0,40,0,0 +35,1,95455,0,13,2,1,4,0,1,0,0,55,0,0 +39,2,209867,5,10,0,0,0,0,1,13550,0,45,0,1 +35,5,79586,3,14,1,3,1,2,0,0,0,40,3,1 +41,2,289669,1,9,6,8,0,0,1,0,0,40,0,0 +31,2,347166,5,10,2,10,3,0,0,4650,0,40,0,0 +40,2,53835,0,13,1,5,1,0,0,0,0,50,0,1 +46,4,14878,10,15,1,3,1,2,0,0,0,40,11,1 +31,2,266126,1,9,0,4,0,0,1,0,0,30,0,0 +41,5,146659,5,10,2,8,0,0,1,0,0,40,6,0 +42,2,125280,0,13,1,1,1,0,0,3137,0,40,0,0 +23,2,173535,1,9,0,5,3,0,0,0,0,40,0,0 +49,2,280525,5,10,1,0,1,0,0,0,0,45,0,1 +53,2,479621,9,11,2,9,0,1,0,0,0,40,0,0 +38,4,194630,0,13,0,11,0,0,1,4787,0,43,0,1 +36,2,247600,6,12,2,1,4,2,1,0,0,40,18,0 +32,2,258406,5,10,0,10,4,0,0,0,0,72,4,0 +20,2,107746,2,7,0,6,5,0,0,0,0,40,24,0 +22,2,229987,5,10,0,9,5,2,1,0,0,32,0,0 +25,2,312338,9,11,0,10,4,3,0,0,0,40,0,0 +58,2,225394,1,9,1,10,1,0,0,0,1902,40,0,0 +24,2,373718,5,10,0,7,0,0,0,0,0,20,0,0 +48,0,120131,1,9,2,10,3,0,0,8614,0,40,0,1 +20,2,472789,15,2,0,7,0,0,0,0,0,30,22,0 +60,1,27886,5,10,1,1,1,0,0,0,0,40,0,1 +20,2,138352,1,9,0,4,5,0,0,0,0,30,0,0 +52,2,123011,5,10,1,1,1,0,0,0,0,45,0,1 +36,2,306567,1,9,1,6,2,0,1,0,0,40,0,1 +46,4,187749,0,13,1,3,1,2,0,0,0,40,11,1 +22,2,260594,2,7,0,5,4,0,1,0,0,25,0,0 +19,2,236879,5,10,0,1,3,0,1,0,0,35,0,0 +37,2,186808,1,9,0,5,4,0,0,0,0,40,0,0 +30,2,373213,9,11,2,5,0,0,1,0,0,40,0,1 +44,2,187629,6,12,0,10,0,0,0,0,0,25,0,0 +22,2,305781,1,9,0,5,0,0,0,0,0,45,8,0 +31,5,256362,0,13,1,5,1,0,0,3908,0,50,0,0 +17,2,239947,2,7,0,0,3,0,0,0,0,40,0,0 +21,2,349041,1,9,0,2,0,0,0,0,0,40,0,0 +67,2,105252,3,14,1,1,1,0,0,0,0,40,0,1 +46,2,182715,7,4,2,1,0,0,0,0,0,40,0,0 +29,2,166210,1,9,2,2,3,0,0,0,0,50,0,0 +20,2,113200,5,10,0,2,3,0,1,0,0,6,0,0 +27,2,142075,5,10,0,4,3,0,0,0,0,24,0,0 +35,2,454843,5,10,1,10,1,0,0,0,0,40,0,1 +19,2,142219,5,10,0,0,3,0,1,0,0,30,0,0 +36,2,112512,14,8,4,4,4,0,1,0,0,40,4,0 +43,2,212894,0,13,1,1,1,0,0,15024,0,50,0,1 +62,0,265201,0,13,2,3,0,0,0,0,0,40,0,0 +28,2,251905,10,15,0,3,0,0,0,0,2339,40,8,0 +18,2,170627,2,7,0,4,3,0,1,0,0,15,0,0 +59,2,354037,10,15,1,6,1,1,0,15024,0,50,0,1 +37,2,259089,0,13,2,1,0,0,0,0,0,40,0,0 +27,2,21856,5,10,0,10,0,1,0,0,0,40,0,0 +46,4,207946,3,14,2,3,4,0,1,0,0,43,0,0 +29,2,77009,2,7,4,5,0,0,1,0,2754,42,0,0 +33,2,36539,0,13,1,1,2,0,1,0,0,40,0,1 +62,2,176811,1,9,1,10,1,0,0,0,0,40,0,0 +46,2,456062,8,16,1,3,1,0,0,0,2415,55,0,1 +28,2,277746,12,6,1,8,1,0,0,0,0,40,0,0 +22,2,288132,5,10,0,5,3,0,1,0,0,35,0,0 +46,3,344415,3,14,1,12,1,0,0,0,1887,40,0,1 +54,5,206964,5,10,1,5,1,0,0,0,1977,40,0,1 +34,2,198091,1,9,1,10,1,0,0,0,0,72,0,0 +62,2,588484,0,13,1,5,1,0,0,0,0,20,0,1 +30,2,113364,5,10,1,2,1,0,0,0,0,40,12,0 +19,2,270551,1,9,0,4,3,0,0,0,0,20,0,0 +27,2,190525,9,11,0,8,4,0,0,0,0,45,0,0 +36,2,153066,5,10,1,10,1,0,0,0,0,50,0,1 +52,2,150393,0,13,1,8,1,0,0,0,0,40,0,1 +47,2,99911,14,8,3,1,0,0,1,0,0,55,0,0 +57,4,343447,1,9,2,11,0,0,1,0,0,40,0,0 +64,2,169482,5,10,3,1,4,0,1,0,0,40,0,0 +53,2,194501,2,7,6,4,3,0,1,0,0,47,0,0 +53,2,177705,0,13,1,10,1,0,0,0,0,44,0,1 +31,2,123983,5,10,4,5,4,2,0,0,0,40,27,0 +41,2,138975,0,13,1,1,1,0,0,7688,0,45,0,1 +45,4,235431,1,9,4,4,4,1,1,0,0,40,0,0 +45,0,130206,1,9,2,0,5,0,1,0,0,40,0,0 +23,2,210053,5,10,0,4,0,0,1,0,0,28,0,0 +39,4,249392,3,14,1,3,1,0,0,0,0,72,0,0 +31,2,87418,9,11,1,1,1,0,0,0,0,40,0,0 +35,1,190387,0,13,1,7,1,0,0,0,0,45,0,0 +54,2,176240,3,14,1,6,1,0,0,7688,0,60,0,1 +40,4,105862,0,13,2,3,4,0,1,5455,0,40,0,0 +55,1,185195,0,13,1,1,1,0,0,0,0,40,0,1 +31,2,173495,1,9,1,10,1,0,0,0,0,40,0,0 +58,5,78634,2,7,1,6,1,0,0,0,0,60,0,0 +31,2,147284,8,16,1,3,1,0,0,0,1977,99,0,1 +46,1,82572,1,9,6,4,5,0,1,0,0,40,0,0 +38,2,154641,9,11,1,10,1,0,0,0,0,40,0,0 +22,4,39236,5,10,0,3,3,0,1,594,0,25,0,0 +48,1,179337,1,9,1,10,1,0,0,0,0,60,7,0 +73,2,173047,0,13,1,3,1,0,0,0,0,15,0,0 +25,2,264012,0,13,1,0,1,0,0,0,0,45,0,1 +53,3,227836,5,10,2,7,0,0,0,0,0,40,0,0 +46,2,321327,5,10,1,6,1,0,0,7298,0,45,0,1 +37,2,146398,0,13,0,3,0,1,1,0,0,40,0,0 +30,2,324120,1,9,1,2,1,0,0,0,0,50,0,0 +29,2,367329,1,9,1,8,1,0,0,0,0,40,0,0 +29,0,301582,5,10,1,11,1,0,0,0,0,40,0,0 +58,2,170108,3,14,1,1,1,0,0,0,0,40,0,1 +42,1,82297,7,4,1,4,2,1,1,0,0,50,0,0 +62,4,180162,4,5,2,11,0,1,0,0,0,24,0,0 +45,4,348172,0,13,1,7,1,2,0,7298,0,40,0,1 +38,2,809585,0,13,1,5,1,0,0,0,0,40,0,1 +36,1,67728,0,13,1,5,1,0,0,0,0,50,0,1 +42,1,102069,7,4,1,5,1,0,0,0,0,30,0,0 +47,4,149700,3,14,1,3,1,0,0,15024,0,35,0,1 +42,1,109273,5,10,0,10,4,0,0,0,0,40,0,0 +43,2,393354,5,10,1,0,2,1,1,0,0,38,0,1 +37,2,226947,9,11,1,10,1,0,0,0,0,40,0,1 +36,0,86805,5,10,1,1,2,0,1,7298,0,39,0,1 +27,2,493689,0,13,0,9,0,1,1,0,0,40,23,0 +54,2,299324,11,3,3,8,4,0,0,0,0,40,4,0 +48,1,353012,1,9,1,10,1,0,0,0,1902,40,0,1 +29,2,174419,1,9,0,4,4,0,1,0,0,30,0,0 +29,2,209472,1,9,1,8,1,0,0,0,0,38,0,0 +37,2,295127,5,10,2,4,0,0,0,0,0,47,0,0 +55,5,182273,5,10,1,5,1,0,0,0,0,40,0,0 +67,2,228200,1,9,1,13,2,1,1,0,0,20,0,0 +51,2,263836,1,9,6,2,0,0,0,0,0,30,0,0 +35,2,178948,3,14,0,3,4,0,1,0,0,32,0,0 +64,1,253296,1,9,6,4,5,0,1,0,0,40,0,0 +23,2,240137,11,3,0,2,0,0,0,0,0,55,4,0 +49,2,24712,0,13,0,4,0,2,1,0,0,35,11,0 +38,1,342635,0,13,1,3,1,0,0,0,0,70,0,0 +62,2,115387,1,9,0,2,5,1,1,0,0,40,0,0 +62,1,182998,7,4,1,10,1,0,0,0,0,10,0,0 +45,1,246891,3,14,2,10,0,0,0,0,0,40,0,0 +20,2,30035,6,12,0,5,3,0,1,0,0,40,0,0 +38,2,175232,1,9,1,8,1,0,0,0,0,48,0,0 +50,5,140516,0,13,1,0,1,0,0,0,0,40,0,0 +40,2,64980,5,10,1,0,1,1,0,0,0,55,0,1 +30,2,155781,1,9,1,10,1,0,0,0,0,70,0,0 +52,3,192065,5,10,4,1,0,0,1,0,0,40,0,0 +28,1,227890,0,13,0,3,0,1,0,0,0,50,0,1 +62,1,162249,1,9,1,6,1,0,0,0,0,30,0,0 +31,2,165949,1,9,2,4,4,0,1,0,0,40,0,0 +40,2,445382,1,9,1,1,1,0,0,0,0,40,0,1 +34,2,211948,1,9,2,5,0,0,1,0,1590,40,0,0 +53,2,163678,5,10,1,5,1,0,0,0,0,40,0,1 +42,2,89413,14,8,0,7,3,0,0,0,0,40,0,0 +26,2,289700,5,10,1,4,1,0,0,0,0,25,0,0 +51,2,163826,1,9,1,6,1,0,0,0,0,40,0,1 +49,2,185385,3,14,1,3,1,0,0,0,0,50,0,1 +43,2,169031,1,9,1,8,1,0,0,0,0,40,0,0 +42,2,54611,5,10,2,7,0,0,0,0,0,40,0,0 +31,2,130620,2,7,3,5,3,2,1,0,0,40,3,0 +26,2,328663,1,9,1,6,1,4,0,0,0,40,0,0 +50,2,169646,0,13,4,3,4,2,1,0,0,40,11,0 +35,2,186815,1,9,1,8,1,0,0,0,0,40,0,0 +37,2,103925,5,10,0,9,5,0,1,0,0,40,0,0 +20,2,82777,5,10,0,5,3,0,0,0,0,16,0,0 +31,4,178449,10,15,1,3,1,0,0,0,0,40,0,1 +28,2,51672,1,9,0,10,0,0,0,0,0,35,0,0 +46,2,380162,1,9,1,9,1,1,0,0,0,40,0,1 +21,2,212114,5,10,0,3,3,0,1,0,0,8,0,0 +41,1,100800,3,14,1,1,1,0,0,7298,0,70,0,1 +30,2,162572,0,13,0,1,0,0,0,0,0,70,0,1 +66,5,179951,0,13,1,1,1,0,0,0,0,70,0,0 +37,5,190759,5,10,1,5,1,0,0,0,0,60,0,1 +74,0,236012,7,4,6,2,0,0,1,0,0,20,0,0 +46,0,164023,5,10,1,11,1,1,0,0,0,70,0,1 +51,2,172046,3,14,1,1,1,0,0,0,1977,50,0,1 +33,2,182926,0,13,1,1,1,0,0,15024,0,50,0,1 +30,2,151001,11,3,1,8,1,0,0,3464,0,40,4,0 +47,5,362835,0,13,1,1,1,0,0,0,0,50,0,1 +49,2,97883,0,13,2,1,4,0,1,0,0,40,0,0 +53,2,91911,1,9,2,10,4,1,1,0,0,48,0,0 +24,2,278130,9,11,0,8,0,0,0,0,0,40,0,0 +54,2,146310,1,9,1,6,1,0,0,0,0,50,0,0 +32,2,379412,5,10,0,10,3,0,0,0,0,40,0,0 +45,2,37987,5,10,1,5,1,0,0,0,0,45,0,0 +46,5,256909,1,9,3,7,0,0,0,3325,0,45,0,0 +37,0,482927,5,10,2,4,0,0,0,0,0,65,0,0 +48,0,44434,3,14,1,3,1,0,0,0,0,61,0,1 +25,2,255474,0,13,0,0,0,0,1,0,0,40,0,0 +27,2,341504,5,10,0,0,4,0,1,0,0,40,0,0 +69,2,197080,1,9,6,0,4,0,0,0,0,8,0,0 +38,2,102945,0,13,1,5,1,0,0,0,0,52,0,1 +47,2,503454,14,8,0,0,5,1,1,0,0,40,0,0 +30,1,87561,5,10,0,0,0,0,1,0,0,60,0,0 +46,2,270693,1,9,0,2,3,0,0,3674,0,30,0,0 +27,2,252813,10,15,0,3,0,0,1,0,0,45,0,0 +19,2,574271,5,10,0,5,3,0,0,0,0,35,0,0 +18,2,184016,1,9,1,13,0,0,1,3103,0,40,0,0 +24,2,235071,2,7,1,10,1,0,0,0,0,50,0,1 +32,2,158242,0,13,0,3,0,0,1,0,0,40,0,0 +38,2,299810,1,9,1,2,1,1,0,0,0,40,0,0 +19,2,277695,13,1,0,7,0,0,0,0,0,36,37,0 +28,2,23324,5,10,0,2,0,0,0,0,0,40,0,0 +39,4,316582,3,14,0,3,0,0,1,0,0,55,0,0 +38,1,176657,5,10,4,5,0,2,0,0,0,60,28,0 +42,2,93770,1,9,1,8,2,0,1,0,0,40,0,1 +31,2,124569,5,10,1,0,2,0,1,0,0,40,0,1 +46,2,117313,4,5,4,8,0,0,1,0,0,40,38,0 +53,2,53812,5,10,6,1,0,0,1,0,0,54,0,0 +21,2,170456,6,12,0,2,3,0,0,0,0,15,0,0 +48,1,115971,1,9,1,5,1,0,0,0,0,50,0,0 +46,2,31432,1,9,1,0,2,0,1,3103,0,52,0,1 +30,2,112383,1,9,1,6,1,0,0,0,0,45,0,0 +24,2,283092,1,9,0,0,5,1,0,0,0,40,2,0 +32,2,27207,12,6,0,10,0,0,0,0,0,50,0,0 +30,2,46712,1,9,2,4,0,0,1,0,0,40,0,0 +57,0,19520,8,16,2,3,4,0,1,0,0,50,0,0 +56,2,98630,7,4,0,0,0,0,0,0,0,40,0,0 +27,2,159897,1,9,0,1,0,1,1,0,0,37,0,0 +38,2,136629,0,13,1,8,1,0,0,0,0,40,10,0 +19,2,407759,1,9,0,0,3,0,0,0,0,40,0,0 +61,1,221884,5,10,1,0,1,0,0,0,0,50,0,1 +49,2,148475,9,11,2,9,4,0,1,0,0,40,0,0 +28,2,274964,1,9,1,10,1,0,0,0,0,38,0,0 +50,5,160107,3,14,1,3,1,0,0,0,0,55,0,1 +43,2,167265,0,13,1,10,1,0,0,0,0,84,0,1 +34,2,148226,1,9,0,8,4,1,1,0,0,48,0,0 +28,2,153869,2,7,1,10,1,0,0,0,0,40,0,0 +31,2,208881,5,10,1,10,1,0,0,0,0,40,0,0 +55,2,256953,1,9,6,8,4,1,1,0,0,44,0,0 +26,2,100147,0,13,1,1,2,0,1,0,0,45,0,1 +51,4,166461,8,16,1,3,2,1,1,0,0,40,0,1 +35,2,171327,1,9,1,10,1,0,0,0,0,40,0,0 +42,2,297335,6,12,3,1,4,2,1,0,0,31,17,0 +31,2,169589,3,14,0,3,0,0,0,0,0,30,0,0 +22,4,273734,1,9,0,7,3,0,0,0,0,20,0,0 +67,2,158301,1,9,2,6,0,0,0,0,0,60,0,0 +63,2,196725,1,9,6,4,4,0,1,0,0,24,0,0 +31,2,137444,1,9,1,8,1,0,0,0,0,40,0,1 +17,2,286960,2,7,0,3,3,0,0,0,0,40,0,0 +41,4,201435,1,9,1,6,1,1,0,0,0,40,0,0 +53,4,216931,7,4,1,6,1,0,0,0,0,38,0,0 +44,4,212665,5,10,1,11,1,1,0,0,0,99,0,0 +24,2,462820,0,13,0,7,0,0,0,0,0,40,0,0 +35,2,198841,9,11,2,9,3,0,0,0,0,35,0,0 +61,2,219886,5,10,1,9,2,0,1,0,0,40,0,1 +31,2,163003,6,12,0,3,5,2,1,0,0,40,11,0 +44,2,112262,0,13,1,9,1,0,0,5178,0,40,0,1 +56,2,213105,1,9,1,5,1,0,0,0,0,36,0,1 +66,2,302072,6,12,2,0,4,0,1,0,0,40,0,0 +45,2,338105,5,10,1,10,1,2,0,0,0,40,36,0 +69,1,58213,0,13,1,3,1,0,0,20051,0,45,0,1 +64,2,125684,1,9,1,10,1,0,0,0,0,40,0,0 +38,2,215419,1,9,1,0,2,0,1,0,0,36,0,1 +43,4,413760,5,10,4,10,0,1,0,0,0,40,0,0 +37,2,205339,1,9,2,10,0,0,0,0,0,49,0,0 +19,2,236570,1,9,0,0,3,0,1,0,0,16,0,0 +59,1,247552,1,9,1,1,1,0,0,0,0,40,0,0 +50,3,184007,5,10,1,0,1,0,0,0,0,40,0,0 +33,2,341187,0,13,1,1,1,0,0,0,0,50,0,1 +56,2,220187,5,10,1,9,1,0,0,0,0,45,0,1 +28,2,198258,9,11,1,5,1,0,0,0,0,40,0,0 +27,2,175821,1,9,1,0,2,0,1,0,0,34,0,0 +34,2,261418,1,9,1,4,1,0,0,0,0,40,0,0 +19,2,203319,2,7,0,5,3,0,0,0,0,30,0,0 +68,1,166083,1,9,1,1,1,0,0,0,0,40,0,1 +28,2,109001,3,14,1,3,1,0,0,0,0,38,0,1 +22,1,197387,1,9,0,7,3,0,0,0,0,40,0,0 +58,2,284834,6,12,2,0,0,0,1,0,0,40,0,0 +31,2,87535,5,10,0,8,0,0,1,0,0,25,0,0 +17,4,175587,2,7,0,11,3,0,0,0,0,30,0,0 +25,2,242700,5,10,0,6,0,0,0,10520,0,50,0,1 +23,2,161478,5,10,0,4,3,2,1,0,0,23,0,0 +25,2,51498,14,8,0,4,5,0,0,0,0,40,0,0 +47,2,220124,1,9,0,10,0,0,0,0,0,40,0,0 +39,2,188503,0,13,1,1,2,0,1,0,0,60,0,1 +44,2,113324,1,9,1,10,1,0,0,0,0,40,0,0 +46,2,208872,9,11,1,3,1,0,0,0,0,40,0,1 +38,1,34180,5,10,1,7,1,0,0,0,0,35,0,0 +23,2,292023,1,9,0,8,3,0,0,0,0,30,0,0 +34,2,141118,0,13,3,3,0,0,1,0,0,35,0,0 +33,2,348592,1,9,0,10,0,0,0,0,0,40,0,1 +38,2,185203,1,9,6,4,4,0,1,0,0,20,0,0 +52,1,165278,9,11,1,1,1,0,0,0,0,40,0,0 +50,2,116933,1,9,2,5,0,0,1,0,0,33,0,0 +38,2,237608,0,13,0,5,0,0,1,0,2444,45,0,1 +35,2,84787,0,13,1,4,1,0,0,0,0,40,0,0 +67,1,217892,8,16,1,3,1,0,0,10605,0,35,0,1 +60,2,325971,1,9,1,8,1,0,0,7688,0,40,0,1 +44,2,206878,1,9,0,5,5,0,1,0,0,15,0,0 +38,1,127772,1,9,2,7,3,0,0,0,0,50,0,0 +29,2,208577,1,9,1,3,1,0,0,0,0,40,0,1 +65,2,344152,3,14,1,3,1,0,0,5556,0,50,0,1 +33,2,40681,6,12,0,0,0,0,1,0,0,40,0,0 +18,2,280603,2,7,0,5,3,0,1,0,0,30,0,0 +43,2,188436,10,15,2,1,0,0,0,0,0,40,0,0 +42,2,134220,9,11,2,1,3,3,1,0,0,40,0,0 +42,2,177989,1,9,1,6,1,0,0,0,0,40,0,0 +32,2,164190,1,9,1,2,1,0,0,0,0,30,0,0 +36,2,90897,6,12,0,9,0,0,1,0,0,40,0,0 +41,0,33126,0,13,1,7,1,0,0,0,0,40,0,1 +30,2,270886,5,10,0,4,3,0,1,0,0,40,0,0 +21,2,216129,1,9,0,4,3,0,0,0,0,35,0,0 +33,2,189368,5,10,1,6,1,1,0,0,0,40,0,1 +19,2,306225,1,9,0,2,3,0,0,0,0,25,0,0 +35,2,330664,1,9,2,6,0,0,0,0,0,40,0,0 +43,2,191765,1,9,2,9,4,1,1,0,0,35,0,0 +45,2,289353,1,9,1,6,1,1,0,0,0,24,0,0 +25,2,53147,0,13,0,1,3,1,0,0,0,50,0,0 +39,1,122353,0,13,1,1,1,0,0,0,0,40,0,0 +26,2,188767,1,9,0,2,0,0,0,0,0,40,0,0 +60,2,239576,3,14,1,6,1,0,0,0,0,10,0,0 +52,4,155141,8,16,1,3,2,0,1,0,0,40,0,1 +22,2,64520,14,8,0,6,4,0,0,0,0,30,0,0 +23,2,478994,5,10,0,4,3,0,1,0,0,40,0,0 +46,2,155654,1,9,1,4,2,0,1,0,0,40,0,0 +34,1,124052,0,13,1,5,1,0,0,0,0,30,0,0 +39,2,245053,0,13,1,3,1,0,0,0,0,50,0,1 +38,2,183585,1,9,0,3,0,0,1,0,0,40,0,0 +56,1,323639,3,14,1,1,1,0,0,0,0,25,0,0 +55,3,186791,1,9,2,0,0,0,1,0,0,40,0,0 +40,2,284303,5,10,1,1,2,0,1,7688,0,40,0,1 +23,2,186666,5,10,0,8,0,0,0,0,0,40,0,0 +39,2,200153,0,13,2,0,0,0,0,0,0,40,0,0 +24,2,180931,0,13,1,5,1,1,0,0,0,30,0,0 +51,1,183173,1,9,1,5,1,0,0,0,0,40,0,1 +47,5,120131,0,13,1,1,1,0,0,0,0,50,1,1 +25,1,263300,1,9,0,7,0,0,0,0,0,50,0,0 +34,2,226443,10,15,1,3,1,0,0,0,0,55,0,1 +18,2,404868,2,7,0,5,3,1,1,0,1602,20,0,0 +19,2,208506,5,10,0,1,3,0,1,0,0,28,0,0 +32,2,46746,5,10,2,10,4,0,0,0,0,40,0,0 +49,2,246183,1,9,1,5,1,0,0,0,0,40,0,1 +43,2,122749,1,9,1,10,1,0,0,0,0,55,0,0 +71,5,38822,3,14,1,1,1,0,0,99999,0,40,0,1 +59,2,167963,1,9,0,0,4,0,0,0,0,40,0,0 +32,2,273241,0,13,1,1,2,0,1,0,0,40,0,1 +25,2,120238,0,13,0,1,0,0,0,0,0,40,0,0 +32,2,167990,1,9,1,1,1,0,0,0,0,40,38,0 +17,2,225507,2,7,0,2,0,1,1,0,0,15,0,0 +57,5,125000,10,15,1,3,1,0,0,0,0,35,0,1 +17,1,174120,14,8,0,2,3,0,0,0,0,15,0,0 +27,2,230959,0,13,0,9,3,2,1,0,0,40,11,0 +41,4,132125,1,9,1,11,1,0,0,0,0,40,0,0 +19,2,227178,2,7,0,5,0,0,1,0,0,25,0,0 +41,2,165798,11,3,2,4,4,0,1,0,0,40,5,0 +39,2,129573,0,13,0,1,0,0,0,0,0,50,0,1 +30,2,224377,1,9,0,10,0,0,0,0,0,40,0,0 +37,2,179481,0,13,1,8,1,0,0,0,0,40,0,1 +18,2,434268,2,7,0,0,3,0,1,0,0,15,0,0 +40,1,173716,0,13,1,5,1,0,0,0,0,45,0,1 +38,5,244803,5,10,1,5,1,0,0,0,1485,60,1,1 +24,2,114230,1,9,0,5,5,0,0,0,0,40,0,0 +33,2,188661,1,9,1,10,1,0,0,0,0,50,0,0 +48,2,216093,0,13,1,2,1,0,0,0,0,40,0,0 +51,2,124963,0,13,1,5,1,0,0,0,0,40,0,1 +48,2,85341,1,9,1,10,1,0,0,0,0,40,0,0 +43,2,193490,7,4,1,10,1,0,0,0,0,45,0,0 +34,2,80058,10,15,0,1,3,0,0,0,0,50,0,0 +41,2,139907,9,11,4,10,0,0,0,0,0,30,0,0 +51,5,54342,10,15,2,3,0,0,0,27828,0,60,0,1 +25,2,188767,1,9,0,10,3,0,0,0,0,40,0,0 +20,2,117222,1,9,0,4,3,0,0,0,0,50,0,0 +61,5,171831,1,9,1,1,1,0,0,2829,0,45,0,0 +35,2,187119,5,10,2,1,0,0,1,0,0,70,0,0 +42,4,97277,3,14,2,3,4,0,1,0,0,40,0,0 +26,4,219760,1,9,0,4,5,0,0,0,0,16,0,0 +46,2,63299,1,9,1,4,1,0,0,0,0,50,0,0 +39,0,171482,0,13,0,3,0,0,0,0,0,40,0,1 +29,2,210869,5,10,0,5,3,1,0,0,0,80,0,0 +39,2,38312,5,10,3,10,4,0,0,0,0,40,0,1 +47,2,119939,1,9,1,10,1,0,0,0,0,40,0,1 +40,2,83953,5,10,1,6,1,0,0,0,0,50,0,1 +43,0,101383,1,9,1,10,1,0,0,0,0,40,0,1 +32,2,204374,1,9,2,2,0,0,0,0,0,40,0,0 +31,2,176831,12,6,2,5,5,0,1,0,0,40,0,0 +44,3,251305,6,12,1,0,1,0,0,0,0,40,0,1 +46,4,200947,0,13,1,11,1,0,0,0,0,40,0,1 +53,1,46704,3,14,1,3,1,0,0,0,0,50,0,1 +43,2,119721,0,13,1,1,1,0,0,0,0,40,0,0 +41,0,58930,0,13,0,3,0,0,1,0,0,40,0,0 +35,2,247750,1,9,6,4,4,1,0,0,0,40,0,0 +48,2,67725,0,13,1,5,1,0,0,0,0,45,0,0 +28,0,200775,3,14,1,1,2,0,1,0,0,40,0,0 +44,2,183542,0,13,6,3,4,0,1,0,0,32,0,0 +51,4,123325,10,15,6,3,0,0,1,0,0,40,0,0 +28,2,269786,1,9,0,6,4,0,0,0,0,50,0,0 +36,2,51089,0,13,0,10,0,0,0,0,0,60,0,0 +28,2,136985,1,9,1,4,1,0,0,0,0,35,0,0 +21,2,129350,5,10,0,5,3,0,0,0,0,40,0,0 +36,4,61299,5,10,1,10,1,0,0,0,0,40,0,0 +31,2,257644,1,9,0,3,0,0,0,0,0,43,0,0 +44,1,70884,1,9,1,7,1,0,0,0,0,60,0,0 +49,4,159726,2,7,2,2,4,0,0,0,0,40,0,0 +40,2,174395,1,9,1,10,1,0,0,0,0,40,0,0 +64,3,175534,8,16,1,3,1,2,0,0,0,40,26,1 +54,4,173050,3,14,1,3,1,0,0,7688,0,40,0,1 +27,2,32519,5,10,1,5,1,2,0,0,0,55,27,0 +18,2,322999,5,10,0,4,3,0,1,0,0,20,0,0 +68,2,148874,4,5,1,10,1,1,0,0,0,44,0,0 +64,2,43738,8,16,6,3,0,0,0,0,0,80,0,1 +36,2,195385,1,9,1,6,1,3,0,0,0,40,0,0 +21,2,149809,1,9,0,7,3,0,0,0,0,24,0,0 +22,2,51985,5,10,0,10,3,0,0,0,0,30,0,0 +61,2,105384,0,13,1,3,1,0,0,0,0,40,0,0 +24,2,137591,5,10,0,5,3,0,0,0,0,10,34,0 +49,0,324791,0,13,1,3,1,0,0,0,0,50,0,1 +25,2,184303,5,10,4,13,5,0,1,0,0,30,22,0 +29,2,274010,5,10,0,3,0,0,0,0,0,45,0,0 +22,2,321031,1,9,0,5,3,1,1,0,0,40,0,0 +57,3,313929,5,10,1,3,1,3,0,0,0,40,0,0 +41,2,394669,0,13,0,3,0,0,1,0,1741,40,0,0 +29,2,152951,1,9,1,10,1,0,0,0,0,40,0,1 +20,2,247115,5,10,0,0,4,1,1,0,0,35,0,0 +47,2,175958,10,15,1,5,1,0,0,0,0,45,0,1 +22,2,109039,1,9,0,1,0,0,1,0,0,55,0,0 +59,5,141326,9,11,2,3,0,0,0,0,0,50,0,1 +42,0,74334,3,14,1,0,1,3,0,0,0,40,0,1 +64,1,47462,5,10,0,3,0,0,1,0,0,35,0,0 +29,3,182344,1,9,3,4,4,1,0,0,0,40,0,0 +25,0,295912,5,10,0,10,0,0,0,0,0,20,0,0 +62,2,311495,5,10,2,1,0,0,1,0,0,40,0,0 +44,2,236746,3,14,2,1,0,0,0,10520,0,45,0,1 +21,2,187643,1,9,4,4,0,0,1,0,0,40,0,0 +60,2,282923,5,10,1,3,1,0,0,7298,0,40,0,1 +46,2,501671,12,6,2,8,4,1,0,0,0,40,0,0 +44,3,29591,0,13,2,9,0,0,0,0,2258,40,0,1 +21,2,301556,1,9,0,4,3,0,1,0,0,19,0,0 +18,2,187240,2,7,0,2,3,0,0,0,0,18,0,0 +39,2,219483,0,13,1,3,2,0,1,5013,0,32,0,0 +33,2,594187,3,14,1,3,1,0,0,0,0,45,0,1 +63,2,200474,15,2,2,6,0,0,0,0,0,40,0,0 +52,4,152795,1,9,1,11,1,0,0,0,0,52,0,1 +17,2,230789,4,5,0,5,3,1,0,0,0,22,0,0 +45,5,311231,10,15,1,3,1,0,0,0,1485,50,0,1 +31,2,114691,1,9,0,5,3,0,0,0,0,40,0,0 +35,2,194591,5,10,1,9,1,0,0,0,0,40,0,0 +31,2,114691,1,9,1,8,1,0,0,0,0,40,0,1 +51,0,42017,5,10,2,3,0,0,1,0,0,40,0,0 +48,4,383384,1,9,1,10,1,0,0,0,0,60,0,0 +28,2,29444,1,9,1,2,1,3,0,0,0,40,0,0 +38,2,277022,5,10,2,0,4,0,1,0,0,40,13,0 +43,4,113324,0,13,1,3,1,0,0,0,0,40,0,1 +30,2,342709,1,9,1,2,1,0,0,0,0,40,0,0 +24,2,179203,14,8,0,5,5,0,0,0,0,55,0,0 +46,2,251474,0,13,1,1,1,0,0,0,0,60,0,1 +50,2,93730,12,6,1,6,1,0,0,0,0,60,0,0 +22,2,37894,1,9,4,4,5,0,0,0,0,35,0,0 +18,0,272918,1,9,0,0,3,1,0,0,0,15,0,0 +53,2,151411,0,13,1,3,1,0,0,0,0,45,0,1 +40,2,210648,0,13,1,3,1,0,0,0,0,44,0,1 +36,1,347491,8,16,1,3,1,0,0,0,0,35,0,0 +32,2,255885,0,13,1,1,1,0,0,0,0,43,0,1 +39,2,356838,1,9,0,7,3,0,0,0,0,12,0,0 +46,2,216164,1,9,1,2,1,0,0,0,0,40,0,0 +26,4,288781,0,13,0,0,0,0,0,0,0,42,0,0 +19,2,439779,5,10,0,5,3,0,0,0,0,15,0,0 +24,2,161638,1,9,1,8,0,0,1,0,0,40,16,0 +28,2,190525,3,14,0,3,3,0,0,0,0,40,0,0 +25,4,276249,3,14,0,3,3,0,1,0,0,40,0,0 +44,2,147265,5,10,1,1,1,0,0,0,0,40,0,1 +38,2,245090,1,9,1,10,1,0,0,0,0,40,35,0 +42,0,219682,3,14,2,1,0,0,0,0,0,45,0,0 +28,2,392100,1,9,1,10,3,0,0,0,0,40,0,0 +47,2,262244,0,13,0,5,0,1,0,0,0,60,0,1 +46,2,171228,1,9,1,8,1,0,0,3411,0,35,24,0 +21,4,218445,5,10,0,0,3,0,1,0,0,40,4,0 +35,2,509462,0,13,0,1,0,0,1,0,0,45,0,0 +26,2,213258,1,9,1,10,1,0,0,0,0,40,0,0 +21,2,118401,5,10,0,4,0,0,1,0,0,30,0,0 +67,1,45814,7,4,1,7,1,0,0,0,0,40,0,0 +54,2,329733,1,9,0,1,4,0,0,0,0,40,0,1 +26,2,29957,3,14,0,9,5,0,0,0,0,25,0,0 +51,2,215854,0,13,2,3,0,0,1,0,0,50,0,0 +27,2,327766,5,10,2,10,0,0,0,0,0,45,0,0 +39,2,80680,5,10,2,8,3,0,1,0,0,40,0,0 +32,2,177792,0,13,2,1,0,0,1,0,0,48,0,1 +52,2,273514,1,9,4,10,0,0,0,0,0,40,0,0 +21,2,202373,5,10,1,2,1,1,0,0,0,40,0,0 +27,4,332785,1,9,0,11,3,0,0,0,0,38,0,0 +46,2,149640,7,4,3,6,0,0,0,0,0,45,0,0 +42,2,40151,9,11,1,4,1,0,0,0,0,30,0,0 +79,5,183686,0,13,1,5,1,0,0,0,0,20,0,1 +50,3,32801,0,13,1,1,2,3,1,0,0,40,0,1 +43,3,134026,5,10,0,0,5,0,0,2174,0,40,0,0 +51,4,96678,3,14,1,3,1,0,0,0,0,60,0,0 +45,2,174533,5,10,1,6,1,0,0,7298,0,50,0,1 +65,2,180807,1,9,4,11,0,0,0,991,0,20,0,0 +66,2,186324,0,13,1,5,1,0,0,0,0,5,0,1 +36,1,257250,9,11,1,7,1,0,0,0,0,99,0,0 +26,2,212800,6,12,0,3,3,0,1,0,0,36,0,0 +28,2,55360,5,10,0,5,0,1,0,0,0,50,0,0 +39,1,195253,10,15,1,3,1,0,0,0,0,45,0,1 +43,2,45156,5,10,1,6,1,0,0,0,0,60,0,0 +20,2,435469,1,9,0,4,3,0,1,0,0,40,4,0 +29,2,231287,5,10,2,9,4,0,0,0,0,40,0,0 +32,2,168854,0,13,1,5,1,0,0,0,1848,50,0,1 +44,1,185057,0,13,2,1,0,0,1,3325,0,40,0,0 +60,2,165517,5,10,1,2,1,0,0,0,0,40,0,0 +34,2,73161,1,9,1,5,1,0,0,0,0,40,0,1 +60,2,178792,1,9,6,2,0,0,1,0,0,40,0,0 +38,2,32897,2,7,2,5,4,0,1,0,0,40,0,0 +29,2,250967,9,11,1,8,1,0,0,0,0,40,0,0 +41,2,41901,5,10,0,10,0,0,0,0,1408,40,0,0 +49,2,379779,0,13,2,1,0,0,1,0,0,40,0,0 +37,2,217838,11,3,4,4,4,0,1,0,0,40,4,0 +37,1,137527,8,16,0,3,0,0,1,0,2559,60,0,1 +43,2,198965,5,10,1,5,1,0,0,0,0,38,0,1 +41,2,70645,3,14,6,3,0,0,1,4650,0,55,0,0 +19,2,175081,4,5,0,10,5,0,0,0,0,60,0,0 +29,2,180299,5,10,1,6,1,0,0,0,0,35,0,0 +40,1,548664,1,9,1,10,1,0,0,0,0,15,0,0 +53,2,278114,7,4,1,1,1,0,0,0,0,40,0,1 +27,2,394927,0,13,1,5,1,0,0,0,0,55,0,0 +44,1,127482,1,9,1,10,1,0,0,7298,0,50,7,1 +29,2,236938,6,12,2,10,4,0,1,0,0,38,0,0 +25,2,232991,11,3,1,8,1,4,0,0,0,40,4,0 +38,2,34378,1,9,1,5,1,0,0,0,0,55,0,0 +48,5,81513,0,13,1,1,1,0,0,0,0,50,0,1 +18,2,106780,5,10,0,4,3,0,1,0,0,12,0,0 +50,2,178596,1,9,2,10,4,0,0,0,1408,50,0,0 +37,2,329026,1,9,1,0,2,0,1,0,0,40,0,1 +48,2,26490,0,13,6,4,4,0,1,0,0,20,0,0 +50,2,338033,5,10,0,4,0,0,0,0,0,32,0,0 +24,2,21154,5,10,0,0,3,0,1,0,0,30,0,0 +34,2,209449,5,10,1,9,1,1,0,0,0,40,0,1 +19,2,389143,5,10,0,5,3,0,0,0,0,40,0,0 +39,2,101260,1,9,0,8,3,0,0,0,0,40,0,0 +40,2,198270,5,10,2,4,0,0,1,0,0,40,0,0 +30,2,45781,1,9,0,0,4,0,1,0,0,40,0,0 +27,2,134566,1,9,0,0,0,0,0,0,0,40,0,0 +46,2,422813,5,10,1,0,1,0,0,0,0,40,0,1 +24,4,103277,0,13,0,3,3,0,1,0,0,50,0,0 +18,2,201871,14,8,0,4,3,0,0,0,0,20,0,0 +50,1,167728,8,16,1,3,1,0,0,0,0,60,0,1 +42,2,211517,2,7,1,8,1,0,0,0,0,40,0,0 +42,2,118212,4,5,1,6,1,0,0,0,0,40,0,0 +37,2,259846,9,11,1,0,1,0,0,3471,0,40,0,0 +57,2,98926,5,10,6,9,0,0,1,0,0,16,0,0 +27,2,207352,0,13,1,9,1,2,0,0,0,40,3,1 +31,2,206609,12,6,1,8,1,0,0,0,0,40,0,0 +34,4,104509,3,14,4,3,4,0,1,0,0,40,0,0 +55,1,170350,1,9,2,4,5,0,1,0,0,40,0,0 +56,2,183884,2,7,1,8,1,0,0,0,0,40,0,0 +36,0,110964,0,13,1,3,2,0,1,0,1672,38,0,0 +35,0,154410,5,10,0,7,3,0,0,0,0,40,0,0 +28,2,274679,3,14,0,3,0,0,0,0,0,50,0,0 +38,2,252662,0,13,2,1,0,0,0,0,0,40,0,0 +30,5,356689,1,9,1,2,1,0,0,0,0,60,0,0 +18,2,205218,5,10,0,4,3,0,1,0,0,20,0,0 +35,2,241306,9,11,1,9,1,0,0,0,0,40,0,1 +53,2,139127,1,9,2,4,0,0,1,0,0,40,0,0 +46,2,175625,10,15,2,3,4,0,1,0,0,40,0,0 +45,2,206459,5,10,1,0,1,0,0,0,0,40,0,0 +35,2,176123,12,6,1,4,1,2,0,0,0,60,3,0 +41,2,111483,1,9,0,0,3,0,0,0,0,40,0,0 +60,1,106118,1,9,1,5,1,0,0,0,0,70,0,1 +18,2,77845,5,10,0,0,3,0,0,0,1602,15,0,0 +19,2,162094,1,9,0,8,3,0,0,0,0,40,0,0 +24,2,216469,1,9,1,8,1,0,0,0,1579,50,0,0 +56,4,381965,0,13,1,3,1,0,0,15024,0,40,0,1 +28,2,145284,1,9,2,6,0,0,0,0,0,70,0,0 +29,2,242482,1,9,0,4,0,0,0,0,0,32,0,0 +35,1,160192,5,10,0,10,3,0,0,0,0,40,0,0 +18,2,156950,1,9,0,0,3,0,0,0,0,35,0,0 +53,2,215572,1,9,0,10,0,0,0,0,0,40,0,0 +26,2,173593,3,14,1,8,1,0,0,0,0,20,8,0 +55,2,193374,5,10,1,9,1,0,0,0,0,40,0,1 +45,4,334039,5,10,1,1,1,0,0,0,0,40,0,1 +28,2,337664,1,9,0,8,3,0,0,0,0,40,0,0 +32,2,113504,0,13,1,1,1,0,0,0,0,40,0,1 +27,2,177072,1,9,0,2,3,0,0,0,0,40,0,0 +35,2,174503,1,9,2,10,0,0,1,0,0,40,0,0 +36,2,214807,1,9,2,2,4,0,1,0,0,37,0,0 +41,2,222596,0,13,1,5,1,0,0,15024,0,45,0,1 +23,2,100345,0,13,0,5,3,0,0,0,0,20,0,0 +22,2,409230,14,8,0,6,5,0,0,0,0,40,0,0 +36,1,112497,10,15,2,3,4,0,0,25236,0,40,0,1 +65,5,115922,0,13,1,1,1,0,0,0,0,40,0,1 +25,2,243560,1,9,0,5,3,0,1,0,0,40,13,0 +33,4,182971,5,10,1,11,1,0,0,0,1887,40,0,1 +31,2,127215,5,10,1,5,1,0,0,0,0,40,0,0 +50,0,276241,0,13,1,1,1,0,0,0,0,40,0,1 +49,0,175109,5,10,1,3,1,0,0,0,0,50,0,1 +43,2,498079,0,13,2,1,4,0,1,0,0,40,0,0 +23,3,344394,5,10,1,0,5,0,1,0,0,40,0,0 +34,2,99872,3,14,1,1,1,2,0,3103,0,40,3,1 +23,2,245302,5,10,2,5,3,1,1,0,0,40,0,0 +63,2,43313,12,6,1,10,1,0,0,0,0,40,0,0 +33,2,188467,1,9,0,7,0,0,0,0,0,40,0,0 +51,5,351278,0,13,2,7,4,0,0,0,0,50,0,0 +31,2,182246,1,9,2,10,0,0,0,0,0,45,0,0 +32,2,79870,5,10,1,1,3,0,1,2597,0,40,28,0 +31,2,387116,5,10,0,0,0,1,1,0,0,36,2,0 +47,2,34248,9,11,1,5,1,0,0,0,0,40,0,1 +54,0,198741,5,10,1,11,1,0,0,0,0,40,0,1 +23,2,32950,5,10,0,5,0,0,0,0,0,40,0,0 +34,2,381153,1,9,1,1,1,0,0,0,0,40,0,1 +46,2,100067,2,7,1,4,2,1,1,0,0,35,0,1 +34,2,208785,6,12,2,5,0,0,0,0,0,50,0,1 +31,2,61559,1,9,0,4,0,0,0,0,0,50,0,0 +41,2,176452,1,9,1,9,1,0,0,0,0,40,30,0 +27,1,328518,9,11,0,3,5,0,0,0,0,30,0,0 +23,2,378546,5,10,0,10,3,0,0,0,0,40,0,0 +59,3,178660,6,12,1,0,1,0,0,0,0,40,0,0 +56,2,235826,1,9,1,10,1,0,0,5013,0,40,0,0 +35,1,22641,1,9,1,6,1,3,0,0,0,40,0,0 +59,2,316027,1,9,1,4,1,0,0,0,0,45,1,0 +47,2,431515,9,11,1,10,1,0,0,0,0,40,0,1 +51,1,149770,1,9,2,5,0,0,1,0,0,44,0,0 +42,2,165916,0,13,2,0,4,0,1,0,0,45,0,0 +29,3,107411,5,10,3,0,3,0,1,0,0,40,0,0 +23,2,217961,1,9,0,10,4,0,0,0,0,45,31,0 +43,1,350387,1,9,1,10,1,0,0,0,0,60,0,0 +46,2,325372,5,10,1,1,1,0,0,0,0,40,0,0 +30,2,156718,5,10,4,0,0,0,1,0,0,40,0,0 +23,2,216472,5,10,0,9,3,0,1,0,0,20,0,0 +29,0,106972,3,14,0,3,0,0,1,0,0,35,0,0 +33,2,131934,1,9,2,1,0,0,1,0,0,45,0,0 +33,4,365908,1,9,1,4,1,1,0,2105,0,40,0,0 +46,4,359193,5,10,2,0,4,0,1,0,0,45,0,0 +35,2,261012,5,10,3,0,0,1,1,0,0,40,0,0 +36,2,272944,0,13,1,1,1,0,0,0,1887,40,0,1 +25,2,113654,1,9,4,1,4,0,1,0,0,37,0,0 +35,2,218955,0,13,1,5,1,0,0,0,0,40,0,0 +30,2,115963,7,4,0,8,4,0,0,0,0,42,0,0 +39,2,80638,5,10,1,4,1,2,0,0,0,84,0,1 +37,2,147258,5,10,1,10,1,0,0,0,0,55,0,0 +22,2,214635,1,9,0,8,0,0,0,0,0,42,0,0 +25,2,200318,1,9,1,6,1,0,0,0,0,60,0,0 +50,2,138270,1,9,1,5,2,1,1,0,0,40,0,0 +33,2,103435,9,11,4,3,0,0,0,0,0,45,0,0 +59,5,133201,11,3,1,7,1,0,0,0,0,40,25,0 +24,2,175183,1,9,0,0,0,0,1,0,0,40,0,0 +41,2,99870,0,13,1,5,1,0,0,0,0,55,0,0 +60,2,113440,0,13,2,1,3,0,0,0,0,60,0,0 +19,2,85690,1,9,0,8,4,0,0,0,0,30,0,0 +23,2,45713,5,10,0,10,5,0,0,0,0,40,0,0 +57,5,376230,3,14,1,5,1,0,0,99999,0,40,0,1 +36,2,145576,3,14,1,0,1,0,0,0,1977,40,28,1 +24,2,113936,0,13,0,3,3,0,0,0,0,40,0,0 +32,2,158291,1,9,1,10,1,0,0,0,0,50,0,1 +27,2,193898,0,13,1,5,1,0,0,0,0,45,0,1 +43,2,191982,9,11,0,0,3,0,1,0,0,55,0,0 +54,2,271160,9,11,6,1,0,0,1,0,0,40,0,0 +22,2,33087,1,9,1,7,1,0,0,0,0,45,0,0 +29,2,106153,1,9,0,10,0,0,0,0,0,50,0,0 +22,2,29444,14,8,0,7,0,3,0,0,0,50,0,0 +37,2,105021,0,13,1,5,1,0,0,0,0,50,0,1 +38,1,239045,8,16,1,3,1,0,0,0,0,50,0,1 +34,2,94413,5,10,1,2,1,0,0,0,0,40,0,0 +45,2,20534,5,10,1,8,1,0,0,0,0,84,0,1 +28,2,350254,15,2,0,13,0,0,1,0,0,40,4,0 +68,2,194746,8,16,2,3,0,0,1,0,0,40,1,0 +36,2,269042,1,9,1,8,1,2,0,0,0,40,17,0 +20,2,447488,4,5,0,4,4,0,0,0,0,30,4,0 +24,2,267706,5,10,0,10,3,0,1,0,0,45,0,0 +38,2,198216,5,10,2,1,4,0,1,0,0,40,0,0 +32,2,227931,0,13,0,1,0,0,1,0,0,40,0,0 +34,2,252646,5,10,1,3,1,0,0,7298,0,50,0,1 +47,2,223342,1,9,6,0,0,0,1,2174,0,40,7,0 +28,2,181776,0,13,0,4,0,0,1,0,0,50,0,0 +32,2,132601,10,15,1,3,1,0,0,0,0,40,0,1 +58,2,205410,1,9,1,8,1,0,0,0,0,40,0,0 +64,5,185912,10,15,1,3,1,0,0,99999,0,35,0,1 +38,2,292570,5,10,0,5,3,0,1,0,0,50,0,0 +43,2,76460,1,9,0,0,0,0,1,0,0,40,0,0 +28,2,295163,14,8,2,7,0,0,0,0,0,40,0,0 +23,2,69847,0,13,0,3,3,2,1,0,0,20,0,0 +25,2,104993,4,5,0,2,3,1,0,2907,0,40,0,0 +41,2,322980,1,9,4,0,0,1,0,2354,0,40,0,0 +41,2,317539,5,10,1,10,1,1,0,0,0,40,0,0 +27,2,195678,0,13,1,3,1,0,0,0,0,40,0,0 +54,2,466502,7,4,6,4,4,0,0,0,0,30,0,0 +28,4,220754,1,9,4,6,3,0,1,0,0,25,0,0 +29,2,202878,7,4,1,7,1,0,0,0,2042,40,0,0 +36,2,343476,1,9,2,10,0,0,0,0,0,30,0,0 +41,5,93227,0,13,1,1,1,2,0,0,1977,60,18,1 +60,1,38622,5,10,1,1,1,0,0,0,0,40,0,0 +34,0,173730,3,14,1,1,1,0,0,0,0,38,0,0 +27,2,300783,5,10,1,5,2,0,1,0,0,42,0,1 +60,2,224644,12,6,1,5,1,0,0,0,0,40,0,0 +39,2,191502,9,11,1,10,1,0,0,0,0,40,0,0 +59,2,61885,14,8,2,6,5,1,0,0,0,35,0,0 +34,1,213887,8,16,1,3,1,0,0,0,0,32,8,1 +36,2,331395,9,11,1,1,1,0,0,0,0,40,0,0 +54,2,145098,5,10,1,5,1,0,0,0,0,40,0,1 +48,2,123075,9,11,1,9,1,0,0,0,0,40,0,1 +19,2,216804,7,4,0,4,3,0,0,0,0,33,0,0 +40,2,188291,10,15,1,3,1,0,0,0,0,40,0,1 +25,2,33610,1,9,0,2,0,0,0,0,0,45,0,0 +39,2,234901,6,12,4,0,4,0,0,0,0,40,0,0 +34,1,349148,5,10,1,10,1,0,0,0,0,40,0,0 +30,2,168443,1,9,4,4,4,0,1,0,0,30,0,0 +43,2,211860,1,9,0,4,4,1,1,0,0,24,0,0 +35,2,193961,0,13,1,3,1,2,0,0,0,40,11,1 +36,4,52532,8,16,1,3,1,0,0,0,1887,50,0,1 +59,1,75804,1,9,1,7,1,0,0,0,0,65,0,1 +33,1,176185,1,9,1,10,1,0,0,0,0,40,0,0 +22,2,306779,5,10,0,2,3,0,0,0,0,50,0,0 +48,2,265192,1,9,1,10,1,0,0,0,0,45,0,0 +54,2,139347,1,9,6,0,4,0,1,0,0,40,0,0 +49,2,107682,5,10,2,0,0,0,1,0,0,38,0,0 +37,2,34173,0,13,0,9,0,0,1,0,0,40,0,0 +45,2,128378,1,9,1,8,1,1,0,0,0,40,0,0 +51,5,195638,5,10,4,5,0,0,1,0,0,40,0,0 +46,2,59287,5,10,1,10,1,0,0,0,0,40,0,0 +31,1,162442,0,13,1,1,2,0,1,0,0,40,0,1 +39,2,344743,5,10,1,0,3,1,1,0,0,50,0,1 +35,2,112077,1,9,1,2,1,0,0,5013,0,40,0,0 +26,2,176795,0,13,0,0,3,0,1,0,0,40,0,1 +51,2,137815,5,10,1,0,1,0,0,7298,0,40,0,1 +31,2,309620,3,14,1,3,1,2,0,0,0,6,27,0 +39,2,336880,1,9,1,8,1,0,0,0,0,40,0,1 +26,2,206600,2,7,0,4,5,0,0,0,0,30,4,0 +25,2,193051,0,13,1,9,1,0,0,0,0,35,0,0 +61,3,229062,5,10,1,0,1,0,0,0,1887,40,0,1 +49,2,62793,1,9,2,5,3,0,1,0,0,40,0,0 +53,2,264939,0,13,0,3,0,0,1,0,0,45,4,0 +52,2,370552,13,1,1,8,1,0,0,0,0,40,22,0 +52,2,163678,1,9,1,6,1,0,0,0,0,55,0,0 +50,2,558490,1,9,2,0,0,1,0,0,0,40,0,0 +29,2,124680,0,13,0,5,0,0,1,13550,0,35,0,1 +76,2,208843,7,4,6,11,0,0,0,0,0,30,0,0 +19,2,95078,1,9,0,0,3,0,1,0,0,15,0,0 +25,2,169679,1,9,1,6,1,0,0,0,0,40,0,0 +45,2,101320,1,9,2,0,4,0,1,0,0,40,0,0 +34,2,168906,6,12,2,0,3,0,1,0,0,35,0,0 +20,2,212582,5,10,0,4,3,0,1,0,0,16,0,0 +27,2,99897,5,10,1,9,1,0,0,0,0,40,0,0 +41,2,104892,5,10,1,0,1,0,0,2829,0,40,0,0 +43,2,175224,1,9,1,4,1,0,0,0,0,60,35,0 +23,2,149704,1,9,0,0,3,0,1,0,0,40,0,0 +37,3,214542,5,10,2,0,4,1,1,0,0,40,0,0 +31,2,167319,0,13,1,1,1,0,0,0,0,40,0,0 +33,0,43716,5,10,1,10,1,0,0,0,0,4,0,0 +28,2,191935,6,12,0,5,3,0,0,0,0,20,0,0 +35,2,338611,5,10,2,0,4,0,1,0,0,40,0,0 +41,2,136419,6,12,1,9,1,0,0,0,0,75,0,1 +17,2,72321,2,7,0,4,5,0,1,0,0,12,0,0 +41,4,189956,0,13,1,3,2,1,1,0,0,40,0,1 +44,2,403782,9,11,2,5,0,0,0,0,0,45,0,0 +47,2,456661,7,4,1,10,1,0,0,0,0,40,4,0 +24,2,279041,1,9,0,2,3,1,0,0,0,40,0,0 +38,1,65716,9,11,2,4,4,0,1,0,0,40,0,0 +34,2,189809,5,10,1,1,1,1,0,0,0,52,2,0 +62,4,223637,1,9,2,4,0,1,1,0,0,35,0,0 +27,4,199343,1,9,1,0,1,0,0,0,0,38,0,0 +59,2,139344,5,10,1,0,2,0,1,0,0,40,0,1 +35,2,119098,3,14,1,1,1,0,0,0,0,40,0,0 +38,2,195025,1,9,4,4,4,1,1,0,0,32,0,0 +28,2,186720,5,10,0,4,3,0,1,0,0,50,0,0 +28,2,328923,1,9,0,0,5,0,1,0,0,38,0,0 +59,0,159472,4,5,1,6,1,0,0,0,0,40,0,0 +42,2,138662,5,10,4,0,3,0,1,0,0,40,0,0 +54,4,286342,3,14,0,3,0,0,1,0,0,32,0,1 +39,2,181705,1,9,1,3,1,0,0,0,0,45,0,0 +41,2,193882,0,13,1,7,1,0,0,0,0,40,0,0 +43,2,216497,0,13,2,0,4,0,1,0,0,40,9,0 +32,5,124919,0,13,1,4,1,2,0,0,0,50,10,1 +62,2,109463,5,10,4,5,4,0,1,0,1617,33,0,0 +58,2,256274,1,9,2,0,0,0,1,0,0,40,0,0 +43,2,326379,1,9,2,10,0,0,0,0,0,40,0,0 +31,2,243142,1,9,2,8,4,0,1,0,0,40,0,0 +51,4,155118,3,14,1,3,2,0,1,0,0,70,0,1 +54,2,189607,0,13,0,4,3,1,1,0,0,36,0,0 +20,2,39478,5,10,0,8,0,0,0,0,0,70,0,0 +35,2,206951,5,10,1,5,1,0,0,0,0,40,0,1 +22,2,127647,1,9,0,4,3,0,1,0,0,36,0,0 +38,2,234298,0,13,2,1,0,0,0,6849,0,60,0,0 +42,2,182302,1,9,1,1,1,0,0,0,0,40,0,0 +44,0,166597,3,14,1,0,1,0,0,0,0,40,0,1 +28,1,33363,1,9,1,7,1,0,0,0,0,70,0,1 +74,5,167537,5,10,1,1,1,0,0,0,0,35,0,1 +34,2,179378,1,9,1,1,2,1,1,0,0,40,0,0 +50,0,297551,1,9,1,3,1,0,0,0,0,52,0,0 +50,2,198362,9,11,6,1,4,0,1,0,0,40,0,0 +43,2,240504,1,9,1,2,1,0,0,0,0,40,0,0 +29,1,169662,1,9,1,10,1,0,0,0,0,40,0,0 +61,2,210488,1,9,1,1,1,0,0,0,0,50,0,1 +21,2,154835,5,10,0,0,3,2,1,0,0,40,36,0 +47,2,192793,8,16,1,3,1,0,0,0,0,40,10,1 +39,2,49436,6,12,2,3,4,0,1,0,1380,40,0,0 +33,2,136331,1,9,1,10,1,0,0,0,0,40,0,0 +22,2,509048,1,9,0,5,5,1,1,0,0,37,0,0 +38,2,318610,5,10,2,0,4,1,1,0,0,40,0,0 +45,2,104521,5,10,1,10,1,0,0,0,0,40,0,0 +42,2,247695,1,9,1,8,1,0,0,0,0,45,0,1 +35,2,219546,5,10,0,10,0,0,0,0,0,45,9,0 +21,2,169699,1,9,0,0,0,0,1,0,0,40,0,0 +49,0,131302,9,11,2,0,0,1,1,0,0,44,0,0 +50,2,171852,0,13,4,3,3,4,1,0,0,40,0,0 +36,0,340091,8,16,1,3,2,0,1,0,0,36,0,1 +20,2,204641,1,9,0,0,3,0,0,0,0,20,0,0 +49,2,213431,1,9,4,3,4,1,1,0,0,40,0,0 +40,0,377018,0,13,1,3,1,0,0,0,0,60,0,1 +22,2,184543,5,10,2,0,4,0,1,0,0,40,0,0 +67,2,233022,2,7,6,0,4,0,1,0,0,20,0,0 +21,2,177420,5,10,0,0,0,4,1,0,0,40,0,0 +60,1,21101,1,9,1,7,1,3,0,0,0,50,0,0 +17,2,52486,2,7,0,4,3,0,1,0,0,12,0,0 +43,2,183273,3,14,1,1,2,0,1,15024,0,32,0,1 +49,0,36177,0,13,1,1,1,0,0,0,0,45,0,1 +41,2,124956,0,13,4,3,0,1,1,99999,0,60,0,1 +38,2,102350,5,10,2,10,4,0,0,0,0,40,0,0 +38,2,165930,1,9,1,10,1,0,0,0,0,40,0,0 +35,2,297574,6,12,1,1,1,0,0,0,0,99,0,1 +40,2,120277,5,10,0,5,0,0,0,0,0,40,0,0 +40,2,155972,1,9,1,6,1,0,0,0,0,60,0,1 +46,0,162852,1,9,2,0,4,0,1,0,0,40,0,0 +25,2,64860,5,10,3,0,4,0,1,0,0,22,0,0 +36,2,226013,1,9,1,8,1,1,0,5178,0,40,0,1 +24,2,322674,6,12,0,2,0,0,0,0,0,48,0,0 +62,2,202242,1,9,1,8,1,0,0,0,0,48,0,0 +54,2,175262,13,1,1,10,1,2,0,0,0,40,26,0 +23,2,201682,0,13,1,0,5,0,1,0,0,40,0,0 +60,2,166330,1,9,1,0,2,0,1,0,0,40,0,0 +18,5,147612,1,9,0,7,3,0,1,0,0,8,0,0 +41,4,213154,5,10,1,0,2,1,1,0,0,40,0,0 +45,4,33798,3,14,0,3,0,0,1,0,0,40,0,0 +62,0,199198,9,11,6,1,4,1,1,0,0,40,0,0 +28,2,90915,0,13,3,9,4,1,1,0,0,40,0,0 +36,5,337778,5,10,1,1,1,0,0,0,0,60,29,1 +31,2,187203,1,9,0,5,5,0,0,0,0,40,0,0 +33,1,361817,1,9,4,10,4,0,0,0,0,50,0,0 +62,1,226546,10,15,1,3,1,0,0,0,0,16,0,0 +27,2,100168,7,4,1,4,2,0,1,0,0,40,0,0 +42,3,272625,9,11,2,0,4,1,1,0,0,40,0,1 +55,2,254516,4,5,0,2,5,1,0,0,0,37,0,0 +41,2,207375,1,9,0,5,0,0,1,0,0,50,0,0 +26,2,39092,5,10,1,1,1,0,0,4064,0,50,0,0 +45,2,48271,5,10,1,0,2,0,1,0,0,40,0,1 +67,1,152102,1,9,6,7,0,0,0,0,0,65,0,0 +25,2,234665,9,11,1,10,1,0,0,0,0,45,0,0 +30,5,127651,1,9,1,10,1,0,0,0,1887,48,0,1 +22,2,180060,0,13,0,1,4,0,0,0,0,40,0,0 +19,2,32477,5,10,0,4,3,0,0,0,0,20,0,0 +26,2,137658,0,13,0,1,0,0,1,0,0,45,0,0 +61,2,228287,1,9,1,10,1,0,0,0,0,50,0,0 +32,2,159442,10,15,0,5,0,0,1,13550,0,50,0,1 +43,2,33310,1,9,2,0,0,0,1,0,0,40,0,0 +53,2,270546,1,9,2,13,0,0,1,0,0,20,0,0 +53,3,290290,5,10,2,0,0,0,0,0,0,45,0,0 +42,5,287037,14,8,2,10,0,0,0,0,0,10,0,0 +36,2,128516,1,9,1,0,2,0,1,0,0,40,0,1 +55,1,185195,0,13,1,1,1,0,0,0,0,99,0,0 +35,3,49657,0,13,1,3,1,0,0,7298,0,40,0,1 +17,2,98005,2,7,0,5,3,0,1,0,0,16,0,0 +55,1,283635,10,15,2,3,0,0,1,0,0,35,0,0 +36,2,98360,1,9,1,1,1,0,0,0,0,40,0,0 +40,4,202872,3,14,1,3,2,0,1,0,0,40,0,1 +54,1,118365,12,6,2,4,0,1,1,0,0,10,0,0 +45,1,184285,0,13,2,3,0,0,0,0,0,45,0,0 +48,2,345831,5,10,1,9,1,0,0,0,0,40,0,1 +40,4,99679,10,15,0,1,0,0,0,0,0,60,0,1 +31,2,253354,0,13,1,3,1,0,0,0,0,50,0,0 +26,2,190650,0,13,0,0,3,2,0,0,0,40,18,0 +34,2,287737,5,10,1,1,2,0,1,0,1485,40,0,1 +19,2,204389,1,9,0,0,3,4,1,0,0,25,5,0 +31,3,294870,6,12,1,10,1,0,0,0,0,40,0,0 +34,2,159442,1,9,0,3,0,0,1,0,0,30,0,0 +55,4,161662,3,14,1,1,1,0,0,0,0,55,0,1 +38,2,52738,5,10,1,10,1,0,0,0,0,40,0,0 +21,2,252024,1,9,0,2,5,0,0,0,0,20,4,0 +27,2,189702,7,4,1,10,1,0,0,0,0,40,0,0 +35,2,407913,1,9,4,4,0,1,0,0,0,40,0,0 +20,2,166527,5,10,0,0,3,4,1,0,0,20,0,0 +24,1,34918,9,11,0,4,4,0,1,0,0,38,0,0 +18,3,201686,2,7,0,8,3,0,0,0,0,4,0,0 +28,4,179759,5,10,3,0,4,0,1,0,0,40,0,0 +36,2,94954,1,9,2,6,0,0,1,0,0,40,0,0 +66,2,350498,5,10,1,6,1,0,0,0,1258,20,0,0 +19,2,201743,5,10,0,4,3,0,1,0,0,15,0,0 +59,1,119344,12,6,1,1,2,0,1,0,0,36,0,0 +33,2,149726,1,9,1,6,1,0,0,0,0,46,0,0 +28,2,419146,7,4,4,2,0,0,0,0,0,40,4,0 +34,2,174789,0,13,0,4,0,0,0,0,2001,40,0,0 +41,2,171234,5,10,2,0,0,0,1,0,0,55,0,0 +30,2,206325,2,7,1,10,1,0,0,0,0,45,0,0 +59,2,202682,1,9,1,10,1,0,0,0,0,40,0,0 +42,2,121055,0,13,1,5,1,0,0,0,0,60,0,0 +47,2,160187,1,9,4,3,5,1,1,14084,0,38,0,1 +29,2,84366,12,6,3,0,4,0,1,0,0,40,4,0 +60,2,139391,5,10,3,8,0,0,0,0,0,50,0,1 +53,4,124094,1,9,1,10,1,0,0,5013,0,35,0,0 +41,2,30759,7,4,1,1,1,0,0,0,0,60,0,0 +32,2,137875,5,10,2,5,4,0,1,0,0,30,0,0 +20,2,238384,1,9,0,5,0,0,1,0,0,30,0,0 +49,2,340755,3,14,1,5,1,0,0,0,0,40,0,1 +36,4,224947,0,13,0,3,4,0,0,0,0,40,0,0 +33,0,111994,5,10,2,0,4,0,1,0,0,45,0,0 +25,2,125491,5,10,0,4,0,2,1,0,0,34,0,0 +40,4,99185,6,12,1,11,1,0,0,0,0,40,0,0 +48,2,249935,1,9,1,6,1,0,0,0,0,44,0,0 +51,2,206775,5,10,1,2,1,0,0,0,0,50,0,0 +22,2,230704,6,12,0,2,3,1,0,0,0,20,2,0 +34,2,242361,5,10,1,3,1,1,0,0,0,50,0,0 +22,2,134746,12,6,1,5,2,0,1,0,0,40,0,0 +34,5,198613,1,9,1,1,1,0,0,0,2002,40,0,0 +56,2,174040,1,9,2,4,0,0,0,0,0,40,0,0 +49,2,165953,1,9,1,8,1,0,0,0,1902,40,0,0 +36,2,273604,0,13,0,4,0,0,1,0,0,40,0,0 +18,2,192409,5,10,0,5,3,0,1,0,0,20,0,0 +26,1,102476,1,9,0,10,3,0,0,0,0,50,0,0 +48,2,234504,1,9,1,1,1,0,0,0,0,50,0,0 +35,1,468713,1,9,1,1,1,0,0,0,0,40,0,0 +29,2,84560,1,9,0,2,3,0,0,0,0,40,0,0 +47,2,148995,1,9,1,10,1,0,0,0,0,40,0,1 +21,2,34816,9,11,1,0,2,0,1,0,0,12,0,0 +28,2,211184,5,10,0,5,0,0,1,0,0,50,0,0 +53,2,33304,5,10,1,6,1,0,0,0,0,40,0,1 +65,3,179985,1,9,2,0,0,0,1,0,0,40,0,0 +26,2,219815,5,10,3,0,4,0,1,0,0,40,0,0 +50,2,134766,0,13,1,1,1,0,0,0,1902,50,0,1 +26,2,106548,1,9,1,10,1,0,0,0,0,50,0,0 +70,2,89787,1,9,1,3,1,0,0,0,0,20,0,0 +55,2,164857,5,10,2,8,3,0,0,0,0,40,0,0 +27,3,257124,0,13,0,6,5,0,0,0,0,35,0,0 +31,2,227446,5,10,1,1,1,0,0,0,0,40,1,1 +43,2,125461,0,13,1,5,1,0,0,0,1902,55,0,1 +24,2,189749,2,7,1,10,1,0,0,0,0,40,0,0 +22,2,176321,7,4,0,4,4,0,1,0,0,40,4,0 +26,2,284250,1,9,0,10,4,1,1,0,0,40,0,0 +23,2,101885,12,6,0,10,0,0,1,0,0,40,0,0 +41,1,134130,1,9,1,7,1,0,0,0,0,60,0,0 +52,2,260938,3,14,1,5,1,0,0,0,0,40,0,0 +41,1,238184,1,9,1,7,2,0,1,0,0,40,0,0 +59,1,148626,12,6,1,7,1,0,0,0,0,40,0,0 +56,1,48102,5,10,1,1,2,0,1,0,1977,50,0,1 +58,2,234213,1,9,2,10,0,0,0,14344,0,48,0,1 +65,2,113323,0,13,1,1,1,0,0,0,0,40,0,1 +24,4,34246,0,13,0,3,0,2,0,0,0,40,0,0 +51,2,175070,6,12,1,5,1,0,0,5178,0,45,0,1 +31,2,279680,5,10,1,2,1,0,0,0,0,45,0,0 +84,2,188328,1,9,6,3,0,0,1,0,0,16,0,0 +51,2,96609,5,10,1,10,1,0,0,0,0,40,0,0 +24,4,84257,0,13,0,3,0,0,0,0,0,50,0,0 +30,2,275632,1,9,1,8,1,0,0,0,0,45,0,0 +22,2,385540,12,6,0,4,0,0,0,0,0,40,4,0 +30,2,196342,3,14,0,3,0,0,0,0,0,40,38,0 +47,2,97176,5,10,2,1,4,0,1,0,0,40,0,0 +19,2,197714,1,9,0,5,3,0,1,0,0,35,0,0 +43,1,147099,5,10,2,0,4,0,1,0,0,36,0,0 +30,2,186346,0,13,0,1,0,0,1,0,0,50,0,0 +46,2,73434,3,14,2,1,0,0,1,0,0,45,0,0 +49,4,275074,0,13,1,3,1,0,0,0,0,60,0,0 +37,2,209214,11,3,0,8,4,0,1,0,0,40,4,0 +42,2,210525,3,14,0,1,0,0,0,0,0,40,0,0 +57,2,372020,5,10,1,5,1,0,0,5013,0,50,0,0 +46,2,176684,6,12,0,0,0,0,1,0,0,40,0,0 +23,2,210474,5,10,0,4,3,0,1,0,0,20,0,0 +26,2,293690,0,13,1,10,1,0,0,0,0,58,0,1 +64,2,149775,3,14,0,3,5,0,1,0,0,8,0,0 +20,2,323009,1,9,0,0,4,0,1,0,0,40,9,0 +31,2,126950,1,9,2,6,0,0,0,0,0,40,0,0 +38,2,172538,0,13,1,9,1,0,0,0,1977,40,0,1 +44,2,115411,5,10,2,8,0,0,0,0,0,40,0,0 +42,1,101709,9,11,1,10,1,2,0,2885,0,40,0,0 +23,2,265356,0,13,0,1,4,0,0,0,0,40,0,0 +31,4,192565,3,14,1,3,1,0,0,0,0,90,0,1 +35,1,348771,2,7,1,10,1,0,0,0,0,36,0,0 +30,1,148959,5,10,2,10,0,0,0,0,0,35,0,0 +35,2,126569,1,9,2,10,3,0,0,0,0,20,0,0 +40,2,105936,1,9,3,0,3,0,1,0,0,38,0,0 +18,2,188076,2,7,0,4,3,0,1,0,0,20,0,0 +63,2,124242,1,9,1,0,1,1,0,0,0,40,0,0 +20,0,200819,1,9,0,6,3,0,0,0,0,40,0,0 +50,4,100480,3,14,1,1,1,0,0,0,0,60,0,1 +49,2,129513,3,14,1,5,1,0,0,0,0,45,0,0 +53,1,297796,12,6,1,7,1,0,0,0,0,40,0,0 +34,2,195488,1,9,4,0,3,0,1,0,0,40,0,0 +54,2,153486,1,9,2,6,0,0,0,0,0,56,0,1 +40,2,126845,5,10,1,0,1,0,0,0,0,40,0,1 +22,2,206974,0,13,0,5,0,0,1,0,0,40,0,0 +28,2,412149,12,6,0,7,5,0,0,0,0,35,4,0 +24,2,653574,1,9,0,10,3,0,0,0,0,40,22,0 +37,2,70562,15,2,0,4,4,0,1,0,0,48,22,0 +62,2,197514,1,9,1,5,2,0,1,0,0,16,0,0 +51,2,334679,9,11,6,3,4,2,1,0,0,40,0,0 +65,2,105116,5,10,6,0,0,0,1,2346,0,40,0,0 +31,2,151484,1,9,0,0,3,0,1,0,0,8,0,0 +42,5,78765,5,10,2,1,4,0,0,0,0,90,0,1 +42,2,98427,1,9,1,4,2,1,1,0,0,35,0,0 +54,2,230767,6,12,1,10,1,0,0,0,0,40,1,0 +23,2,117606,0,13,0,1,3,0,1,0,0,60,0,0 +28,2,68642,1,9,0,4,0,0,1,0,0,46,0,0 +42,2,341638,2,7,2,10,0,0,0,0,0,40,0,0 +30,2,65920,1,9,0,1,0,1,0,0,0,40,0,0 +33,3,188246,1,9,1,10,1,0,0,0,0,40,0,0 +33,2,198727,1,9,2,9,0,0,1,0,0,40,0,0 +39,2,160728,1,9,2,8,4,0,0,2977,0,40,0,0 +27,2,706026,2,7,1,2,1,0,0,0,0,40,0,0 +62,2,77884,11,3,1,7,1,2,0,0,0,40,11,0 +17,2,160758,12,6,0,5,5,0,0,0,0,30,0,0 +58,2,201112,5,10,2,0,0,1,1,0,0,55,0,1 +69,5,107850,3,14,1,1,1,0,0,6514,0,40,0,1 +34,2,230246,0,13,1,3,1,0,0,0,0,42,0,1 +34,2,203034,0,13,4,5,0,0,0,0,2824,50,0,1 +20,2,373935,1,9,0,2,3,0,0,0,0,35,0,0 +64,3,341695,5,10,1,0,2,0,1,0,0,40,0,1 +41,2,178002,1,9,1,0,2,0,1,0,0,40,0,1 +40,2,233130,7,4,1,10,1,0,0,0,0,40,22,0 +53,4,192982,3,14,1,0,1,0,0,0,0,38,0,1 +44,2,33155,8,16,0,3,0,0,0,0,0,45,0,0 +37,2,187346,11,3,0,0,5,0,1,0,0,40,4,0 +46,2,78529,0,13,1,9,1,0,0,0,0,60,0,1 +17,2,101626,4,5,0,8,3,0,0,0,0,20,0,0 +35,2,117567,1,9,2,10,0,0,0,0,0,40,0,0 +36,4,110791,6,12,4,0,4,0,1,0,0,40,0,0 +49,0,207120,1,9,1,2,1,0,0,0,0,40,0,1 +48,2,43206,10,15,2,3,4,0,1,0,0,25,0,0 +26,2,120238,0,13,0,5,5,0,0,0,0,40,0,0 +26,2,189219,6,12,0,0,0,0,1,0,0,8,0,0 +35,0,190895,1,9,1,10,1,0,0,0,0,40,0,0 +29,2,83517,4,5,0,8,0,0,0,0,0,40,0,0 +54,2,35557,5,10,1,5,1,0,0,7298,0,50,0,1 +36,4,59313,5,10,4,0,3,1,0,0,0,40,0,0 +25,2,202033,0,13,1,3,1,0,0,0,0,40,0,0 +18,4,55658,12,6,0,4,3,0,0,0,0,25,0,0 +21,2,118186,5,10,0,5,3,1,1,0,0,20,0,0 +22,2,279901,1,9,1,4,3,1,0,0,0,40,0,0 +52,2,110954,1,9,1,10,1,0,0,0,0,45,22,1 +36,1,90159,5,10,1,4,2,0,1,0,0,40,0,0 +25,2,122489,0,13,0,1,3,0,1,0,1726,60,0,0 +49,1,43348,8,16,0,3,0,0,0,99999,0,70,0,1 +42,2,34278,5,10,1,5,1,0,0,0,0,50,0,1 +37,2,37778,9,11,1,5,1,0,0,0,0,54,0,0 +39,2,160623,6,12,0,10,3,0,0,0,0,40,0,0 +32,2,342458,0,13,0,3,0,0,0,0,0,40,0,0 +53,2,64322,1,9,1,1,1,0,0,0,0,40,0,0 +30,2,373914,2,7,1,10,1,0,0,0,0,40,0,0 +51,2,205884,5,10,1,9,2,0,1,0,0,40,0,1 +62,4,208266,9,11,2,0,0,1,1,0,0,40,0,0 +38,2,222450,11,3,1,8,1,0,0,0,0,40,4,0 +23,2,348420,0,13,0,9,0,0,0,0,0,40,0,0 +39,2,136081,1,9,1,8,1,0,0,0,2051,40,0,0 +37,3,197284,5,10,0,0,3,0,0,0,0,40,0,0 +41,2,206066,5,10,1,8,1,0,0,0,0,40,0,0 +47,1,61885,0,13,1,5,1,0,0,0,0,40,0,1 +25,2,299908,5,10,1,1,2,1,1,0,0,40,0,1 +35,2,46028,6,12,2,4,4,0,1,0,0,50,0,0 +47,2,239865,1,9,1,10,1,0,0,0,1977,45,0,1 +30,2,154587,1,9,0,4,0,0,0,0,0,40,5,0 +29,2,244473,9,11,1,9,1,0,0,0,2051,40,0,0 +36,2,32334,9,11,1,1,2,0,1,0,0,50,0,1 +42,2,319588,0,13,3,6,0,0,0,0,0,60,0,0 +51,2,226735,1,9,1,6,1,1,0,0,0,40,0,0 +34,2,226443,1,9,2,0,3,0,0,0,0,40,0,0 +44,5,359259,1,9,2,10,0,0,0,0,0,60,20,0 +27,2,36851,0,13,0,8,0,0,0,0,0,41,0,0 +39,2,393480,1,9,4,2,0,1,0,0,0,40,0,0 +46,2,33109,1,9,2,10,0,0,0,0,1741,40,0,0 +32,1,188246,1,9,2,5,3,0,0,0,1590,62,0,0 +31,2,231569,0,13,0,5,0,1,1,0,0,50,0,0 +23,2,353010,2,7,0,10,4,0,0,0,0,35,0,0 +47,2,102628,3,14,1,1,1,0,0,15024,0,55,0,1 +66,2,262285,0,13,1,3,1,0,0,0,0,99,0,0 +26,2,160300,1,9,0,8,3,0,0,0,0,40,0,0 +52,2,156953,1,9,1,2,1,0,0,0,0,40,0,1 +53,5,136823,2,7,6,1,0,0,1,0,0,30,0,0 +48,1,160724,0,13,1,1,1,2,0,0,0,40,28,0 +37,5,86459,6,12,4,1,4,0,0,0,0,50,0,0 +17,2,238628,2,7,0,4,3,0,1,0,0,5,0,0 +50,2,339954,9,11,1,10,1,0,0,0,0,40,0,1 +17,3,99893,2,7,0,0,0,1,1,0,1602,40,0,0 +39,2,214117,5,10,2,10,4,1,0,0,0,40,0,0 +28,3,298661,0,13,0,9,0,1,1,0,0,40,0,0 +38,2,179488,6,12,2,10,0,0,0,0,0,40,0,0 +53,2,48343,1,9,1,6,1,0,0,0,1902,40,0,1 +28,4,100270,0,13,2,3,0,0,0,0,0,40,0,0 +42,2,227065,5,10,1,3,1,0,0,15024,0,32,0,1 +40,2,126701,4,5,0,6,0,0,0,0,0,45,0,0 +20,2,209131,5,10,0,8,3,0,0,0,0,40,0,0 +32,0,400132,0,13,1,11,1,0,0,0,0,40,0,1 +23,0,278155,0,13,0,0,3,0,0,0,0,40,0,0 +25,2,139012,0,13,0,5,3,2,0,2174,0,40,36,0 +41,2,178431,1,9,1,10,1,2,0,0,0,40,18,0 +42,2,511068,0,13,1,3,1,0,0,7688,0,40,0,1 +18,2,199039,14,8,0,5,3,0,0,594,0,14,0,0 +29,4,190525,0,13,1,3,1,0,0,0,1848,60,9,1 +36,2,115700,1,9,1,5,1,0,0,0,0,50,0,0 +34,2,167832,12,6,1,10,1,0,0,0,0,40,0,0 +34,2,218164,1,9,2,10,4,0,0,0,0,44,0,0 +48,0,171926,10,15,1,3,1,0,0,15024,0,50,0,1 +36,5,242080,10,15,1,3,1,0,0,0,0,80,0,1 +67,3,223257,1,9,6,4,4,0,0,0,0,40,0,0 +53,2,386773,1,9,1,10,1,0,0,7298,0,40,0,1 +53,1,105478,0,13,1,1,1,0,0,0,2415,40,0,1 +45,2,140644,8,16,2,3,0,0,0,0,0,45,0,1 +22,2,205970,12,6,4,4,4,0,1,0,0,35,0,0 +25,2,216583,0,13,1,1,1,0,0,0,0,43,0,0 +61,2,162432,5,10,2,4,0,0,1,0,0,40,0,0 +31,4,83671,5,10,0,0,0,1,1,0,0,40,0,0 +47,5,205100,1,9,1,3,1,0,0,0,0,38,9,0 +31,2,195750,15,2,1,3,1,0,0,0,0,45,0,0 +17,2,220562,4,5,0,5,5,4,1,0,0,32,4,0 +38,5,312232,5,10,1,5,1,0,0,0,0,50,0,1 +42,2,86185,5,10,6,1,0,3,1,0,0,40,0,0 +78,2,105586,11,3,1,6,1,2,0,0,0,36,0,0 +54,2,103345,9,11,1,1,1,0,0,0,0,40,0,1 +26,4,150553,0,13,0,0,3,2,1,0,0,50,0,0 +30,2,26009,1,9,1,3,1,0,0,0,0,35,0,1 +46,2,149388,0,13,1,10,1,0,0,0,0,40,0,1 +26,2,151626,0,13,0,3,0,1,1,0,0,45,0,0 +30,2,169583,1,9,0,5,3,0,1,0,0,35,0,0 +66,4,174486,8,16,1,3,1,1,0,20051,0,35,2,1 +23,2,160951,1,9,0,10,3,1,0,2597,0,40,0,0 +25,2,213383,5,10,0,9,3,0,0,0,0,40,0,0 +32,5,103078,0,13,1,5,1,0,0,0,0,40,0,0 +25,4,109526,1,9,1,10,1,0,0,0,0,38,0,0 +51,2,142835,2,7,1,8,1,0,0,0,0,40,0,0 +24,0,43475,0,13,0,3,0,0,0,0,0,40,0,0 +22,2,190916,5,10,0,9,3,0,1,0,0,40,0,0 +28,2,175987,1,9,0,1,0,0,1,0,0,40,0,0 +29,4,214385,2,7,2,4,4,1,1,0,0,20,0,0 +26,2,192652,0,13,0,4,3,0,0,0,0,40,0,0 +41,3,207685,0,13,0,1,0,0,0,0,0,40,0,1 +19,2,143857,5,10,0,5,3,0,1,0,0,35,0,0 +51,2,310774,10,15,1,3,1,0,0,0,0,50,0,1 +27,2,279608,11,3,1,7,1,0,0,0,0,40,4,0 +33,2,312881,0,13,1,3,1,1,0,0,0,40,0,1 +19,2,175083,1,9,0,5,3,0,1,0,0,8,0,0 +41,2,32878,0,13,1,3,1,0,0,0,0,45,0,1 +29,3,360527,3,14,1,3,1,0,0,0,0,40,0,1 +28,2,99478,1,9,1,0,1,1,0,0,0,40,0,0 +25,2,113035,5,10,0,1,3,0,0,0,0,40,0,0 +21,3,99199,1,9,0,0,3,0,0,0,0,36,0,0 +24,4,452640,5,10,0,9,0,0,0,14344,0,50,0,1 +48,2,236858,2,7,2,4,0,0,1,0,0,31,0,0 +46,5,201865,10,15,1,3,1,0,0,0,0,60,0,1 +35,2,268661,5,10,1,5,1,0,0,0,0,50,0,0 +35,3,475324,0,13,1,1,1,0,0,0,0,40,0,1 +50,2,117295,12,6,1,10,1,0,0,0,0,40,0,0 +45,2,192835,5,10,1,1,1,0,0,0,0,40,0,0 +62,4,76720,0,13,1,3,2,0,1,0,0,40,0,0 +39,4,180686,3,14,1,3,1,0,0,0,1977,45,0,1 +33,4,133876,1,9,2,10,4,0,0,0,0,40,0,0 +22,2,123727,5,10,0,2,0,0,1,0,0,30,0,0 +50,2,129956,1,9,1,10,1,0,0,0,0,48,0,1 +25,2,96268,2,7,2,1,4,0,1,0,0,40,0,0 +44,2,317320,5,10,2,4,4,0,1,0,0,40,0,0 +26,2,86872,1,9,1,6,1,0,0,0,0,40,0,1 +31,0,100863,3,14,2,1,4,0,1,0,0,50,0,1 +56,2,164332,1,9,1,5,2,0,1,0,0,15,0,0 +49,1,122584,7,4,1,5,1,0,0,0,0,40,0,0 +49,2,34377,14,8,1,10,1,0,0,0,0,40,0,1 +46,2,162030,1,9,6,0,4,0,1,0,0,43,0,0 +33,2,199170,5,10,0,10,0,1,0,0,0,40,0,0 +25,2,470203,0,13,0,3,0,0,1,0,0,30,0,0 +40,2,266803,6,12,2,1,0,0,1,0,0,40,0,1 +32,0,513416,3,14,0,3,0,0,0,0,0,10,0,0 +44,2,98211,0,13,1,6,1,0,0,0,0,55,0,0 +48,2,196107,1,9,2,0,0,0,1,0,0,30,0,0 +17,2,108273,12,6,0,5,3,0,1,0,0,12,0,0 +50,2,213290,9,11,1,3,2,0,1,0,1887,36,0,1 +61,2,96660,5,10,1,0,2,0,1,15024,0,34,0,1 +22,4,412316,1,9,0,2,3,1,0,0,0,40,0,0 +17,2,120068,2,7,0,2,3,0,0,0,0,17,0,0 +49,5,101722,10,15,1,3,1,0,0,0,0,60,0,1 +26,2,120268,1,9,1,4,1,0,0,0,0,50,0,0 +19,0,144429,5,10,0,3,3,0,0,0,0,10,0,0 +17,2,271122,14,8,0,4,3,0,1,0,0,16,0,0 +38,2,255621,1,9,1,4,1,0,0,0,0,40,0,0 +34,4,90934,9,11,2,11,3,2,0,0,0,40,0,0 +51,2,162745,1,9,1,10,1,0,0,7298,0,50,0,1 +48,2,128460,1,9,1,10,1,0,0,0,0,42,0,1 +63,2,30813,3,14,1,3,1,0,0,0,0,50,0,1 +19,2,164585,1,9,0,8,3,0,1,0,0,40,0,0 +73,2,148003,5,10,1,0,2,0,1,20051,0,36,0,1 +51,2,215647,1,9,2,3,0,0,1,0,0,43,0,0 +54,2,421561,5,10,1,3,1,0,0,0,0,40,0,1 +41,2,149909,1,9,1,10,1,0,0,0,1848,40,0,1 +36,1,138940,0,13,1,1,1,0,0,4386,0,50,0,1 +42,2,66755,7,4,1,10,1,4,0,0,0,40,0,0 +38,2,103323,5,10,1,10,1,0,0,7688,0,40,0,1 +37,0,29145,0,13,1,1,1,0,0,0,0,50,0,1 +35,0,184659,1,9,1,10,1,0,0,0,1485,40,0,1 +51,1,20795,5,10,1,10,1,0,0,0,0,40,0,0 +23,2,311376,9,11,0,0,0,0,1,0,0,40,0,0 +27,0,122660,0,13,0,3,3,1,1,0,0,40,0,0 +37,2,193689,9,11,1,8,1,0,0,0,0,42,0,1 +29,2,144556,1,9,1,8,1,0,0,0,0,45,0,0 +33,2,228696,15,2,1,10,0,0,0,0,2603,32,4,0 +60,2,184183,1,9,2,8,0,0,0,4650,0,40,0,0 +22,2,243178,0,13,0,0,3,0,0,0,0,20,0,0 +60,0,190682,9,11,6,4,0,1,1,0,0,37,0,0 +35,2,233786,2,7,4,4,4,0,0,0,0,20,0,0 +45,2,102202,9,11,2,0,0,0,1,0,0,40,0,0 +30,2,95299,1,9,1,8,1,2,0,0,0,40,36,1 +43,5,240504,5,10,1,1,1,0,0,0,0,70,0,1 +32,0,169973,3,14,0,0,0,0,1,0,0,38,0,0 +35,2,144937,1,9,1,10,1,0,0,0,0,42,0,0 +32,2,211751,9,11,2,4,4,1,1,0,0,40,0,0 +61,2,84587,9,11,1,10,1,2,0,0,0,40,0,1 +40,0,150874,3,14,2,1,4,0,1,1506,0,40,0,0 +42,5,188615,0,13,1,5,1,0,0,0,0,60,0,1 +21,2,119704,5,10,0,5,4,0,1,0,0,35,0,0 +21,2,275190,5,10,0,5,3,0,1,0,0,20,0,0 +26,2,417941,0,13,0,1,0,0,1,0,0,40,0,0 +36,0,196348,1,9,1,1,1,0,0,0,0,60,0,1 +24,2,221955,0,13,1,5,5,0,0,0,0,40,0,0 +47,2,173938,0,13,1,1,1,0,0,0,0,57,0,1 +51,2,123429,6,12,2,9,0,0,0,0,0,30,0,0 +67,2,174693,5,10,6,5,0,0,1,0,0,25,35,0 +49,2,357540,1,9,1,7,1,0,0,0,0,25,0,0 +58,2,314092,9,11,1,10,1,0,0,0,1887,48,0,1 +61,2,280088,7,4,2,8,4,0,1,0,0,40,0,0 +36,2,257380,1,9,1,10,1,1,0,0,0,35,0,0 +19,2,165306,5,10,0,9,5,2,0,0,0,40,36,0 +29,1,109001,5,10,1,10,1,0,0,0,0,35,0,0 +43,2,266439,0,13,1,8,1,0,0,0,1887,40,0,1 +60,1,153356,1,9,2,5,0,1,0,2597,0,55,0,0 +21,2,32950,5,10,0,5,4,0,0,0,0,40,0,0 +22,2,182163,1,9,4,5,4,0,1,0,0,40,0,0 +33,2,188246,0,13,1,1,1,0,0,0,0,65,0,1 +36,2,297335,0,13,0,5,0,2,1,0,0,50,26,0 +37,2,108366,0,13,0,6,0,0,0,0,0,46,0,0 +35,2,328301,6,12,5,0,2,0,1,0,0,40,0,0 +17,2,182158,12,6,0,13,3,0,0,0,0,30,0,0 +37,2,169426,1,9,1,10,1,0,0,0,0,60,0,1 +28,2,535978,5,10,1,10,1,0,0,0,0,40,0,1 +42,2,29393,5,10,2,8,0,0,1,0,0,40,0,0 +57,5,258883,1,9,1,6,1,0,0,5178,0,60,39,1 +26,2,369166,5,10,0,7,5,0,1,0,0,65,0,0 +45,4,257855,2,7,1,4,1,1,0,0,0,50,0,0 +32,2,164197,0,13,1,10,1,0,0,0,0,44,0,1 +63,2,109517,5,10,6,0,4,0,1,0,0,43,0,0 +22,2,112137,5,10,0,3,5,2,1,0,0,20,27,0 +36,2,160035,5,10,1,1,1,0,0,0,0,55,0,1 +45,0,50567,1,9,1,1,2,0,1,0,0,40,0,0 +34,1,140011,10,15,1,3,1,0,0,0,0,55,0,1 +27,0,271328,0,13,0,3,0,0,0,0,0,60,0,0 +47,1,159869,1,9,1,7,1,0,0,0,0,56,0,1 +46,2,102542,7,4,0,4,3,0,0,0,0,52,0,0 +28,2,297742,5,10,0,8,3,0,1,0,0,40,0,0 +45,2,176917,1,9,0,2,5,0,0,0,0,40,0,0 +26,2,165235,0,13,0,0,3,2,1,0,0,40,15,0 +32,1,52647,12,6,1,1,1,0,0,0,0,45,0,0 +30,4,48542,14,8,1,0,2,0,1,0,0,40,0,0 +59,2,279232,12,6,1,6,1,0,0,0,0,40,5,0 +58,0,259929,8,16,0,1,0,0,1,0,0,43,0,1 +45,2,221780,5,10,2,2,0,0,0,0,0,30,0,0 +76,1,253408,5,10,6,6,0,0,0,0,0,40,0,0 +38,2,298841,1,9,2,0,3,0,1,0,0,40,0,0 +32,2,321313,3,14,0,5,3,1,0,0,0,40,0,0 +38,1,64875,1,9,2,7,0,0,0,0,0,50,0,0 +30,2,275232,6,12,0,3,4,1,1,0,0,36,0,0 +53,5,134854,9,11,1,1,1,0,0,0,0,40,34,1 +27,0,192355,0,13,0,3,0,0,0,0,0,50,0,0 +44,4,208528,6,12,1,7,1,0,0,0,0,30,0,0 +35,2,160120,3,14,1,1,1,2,0,0,0,50,0,1 +36,2,250238,15,2,0,4,5,4,1,0,0,40,22,0 +51,2,25031,5,10,1,1,2,0,1,0,0,10,0,1 +42,4,255847,1,9,1,6,1,0,0,0,0,40,0,0 +40,1,26892,0,13,5,3,1,0,0,7298,0,50,0,1 +45,2,111979,1,9,1,2,1,0,0,0,0,40,0,0 +55,2,408537,4,5,2,10,4,0,1,99999,0,37,0,1 +36,2,231037,7,4,1,8,1,0,0,0,0,40,0,0 +57,3,30030,1,9,1,10,1,1,0,0,0,40,0,1 +27,2,292120,1,9,2,9,0,0,1,0,0,45,0,0 +62,2,138253,3,14,0,2,0,0,0,4650,0,40,0,0 +29,2,190777,0,13,1,5,1,0,0,0,0,55,0,0 +38,1,41591,0,13,0,10,0,3,0,0,0,30,0,0 +29,2,186733,1,9,1,10,1,0,0,0,0,50,0,0 +32,4,230912,3,14,0,3,0,0,1,4865,0,40,0,0 +34,2,176185,0,13,0,1,0,0,0,0,1741,40,0,0 +25,2,182227,6,12,0,3,0,0,0,0,0,55,0,0 +34,4,205704,3,14,0,3,0,0,0,0,0,35,0,0 +37,0,24342,5,10,1,1,1,0,0,0,0,38,0,0 +37,2,138192,1,9,1,10,1,0,0,0,0,45,0,0 +18,2,334676,1,9,0,2,3,0,0,0,0,25,0,0 +24,2,177526,9,11,0,10,3,0,0,0,0,40,0,0 +17,2,152696,14,8,0,4,3,0,1,0,0,30,0,0 +35,2,114765,0,13,2,5,0,0,1,0,0,40,0,0 +31,2,265509,9,11,4,9,4,1,1,0,0,32,0,0 +29,2,180758,6,12,0,10,0,0,0,0,0,60,0,0 +49,1,127921,1,9,1,10,1,0,0,0,0,40,0,0 +35,3,182898,1,9,1,0,1,0,0,0,0,40,0,0 +55,1,422249,1,9,1,10,1,0,0,0,0,50,0,0 +37,2,222450,11,3,1,8,1,0,0,0,0,40,4,0 +33,4,190027,5,10,0,0,4,1,1,0,0,18,0,0 +49,2,281647,0,13,1,5,1,0,0,0,0,45,0,1 +32,2,117963,1,9,1,2,1,0,0,0,0,45,0,0 +39,2,225504,3,14,0,3,0,0,0,0,0,40,0,0 +42,4,104334,1,9,1,7,1,0,0,0,0,40,22,0 +30,0,48214,3,14,1,3,2,0,1,0,0,50,0,1 +30,2,145714,9,11,0,3,0,0,0,0,0,40,0,0 +48,5,38240,1,9,1,7,1,0,0,0,0,40,0,1 +57,1,27385,0,13,1,5,1,0,0,0,0,10,0,0 +56,2,204254,12,6,2,4,4,1,1,0,0,45,0,0 +28,2,411587,5,10,0,11,3,0,0,0,0,40,6,0 +43,2,221172,0,13,1,9,1,0,0,0,0,24,0,1 +46,2,54190,1,9,1,10,1,0,0,0,0,60,0,0 +60,2,93997,0,13,1,1,1,0,0,15024,0,45,0,1 +50,4,24139,3,14,2,3,4,0,1,0,0,65,0,0 +37,2,112497,10,15,1,3,1,0,0,0,0,50,0,1 +41,2,138907,1,9,2,13,5,1,1,0,0,40,0,0 +38,2,186325,5,10,1,1,2,0,1,0,0,38,0,1 +23,2,199452,5,10,0,4,3,0,1,0,0,40,0,0 +59,2,126677,5,10,1,1,1,0,0,0,0,50,0,1 +72,2,107814,3,14,0,3,0,0,0,2329,0,60,0,0 +47,4,93618,5,10,2,0,0,0,1,0,0,33,0,0 +29,2,353352,9,11,0,10,5,0,0,0,0,40,0,0 +35,2,143058,0,13,1,3,1,0,0,0,0,60,0,0 +24,2,239663,5,10,1,0,1,0,0,0,0,15,0,0 +22,2,167615,1,9,0,5,4,0,1,0,0,40,0,0 +24,2,442274,1,9,0,1,3,0,0,0,0,40,0,0 +42,2,149210,0,13,1,3,1,0,0,7298,0,45,0,1 +40,0,50093,3,14,2,3,4,0,1,0,0,20,0,0 +61,2,270056,1,9,2,0,0,2,1,0,0,40,28,0 +58,1,131991,0,13,0,7,3,0,0,0,0,72,0,0 +39,0,126336,1,9,2,3,0,0,0,0,0,40,0,0 +45,1,341117,5,10,2,3,0,0,1,0,0,50,0,0 +25,2,108505,1,9,0,2,0,0,0,0,0,45,0,0 +34,2,24266,9,11,1,10,1,0,0,7688,0,40,0,1 +45,2,267967,0,13,1,3,1,0,0,0,0,45,0,1 +28,2,102533,5,10,4,2,0,1,0,0,0,40,0,0 +27,2,69757,5,10,0,0,0,0,1,0,0,60,0,0 +41,0,210094,1,9,0,4,0,0,1,0,0,40,0,0 +18,0,389147,1,9,0,5,0,1,1,0,0,30,0,0 +44,2,210648,0,13,1,9,1,0,0,0,0,40,0,1 +47,2,94809,9,11,1,1,2,0,1,0,0,45,0,1 +36,4,298717,1,9,1,1,1,0,0,0,0,40,0,0 +66,2,236879,13,1,6,13,5,0,1,0,0,40,24,0 +33,2,170148,1,9,2,0,4,0,1,0,0,45,0,0 +39,4,166497,1,9,2,2,0,0,0,0,0,40,0,1 +30,2,247156,1,9,0,6,3,1,0,0,0,40,0,0 +34,1,204052,1,9,1,10,1,0,0,0,0,40,0,1 +62,1,122246,3,14,2,3,4,0,1,0,0,32,0,0 +21,2,180339,5,10,0,0,0,0,1,0,0,45,0,0 +50,5,155574,3,14,1,3,1,0,0,7298,0,50,0,1 +30,2,114912,0,13,1,1,1,0,0,3103,0,60,0,1 +43,2,193882,1,9,1,1,1,0,0,0,0,40,0,1 +19,2,112269,5,10,0,4,5,0,1,0,0,40,0,0 +26,3,171928,9,11,0,10,3,0,0,0,0,50,28,0 +50,2,95435,7,4,1,6,1,0,0,0,1579,65,8,0 +45,3,179638,3,14,2,1,0,0,0,0,0,40,0,1 +46,5,125892,3,14,1,5,1,0,0,0,0,50,0,1 +17,2,721712,12,6,0,4,3,0,0,0,0,15,0,0 +56,2,197369,7,4,1,1,1,0,0,0,0,40,0,1 +25,2,353795,5,10,1,0,2,1,1,3103,0,40,0,1 +47,2,334679,3,14,4,8,4,2,1,0,0,42,3,0 +23,2,235853,1,9,1,5,1,0,0,0,0,45,0,0 +51,1,353281,1,9,4,4,4,0,1,0,0,20,0,0 +19,2,203061,5,10,0,9,0,0,1,0,0,25,0,0 +33,1,62932,1,9,1,10,1,0,0,0,0,40,0,0 +32,2,118551,1,9,2,4,4,0,1,0,0,80,0,0 +52,2,99184,1,9,2,6,0,0,0,0,0,40,0,0 +36,2,189674,5,10,4,4,5,1,1,0,0,40,0,0 +34,2,226883,1,9,2,10,0,0,0,0,0,40,0,0 +26,5,66872,14,8,1,5,1,4,0,0,0,98,21,0 +35,4,268292,5,10,1,10,1,0,0,0,0,40,0,0 +58,3,139290,0,13,1,0,1,0,0,0,0,40,0,1 +32,2,206541,2,7,2,10,3,0,0,0,0,50,0,0 +23,2,203139,5,10,0,4,5,0,1,0,0,40,0,0 +28,1,294398,5,10,0,8,0,1,0,0,0,40,0,0 +20,2,386864,12,6,0,4,5,0,0,0,0,35,4,0 +17,2,369909,12,6,0,4,3,0,0,0,0,20,0,0 +56,2,89922,1,9,1,6,1,0,0,3103,0,45,0,1 +26,2,176008,1,9,2,0,3,0,1,0,0,40,0,0 +43,0,241506,0,13,2,3,4,0,1,1506,0,36,0,0 +45,1,174426,5,10,0,3,0,0,0,0,0,35,0,0 +34,2,167497,5,10,1,1,2,0,1,7688,0,50,0,1 +54,2,292673,15,2,1,4,1,0,0,0,0,35,4,0 +51,4,134808,1,9,6,4,4,0,1,0,0,40,0,0 +58,1,95763,5,10,1,7,1,0,0,0,0,60,0,0 +49,2,83622,6,12,4,0,0,0,1,2597,0,40,0,0 +21,2,222490,9,11,0,0,3,0,1,0,0,40,0,0 +44,2,29115,5,10,0,4,0,0,1,0,0,40,0,0 +26,2,66638,0,13,0,1,0,0,1,0,0,50,0,0 +39,2,53926,0,13,1,3,1,0,0,0,0,40,0,0 +37,2,104359,5,10,1,2,1,0,0,0,0,40,0,0 +49,2,124604,1,9,2,0,0,0,0,0,0,32,0,0 +45,2,114797,1,9,4,8,4,1,1,0,0,40,0,0 +60,3,67320,1,9,0,0,0,1,1,0,0,40,0,0 +28,3,53147,0,13,0,1,0,1,0,0,0,40,0,0 +23,2,13769,5,10,1,8,1,3,0,0,0,30,0,0 +44,2,202872,0,13,0,3,0,0,1,0,0,45,0,0 +19,0,149528,5,10,0,7,3,0,0,0,0,12,0,0 +37,2,132879,1,9,1,1,1,0,0,0,0,40,0,1 +41,1,112362,1,9,1,7,1,0,0,0,0,38,0,0 +56,3,156229,0,13,1,1,1,0,0,7688,0,40,0,1 +44,2,131650,6,12,1,1,1,0,0,0,0,54,0,1 +30,2,154568,0,13,1,10,1,2,0,0,0,36,36,1 +23,2,132300,0,13,0,5,0,0,1,0,0,40,0,0 +44,2,124747,1,9,1,1,2,0,1,3103,0,40,0,1 +38,2,276559,1,9,1,1,1,0,0,7688,0,70,0,1 +32,2,106014,5,10,1,5,1,0,0,5178,0,50,0,1 +57,1,135134,3,14,0,7,0,0,0,0,0,20,0,0 +35,2,86648,10,15,1,3,1,0,0,7688,0,50,0,1 +48,1,107231,0,13,1,1,1,0,0,99999,0,50,0,1 +32,4,113838,5,10,1,11,1,0,0,0,0,99,0,0 +76,3,25319,3,14,6,3,0,0,1,0,0,15,0,0 +57,4,190561,1,9,2,2,0,1,1,0,0,30,0,0 +51,2,48343,3,14,1,1,1,0,0,7298,0,50,0,1 +50,2,211116,12,6,1,4,1,1,0,0,0,40,0,0 +38,2,226311,1,9,5,4,2,0,1,0,0,25,0,0 +53,2,283743,1,9,1,6,1,0,0,0,2002,40,0,0 +59,1,64102,7,4,1,10,1,0,0,0,0,20,0,0 +23,2,234663,1,9,0,6,3,0,0,0,0,40,0,0 +44,2,247880,9,11,2,1,0,0,0,8614,0,40,0,1 +23,2,615367,0,13,0,5,0,0,1,0,0,40,0,0 +23,2,163090,6,12,0,5,3,0,0,0,0,20,0,0 +44,2,192225,0,13,1,1,1,0,0,0,0,40,0,1 +30,2,370183,1,9,1,9,1,0,0,0,0,40,0,0 +28,2,242482,1,9,1,5,1,0,0,0,0,40,0,0 +46,2,169953,5,10,2,1,0,0,1,0,0,40,0,0 +34,4,144182,13,1,0,0,3,1,1,0,0,25,0,0 +38,2,125933,0,13,4,1,0,0,0,27828,0,45,0,1 +26,2,203777,5,10,0,5,0,1,1,0,0,37,0,0 +39,2,210991,1,9,1,10,1,0,0,0,0,40,0,0 +28,2,472580,5,10,0,5,3,1,0,0,0,40,0,0 +33,0,200289,3,14,1,3,1,2,0,0,0,19,3,0 +43,2,289669,3,14,2,3,4,0,1,0,2547,40,0,1 +30,2,110622,0,13,2,1,0,2,1,0,0,40,26,0 +59,0,139616,3,14,1,1,1,0,0,0,0,50,0,1 +26,2,39212,1,9,1,8,1,0,0,0,0,45,0,0 +28,2,51961,5,10,0,9,3,1,0,0,0,24,0,0 +48,1,117849,5,10,0,4,0,0,0,0,0,40,0,0 +49,2,50748,0,13,6,3,4,0,1,1506,0,35,0,0 +41,1,170214,1,9,1,2,1,0,0,0,2179,40,0,0 +20,2,151790,5,10,0,0,3,0,1,0,0,30,0,0 +49,2,168211,1,9,1,11,1,0,0,0,0,40,0,1 +37,0,117651,0,13,0,3,5,0,0,0,0,40,0,0 +18,2,157131,14,8,0,5,3,0,1,0,0,8,0,0 +61,2,225970,1,9,1,9,1,0,0,0,0,40,0,1 +26,2,177951,1,9,1,2,1,0,0,0,0,48,0,0 +66,2,134130,0,13,6,4,0,0,0,0,0,12,0,0 +68,2,191581,3,14,0,3,0,0,1,3273,0,40,0,0 +27,4,199172,1,9,1,11,2,0,1,0,0,40,0,0 +66,1,262552,5,10,1,7,1,0,0,0,0,7,0,0 +28,2,66434,12,6,0,4,4,0,1,0,0,15,0,0 +26,2,77661,0,13,0,3,0,0,1,0,0,40,0,0 +46,2,192835,5,10,1,6,1,0,0,0,0,48,0,0 +35,2,200445,1,9,0,8,3,0,0,0,1974,40,0,0 +26,1,37918,1,9,0,7,3,0,0,0,0,60,0,0 +40,2,111020,1,9,4,8,0,0,1,0,0,40,0,0 +31,2,244665,5,10,0,1,0,0,0,0,0,45,6,0 +52,2,312477,1,9,6,6,0,0,0,0,0,40,0,0 +61,1,243493,1,9,1,4,1,1,0,0,0,12,0,0 +39,0,152023,2,7,1,10,1,0,0,0,0,40,0,0 +25,2,104193,1,9,0,4,3,0,1,114,0,40,0,0 +47,2,170850,0,13,1,9,1,0,0,0,0,48,0,0 +33,2,137088,0,13,1,8,1,4,0,0,0,40,16,0 +17,2,340557,2,7,0,4,3,0,0,0,0,25,0,0 +26,2,298225,1,9,1,0,1,0,0,0,0,45,0,0 +25,2,114150,1,9,0,2,5,0,0,0,0,40,0,0 +39,1,194668,1,9,1,1,1,0,0,0,0,16,0,0 +33,2,188246,3,14,1,1,1,0,0,7298,0,45,0,1 +46,3,330901,5,10,1,1,1,1,0,0,0,40,0,0 +27,2,80165,5,10,4,0,4,0,1,0,0,20,0,0 +48,2,83444,1,9,1,3,1,0,0,7298,0,40,0,1 +29,1,85572,2,7,1,4,2,0,1,0,0,5,0,0 +40,2,116632,0,13,0,5,3,0,0,0,0,40,0,0 +24,2,139989,0,13,0,5,3,1,0,0,0,40,0,0 +55,2,135803,0,13,1,1,1,4,0,0,1579,35,3,0 +56,2,75785,1,9,1,1,1,0,0,0,0,40,0,1 +25,2,248612,6,12,0,10,0,0,0,0,0,30,0,0 +36,2,28572,5,10,1,10,1,0,0,0,0,50,0,0 +26,1,31143,1,9,1,1,1,0,0,0,0,45,0,0 +37,2,216924,1,9,1,2,1,0,0,0,0,44,0,1 +36,2,549174,1,9,1,10,1,0,0,0,0,40,0,0 +23,1,111296,2,7,0,10,3,0,0,0,0,50,4,0 +25,2,208881,0,13,1,3,1,0,0,0,0,60,0,0 +36,0,243666,1,9,2,0,3,1,1,0,0,40,0,0 +39,5,131288,6,12,1,5,1,0,0,5178,0,48,0,1 +35,2,257416,9,11,0,10,3,1,0,0,0,40,0,0 +33,2,215288,2,7,0,2,3,1,0,0,0,40,0,0 +31,2,58582,5,10,0,10,0,0,0,0,0,46,0,0 +49,2,199378,5,10,1,3,1,0,0,0,0,22,0,0 +40,2,137421,1,9,1,6,1,2,0,0,0,60,33,0 +27,2,216481,5,10,6,0,4,0,1,0,0,40,0,0 +50,1,196504,8,16,1,3,1,0,0,0,0,23,0,0 +38,2,357870,14,8,0,8,0,1,1,0,0,50,0,0 +55,0,256335,0,13,2,1,4,1,0,0,0,40,0,0 +49,1,168191,7,4,1,4,1,0,0,0,0,70,25,0 +40,2,215596,0,13,3,4,0,4,0,0,0,40,4,0 +42,2,184682,9,11,2,9,0,0,1,0,0,30,0,0 +51,2,171914,0,13,1,3,1,0,0,0,0,50,0,1 +27,2,288229,0,13,0,0,3,2,1,0,0,50,17,0 +30,0,144064,1,9,1,11,1,0,0,0,0,40,0,1 +40,2,141583,12,6,0,4,4,1,1,0,0,40,0,0 +43,1,180985,0,13,4,10,4,0,0,0,0,35,0,0 +24,2,148709,1,9,0,4,0,0,1,0,0,40,0,0 +38,2,184801,0,13,1,5,1,0,0,0,0,60,0,1 +52,2,89054,1,9,1,10,1,0,0,0,0,40,0,0 +32,2,147284,9,11,1,5,1,0,0,0,0,50,0,1 +33,2,169973,9,11,4,11,0,0,1,0,0,40,0,0 +21,2,222993,1,9,0,8,3,0,0,0,0,40,0,0 +27,2,41099,5,10,0,5,0,0,0,0,0,50,0,0 +31,2,33117,1,9,2,1,0,0,0,0,0,50,0,0 +29,2,162551,3,14,1,3,2,2,1,0,0,40,37,1 +49,2,122066,11,3,1,4,1,0,0,0,2603,40,34,0 +46,2,389843,0,13,1,5,1,0,0,0,0,50,9,1 +37,2,138940,2,7,1,10,1,0,0,0,0,40,0,0 +56,3,141877,0,13,1,0,1,0,0,0,0,40,0,1 +37,2,172722,5,10,1,10,1,0,0,0,0,40,0,0 +26,1,118523,1,9,1,0,1,0,0,0,0,40,0,0 +31,2,227886,5,10,0,0,4,1,1,0,0,35,0,0 +36,2,80743,1,9,1,4,2,2,1,0,0,40,27,0 +52,2,199688,12,6,1,2,1,0,0,0,0,45,0,0 +40,2,225823,5,10,2,10,0,0,0,0,0,60,0,0 +21,2,176486,1,9,3,1,5,0,1,0,0,60,0,0 +63,2,175777,12,6,4,8,0,1,0,0,0,40,0,0 +30,2,295010,1,9,0,0,0,0,1,0,0,40,0,0 +30,2,437825,0,13,1,5,1,0,0,0,0,20,30,0 +50,2,270194,0,13,1,1,1,0,0,0,0,60,0,0 +41,2,242089,3,14,1,1,1,0,0,0,0,45,0,0 +39,5,117555,0,13,1,1,1,0,0,0,0,60,0,1 +23,2,146499,1,9,4,8,4,0,1,0,0,48,0,0 +52,2,222405,1,9,1,5,1,1,0,0,2377,40,0,0 +46,2,157991,9,11,2,9,4,1,1,0,625,40,0,0 +26,2,373553,5,10,1,0,2,0,1,0,0,42,0,0 +30,2,194827,5,10,1,10,1,0,0,0,1740,40,0,0 +23,2,60331,5,10,2,1,0,0,0,0,0,50,0,0 +21,0,96483,5,10,0,0,3,2,1,0,0,12,0,0 +39,2,211154,1,9,1,6,1,0,0,0,0,55,0,0 +37,4,247750,9,11,1,11,1,1,0,0,0,40,0,0 +40,1,204235,3,14,1,1,1,0,0,99999,0,50,0,1 +38,2,197113,5,10,2,0,4,1,1,0,0,20,0,0 +47,2,178341,0,13,1,5,1,0,0,4064,0,60,0,0 +20,2,293297,5,10,0,4,3,0,0,0,0,35,0,0 +35,2,35330,1,9,1,10,1,0,0,0,0,40,0,0 +62,0,202056,0,13,2,3,0,0,0,14084,0,40,0,1 +32,2,61898,2,7,2,4,4,0,1,0,0,15,0,0 +42,5,1097453,0,13,1,5,1,0,0,0,0,60,0,1 +32,2,176992,12,6,0,10,4,0,0,0,0,40,0,0 +27,2,295289,5,10,0,4,3,1,1,0,0,30,0,0 +53,5,298215,0,13,1,5,1,0,0,0,0,45,0,1 +28,1,209934,11,3,1,2,1,0,0,0,0,25,4,0 +26,2,164938,1,9,1,5,1,0,0,0,0,40,0,0 +47,2,423222,10,15,1,1,1,0,0,0,0,45,0,1 +23,2,124259,5,10,0,11,3,1,1,0,0,40,0,0 +70,5,232871,5,10,1,1,1,0,0,0,0,30,0,0 +41,0,73199,0,13,1,1,1,2,0,0,0,40,0,0 +43,0,27661,3,14,0,3,0,0,0,0,0,45,0,0 +40,1,89413,1,9,1,10,1,0,0,0,1672,40,0,0 +64,1,31826,1,9,1,1,1,0,0,0,0,45,0,1 +40,2,279679,5,10,2,1,0,0,0,0,0,45,0,0 +43,2,221172,0,13,2,1,0,0,0,0,0,35,0,0 +50,3,222020,1,9,1,0,1,0,0,0,0,48,0,0 +32,2,204792,2,7,1,7,1,0,0,0,0,40,0,0 +42,2,384508,2,7,2,5,4,0,0,1506,0,50,4,0 +41,2,288568,1,9,1,10,1,0,0,0,0,40,0,1 +30,2,182714,5,10,0,1,0,0,1,0,0,40,7,0 +20,2,471452,5,10,0,4,3,0,0,0,0,30,0,0 +45,0,264052,1,9,1,10,1,0,0,0,0,40,0,0 +42,2,146659,8,16,1,3,1,0,0,0,1902,50,0,1 +24,2,203027,6,12,0,8,3,0,0,0,0,40,0,0 +43,2,218309,0,13,2,5,0,0,1,0,0,50,0,0 +28,2,133625,1,9,1,6,1,1,0,0,0,40,0,0 +35,2,45937,1,9,0,8,0,0,1,0,0,40,0,0 +38,3,201617,1,9,0,0,4,0,1,0,0,40,0,0 +32,4,114733,0,13,2,3,4,0,1,0,0,35,0,0 +50,0,97778,1,9,1,11,1,0,0,0,0,40,0,0 +34,2,149507,1,9,1,10,1,0,0,0,0,55,0,1 +35,2,82622,1,9,0,4,3,0,0,0,0,40,0,0 +30,2,48014,3,14,0,0,0,0,1,0,0,40,23,0 +61,0,162678,11,3,1,6,1,0,0,0,0,40,0,0 +27,2,213842,0,13,0,0,3,0,0,0,0,38,0,0 +61,2,221447,1,9,0,8,0,1,1,0,0,40,0,0 +18,2,426836,11,3,0,2,5,0,0,0,0,40,4,0 +31,4,206609,1,9,1,11,1,0,0,0,0,40,0,1 +31,2,50276,0,13,2,3,0,0,0,0,0,60,0,0 +20,2,180497,1,9,0,4,0,1,1,0,0,40,0,0 +35,2,220585,14,8,1,6,1,0,0,0,0,40,0,0 +51,2,202752,1,9,0,10,0,1,0,0,0,40,0,0 +43,2,75993,5,10,1,5,1,0,0,7688,0,40,0,1 +18,2,170544,2,7,0,2,3,0,0,0,0,20,0,0 +55,2,115439,10,15,1,1,1,0,0,99999,0,40,0,1 +59,2,24384,1,9,6,13,0,0,1,0,0,40,0,0 +21,2,209067,1,9,0,4,3,0,1,0,0,40,0,0 +22,2,65225,12,6,0,4,3,0,1,0,0,40,0,0 +60,3,27466,5,10,6,1,0,0,1,0,0,40,7,0 +49,3,179869,1,9,1,10,1,0,0,0,0,40,0,1 +21,2,442131,1,9,0,2,3,0,1,0,0,40,0,0 +61,2,243283,1,9,1,8,1,0,0,0,0,40,0,0 +64,2,316627,11,3,2,10,0,0,0,0,0,40,0,0 +63,2,208862,1,9,0,10,0,0,0,0,0,40,0,0 +27,3,38645,0,13,0,1,0,0,1,0,0,40,0,0 +23,2,141272,0,13,0,4,3,1,1,0,0,30,0,0 +41,0,29324,1,9,2,1,4,0,1,0,0,45,0,0 +40,2,124747,1,9,1,10,2,0,1,7298,0,40,0,1 +55,1,477867,0,13,1,1,1,0,0,0,0,40,0,1 +17,2,218361,12,6,0,4,3,0,1,0,1602,12,0,0 +34,1,156809,5,10,0,10,0,0,0,0,1504,60,0,0 +24,2,267945,0,13,0,0,3,0,1,0,0,40,0,0 +30,2,35724,10,15,1,3,2,0,1,0,0,45,0,1 +29,2,187188,3,14,0,1,0,2,0,0,0,60,0,0 +52,2,155983,0,13,1,1,1,0,0,0,0,40,0,1 +57,3,414994,5,10,1,1,1,0,0,0,0,40,0,1 +38,2,103474,0,13,0,9,0,0,1,0,0,45,0,0 +43,2,211128,3,14,2,1,0,0,1,0,0,50,0,1 +61,2,203445,5,10,6,0,5,0,1,0,0,40,0,0 +38,2,38312,0,13,1,1,1,0,0,15024,0,65,0,1 +51,2,178241,1,9,1,8,1,1,0,0,0,40,0,1 +40,2,260761,0,13,1,0,1,0,0,0,0,40,4,0 +41,4,36924,5,10,1,0,1,0,0,0,0,40,0,1 +19,2,292590,5,10,0,4,3,0,1,0,0,20,0,0 +28,2,461929,7,4,1,7,1,0,0,0,0,40,4,0 +59,2,189664,5,10,1,5,1,0,0,0,0,40,0,0 +32,0,190577,0,13,0,3,3,0,1,0,0,40,0,0 +31,2,344200,1,9,1,1,1,0,0,0,0,40,0,1 +30,2,337494,6,12,0,8,0,0,0,0,0,48,0,0 +54,1,52634,5,10,1,5,1,0,0,0,0,40,0,0 +33,2,194901,9,11,4,10,0,0,0,0,2444,42,0,1 +20,2,170091,5,10,0,0,3,0,1,0,0,10,0,0 +32,1,205072,1,9,1,6,1,0,0,0,0,48,0,0 +35,2,310290,1,9,1,6,2,1,1,0,0,40,0,0 +27,2,134048,2,7,0,10,0,0,0,0,0,45,0,0 +40,2,91959,0,13,1,3,1,0,0,0,0,46,0,1 +34,2,153942,9,11,1,5,1,0,0,0,0,40,0,0 +34,4,234096,6,12,1,3,1,0,0,0,0,40,0,1 +38,2,185330,5,10,0,10,3,0,1,0,0,25,0,0 +28,2,163772,1,9,1,4,1,4,0,0,0,40,0,0 +65,2,83800,5,10,1,2,1,0,0,0,0,27,0,0 +61,2,139391,5,10,0,9,3,0,0,0,0,16,0,0 +18,2,478380,2,7,0,5,3,0,1,0,0,25,0,0 +35,5,186845,0,13,1,5,3,0,0,5178,0,50,0,1 +45,2,262802,0,13,2,1,4,0,1,0,0,40,0,0 +25,2,114483,5,10,1,1,1,0,0,0,0,50,0,0 +48,2,118023,10,15,2,5,0,0,0,0,0,13,0,0 +19,2,220101,5,10,0,0,0,0,1,0,0,40,0,0 +43,2,219424,0,13,0,1,0,1,1,0,0,50,0,1 +54,2,186117,0,13,1,10,1,0,0,0,0,45,0,1 +47,1,479611,0,13,2,5,0,0,0,0,0,50,0,0 +25,2,80312,9,11,0,0,0,0,1,4865,0,40,0,0 +30,2,108386,6,12,1,10,1,0,0,0,0,40,0,0 +35,2,177102,1,9,2,2,4,0,1,0,0,40,0,0 +26,2,190762,5,10,1,5,1,0,0,0,0,18,0,0 +61,2,180632,1,9,1,5,1,0,0,0,0,40,0,0 +54,2,88019,1,9,2,4,4,0,0,0,0,32,0,0 +50,2,135339,14,8,1,5,1,2,0,0,0,40,14,1 +32,2,100662,4,5,4,8,4,0,1,0,0,40,13,0 +34,2,183557,1,9,2,8,0,0,1,0,0,25,0,0 +36,2,160035,1,9,0,4,0,0,0,0,0,40,0,0 +50,2,306790,5,10,1,10,1,0,0,0,0,40,0,1 +28,2,269246,2,7,1,7,1,0,0,0,0,40,0,0 +22,2,308334,1,9,0,4,3,0,1,0,0,19,0,0 +58,2,215190,2,7,1,4,1,0,0,0,0,20,0,0 +27,2,419146,11,3,0,4,0,0,0,0,0,75,4,0 +62,2,176839,0,13,1,9,1,0,0,0,0,38,0,0 +36,5,184456,0,13,0,9,0,0,0,27828,0,55,0,1 +21,4,309348,5,10,0,0,0,0,1,594,0,4,0,0 +41,2,56795,3,14,1,3,2,0,1,0,0,45,7,0 +28,2,201861,5,10,1,8,1,0,0,0,0,45,0,0 +33,2,179509,0,13,1,2,1,0,0,0,0,40,0,0 +54,2,291755,0,13,1,1,1,0,0,0,0,45,0,1 +19,2,243941,5,10,0,5,3,3,1,0,1721,25,0,0 +76,1,117169,7,4,0,7,0,0,0,0,0,30,0,0 +34,2,159322,0,13,1,1,1,0,0,0,0,50,0,1 +40,2,262872,0,13,0,0,0,0,1,0,0,40,0,0 +22,2,187052,2,7,0,5,4,0,1,0,0,30,0,0 +17,2,277583,2,7,0,2,3,0,0,0,0,15,0,0 +55,2,169071,5,10,2,4,0,0,1,0,0,20,0,0 +51,4,96190,5,10,1,0,2,0,1,0,0,40,0,0 +26,2,61603,11,3,1,2,1,4,0,0,0,40,4,0 +44,2,43711,0,13,0,4,0,0,0,0,0,48,0,0 +54,2,99434,1,9,1,1,1,0,0,0,0,40,0,1 +34,1,177639,6,12,0,10,0,0,0,0,0,40,0,0 +42,2,201723,1,9,2,0,4,0,0,0,0,40,0,0 +26,2,222248,1,9,0,10,0,0,0,0,0,70,0,0 +39,2,86143,11,3,1,4,1,2,0,0,0,40,11,0 +34,2,346034,0,13,0,4,0,0,0,0,0,40,22,0 +59,2,87510,1,9,2,10,0,0,0,0,0,40,0,0 +20,2,37932,1,9,0,4,3,0,0,0,0,50,0,0 +34,2,185063,5,10,1,8,1,0,0,0,0,45,0,1 +51,2,159755,1,9,1,10,1,0,0,0,0,20,0,0 +34,2,108837,5,10,1,2,1,0,0,0,0,40,0,1 +47,2,110669,0,13,4,3,4,0,1,0,0,50,0,0 +30,1,45427,9,11,2,10,0,0,0,0,0,49,0,0 +38,2,154669,1,9,4,5,0,0,0,0,0,60,0,0 +45,2,261278,0,13,1,3,2,2,1,5178,0,40,11,1 +23,2,71864,5,10,0,1,0,0,1,0,0,35,0,0 +34,2,173495,5,10,1,10,1,0,0,0,0,48,0,1 +22,2,254293,14,8,0,2,0,0,0,0,0,40,0,0 +31,2,111883,1,9,0,10,5,0,0,0,0,40,0,0 +50,2,146429,1,9,1,10,1,0,0,0,0,40,0,0 +19,2,472807,15,2,0,2,5,0,0,0,0,52,4,0 +28,2,285294,0,13,1,5,2,1,1,15024,0,45,0,1 +23,2,184665,1,9,0,0,0,0,1,0,0,50,0,0 +35,2,205852,1,9,1,2,1,0,0,0,0,40,0,0 +28,2,83879,1,9,1,8,1,1,0,0,0,40,0,0 +27,2,178564,5,10,0,0,3,0,0,0,0,30,0,0 +46,5,168796,0,13,1,5,1,0,0,0,0,55,0,0 +27,2,269444,1,9,2,2,0,0,0,0,0,40,0,0 +25,2,47353,12,6,1,4,2,0,1,0,0,40,0,0 +34,5,29254,5,10,1,10,1,0,0,0,0,70,0,0 +33,2,155343,1,9,0,8,4,0,0,0,0,40,0,0 +36,2,234271,5,10,0,10,0,0,1,0,0,40,0,0 +30,2,257849,7,4,1,10,1,0,0,0,0,48,0,0 +23,2,228230,5,10,1,5,2,0,1,0,0,47,0,0 +36,2,227615,11,3,3,10,5,0,0,0,0,32,4,0 +29,2,406826,0,13,0,3,0,0,1,0,0,45,0,0 +50,1,27539,5,10,1,7,1,0,0,7688,0,40,0,1 +19,2,97261,14,8,0,2,0,0,0,0,0,40,0,0 +52,3,168539,1,9,1,8,1,0,0,0,0,40,0,1 +20,2,515797,1,9,1,10,1,0,0,0,0,40,0,0 +22,2,351381,9,11,0,0,0,0,1,0,0,40,0,0 +34,2,161018,5,10,1,5,1,0,0,0,0,55,0,1 +60,2,26721,5,10,1,10,1,0,0,0,0,40,0,0 +19,2,164123,2,7,0,4,0,1,0,0,0,40,0,0 +59,1,98418,1,9,1,7,1,0,0,0,0,20,0,0 +36,2,29814,1,9,0,6,5,0,0,0,0,50,0,0 +25,2,254613,1,9,0,10,3,0,0,0,0,40,1,0 +49,2,207677,7,4,2,10,0,0,0,0,0,70,0,0 +25,1,217030,1,9,0,4,4,0,1,0,0,30,0,0 +50,2,171199,2,7,2,4,4,0,1,0,0,40,0,0 +44,2,198270,6,12,2,3,0,0,1,0,0,43,0,0 +33,2,79923,5,10,1,5,1,0,0,0,0,20,0,0 +40,5,475322,0,13,4,10,3,0,0,0,0,50,0,0 +56,2,134286,5,10,1,1,1,0,0,0,0,45,0,0 +56,1,73746,5,10,1,1,1,0,0,0,0,50,0,1 +23,2,125525,0,13,0,3,3,0,0,0,0,42,0,0 +21,2,304949,5,10,0,3,3,0,1,0,0,10,0,0 +67,2,150516,7,4,1,10,1,0,0,0,0,24,0,0 +54,0,249096,9,11,1,11,1,0,0,0,0,40,0,0 +50,4,164127,1,9,0,4,0,1,1,0,0,40,0,0 +59,2,304779,7,4,1,8,1,0,0,0,0,40,0,0 +51,2,157043,2,7,6,2,4,1,1,0,0,40,0,0 +30,2,396538,1,9,4,1,4,0,1,0,0,29,0,0 +42,2,510072,1,9,1,10,1,0,0,0,0,40,0,1 +26,2,89326,0,13,0,5,0,0,0,0,0,40,0,0 +47,2,200471,9,11,1,0,1,0,0,4064,0,40,0,0 +78,1,82815,5,10,1,10,1,0,0,0,0,3,0,1 +24,1,117210,1,9,2,10,0,0,0,0,0,50,0,0 +27,2,202206,2,7,4,7,5,0,0,0,0,40,5,0 +51,2,123429,3,14,1,1,1,0,0,0,0,50,0,1 +46,2,353512,1,9,1,8,1,0,0,0,0,40,0,1 +55,1,26683,1,9,1,7,1,0,0,0,0,60,0,0 +20,2,204641,5,10,0,4,3,0,0,0,0,40,0,0 +30,2,225053,1,9,1,1,1,0,0,0,0,50,0,0 +19,2,263932,1,9,0,4,3,0,1,0,0,20,0,0 +30,2,108247,0,13,1,3,1,0,0,0,0,40,0,1 +31,1,369648,6,12,1,10,0,0,0,0,0,50,0,1 +26,2,339324,1,9,1,8,1,0,0,0,0,96,0,0 +53,2,317313,1,9,1,6,1,0,0,0,0,60,0,1 +24,4,162919,5,10,0,0,0,0,1,0,0,40,0,0 +24,2,186314,5,10,4,3,3,0,0,0,0,54,0,0 +36,2,254202,1,9,2,1,4,0,1,0,0,50,0,0 +39,2,108140,3,14,1,1,1,0,0,0,0,50,0,1 +53,2,287317,1,9,2,8,4,1,0,0,0,32,0,0 +75,5,81534,1,9,6,5,5,2,0,0,0,35,0,1 +36,2,35945,1,9,1,1,1,0,0,0,0,50,0,1 +46,5,204928,5,10,1,5,1,0,0,0,0,40,0,0 +56,5,208809,1,9,1,5,1,0,0,0,1902,40,0,1 +29,2,133625,1,9,1,2,1,1,0,0,0,40,0,0 +60,2,71683,4,5,1,8,1,0,0,0,0,49,0,0 +58,2,570562,1,9,6,5,0,0,0,0,0,38,0,0 +67,1,36876,1,9,1,7,1,0,0,0,0,55,0,0 +35,2,253006,5,10,1,3,1,0,0,7688,0,38,0,1 +39,1,50096,5,10,1,7,1,0,0,0,0,80,0,0 +37,2,336880,5,10,1,6,1,0,0,0,0,50,0,0 +63,1,168048,10,15,1,3,1,0,0,0,0,30,0,0 +47,2,187969,2,7,2,4,0,0,1,0,0,38,0,0 +23,2,117363,0,13,0,0,3,0,1,0,0,40,0,0 +55,2,256526,1,9,4,8,0,0,0,4865,0,45,0,0 +49,2,304416,2,7,1,5,2,0,1,0,0,40,0,0 +39,2,248011,9,11,1,8,1,0,0,5178,0,40,0,1 +23,2,229826,1,9,0,8,3,0,0,0,0,40,0,0 +19,2,159796,5,10,0,4,3,0,1,0,0,12,0,0 +44,2,165346,3,14,1,1,1,0,0,0,0,40,0,1 +25,2,25386,9,11,0,4,4,3,1,0,0,40,0,0 +35,2,491000,9,11,2,3,3,1,0,0,0,40,0,0 +23,4,247731,1,9,2,0,3,0,1,0,0,40,1,0 +48,2,180532,9,11,1,10,1,0,0,0,0,40,0,0 +48,2,189462,5,10,2,2,3,0,0,2176,0,40,0,0 +44,2,419134,1,9,2,0,4,1,1,0,0,40,0,0 +55,1,170166,0,13,1,1,2,0,1,0,0,25,0,0 +33,1,173495,1,9,1,10,1,0,0,0,0,50,0,0 +18,2,423024,14,8,0,2,3,0,0,0,0,20,0,0 +24,2,72119,0,13,0,0,3,0,0,2202,0,30,0,0 +32,4,19302,6,12,1,11,1,0,0,0,0,56,7,1 +24,0,257621,0,13,0,3,0,0,1,0,0,20,0,0 +44,5,118212,0,13,1,1,1,0,0,99999,0,70,0,1 +27,2,259840,0,13,1,0,1,0,0,0,0,45,0,0 +39,2,115289,6,12,1,9,1,0,0,0,0,40,23,1 +26,4,159662,12,6,1,4,1,0,0,0,0,40,0,0 +34,2,379798,3,14,1,1,1,0,0,0,0,40,0,1 +38,2,227945,3,14,1,3,1,0,0,99999,0,65,0,1 +41,0,36999,3,14,1,3,1,0,0,0,0,75,0,1 +32,5,124052,1,9,1,5,1,0,0,0,0,50,0,0 +56,4,273084,3,14,1,1,1,1,0,0,0,40,0,1 +59,2,170104,0,13,1,1,1,0,0,0,1977,50,0,1 +44,2,96249,5,10,1,5,1,0,0,0,0,60,0,1 +35,2,140915,0,13,0,5,3,2,0,0,1590,40,27,0 +52,2,230657,1,9,1,8,1,4,0,3781,0,40,13,0 +30,2,195576,5,10,0,3,3,0,0,3325,0,50,0,0 +23,2,117767,0,13,1,5,1,0,0,0,0,40,0,0 +43,2,112763,1,9,0,0,4,0,1,8614,0,43,0,1 +61,2,79827,1,9,1,1,1,0,0,0,0,50,0,0 +38,2,103925,1,9,0,0,4,0,1,0,0,35,0,0 +68,2,161744,12,6,1,5,1,0,0,0,0,16,0,0 +41,2,106679,3,14,0,1,0,0,0,27828,0,50,0,1 +42,1,196514,5,10,0,3,0,0,0,0,0,40,0,0 +19,2,157605,1,9,2,4,0,0,1,0,0,40,0,0 +31,2,137367,2,7,3,2,0,2,0,0,0,40,3,0 +40,5,110862,6,12,1,10,1,0,0,0,2377,50,0,0 +32,2,74883,0,13,0,9,0,2,1,0,0,40,11,0 +51,5,98642,1,9,2,1,0,0,0,14084,0,40,0,1 +44,4,144778,0,13,1,3,1,0,0,0,0,40,0,1 +23,2,177787,0,13,0,5,3,0,1,0,0,30,7,0 +44,2,162108,0,13,0,3,0,0,1,0,0,45,0,0 +24,2,217602,1,9,1,7,1,0,0,0,0,60,0,0 +34,2,473133,1,9,1,5,1,0,0,0,0,60,0,0 +61,2,80896,3,14,1,3,1,2,0,0,0,45,3,1 +30,4,168387,0,13,0,1,3,0,0,0,0,40,0,0 +45,2,38950,0,13,0,10,0,0,0,0,0,40,0,0 +22,2,107801,9,11,0,0,3,0,1,0,0,40,0,0 +49,2,191277,5,10,1,4,1,0,0,0,0,40,0,0 +39,2,205359,6,12,6,0,4,0,1,0,0,45,0,0 +34,2,203357,5,10,0,0,5,0,1,0,0,40,0,0 +52,4,153064,5,10,1,1,1,0,0,0,0,40,0,1 +24,2,202959,9,11,0,0,0,0,1,0,0,40,0,0 +38,2,105150,0,13,1,3,1,0,0,0,0,45,0,1 +19,2,238474,2,7,0,8,3,0,0,0,0,40,0,0 +24,2,1085515,1,9,0,4,0,0,1,0,0,30,0,0 +25,2,82560,6,12,0,4,3,0,0,0,0,43,0,0 +71,2,55965,7,4,6,6,0,0,0,0,0,10,0,0 +27,2,161087,1,9,1,3,2,1,1,0,0,40,0,0 +28,2,261278,9,11,0,9,0,1,1,0,0,40,0,0 +54,2,182187,9,11,1,11,1,1,0,15024,0,38,2,1 +18,2,138917,2,7,0,5,3,1,1,0,0,10,0,0 +49,2,200198,1,9,1,4,1,1,0,0,0,40,0,0 +36,2,205359,1,9,3,4,4,0,1,0,0,25,0,0 +57,2,250201,1,9,6,6,4,0,0,0,0,50,0,0 +56,3,67153,3,14,1,1,1,0,0,0,0,40,20,1 +17,2,244523,12,6,0,4,3,0,0,0,0,20,0,0 +30,2,236599,1,9,1,1,1,0,0,0,0,50,0,0 +41,2,108713,12,6,0,5,3,0,1,0,0,40,0,0 +26,2,177147,1,9,0,2,3,0,0,0,0,40,0,0 +61,2,129246,12,6,1,10,1,0,0,0,0,48,0,0 +24,2,145111,1,9,0,8,0,0,0,0,0,45,0,0 +44,2,62258,2,7,0,4,0,0,1,0,0,40,0,0 +38,0,108293,3,14,0,3,5,0,1,0,0,40,0,0 +25,2,97789,0,13,0,5,3,0,0,0,0,50,0,0 +34,2,111415,1,9,1,5,1,0,0,0,0,70,0,0 +38,2,374524,5,10,0,6,0,0,0,0,0,40,0,0 +42,2,287244,1,9,1,10,1,0,0,0,0,55,0,0 +48,2,278039,7,4,1,8,1,0,0,0,0,40,0,0 +38,2,98360,3,14,1,3,1,0,0,0,0,40,0,1 +52,2,317032,1,9,1,10,1,0,0,0,0,50,0,1 +55,0,294395,9,11,6,3,4,0,1,6849,0,40,0,0 +41,1,240900,1,9,2,7,5,0,0,0,0,20,0,0 +45,2,32896,11,3,0,8,3,0,1,0,0,35,0,0 +49,2,97411,7,4,0,8,0,2,0,0,0,45,17,0 +19,2,72355,5,10,0,4,0,0,0,0,0,20,0,0 +39,2,342448,0,13,1,0,1,0,0,0,0,45,0,0 +43,2,187702,5,10,0,4,0,0,0,2174,0,45,0,0 +42,2,303388,5,10,1,1,1,0,0,0,0,65,0,0 +17,2,112291,2,7,0,2,3,0,0,0,0,12,0,0 +30,2,208668,6,12,0,3,0,1,1,0,0,25,0,0 +61,4,28375,3,14,2,3,0,0,1,0,0,70,0,0 +48,2,207277,3,14,1,1,1,0,0,15024,0,40,0,1 +57,2,47857,1,9,1,6,1,0,0,0,0,40,0,1 +27,2,372500,11,3,1,2,1,0,0,0,0,45,4,0 +24,2,190968,1,9,1,5,1,0,0,0,0,48,0,0 +41,2,37997,14,8,2,6,0,0,0,0,0,84,0,1 +42,2,257328,1,9,6,6,4,0,0,0,0,40,0,0 +34,2,127610,0,13,0,3,3,0,1,0,0,15,0,0 +47,2,164423,1,9,2,1,4,0,1,0,0,43,0,0 +50,2,104501,1,9,0,0,0,0,0,0,1980,40,0,0 +30,2,56121,1,9,0,10,0,0,0,0,0,40,0,0 +38,2,296212,0,13,1,10,1,0,0,0,0,45,0,0 +31,2,157640,1,9,1,3,1,0,0,0,0,55,0,1 +44,2,222504,5,10,1,0,2,0,1,0,0,45,0,1 +34,2,261023,5,10,1,10,1,0,0,0,1651,38,0,0 +52,2,146567,1,9,2,8,0,1,0,14344,0,40,0,1 +34,2,116910,1,9,1,10,1,0,0,0,0,50,0,0 +31,2,132601,5,10,1,1,1,0,0,0,0,40,0,0 +68,2,185537,5,10,2,5,0,0,1,0,0,20,0,0 +22,2,500720,1,9,0,0,3,0,1,0,0,40,4,0 +42,2,182108,0,13,0,1,0,0,1,0,0,35,0,0 +37,2,231491,1,9,1,10,1,0,0,0,0,35,0,0 +36,1,239415,1,9,1,7,1,0,0,0,0,35,0,0 +38,2,179262,5,10,2,0,4,0,1,0,0,30,0,0 +72,6,121004,1,9,1,4,1,0,0,0,0,55,0,0 +40,2,252392,11,3,1,4,1,0,0,0,0,40,4,0 +19,2,163578,5,10,0,5,3,0,0,0,0,30,0,0 +55,2,143266,9,11,1,10,1,0,0,0,0,50,39,1 +30,2,285902,6,12,1,10,1,0,0,0,0,40,0,0 +52,2,113094,0,13,4,0,4,0,1,0,1092,40,0,0 +29,2,278637,0,13,1,5,1,0,0,3103,0,45,0,1 +41,2,174540,5,10,1,3,1,1,0,0,0,4,0,0 +29,2,188729,0,13,0,0,0,0,1,0,0,45,0,0 +24,2,72143,0,13,0,5,0,0,1,0,0,20,0,0 +46,1,328216,10,15,1,3,1,0,0,0,0,45,0,1 +44,2,165815,1,9,1,1,1,0,0,0,0,60,0,1 +17,2,317702,12,6,0,5,3,1,1,0,0,15,0,0 +35,2,215323,9,11,2,4,4,0,1,0,0,35,0,0 +38,2,192939,1,9,2,10,4,0,0,0,0,40,0,0 +36,2,156352,4,5,0,2,3,0,0,0,0,40,0,0 +24,2,155066,2,7,1,8,1,0,0,0,0,60,0,0 +38,1,152621,0,13,1,7,1,0,0,0,0,99,0,0 +19,2,298891,2,7,0,5,0,0,1,0,0,40,6,0 +30,2,193298,1,9,1,6,1,0,0,0,0,45,0,0 +36,4,150309,9,11,1,6,1,3,0,0,0,40,0,0 +27,2,384308,5,10,0,10,0,0,0,0,0,45,0,0 +27,2,305647,6,12,1,0,1,0,0,0,0,40,0,1 +65,3,23494,5,10,1,1,1,1,0,0,2174,40,0,1 +37,2,421633,3,14,0,1,0,1,1,0,0,40,0,1 +17,2,57723,2,7,0,5,3,0,0,0,0,30,0,0 +57,2,103540,11,3,1,6,1,1,0,0,0,50,0,0 +54,1,136224,3,14,2,3,0,0,1,0,0,30,0,0 +21,2,231573,5,10,0,4,0,0,1,0,0,40,0,0 +43,2,242804,1,9,4,2,0,0,0,0,0,40,0,0 +50,2,163671,1,9,1,10,1,0,0,0,0,40,0,0 +38,2,287701,2,7,1,2,1,0,0,0,0,48,0,1 +31,2,187560,1,9,1,3,1,0,0,15024,0,40,0,1 +41,2,222504,10,15,2,3,4,0,1,0,0,38,0,0 +20,2,41356,5,10,0,3,0,0,1,0,0,40,0,0 +28,2,59335,0,13,1,0,5,0,1,0,0,15,0,0 +62,2,84756,4,5,1,4,1,0,0,0,0,35,0,0 +41,2,407425,14,8,2,8,0,1,1,0,0,40,0,0 +37,2,162424,1,9,1,10,1,0,0,0,0,45,0,0 +53,1,175456,5,10,1,7,1,0,0,0,0,30,0,0 +28,2,52603,0,13,1,5,1,0,0,0,0,50,0,1 +23,2,250630,3,14,0,3,0,0,1,0,0,30,0,0 +46,1,233974,1,9,1,7,1,0,0,0,0,35,0,0 +28,2,376302,1,9,0,5,0,0,1,0,0,45,0,0 +50,2,195638,12,6,4,0,4,0,1,0,0,40,0,0 +19,2,225775,5,10,0,10,0,0,0,0,0,45,4,0 +84,2,388384,7,4,1,3,1,1,0,0,0,10,0,0 +48,1,219021,10,15,1,3,1,0,0,0,0,35,0,1 +61,1,168654,1,9,6,0,4,0,1,0,0,20,0,0 +44,2,180609,5,10,2,10,0,0,0,0,0,42,0,0 +32,2,114746,1,9,4,2,4,2,1,0,0,60,27,0 +25,2,178037,5,10,0,0,3,0,0,0,0,35,0,0 +47,0,160045,5,10,2,0,0,0,1,0,0,40,0,0 +19,2,268524,5,10,0,5,3,0,1,0,0,15,0,0 +37,2,174844,5,10,1,4,1,0,0,0,0,17,0,0 +28,2,82488,1,9,2,9,3,2,1,0,0,40,0,0 +34,2,221167,6,12,1,0,2,0,1,0,0,40,0,1 +32,1,48014,5,10,2,4,0,0,1,0,0,35,0,0 +24,2,217226,5,10,0,4,0,0,0,0,0,30,0,0 +30,2,39386,5,10,1,1,1,1,0,0,0,99,0,0 +56,2,37394,3,14,1,1,1,0,0,0,0,40,0,0 +30,2,115426,0,13,1,5,1,0,0,0,0,40,0,1 +28,2,114158,5,10,0,0,3,0,1,0,0,26,0,0 +40,2,119101,5,10,1,10,1,0,0,0,1887,68,0,1 +28,2,360527,5,10,0,5,0,0,0,0,0,45,0,0 +39,2,225544,14,8,0,2,0,0,0,0,0,40,0,0 +33,1,108438,1,9,1,10,1,0,0,0,0,40,0,1 +23,2,230315,5,10,0,4,0,2,0,0,0,40,21,0 +32,2,158002,5,10,0,8,5,0,0,0,0,55,16,0 +37,2,179468,1,9,1,10,1,0,0,0,0,40,0,0 +71,2,99894,11,3,6,13,0,2,1,0,0,75,0,0 +30,2,270889,5,10,1,0,1,0,0,0,0,40,0,1 +20,2,42279,5,10,0,1,0,0,1,0,0,40,0,0 +53,3,167380,1,9,1,6,1,0,0,0,1740,50,0,0 +42,2,274913,1,9,2,10,4,0,0,0,0,45,0,0 +44,2,35910,0,13,1,1,1,0,0,0,1902,56,0,1 +26,2,68001,3,14,0,3,0,0,1,0,0,40,0,0 +21,2,27162,5,10,0,4,3,0,1,0,0,16,0,0 +37,1,286146,1,9,3,4,4,1,1,0,0,40,0,0 +36,4,95462,0,13,2,3,4,0,1,0,0,40,0,0 +25,2,50103,1,9,0,5,4,0,1,0,0,40,0,0 +54,2,511668,8,16,1,1,1,0,0,0,1977,43,0,1 +38,5,189679,0,13,1,3,1,0,0,0,0,50,0,1 +29,2,115064,1,9,0,4,0,0,0,0,0,40,0,0 +20,0,215443,5,10,0,10,3,0,0,0,0,38,0,0 +32,2,174789,1,9,0,10,5,0,0,0,0,50,0,0 +24,2,91999,6,12,0,1,0,0,0,0,0,20,0,0 +59,3,100931,1,9,1,0,1,0,0,0,0,40,0,1 +56,1,119069,0,13,1,0,1,0,0,0,0,40,0,1 +40,1,277488,1,9,2,6,0,0,0,0,0,84,0,0 +35,2,265662,0,13,1,5,1,0,0,0,0,40,0,1 +38,2,114591,0,13,1,3,2,0,1,15024,0,40,0,1 +24,2,227594,5,10,0,5,3,0,1,0,0,20,0,0 +30,2,129707,5,10,1,5,1,0,0,0,1848,40,0,1 +36,2,133569,15,2,0,7,0,0,0,0,0,40,4,0 +20,4,308654,5,10,0,11,3,2,1,0,0,20,0,0 +36,2,156084,1,9,0,5,3,0,1,0,0,40,0,0 +45,3,380127,0,13,0,1,0,0,1,0,0,40,0,0 +22,2,210781,0,13,0,0,3,0,1,0,0,40,0,0 +31,2,189759,1,9,0,7,0,0,0,0,2001,40,0,0 +34,2,258675,1,9,0,6,3,0,0,0,0,40,0,0 +24,2,223367,2,7,0,10,4,0,0,0,0,40,0,0 +23,2,409230,0,13,0,5,0,0,0,0,0,25,0,0 +46,3,308077,10,15,4,3,4,0,1,0,0,40,9,1 +60,2,159049,10,15,1,3,1,0,0,0,0,70,9,1 +40,2,353142,5,10,2,8,4,1,1,0,0,40,0,0 +55,2,143030,1,9,2,8,0,0,1,0,0,40,0,0 +47,2,304857,3,14,4,9,0,0,0,27828,0,40,0,1 +28,2,30912,1,9,1,4,1,0,0,0,0,43,0,0 +55,2,125000,10,15,1,1,1,0,0,0,0,60,0,1 +47,2,181363,3,14,1,3,1,0,0,0,0,40,0,1 +54,2,338620,3,14,1,1,1,0,0,0,0,52,0,1 +32,2,115989,2,7,1,4,2,0,1,0,0,60,0,0 +38,2,111128,6,12,1,1,1,0,0,0,0,40,0,1 +61,1,201273,5,10,6,8,0,0,1,0,0,40,0,0 +62,5,137354,3,14,1,3,1,2,0,0,0,40,27,0 +29,2,133420,5,10,1,10,1,0,0,5013,0,40,0,0 +26,2,192208,1,9,0,11,0,1,1,0,0,32,0,0 +19,2,220001,5,10,0,7,3,0,0,0,0,50,0,0 +40,2,352612,12,6,1,10,1,0,0,0,0,40,0,0 +36,2,169426,1,9,1,8,1,0,0,7298,0,40,0,1 +42,2,319016,1,9,1,6,1,0,0,2885,0,45,0,0 +55,2,119751,3,14,0,3,5,2,1,0,0,40,15,0 +55,2,202220,1,9,1,4,2,1,1,2407,0,35,0,0 +43,1,99220,0,13,1,5,1,0,0,0,0,40,0,1 +39,2,111275,1,9,1,10,1,0,0,0,0,40,0,0 +38,3,261241,5,10,1,0,1,0,0,0,0,45,0,1 +28,2,261725,1,9,0,4,4,0,1,0,0,40,4,0 +36,2,182013,5,10,2,9,4,0,1,0,0,40,0,0 +49,2,40666,5,10,1,7,1,0,0,0,0,50,0,0 +41,2,216461,5,10,2,0,3,1,1,0,0,40,0,0 +60,2,320376,7,4,1,8,2,0,1,0,0,40,0,0 +35,2,282951,0,13,1,1,1,0,0,0,0,70,0,0 +36,0,166697,0,13,2,3,4,0,1,0,0,40,0,0 +51,2,290856,1,9,1,0,1,0,0,0,0,40,0,1 +23,2,455361,1,9,0,4,0,0,0,0,0,40,24,0 +51,2,82783,1,9,1,10,1,0,0,0,0,40,0,0 +17,2,56536,2,7,0,5,3,0,1,1055,0,18,3,0 +33,1,109959,5,10,1,5,1,0,0,0,0,25,0,0 +50,2,177927,1,9,2,11,0,0,0,0,0,40,0,0 +38,2,192337,14,8,1,10,1,0,0,0,0,40,0,1 +18,2,236272,1,9,0,0,3,0,1,0,0,35,0,0 +26,2,33610,1,9,0,6,3,0,0,0,0,40,0,0 +21,2,209483,5,10,0,5,3,0,1,0,0,47,0,0 +26,2,247006,1,9,1,1,1,0,0,0,0,52,0,0 +30,4,311913,1,9,1,0,2,0,1,0,0,40,0,1 +33,4,300681,1,9,0,4,0,1,0,0,0,40,0,0 +42,0,24264,5,10,2,6,4,0,0,0,0,38,0,0 +28,2,266070,10,15,0,3,0,0,1,0,0,50,0,0 +20,2,226978,1,9,0,4,3,0,0,0,0,35,0,0 +66,4,362165,0,13,6,3,0,1,1,0,2206,25,0,0 +31,2,341672,5,10,1,0,1,2,0,0,0,50,3,0 +36,2,179488,5,10,2,0,4,0,0,0,0,40,8,0 +39,3,243872,6,12,0,3,0,0,0,0,0,40,0,1 +52,2,259583,1,9,1,0,1,0,0,0,0,40,0,0 +61,2,159822,7,4,1,10,1,0,0,7688,0,40,12,1 +27,2,219863,1,9,1,6,1,0,0,0,0,40,0,0 +45,2,206947,1,9,2,0,0,0,1,0,0,50,0,0 +21,2,245572,4,5,0,4,3,3,0,0,0,40,0,0 +25,2,38488,1,9,0,0,3,0,1,0,0,40,0,0 +24,2,182504,5,10,0,4,3,0,1,0,0,25,0,0 +38,2,193815,6,12,1,1,1,0,0,0,0,55,25,0 +29,2,46442,0,13,1,3,2,0,1,0,1902,50,0,1 +45,2,60267,1,9,2,0,4,0,1,0,0,38,0,0 +59,2,264357,12,6,1,6,1,0,0,0,0,50,0,0 +41,2,191814,1,9,1,0,3,0,0,0,0,40,0,0 +23,2,107882,0,13,0,0,3,0,1,0,0,40,0,0 +43,2,174575,5,10,2,0,0,0,0,0,0,45,0,0 +17,2,143331,2,7,0,5,3,0,0,0,0,20,0,0 +32,2,126132,0,13,1,1,1,0,0,15024,0,50,0,1 +42,2,198619,9,11,1,8,1,0,0,0,0,40,0,0 +68,2,211287,3,14,1,1,1,0,0,0,2392,40,0,1 +55,3,238192,1,9,1,9,1,0,0,0,1887,40,0,1 +43,2,257780,1,9,1,0,1,0,0,0,0,40,0,0 +61,2,183355,1,9,1,0,1,0,0,0,0,40,0,1 +28,2,148429,1,9,1,8,1,0,0,0,0,40,0,0 +47,2,71221,1,9,2,8,4,0,1,0,0,60,0,0 +21,1,236769,7,4,0,10,0,0,0,0,0,40,0,0 +39,2,32146,5,10,0,10,0,0,0,0,0,40,0,0 +39,2,347491,2,7,2,10,0,0,0,0,1876,46,0,0 +34,2,180714,5,10,1,6,1,1,0,0,2179,40,0,0 +27,2,306747,0,13,2,2,3,1,0,0,0,40,0,0 +21,0,478457,5,10,0,4,3,1,1,0,0,12,0,0 +25,2,248990,11,3,0,8,0,0,0,0,0,40,4,0 +51,5,46281,5,10,1,5,1,0,0,0,0,50,0,1 +35,2,148015,0,13,0,5,3,1,1,0,0,40,0,0 +19,2,278115,5,10,0,4,3,0,0,0,0,12,0,0 +27,2,190525,0,13,1,1,1,0,0,7298,0,55,0,1 +34,2,176673,5,10,0,5,5,1,1,0,0,35,0,0 +36,2,238415,1,9,2,10,4,0,0,0,0,40,0,0 +33,1,37939,0,13,1,10,1,0,0,0,0,35,0,0 +60,1,35649,0,13,1,10,1,0,0,0,0,40,0,0 +42,2,383493,5,10,1,1,1,0,0,15024,0,50,0,1 +47,3,204900,1,9,1,3,2,1,1,0,0,40,0,0 +42,2,20809,1,9,2,10,0,0,0,0,0,75,0,1 +34,2,148207,5,10,1,1,1,0,0,0,0,65,0,1 +21,2,200153,1,9,0,4,3,0,1,0,0,32,0,0 +30,2,169496,3,14,1,4,1,0,0,0,0,15,0,1 +53,2,22978,3,14,1,1,2,0,1,0,0,50,0,1 +34,2,366898,1,9,1,10,1,0,0,0,0,40,9,0 +37,2,324947,0,13,1,2,1,0,0,0,0,40,0,0 +27,2,321577,1,9,0,0,3,1,1,0,0,40,0,0 +31,2,241360,0,13,0,5,0,0,0,0,0,40,0,0 +30,2,207564,5,10,1,0,2,0,1,0,0,40,0,0 +33,2,220860,1,9,2,6,0,0,0,0,0,45,0,0 +41,4,336571,5,10,1,1,1,0,0,0,0,40,0,0 +23,0,56402,5,10,1,3,1,0,0,0,0,30,0,0 +65,2,180280,5,10,1,1,2,0,1,0,0,40,0,0 +30,2,81282,1,9,0,4,4,0,1,0,0,40,0,0 +51,2,86332,9,11,1,4,1,0,0,4064,0,55,0,0 +30,4,27051,5,10,0,2,3,0,0,0,0,40,0,0 +49,2,287647,3,14,2,5,0,0,0,4787,0,45,0,1 +37,1,183735,1,9,1,3,1,0,0,3137,0,30,0,0 +42,2,100800,1,9,0,10,0,0,0,0,0,40,0,0 +62,2,155094,9,11,1,1,2,0,1,0,0,45,0,1 +31,2,151053,5,10,1,6,1,0,0,5178,0,40,0,1 +50,2,548361,0,13,1,9,1,0,0,0,0,20,0,1 +33,2,173858,0,13,1,0,5,2,0,0,0,40,3,0 +27,2,347153,5,10,0,6,5,0,0,0,0,40,0,0 +31,2,319146,9,11,1,10,1,0,0,4386,0,40,4,1 +35,2,197719,5,10,0,8,5,3,0,0,0,40,0,0 +55,2,197114,5,10,1,6,1,0,0,0,0,6,0,1 +54,1,109418,0,13,1,1,2,0,1,0,1977,35,0,1 +56,2,182062,0,13,1,9,1,0,0,0,0,48,0,1 +21,2,184543,9,11,0,0,0,0,1,0,0,40,0,0 +66,2,175558,7,4,6,4,0,0,1,0,0,20,9,0 +46,2,122026,1,9,1,10,1,0,0,0,0,50,0,0 +23,2,340543,0,13,0,1,0,0,1,0,0,38,0,0 +43,2,101950,3,14,0,1,0,0,1,0,0,45,0,0 +40,2,179508,1,9,1,8,1,0,0,0,0,55,0,0 +52,2,225317,11,3,1,10,1,0,0,0,0,40,4,0 +59,4,53304,0,13,1,3,1,0,0,0,0,50,0,1 +36,4,282602,9,11,4,0,3,1,1,0,0,40,0,0 +33,2,184016,1,9,0,6,0,0,0,0,0,40,0,0 +20,2,250165,1,9,1,5,1,0,0,0,0,40,0,0 +21,2,196467,1,9,0,8,0,0,0,0,0,35,0,0 +42,1,178780,3,14,1,1,1,0,0,0,0,50,0,1 +62,2,65868,1,9,6,5,0,0,1,0,0,43,0,0 +54,2,35459,1,9,0,5,0,0,0,0,0,40,0,0 +35,2,98986,7,4,0,8,3,0,1,0,0,30,0,0 +36,2,282092,6,12,0,9,0,0,1,0,0,40,0,0 +21,2,140764,1,9,0,0,5,0,1,0,0,45,0,0 +30,2,33124,1,9,4,7,4,0,1,0,0,14,0,0 +46,2,90042,5,10,1,10,1,0,0,0,0,40,0,1 +32,2,102986,11,3,1,8,2,2,1,0,0,40,17,1 +21,2,214387,5,10,0,5,5,0,0,0,0,64,0,0 +39,2,180667,1,9,0,0,0,0,0,0,0,40,0,0 +54,2,278329,1,9,3,1,0,0,1,0,0,43,0,0 +32,2,184440,5,10,1,8,1,0,0,3464,0,40,0,0 +23,2,140462,1,9,0,8,3,0,0,0,0,40,0,0 +42,2,202565,15,2,1,8,1,0,0,0,0,40,25,0 +28,2,287268,5,10,0,4,0,0,0,0,0,35,0,0 +28,2,215955,1,9,1,10,1,0,0,0,0,40,0,0 +35,2,82552,6,12,1,9,1,0,0,0,0,40,0,0 +19,2,41745,5,10,0,1,3,0,1,0,0,40,0,0 +27,2,73587,1,9,0,2,0,1,0,0,0,35,0,0 +54,2,263925,15,2,1,6,1,0,0,0,0,50,0,0 +19,2,196119,1,9,0,5,3,0,1,0,0,35,0,0 +27,2,284741,5,10,0,5,0,0,1,0,0,30,0,0 +35,2,340428,6,12,0,0,0,0,1,0,0,35,0,0 +19,4,276973,5,10,0,3,3,0,1,0,0,20,0,0 +30,2,161599,1,9,1,2,1,0,0,0,0,40,0,1 +32,2,144064,0,13,0,9,0,0,0,0,0,40,0,0 +31,2,236391,5,10,0,5,0,0,1,0,0,40,0,0 +26,2,224943,9,11,0,5,5,1,0,0,0,65,0,0 +44,2,151294,5,10,6,5,0,0,1,0,0,25,0,0 +52,2,68982,0,13,1,1,1,0,0,0,0,50,0,1 +30,2,241885,5,10,1,7,1,0,0,0,0,40,0,0 +32,1,189461,1,9,0,4,0,0,1,0,0,60,0,0 +19,1,36012,1,9,0,10,3,0,0,0,0,40,0,0 +33,2,85355,1,9,4,8,0,0,0,0,0,30,0,0 +20,2,157595,5,10,0,2,0,0,0,0,0,40,0,0 +61,2,197286,7,4,1,8,1,0,0,0,0,40,0,0 +33,2,362747,5,10,0,4,0,1,1,0,0,35,0,0 +24,2,395297,5,10,0,5,3,0,1,0,0,35,0,0 +31,1,144949,0,13,2,10,0,0,0,0,0,60,0,0 +32,2,141490,9,11,2,1,4,0,1,0,0,50,0,0 +29,2,147889,6,12,1,9,2,0,1,0,0,40,0,0 +61,2,232808,12,6,2,4,0,0,0,0,0,24,0,0 +48,2,70668,1,9,1,8,2,0,1,0,0,50,0,0 +29,3,33315,6,12,2,0,0,0,1,0,0,40,0,0 +22,2,200318,6,12,0,0,0,0,1,0,0,15,0,0 +32,2,97723,1,9,1,10,1,0,0,0,1672,40,0,0 +38,2,109231,1,9,1,10,1,0,0,0,0,40,0,0 +27,2,102889,5,10,2,8,4,0,1,0,0,40,0,0 +26,2,167106,1,9,0,10,5,2,0,0,0,40,37,0 +35,2,182898,1,9,0,0,0,0,0,8614,0,40,0,1 +62,2,197918,1,9,2,0,4,0,1,0,0,40,0,0 +28,2,67386,1,9,0,4,4,0,1,0,0,40,0,0 +50,2,126592,1,9,4,10,0,1,0,0,0,40,0,0 +34,2,49469,0,13,0,5,0,0,0,99999,0,50,0,1 +37,1,119929,1,9,1,10,1,0,0,0,0,40,0,0 +63,2,158199,15,2,6,8,4,0,1,0,0,44,20,0 +35,2,341102,4,5,0,2,0,1,0,0,0,40,0,0 +55,2,101524,0,13,1,5,1,0,0,0,0,40,0,1 +40,2,202872,1,9,1,5,2,0,1,0,0,40,0,1 +25,2,195201,1,9,1,5,1,4,0,0,0,50,0,0 +51,2,128272,5,10,1,1,1,0,0,0,0,40,0,0 +37,2,263094,0,13,1,1,1,0,0,7298,0,40,0,1 +54,5,357596,0,13,1,1,1,0,0,7298,0,55,0,1 +47,4,102628,5,10,1,4,1,0,0,0,0,40,0,1 +26,2,171114,0,13,0,1,3,0,1,0,0,40,0,0 +46,2,216414,9,11,3,10,4,0,0,0,0,40,0,0 +24,2,127753,14,8,0,10,5,0,0,0,0,40,0,0 +19,2,282698,7,4,0,0,3,0,0,0,0,80,0,0 +35,2,139364,1,9,1,5,1,0,0,0,1902,40,0,1 +36,4,312785,0,13,0,3,3,1,0,0,0,35,0,0 +18,2,92864,14,8,0,4,3,0,1,0,0,20,0,0 +46,4,175428,3,14,1,3,1,0,0,0,0,40,0,1 +30,2,104223,1,9,0,4,4,1,1,0,0,32,0,0 +29,2,144784,1,9,0,4,0,1,1,0,0,40,0,0 +65,2,178934,1,9,6,4,4,1,1,0,0,20,2,0 +41,2,211253,3,14,1,1,2,0,1,0,0,40,0,1 +34,2,133122,0,13,1,1,1,0,0,0,0,40,0,0 +58,2,103540,7,4,1,6,1,1,0,0,0,40,0,0 +39,0,172700,1,9,0,4,4,1,1,0,0,40,0,0 +21,2,282484,5,10,0,4,3,0,1,0,0,40,0,0 +31,2,323055,1,9,1,6,1,0,0,0,0,50,0,1 +33,0,291494,8,16,1,3,1,0,0,0,0,50,0,1 +28,2,214702,0,13,1,1,1,0,0,0,0,60,0,0 +32,2,116055,1,9,0,0,4,1,1,2977,0,35,0,0 +32,2,226696,0,13,0,1,0,0,0,0,0,55,0,1 +31,2,216827,1,9,4,4,4,1,1,0,0,40,0,0 +41,1,153132,10,15,1,1,1,0,0,15024,0,40,0,1 +48,2,307440,0,13,1,9,1,2,0,0,0,45,11,1 +27,2,278122,1,9,0,6,3,0,0,0,0,40,0,0 +45,2,122195,1,9,6,10,4,1,1,0,0,40,0,0 +34,1,156890,1,9,1,1,1,0,0,0,0,50,0,0 +17,2,36877,12,6,0,5,3,0,1,0,0,10,0,0 +25,2,131178,1,9,0,2,3,1,0,0,0,23,0,0 +34,5,62396,0,13,0,3,0,0,1,0,0,62,0,1 +33,2,73054,1,9,2,5,4,0,1,0,0,40,0,0 +21,2,96844,5,10,0,0,0,0,1,0,0,20,0,0 +22,2,324922,1,9,0,8,0,0,0,0,0,50,0,0 +61,2,130684,5,10,1,3,1,0,0,0,0,42,0,0 +40,2,178983,1,9,1,0,2,0,1,0,0,30,0,1 +58,2,81038,5,10,1,5,1,0,0,0,0,12,0,0 +30,2,151967,5,10,1,10,1,0,0,0,0,58,0,0 +24,2,278107,1,9,0,10,3,0,0,0,0,60,0,0 +52,1,183146,14,8,1,1,1,0,0,0,0,50,0,1 +50,2,183638,1,9,6,5,4,0,1,0,0,40,0,0 +49,2,247892,5,10,1,10,1,1,0,0,0,30,0,0 +22,2,221480,1,9,0,0,3,0,1,0,0,40,0,0 +21,2,518530,5,10,0,0,3,0,1,0,0,40,0,0 +25,2,193787,5,10,0,8,3,0,1,0,0,50,0,0 +34,5,157466,1,9,1,0,1,0,0,0,0,45,0,0 +48,2,141511,12,6,1,1,1,0,0,0,0,45,0,1 +21,2,252253,5,10,0,0,4,1,1,0,0,40,0,0 +20,2,200450,7,4,0,8,3,0,1,0,0,52,0,0 +30,0,343789,5,10,1,0,1,0,0,0,0,40,0,1 +44,2,277647,1,9,1,5,1,0,0,0,1902,40,0,1 +44,2,291566,1,9,0,10,0,1,0,0,0,60,0,0 +29,2,151382,1,9,1,6,1,0,0,0,0,60,0,0 +31,2,221167,10,15,2,9,0,0,1,0,0,35,0,0 +35,2,196178,1,9,1,10,1,0,0,0,0,40,0,0 +27,2,302422,1,9,0,0,0,0,0,0,0,40,0,0 +26,2,37379,0,13,0,1,0,0,1,0,0,45,0,0 +37,1,82540,4,5,1,6,1,0,0,0,0,70,0,1 +44,2,159911,7,4,1,4,2,0,1,0,0,55,0,0 +34,2,212781,0,13,1,1,1,0,0,0,0,40,0,1 +28,4,207213,6,12,0,10,3,0,0,0,0,5,0,0 +30,2,200192,5,10,1,4,2,0,1,0,0,45,0,0 +41,4,180096,0,13,1,3,1,0,0,0,0,35,0,0 +23,2,192812,0,13,0,9,3,0,1,0,0,40,0,0 +19,2,105908,1,9,0,2,5,0,0,0,0,70,0,0 +48,2,373366,15,2,1,7,1,0,0,3781,0,50,4,0 +26,0,234190,5,10,0,4,0,0,0,0,0,20,0,0 +32,2,260868,0,13,1,5,1,1,0,0,0,40,0,1 +26,2,109097,1,9,2,0,4,0,1,0,0,48,0,0 +36,2,171393,3,14,1,3,1,0,0,7298,0,55,0,1 +49,2,209146,1,9,1,6,1,0,0,0,0,40,0,0 +54,2,172281,3,14,2,9,0,0,0,0,0,40,0,1 +36,2,73023,1,9,2,10,0,0,0,0,0,55,0,0 +41,2,122626,1,9,2,2,4,0,0,0,0,48,0,0 +27,2,113635,0,13,0,4,0,0,0,0,0,35,0,0 +40,1,30759,9,11,1,7,1,0,0,0,0,60,0,0 +46,2,105327,1,9,2,10,0,0,0,0,0,40,0,0 +43,2,219307,4,5,2,6,0,1,0,0,0,40,0,0 +46,2,208067,1,9,2,10,5,0,0,0,0,40,0,0 +51,1,78631,5,10,1,1,1,3,0,0,0,60,0,0 +19,2,210308,5,10,0,0,3,0,1,0,0,15,0,0 +67,4,190661,8,16,0,3,0,0,1,7896,0,50,0,1 +31,2,594187,1,9,1,8,1,0,0,0,0,40,0,0 +27,2,228476,0,13,1,5,1,0,0,0,0,50,0,1 +21,2,126613,5,10,0,4,3,0,1,0,0,40,0,0 +36,2,30267,1,9,1,6,1,0,0,0,0,50,0,0 +23,2,216811,1,9,0,8,3,0,1,0,0,16,0,0 +62,4,115763,3,14,1,3,2,0,1,0,0,40,0,1 +31,4,199368,0,13,1,11,1,1,0,0,0,50,0,1 +52,2,159755,0,13,1,1,1,0,0,0,1887,40,0,1 +39,1,188335,1,9,1,7,1,0,0,0,0,40,0,0 +24,2,417668,0,13,0,3,3,0,0,0,0,30,0,0 +38,2,296317,1,9,1,8,1,0,0,0,0,40,4,0 +36,2,164898,1,9,1,1,1,0,0,0,0,40,0,0 +17,2,452406,2,7,0,5,3,1,1,0,0,15,0,0 +27,2,42696,1,9,3,4,4,0,1,0,0,40,0,0 +30,2,262994,5,10,2,10,0,1,0,0,0,40,0,0 +43,0,167298,1,9,2,1,4,0,1,0,0,40,0,0 +51,2,103529,2,7,2,4,4,1,1,0,0,30,0,0 +47,2,97883,0,13,6,13,4,0,1,25236,0,35,0,1 +49,0,269417,8,16,0,1,0,0,1,0,2258,50,0,1 +34,2,199539,1,9,1,10,1,0,0,0,0,48,0,1 +79,3,62176,8,16,6,1,0,0,0,0,0,6,0,1 +28,0,239130,5,10,2,4,4,0,0,0,0,40,0,0 +41,5,151089,5,10,1,1,1,0,0,0,0,50,0,0 +21,2,331611,5,10,1,4,1,0,0,0,0,50,0,0 +31,1,203463,0,13,0,9,0,0,1,0,0,40,0,0 +45,2,151518,1,9,1,1,1,0,0,0,0,45,0,0 +23,5,39844,1,9,0,6,0,0,0,0,0,50,0,0 +32,2,299635,5,10,1,1,1,0,0,0,0,50,9,0 +67,2,123393,2,7,1,6,1,0,0,0,0,40,0,0 +32,2,209538,3,14,1,1,1,0,0,0,0,55,0,1 +35,1,238802,1,9,1,7,1,0,0,0,0,50,0,0 +29,2,499197,5,10,1,3,1,0,0,0,0,40,0,0 +38,2,200220,1,9,1,10,1,0,0,0,0,40,0,0 +38,2,114059,5,10,1,5,1,0,0,0,0,60,0,0 +18,2,434430,1,9,0,3,0,0,0,0,0,30,0,0 +47,2,185385,1,9,1,3,1,0,0,5013,0,24,0,0 +22,2,225156,1,9,0,0,0,0,1,0,0,40,0,0 +21,2,377931,5,10,1,1,1,0,0,0,2377,48,0,0 +40,2,287008,10,15,1,3,1,0,0,15024,0,55,9,1 +23,2,151910,0,13,0,8,3,0,1,0,1719,40,0,0 +25,2,231714,5,10,1,8,1,0,0,0,0,40,0,0 +44,5,178510,5,10,0,5,0,0,0,0,2258,60,0,0 +43,2,178866,1,9,1,0,2,0,1,0,0,25,0,1 +31,2,110643,0,13,1,1,1,0,0,0,1977,55,0,1 +33,2,148261,5,10,1,10,1,0,0,0,0,40,0,0 +41,2,217902,1,9,1,1,1,0,0,0,0,40,0,1 +29,1,77207,3,14,1,10,1,0,0,0,0,30,0,0 +78,2,184759,7,4,1,2,1,0,0,1797,0,15,0,0 +64,5,80333,1,9,1,1,1,0,0,0,0,40,0,1 +58,2,265086,0,13,1,1,1,0,0,0,0,50,0,1 +20,2,333843,1,9,0,0,3,0,1,0,0,40,0,0 +35,2,296478,5,10,1,5,1,0,0,0,0,40,0,0 +27,4,116662,1,9,1,8,1,0,0,0,0,40,0,0 +37,1,353298,1,9,1,5,1,0,0,99999,0,50,0,1 +42,2,142424,9,11,0,0,0,0,1,0,0,40,0,0 +47,4,200808,14,8,1,0,1,0,0,0,0,35,5,0 +29,2,119052,1,9,0,2,0,1,1,0,0,40,0,0 +33,2,168981,15,2,0,5,3,0,1,0,0,24,0,0 +44,2,151780,5,10,6,1,0,1,1,0,0,40,0,0 +25,2,509866,1,9,0,6,0,0,0,0,0,78,0,0 +24,0,249385,0,13,0,0,5,0,1,0,0,10,0,0 +42,0,109462,0,13,2,0,4,1,1,2977,0,40,0,0 +53,2,250034,0,13,1,1,1,1,0,0,0,50,0,1 +39,2,249720,0,13,2,1,4,1,1,0,0,60,0,0 +72,1,258761,1,9,1,7,1,0,0,0,0,40,0,0 +43,5,64048,4,5,0,5,3,0,1,0,0,44,20,0 +25,0,153534,5,10,1,11,1,0,0,0,0,40,0,0 +37,2,193815,6,12,1,3,1,0,0,0,0,45,0,1 +27,2,255582,1,9,0,8,0,0,1,0,0,40,0,0 +39,2,204527,8,16,1,3,1,0,0,0,0,50,0,1 +64,1,159938,1,9,1,10,1,0,0,2635,0,24,25,0 +29,1,229341,1,9,0,10,0,0,0,0,0,50,0,1 +50,2,128143,0,13,1,1,1,0,0,0,0,50,0,1 +33,2,175479,11,3,0,4,4,0,1,0,0,40,4,0 +18,2,301814,1,9,0,5,0,0,1,0,0,20,0,0 +20,2,238917,2,7,0,2,0,0,0,0,0,32,4,0 +32,2,205581,5,10,4,9,4,0,1,0,0,50,0,0 +45,2,340341,5,10,2,0,4,0,1,0,0,40,0,0 +48,2,147860,1,9,1,2,2,1,1,0,0,40,0,0 +23,2,259496,1,9,0,8,3,0,1,0,0,40,0,0 +34,3,190228,0,13,1,11,1,0,0,0,1902,48,0,1 +43,2,180599,0,13,4,1,4,0,0,8614,0,40,0,1 +44,2,116358,0,13,1,5,1,2,0,0,0,40,0,1 +47,1,180446,5,10,1,9,1,1,0,0,0,40,0,1 +47,2,264244,1,9,3,10,0,1,1,0,0,40,0,0 +46,4,197988,15,2,0,4,0,3,1,0,0,20,0,0 +19,2,206599,1,9,0,5,3,0,1,0,0,40,0,0 +51,2,313146,1,9,1,0,1,0,0,0,0,40,0,0 +41,5,99212,1,9,4,1,4,0,0,0,0,40,0,0 +37,2,340599,2,7,4,4,4,1,1,0,0,40,0,0 +31,2,62932,1,9,0,10,3,0,0,0,0,40,0,0 +25,2,44861,1,9,0,4,0,0,0,0,0,40,0,0 +46,2,53893,5,10,1,9,1,0,0,0,0,40,0,1 +53,5,152810,1,9,1,10,1,0,0,5178,0,45,0,1 +47,4,128401,8,16,0,3,4,0,1,0,0,40,0,0 +28,2,336951,1,9,1,1,1,0,0,0,0,50,0,1 +60,1,95445,5,10,1,6,1,0,0,3137,0,46,0,0 +43,2,54611,1,9,1,8,1,0,0,0,0,40,0,0 +45,1,315984,1,9,1,10,1,0,0,7688,0,50,0,1 +28,2,210313,12,6,0,2,5,0,0,0,0,40,4,0 +19,2,181020,2,7,0,2,5,0,0,0,0,30,0,0 +51,1,120781,10,15,1,3,1,4,0,99999,0,70,3,1 +19,2,256979,1,9,0,10,5,0,0,0,0,35,0,0 +64,2,47298,8,16,1,3,1,0,0,0,0,60,0,1 +44,2,125461,8,16,1,1,1,0,0,0,0,60,0,1 +21,2,209955,1,9,0,10,0,0,0,0,0,48,0,0 +33,2,182246,1,9,0,3,0,0,0,0,0,40,0,0 +63,2,76860,0,13,1,11,1,2,0,0,0,40,11,1 +44,4,136986,3,14,1,3,1,0,0,15024,0,35,0,1 +28,3,183445,1,9,0,1,4,0,1,0,0,70,5,0 +24,2,130741,0,13,0,5,3,0,0,0,0,40,0,0 +20,3,191878,5,10,0,0,3,1,1,0,0,20,0,0 +20,2,48121,1,9,0,2,3,0,0,0,0,40,0,0 +21,2,304302,1,9,0,2,3,3,0,0,0,40,0,0 +34,3,284703,5,10,1,8,1,1,0,0,0,52,0,0 +17,2,401198,2,7,0,5,3,0,1,0,0,15,0,0 +35,2,243357,2,7,4,4,4,1,1,0,0,40,0,0 +26,2,32276,1,9,0,7,0,0,0,0,0,40,0,0 +35,2,110538,1,9,2,7,0,0,0,0,0,70,0,0 +25,2,257310,1,9,0,8,0,0,0,0,0,40,0,0 +27,1,411950,5,10,1,4,1,0,0,0,0,40,0,0 +52,4,392668,9,11,1,11,1,0,0,0,0,40,0,1 +43,1,52498,0,13,0,3,4,0,1,0,0,50,0,0 +36,2,223433,3,14,1,5,1,0,0,7688,0,50,0,1 +37,2,87076,1,9,0,8,3,0,0,0,0,40,0,0 +58,2,224854,1,9,0,0,0,0,1,0,0,40,0,0 +25,2,193379,6,12,0,10,0,0,0,0,0,45,0,0 +54,2,98436,3,14,1,4,1,0,0,0,0,40,0,0 +65,5,210381,0,13,1,1,1,0,0,99999,0,65,0,1 +44,2,90688,1,9,0,8,0,2,1,0,0,45,17,0 +61,2,229744,11,3,1,10,1,0,0,0,0,40,22,0 +29,2,59732,1,9,1,10,1,3,0,0,0,40,0,0 +34,2,192900,5,10,1,10,1,0,0,0,0,40,0,1 +24,0,90046,5,10,0,4,0,0,1,0,0,40,8,0 +40,2,272960,6,12,1,9,1,0,0,0,0,42,0,1 +42,5,152071,10,15,1,3,1,0,0,0,0,60,1,1 +50,2,301583,1,9,0,8,0,0,0,0,0,40,0,0 +49,2,315984,1,9,1,8,1,0,0,0,0,40,0,0 +38,2,241962,1,9,2,8,0,0,0,0,0,40,0,0 +41,2,131591,1,9,1,0,1,1,0,0,0,45,0,0 +70,5,207938,5,10,0,1,0,0,0,0,0,5,0,0 +51,2,53197,5,10,1,10,1,0,0,0,0,40,0,1 +24,2,121023,0,13,0,3,0,0,1,0,0,40,0,0 +57,1,287229,1,9,1,10,1,0,0,0,0,48,0,1 +22,2,163911,5,10,0,0,3,0,1,0,0,20,0,0 +31,2,191834,5,10,1,10,1,0,0,0,0,40,0,1 +28,2,204734,5,10,1,9,2,0,1,0,0,40,0,0 +45,1,220978,1,9,1,1,1,0,0,0,0,50,0,0 +39,2,365739,1,9,1,10,1,0,0,0,0,40,0,1 +26,2,50103,5,10,0,5,0,0,1,0,0,40,0,0 +38,2,283293,1,9,1,10,1,1,0,0,0,40,0,0 +38,1,194534,3,14,1,3,1,1,0,99999,0,60,0,1 +19,2,263338,1,9,0,2,3,0,0,0,0,20,0,0 +30,2,348592,1,9,1,8,1,0,0,0,0,44,0,0 +28,2,173944,3,14,1,3,1,0,0,0,0,40,0,1 +53,2,226135,4,5,0,10,0,1,0,0,0,40,2,0 +32,2,172375,0,13,0,3,0,0,0,0,0,38,0,0 +57,5,127728,10,15,1,3,1,0,0,15024,0,60,0,1 +47,2,347025,3,14,2,3,0,0,1,0,0,40,0,0 +36,2,191335,5,10,1,10,1,0,0,0,0,56,0,0 +21,2,247779,2,7,0,5,3,0,1,0,0,38,0,0 +25,0,262664,0,13,1,11,1,0,0,0,0,40,0,1 +37,2,95855,1,9,2,11,4,0,1,0,0,40,0,0 +31,2,74501,1,9,2,4,4,0,1,0,0,30,0,0 +43,2,245317,1,9,1,6,1,0,0,0,0,50,0,0 +61,2,29059,1,9,2,5,4,0,1,0,2754,25,0,0 +56,2,200316,5,10,1,0,1,0,0,0,0,35,0,0 +59,2,100453,7,4,4,4,3,1,1,0,0,38,0,0 +44,1,343190,5,10,1,10,1,0,0,0,1887,55,0,1 +47,2,235683,3,14,2,3,4,0,1,0,0,40,0,0 +44,2,83237,0,13,1,3,1,0,0,0,0,55,0,1 +64,2,88470,5,10,1,4,1,0,0,0,0,40,0,0 +26,2,198801,1,9,1,10,1,0,0,0,0,45,0,0 +53,2,168107,0,13,1,1,1,0,0,0,0,40,0,1 +46,2,695411,1,9,2,0,0,0,1,0,0,44,0,0 +45,5,139268,1,9,1,5,1,0,0,0,0,50,0,1 +44,3,192771,1,9,0,0,4,0,1,0,0,40,0,0 +59,5,122390,5,10,1,1,1,0,0,0,1977,48,0,1 +65,5,184965,8,16,1,1,1,0,0,99999,0,40,0,1 +23,2,180837,1,9,0,8,3,1,1,0,0,40,0,0 +33,2,159548,5,10,2,0,4,1,1,0,0,38,0,0 +34,2,110554,1,9,2,5,3,0,1,0,0,35,0,0 +38,2,103474,9,11,2,0,4,0,1,0,0,40,0,0 +62,2,178249,0,13,1,1,1,0,0,0,0,35,0,1 +21,2,138768,5,10,0,5,5,0,0,0,0,40,0,0 +41,2,321824,1,9,1,10,1,0,0,0,0,8,0,0 +35,2,244803,1,9,0,2,5,0,0,0,0,40,30,0 +62,4,206063,5,10,2,4,0,0,0,0,0,45,0,0 +53,2,167651,1,9,1,10,1,0,0,0,0,40,0,1 +69,0,163689,5,10,1,6,1,0,0,0,0,16,0,0 +19,1,45546,5,10,0,5,3,0,1,0,0,16,0,0 +47,2,420986,0,13,1,1,1,0,0,0,0,40,0,1 +52,5,68015,5,10,1,5,1,0,0,0,0,90,0,1 +54,2,175594,1,9,1,10,1,0,0,0,0,40,0,0 +30,2,206322,1,9,1,6,1,0,0,0,0,73,0,1 +39,2,272338,1,9,1,0,2,0,1,0,0,25,0,0 +73,2,105886,0,13,1,3,1,0,0,1173,0,75,0,0 +64,2,312498,0,13,1,5,1,0,0,0,0,40,0,0 +32,2,177675,1,9,0,10,3,0,0,0,0,40,0,0 +51,2,152810,1,9,1,3,1,0,0,0,0,40,0,1 +57,2,319122,0,13,0,5,0,0,0,0,0,40,0,0 +25,2,212304,1,9,0,8,4,0,0,0,0,40,0,0 +53,2,208321,1,9,1,4,1,1,0,0,1740,40,0,0 +39,2,240841,5,10,0,4,0,0,1,0,0,25,0,0 +49,2,208978,1,9,2,0,4,0,1,0,0,16,0,0 +23,4,442359,0,13,0,3,0,0,1,0,1092,40,0,0 +28,2,198197,0,13,0,3,0,0,0,0,0,55,0,1 +46,2,261059,3,14,1,3,1,0,0,0,1977,50,0,1 +40,2,72791,5,10,0,10,3,1,0,0,0,40,0,0 +24,2,275395,1,9,1,8,1,0,0,0,0,50,0,0 +50,2,462966,12,6,1,4,1,0,0,0,0,8,22,0 +35,2,31269,1,9,1,1,1,0,0,0,0,40,0,0 +33,4,246291,0,13,0,3,0,0,1,0,0,46,0,0 +54,3,128378,0,13,2,1,0,0,0,0,0,40,0,0 +35,4,231180,1,9,1,6,1,0,0,0,0,45,0,0 +31,4,206297,1,9,1,11,1,0,0,0,0,40,0,1 +47,5,337050,5,10,1,7,1,0,0,0,0,40,0,0 +48,2,193075,1,9,2,5,3,0,1,0,0,20,0,0 +33,4,169652,9,11,0,0,3,0,0,0,1669,55,0,0 +35,2,35945,0,13,1,1,1,0,0,0,0,40,0,1 +36,2,252231,13,1,0,8,0,1,0,0,0,40,5,0 +30,2,128016,0,13,0,1,0,0,1,0,0,55,0,0 +39,2,150057,5,10,1,10,1,0,0,0,0,55,0,1 +25,2,258276,5,10,0,2,0,3,0,0,0,40,0,0 +40,2,188465,1,9,2,4,0,0,1,0,0,35,0,0 +25,5,161007,1,9,1,1,1,0,0,0,0,40,0,0 +33,2,403468,1,9,1,8,2,0,1,0,0,40,4,0 +53,3,181677,5,10,2,2,0,0,0,0,0,40,0,0 +18,2,120243,2,7,0,4,3,0,0,0,0,10,0,0 +41,2,157025,1,9,0,8,4,1,0,0,0,40,0,0 +25,2,306908,0,13,1,3,1,0,0,0,0,50,0,0 +66,1,28061,7,4,6,7,4,0,0,0,0,50,0,0 +53,2,95540,5,10,2,0,4,0,1,1471,0,40,0,0 +27,2,135001,1,9,1,10,1,0,0,0,0,40,0,0 +28,2,293398,1,9,4,5,4,1,1,0,0,40,0,0 +23,2,185106,1,9,0,2,3,1,0,0,0,40,0,0 +29,1,245790,12,6,2,10,0,0,0,0,0,80,0,0 +26,2,134004,5,10,1,1,2,0,1,0,0,40,0,0 +26,2,205036,1,9,0,2,0,0,0,0,0,42,0,0 +26,2,244495,4,5,0,4,0,0,0,0,0,35,0,0 +38,2,159179,1,9,1,10,1,0,0,0,0,40,0,0 +36,2,405155,11,3,1,10,1,0,0,0,0,40,4,0 +34,2,177437,5,10,1,10,1,0,0,15024,0,45,0,1 +32,3,402361,1,9,0,0,0,0,0,0,0,40,0,0 +57,1,184553,1,9,1,10,1,0,0,0,0,50,0,1 +31,2,302626,5,10,2,0,4,0,1,0,0,40,0,0 +38,2,99138,0,13,0,1,0,0,1,0,0,38,0,0 +39,2,112731,1,9,2,4,0,4,1,0,0,40,21,0 +35,2,192923,1,9,1,10,1,0,0,0,2377,40,0,0 +18,2,761006,2,7,0,4,3,0,1,0,0,20,0,0 +28,2,182344,1,9,0,4,0,1,0,0,0,40,0,0 +41,1,117012,3,14,0,1,0,0,1,0,0,55,0,0 +39,3,30673,4,5,1,8,1,0,0,0,0,40,0,1 +31,3,484669,5,10,0,9,0,0,0,0,0,40,0,0 +38,0,314052,1,9,2,0,0,0,1,0,0,38,0,0 +27,2,165412,1,9,1,10,1,0,0,0,0,40,0,0 +42,2,198341,3,14,1,3,1,2,0,0,1902,55,3,1 +46,2,116635,0,13,4,3,4,1,1,0,0,36,0,0 +20,2,185452,1,9,0,0,3,0,1,0,0,40,0,0 +42,2,118686,5,10,2,3,4,0,1,0,0,20,0,0 +69,2,76939,1,9,6,1,0,0,1,0,0,40,0,0 +47,3,160646,9,11,1,0,2,0,1,0,0,35,0,0 +49,0,126754,1,9,1,10,1,0,0,0,0,40,20,0 +20,2,211049,5,10,0,1,3,0,1,0,0,30,0,0 +52,2,311931,11,3,1,5,2,0,1,0,0,15,22,0 +33,2,283602,11,3,1,4,1,0,0,0,0,59,4,0 +18,2,155021,2,7,0,4,3,0,1,0,0,6,0,0 +55,1,100569,1,9,4,7,4,0,1,0,0,55,0,0 +61,2,380462,7,4,1,7,1,1,0,0,0,40,0,0 +61,3,221943,5,10,1,0,1,0,0,9386,0,40,0,1 +39,2,114544,0,13,2,1,0,0,0,0,0,45,0,1 +30,2,248584,5,10,1,10,1,0,0,0,0,40,0,0 +61,2,227468,1,9,2,0,4,1,1,0,0,40,0,0 +36,2,66173,6,12,1,5,2,0,1,0,0,15,0,0 +34,2,107624,5,10,1,10,1,0,0,0,0,50,0,0 +53,2,70387,3,14,1,3,1,2,0,4386,0,40,3,1 +38,2,423616,9,11,1,9,2,0,1,0,0,36,0,1 +46,2,98637,0,13,1,1,1,0,0,7298,0,50,0,1 +27,4,216013,1,9,1,2,1,0,0,0,0,40,0,0 +32,1,210926,2,7,4,2,4,0,1,0,0,40,35,0 +60,4,255711,0,13,6,3,4,0,1,0,0,60,0,1 +23,2,77581,0,13,0,1,3,0,0,0,0,40,0,0 +29,2,152461,0,13,0,3,4,0,1,14344,0,50,0,1 +22,2,203263,1,9,0,10,3,0,0,0,0,50,0,0 +25,2,261519,1,9,0,5,3,0,0,0,0,35,0,0 +29,2,91189,0,13,1,8,1,0,0,0,0,48,0,0 +90,3,195433,1,9,1,10,1,0,0,0,0,30,0,0 +37,4,272471,1,9,2,0,4,0,1,0,0,40,0,0 +32,2,311524,1,9,0,10,3,1,0,0,0,38,0,0 +18,2,151386,1,9,3,4,3,1,0,0,0,40,2,0 +35,2,187625,5,10,0,4,0,0,1,0,0,65,0,0 +50,2,108933,4,5,1,10,1,0,0,2885,0,40,0,0 +54,2,135388,1,9,1,10,1,0,0,5178,0,40,0,1 +43,2,169383,0,13,1,1,1,0,0,0,0,45,0,1 +28,5,191129,1,9,0,1,0,0,0,0,0,65,0,1 +51,2,467611,4,5,1,7,1,0,0,0,0,40,4,0 +31,2,373185,5,10,0,10,4,0,0,0,0,42,4,0 +69,2,130060,1,9,4,6,4,1,1,2387,0,40,0,0 +57,2,199934,0,13,1,1,1,0,0,0,0,40,0,1 +28,2,42881,12,6,2,8,3,0,1,0,0,40,0,0 +25,2,169759,1,9,0,2,3,0,0,0,0,95,0,0 +49,1,181547,6,12,1,10,1,0,0,0,0,30,13,0 +52,2,95704,4,5,1,2,1,0,0,0,0,40,0,0 +32,2,226267,11,3,3,10,5,0,0,0,0,40,22,0 +31,2,159979,5,10,0,5,0,2,1,0,0,50,0,0 +30,2,203488,1,9,0,10,3,0,0,0,0,50,0,0 +24,2,403671,1,9,1,10,1,0,0,0,0,60,0,0 +45,2,192323,6,12,1,10,1,0,0,0,0,66,29,0 +30,2,167832,1,9,1,8,1,0,0,0,0,40,0,0 +52,2,145166,0,13,1,1,1,0,0,15024,0,55,0,1 +42,0,155657,1,9,2,0,0,1,1,0,0,25,0,0 +49,2,116789,1,9,1,7,1,0,0,0,0,40,0,0 +20,2,39234,1,9,0,4,3,0,0,0,0,30,0,0 +25,2,124111,0,13,0,0,3,0,1,0,0,40,0,0 +41,2,172828,4,5,1,4,1,0,0,0,0,55,31,0 +55,2,143372,1,9,2,5,4,1,1,0,0,40,0,0 +31,1,265807,9,11,1,1,1,0,0,3137,0,50,0,0 +25,0,218184,0,13,0,11,0,1,1,0,0,40,0,0 +32,2,154087,1,9,1,1,1,0,0,0,0,40,0,0 +29,3,440647,5,10,0,0,5,0,0,0,0,40,0,0 +52,2,125932,7,4,6,4,0,0,1,0,0,40,0,0 +19,2,284652,5,10,0,0,3,0,1,0,0,15,0,0 +43,2,173316,6,12,2,10,0,0,0,0,0,40,0,0 +40,5,45054,5,10,1,6,1,0,0,0,0,40,0,1 +54,2,185042,15,2,4,13,5,0,1,0,0,40,4,0 +35,2,117381,0,13,2,5,0,0,0,0,0,40,0,0 +34,2,258666,9,11,0,9,0,0,1,0,1974,40,0,0 +35,2,179668,5,10,1,3,1,0,0,0,0,40,0,1 +57,2,127277,8,16,1,3,1,2,0,0,0,40,18,1 +26,2,192022,0,13,0,4,5,0,1,0,0,40,0,0 +55,1,99551,0,13,6,5,4,0,1,0,0,15,0,0 +51,2,208899,0,13,4,0,4,0,1,0,0,40,0,0 +35,2,287658,6,12,0,6,0,1,0,0,0,30,2,0 +31,2,196125,1,9,1,2,1,0,0,0,0,40,0,0 +17,2,275051,2,7,0,0,3,0,1,0,0,8,0,0 +38,2,23892,1,9,1,8,2,0,1,0,0,40,0,0 +39,3,376455,10,15,1,3,1,0,0,0,1887,50,0,1 +29,2,267989,1,9,1,10,1,0,0,0,0,45,0,0 +39,2,30269,9,11,2,5,4,0,1,0,0,40,0,0 +42,2,204235,5,10,1,3,1,0,0,0,0,40,0,1 +46,4,209057,3,14,1,1,1,0,0,0,0,50,0,1 +73,2,349347,7,4,1,2,1,0,0,0,0,25,0,0 +47,4,154033,5,10,2,3,0,0,1,0,1876,40,0,0 +28,2,124680,1,9,0,5,4,0,1,0,0,70,0,0 +27,2,132805,12,6,0,5,5,0,0,0,1980,40,0,0 +38,2,99233,10,15,0,1,0,0,0,0,0,40,0,1 +19,2,224849,1,9,0,5,0,0,0,0,0,35,0,0 +60,4,101110,9,11,2,3,4,0,0,0,0,40,0,1 +24,2,184839,5,10,0,8,0,0,0,0,0,40,0,0 +52,2,302847,2,7,1,8,1,0,0,0,0,40,0,0 +36,2,181322,0,13,2,1,0,0,1,0,0,45,0,0 +26,4,192213,3,14,0,3,0,0,1,0,0,40,8,0 +28,0,37250,0,13,0,3,3,0,0,0,0,16,0,0 +38,5,140854,0,13,1,10,1,0,0,0,0,50,0,1 +47,2,158286,3,14,1,1,1,0,0,0,0,50,0,1 +50,2,269095,0,13,2,1,4,0,1,0,0,40,0,1 +27,2,279960,1,9,1,5,1,0,0,0,0,40,0,0 +47,2,176239,5,10,6,3,4,0,1,0,0,40,0,0 +36,2,115360,12,6,1,8,3,0,1,3464,0,40,0,0 +49,2,337666,1,9,2,8,0,1,0,0,0,40,0,0 +63,2,145212,1,9,2,1,0,0,1,0,0,40,0,0 +36,2,185099,1,9,1,6,1,0,0,0,0,70,0,1 +42,2,142756,5,10,2,0,4,0,1,0,0,35,0,0 +28,2,156300,3,14,0,1,0,1,1,0,0,45,0,0 +38,2,219137,1,9,1,0,2,0,1,0,0,22,0,0 +43,2,110970,0,13,1,3,1,0,0,0,1902,40,0,1 +49,2,203067,5,10,1,3,1,0,0,0,0,40,0,1 +59,2,148844,1,9,2,8,0,0,1,0,0,40,0,0 +25,2,154941,0,13,1,5,1,0,0,0,0,40,0,1 +26,2,124111,6,12,0,3,0,0,1,0,0,36,0,0 +59,2,157303,5,10,2,3,0,0,1,0,0,48,0,0 +34,2,113838,5,10,1,10,1,0,0,0,0,45,0,0 +34,2,165737,3,14,1,3,1,2,0,0,0,43,3,1 +67,2,140849,1,9,6,4,0,0,1,0,0,24,0,0 +45,2,200363,9,11,2,1,0,0,1,0,0,44,0,0 +64,2,180247,7,4,1,10,1,1,0,0,0,40,0,0 +51,2,82578,3,14,1,3,1,0,0,0,0,38,8,1 +31,2,227146,0,13,1,5,1,0,0,0,0,55,0,1 +42,5,348886,0,13,1,1,1,0,0,0,0,45,0,1 +65,2,90907,11,3,1,4,1,2,0,0,0,40,0,0 +23,2,142766,5,10,0,0,0,0,0,0,0,20,0,0 +31,2,246439,5,10,1,10,1,0,0,0,0,45,0,0 +33,2,184784,12,6,2,8,0,0,1,0,0,40,0,0 +17,4,195262,2,7,0,10,3,0,0,0,0,35,0,0 +63,2,167967,3,14,1,2,1,0,0,0,0,46,0,0 +48,2,145636,1,9,1,8,1,0,0,0,0,60,0,1 +45,4,170099,6,12,1,2,1,0,0,0,0,40,0,0 +17,2,228253,12,6,0,2,3,0,0,0,0,10,0,0 +26,4,205570,1,9,1,10,1,0,0,0,0,40,0,0 +38,3,506830,5,10,2,9,4,1,1,0,0,40,0,0 +29,2,412435,1,9,1,1,2,0,1,0,0,40,31,0 +44,2,163331,5,10,6,0,4,0,1,0,0,32,0,0 +43,3,222756,3,14,1,10,1,0,0,0,0,40,0,0 +39,0,318918,0,13,1,1,1,0,0,0,0,40,0,0 +43,2,105188,1,9,0,4,0,1,0,0,0,40,19,0 +23,2,199884,1,9,0,0,4,0,1,0,0,45,0,0 +19,2,96483,1,9,0,4,3,2,1,0,0,40,0,0 +49,1,192203,4,5,1,10,1,0,0,0,0,40,8,0 +52,2,203392,5,10,1,10,1,0,0,5013,0,40,0,0 +32,2,99646,1,9,1,6,1,0,0,0,0,50,0,0 +38,2,167440,0,13,1,6,1,0,0,4508,0,40,0,0 +44,2,219591,5,10,2,2,3,0,0,0,0,40,0,0 +63,2,30270,7,4,1,5,1,0,0,0,0,40,0,0 +21,2,314165,5,10,0,5,3,0,0,0,0,40,13,0 +32,2,330715,5,10,1,10,1,0,0,0,0,40,0,0 +24,1,35448,1,9,4,4,4,0,1,0,0,50,0,0 +50,0,172970,1,9,1,6,1,0,0,0,0,40,5,0 +26,5,189502,0,13,1,5,1,0,0,0,0,80,0,1 +35,2,61518,1,9,1,1,1,0,0,0,0,35,0,0 +31,2,574005,0,13,1,10,1,0,0,0,0,44,0,1 +24,2,281356,15,2,0,7,0,4,0,0,0,66,4,0 +40,2,138975,1,9,1,10,1,0,0,0,0,56,0,0 +31,2,176969,0,13,0,1,0,0,0,0,0,55,0,0 +43,2,132393,1,9,0,2,3,0,0,0,0,40,12,0 +44,2,194924,1,9,1,5,1,0,0,0,0,35,0,1 +40,2,478205,0,13,0,3,5,0,1,0,0,40,0,0 +52,4,30118,5,10,1,11,1,0,0,3137,0,42,0,0 +51,1,290688,11,3,1,10,1,0,0,0,0,40,0,0 +39,0,85566,0,13,1,3,1,0,0,0,0,40,0,0 +40,2,121874,6,12,1,5,1,0,0,7688,0,50,0,1 +40,1,29036,5,10,0,8,0,0,0,0,0,35,0,0 +33,2,348152,1,9,1,10,1,0,0,0,0,40,0,0 +38,4,73715,5,10,1,11,1,0,0,0,0,60,0,1 +29,2,151382,9,11,2,2,4,0,0,0,0,50,0,0 +37,2,236359,5,10,2,0,0,1,1,0,0,37,0,0 +37,2,19899,1,9,1,10,1,0,0,15024,0,45,0,1 +19,2,138760,1,9,0,8,3,0,0,0,0,40,0,0 +46,4,354962,1,9,1,8,1,1,0,0,0,40,0,0 +46,2,181363,6,12,1,1,1,0,0,0,0,40,0,1 +37,2,393360,5,10,0,11,3,1,0,0,0,30,0,0 +38,2,110013,5,10,2,0,4,0,1,0,0,43,0,0 +26,2,193304,1,9,1,10,1,0,0,0,0,40,0,0 +34,2,118551,0,13,0,4,0,0,1,0,0,35,0,0 +57,2,201991,0,13,1,3,1,0,0,0,0,40,0,0 +33,2,157446,2,7,0,10,0,0,0,0,0,65,0,0 +26,4,283217,5,10,0,11,3,0,0,0,0,40,0,0 +20,2,247794,1,9,0,5,0,0,1,0,0,84,0,0 +38,2,43712,0,13,1,3,1,0,0,7298,0,60,0,1 +61,2,35649,5,10,1,4,1,0,0,0,0,6,0,0 +17,2,271837,5,10,0,10,3,0,0,0,0,16,0,0 +40,2,400061,5,10,1,8,1,4,0,0,0,40,0,1 +18,2,62972,2,7,0,4,3,0,0,0,0,16,0,0 +21,2,174907,6,12,0,5,3,0,1,0,0,32,0,0 +41,2,176452,1,9,0,4,3,0,0,0,0,40,30,0 +46,2,268358,2,7,4,8,0,0,1,0,0,40,0,0 +55,3,176904,1,9,1,1,1,0,0,0,0,40,0,0 +27,2,176683,6,12,0,5,0,0,0,0,0,52,0,0 +39,2,98077,1,9,1,4,1,0,0,0,0,42,0,0 +36,2,266461,1,9,0,6,3,1,0,0,0,48,0,0 +51,2,312477,5,10,1,6,1,0,0,3908,0,40,0,0 +27,2,604045,0,13,0,5,0,0,0,0,0,40,0,0 +30,4,131568,0,13,1,3,1,0,0,0,0,40,0,1 +42,2,97688,1,9,2,5,0,0,0,0,0,47,0,0 +23,2,373628,0,13,0,4,3,0,1,0,0,20,0,0 +56,2,367984,9,11,1,1,1,0,0,15024,0,40,0,1 +41,1,193459,5,10,1,10,1,0,0,0,0,50,0,0 +49,2,250733,1,9,1,10,1,0,0,0,0,46,0,0 +46,3,199725,9,11,2,10,0,3,1,0,0,60,0,0 +54,2,156877,1,9,1,10,1,0,0,0,0,40,34,0 +38,2,122076,5,10,1,6,1,0,0,7298,0,43,0,1 +45,1,216402,10,15,1,3,1,2,0,0,0,50,3,1 +50,1,42402,10,15,1,3,1,0,0,0,2415,30,0,1 +22,2,315974,5,10,0,5,0,0,1,0,0,40,0,0 +31,2,63437,1,9,0,7,0,0,0,0,0,40,38,0 +27,2,160786,1,9,2,4,0,0,0,0,0,30,0,0 +34,2,85374,1,9,1,10,1,0,0,0,0,40,0,0 +46,2,465974,2,7,0,6,3,0,0,0,0,30,0,0 +47,2,78529,0,13,1,5,1,0,0,0,0,60,0,1 +36,0,98037,9,11,1,4,1,2,0,0,0,40,0,0 +22,2,178390,1,9,0,2,3,0,0,0,0,40,0,0 +51,2,210940,1,9,1,5,1,0,0,0,2002,45,0,0 +43,2,64506,5,10,2,4,0,0,0,0,0,30,0,0 +54,2,128378,5,10,6,3,0,0,0,0,0,50,0,0 +24,2,234460,4,5,0,8,3,1,1,0,0,40,21,0 +29,2,176760,10,15,0,3,0,2,0,0,0,55,0,0 +40,0,59460,5,10,2,0,4,0,1,0,0,38,0,0 +18,2,234428,2,7,0,4,3,0,0,0,0,20,0,0 +31,2,215047,0,13,0,0,0,0,0,0,0,50,0,0 +57,2,140426,8,16,1,9,1,0,0,0,1977,40,9,1 +32,2,191777,3,14,0,0,0,1,1,0,0,40,0,0 +48,2,148995,3,14,1,1,1,0,0,0,0,40,0,1 +24,2,229773,5,10,1,10,1,0,0,0,0,35,0,0 +24,2,174461,6,12,2,4,0,0,1,0,0,22,0,0 +24,2,250647,9,11,1,10,1,0,0,0,0,40,24,0 +49,4,119904,0,13,1,3,2,0,1,7688,0,30,0,1 +27,1,151402,1,9,1,7,1,0,0,0,1573,70,0,0 +37,2,184556,5,10,2,9,4,0,1,0,0,40,0,0 +33,2,263561,5,10,1,10,1,0,0,0,0,60,0,1 +19,2,177945,5,10,0,5,3,0,0,0,0,25,0,0 +45,2,306889,0,13,1,1,2,0,1,0,0,40,0,1 +54,4,54377,3,14,2,3,0,0,1,0,0,40,0,0 +47,2,144351,1,9,2,10,4,0,0,0,625,40,0,0 +22,2,95566,5,10,3,5,3,4,1,0,0,22,21,0 +20,2,181675,1,9,0,4,0,0,0,0,0,40,0,0 +36,2,172129,4,5,1,2,1,0,0,0,0,40,0,0 +58,1,105592,7,4,1,6,1,0,0,0,0,40,0,1 +34,5,200689,0,13,2,5,4,0,1,0,0,40,0,0 +36,2,386726,3,14,1,3,2,0,1,0,1977,44,0,1 +28,4,135567,0,13,0,0,0,1,1,4101,0,60,0,0 +38,4,282753,9,11,2,1,3,0,0,0,0,40,0,0 +32,2,137367,2,7,0,10,0,2,0,0,0,40,3,0 +35,5,153976,1,9,1,1,1,0,0,0,0,60,0,0 +51,5,96062,6,12,1,5,1,0,0,0,0,60,0,0 +33,2,152933,5,10,0,1,0,0,0,0,0,45,0,0 +71,2,97870,3,14,2,3,0,0,1,0,0,15,9,0 +48,2,254291,3,14,1,3,1,0,0,0,0,40,0,1 +53,1,101432,1,9,1,5,1,0,0,0,0,50,0,0 +40,2,125776,9,11,1,0,1,0,0,0,0,40,0,1 +64,1,165479,1,9,1,5,1,0,0,0,0,5,0,0 +42,3,172307,1,9,1,0,1,0,0,0,0,48,0,1 +25,2,176729,1,9,1,10,1,0,0,0,0,40,0,1 +66,2,174276,5,10,6,5,4,0,1,0,0,50,0,1 +42,1,79531,5,10,1,1,1,0,0,0,0,55,0,1 +24,2,306460,1,9,0,7,4,0,0,0,0,40,0,0 +19,2,55284,1,9,0,2,3,0,1,0,0,25,0,0 +26,2,172063,5,10,0,5,3,0,1,0,0,24,0,0 +22,2,141028,1,9,0,4,3,1,0,0,0,30,0,0 +33,2,37274,5,10,1,5,1,0,0,0,0,40,0,0 +63,2,31389,2,7,0,7,0,0,0,0,0,12,0,0 +20,2,415913,5,10,0,2,0,0,0,0,0,30,0,0 +33,2,295591,11,3,3,10,0,0,0,0,0,40,4,0 +56,2,159770,1,9,1,10,1,0,0,0,0,40,0,0 +70,1,268832,9,11,1,7,1,0,0,0,0,24,0,1 +42,2,126003,1,9,1,9,1,0,0,0,0,40,0,1 +25,4,225193,0,13,0,3,0,1,1,0,0,40,0,0 +28,2,297735,5,10,1,8,1,0,0,0,0,40,0,1 +80,1,225892,1,9,1,4,1,0,0,1409,0,40,0,0 +36,2,605502,12,6,0,6,0,1,1,0,0,40,0,0 +37,2,174150,3,14,1,1,1,0,0,0,0,40,0,1 +38,2,165466,1,9,1,0,1,0,0,0,0,60,0,1 +52,0,189728,1,9,4,4,0,0,1,0,0,35,0,0 +49,2,360491,1,9,6,0,4,0,1,0,0,40,0,0 +30,2,115040,1,9,1,6,1,0,0,0,0,40,0,0 +36,2,262688,5,10,1,5,1,1,0,7688,0,50,0,1 +70,5,158437,10,15,1,3,1,0,0,0,0,35,0,1 +55,2,41108,5,10,6,7,0,0,0,0,2258,62,0,1 +25,2,149875,0,13,6,1,0,0,1,0,0,40,0,0 +59,2,131916,1,9,1,8,2,0,1,0,0,40,25,1 +22,2,60668,5,10,0,10,0,0,0,0,0,40,0,0 +41,4,153132,6,12,4,10,0,0,0,0,0,50,0,0 +62,2,155256,1,9,1,1,1,0,0,0,0,45,0,1 +54,2,244770,1,9,0,0,5,0,1,0,0,40,0,0 +38,2,312108,1,9,0,4,4,1,1,0,0,40,0,0 +52,2,102828,1,9,1,3,1,0,0,7688,0,40,0,1 +36,2,93225,2,7,1,8,1,0,0,0,0,40,0,0 +74,5,231002,1,9,1,1,1,0,0,0,0,30,0,1 +35,1,256992,11,3,1,4,2,0,1,0,0,15,4,0 +41,2,118721,14,8,2,0,0,3,0,0,0,40,0,0 +30,2,151989,9,11,1,9,2,0,1,0,0,40,0,0 +25,2,109112,1,9,1,8,1,0,0,0,0,48,0,0 +35,2,589809,5,10,0,1,0,0,0,13550,0,60,0,1 +38,2,172538,0,13,1,1,1,0,0,15024,0,50,0,1 +34,0,318982,3,14,1,8,1,0,0,0,1848,40,0,1 +48,2,204629,3,14,1,1,1,0,0,0,0,50,0,1 +50,1,99894,11,3,0,9,0,2,1,0,0,15,0,0 +19,2,369463,1,9,0,0,3,0,1,0,0,40,0,0 +51,2,79324,5,10,1,5,1,0,0,0,0,40,0,0 +39,2,61178,0,13,2,0,4,0,0,0,0,40,0,0 +20,2,204226,2,7,0,4,3,0,1,0,0,40,0,0 +17,2,183110,2,7,0,2,3,0,0,0,0,16,0,0 +42,2,96321,5,10,1,5,1,0,0,0,0,50,0,1 +25,2,167031,5,10,0,4,5,4,1,0,0,25,16,0 +36,2,108997,1,9,2,0,4,0,1,0,0,40,0,0 +65,2,176796,8,16,6,3,0,0,1,0,0,40,0,0 +32,1,134737,0,13,1,8,1,0,0,0,0,70,0,1 +33,5,49795,0,13,0,3,0,0,0,0,0,45,0,0 +32,0,131588,5,10,0,9,4,1,1,0,0,20,0,0 +25,2,307643,1,9,1,6,1,0,0,0,0,40,0,0 +41,4,351350,5,10,2,11,4,0,1,0,0,40,0,0 +44,2,260761,1,9,1,10,1,0,0,0,0,40,0,1 +72,2,156310,12,6,1,4,1,0,0,2414,0,12,0,0 +36,2,207789,1,9,2,1,0,0,0,0,0,52,0,0 +67,1,252842,1,9,1,7,1,0,0,1797,0,20,0,0 +28,2,294936,1,9,1,6,1,0,0,4064,0,45,0,0 +24,2,196269,2,7,1,2,1,4,0,0,0,40,0,0 +17,2,46402,7,4,0,5,3,0,0,0,0,8,0,0 +32,1,267161,0,13,2,1,4,1,1,0,0,30,0,0 +67,2,160456,2,7,6,4,0,0,1,0,0,40,0,0 +51,2,123053,3,14,1,3,1,2,0,5013,0,40,3,0 +32,2,426467,15,2,0,10,0,0,0,3674,0,40,24,0 +39,2,269323,5,10,1,1,1,0,0,0,0,40,0,1 +18,1,42857,5,10,0,10,0,0,1,0,0,35,0,0 +50,1,183915,0,13,1,10,1,0,0,0,0,45,0,1 +24,2,211391,12,6,0,5,0,0,1,0,0,15,0,0 +21,4,193130,5,10,0,0,0,0,1,0,0,40,0,0 +24,2,86745,0,13,0,0,5,2,1,0,0,16,0,0 +34,2,226525,9,11,0,4,3,0,0,0,0,40,0,0 +49,1,343742,12,6,0,10,0,1,0,0,0,32,0,0 +50,2,150975,1,9,2,8,0,3,1,0,0,40,0,0 +33,2,207301,6,12,2,1,3,0,1,0,0,40,0,0 +18,2,135924,5,10,0,0,3,0,0,0,0,40,0,0 +45,2,184277,9,11,2,0,4,0,1,0,0,55,0,1 +20,2,142233,1,9,0,5,0,0,1,0,0,35,0,0 +46,5,120902,0,13,1,1,1,0,0,3103,0,37,0,1 +64,4,158412,1,9,6,0,0,0,1,0,0,40,0,0 +39,2,126161,8,16,0,3,0,0,0,0,0,45,0,0 +35,2,149347,1,9,0,10,0,0,0,0,0,70,0,0 +21,2,322674,5,10,0,4,0,0,0,0,0,32,0,0 +29,2,55390,6,12,0,9,0,0,0,0,0,45,0,0 +38,0,200904,0,13,1,1,2,1,1,0,0,30,0,1 +45,2,166056,1,9,2,4,4,0,1,0,0,40,0,0 +30,1,116666,3,14,2,3,0,2,0,0,0,50,3,1 +41,2,168324,5,10,1,0,2,0,1,0,0,40,0,1 +37,2,121772,1,9,0,10,0,2,0,0,0,40,37,0 +45,2,126889,0,13,1,5,1,0,0,0,1887,60,0,1 +45,5,117605,1,9,1,1,1,0,0,0,0,48,0,1 +20,3,410446,1,9,0,0,5,0,0,0,0,20,0,0 +63,5,38472,5,10,6,5,0,0,1,14084,0,60,0,1 +35,1,335704,5,10,1,1,1,0,0,0,0,40,0,0 +24,2,70261,0,13,1,3,1,0,0,0,0,50,0,0 +19,2,47577,5,10,0,6,0,0,0,0,0,50,0,0 +23,2,117767,1,9,0,4,3,0,0,0,0,35,0,0 +34,2,179641,0,13,0,3,0,0,1,0,0,45,0,0 +36,1,328466,11,3,1,6,1,0,0,0,0,50,4,1 +46,2,265097,1,9,0,2,5,0,0,0,0,5,0,0 +38,4,414791,0,13,1,1,1,0,0,0,0,42,0,1 +55,4,48055,14,8,6,0,0,0,1,0,0,40,0,0 +27,2,341672,5,10,0,0,5,2,0,0,0,40,3,0 +48,2,266764,5,10,1,10,1,0,0,0,0,45,0,1 +35,2,233571,1,9,2,4,3,0,1,0,0,50,0,0 +53,2,126592,5,10,1,10,1,1,0,7688,0,40,0,1 +47,2,70754,1,9,1,10,1,0,0,0,0,40,0,0 +50,2,138852,5,10,2,10,0,0,0,4650,0,22,0,0 +32,2,175856,5,10,1,5,1,0,0,0,0,40,0,0 +40,2,193494,1,9,1,2,1,0,0,0,0,46,0,0 +41,2,104334,5,10,1,5,1,0,0,0,0,50,0,1 +47,3,197332,0,13,2,3,0,0,0,0,0,40,0,0 +21,2,205844,5,10,0,5,3,1,1,0,0,25,0,0 +45,4,206459,3,14,1,0,1,0,0,0,0,35,0,0 +33,2,202822,7,4,0,4,4,1,1,0,0,14,33,0 +68,6,174695,5,10,3,7,4,0,1,0,0,25,0,0 +44,2,183342,10,15,1,1,1,0,0,0,0,55,0,1 +49,2,105614,12,6,1,8,1,0,0,0,0,50,0,0 +45,2,329603,8,16,1,3,1,0,0,0,0,40,12,1 +41,2,77373,5,10,1,6,1,0,0,0,1848,65,0,1 +29,2,207473,7,4,1,6,1,0,0,0,0,40,4,0 +19,2,311974,1,9,0,10,5,0,0,0,0,25,4,0 +56,2,175127,12,6,1,2,1,0,0,0,0,40,0,0 +55,1,111625,1,9,1,10,1,0,0,0,0,60,0,0 +29,2,48895,1,9,0,10,0,0,0,0,0,50,0,0 +21,2,27049,1,9,0,13,0,0,1,0,0,25,0,0 +52,2,94988,11,3,0,2,0,0,0,0,0,50,0,0 +22,2,218343,1,9,0,4,3,0,1,0,0,40,0,0 +20,2,227626,1,9,1,0,1,0,0,0,0,60,0,0 +31,2,272856,1,9,0,10,3,1,0,0,0,50,7,0 +39,2,30916,1,9,1,10,1,0,0,0,0,40,0,0 +55,2,276229,5,10,2,9,0,0,1,0,0,40,0,0 +35,2,289106,6,12,4,5,4,0,0,0,0,40,0,0 +45,2,192776,0,13,1,10,1,0,0,7298,0,55,0,1 +61,2,147280,3,14,1,1,1,0,0,0,0,60,0,1 +18,2,187770,1,9,0,2,3,0,0,0,0,30,0,0 +51,0,213296,0,13,6,0,0,0,0,0,0,40,0,0 +37,1,107410,1,9,1,8,1,0,0,0,0,40,0,0 +32,2,86808,5,10,0,4,3,0,1,0,0,38,0,0 +48,2,149210,1,9,4,10,4,1,0,0,0,45,0,0 +62,2,123411,7,4,1,6,1,0,0,0,0,53,0,0 +28,2,487347,1,9,0,6,0,0,0,0,0,45,0,0 +19,2,283945,12,6,0,2,5,0,0,0,1602,45,0,0 +20,2,375698,5,10,0,0,3,0,1,0,0,15,0,0 +41,2,271753,0,13,1,7,1,0,0,0,0,40,0,0 +29,2,251854,0,13,0,0,0,1,1,0,0,40,0,0 +47,2,264052,0,13,1,1,1,0,0,15024,0,50,0,1 +43,0,28451,0,13,1,3,1,0,0,0,0,37,0,1 +20,2,282604,5,10,0,2,5,0,0,0,0,20,0,0 +29,2,185908,0,13,1,1,1,1,0,0,0,55,0,1 +51,3,198186,0,13,6,3,0,1,1,0,0,40,0,0 +40,2,242521,9,11,1,10,1,0,0,0,0,40,0,1 +26,2,337940,11,3,0,6,0,0,0,0,0,40,4,0 +30,2,212064,0,13,0,3,3,0,1,0,0,40,0,0 +36,2,129263,1,9,6,4,0,0,1,0,0,40,0,0 +68,4,144761,1,9,6,11,0,0,0,0,1668,20,0,0 +42,2,109912,5,10,0,9,0,0,1,0,0,40,0,1 +41,2,113324,1,9,1,2,1,0,0,0,0,40,0,0 +43,2,187795,0,13,1,1,1,0,0,0,0,45,0,1 +20,2,173724,5,10,0,2,3,0,0,0,0,20,0,0 +43,2,185129,0,13,2,9,3,0,0,0,0,40,0,0 +53,2,73134,1,9,1,5,1,0,0,15024,0,60,0,1 +45,2,236040,5,10,1,3,1,0,0,0,0,40,0,1 +39,2,74194,1,9,0,7,4,0,0,0,0,40,0,0 +31,4,102130,3,14,1,3,1,0,0,0,0,45,0,0 +23,2,140915,5,10,0,5,5,2,0,0,0,25,11,0 +38,0,34364,3,14,2,0,0,0,1,0,0,40,0,0 +37,1,258037,1,9,1,6,1,0,0,0,0,45,1,1 +18,2,391585,1,9,0,8,5,0,1,0,0,40,0,0 +41,1,233130,1,9,1,1,1,0,0,0,0,45,4,0 +30,2,101345,0,13,1,5,2,0,1,3103,0,55,0,1 +26,2,248612,0,13,0,3,3,0,0,0,0,30,0,0 +37,2,212465,1,9,1,10,1,0,0,0,0,40,0,0 +25,2,198587,5,10,0,9,0,1,1,2174,0,50,0,0 +33,2,405913,5,10,1,3,1,0,0,0,0,40,30,1 +37,2,588003,0,13,1,1,1,0,0,15024,0,40,0,1 +31,2,46807,0,13,0,9,0,0,0,0,0,40,0,0 +27,2,210498,5,10,1,1,1,0,0,0,0,80,0,0 +35,2,206951,3,14,1,5,1,0,0,0,0,40,0,1 +28,1,237466,5,10,1,0,2,0,1,0,0,30,0,1 +59,2,279636,1,9,0,0,0,0,0,0,0,50,24,0 +42,2,29320,0,13,1,3,1,0,0,0,0,40,0,0 +50,2,271262,1,9,1,6,1,0,0,0,0,40,0,1 +32,2,76773,5,10,2,8,4,0,1,0,0,40,0,0 +27,2,109004,1,9,4,10,4,1,0,0,0,40,0,0 +43,2,226902,0,13,2,8,5,0,0,0,0,40,0,0 +46,2,176552,2,7,2,3,4,3,0,0,0,40,0,1 +41,2,182303,5,10,1,5,1,0,0,0,0,50,0,1 +59,4,296253,3,14,2,3,4,0,1,8614,0,60,0,1 +20,2,218215,5,10,0,5,3,0,1,0,0,30,0,0 +46,1,51271,1,9,1,7,1,0,0,4386,0,70,0,0 +45,2,96100,7,4,1,8,1,1,0,0,0,40,0,0 +29,4,82393,1,9,0,2,4,2,0,0,1590,45,0,0 +23,2,248978,2,7,1,2,1,0,0,0,0,40,4,0 +46,2,254367,1,9,0,6,0,0,0,0,1590,48,0,0 +58,2,94429,5,10,1,10,1,0,0,0,0,40,0,1 +38,2,87282,9,11,0,1,5,2,1,0,0,40,0,0 +29,2,119793,5,10,0,5,5,0,0,0,0,50,0,0 +26,4,197764,0,13,0,3,0,0,1,0,0,40,0,0 +42,2,306982,0,13,1,0,1,2,0,0,0,40,11,1 +61,2,80896,1,9,4,6,4,2,0,0,0,45,0,1 +31,2,197886,5,10,1,5,1,0,0,15024,0,45,0,1 +43,2,355728,1,9,2,8,3,0,0,0,0,40,0,0 +47,2,121124,0,13,1,10,1,0,0,15024,0,50,0,1 +51,0,193720,1,9,1,10,1,0,0,0,0,56,0,1 +23,2,347292,1,9,0,2,0,0,0,0,0,40,0,0 +24,2,34506,1,9,0,8,4,0,1,0,0,40,0,0 +38,2,63509,9,11,1,10,1,0,0,0,0,50,0,0 +48,2,148254,1,9,1,2,2,0,1,0,0,16,0,1 +33,2,190511,1,9,0,10,0,0,0,0,0,30,0,0 +18,2,20057,7,4,0,4,5,2,1,0,0,40,11,0 +52,2,206862,1,9,1,10,1,0,0,0,0,40,0,0 +46,2,189498,0,13,1,3,1,0,0,0,1848,45,0,1 +28,2,166320,1,9,0,3,0,0,0,0,0,40,0,0 +37,2,289886,5,10,0,4,5,2,0,0,0,30,36,0 +45,4,54190,3,14,1,3,1,0,0,0,0,50,0,1 +17,2,147069,12,6,0,5,3,0,1,0,0,16,0,0 +56,2,282023,3,14,1,3,1,0,0,0,0,40,0,1 +38,5,379485,6,12,2,1,4,0,0,0,0,45,0,0 +81,2,129338,7,4,1,6,1,0,0,0,0,10,0,0 +22,2,99829,5,10,0,8,3,0,1,0,0,30,0,0 +43,0,182254,5,10,2,0,4,0,1,0,0,40,0,0 +31,2,109428,6,12,1,0,2,0,1,0,1740,40,0,0 +42,1,351161,0,13,1,3,1,0,0,0,1887,40,0,1 +50,2,132716,1,9,1,6,1,0,0,0,0,40,0,1 +31,2,242984,5,10,4,2,0,0,0,0,0,40,0,0 +35,2,101509,5,10,2,1,0,0,1,0,0,40,0,0 +36,2,119957,0,13,4,4,4,1,1,0,0,35,0,0 +33,2,69727,7,4,1,7,1,0,0,0,0,40,4,0 +36,2,204590,0,13,2,3,4,1,1,0,213,40,0,0 +50,2,182907,1,9,0,2,3,0,0,0,0,25,0,0 +55,2,206487,5,10,1,3,1,0,0,0,0,40,0,1 +29,2,168015,1,9,2,8,4,0,1,0,0,40,0,0 +24,2,149396,5,10,0,4,5,1,1,0,0,30,19,0 +39,3,184964,5,10,2,0,0,0,0,0,0,40,0,1 +34,2,398988,0,13,0,5,0,0,0,0,0,40,0,0 +29,2,128777,7,4,2,10,4,0,1,0,0,55,0,0 +60,2,252413,5,10,1,10,1,4,0,0,0,32,0,1 +33,2,181372,3,14,1,1,2,0,1,0,0,50,0,1 +58,2,216851,4,5,0,2,3,0,0,0,0,40,22,0 +27,2,106935,5,10,4,5,0,0,0,0,0,40,0,0 +46,0,363875,5,10,2,11,4,3,1,0,0,40,0,0 +63,2,287277,1,9,2,11,0,0,0,0,0,40,0,0 +38,1,172342,5,10,2,4,4,0,1,0,0,40,0,0 +23,2,308498,5,10,0,10,3,0,0,0,0,15,0,0 +29,2,122127,0,13,0,3,0,0,1,8614,0,40,0,1 +31,2,106437,10,15,1,3,2,0,1,0,0,60,0,1 +49,5,306289,1,9,1,1,1,0,0,0,0,40,0,1 +45,5,201699,8,16,1,3,1,0,0,0,0,60,0,1 +42,2,282062,4,5,1,6,1,0,0,0,0,40,0,0 +48,2,235108,1,9,1,8,1,0,0,0,0,40,0,0 +33,2,339482,1,9,1,10,1,0,0,0,0,40,0,0 +24,2,181820,5,10,0,0,3,0,0,0,0,40,0,0 +49,1,99335,5,10,1,5,1,0,0,0,0,50,0,0 +40,2,367533,5,10,1,8,1,0,0,2580,0,40,0,0 +57,2,64960,9,11,1,3,1,0,0,0,1902,45,0,0 +50,2,269095,1,9,2,0,0,0,1,0,0,40,0,0 +46,2,58683,0,13,1,1,1,0,0,15024,0,55,0,1 +35,1,89508,5,10,1,1,1,0,0,3908,0,60,0,0 +19,2,100999,5,10,0,4,3,0,1,0,0,20,0,0 +18,2,34125,12,6,0,4,3,0,1,0,0,28,0,0 +20,2,115057,1,9,0,10,0,0,0,0,0,40,0,0 +42,2,139126,1,9,2,6,0,0,0,0,0,40,0,0 +46,2,104632,1,9,1,8,1,2,0,0,0,40,14,1 +40,3,178866,1,9,1,0,2,0,1,0,0,20,0,1 +54,2,139850,3,14,1,1,1,2,0,0,0,45,0,1 +28,2,61435,1,9,1,10,1,0,0,0,0,45,0,0 +38,2,309230,5,10,1,10,1,0,0,0,0,40,0,1 +28,2,45613,5,10,0,13,0,0,1,0,0,40,0,0 +22,2,272615,2,7,0,10,3,0,0,0,0,40,0,0 +31,2,54318,0,13,1,1,1,0,0,0,0,50,0,1 +27,2,165519,1,9,1,10,1,0,0,0,0,40,0,0 +45,2,48495,0,13,1,3,1,0,0,0,0,42,0,1 +38,2,143123,0,13,1,1,1,0,0,0,0,40,0,1 +67,1,431426,6,12,1,1,2,0,1,20051,0,4,0,1 +75,2,256474,3,14,0,11,0,0,0,0,0,16,0,0 +41,2,191451,3,14,2,1,4,1,1,0,0,60,0,1 +37,2,99146,0,13,1,5,1,0,0,0,0,60,0,1 +47,2,235986,1,9,0,1,3,0,1,0,0,50,1,0 +34,4,429897,0,13,1,3,1,0,0,0,0,45,4,1 +25,2,189897,1,9,1,10,3,0,0,0,0,40,0,0 +52,2,145155,1,9,6,0,0,0,1,0,0,40,0,0 +27,0,192257,1,9,0,11,3,0,0,2174,0,40,0,0 +35,2,194960,1,9,0,7,0,4,0,0,0,40,5,0 +44,4,357814,14,8,1,4,5,0,1,0,0,35,4,0 +27,4,137629,1,9,1,1,1,0,0,0,0,80,0,1 +42,2,156526,5,10,0,9,0,0,0,0,0,33,0,0 +26,2,189238,4,5,0,4,3,0,1,0,0,38,22,0 +23,2,202989,1,9,0,3,0,0,0,0,0,40,8,0 +28,2,25684,1,9,0,3,0,3,1,0,0,40,0,0 +38,1,192939,1,9,1,10,1,0,0,0,0,50,0,0 +28,2,138692,5,10,0,10,3,0,0,0,0,50,0,0 +29,2,222249,1,9,0,0,5,0,1,0,0,40,0,0 +56,1,201318,4,5,1,1,5,0,0,3411,0,50,13,0 +30,2,56004,5,10,0,1,3,1,1,0,0,40,0,0 +48,2,182313,5,10,1,2,1,0,0,0,0,40,0,0 +38,2,277248,3,14,1,1,1,0,0,0,0,60,1,1 +24,2,125031,1,9,0,2,5,0,0,0,0,40,0,0 +47,0,216414,8,16,1,3,1,0,0,0,0,40,0,1 +29,2,356133,5,10,0,3,5,0,1,0,0,40,0,0 +45,2,185397,6,12,2,10,0,0,0,0,0,40,0,0 +24,2,308285,1,9,0,10,3,0,0,0,0,40,0,0 +40,2,56651,1,9,1,8,1,0,0,0,0,40,0,0 +28,4,154863,4,5,1,10,1,1,0,0,0,40,33,1 +46,3,44706,0,13,2,3,4,0,1,0,0,50,0,1 +32,2,248754,5,10,1,8,1,0,0,0,0,40,0,0 +20,2,104981,1,9,0,5,0,0,0,0,0,40,0,0 +23,2,315065,5,10,0,4,4,0,0,0,0,35,4,0 +46,2,188325,1,9,1,4,1,0,0,0,0,40,0,0 +21,2,221661,1,9,0,5,3,0,1,0,0,35,0,0 +59,2,81973,3,14,1,1,1,2,0,0,0,40,0,1 +31,2,169122,5,10,1,3,1,0,0,0,0,50,0,0 +48,2,216734,5,10,2,1,0,0,1,0,0,40,0,0 +34,2,98101,7,4,1,6,1,0,0,0,0,40,0,0 +19,2,292511,5,10,0,4,3,0,0,0,0,25,0,0 +20,2,122971,5,10,0,5,3,0,0,0,0,35,0,0 +29,2,124953,0,13,0,3,3,0,0,0,0,50,0,0 +54,2,123011,5,10,1,10,1,0,0,0,0,40,0,1 +36,2,76417,1,9,1,10,1,0,0,0,0,52,0,0 +43,2,351576,0,13,0,5,0,0,0,0,0,50,0,1 +46,3,33794,0,13,1,9,1,0,0,3103,0,40,0,1 +33,2,79923,3,14,1,3,1,0,0,0,0,45,0,1 +33,2,117983,12,6,2,4,4,0,1,0,0,45,0,0 +36,2,186110,5,10,1,6,1,0,0,0,0,40,0,0 +37,2,187589,1,9,1,2,1,0,0,5178,0,40,0,1 +45,1,162923,1,9,1,10,1,0,0,0,0,60,0,0 +25,2,288519,0,13,0,0,0,0,1,0,0,40,0,0 +28,2,33798,9,11,1,8,1,0,0,0,0,40,0,0 +26,2,195734,1,9,0,0,3,0,1,2354,0,40,0,0 +23,2,214120,1,9,0,13,3,0,0,0,0,40,0,0 +24,2,113515,1,9,0,1,0,0,1,0,0,40,0,0 +58,1,261230,5,10,2,3,0,0,1,0,0,40,0,0 +36,2,98515,9,11,2,9,4,0,1,0,0,40,0,0 +46,2,187715,5,10,1,5,1,0,0,0,0,50,0,0 +32,2,123964,5,10,1,5,1,0,0,4386,0,50,0,0 +26,2,68991,1,9,0,4,4,1,0,0,0,40,0,0 +52,2,292110,11,3,0,2,0,0,1,0,0,40,0,0 +19,2,198320,1,9,0,4,0,0,1,0,0,45,0,0 +33,2,709798,0,13,1,3,1,0,0,0,0,60,0,1 +60,2,372838,1,9,1,10,1,0,0,0,0,40,0,0 +39,2,160402,5,10,2,1,0,0,0,0,0,38,0,0 +45,2,98475,0,13,2,1,0,0,0,0,0,45,0,0 +37,4,97136,5,10,3,0,4,1,1,0,0,40,0,0 +29,2,136985,6,12,0,9,3,0,0,0,0,40,0,0 +53,2,187356,5,10,1,10,1,0,0,0,0,66,0,0 +46,0,107231,5,10,1,1,1,0,0,0,1740,40,0,0 +20,2,305874,5,10,0,6,3,0,0,0,0,40,0,0 +39,2,290922,3,14,0,3,3,0,1,0,0,40,0,0 +48,2,248254,5,10,1,3,2,0,1,7298,0,40,0,1 +38,2,160808,1,9,1,10,1,1,0,4386,0,48,0,0 +36,2,247321,1,9,1,10,1,0,0,0,0,45,0,0 +53,2,247651,7,4,2,8,4,1,1,0,0,56,0,0 +29,2,214702,1,9,0,10,0,0,0,0,1974,35,0,0 +64,2,75577,7,4,1,0,1,0,0,2580,0,50,0,0 +34,2,561334,5,10,1,1,1,0,0,0,0,50,0,1 +41,4,401134,0,13,2,3,4,0,1,0,0,40,0,0 +34,2,258170,1,9,2,1,4,0,1,0,0,38,0,0 +22,2,300871,5,10,1,9,1,0,0,0,0,40,0,0 +43,2,136721,14,8,1,10,1,0,0,0,0,40,0,0 +36,2,109133,5,10,0,1,0,0,0,0,0,40,0,0 +47,2,186534,1,9,1,5,1,0,0,0,0,55,0,1 +33,2,241885,5,10,4,8,0,0,0,0,0,40,0,0 +27,2,97165,5,10,0,8,5,0,1,0,0,40,0,0 +33,2,212918,5,10,0,9,0,0,0,0,0,70,0,0 +24,2,211585,1,9,1,6,3,0,1,0,0,40,0,0 +47,4,178309,5,10,2,3,0,0,1,0,0,40,0,0 +48,5,481987,12,6,1,1,1,0,0,0,0,40,0,0 +28,2,215211,1,9,1,5,1,0,0,0,0,50,0,0 +33,4,194901,0,13,1,3,1,0,0,0,0,40,0,1 +44,2,340885,0,13,1,8,1,0,0,0,1977,40,0,1 +33,4,190290,9,11,0,11,0,0,0,0,0,56,0,0 +26,2,188569,5,10,0,0,0,0,1,0,0,25,0,0 +22,2,162282,9,11,0,1,3,0,0,0,0,40,0,0 +34,2,287315,5,10,1,1,1,0,0,0,0,55,0,1 +31,5,304212,5,10,0,1,3,0,0,0,0,45,0,0 +38,4,256864,9,11,1,1,1,0,0,0,0,40,0,0 +51,1,46401,5,10,1,3,2,0,1,0,0,40,0,1 +36,2,37778,5,10,1,1,1,0,0,0,0,40,0,0 +29,2,191722,5,10,1,11,1,0,0,7688,0,54,0,1 +64,1,103643,1,9,1,5,1,0,0,0,0,15,0,1 +24,2,143766,5,10,0,8,3,0,0,0,0,55,0,0 +21,0,204425,5,10,0,1,3,0,1,0,0,20,0,0 +28,2,156257,5,10,1,10,1,0,0,0,0,60,0,1 +41,5,112262,1,9,1,10,1,0,0,0,0,50,0,0 +17,2,28031,4,5,0,4,3,0,0,0,0,16,0,0 +58,2,320102,8,16,1,3,1,0,0,0,0,50,0,1 +50,1,334273,0,13,1,5,1,0,0,0,0,8,0,0 +30,2,356015,2,7,3,2,0,3,0,0,0,40,4,0 +47,2,278900,1,9,1,10,1,0,0,0,0,40,0,0 +24,2,142528,5,10,0,5,3,0,0,0,0,20,0,0 +50,3,343014,5,10,1,1,1,1,0,0,0,40,0,0 +29,2,201017,3,14,0,3,0,0,0,0,0,55,32,0 +31,1,81030,8,16,1,3,1,0,0,0,0,40,0,1 +40,1,34007,1,9,1,7,1,0,0,0,0,70,0,1 +31,2,29662,5,10,0,5,0,0,1,0,0,60,0,0 +53,2,347446,4,5,1,8,1,1,0,0,0,40,0,0 +33,2,90668,1,9,0,0,0,0,1,0,0,40,0,0 +43,2,190403,0,13,1,4,1,0,0,0,0,40,0,0 +56,2,109015,5,10,1,1,2,0,1,7688,0,50,0,1 +38,2,234807,0,13,1,1,2,0,1,0,0,50,0,1 +18,2,157131,2,7,0,5,3,0,1,0,0,30,0,0 +50,2,94081,1,9,1,1,1,0,0,0,0,40,0,1 +78,2,135566,1,9,6,5,4,0,1,2329,0,12,0,0 +27,2,103164,2,7,1,10,1,0,0,0,0,40,0,0 +19,2,570002,5,10,0,5,3,0,1,0,0,25,0,0 +24,0,215797,0,13,0,9,0,0,1,0,0,40,0,0 +20,2,289405,5,10,0,5,3,0,0,0,1602,15,0,0 +25,2,239461,3,14,0,3,3,0,0,0,0,35,0,0 +34,2,101510,0,13,2,5,0,0,1,0,0,50,0,1 +30,5,443546,9,11,1,5,1,0,0,0,0,35,0,0 +37,3,141029,3,14,2,3,0,0,1,0,0,40,0,0 +38,2,207202,1,9,1,8,1,0,0,0,0,48,0,1 +67,6,137192,1,9,1,0,1,2,0,0,0,12,11,0 +35,2,222989,1,9,1,6,1,0,0,0,0,30,0,0 +75,1,36325,1,9,1,7,1,0,0,0,0,30,0,0 +47,2,73394,5,10,1,1,2,0,1,0,0,50,0,0 +23,2,249046,12,6,1,2,1,0,0,0,0,40,0,0 +51,3,100653,1,9,2,0,0,0,1,0,0,8,0,0 +42,4,1125613,1,9,2,4,0,1,0,0,0,40,0,0 +32,2,101352,5,10,1,9,2,0,1,0,0,32,0,1 +54,2,340476,1,9,4,5,4,0,1,0,0,35,0,0 +20,2,192711,5,10,0,2,3,0,1,0,0,40,0,0 +39,2,273362,1,9,1,10,1,0,0,0,0,40,0,1 +41,2,100451,1,9,1,10,1,0,0,7688,0,38,0,1 +35,2,85399,1,9,0,8,0,0,1,0,0,40,0,0 +45,4,168191,0,13,1,10,1,0,0,0,0,35,0,1 +27,2,153475,0,13,0,5,0,0,1,0,0,40,0,0 +61,1,196773,7,4,1,5,1,0,0,0,0,30,0,1 +41,2,180138,1,9,0,5,0,0,0,0,0,50,0,0 +22,2,48347,5,10,0,9,3,0,0,0,0,40,0,0 +55,2,175071,5,10,1,10,1,1,0,15024,0,40,0,1 +25,2,181772,5,10,1,10,1,0,0,0,0,40,0,0 +20,2,284317,5,10,0,4,3,0,1,0,0,35,0,0 +20,2,237305,5,10,0,8,5,1,1,0,0,35,0,0 +67,5,111321,0,13,1,1,1,0,0,0,0,16,0,0 +44,2,278476,5,10,1,5,1,0,0,0,0,60,0,1 +42,2,39060,1,9,1,5,1,0,0,0,0,60,0,1 +29,4,205262,5,10,0,0,0,4,0,0,0,40,16,0 +48,2,198000,5,10,0,10,4,0,1,0,0,38,0,1 +25,2,397962,1,9,0,0,5,1,1,0,0,40,0,0 +31,2,178370,1,9,2,4,4,0,1,0,0,99,0,1 +48,2,121253,0,13,3,5,4,0,1,0,2472,70,0,1 +40,2,56072,3,14,2,3,0,0,0,0,0,20,0,0 +26,2,176756,5,10,1,5,1,0,0,0,0,40,0,0 +28,2,60374,1,9,1,4,3,0,1,0,0,35,0,0 +52,2,165681,5,10,1,10,1,0,0,0,0,40,0,1 +41,1,287037,1,9,1,3,1,0,0,0,0,40,0,0 +39,1,55568,0,13,1,7,2,0,1,0,0,50,0,0 +48,2,155509,1,9,0,0,0,1,1,0,0,16,33,0 +19,2,201178,1,9,0,5,0,0,1,0,0,30,0,0 +27,2,37250,5,10,1,8,1,0,0,0,1651,40,0,0 +59,2,314149,9,11,1,5,1,0,0,0,1740,50,0,0 +19,2,264593,5,10,0,5,5,0,0,0,0,40,0,0 +32,2,159589,1,9,0,2,3,0,0,0,0,50,0,0 +39,2,454915,1,9,0,2,5,0,0,0,0,40,0,0 +33,2,285131,1,9,1,10,1,0,0,0,0,40,0,0 +38,2,150057,1,9,0,2,0,0,0,0,0,40,0,0 +27,2,55390,5,10,0,7,3,0,0,0,0,45,0,0 +23,2,314894,1,9,0,1,3,0,1,0,0,45,0,0 +25,4,124483,0,13,0,0,0,2,0,0,0,20,3,0 +37,5,97986,6,12,1,5,1,0,0,0,0,68,0,0 +31,2,210562,1,9,1,6,1,0,0,0,0,65,0,0 +24,2,233280,6,12,0,5,3,0,1,0,0,37,0,0 +53,4,164300,0,13,2,0,4,0,1,0,0,38,21,0 +25,2,263773,5,10,1,0,2,0,1,0,0,40,0,1 +59,2,96459,2,7,0,8,0,0,0,0,0,40,0,0 +39,3,116608,1,9,2,0,4,0,1,0,0,40,0,0 +28,2,180007,5,10,0,2,3,0,0,0,0,40,0,0 +22,2,305466,1,9,0,2,0,0,0,0,0,40,0,0 +20,2,238917,1,9,0,10,5,0,0,0,0,40,22,0 +25,2,129784,5,10,0,4,3,0,1,0,0,40,0,0 +27,2,367390,5,10,0,10,4,0,0,0,0,50,0,0 +20,2,235691,1,9,0,5,4,0,0,0,0,40,0,0 +43,1,160369,12,6,2,7,4,0,0,0,0,25,0,0 +39,2,206298,5,10,2,0,0,0,1,0,0,40,0,0 +27,2,183523,0,13,0,3,0,0,0,0,0,45,0,0 +17,2,217342,12,6,0,5,3,0,1,0,0,5,0,0 +40,0,141858,10,15,1,3,1,0,0,0,0,72,0,0 +50,2,213296,5,10,1,10,1,0,0,0,0,48,0,1 +23,5,201682,0,13,0,0,3,0,1,0,0,35,0,0 +60,2,178312,1,9,1,5,1,0,0,7298,0,65,0,1 +30,2,269723,1,9,0,1,0,0,1,0,0,40,0,0 +24,2,200593,1,9,1,2,1,0,0,0,0,50,0,0 +23,2,32616,0,13,0,0,3,0,1,0,0,20,0,0 +24,2,259510,0,13,1,3,1,0,0,5013,0,30,0,0 +45,1,271828,0,13,1,10,1,0,0,0,0,20,0,0 +58,5,78104,5,10,1,1,1,0,0,7298,0,60,0,1 +22,2,113703,5,10,0,5,5,0,0,0,0,20,0,0 +41,2,187802,5,10,0,2,0,0,0,0,0,40,0,0 +48,2,440706,7,4,1,8,1,0,0,0,0,40,0,1 +31,2,191834,1,9,2,8,5,0,0,0,0,40,0,0 +33,2,149184,10,15,1,3,1,0,0,0,1977,50,0,1 +49,5,315998,0,13,1,1,1,0,0,0,0,50,0,0 +30,2,159589,0,13,1,3,1,0,0,7688,0,50,0,1 +38,2,60313,1,9,0,10,0,0,0,0,0,40,0,0 +58,4,32855,1,9,1,6,1,0,0,0,0,48,0,0 +58,2,142326,0,13,2,3,0,0,1,0,0,50,0,0 +61,1,201965,1,9,1,1,1,0,0,0,0,40,0,0 +58,2,172333,1,9,1,5,1,0,0,7688,0,40,0,1 +32,2,206541,9,11,1,9,1,0,0,0,0,45,0,1 +33,1,177828,1,9,2,10,0,0,0,0,0,50,0,0 +28,2,303440,0,13,4,1,0,0,1,0,0,50,0,1 +22,2,89991,5,10,0,4,3,0,1,0,0,11,0,0 +35,2,186009,1,9,1,10,1,0,0,0,0,40,0,1 +59,2,170988,1,9,1,5,1,0,0,0,0,55,0,0 +50,1,213654,1,9,1,5,1,1,0,0,0,40,0,0 +56,5,32316,14,8,6,1,0,0,1,0,0,40,0,0 +36,1,150371,1,9,0,10,0,0,0,0,0,40,0,0 +28,2,314649,5,10,1,5,1,3,0,0,0,60,0,0 +42,2,240255,9,11,1,3,1,1,0,0,0,40,0,1 +60,2,206339,1,9,1,4,1,0,0,0,0,40,0,0 +41,5,230168,5,10,1,5,1,0,0,0,0,91,0,0 +42,2,171424,0,13,1,9,1,0,0,7298,0,45,0,1 +36,2,148581,1,9,1,10,1,0,0,0,0,55,0,1 +52,4,89705,3,14,1,3,1,0,0,0,0,40,0,1 +42,1,248406,1,9,1,6,1,0,0,0,0,40,0,0 +26,4,72594,5,10,1,11,1,0,0,0,0,55,0,1 +31,4,137537,0,13,2,3,4,0,1,0,0,40,0,0 +47,2,225065,11,3,4,5,4,0,1,0,0,40,4,0 +35,2,217274,5,10,1,8,1,0,0,0,0,50,0,0 +19,2,69151,4,5,0,2,3,0,0,0,0,25,0,0 +59,1,81107,5,10,1,5,2,0,1,0,0,80,0,1 +38,2,205852,0,13,1,1,1,0,0,0,0,40,0,1 +36,2,201117,0,13,1,1,1,0,0,0,0,50,0,0 +35,2,397307,3,14,0,1,0,0,1,0,0,55,0,0 +39,2,115422,1,9,1,7,1,0,0,0,0,30,0,0 +64,2,114994,5,10,4,4,0,0,0,0,0,40,0,0 +17,4,39815,12,6,0,4,3,0,1,0,0,25,0,0 +49,2,151584,5,10,1,4,1,0,0,0,0,32,0,0 +19,2,164938,5,10,0,4,3,0,1,0,0,25,0,0 +36,1,179896,1,9,1,3,2,0,1,3137,0,40,0,0 +26,2,253841,1,9,0,2,0,0,0,0,0,45,0,0 +27,2,177955,11,3,0,13,5,0,1,2176,0,40,22,0 +66,2,113323,0,13,1,3,1,0,0,20051,0,40,0,1 +38,2,320305,7,4,1,0,1,0,0,0,0,40,0,0 +25,2,229287,0,13,0,1,5,0,1,0,0,25,0,0 +19,2,100790,1,9,0,3,0,0,1,0,0,40,0,0 +30,2,331419,6,12,0,10,0,0,0,4787,0,50,0,1 +22,2,171419,9,11,0,1,4,2,0,0,0,40,27,0 +60,2,202226,5,10,2,10,3,0,0,0,0,44,0,1 +54,2,308087,5,10,1,9,1,0,0,0,1977,18,0,1 +46,2,220124,1,9,4,10,0,0,0,0,0,37,0,0 +33,0,31703,5,10,0,4,3,0,0,0,0,40,0,0 +51,4,153908,3,14,2,1,0,0,1,0,0,40,0,0 +43,2,180599,10,15,1,3,1,0,0,15024,0,60,0,1 +60,5,160062,1,9,1,7,1,0,0,0,0,25,0,0 +39,1,148443,1,9,1,7,1,0,0,0,0,60,0,0 +23,2,91733,0,13,0,9,3,0,1,3325,0,40,0,0 +39,2,176634,6,12,0,9,0,0,1,0,0,40,0,0 +40,4,74949,5,10,0,1,0,0,0,0,0,40,0,0 +48,2,165484,5,10,1,1,1,0,0,0,0,65,0,1 +24,2,44738,1,9,0,2,5,0,0,0,0,40,0,0 +32,2,130040,1,9,2,2,0,0,0,0,0,40,0,0 +31,1,234537,5,10,1,10,1,0,0,0,0,60,0,0 +39,2,179016,1,9,0,8,0,1,0,0,0,40,0,0 +27,2,335421,3,14,0,1,3,0,1,0,0,40,0,0 +45,0,312678,3,14,0,0,0,1,0,0,0,38,0,0 +31,2,198751,0,13,0,10,0,2,0,0,0,40,36,0 +63,2,131519,1,9,2,1,0,0,1,0,0,40,0,0 +45,2,285060,0,13,1,1,1,0,0,0,0,50,0,1 +28,0,189765,5,10,4,0,4,0,1,0,0,50,0,0 +23,2,130905,0,13,0,5,3,0,1,0,0,40,0,0 +50,2,146325,1,9,1,10,1,0,0,0,0,44,0,1 +33,2,102821,14,8,1,11,1,0,0,0,0,40,0,0 +27,2,388998,0,13,0,5,0,0,0,13550,0,46,0,1 +29,2,82910,5,10,1,6,1,0,0,0,0,40,0,0 +36,2,309122,1,9,2,0,4,0,1,0,0,35,0,0 +60,2,532845,15,2,1,10,1,0,0,0,0,40,4,1 +23,2,55215,0,13,0,5,3,0,0,0,0,55,0,0 +38,5,176357,1,9,1,1,1,0,0,0,0,50,0,0 +60,2,185836,10,15,1,1,1,0,0,0,0,40,0,1 +20,1,54152,5,10,0,10,0,0,1,0,0,35,0,0 +37,2,212437,5,10,6,8,4,1,1,0,0,48,0,0 +37,2,224566,1,9,0,10,4,0,0,0,0,40,0,0 +58,2,200040,1,9,1,10,1,0,0,0,0,40,0,0 +25,2,41526,0,13,0,10,3,0,0,0,0,30,8,0 +27,2,89598,5,10,0,0,4,0,1,0,0,60,0,0 +33,2,323811,5,10,1,8,1,0,0,0,0,55,0,0 +43,0,30824,5,10,2,0,0,0,1,0,0,40,0,0 +21,3,181096,5,10,0,9,3,1,0,0,0,20,0,0 +45,2,217953,1,9,1,10,1,4,0,0,0,40,4,0 +44,2,222635,11,3,1,8,1,1,0,0,0,40,0,0 +53,2,346871,1,9,2,3,0,0,0,4787,0,46,0,1 +31,2,184889,1,9,0,4,3,1,1,0,0,20,0,0 +18,3,101709,2,7,0,4,3,2,0,0,0,15,11,0 +20,2,125010,1,9,0,4,3,0,1,0,0,30,0,0 +32,2,53135,1,9,0,8,0,0,0,0,0,40,0,0 +48,2,498328,12,6,1,6,1,1,0,0,0,40,0,0 +46,2,604380,1,9,1,4,1,1,0,0,0,40,0,0 +28,2,174327,1,9,1,8,1,0,0,0,0,50,0,0 +27,1,357283,1,9,0,5,0,1,0,0,0,40,0,0 +18,3,280728,5,10,0,5,3,0,1,0,0,32,0,0 +69,1,185039,1,9,1,1,1,0,0,9386,0,12,0,1 +50,5,251240,3,14,1,5,1,0,0,0,0,40,0,1 +43,2,143046,1,9,1,8,2,0,1,0,0,40,34,0 +32,2,210541,0,13,2,5,4,0,1,0,0,30,0,0 +43,2,172364,1,9,4,1,0,0,1,0,0,48,0,0 +52,1,138611,1,9,1,5,1,0,0,7688,0,55,0,1 +35,2,139647,5,10,2,1,0,0,1,0,0,40,0,1 +46,2,164427,1,9,2,0,3,0,1,0,0,45,0,0 +58,2,205235,1,9,1,6,1,0,0,0,0,60,0,1 +46,5,192779,10,15,1,3,1,0,0,15024,0,60,0,1 +40,2,163434,1,9,0,10,0,0,0,0,0,50,0,0 +25,2,264055,0,13,0,0,3,0,0,0,0,40,0,0 +22,2,336215,6,12,0,0,0,0,1,0,0,25,0,0 +33,3,78307,0,13,1,3,1,0,0,0,0,40,0,0 +49,3,233059,9,11,1,10,1,0,0,0,0,40,0,0 +62,2,91433,12,6,2,3,4,0,1,0,0,40,0,0 +56,4,157525,5,10,2,11,0,1,0,0,0,48,0,0 +24,2,86065,1,9,0,6,4,0,1,0,0,40,4,0 +42,2,22831,1,9,0,4,0,0,1,0,0,40,0,0 +41,2,180181,3,14,2,1,4,0,1,0,0,40,0,0 +23,2,212617,0,13,0,4,0,0,0,0,0,66,16,0 +35,2,336793,0,13,0,0,5,0,0,0,0,40,0,0 +22,2,283969,1,9,0,8,3,0,0,0,0,40,4,0 +32,1,35595,1,9,1,10,1,0,0,0,0,50,0,0 +25,2,410240,1,9,0,10,3,0,0,0,0,40,0,0 +66,2,178120,11,3,2,13,0,1,1,0,0,15,0,0 +26,0,294400,1,9,1,11,1,0,0,0,0,38,0,0 +46,2,65353,5,10,2,6,3,0,0,3325,0,55,0,0 +55,2,189719,0,13,1,1,1,0,0,0,0,45,0,1 +24,2,23438,1,9,1,10,1,0,0,0,0,40,0,0 +25,2,178037,1,9,0,5,4,0,0,0,0,40,0,0 +22,2,109815,5,10,0,0,0,0,1,0,0,40,0,0 +31,2,197860,1,9,0,4,0,0,0,0,0,40,0,0 +30,2,271933,1,9,2,0,0,0,1,0,0,40,0,0 +54,2,141663,1,9,0,4,0,0,0,0,0,15,0,0 +56,2,92215,4,5,2,10,0,0,1,0,0,40,0,1 +47,2,93449,1,9,1,10,1,2,0,0,0,60,28,0 +29,2,235393,1,9,1,10,1,1,0,0,0,40,0,0 +53,2,151864,1,9,1,10,1,0,0,0,0,40,0,0 +22,2,189277,1,9,0,8,4,1,1,0,0,40,0,0 +42,2,344572,1,9,2,1,0,0,1,0,0,40,0,1 +21,2,265356,5,10,0,5,5,0,0,0,0,40,0,0 +36,5,166880,1,9,0,4,0,0,1,0,0,70,0,0 +69,2,213249,9,11,6,5,0,0,1,0,0,25,0,0 +31,2,112627,1,9,1,6,1,3,0,0,0,40,0,0 +48,2,125120,5,10,2,0,4,0,1,0,0,55,0,0 +23,2,60409,1,9,0,1,0,0,1,0,0,40,0,0 +24,2,243190,6,12,4,10,4,2,0,8614,0,40,0,1 +47,2,583755,1,9,1,0,1,1,0,0,0,40,0,1 +36,2,68089,1,9,0,8,4,3,1,0,0,40,0,0 +39,2,306646,6,12,1,1,1,0,0,0,0,50,0,1 +22,2,186573,1,9,0,6,0,0,1,0,0,46,0,0 +27,2,279580,0,13,0,5,0,0,0,10520,0,45,0,1 +36,2,437909,1,9,1,8,1,0,0,0,0,40,0,0 +54,2,420691,15,2,1,4,1,0,0,0,0,40,4,0 +33,3,94193,1,9,2,0,4,0,1,0,0,40,0,0 +42,2,154076,1,9,1,3,1,0,0,7688,0,50,0,1 +52,2,145879,5,10,1,5,1,0,0,0,0,65,0,0 +23,2,208946,0,13,0,5,3,0,0,0,0,32,0,0 +33,2,231826,15,2,1,2,1,0,0,0,0,40,4,0 +30,2,178587,9,11,2,0,0,0,1,0,0,38,0,0 +35,2,213208,9,11,1,9,1,1,0,0,0,38,2,0 +27,2,153869,1,9,0,2,3,0,0,0,0,37,0,0 +24,2,88676,1,9,0,4,3,0,0,0,0,35,0,0 +44,4,151089,1,9,1,8,1,0,0,0,0,40,0,0 +62,2,138621,9,11,4,13,0,1,1,0,0,20,0,0 +45,2,30457,0,13,1,1,1,0,0,15024,0,40,0,1 +75,1,213349,1,9,1,7,1,0,0,0,0,20,0,0 +47,2,192776,0,13,1,3,1,0,0,0,0,50,0,0 +64,2,192884,10,15,1,1,1,0,0,0,0,60,0,0 +54,2,103024,1,9,2,9,0,0,0,0,0,42,0,1 +41,3,510072,0,13,1,1,1,0,0,0,0,40,0,1 +33,2,178615,6,12,1,10,1,0,0,0,0,40,0,0 +20,2,249956,5,10,0,0,3,0,1,0,0,10,0,0 +51,2,177705,0,13,2,5,0,0,0,0,0,50,0,1 +45,5,121124,10,15,0,10,0,0,0,0,0,50,0,1 +43,2,557349,12,6,1,6,1,0,0,0,0,40,29,0 +30,2,89735,1,9,0,10,3,0,0,0,1504,40,0,0 +32,2,222548,1,9,2,0,3,0,1,0,0,40,0,0 +61,2,316359,5,10,2,5,0,0,1,0,0,40,0,0 +21,2,200089,15,2,1,4,5,0,0,0,0,40,7,0 +56,2,271795,2,7,2,10,0,0,0,0,0,49,0,0 +28,2,31801,1,9,0,2,5,0,0,0,0,60,0,0 +23,2,196508,5,10,0,2,3,1,1,0,0,40,0,0 +55,2,189933,5,10,1,6,1,0,0,0,0,84,0,0 +33,2,361497,1,9,0,6,0,0,0,0,0,70,0,0 +22,2,150175,5,10,0,0,3,0,1,0,0,20,0,0 +43,4,155106,9,11,1,1,1,0,0,0,0,40,0,0 +32,1,62272,1,9,2,1,4,0,1,0,0,40,0,0 +38,2,189916,5,10,1,5,2,0,1,0,0,40,0,0 +18,2,324011,4,5,0,7,3,0,0,0,0,20,0,0 +35,2,105803,5,10,1,10,1,0,0,0,0,50,0,1 +29,2,107998,1,9,2,8,3,0,1,0,0,40,0,0 +19,2,340567,15,2,0,2,0,0,0,0,0,55,4,0 +39,2,167777,2,7,1,10,1,0,0,0,0,35,0,0 +29,2,228860,5,10,1,1,1,0,0,0,1887,50,0,1 +45,5,40666,10,15,1,3,1,0,0,0,0,55,0,1 +44,2,277488,5,10,1,8,1,0,0,3103,0,40,0,1 +42,4,195897,7,4,1,10,1,0,0,0,0,40,0,0 +34,2,242984,0,13,0,5,0,0,0,0,0,40,0,0 +52,4,236497,0,13,1,9,1,0,0,0,0,40,0,0 +64,2,59829,1,9,1,7,1,0,0,0,0,25,23,0 +30,2,24292,0,13,1,5,1,0,0,0,0,45,0,1 +43,4,180407,0,13,2,1,4,0,0,0,0,42,9,0 +49,1,121238,5,10,0,10,4,0,0,0,0,40,0,0 +35,2,281982,5,10,1,3,1,0,0,0,0,40,0,1 +37,1,348739,10,15,1,3,1,0,0,0,0,50,0,1 +49,2,194189,7,4,1,2,1,0,0,0,0,40,0,0 +19,2,329130,2,7,4,4,3,0,1,0,0,40,0,0 +22,2,205939,0,13,0,1,3,0,0,2202,0,4,0,0 +31,2,62165,1,9,0,4,3,1,0,0,0,40,0,0 +26,2,224361,5,10,1,10,1,0,0,0,0,40,0,0 +44,2,34722,5,10,1,5,1,0,0,0,0,55,0,0 +38,2,175972,5,10,1,4,2,0,1,0,0,40,0,0 +33,1,359428,1,9,1,5,1,0,0,0,0,60,0,0 +18,2,268952,14,8,0,4,3,0,0,0,0,20,0,0 +32,2,257978,9,11,6,9,4,1,1,0,0,40,0,0 +27,2,118799,1,9,2,0,0,0,1,0,0,40,0,0 +28,0,78356,3,14,1,1,1,1,0,0,0,40,2,0 +30,1,609789,9,11,0,10,0,0,0,0,0,40,0,0 +33,2,123157,1,9,0,4,0,1,0,0,0,38,0,0 +74,2,84197,3,14,2,5,0,0,1,0,0,10,0,0 +36,2,162312,1,9,0,10,0,2,0,0,0,70,27,0 +36,2,138441,6,12,1,9,1,0,0,0,0,55,0,0 +29,2,239753,1,9,1,0,2,0,1,0,2057,20,0,0 +39,2,262158,0,13,2,1,4,0,1,0,0,45,0,0 +25,5,133373,0,13,0,5,0,0,0,0,0,80,0,0 +21,2,57916,1,9,4,7,3,0,0,0,0,40,0,0 +39,0,142897,9,11,0,1,4,0,1,0,0,50,0,0 +38,2,161016,5,10,2,3,0,0,1,0,0,32,0,0 +20,2,227491,1,9,0,5,0,2,1,0,0,25,0,0 +51,2,306790,1,9,2,10,0,0,0,0,0,40,0,0 +21,2,33831,1,9,0,0,4,0,1,0,0,40,0,0 +36,2,188972,5,10,0,3,0,0,1,0,0,40,0,0 +50,2,313546,1,9,4,4,4,1,1,0,0,40,0,0 +38,2,220585,1,9,1,1,1,0,0,0,0,55,0,1 +25,4,476599,0,13,0,3,0,0,1,0,0,40,0,0 +23,2,163665,5,10,0,5,3,0,1,0,0,15,0,0 +36,2,306646,0,13,1,1,1,0,0,0,0,55,0,1 +41,2,206470,0,13,1,3,1,0,0,0,0,40,9,0 +34,2,169583,3,14,0,1,0,0,1,0,0,50,0,0 +19,0,127085,5,10,0,4,3,0,0,0,0,10,0,0 +18,2,152044,12,6,0,4,3,0,1,0,0,3,0,0 +36,2,111387,12,6,2,5,3,0,0,0,0,40,0,0 +46,2,102318,5,10,1,6,1,0,0,0,1887,40,0,1 +29,2,213692,5,10,0,10,3,0,0,0,0,45,0,0 +23,2,163665,1,9,0,1,0,0,1,0,0,32,0,0 +35,2,30529,1,9,1,2,1,0,0,0,0,40,0,0 +35,2,290226,1,9,0,6,3,0,0,0,0,40,0,0 +40,2,182136,1,9,1,6,1,0,0,0,0,40,0,0 +22,2,73266,5,10,0,6,3,2,0,0,0,40,0,0 +19,0,60412,5,10,0,0,3,0,1,0,0,15,0,0 +70,2,187891,2,7,1,6,1,0,0,0,0,40,0,0 +38,2,194304,5,10,2,6,0,1,0,0,0,55,0,0 +35,2,160910,5,10,1,5,1,0,0,0,0,50,0,0 +25,2,148300,5,10,0,4,3,0,1,0,0,35,0,0 +39,2,165743,5,10,1,10,1,0,0,0,0,45,0,1 +43,2,184018,6,12,1,3,1,0,0,0,0,50,0,0 +37,3,188069,5,10,1,0,1,0,0,0,0,40,11,1 +51,2,138852,1,9,1,4,1,0,0,7298,0,40,22,1 +20,2,164441,1,9,0,4,3,1,0,0,0,40,0,0 +21,2,199419,5,10,0,0,0,0,1,0,0,40,0,0 +47,2,181342,1,9,1,2,2,1,1,0,0,40,0,0 +44,2,173382,6,12,2,9,4,0,1,0,0,40,0,0 +17,2,184924,4,5,0,2,3,0,0,0,1719,15,0,0 +25,2,215384,2,7,0,4,0,0,0,0,0,40,0,0 +43,0,424094,8,16,0,3,0,0,1,0,0,40,0,0 +46,3,212120,9,11,1,0,1,0,0,0,0,40,0,1 +42,2,185764,5,10,1,8,1,0,0,0,0,60,0,0 +46,4,133969,3,14,2,3,0,3,0,0,0,40,0,0 +22,2,32616,5,10,0,4,0,0,1,0,0,30,0,0 +49,2,149210,1,9,1,6,1,1,0,0,0,40,0,0 +21,2,161210,1,9,1,8,1,0,0,0,0,50,0,0 +53,2,285621,3,14,1,0,2,0,1,0,0,40,0,1 +43,2,282069,5,10,2,10,4,0,0,0,0,42,0,0 +22,2,97508,1,9,0,4,3,0,0,0,0,50,0,0 +33,2,356823,0,13,0,3,0,0,1,10520,0,45,0,1 +28,2,171133,9,11,0,0,3,0,1,0,0,40,0,0 +25,2,231638,5,10,0,9,4,0,1,0,0,24,0,0 +40,2,191342,0,13,1,1,1,2,0,0,0,40,26,1 +50,2,226497,5,10,1,9,1,0,0,0,0,45,0,1 +48,1,373606,5,10,2,5,4,0,0,0,0,65,0,1 +30,2,39150,1,9,1,8,1,0,0,0,0,40,0,0 +33,2,288840,1,9,3,4,4,1,1,0,0,38,0,0 +34,2,293703,5,10,1,10,1,2,0,0,0,40,11,0 +42,2,79586,0,13,1,0,1,2,0,0,0,40,0,1 +48,1,82098,5,10,1,1,1,2,0,0,0,65,0,0 +38,2,245372,0,13,1,3,1,0,0,7688,0,45,0,1 +29,2,78261,1,9,1,8,1,0,0,0,0,40,0,0 +33,2,355996,12,6,0,2,0,0,0,0,0,40,0,0 +64,2,218490,0,13,2,1,0,0,0,27828,0,55,0,1 +44,2,110908,9,11,1,6,2,0,1,0,0,25,0,0 +42,3,34218,0,13,1,1,1,0,0,7298,0,50,0,1 +49,2,248895,1,9,1,8,1,0,0,0,0,45,0,0 +25,2,363707,1,9,1,2,1,0,0,0,0,40,0,0 +33,2,272411,0,13,0,1,0,0,1,0,0,40,0,0 +38,2,128033,5,10,1,5,1,0,0,0,0,60,0,0 +20,2,177287,1,9,0,5,0,0,1,0,0,38,0,0 +44,2,197344,1,9,0,2,0,0,0,0,0,50,0,0 +45,2,285858,0,13,1,6,1,0,0,0,0,40,0,1 +27,5,193868,1,9,0,5,0,0,0,0,0,50,0,0 +18,2,232082,1,9,0,8,3,0,0,0,0,40,0,0 +38,2,27408,1,9,2,10,4,0,0,0,0,50,0,0 +45,2,247043,2,7,1,10,1,0,0,0,0,42,0,0 +27,4,162404,1,9,0,11,0,1,0,2174,0,40,0,0 +64,2,236341,11,3,6,4,0,1,1,0,0,16,0,0 +66,4,179285,1,9,1,1,1,0,0,3432,0,20,0,0 +34,2,30433,0,13,0,5,0,0,1,0,0,35,0,0 +45,1,102771,0,13,1,6,1,0,0,0,0,40,0,1 +42,1,221172,1,9,2,10,0,0,0,0,0,40,0,0 +32,2,108116,0,13,1,1,1,0,0,0,1902,60,0,1 +26,2,375499,12,6,0,0,0,1,0,0,0,20,0,0 +27,2,178688,9,11,0,10,5,0,0,0,0,40,0,0 +21,2,276709,5,10,0,5,5,0,1,0,0,40,0,0 +47,2,84790,5,10,1,10,1,0,0,0,0,40,0,0 +20,0,37482,5,10,0,0,3,0,1,0,0,40,0,0 +46,0,178686,0,13,1,3,1,0,0,0,0,38,0,1 +55,2,110748,0,13,1,1,1,0,0,0,1887,40,0,1 +28,2,116613,5,10,0,9,3,0,1,0,0,24,0,0 +21,2,108687,5,10,0,5,3,0,1,0,0,40,0,0 +36,2,365739,1,9,0,8,0,0,0,0,0,40,0,0 +29,2,195284,8,16,2,3,0,0,1,0,0,60,0,1 +37,2,140854,0,13,1,1,1,0,0,0,0,50,0,1 +81,1,193237,15,2,6,5,5,0,0,0,0,45,4,0 +41,2,46870,5,10,2,1,0,0,1,0,0,40,0,0 +29,2,351324,0,13,0,5,3,0,1,0,0,40,0,0 +30,1,189265,6,12,2,0,0,0,1,0,0,40,0,0 +25,2,236564,1,9,0,0,0,0,0,0,0,40,0,0 +42,3,557644,1,9,0,0,4,0,1,0,0,40,0,0 +30,2,374454,1,9,2,6,3,1,0,0,0,40,0,0 +18,2,122775,1,9,0,4,3,0,0,0,0,35,0,0 +26,2,214413,2,7,0,8,4,0,0,6497,0,48,0,0 +30,2,329425,5,10,0,11,3,0,0,0,0,48,0,0 +61,2,178312,6,12,1,1,1,0,0,0,0,42,0,0 +21,2,241951,1,9,0,8,0,0,0,0,0,45,0,0 +53,2,130143,1,9,1,8,1,0,0,0,0,48,0,0 +41,5,114580,10,15,1,1,2,0,1,0,2415,55,0,1 +43,5,130126,5,10,1,1,1,0,0,15024,0,45,0,1 +60,2,399387,7,4,4,13,4,1,1,0,0,15,0,0 +47,2,163814,12,6,1,10,1,0,0,0,0,40,0,0 +48,2,69586,5,10,2,0,0,1,0,0,0,40,0,0 +32,2,237903,0,13,0,3,4,0,1,0,0,40,0,0 +31,2,243165,0,13,0,3,4,0,0,0,0,40,0,0 +33,0,173806,3,14,0,3,0,0,0,0,0,30,0,0 +27,1,65308,1,9,1,7,1,0,0,0,0,50,0,0 +44,2,408531,1,9,2,0,4,0,1,0,0,40,0,1 +44,2,235786,5,10,1,3,1,0,0,7298,0,45,0,1 +37,2,314963,5,10,1,8,1,0,0,0,0,40,0,0 +34,2,81206,1,9,2,2,0,1,0,0,0,40,0,0 +51,3,293196,5,10,1,3,1,0,0,0,0,40,0,1 +51,2,95329,3,14,2,11,4,0,0,0,0,40,0,0 +25,4,45474,0,13,1,3,1,0,0,0,0,60,0,0 +25,2,372728,0,13,0,4,0,1,1,0,0,24,2,0 +29,3,116394,0,13,5,3,1,0,0,0,0,50,0,1 +36,1,34180,1,9,0,7,0,0,0,0,0,70,0,1 +55,2,327589,1,9,2,8,0,0,1,0,0,40,0,0 +39,2,706180,0,13,2,5,4,0,1,0,0,40,0,0 +31,2,32550,12,6,2,2,0,0,0,0,0,40,0,0 +31,2,173858,10,15,1,9,1,2,0,0,0,40,3,0 +51,5,230095,9,11,0,0,3,0,1,0,0,40,0,0 +30,2,139012,9,11,0,0,5,2,0,2463,0,40,36,0 +62,2,174711,1,9,0,0,0,0,1,0,0,32,0,0 +37,2,171150,0,13,1,5,1,0,0,99999,0,60,0,1 +30,5,77689,0,13,1,5,1,0,0,7688,0,50,0,1 +27,2,193898,0,13,2,1,0,0,0,0,0,52,0,0 +32,2,195000,0,13,1,1,1,0,0,7298,0,45,0,1 +23,2,303121,5,10,0,0,3,0,0,0,0,30,0,0 +35,1,188540,4,5,1,10,1,0,0,0,0,50,0,0 +46,2,158656,6,12,0,3,4,0,1,0,0,36,0,0 +45,5,204196,0,13,2,1,4,0,0,0,0,50,0,1 +27,2,183802,1,9,1,2,1,0,0,0,0,40,0,0 +46,2,148995,1,9,1,5,1,0,0,0,0,40,0,1 +22,2,190903,2,7,1,0,2,0,1,0,0,20,0,0 +37,0,173780,5,10,2,3,4,0,1,0,0,30,0,0 +42,2,251239,5,10,1,1,1,0,0,0,0,40,5,0 +45,2,112761,1,9,2,8,4,0,1,0,0,40,0,0 +33,0,425785,9,11,1,3,1,0,0,0,0,40,0,0 +46,2,197731,9,11,3,8,4,0,0,0,0,40,0,0 +24,2,119156,1,9,0,6,3,0,0,0,0,50,0,0 +56,2,133819,1,9,4,10,0,0,1,0,0,40,0,0 +34,2,185556,5,10,0,3,0,0,1,0,0,12,0,1 +50,2,109277,1,9,1,8,1,0,0,0,0,40,0,1 +48,5,36020,0,13,1,1,1,0,0,0,0,50,0,1 +45,2,45857,2,7,1,4,2,0,1,0,0,36,0,0 +55,2,184882,9,11,1,6,1,0,0,5178,0,50,0,1 +41,0,342834,5,10,2,0,0,0,1,0,0,40,0,0 +66,2,234743,5,10,1,1,1,0,0,0,0,24,0,0 +29,3,106179,5,10,0,3,0,0,1,0,1408,40,0,0 +37,2,177895,5,10,1,9,2,0,1,5013,0,40,0,0 +61,2,86067,6,12,1,5,1,0,0,15024,0,40,0,1 +64,2,66634,0,13,2,1,4,0,0,27828,0,50,0,1 +35,2,138441,1,9,1,2,1,0,0,0,0,35,0,0 +22,2,279802,5,10,0,0,3,0,1,0,0,40,0,0 +58,2,407138,7,4,1,8,1,0,0,2936,0,50,4,0 +58,2,31732,5,10,1,5,1,0,0,0,0,45,0,1 +24,2,204172,1,9,0,2,3,0,1,0,0,48,0,0 +34,2,100593,5,10,2,3,4,0,1,0,0,6,0,0 +33,4,162623,3,14,0,3,0,0,1,0,0,50,0,0 +33,1,80933,1,9,1,6,1,0,0,0,0,60,0,0 +17,2,47425,2,7,0,4,3,0,1,0,0,15,0,0 +27,2,107812,0,13,1,5,5,0,0,0,0,40,0,1 +20,5,104443,5,10,0,0,3,0,1,0,0,20,0,0 +52,2,117496,0,13,2,3,4,0,1,0,1755,40,0,1 +30,2,209691,7,4,2,6,0,0,0,0,0,40,0,0 +22,2,314525,0,13,0,3,0,0,0,0,0,40,0,0 +20,2,190772,6,12,0,4,0,0,1,0,0,40,0,0 +49,2,187370,3,14,1,1,1,0,0,15024,0,50,0,1 +46,3,219293,1,9,1,0,1,1,0,0,0,80,0,1 +17,2,136363,12,6,0,4,3,0,0,0,0,20,0,0 +45,2,233799,15,2,1,8,1,0,0,0,0,40,4,0 +27,2,207611,0,13,0,1,3,0,1,0,0,40,0,0 +45,5,178344,9,11,2,5,4,0,1,0,0,30,0,0 +26,5,187652,1,9,2,1,0,0,0,0,0,78,0,1 +23,2,188545,6,12,0,0,3,0,1,0,1974,20,0,0 +44,4,58124,0,13,2,3,4,0,0,0,0,45,0,0 +36,2,321733,0,13,2,1,0,0,0,0,1741,40,0,0 +35,2,206253,4,5,0,1,0,0,1,0,0,40,0,0 +56,2,76281,0,13,3,3,4,0,1,0,0,40,0,0 +47,2,606752,3,14,2,9,0,0,0,0,0,40,0,0 +32,2,29933,0,13,1,2,1,0,0,0,0,50,0,1 +29,2,114158,0,13,0,1,3,0,1,3325,0,10,0,0 +35,5,65624,0,13,1,1,1,0,0,0,0,50,0,1 +37,2,34146,1,9,1,10,1,0,0,0,0,68,0,0 +36,1,34378,9,11,1,7,1,0,0,3908,0,75,0,0 +33,2,141490,1,9,1,5,2,0,1,0,0,45,0,0 +34,2,199227,1,9,2,6,0,0,0,0,0,50,0,0 +24,2,224954,5,10,0,2,3,0,0,0,0,40,0,0 +25,2,231357,1,9,0,0,0,0,1,0,0,40,0,0 +31,5,113530,1,9,0,10,0,0,0,0,0,45,0,0 +38,2,22245,9,11,1,10,1,0,0,0,0,40,0,0 +30,2,36383,0,13,1,5,1,0,0,0,0,40,4,1 +35,2,320305,1,9,1,10,1,0,0,0,0,32,0,0 +34,2,48935,0,13,1,3,2,0,1,0,0,40,0,0 +46,2,101455,1,9,1,0,2,0,1,0,0,40,0,0 +19,4,243960,5,10,0,5,3,0,1,0,0,16,0,0 +26,2,90915,6,12,0,4,3,1,1,0,0,15,0,0 +28,2,315287,5,10,0,3,0,1,0,0,0,40,0,0 +47,2,106255,5,10,1,10,1,0,0,0,0,40,0,0 +49,4,215895,3,14,1,0,1,0,0,0,0,40,25,1 +33,1,170979,10,15,1,3,1,0,0,0,1887,40,0,1 +44,2,210525,0,13,1,3,1,0,0,0,0,40,0,1 +30,2,195488,1,9,0,13,3,0,1,0,0,40,24,0 +18,2,152246,5,10,0,4,3,2,0,0,0,16,0,0 +60,1,187794,1,9,1,6,1,0,0,3103,0,60,0,1 +44,2,110396,3,14,0,1,0,0,0,14084,0,56,0,1 +43,0,254817,5,10,0,4,0,0,1,0,0,40,0,0 +35,2,41777,14,8,0,7,0,0,0,0,0,20,0,0 +58,1,234841,1,9,1,7,1,0,0,0,0,72,0,0 +32,2,79586,0,13,1,3,1,2,0,0,0,40,3,0 +40,2,115331,1,9,1,6,1,0,0,0,0,35,0,0 +32,2,63564,1,9,0,4,3,1,1,0,0,40,0,0 +21,2,132053,5,10,0,0,3,0,1,0,1721,35,0,0 +44,2,370502,1,9,1,4,1,0,0,0,0,25,4,0 +33,2,59083,0,13,1,0,1,0,0,0,1902,45,0,1 +25,2,69413,5,10,0,5,3,0,1,0,0,40,0,0 +42,2,32981,1,9,2,8,0,0,0,0,0,40,0,0 +27,2,176683,1,9,0,6,3,0,0,0,0,40,0,0 +33,0,150657,0,13,0,3,5,1,1,0,0,40,0,0 +50,1,124793,5,10,1,10,1,0,0,0,0,55,0,0 +50,2,22211,3,14,1,3,1,0,0,7688,0,50,0,1 +46,2,270565,9,11,1,3,1,0,0,0,0,60,0,0 +22,2,38251,6,12,0,4,4,0,1,0,0,35,0,0 +66,0,162945,10,15,1,1,1,1,0,20051,0,55,0,1 +52,2,195638,1,9,0,4,4,0,1,0,0,45,0,0 +57,1,118806,15,2,6,10,5,0,1,0,1602,45,13,0 +41,1,44006,9,11,2,7,0,0,0,0,0,40,0,0 +42,2,119679,1,9,1,8,1,0,0,0,1579,42,0,0 +19,2,333953,14,8,0,4,5,0,1,0,0,30,0,0 +45,4,172111,0,13,2,1,4,1,1,0,0,60,0,0 +51,1,32372,14,8,1,4,1,0,0,0,0,99,0,0 +45,1,123681,0,13,1,3,1,0,0,0,0,30,0,0 +48,2,317360,5,10,2,0,0,0,1,0,0,50,0,0 +60,3,119832,5,10,1,0,1,0,0,7298,0,40,0,1 +42,2,135056,1,9,0,5,3,0,1,0,0,40,0,0 +19,0,135162,5,10,0,0,3,0,1,0,0,10,0,0 +39,1,194004,1,9,1,5,1,0,0,0,0,70,0,0 +46,2,177633,1,9,1,8,1,0,0,0,0,50,0,1 +58,4,212864,1,9,1,11,1,0,0,3908,0,40,0,0 +36,2,30509,5,10,2,3,4,0,1,0,0,45,0,0 +21,2,118712,1,9,0,10,4,0,0,0,0,35,0,0 +41,2,199018,10,15,1,1,1,0,0,0,0,40,0,1 +17,2,151799,2,7,0,4,3,0,1,0,0,20,0,0 +29,2,181280,1,9,1,8,1,0,0,0,0,40,0,0 +52,2,232024,5,10,2,0,0,0,1,0,0,60,0,0 +33,2,226267,6,12,1,5,1,0,0,0,0,40,4,0 +38,2,240467,3,14,0,1,4,1,1,0,0,35,0,0 +42,2,154374,0,13,1,5,1,0,0,0,0,40,0,1 +24,0,231473,6,12,1,0,1,0,0,0,0,30,0,0 +59,2,158813,5,10,1,1,1,0,0,0,0,60,0,1 +36,2,346478,0,13,1,5,1,0,0,0,2415,45,0,1 +54,2,215990,5,10,1,9,1,0,0,7688,0,40,0,1 +39,2,177154,0,13,1,5,1,0,0,15024,0,50,0,1 +42,1,238188,1,9,1,6,1,0,0,0,0,96,0,0 +54,1,156800,0,13,1,10,1,0,0,0,0,50,0,0 +50,2,175339,1,9,1,2,1,0,0,0,0,40,0,1 +42,2,37937,9,11,1,4,1,0,0,0,0,45,0,0 +48,3,166634,0,13,1,0,2,0,1,7688,0,40,0,1 +31,2,221167,0,13,6,4,0,0,1,0,0,30,0,0 +56,2,179641,1,9,0,3,0,0,1,0,0,45,0,0 +28,4,213195,6,12,1,0,2,0,1,0,0,40,0,1 +34,2,157747,1,9,1,0,1,0,0,0,0,45,0,1 +28,2,227840,1,9,0,6,0,0,1,0,0,40,0,0 +44,2,186916,5,10,1,6,1,0,0,0,1887,60,0,1 +34,2,37646,6,12,1,10,1,0,0,0,0,65,0,0 +26,2,157028,3,14,0,3,0,0,0,0,0,55,0,1 +37,2,188774,0,13,0,1,0,0,0,0,2824,40,0,1 +25,2,182656,9,11,2,0,4,0,1,0,0,40,0,0 +48,1,200471,5,10,1,10,1,0,0,0,0,40,0,0 +47,2,358465,5,10,2,0,0,0,1,0,0,40,0,0 +17,2,78602,2,7,0,4,5,0,1,0,0,20,0,0 +44,2,213416,11,3,1,8,1,0,0,0,0,40,4,0 +46,4,345911,5,10,2,6,0,0,1,0,0,40,0,0 +42,3,126320,5,10,1,6,1,1,0,0,0,40,0,0 +33,1,235271,0,13,2,5,0,0,0,0,0,50,0,1 +61,2,141745,1,9,2,4,0,1,1,0,0,40,0,0 +47,2,359461,0,13,1,10,1,0,0,0,0,40,0,0 +35,2,109351,0,13,0,5,0,0,1,8614,0,45,0,1 +62,2,148113,12,6,1,10,1,1,0,0,0,40,0,0 +62,1,75478,0,13,1,1,1,0,0,0,0,40,0,0 +38,2,100375,10,15,1,3,1,0,0,99999,0,60,0,1 +33,2,231413,0,13,1,3,1,0,0,0,0,40,0,0 +39,4,119421,0,13,1,3,2,0,1,0,0,42,0,0 +17,2,206998,2,7,0,2,3,0,0,0,0,10,0,0 +58,2,183810,5,10,1,1,1,0,0,0,0,40,0,0 +35,5,187053,0,13,4,3,0,0,1,0,0,50,0,0 +34,4,155781,1,9,1,11,1,0,0,4064,0,50,0,0 +32,2,48520,5,10,1,10,1,0,0,0,0,40,0,0 +19,5,170125,1,9,0,5,3,0,0,0,0,40,0,0 +41,2,107584,1,9,1,8,1,0,0,0,0,40,0,0 +24,2,196742,1,9,2,4,4,0,1,0,0,40,0,0 +48,4,127921,0,13,1,3,1,0,0,0,0,40,0,0 +32,2,42617,5,10,2,3,0,0,1,0,0,30,0,0 +47,4,191389,1,9,2,0,4,0,1,0,0,35,0,0 +38,2,187983,10,15,1,5,2,0,1,0,0,40,0,0 +18,2,215110,1,9,0,2,3,1,0,0,0,40,0,0 +25,2,230292,1,9,1,10,1,0,0,0,0,40,0,0 +36,2,90159,0,13,1,3,2,0,1,0,0,32,0,1 +40,2,175398,9,11,2,3,0,0,1,0,0,20,0,0 +56,1,53366,2,7,1,10,1,0,0,0,0,20,0,0 +50,2,46155,9,11,2,3,4,0,1,0,0,40,0,1 +55,2,61708,1,9,1,0,1,0,0,6418,0,50,0,1 +32,4,112650,1,9,1,11,1,0,0,0,0,40,0,0 +41,2,173682,9,11,1,10,1,0,0,0,0,43,0,1 +28,2,160981,5,10,0,0,0,0,1,0,0,52,0,0 +53,2,72257,5,10,1,1,1,0,0,0,0,55,0,0 +60,4,48788,0,13,4,3,4,0,1,5455,0,55,0,0 +21,2,417668,5,10,0,4,3,0,0,0,0,20,0,0 +29,2,107458,1,9,1,6,1,0,0,0,0,40,0,0 +73,2,147551,5,10,1,3,1,0,0,0,2174,50,0,1 +43,5,33729,0,13,1,5,1,0,0,0,0,45,0,1 +45,2,101977,5,10,1,5,1,0,0,0,0,45,0,0 +36,2,214378,1,9,2,3,3,0,1,0,0,40,0,1 +25,2,111243,1,9,0,5,5,0,1,0,0,50,0,0 +38,2,252947,5,10,1,2,1,1,0,0,0,40,0,0 +30,4,118500,5,10,2,0,4,0,1,0,0,40,0,0 +49,2,195612,5,10,1,1,1,0,0,7298,0,40,0,1 +41,4,174575,1,9,1,10,1,0,0,0,0,40,0,0 +27,2,190391,5,10,1,1,1,0,0,0,0,40,0,0 +64,2,166715,5,10,1,1,1,0,0,0,0,20,0,0 +41,1,142725,1,9,1,6,1,0,0,0,0,45,0,0 +37,2,73471,0,13,1,1,1,0,0,0,1887,47,0,1 +51,2,241745,11,3,4,8,4,0,1,0,0,40,4,0 +35,2,316141,5,10,2,3,4,0,1,7443,0,40,0,0 +61,4,248595,15,2,1,4,1,0,0,0,0,40,4,0 +52,2,90189,7,4,2,13,3,1,1,0,0,16,0,0 +40,2,205195,6,12,1,5,1,0,0,0,0,60,0,1 +20,2,148940,1,9,0,2,3,0,0,0,0,40,0,0 +52,4,298035,3,14,1,3,1,0,0,0,0,40,0,0 +50,2,154728,5,10,1,9,1,0,0,0,0,40,0,1 +49,2,166809,0,13,2,1,4,0,1,0,0,40,0,1 +36,0,97136,0,13,0,3,4,1,1,0,0,40,0,0 +33,2,347623,3,14,0,1,4,0,0,0,0,40,0,0 +40,2,117917,1,9,1,3,1,3,0,0,0,50,0,0 +45,2,266860,0,13,1,1,1,0,0,0,0,50,0,1 +22,2,71864,5,10,0,10,3,0,1,0,0,35,0,0 +47,2,158451,3,14,1,3,2,0,1,0,0,2,0,1 +24,2,229826,1,9,0,5,0,0,0,0,0,30,0,0 +19,2,121788,5,10,0,5,0,0,1,0,0,30,0,0 +40,2,151365,1,9,2,10,0,0,1,0,0,40,0,0 +40,2,360884,5,10,0,9,0,0,1,0,0,50,0,1 +54,2,36480,1,9,1,5,1,0,0,15024,0,50,0,1 +43,1,116666,10,15,1,3,1,4,0,0,0,35,0,1 +63,4,214143,0,13,1,6,1,0,0,0,0,40,1,0 +18,2,45316,2,7,0,4,3,0,1,0,0,20,0,0 +19,2,311974,15,2,0,8,5,0,0,0,0,40,4,0 +49,1,48495,1,9,1,1,1,0,0,0,0,45,0,0 +27,2,115945,3,14,1,1,1,0,0,0,0,45,0,1 +49,4,170846,3,14,2,1,0,0,1,0,0,40,0,0 +60,2,142922,1,9,1,10,1,0,0,0,0,50,0,0 +34,2,286675,1,9,1,6,1,0,0,0,0,40,0,0 +29,2,233168,0,13,1,3,2,0,1,0,0,46,0,1 +30,2,177304,5,10,1,5,1,0,0,0,0,44,0,0 +46,2,336984,1,9,0,2,3,0,0,0,0,17,0,0 +32,1,379412,9,11,1,10,1,0,0,0,0,40,0,0 +25,2,180778,1,9,0,10,0,0,0,0,0,75,0,0 +22,2,228306,5,10,5,4,2,0,1,0,0,40,0,1 +32,2,329993,5,10,1,6,1,0,0,0,0,50,0,0 +40,2,247469,8,16,1,3,2,0,1,0,0,30,0,1 +51,2,673764,3,14,0,3,0,0,0,27828,0,40,0,1 +20,2,155775,1,9,0,10,3,0,0,0,0,30,0,0 +34,2,81223,1,9,2,1,0,0,1,0,0,48,0,0 +40,2,236021,5,10,0,1,0,0,0,0,0,50,0,0 +34,0,103371,9,11,0,0,4,0,1,0,0,40,0,0 +19,2,199480,12,6,0,2,3,0,0,0,0,25,0,0 +53,2,152657,12,6,1,10,1,1,0,0,0,40,0,0 +42,3,460214,5,10,1,0,1,0,0,0,0,40,0,1 +38,2,91039,3,14,1,1,1,0,0,0,0,65,0,1 +41,2,197372,1,9,1,10,1,0,0,0,0,60,0,1 +30,0,111883,5,10,0,3,0,0,0,0,0,40,0,0 +20,2,66917,2,7,1,7,3,0,0,0,0,40,4,0 +19,2,292583,1,9,0,4,3,0,1,0,0,30,0,0 +20,2,391679,1,9,0,5,5,0,0,0,0,60,0,0 +35,2,475324,0,13,1,1,1,0,0,0,0,45,0,0 +33,1,218164,1,9,1,10,1,0,0,0,0,40,0,0 +43,1,101534,5,10,1,1,1,0,0,0,1902,15,0,1 +38,3,65706,5,10,2,1,4,0,1,0,0,38,0,0 +50,1,156606,5,10,1,1,2,0,1,0,0,30,0,0 +23,2,200967,1,9,2,4,3,0,1,0,0,10,0,0 +30,4,164493,5,10,0,0,3,0,1,0,0,10,0,0 +33,2,547886,0,13,4,1,4,1,1,0,0,40,0,0 +48,2,232145,1,9,2,8,0,0,0,0,0,40,0,0 +43,2,96421,0,13,2,3,4,0,1,0,0,24,31,0 +33,2,554206,5,10,0,9,0,1,0,0,0,40,11,0 +50,4,234143,3,14,1,1,1,1,0,0,0,45,0,1 +23,2,380544,5,10,1,0,1,0,0,0,0,40,0,1 +36,4,103886,5,10,2,2,0,0,0,0,0,50,0,0 +50,0,54709,1,9,2,0,4,0,1,0,0,46,0,0 +26,2,276548,1,9,1,5,2,0,1,0,0,20,0,0 +55,4,176046,3,14,1,3,2,0,1,0,2267,40,0,0 +37,2,114605,1,9,1,7,1,0,0,0,0,40,0,0 +43,2,323713,1,9,1,8,1,0,0,0,0,40,0,0 +38,1,261382,5,10,1,6,1,0,0,0,0,40,0,0 +42,2,223548,7,4,1,2,1,0,0,0,0,30,4,0 +47,1,355978,8,16,1,6,1,0,0,0,2002,45,0,0 +44,2,107218,0,13,1,1,1,2,0,0,0,40,0,0 +28,1,31717,1,9,1,10,1,0,0,0,0,40,0,0 +51,2,328947,5,10,6,0,0,0,1,0,0,40,0,0 +51,2,148431,1,9,1,10,1,0,0,0,0,40,0,0 +49,2,121602,0,13,1,1,1,0,0,0,0,40,0,0 +62,2,244087,8,16,1,3,1,0,0,15024,0,50,0,1 +31,2,83425,5,10,0,0,4,0,1,0,0,40,0,0 +29,2,157308,2,7,1,2,2,2,1,2829,0,14,11,0 +23,2,57898,5,10,0,7,0,0,0,0,0,30,0,0 +40,0,175304,5,10,2,5,0,0,1,0,0,40,0,0 +66,5,102663,7,4,1,1,1,0,0,0,0,50,0,0 +17,2,99175,2,7,0,4,0,0,1,0,0,20,0,0 +37,2,208358,5,10,1,10,1,0,0,0,0,40,0,1 +69,2,361561,10,15,1,3,1,0,0,0,0,3,0,0 +23,2,215115,0,13,0,0,0,0,1,0,0,40,0,0 +38,3,207066,1,9,1,1,1,0,0,0,0,42,0,1 +37,3,160910,1,9,1,10,1,0,0,0,0,40,0,0 +38,2,64879,5,10,2,5,0,0,1,0,0,40,0,0 +38,2,430035,4,5,1,7,1,0,0,0,0,54,4,0 +37,0,74163,0,13,0,3,0,0,1,0,0,40,0,0 +37,5,98389,1,9,1,1,1,0,0,0,0,50,0,1 +23,2,386019,4,5,0,7,4,0,0,0,0,70,0,0 +17,2,112795,12,6,0,4,3,0,1,0,0,15,0,0 +48,2,332465,0,13,1,3,1,0,0,0,0,35,0,0 +17,2,38611,2,7,0,0,3,0,1,0,0,23,0,0 +55,2,368797,3,14,1,1,1,0,0,0,1977,60,0,1 +35,2,24106,5,10,1,1,1,0,0,0,0,40,0,1 +35,1,241998,0,13,1,10,1,0,0,0,0,45,0,0 +53,2,312446,0,13,1,1,1,0,0,0,0,60,0,1 +43,2,69333,1,9,1,8,1,0,0,0,0,48,0,0 +36,2,172538,3,14,0,3,3,0,0,0,0,40,0,0 +24,2,275884,1,9,4,4,4,1,1,0,0,40,0,0 +45,2,43479,5,10,1,6,1,0,0,0,0,48,0,0 +34,2,199864,5,10,1,0,2,0,1,0,2057,40,0,0 +56,2,235197,1,9,0,0,0,0,1,0,0,38,0,0 +36,2,170376,1,9,1,10,1,0,0,0,0,45,0,1 +22,2,325179,5,10,0,3,3,0,0,0,0,50,0,0 +33,2,141841,1,9,0,4,3,1,0,0,0,36,0,0 +48,2,207817,1,9,0,4,0,0,1,0,0,32,13,0 +20,2,137974,5,10,0,4,3,0,1,0,0,30,0,0 +64,5,161325,6,12,1,5,1,0,0,0,1887,50,0,1 +47,2,293623,2,7,1,10,1,0,0,0,0,40,21,0 +20,2,37783,5,10,0,4,0,0,1,0,0,25,0,0 +44,3,308027,0,13,2,1,0,1,1,0,0,40,0,0 +45,1,149218,0,13,1,7,1,0,0,0,0,77,0,0 +45,4,374450,1,9,1,6,2,0,1,5178,0,40,0,1 +45,4,61885,3,14,1,3,1,0,0,0,0,37,0,1 +27,0,291196,0,13,0,3,0,1,0,0,0,40,0,0 +41,2,45366,1,9,1,10,1,0,0,0,0,72,0,1 +20,2,203027,1,9,0,7,0,0,0,0,0,55,0,0 +17,2,132680,12,6,0,4,3,0,1,0,1602,10,0,0 +50,2,155574,1,9,1,3,1,0,0,0,0,40,0,1 +31,0,193565,3,14,0,9,0,0,0,0,0,40,0,0 +49,1,123598,1,9,0,10,0,0,0,0,0,30,0,0 +44,2,456236,3,14,1,0,1,0,0,0,0,40,0,0 +49,2,163229,1,9,2,10,0,0,0,0,0,50,0,0 +28,4,419740,0,13,0,3,0,0,0,0,0,52,0,0 +43,4,118853,5,10,1,9,1,0,0,4386,0,99,0,1 +33,2,31449,6,12,2,8,4,3,1,0,0,40,0,0 +35,2,204163,5,10,2,8,4,1,1,0,0,55,0,0 +17,2,177629,2,7,0,5,3,0,1,0,0,20,0,0 +25,2,186370,1,9,1,2,1,0,0,0,0,40,0,0 +41,2,188307,1,9,2,10,4,0,1,0,0,40,0,0 +30,2,55481,3,14,0,9,4,0,0,0,0,45,35,0 +48,2,119471,9,11,1,4,1,2,0,0,0,56,11,1 +61,4,167347,5,10,1,0,1,0,0,0,0,35,0,0 +41,2,184378,1,9,4,10,0,0,0,0,0,40,0,0 +36,2,348960,1,9,0,9,0,0,0,0,0,50,0,0 +24,4,69640,5,10,0,11,0,0,0,0,0,40,0,0 +27,2,297457,1,9,0,0,3,1,0,0,0,40,0,0 +18,2,279593,2,7,0,3,3,0,1,0,0,2,0,0 +20,2,211968,5,10,0,3,3,0,1,0,0,15,0,0 +18,2,194561,5,10,0,4,3,0,0,0,0,12,0,0 +23,2,140414,1,9,1,10,1,0,0,0,0,40,0,0 +43,0,24763,3,14,1,3,1,0,0,0,1887,45,0,1 +38,0,462832,5,10,1,1,2,1,1,0,0,40,33,0 +36,2,48972,5,10,2,0,4,0,1,0,0,40,0,0 +28,1,35032,0,13,0,1,0,0,0,0,0,50,0,0 +51,2,392668,8,16,1,1,1,0,0,15024,0,84,0,1 +35,2,108140,0,13,1,1,1,0,0,0,0,40,0,1 +38,0,112497,0,13,1,11,1,0,0,0,0,60,0,0 +47,3,142581,5,10,1,0,1,1,0,0,0,40,0,1 +26,2,147982,2,7,2,10,0,0,1,0,0,40,0,0 +31,0,440129,5,10,2,11,0,0,0,0,0,40,0,1 +46,2,200734,5,10,2,0,4,1,1,0,0,35,33,0 +49,2,31807,5,10,0,1,4,0,1,0,0,40,0,0 +19,2,166153,1,9,0,5,3,0,1,0,0,30,0,0 +45,5,212954,5,10,1,7,1,0,0,0,0,50,0,0 +46,2,52291,0,13,1,3,1,0,0,7688,0,45,0,1 +70,1,303588,5,10,1,9,1,0,0,0,0,20,0,0 +19,2,96176,5,10,0,0,3,0,1,0,0,20,0,0 +46,2,184632,9,11,1,10,1,0,0,0,0,50,0,0 +20,2,137618,5,10,0,6,3,0,0,0,0,35,0,0 +17,2,160029,2,7,0,4,5,0,1,0,0,22,0,0 +43,2,178780,5,10,1,1,1,0,0,0,0,49,0,1 +19,2,39756,5,10,0,4,3,0,1,0,0,15,0,0 +37,2,35309,1,9,1,10,1,0,0,0,0,40,0,0 +51,2,117253,1,9,6,3,4,0,1,0,0,40,0,0 +40,4,303212,0,13,1,3,1,0,0,0,0,40,0,1 +24,2,214542,5,10,0,10,3,0,0,0,0,60,8,0 +31,2,342019,6,12,1,3,1,0,0,0,0,40,0,0 +59,2,126668,9,11,1,3,1,0,0,5178,0,50,0,1 +27,2,401508,1,9,0,4,4,1,1,0,0,40,0,0 +40,2,25005,0,13,1,3,1,0,0,15024,0,99,0,1 +30,1,85708,1,9,1,10,1,0,0,0,0,40,0,0 +28,2,115677,6,12,0,0,3,0,0,0,0,32,0,0 +25,2,144259,1,9,0,10,3,1,0,0,0,50,0,0 +22,2,197583,0,13,0,5,0,0,1,0,0,20,0,0 +21,0,142766,5,10,0,1,3,0,0,0,0,40,0,0 +35,5,185621,0,13,0,1,0,0,1,0,0,60,0,1 +54,4,29887,1,9,1,1,1,0,0,0,0,56,0,0 +36,2,117381,1,9,1,8,1,0,0,0,0,40,0,0 +29,2,211482,0,13,1,5,1,0,0,0,0,40,0,0 +32,3,90653,1,9,0,1,4,0,1,0,1380,40,0,0 +55,2,209535,1,9,2,6,0,0,0,0,0,40,0,0 +56,3,187873,3,14,2,0,4,0,1,0,0,40,0,0 +19,2,174732,5,10,0,4,3,1,0,0,0,25,0,0 +36,2,297847,1,9,0,4,0,1,1,0,2001,40,0,0 +58,2,110213,1,9,6,0,0,0,1,0,0,40,0,1 +35,2,162601,1,9,2,0,4,0,1,0,0,40,0,0 +44,2,108438,12,6,4,8,4,1,1,0,0,40,0,0 +40,5,132222,1,9,1,1,1,0,0,0,0,40,0,0 +18,2,174394,1,9,0,4,3,0,1,0,0,20,0,0 +71,1,322789,1,9,1,7,1,3,0,0,0,35,0,0 +51,3,72436,1,9,1,1,1,0,0,0,0,57,0,1 +20,2,190273,14,8,0,4,3,0,0,0,0,35,0,0 +34,2,140571,9,11,2,9,4,1,1,0,0,40,0,0 +28,2,584790,9,11,1,4,1,0,0,0,0,40,0,1 +23,2,197666,5,10,0,0,0,0,1,0,0,24,34,0 +36,2,245090,5,10,1,10,1,0,0,3137,0,50,22,0 +42,2,192569,10,15,2,3,0,0,1,0,0,39,0,1 +31,4,158291,0,13,0,10,0,0,0,8614,0,40,0,1 +38,4,287658,3,14,2,3,0,1,0,0,0,40,2,0 +22,2,192455,1,9,0,0,4,0,1,0,0,40,0,0 +36,2,317040,9,11,2,0,4,1,1,0,0,54,0,0 +36,2,218689,3,14,1,5,1,0,0,0,1977,50,0,1 +17,2,116626,2,7,0,2,3,0,0,0,1719,18,0,0 +30,3,48458,5,10,0,0,3,1,1,0,0,40,0,0 +35,1,241469,4,5,1,10,1,0,0,2635,0,30,0,0 +32,2,167990,3,14,0,1,0,0,0,14084,0,40,0,1 +42,2,261929,0,13,1,1,1,0,0,7688,0,40,0,1 +54,2,425804,5,10,0,1,0,0,1,0,0,45,0,1 +36,2,33394,0,13,1,5,1,0,0,0,1887,35,0,1 +58,2,72812,12,6,0,4,0,0,0,0,0,40,0,0 +39,2,89040,9,11,1,4,1,0,0,0,0,40,0,0 +62,4,164518,1,9,6,0,0,0,1,0,0,38,0,0 +51,2,182740,1,9,2,3,4,0,0,0,0,40,0,0 +52,2,361875,5,10,2,1,0,0,1,0,0,50,0,0 +25,2,197130,1,9,0,5,3,0,1,0,0,30,0,0 +26,2,340335,0,13,0,0,0,0,1,0,0,40,0,0 +26,2,293984,12,6,1,10,3,1,0,0,0,40,0,0 +59,0,261584,0,13,0,1,0,1,1,0,0,40,31,0 +21,2,170302,1,9,0,7,5,0,0,0,0,50,0,0 +45,2,481987,3,14,1,9,1,0,0,0,0,18,0,1 +26,2,88449,1,9,1,10,1,0,0,0,0,36,0,0 +68,1,261897,12,6,6,7,4,0,0,0,0,20,0,0 +60,2,250552,1,9,1,4,1,0,0,0,0,40,0,1 +65,2,88513,1,9,1,5,1,0,0,0,0,18,0,0 +41,2,168293,3,14,2,1,4,0,1,0,0,45,0,0 +34,2,283921,1,9,1,6,1,0,0,0,0,50,0,0 +28,2,407043,1,9,1,0,1,1,0,0,0,40,0,0 +40,2,63745,9,11,0,0,0,0,1,0,0,40,0,0 +57,2,49893,3,14,1,3,1,0,0,0,0,60,0,1 +37,2,241962,2,7,1,10,1,0,0,0,0,50,0,0 +34,2,338416,12,6,2,8,0,1,0,0,0,60,0,0 +57,3,310320,0,13,1,9,1,0,0,0,0,48,0,1 +55,2,359972,0,13,1,1,1,0,0,0,1887,40,0,1 +56,2,125000,0,13,1,0,1,0,0,0,0,40,0,1 +32,2,286675,5,10,0,1,0,0,0,0,0,60,0,0 +18,2,165532,5,10,0,5,3,0,0,0,0,15,0,0 +48,2,349986,9,11,3,3,0,0,0,0,0,40,0,0 +41,3,219155,10,15,1,3,1,0,0,0,0,50,3,1 +33,2,183612,1,9,1,6,1,0,0,0,0,20,0,0 +33,2,391114,1,9,0,2,3,0,0,0,0,40,0,0 +47,2,219632,11,3,3,8,5,0,0,0,0,40,4,0 +46,5,320124,1,9,1,1,2,3,1,15024,0,40,0,1 +40,2,799281,1,9,2,0,4,0,1,0,0,38,0,0 +42,2,657397,1,9,1,8,1,0,0,0,0,40,4,0 +31,0,373432,0,13,1,3,1,0,0,7298,0,55,0,1 +51,2,168660,2,7,1,2,1,0,0,0,0,40,0,0 +44,2,191149,5,10,2,0,4,0,1,0,0,57,0,0 +37,2,356824,1,9,4,9,4,0,1,0,0,40,0,0 +25,2,191782,2,7,0,8,3,1,1,0,0,40,0,0 +63,1,29859,7,4,1,7,1,0,0,7688,0,60,0,1 +52,2,204226,1,9,2,5,0,0,0,0,0,45,0,0 +42,4,246862,5,10,2,9,0,0,1,3325,0,40,0,0 +28,2,496526,1,9,0,0,0,0,1,0,0,40,0,0 +30,2,426431,3,14,0,3,0,0,0,10520,0,40,0,1 +34,2,84154,0,13,1,5,1,0,0,0,0,50,0,0 +37,3,45937,6,12,1,1,2,0,1,0,0,40,0,1 +31,2,130021,1,9,1,8,1,0,0,0,0,45,0,0 +35,2,63021,5,10,2,5,0,0,1,0,0,35,0,0 +25,2,367306,5,10,0,0,3,0,1,0,0,40,0,0 +38,2,65624,1,9,2,1,0,0,0,0,0,40,0,0 +43,1,144928,1,9,0,7,0,0,0,0,0,60,0,0 +22,2,117747,5,10,0,10,5,2,1,0,0,40,36,0 +18,2,266681,2,7,0,4,3,0,0,0,0,20,0,0 +26,2,152035,1,9,0,0,0,0,1,0,0,40,0,0 +36,2,190023,1,9,1,6,1,0,0,0,0,60,0,1 +43,2,233130,1,9,2,5,0,0,0,0,0,20,0,0 +21,2,149637,5,10,0,0,0,0,1,0,0,25,0,0 +62,3,224277,5,10,6,11,0,0,1,0,0,40,0,0 +26,2,121559,1,9,1,10,1,0,0,0,0,40,0,0 +54,1,230951,0,13,1,1,1,0,0,0,0,40,0,1 +18,2,345285,2,7,0,5,3,0,1,0,0,20,0,0 +65,1,28367,1,9,1,5,1,0,0,0,0,55,0,0 +41,2,320744,1,9,0,10,0,0,0,3325,0,50,0,0 +31,2,243773,4,5,0,4,4,0,1,0,0,20,0,0 +56,2,151474,4,5,2,5,4,0,1,0,0,40,0,0 +50,2,135465,0,13,1,1,1,0,0,0,0,50,0,1 +22,2,210781,0,13,0,0,3,0,1,0,0,35,0,0 +36,4,359001,5,10,1,11,1,0,0,0,0,48,0,0 +48,2,119471,8,16,1,3,1,2,0,0,0,40,3,1 +30,2,226396,1,9,1,4,2,0,1,0,0,30,0,0 +35,2,283122,5,10,1,9,1,0,0,0,0,45,0,0 +37,1,326400,1,9,1,6,1,0,0,0,0,30,0,0 +56,2,158752,3,14,1,1,2,0,1,0,0,50,0,0 +41,2,96741,6,12,2,5,4,0,0,0,0,40,0,0 +38,0,255191,1,9,0,4,0,0,0,0,0,40,0,0 +34,2,177733,4,5,4,8,4,0,1,0,0,35,21,0 +54,0,137815,14,8,0,4,3,0,0,4101,0,40,0,0 +42,2,168515,9,11,2,3,0,0,1,0,0,40,0,0 +33,2,122672,1,9,1,7,1,0,0,0,0,50,0,0 +21,2,195199,1,9,0,3,3,0,1,0,0,30,0,0 +69,4,179813,12,6,1,6,1,0,0,0,0,10,0,0 +32,2,178623,6,12,0,5,0,1,1,0,0,46,33,0 +50,2,41890,1,9,1,10,1,0,0,0,0,40,0,0 +45,2,80430,1,9,2,4,0,0,1,0,0,40,0,0 +31,2,198613,1,9,1,0,1,0,0,0,0,35,0,0 +24,2,330571,0,13,1,3,2,0,1,0,0,40,0,0 +28,2,209205,0,13,0,3,0,0,0,0,0,60,0,1 +21,2,132243,6,12,0,4,3,0,1,0,0,5,0,0 +43,1,237670,9,11,2,1,0,0,0,0,0,25,0,0 +22,2,193586,1,9,0,5,0,0,1,0,0,25,0,0 +62,1,197353,1,9,1,10,1,0,0,0,1740,40,0,0 +21,1,74538,5,10,0,9,0,0,0,0,0,25,0,0 +37,2,89718,5,10,1,6,1,0,0,0,0,45,0,0 +34,2,93169,5,10,2,4,4,1,1,0,0,40,0,0 +74,1,292915,0,13,1,1,1,0,0,0,1825,12,0,1 +43,2,328570,5,10,2,8,4,1,1,0,0,38,0,0 +25,2,312157,5,10,0,3,0,0,1,0,0,40,0,0 +43,2,193459,2,7,1,2,1,0,0,0,0,40,0,0 +23,2,236804,2,7,1,4,1,0,0,0,0,40,0,0 +33,2,126223,1,9,4,8,4,1,1,0,0,40,0,0 +51,0,172281,0,13,1,1,1,0,0,0,0,35,0,1 +64,2,153894,0,13,0,5,4,0,1,0,0,40,30,0 +35,2,331395,5,10,0,1,0,0,0,0,0,50,0,0 +69,1,92472,12,6,3,7,0,0,0,3273,0,45,0,0 +32,2,318647,0,13,1,1,1,0,0,0,0,48,0,1 +20,2,332931,5,10,0,4,3,0,1,0,0,40,0,0 +66,5,76212,1,9,1,6,1,0,0,0,0,50,0,1 +31,2,301168,5,10,0,10,0,0,0,0,0,40,25,0 +22,2,440969,5,10,0,4,3,0,1,0,0,24,0,0 +32,2,154950,10,15,0,3,0,0,0,0,0,40,0,0 +23,2,218343,6,12,0,5,3,0,1,0,0,40,0,0 +21,2,239577,5,10,0,0,3,0,0,0,0,40,0,0 +36,2,247936,1,9,1,4,2,2,1,0,0,2,18,0 +62,4,203525,7,4,1,10,1,0,0,2829,0,40,0,0 +24,2,182342,1,9,0,2,0,0,0,0,0,40,0,0 +45,2,25649,5,10,1,6,1,0,0,7298,0,50,0,1 +27,2,243569,2,7,1,2,1,0,0,3942,0,40,0,0 +38,2,187870,10,15,1,3,1,0,0,0,2415,90,0,1 +30,2,487330,5,10,1,8,1,0,0,0,0,30,0,0 +21,1,318987,9,11,1,7,1,0,0,0,0,40,0,0 +56,1,140558,1,9,1,5,1,0,0,0,0,40,0,0 +59,4,303455,3,14,6,3,4,0,1,4787,0,60,0,1 +37,1,76855,5,10,2,1,4,0,1,0,0,40,0,0 +52,2,308764,5,10,2,1,4,0,1,0,0,40,0,0 +50,3,339905,5,10,1,1,1,0,0,0,0,40,0,1 +55,2,227856,0,13,1,1,1,0,0,7298,0,60,0,1 +55,2,156430,0,13,1,3,1,0,0,0,0,40,0,1 +72,2,116640,5,10,1,3,1,0,0,3471,0,20,0,0 +39,2,187167,5,10,2,1,0,0,1,0,0,40,0,0 +28,2,184078,14,8,2,8,0,0,1,0,0,40,0,0 +38,2,108140,0,13,2,9,5,0,0,0,0,40,0,0 +44,2,150533,5,10,4,10,0,0,0,0,1876,55,0,0 +51,1,313702,1,9,0,5,0,0,0,0,0,40,0,0 +20,2,39803,5,10,0,4,3,0,0,0,1719,36,0,0 +25,2,252752,5,10,0,6,0,0,1,0,0,45,0,0 +52,2,111700,5,10,2,5,5,0,1,0,0,20,0,1 +45,2,361842,1,9,6,10,0,0,1,0,0,40,0,0 +17,2,231438,2,7,0,0,3,0,1,0,0,12,0,0 +64,4,116620,3,14,1,3,1,0,0,0,0,25,0,0 +34,2,112212,1,9,1,0,1,0,0,0,1485,40,0,0 +74,1,109101,5,10,1,1,1,0,0,0,0,4,0,0 +58,3,72998,2,7,2,10,0,1,1,14084,0,40,0,1 +44,2,147265,3,14,1,3,1,0,0,0,0,40,0,1 +23,0,314645,6,12,0,0,0,0,1,0,0,25,0,0 +23,2,444554,1,9,0,2,3,0,0,0,0,50,0,0 +27,2,129629,9,11,0,9,5,0,1,0,0,36,0,0 +34,2,106761,0,13,1,5,1,0,0,0,0,45,0,1 +18,2,189924,1,9,0,5,3,0,1,0,0,24,0,0 +33,2,311194,2,7,0,5,4,1,1,0,0,17,0,0 +50,1,89737,5,10,1,10,1,0,0,0,0,48,0,0 +47,2,49298,1,9,2,5,0,0,0,0,0,50,0,0 +50,5,190333,10,15,1,3,1,0,0,99999,0,55,0,1 +18,2,251923,2,7,0,5,3,0,1,0,0,15,0,0 +49,4,298445,10,15,1,3,2,0,1,0,1977,60,0,1 +34,2,180284,5,10,1,2,1,0,0,0,0,50,0,0 +51,2,154342,3,14,1,3,1,0,0,7688,0,45,0,1 +56,0,68658,5,10,1,1,1,0,0,0,0,40,0,1 +64,2,203783,1,9,6,0,4,0,1,0,0,8,0,0 +23,2,250037,5,10,0,7,0,0,1,0,0,50,0,0 +33,2,158688,5,10,1,6,1,0,0,0,0,40,0,0 +43,2,214781,3,14,1,1,1,0,0,0,0,45,0,0 +60,3,404023,1,9,2,1,0,0,0,10520,0,40,0,1 +57,0,109015,14,8,2,4,4,0,1,0,0,40,0,0 +22,2,194630,0,13,0,5,0,0,0,0,0,45,0,0 +23,2,239375,0,13,0,8,3,0,0,0,0,40,0,0 +54,2,35576,5,10,1,5,1,0,0,0,2415,50,0,1 +39,3,363630,1,9,1,0,1,1,0,7688,0,52,0,1 +32,1,182926,3,14,0,3,0,0,0,0,0,40,0,0 +20,2,117222,5,10,0,9,3,0,0,0,0,15,0,0 +30,2,110643,5,10,0,1,0,0,0,0,0,52,0,0 +56,1,170217,1,9,1,7,1,0,0,0,0,45,0,0 +34,2,193285,1,9,1,2,1,0,0,0,0,40,0,0 +32,2,161075,1,9,0,10,4,0,0,0,0,40,0,0 +59,2,322691,3,14,1,3,1,0,0,0,0,50,0,1 +19,2,229431,5,10,0,3,3,0,0,0,0,11,0,0 +29,2,105694,1,9,1,2,1,0,0,0,0,42,0,0 +24,2,199883,5,10,1,10,1,0,0,0,0,60,0,0 +41,0,100800,3,14,2,3,0,0,0,0,0,35,0,0 +23,2,256278,7,4,1,2,5,4,1,0,0,30,22,0 +32,2,156464,1,9,1,5,1,0,0,0,1902,50,0,1 +18,2,285013,1,9,0,5,3,0,0,0,0,10,0,0 +38,2,219902,1,9,4,6,4,1,1,0,0,30,0,0 +29,2,375482,0,13,0,3,0,0,0,0,0,50,7,0 +25,2,169124,1,9,1,6,1,0,0,0,0,45,0,0 +31,2,183000,10,15,0,9,0,0,0,0,0,55,0,0 +34,2,28053,0,13,3,0,0,0,1,0,0,25,0,0 +34,2,242984,1,9,1,1,1,0,0,0,1887,45,0,1 +66,0,132055,1,9,1,1,1,0,0,0,1825,40,0,1 +41,2,212894,11,3,1,2,1,0,0,0,0,40,24,0 +62,2,223975,7,4,1,3,1,0,0,0,0,20,0,0 +58,2,357788,1,9,1,10,1,1,0,0,0,40,0,0 +40,2,406811,1,9,4,1,4,0,1,0,0,40,8,0 +24,2,154422,0,13,0,1,3,2,1,0,0,40,11,0 +47,2,140644,1,9,1,1,1,0,0,0,0,40,0,1 +19,2,355477,1,9,0,4,3,1,0,0,0,25,0,0 +32,2,151773,5,10,1,10,1,0,0,0,0,45,0,0 +51,0,341548,5,10,2,0,0,0,1,0,0,40,0,0 +25,2,512771,4,5,1,6,1,0,0,0,0,45,0,0 +22,2,48988,5,10,0,6,0,0,0,0,0,40,0,0 +29,2,201022,0,13,1,1,2,0,1,0,0,50,0,1 +20,2,82777,1,9,1,5,3,0,0,0,0,40,0,0 +42,2,152676,7,4,2,10,4,0,0,0,0,40,5,0 +18,2,115815,1,9,0,8,3,0,0,0,0,20,0,0 +23,2,168009,12,6,1,8,3,2,1,0,0,40,36,0 +55,2,89690,0,13,2,3,0,0,1,0,0,40,0,1 +40,2,126868,1,9,2,8,0,1,0,0,0,40,0,0 +52,2,95128,5,10,2,5,0,0,0,0,0,50,0,0 +37,2,185567,1,9,2,8,4,0,0,0,0,40,0,1 +21,2,301408,5,10,0,5,3,0,1,0,1602,22,0,0 +35,2,216256,9,11,0,4,0,0,0,0,0,60,0,0 +45,2,182541,5,10,2,8,4,0,0,0,0,48,0,0 +39,2,172855,1,9,2,0,4,1,1,0,0,40,0,0 +54,2,68684,1,9,1,10,1,0,0,0,0,44,0,0 +42,2,364832,7,4,2,5,0,0,1,0,0,40,0,0 +59,5,349910,6,12,1,10,1,0,0,0,0,40,0,0 +42,2,276218,1,9,1,5,2,0,1,0,0,40,0,1 +22,2,251196,5,10,0,11,3,1,1,0,0,20,0,0 +33,2,196898,0,13,0,3,0,0,1,0,0,40,0,0 +39,2,58343,5,10,1,8,1,0,0,0,0,40,0,1 +18,5,101061,2,7,0,7,3,0,0,0,0,70,0,0 +46,2,415051,5,10,1,5,1,1,0,0,0,60,0,1 +24,2,174043,0,13,0,4,0,0,0,0,0,40,0,0 +28,2,129460,9,11,1,2,2,0,1,0,0,30,16,0 +21,0,110946,1,9,0,0,3,0,1,0,0,43,0,0 +22,2,313873,2,7,0,10,3,0,0,0,0,30,0,0 +61,2,81132,11,3,1,2,1,2,0,7298,0,40,11,1 +56,3,255386,5,10,1,0,1,2,0,0,0,40,17,0 +21,2,191497,5,10,0,5,3,0,1,0,0,20,0,0 +17,2,128617,12,6,0,2,3,0,0,0,0,26,0,0 +28,4,263600,1,9,1,11,1,0,0,0,0,40,0,1 +62,2,257277,1,9,6,0,0,0,1,0,0,38,0,0 +39,2,339442,1,9,4,8,0,1,0,2176,0,40,0,0 +30,4,289442,1,9,0,11,0,0,0,0,0,40,0,0 +18,4,466325,2,7,0,0,3,0,0,0,0,12,0,0 +54,2,142169,1,9,0,2,3,0,0,0,0,40,0,0 +49,2,252079,5,10,1,6,1,0,0,0,0,40,0,1 +33,0,119628,8,16,1,3,1,2,0,0,0,50,37,0 +50,2,175804,0,13,1,5,1,0,0,0,0,40,0,1 +57,2,70720,1,9,1,4,1,0,0,0,0,78,0,0 +50,0,201513,1,9,2,0,3,0,1,0,0,40,0,0 +45,2,257609,0,13,1,1,1,0,0,0,0,40,0,1 +41,2,124692,5,10,1,1,3,0,0,0,0,40,0,1 +23,2,268525,1,9,1,8,1,0,0,0,0,48,0,0 +23,2,250630,0,13,0,5,0,0,1,0,0,40,0,0 +47,2,180277,1,9,1,0,2,0,1,0,0,40,39,0 +39,1,191342,0,13,1,1,1,2,0,0,0,50,27,0 +29,2,250967,9,11,1,8,1,0,0,0,1887,48,0,1 +46,2,153254,1,9,1,8,1,1,0,0,0,40,0,0 +18,2,362600,11,3,0,2,3,0,0,0,0,40,0,0 +68,2,171933,7,4,1,10,1,0,0,0,0,40,0,0 +62,2,211408,9,11,1,9,1,0,0,0,0,40,0,1 +43,2,48193,6,12,1,9,1,0,0,0,0,40,0,0 +35,2,22463,1,9,1,10,1,0,0,0,0,40,0,0 +21,2,440969,1,9,0,0,3,0,1,0,0,40,0,0 +21,0,164922,5,10,0,2,3,0,0,0,0,40,0,0 +41,4,134524,9,11,2,10,4,0,1,0,0,45,0,0 +61,2,176689,1,9,1,6,1,0,0,0,0,40,0,0 +24,2,220993,1,9,0,10,0,0,0,0,0,50,0,0 +21,2,512828,1,9,0,11,3,1,0,0,0,40,0,0 +36,0,422275,11,3,1,4,1,0,0,0,0,40,4,0 +37,4,65291,9,11,0,11,0,0,1,0,0,40,0,0 +69,2,197080,14,8,1,6,1,0,0,9386,0,60,0,1 +49,3,181657,5,10,2,1,0,0,1,0,0,50,0,0 +55,2,190257,1,9,1,7,1,0,0,0,0,53,0,1 +21,2,238068,1,9,1,8,1,0,0,0,0,40,0,0 +18,2,337046,12,6,0,4,3,0,0,0,0,40,0,0 +26,2,187248,1,9,1,3,0,1,0,0,0,40,0,0 +46,2,285750,1,9,1,7,1,0,0,4064,0,55,0,0 +23,2,260617,12,6,0,10,0,0,0,0,0,40,0,0 +48,2,216999,1,9,1,10,1,0,0,0,0,40,0,1 +36,2,531055,1,9,1,10,1,0,0,0,1902,48,0,1 +42,0,121265,3,14,2,3,0,0,0,0,0,40,0,0 +41,4,184466,3,14,1,3,1,0,0,0,0,38,0,1 +45,2,297676,6,12,6,5,4,0,1,0,0,40,1,0 +52,2,114228,1,9,2,10,0,0,0,3325,0,40,0,0 +22,4,121144,0,13,0,3,3,1,1,0,0,18,0,0 +20,2,26842,5,10,0,8,0,0,1,2176,0,40,0,0 +27,2,113054,1,9,4,8,0,0,0,0,0,43,0,0 +36,2,256636,1,9,2,1,0,0,0,0,0,40,0,0 +34,2,152246,1,9,1,6,1,3,0,0,0,52,0,0 +38,2,108140,3,14,1,3,1,0,0,0,0,50,0,1 +47,2,207207,1,9,2,5,4,0,1,0,0,45,0,0 +21,2,115420,1,9,1,10,1,0,0,0,0,50,0,0 +33,2,80058,1,9,0,6,0,0,0,0,0,40,0,0 +31,4,48520,6,12,0,11,4,0,0,0,0,40,0,0 +61,2,411652,14,8,1,10,1,0,0,0,0,40,4,0 +46,2,154405,12,6,1,2,1,1,0,0,0,45,0,0 +55,4,104917,3,14,1,3,1,1,0,0,0,40,0,1 +19,0,261422,5,10,0,3,3,0,0,0,0,40,0,0 +39,2,48915,1,9,1,8,1,0,0,0,0,40,0,1 +61,2,172037,1,9,1,4,1,0,0,0,0,40,0,0 +28,2,144833,5,10,1,2,1,0,0,0,0,40,0,0 +28,2,275116,12,6,1,6,1,0,0,0,0,40,0,0 +61,2,103575,1,9,1,10,1,0,0,0,0,37,0,0 +54,2,200783,5,10,1,5,1,0,0,0,0,40,0,0 +50,5,152810,5,10,1,8,1,0,0,0,0,70,9,0 +37,4,44694,3,14,1,3,2,0,1,0,0,45,0,1 +56,2,91905,1,9,1,5,2,0,1,0,0,4,0,0 +31,2,168906,0,13,2,1,0,0,1,0,0,50,0,1 +32,0,147215,0,13,1,1,2,0,1,0,0,55,0,1 +28,2,153546,2,7,2,4,4,0,1,0,0,40,0,0 +34,2,35595,9,11,1,9,1,0,0,0,0,40,0,0 +33,2,225507,12,6,0,4,3,0,1,0,0,25,0,0 +42,2,345504,9,11,2,0,0,0,1,0,0,35,0,0 +64,2,137205,9,11,1,10,1,0,0,0,0,48,0,0 +29,2,327779,5,10,1,2,1,0,0,0,0,20,0,0 +45,2,362883,5,10,1,6,1,0,0,0,0,40,0,0 +48,2,131309,3,14,1,3,1,0,0,0,0,45,0,1 +44,2,188331,5,10,4,9,0,0,1,0,0,38,0,0 +34,3,194740,5,10,0,0,0,0,0,0,0,40,0,0 +40,2,43711,1,9,0,8,0,0,0,0,0,45,0,0 +45,2,187033,1,9,1,10,1,0,0,0,2051,40,0,0 +23,2,233923,5,10,0,4,3,0,1,0,0,20,0,0 +51,2,84278,0,13,1,3,1,0,0,0,0,55,0,1 +24,2,437666,1,9,1,10,1,0,0,2885,0,50,0,0 +57,2,186386,0,13,6,3,4,0,0,10520,0,40,0,1 +23,2,129767,5,10,0,0,0,0,1,0,1721,40,0,0 +34,2,180284,5,10,1,7,1,0,0,0,0,40,0,1 +36,2,108320,1,9,2,8,0,0,0,4101,0,40,0,0 +56,5,75214,10,15,1,3,1,0,0,0,0,32,0,1 +42,2,284758,1,9,2,1,4,0,1,0,0,40,0,0 +45,5,188330,0,13,1,1,1,0,0,0,0,60,0,0 +38,2,333651,0,13,1,3,1,0,0,15024,0,70,0,1 +29,4,115305,9,11,1,11,1,0,0,7688,0,40,0,1 +54,2,172962,0,13,2,3,0,0,0,0,1340,40,0,0 +40,2,198096,1,9,1,8,1,0,0,0,0,40,0,1 +29,2,163265,1,9,1,6,1,0,0,0,0,40,0,0 +35,3,128608,0,13,0,1,3,0,0,0,0,40,0,0 +47,2,107460,1,9,4,1,4,0,1,0,0,37,0,0 +51,2,251841,9,11,0,1,0,0,1,0,0,43,0,0 +28,2,403671,1,9,0,4,5,0,0,0,0,40,4,0 +58,2,159378,1,9,1,8,1,0,0,0,0,45,0,1 +24,2,170070,1,9,0,8,3,0,1,0,0,25,0,0 +46,0,192323,1,9,2,1,0,0,0,0,0,40,0,0 +57,2,135796,12,6,1,8,1,1,0,0,0,48,0,0 +22,2,232985,1,9,0,2,5,0,0,0,0,20,0,0 +28,2,34532,0,13,0,9,0,1,0,0,0,30,2,0 +23,2,236994,1,9,0,5,3,0,0,0,0,60,0,0 +19,2,208366,1,9,0,2,0,0,0,0,0,40,0,0 +66,0,102640,1,9,6,3,4,1,1,0,0,35,0,0 +38,2,111377,5,10,1,1,1,0,0,0,0,55,0,0 +39,3,472166,5,10,2,1,4,1,1,0,0,40,0,0 +47,2,70943,1,9,1,8,1,0,0,5178,0,40,0,1 +39,2,294919,1,9,2,6,3,0,0,0,0,60,0,0 +22,2,408383,5,10,0,6,3,0,0,0,0,40,0,0 +36,2,255454,1,9,0,10,3,1,0,0,0,30,0,0 +32,2,193260,5,10,1,8,1,2,0,0,0,40,11,0 +43,4,125461,0,13,0,3,0,0,0,0,0,40,0,0 +51,2,97005,1,9,1,10,1,0,0,0,0,40,0,0 +42,2,183319,11,3,1,10,1,0,0,0,0,60,0,0 +32,0,167049,14,8,0,0,4,0,1,0,0,40,0,0 +34,2,185216,5,10,0,0,3,0,0,0,0,40,0,0 +51,2,161838,9,11,1,10,1,0,0,0,0,57,0,0 +38,2,165848,0,13,1,5,1,0,0,0,0,44,0,0 +21,2,138816,1,9,0,2,3,1,0,0,0,20,0,0 +33,1,99761,0,13,0,4,0,0,1,0,0,15,0,0 +34,2,112139,1,9,1,10,1,0,0,0,0,40,0,0 +32,2,129020,1,9,1,1,1,0,0,0,0,40,0,0 +27,1,259873,1,9,1,4,1,1,0,0,0,60,0,1 +35,5,89622,5,10,1,5,1,0,0,0,0,50,0,1 +29,0,201556,0,13,0,3,0,0,0,0,0,50,0,0 +40,2,176286,1,9,1,10,1,0,0,0,0,40,0,0 +46,2,192894,7,4,1,7,1,1,0,0,0,30,0,0 +37,2,172232,1,9,0,4,4,1,1,0,0,30,0,0 +38,1,163204,1,9,1,10,1,0,0,3411,0,25,0,0 +37,2,265737,5,10,1,1,1,1,0,0,1887,60,1,1 +44,2,215304,0,13,1,3,1,0,0,0,0,45,0,1 +25,2,185952,3,14,0,3,0,0,0,0,0,30,0,0 +38,2,216845,1,9,0,5,4,0,0,0,0,42,0,0 +34,4,35683,6,12,2,0,4,0,1,0,0,10,0,0 +50,1,371305,1,9,1,5,1,0,0,0,1902,60,0,1 +46,2,102359,5,10,1,1,1,0,0,0,0,50,0,1 +20,2,200089,11,3,0,2,4,0,0,0,0,30,24,0 +47,0,207120,9,11,1,1,1,0,0,0,0,38,0,1 +46,2,295334,8,16,1,3,1,0,0,0,0,60,0,1 +34,2,234537,6,12,2,5,0,0,0,0,0,40,0,0 +61,2,142922,1,9,1,6,1,0,0,0,0,40,0,0 +55,0,181641,5,10,2,3,0,1,1,0,0,37,0,0 +36,2,185325,1,9,0,6,0,0,0,0,0,35,0,0 +28,2,167336,5,10,0,1,0,0,1,10520,0,40,0,1 +22,2,379778,1,9,0,4,0,0,0,0,0,40,0,0 +34,2,176117,5,10,0,5,3,1,1,0,0,35,0,0 +33,2,100228,5,10,0,8,0,1,0,0,0,40,0,0 +27,2,150296,1,9,0,4,3,0,1,0,0,32,0,0 +43,3,25005,3,14,1,2,1,0,0,5013,0,12,0,0 +55,2,134120,12,6,1,10,1,0,0,99999,0,40,0,1 +39,1,251710,12,6,3,4,0,0,1,0,1721,15,0,0 +20,2,653574,5,10,0,4,3,0,0,0,0,33,22,0 +38,2,175441,1,9,0,2,0,1,0,0,0,40,0,0 +30,2,333119,5,10,0,10,0,0,0,0,0,40,0,0 +21,2,89154,2,7,0,4,3,0,0,0,0,42,22,0 +60,2,198727,1,9,1,3,1,0,0,0,0,30,0,0 +43,2,87284,5,10,0,2,0,0,0,0,0,40,0,0 +36,2,180686,1,9,1,10,1,0,0,0,0,45,0,1 +23,2,227070,5,10,0,4,4,0,1,0,0,48,22,0 +57,4,189824,5,10,1,2,1,1,0,7298,0,40,0,1 +25,4,348986,1,9,0,2,5,1,0,0,0,40,0,0 +38,2,96185,1,9,2,4,4,1,1,0,0,32,0,0 +22,2,112693,1,9,1,10,1,0,0,0,0,35,0,0 +23,2,417605,11,3,0,10,0,0,0,0,0,40,4,0 +61,1,140300,1,9,0,5,0,0,1,0,0,44,0,0 +28,2,340408,5,10,2,10,0,0,0,0,0,46,0,0 +21,2,237051,5,10,0,4,3,0,1,0,0,25,0,0 +49,2,175622,3,14,1,3,1,0,0,0,0,40,0,0 +37,2,389725,14,8,2,10,3,0,0,0,0,35,0,0 +23,2,182812,5,10,0,4,3,0,1,0,0,40,21,0 +38,1,245372,5,10,1,3,1,0,0,3137,0,50,0,0 +34,4,93886,0,13,1,3,2,0,1,0,0,46,0,1 +21,2,502837,1,9,0,8,3,0,1,0,0,40,30,0 +27,0,212232,5,10,1,1,1,1,0,0,0,40,0,1 +57,2,300104,1,9,1,10,1,0,0,0,0,84,0,1 +22,2,156933,1,9,0,2,3,1,0,0,0,25,0,0 +20,2,286734,5,10,0,0,0,4,1,0,0,35,0,0 +49,5,143482,5,10,1,3,2,0,1,0,0,65,0,1 +38,2,226357,1,9,1,10,1,0,0,0,0,40,0,0 +40,2,104892,0,13,1,9,1,0,0,0,0,40,0,0 +44,2,223194,1,9,1,10,1,1,0,0,1485,40,19,0 +37,1,272090,5,10,1,0,2,0,1,0,0,20,0,0 +57,2,204816,3,14,2,3,0,0,0,0,0,30,0,0 +56,2,230039,7,4,0,4,3,0,1,0,0,30,0,0 +41,2,242619,6,12,2,3,0,0,0,0,0,80,0,0 +50,1,131982,1,9,1,4,1,2,0,0,0,60,27,0 +33,2,87310,4,5,0,8,0,0,0,0,0,50,0,0 +29,2,134566,3,14,1,5,1,0,0,0,0,20,0,0 +28,3,163862,0,13,1,1,1,0,0,5178,0,40,0,1 +35,2,239409,12,6,1,8,1,0,0,0,0,50,0,0 +36,2,203717,1,9,2,10,4,0,0,0,0,40,0,0 +45,2,172274,8,16,2,3,4,1,1,0,3004,35,0,1 +30,1,65278,6,12,0,10,3,0,0,0,0,40,0,0 +35,5,135289,1,9,1,4,1,0,0,0,0,60,0,0 +27,2,246974,9,11,1,5,1,0,0,0,0,40,0,0 +22,2,180060,1,9,0,1,0,0,0,0,0,40,29,0 +24,2,118023,5,10,0,2,3,0,0,0,0,30,0,0 +47,2,102308,0,13,1,3,1,0,0,0,0,50,0,1 +47,2,45564,5,10,1,1,1,0,0,0,0,40,0,1 +18,2,137646,2,7,0,4,3,0,1,0,0,15,0,0 +18,2,237646,5,10,0,0,3,0,0,0,0,30,0,0 +31,4,189843,1,9,2,11,0,0,0,0,0,47,0,1 +43,1,118261,3,14,2,4,4,0,1,0,0,30,0,0 +45,2,288437,1,9,1,6,1,4,0,4064,0,40,0,0 +39,2,106347,1,9,1,6,1,0,0,0,0,40,0,0 +30,2,316471,0,13,0,0,0,0,0,0,0,50,0,0 +22,2,50058,5,10,0,0,0,0,1,0,0,35,0,0 +30,1,182089,1,9,1,7,1,0,0,0,0,85,0,0 +36,2,186865,8,16,1,3,1,0,0,0,0,60,0,1 +20,0,158206,6,12,0,3,0,0,0,0,0,30,0,0 +27,2,141545,1,9,1,6,1,0,0,0,1902,45,0,0 +59,4,50929,5,10,1,1,1,0,0,0,0,60,0,1 +60,2,132529,1,9,1,10,1,0,0,0,0,40,0,0 +43,2,260696,0,13,2,1,0,0,1,0,0,40,0,0 +35,2,231180,1,9,2,6,0,0,0,0,0,60,0,0 +40,2,223277,0,13,1,0,1,0,0,0,0,50,0,1 +20,2,279538,2,7,1,2,5,0,0,2961,0,35,0,0 +47,2,46044,3,14,1,1,1,0,0,0,0,40,0,0 +40,2,168071,6,12,2,3,0,0,0,0,0,50,0,0 +20,2,79691,1,9,0,8,3,0,0,0,0,40,0,0 +25,2,124111,5,10,0,0,3,0,1,0,0,40,0,0 +47,2,104521,9,11,1,3,1,0,0,0,0,40,0,1 +29,1,128516,6,12,6,5,4,0,1,0,0,40,0,1 +34,2,112564,1,9,1,6,1,0,0,0,0,45,0,0 +45,0,32186,0,13,4,3,0,0,1,0,0,40,0,0 +23,2,239663,5,10,0,2,3,0,0,2597,0,50,0,0 +46,2,269284,6,12,6,0,4,0,1,0,0,40,0,0 +41,0,175537,5,10,2,8,0,1,1,0,0,38,0,0 +29,2,444304,0,13,1,3,1,0,0,0,0,40,0,1 +17,2,27415,2,7,0,2,3,3,0,0,0,20,0,0 +39,2,174343,4,5,1,10,1,0,0,0,0,40,0,0 +37,2,148143,1,9,0,8,4,1,1,0,0,40,0,0 +20,2,165097,1,9,0,10,0,0,0,0,0,40,0,0 +52,2,167651,9,11,1,10,1,0,0,0,0,40,0,1 +42,4,29075,6,12,1,3,2,3,1,0,0,40,0,0 +22,2,396895,11,3,1,10,1,0,0,0,0,35,4,0 +66,0,71075,5,10,2,1,0,0,1,0,0,55,0,0 +35,2,129573,1,9,1,6,1,0,0,0,0,65,0,0 +40,4,183765,6,12,0,3,0,0,0,0,0,40,0,1 +21,2,164991,1,9,2,5,4,3,1,0,0,38,0,0 +51,4,154891,1,9,2,11,4,0,0,0,0,52,0,0 +34,2,200117,12,6,1,10,1,0,0,0,0,40,0,0 +24,2,176389,1,9,1,10,1,0,0,0,0,40,0,0 +43,2,342567,0,13,3,0,4,0,1,0,0,40,0,0 +34,2,178841,0,13,1,1,2,0,1,0,0,40,0,1 +42,4,191149,3,14,0,3,4,0,1,0,0,40,0,0 +41,2,29702,9,11,0,10,0,0,0,0,0,30,0,0 +21,2,157893,1,9,0,6,3,0,1,0,0,40,0,0 +64,4,31993,7,4,1,11,1,0,0,0,0,10,0,0 +24,3,210736,1,9,0,0,0,0,1,0,1974,40,0,0 +23,2,39615,5,10,0,2,3,0,0,0,0,10,0,0 +29,2,200511,1,9,1,5,1,0,0,0,0,50,0,0 +44,1,47818,1,9,2,1,4,0,1,0,0,60,0,0 +28,2,183155,0,13,1,3,1,0,0,0,0,55,0,0 +33,5,374905,1,9,1,5,1,0,0,0,0,50,0,1 +35,2,128876,5,10,1,10,1,0,0,0,0,40,0,0 +41,2,202872,12,6,3,10,0,0,1,0,0,40,0,0 +42,2,153414,0,13,1,5,1,1,0,0,0,40,0,1 +51,1,24790,5,10,1,1,1,0,0,0,0,99,0,1 +32,2,316769,2,7,0,4,4,1,1,0,0,40,2,0 +37,2,126569,1,9,0,10,3,0,0,0,0,40,0,0 +18,2,128538,2,7,0,5,3,0,1,0,0,25,0,0 +24,2,234640,9,11,0,4,3,0,1,0,0,35,0,0 +45,2,343377,5,10,1,0,1,0,0,0,0,40,0,0 +52,3,30731,0,13,1,1,1,0,0,0,0,45,0,1 +35,2,412379,1,9,0,4,0,0,1,0,0,40,0,0 +46,5,112320,0,13,2,1,0,0,1,0,0,50,0,0 +63,2,181929,1,9,6,1,4,0,0,0,0,50,0,1 +32,4,100135,0,13,1,3,2,0,1,0,0,35,0,1 +24,2,128061,1,9,0,4,3,0,1,594,0,15,0,0 +29,2,179565,0,13,0,0,0,0,1,0,0,40,0,0 +35,2,64922,0,13,1,1,1,0,0,7688,0,50,0,1 +70,2,102610,12,6,1,2,1,0,0,0,0,32,0,0 +36,2,150548,1,9,0,8,0,0,1,0,0,30,0,0 +53,2,133219,1,9,1,4,1,1,0,4386,0,30,0,1 +49,4,67001,1,9,1,6,1,0,0,0,0,40,0,0 +60,2,162347,10,15,1,1,1,0,0,0,1902,40,0,1 +18,2,138557,2,7,0,2,3,0,0,0,0,40,0,0 +21,2,170456,5,10,0,4,3,0,0,0,0,35,25,0 +42,2,66006,12,6,0,6,0,1,0,0,0,40,0,0 +25,0,176077,3,14,0,3,0,0,1,0,0,37,0,0 +32,2,218322,1,9,1,10,1,0,0,0,0,40,0,0 +47,2,168232,0,13,1,0,1,0,0,7298,0,40,0,1 +30,2,161690,9,11,0,3,0,0,1,0,0,40,0,0 +38,1,67317,0,13,1,7,1,0,0,0,0,60,0,0 +34,2,265807,1,9,1,6,1,0,0,0,2051,55,0,0 +37,2,99357,6,12,0,4,0,0,1,0,0,30,0,0 +56,2,170070,1,9,1,1,2,0,1,0,0,40,0,1 +52,0,231166,9,11,1,1,1,0,0,0,0,40,0,0 +23,2,62339,0,13,0,3,3,0,0,0,0,40,0,0 +29,0,118520,1,9,1,11,1,0,0,0,0,42,0,0 +45,2,155659,1,9,1,10,1,0,0,0,0,40,0,1 +23,4,157331,0,13,0,3,0,0,1,0,0,40,0,0 +45,2,341762,3,14,1,1,1,0,0,0,0,65,0,1 +30,2,164190,0,13,0,1,0,0,0,0,0,42,0,0 +45,2,83064,0,13,1,5,1,0,0,0,0,50,0,0 +26,2,304283,1,9,1,8,1,0,0,0,0,40,0,0 +23,2,436798,5,10,1,8,1,0,0,0,0,40,0,0 +43,2,104660,3,14,6,1,4,0,0,4934,0,40,0,1 +42,2,79036,1,9,2,2,4,0,0,0,0,40,0,0 +72,2,165622,5,10,6,0,0,0,1,0,0,25,0,0 +57,2,199847,0,13,1,1,1,0,0,15024,0,60,0,1 +24,2,22966,0,13,1,5,1,0,0,0,0,45,0,0 +27,2,59068,1,9,1,2,1,0,0,0,0,40,0,0 +54,2,77336,1,9,1,5,1,0,0,0,0,40,0,0 +42,4,96524,1,9,1,1,1,0,0,0,0,60,0,1 +17,2,143868,4,5,0,4,3,1,0,0,0,40,0,0 +48,2,121424,0,13,1,1,1,0,0,0,0,55,0,1 +39,2,176279,0,13,2,5,0,0,1,0,0,40,0,0 +41,5,177905,0,13,1,1,1,0,0,7688,0,70,0,1 +57,2,353881,1,9,2,6,0,0,0,0,0,45,0,0 +44,4,177937,8,16,1,3,1,0,0,0,0,36,0,1 +49,2,125892,1,9,1,5,1,0,0,0,0,40,0,0 +44,2,155472,6,12,0,3,4,1,1,1151,0,50,0,0 +42,2,355728,9,11,0,10,0,0,0,0,0,44,0,0 +18,2,240330,14,8,0,4,3,0,0,0,0,18,0,0 +51,2,182944,1,9,6,9,4,1,1,0,0,40,0,0 +28,2,264498,0,13,0,3,0,0,1,0,0,40,0,0 +39,2,110426,6,12,1,1,2,0,1,15024,0,45,0,1 +25,2,166971,1,9,1,5,1,0,0,0,0,52,0,0 +41,2,347653,10,15,1,3,1,0,0,0,1977,50,0,1 +39,2,33975,5,10,1,5,1,0,0,0,0,40,0,1 +42,1,215219,2,7,4,4,4,0,1,0,0,30,0,0 +33,2,190772,1,9,0,0,0,0,1,0,1617,40,0,0 +47,2,162494,5,10,2,5,4,0,1,0,0,45,0,1 +27,4,85918,0,13,1,11,1,0,0,0,0,68,0,0 +39,2,91367,3,14,1,1,1,0,0,0,1848,45,0,1 +20,2,182342,5,10,0,7,3,0,0,0,0,40,0,0 +49,2,129640,1,9,0,4,0,0,1,0,0,40,0,0 +46,2,148738,1,9,1,2,1,0,0,0,1740,35,0,0 +47,2,102583,1,9,1,5,1,0,0,0,0,30,0,1 +35,2,111387,4,5,0,10,0,0,0,0,0,40,0,0 +24,2,241752,1,9,0,2,0,0,0,0,0,40,0,0 +43,2,101950,0,13,2,4,0,0,1,0,0,35,0,0 +53,2,183973,2,7,1,8,1,0,0,0,0,48,0,1 +47,2,142061,5,10,2,1,4,0,1,0,0,40,0,0 +34,2,158615,5,10,1,2,1,0,0,0,0,40,0,0 +37,2,29145,9,11,0,4,0,0,0,0,0,40,0,0 +35,2,40135,1,9,0,4,3,0,0,0,0,30,0,0 +23,2,224640,5,10,0,1,0,0,1,0,0,40,0,0 +29,2,167737,1,9,0,6,5,0,0,0,0,50,0,0 +23,2,60331,5,10,0,10,0,0,0,0,0,40,0,0 +35,2,187167,1,9,2,4,0,0,1,0,0,35,0,0 +27,4,255237,0,13,0,3,0,0,1,0,0,40,0,0 +40,2,163342,1,9,0,0,0,0,1,0,0,70,0,0 +31,2,129775,0,13,1,5,1,0,0,0,0,65,0,0 +18,2,206008,5,10,0,5,4,0,0,2176,0,40,0,0 +25,2,397317,6,12,0,3,0,0,1,0,0,40,0,0 +36,2,745768,5,10,0,11,4,1,1,0,0,40,0,0 +38,2,141550,12,6,2,10,0,0,0,0,0,40,0,0 +52,2,35576,1,9,6,10,0,0,0,0,0,40,0,0 +23,2,376383,1,9,0,4,4,0,0,0,0,35,4,0 +48,1,200825,5,10,1,1,1,0,0,0,0,30,0,1 +46,2,116789,1,9,1,0,1,0,0,0,0,40,0,1 +26,2,160300,1,9,3,11,0,0,0,0,0,40,0,0 +47,2,362654,1,9,1,8,1,0,0,0,0,40,0,0 +65,2,170939,0,13,2,3,0,0,0,6723,0,40,0,0 +31,4,224234,1,9,1,6,1,1,0,0,0,40,0,0 +38,2,478346,1,9,1,1,2,0,1,7688,0,40,0,1 +68,2,211162,1,9,1,1,1,0,0,0,0,40,0,0 +26,2,147638,0,13,0,0,5,2,1,0,0,40,37,0 +42,2,104647,1,9,2,4,0,0,0,0,0,40,0,0 +49,2,67365,1,9,1,10,1,0,0,0,0,40,0,1 +42,2,230959,0,13,1,0,2,2,1,0,1887,40,11,1 +39,2,176335,3,14,1,1,1,0,0,7688,0,65,0,1 +31,1,268482,4,5,1,10,1,0,0,0,0,40,0,0 +28,0,288731,0,13,1,3,1,0,0,0,0,20,0,0 +36,2,231082,0,13,2,3,0,0,1,0,0,50,0,0 +42,0,333530,5,10,1,1,2,0,1,0,0,40,0,1 +62,2,214288,1,9,1,8,1,0,0,0,0,40,0,0 +21,2,118023,1,9,0,7,3,0,0,0,0,24,0,0 +21,2,187088,5,10,0,0,3,4,1,0,0,20,1,0 +22,2,133833,5,10,0,4,3,0,1,0,0,25,0,0 +30,2,229772,12,6,1,10,1,0,0,0,0,40,0,0 +64,2,210082,1,9,6,0,0,0,1,0,0,40,0,0 +28,2,119287,0,13,1,1,2,0,1,15024,0,28,0,1 +41,1,111772,6,12,1,10,1,0,0,0,1887,40,0,1 +25,2,122999,1,9,0,10,5,0,0,0,0,40,0,0 +27,2,44767,1,9,1,7,1,0,0,0,0,40,0,0 +40,2,200574,6,12,1,9,1,0,0,0,0,44,0,0 +58,2,236596,5,10,1,1,1,0,0,0,0,40,0,1 +31,2,33124,10,15,0,3,0,0,1,0,0,99,0,0 +50,4,308764,1,9,6,6,4,0,1,0,0,40,0,0 +27,2,103524,1,9,4,2,4,0,0,0,0,40,0,0 +50,2,230951,0,13,1,5,1,0,0,0,0,40,0,0 +45,2,99355,1,9,1,11,1,1,0,0,0,40,0,1 +33,2,857532,14,8,0,11,3,1,0,0,0,40,0,0 +62,2,81116,5,10,2,0,0,0,0,0,1974,40,0,0 +38,2,154410,1,9,1,10,1,0,0,0,2051,40,12,0 +19,2,198943,5,10,0,4,3,0,1,0,0,35,0,0 +30,2,311696,2,7,1,4,2,1,1,0,0,30,0,0 +38,2,252897,5,10,2,5,3,0,1,0,0,25,0,0 +42,1,39539,1,9,1,7,1,0,0,0,0,99,0,1 +49,5,122066,5,10,2,5,0,0,0,0,0,25,0,0 +53,2,110977,3,14,1,1,1,0,0,0,1902,50,0,1 +45,4,199590,5,10,1,10,1,0,0,0,1887,40,4,1 +24,2,202721,5,10,0,0,3,1,1,0,0,40,0,0 +29,2,197565,9,11,0,0,3,0,1,0,0,35,0,0 +24,2,206827,5,10,0,5,3,0,1,5060,0,30,0,0 +25,5,158751,9,11,0,6,4,0,0,0,0,55,0,0 +51,0,243631,12,6,1,10,1,3,0,0,0,40,0,0 +19,2,45381,5,10,0,0,3,0,1,0,0,8,0,0 +38,2,167482,5,10,1,10,1,0,0,0,0,52,0,1 +60,2,225014,1,9,2,4,0,0,1,0,0,40,0,0 +29,1,405083,1,9,0,5,0,0,0,0,0,40,0,0 +28,3,24153,12,6,1,4,2,3,1,0,0,40,0,0 +36,2,126569,1,9,1,3,1,0,0,0,0,45,16,1 +24,2,315476,6,12,0,10,3,0,0,0,0,40,0,0 +43,2,248186,6,12,0,0,0,0,1,0,0,38,0,0 +29,5,206903,10,15,1,3,1,0,0,0,0,55,0,1 +67,1,191380,10,15,1,3,1,0,0,20051,0,25,0,1 +20,2,191910,1,9,0,11,3,0,0,0,0,40,0,0 +21,2,145119,5,10,0,4,3,2,0,0,0,20,0,0 +20,2,130840,12,6,0,2,3,0,0,0,0,40,0,0 +42,2,33126,6,12,1,1,1,0,0,0,0,60,0,1 +20,2,334105,5,10,0,4,3,0,1,0,0,10,0,0 +19,4,354104,1,9,0,0,3,0,0,0,0,35,0,0 +34,2,111985,1,9,1,10,1,0,0,0,0,45,0,0 +40,4,321187,0,13,0,3,4,0,1,0,0,45,0,0 +33,2,138142,5,10,4,4,4,1,1,0,0,25,0,0 +36,2,296999,5,10,2,10,0,0,1,0,0,37,0,0 +43,2,155106,6,12,2,10,0,0,0,0,2444,70,0,1 +41,4,174491,1,9,4,4,4,1,1,0,0,40,0,0 +34,0,173266,1,9,1,9,1,0,0,0,0,40,0,1 +33,2,25610,6,12,1,5,1,4,0,0,0,40,28,1 +47,2,187563,1,9,1,8,1,0,0,0,0,40,0,0 +41,2,196344,15,2,1,5,1,0,0,0,0,50,4,0 +40,2,205047,1,9,3,10,0,0,0,0,0,40,0,1 +28,2,715938,0,13,0,10,3,1,0,0,0,40,0,0 +62,1,224520,1,9,1,5,1,0,0,0,0,90,0,1 +29,2,229656,1,9,2,0,4,0,1,0,0,50,0,0 +46,2,97883,5,10,2,0,0,0,1,0,0,40,0,0 +28,2,131298,1,9,0,4,0,0,0,0,0,60,0,0 +57,3,197875,1,9,2,0,0,0,1,0,0,40,0,0 +22,2,172766,5,10,0,5,3,0,1,0,0,40,0,0 +28,4,175796,6,12,0,0,0,0,1,0,0,40,0,0 +24,2,51973,0,13,0,0,0,0,1,0,0,45,0,0 +54,1,28186,0,13,2,7,0,0,0,27828,0,50,0,1 +22,2,291979,2,7,4,10,0,0,0,0,0,40,0,0 +36,0,180752,0,13,0,11,4,1,1,0,0,40,0,0 +50,2,234657,5,10,2,0,4,0,1,0,0,40,0,0 +18,2,39411,2,7,0,2,3,0,0,0,0,24,0,0 +52,0,334273,6,12,1,5,1,0,0,0,0,40,0,1 +36,2,171676,0,13,0,5,0,0,1,0,1741,40,0,0 +34,1,182714,0,13,0,3,0,0,1,0,0,55,0,1 +21,2,231866,9,11,0,10,3,0,0,0,0,40,0,0 +46,2,102102,1,9,0,1,0,0,0,0,0,40,0,0 +61,4,195519,3,14,0,3,4,0,1,0,0,25,0,0 +22,0,34310,5,10,0,6,3,0,0,0,0,25,0,0 +36,0,747719,10,15,1,3,2,0,1,15024,0,50,0,1 +43,4,188280,3,14,2,3,4,0,1,914,0,40,0,0 +25,2,110978,6,12,1,0,2,2,1,0,0,37,3,1 +17,2,79682,12,6,0,13,5,0,0,0,0,30,0,0 +45,2,294671,9,11,1,10,1,0,0,4386,0,38,0,1 +30,2,340899,10,15,0,3,0,0,0,0,1590,80,0,0 +40,2,192259,3,14,0,3,0,0,0,0,0,35,0,0 +31,4,190228,3,14,0,1,0,0,0,0,0,45,0,0 +42,2,118947,0,13,1,1,1,0,0,0,0,40,0,1 +53,2,55861,1,9,1,10,1,0,0,0,0,40,0,1 +37,2,238433,15,2,1,6,1,0,0,0,0,40,1,0 +37,0,166744,1,9,3,4,4,0,1,0,0,20,0,0 +54,2,144586,5,10,1,5,2,0,1,0,0,40,0,1 +36,2,134367,1,9,2,4,3,0,1,0,0,30,0,0 +46,2,133616,5,10,2,0,4,0,1,0,0,40,0,0 +46,2,203039,0,13,1,5,1,0,0,0,0,48,0,0 +32,2,217460,4,5,1,6,1,0,0,0,0,50,0,0 +17,2,106733,2,7,0,10,3,0,0,594,0,40,0,0 +42,0,212027,0,13,2,3,0,1,0,0,0,40,0,0 +37,4,126569,1,9,0,10,0,0,0,0,0,40,0,0 +29,2,289960,1,9,1,8,1,0,0,0,0,48,0,0 +54,2,174102,0,13,1,1,1,0,0,0,0,40,0,1 +38,2,181716,14,8,1,10,1,0,0,0,0,48,0,0 +46,4,172822,1,9,1,6,1,0,0,0,0,40,0,0 +24,2,293091,1,9,1,2,1,0,0,0,0,40,0,0 +57,2,107443,15,2,1,2,1,0,0,0,0,40,20,0 +59,2,95283,15,2,1,8,1,0,0,0,0,40,0,0 +33,2,65278,0,13,1,1,1,0,0,0,0,40,0,1 +35,2,220943,1,9,2,4,4,1,1,0,1594,40,0,0 +53,2,257940,1,9,1,8,1,0,0,2829,0,40,0,0 +26,2,134945,1,9,0,8,5,0,0,0,0,40,0,0 +55,1,105582,3,14,1,5,1,0,0,2228,0,50,0,0 +46,2,169324,1,9,4,4,0,1,1,0,0,45,2,0 +44,0,98989,0,13,1,3,1,3,0,0,0,38,0,1 +30,1,113838,9,11,1,5,1,0,0,3137,0,60,9,0 +24,2,143436,5,10,0,2,3,0,0,0,0,24,0,0 +32,2,143604,12,6,3,4,0,1,1,0,0,37,0,0 +35,2,226311,0,13,0,5,0,0,1,0,0,40,0,0 +67,2,94610,3,14,1,5,1,0,0,0,0,30,0,1 +56,1,26716,0,13,1,1,1,0,0,0,0,20,0,1 +26,2,160261,3,14,0,3,0,2,0,0,0,20,3,0 +46,2,117310,6,12,6,9,4,0,1,6497,0,40,0,0 +52,2,154342,1,9,1,10,1,0,0,0,0,48,0,1 +38,1,89202,5,10,2,10,0,0,0,0,0,40,0,0 +31,2,174704,1,9,2,5,4,1,0,0,0,50,0,0 +53,2,153486,1,9,4,6,0,0,0,0,0,30,0,0 +27,2,360097,1,9,0,2,0,1,0,0,0,40,0,0 +39,2,230356,0,13,0,0,0,0,1,0,0,40,0,0 +22,2,163870,1,9,0,8,3,0,0,0,0,40,0,0 +37,2,199753,5,10,1,10,1,0,0,0,0,35,0,1 +20,2,333505,1,9,0,0,3,0,0,0,0,30,35,0 +60,4,149281,1,9,1,11,1,0,0,0,0,40,0,0 +51,2,138514,9,11,2,9,4,1,1,0,0,48,0,0 +57,3,66504,10,15,2,3,0,0,1,0,0,50,0,1 +59,2,206487,5,10,1,10,1,0,0,0,0,40,0,1 +37,2,170020,1,9,1,10,1,0,0,0,0,40,0,0 +35,2,217605,1,9,1,2,2,0,1,0,0,40,0,0 +43,2,145711,5,10,1,5,1,0,0,0,0,72,0,1 +17,2,169155,14,8,0,4,3,0,0,0,0,35,0,0 +45,2,34127,0,13,1,3,1,0,0,0,0,50,0,1 +18,2,110142,1,9,0,5,3,0,1,0,0,40,0,0 +52,2,222646,14,8,4,8,5,0,1,0,0,40,1,0 +18,2,182643,5,10,0,2,3,0,0,0,0,9,0,0 +20,2,303565,5,10,0,2,3,1,0,0,0,40,9,0 +34,2,140092,1,9,0,9,0,0,0,0,0,40,0,0 +19,2,178811,1,9,0,8,3,1,1,0,0,20,0,0 +17,4,192387,4,5,0,4,3,0,0,0,0,45,0,0 +30,3,127610,0,13,0,0,0,0,1,0,0,35,0,0 +29,2,258862,0,13,0,10,0,0,1,0,0,45,0,0 +30,2,225231,5,10,2,1,0,0,0,8614,0,50,0,1 +50,0,238187,0,13,2,0,0,1,1,0,0,37,0,0 +22,2,191444,1,9,0,5,5,0,0,0,0,40,0,0 +21,2,198822,1,9,0,0,3,0,1,0,0,35,0,0 +39,1,251323,4,5,1,7,5,0,0,0,0,40,1,0 +20,2,168187,5,10,0,4,5,0,1,4416,0,25,0,0 +62,2,370881,6,12,6,4,0,0,1,0,0,7,0,0 +32,2,198183,5,10,2,1,0,0,1,0,0,38,0,0 +38,2,210610,6,12,1,9,1,0,0,0,0,40,0,1 +32,2,269182,5,10,4,9,4,1,1,3887,0,40,0,0 +55,2,141727,0,13,1,0,2,0,1,3464,0,40,0,0 +38,2,185848,3,14,1,1,1,0,0,99999,0,70,0,1 +34,2,46746,2,7,0,4,0,0,0,0,0,30,0,0 +28,2,120475,1,9,0,4,3,0,0,0,0,20,0,0 +26,2,135845,5,10,0,5,0,0,1,0,0,37,0,0 +41,2,310255,1,9,1,5,1,0,0,0,0,40,0,0 +61,0,379885,8,16,1,3,1,0,0,0,1902,40,0,1 +75,1,31428,1,9,1,7,1,0,0,3456,0,40,0,0 +21,2,211013,9,11,1,4,5,0,1,0,0,50,4,0 +50,2,175029,1,9,1,2,1,0,0,0,0,40,0,1 +26,2,247025,1,9,1,6,1,0,0,0,0,65,0,0 +39,2,252327,7,4,0,4,3,0,0,0,0,40,4,0 +24,1,375313,5,10,0,3,0,2,0,0,0,40,0,0 +56,2,107165,1,9,1,2,1,0,0,0,0,18,0,0 +17,2,108470,2,7,0,4,3,1,0,0,0,17,0,0 +37,2,150057,1,9,1,10,1,0,0,0,0,52,0,1 +23,2,189468,9,11,1,8,3,0,1,0,0,30,0,0 +57,1,181031,1,9,1,7,1,0,0,0,0,60,0,0 +42,4,569930,0,13,1,0,1,0,0,0,0,45,0,1 +25,2,27411,0,13,2,5,0,0,1,0,0,40,0,0 +22,2,147397,0,13,0,7,0,0,0,0,0,20,0,0 +39,2,242922,1,9,1,10,1,1,0,0,0,40,0,0 +54,2,154949,2,7,1,4,2,1,1,0,0,40,0,1 +41,5,423217,0,13,2,1,0,0,0,0,0,50,0,0 +43,3,195385,1,9,1,1,1,3,0,0,0,40,0,0 +19,2,100009,1,9,0,10,0,0,1,0,0,40,0,0 +35,2,191628,5,10,1,3,1,0,0,0,0,40,0,0 +34,2,340880,1,9,1,3,1,0,0,0,0,60,11,1 +19,2,207173,1,9,4,0,4,0,1,0,0,30,0,0 +33,2,48010,5,10,2,1,4,0,1,0,0,40,0,0 +33,2,229051,5,10,0,3,0,0,0,0,0,52,0,0 +49,2,193366,3,14,1,1,1,0,0,0,0,65,0,1 +31,2,57781,1,9,2,0,4,0,1,0,0,50,0,0 +41,2,433989,9,11,1,5,1,0,0,4386,0,60,0,1 +24,2,136687,1,9,4,8,4,4,1,0,0,40,0,0 +45,0,154117,1,9,2,1,4,0,1,0,0,38,0,1 +63,2,294009,0,13,1,3,1,0,0,15024,0,45,0,1 +75,2,239038,5,10,1,6,1,0,0,0,0,16,0,0 +34,2,244064,1,9,0,8,4,1,0,0,0,40,0,0 +69,2,128348,0,13,1,1,1,1,0,9386,0,50,0,1 +33,2,66278,3,14,0,3,0,0,1,0,0,40,0,0 +44,2,162643,1,9,0,0,0,0,1,0,0,43,0,0 +45,2,179659,0,13,1,10,1,0,0,3103,0,40,0,1 +18,2,205218,2,7,0,5,3,0,1,0,0,20,0,0 +48,2,154033,1,9,2,5,0,0,1,0,0,52,0,0 +43,2,158528,1,9,1,10,1,0,0,0,0,40,0,1 +26,2,366219,1,9,1,10,1,1,0,0,1848,60,0,1 +35,2,301862,1,9,0,10,4,0,0,0,0,50,0,0 +34,2,228406,5,10,0,0,4,1,1,0,0,40,0,0 +48,2,120131,1,9,1,0,1,0,0,0,0,70,0,1 +54,4,127943,1,9,6,4,4,1,1,0,0,40,0,0 +57,2,301514,1,9,1,5,1,0,0,0,0,40,0,0 +21,2,156980,1,9,0,8,3,0,0,0,0,60,0,0 +28,2,124685,5,10,1,1,1,3,0,0,0,55,0,0 +51,2,305673,9,11,1,10,1,0,0,0,0,40,8,1 +34,4,31391,1,9,1,11,1,0,0,0,0,53,0,1 +41,4,33658,5,10,1,11,1,0,0,0,0,45,0,1 +21,2,211391,5,10,0,0,0,0,1,0,0,27,0,0 +26,2,402998,0,13,1,3,1,0,0,0,0,58,0,1 +66,2,78855,1,9,0,0,0,2,1,0,0,40,0,0 +40,2,320451,8,16,1,3,1,2,0,0,1977,45,37,1 +48,2,49278,6,12,2,0,4,0,1,0,0,40,0,0 +41,2,242586,1,9,1,8,1,0,0,0,0,40,0,0 +41,2,359696,0,13,1,11,1,0,0,15024,0,60,0,1 +55,4,296085,6,12,1,3,1,2,0,0,0,40,0,1 +43,2,233130,0,13,2,5,0,0,0,0,0,40,0,1 +51,2,189511,9,11,1,4,1,0,0,0,0,50,9,1 +31,2,124420,2,7,1,10,1,0,0,0,0,40,0,0 +30,1,67072,0,13,3,10,0,0,0,6849,0,60,0,0 +51,2,194908,1,9,1,0,2,0,1,0,0,40,0,0 +31,4,94991,1,9,2,4,4,3,0,0,0,40,0,0 +18,2,194561,5,10,0,4,3,0,0,0,0,37,0,0 +60,2,75726,1,9,2,1,0,0,1,0,1092,40,0,0 +29,2,60722,1,9,0,1,0,2,1,0,0,40,0,0 +33,2,59944,1,9,0,6,0,0,0,0,0,40,0,0 +34,2,220840,11,3,1,7,1,0,0,0,0,40,4,0 +40,5,104235,3,14,0,4,3,0,0,0,0,99,0,0 +57,2,142714,5,10,2,4,0,0,1,0,0,38,0,0 +55,4,110490,0,13,1,3,2,0,1,0,0,60,0,0 +40,1,154076,6,12,1,1,1,0,0,0,0,60,0,0 +26,0,130557,0,13,0,1,0,0,1,0,0,35,0,0 +29,2,107108,5,10,1,0,1,3,0,0,0,40,0,0 +30,2,207172,0,13,1,0,2,0,1,0,0,40,4,0 +29,2,304595,3,14,0,5,0,0,0,0,0,50,0,1 +43,2,475322,5,10,1,6,1,0,0,0,0,50,0,1 +65,2,107620,2,7,6,0,0,0,1,0,0,8,0,0 +19,2,301911,5,10,0,5,3,2,0,0,0,35,17,0 +35,2,267866,1,9,1,5,1,2,0,0,1887,50,10,1 +28,2,269786,1,9,1,6,1,0,0,0,0,40,0,0 +34,2,167474,1,9,1,1,1,0,0,0,0,40,0,0 +61,2,115023,9,11,1,10,1,0,0,0,1887,60,0,1 +63,4,86590,1,9,1,1,2,0,1,0,0,32,0,0 +47,0,187087,0,13,1,1,1,0,0,0,0,40,0,1 +31,2,184307,5,10,2,10,0,0,0,0,0,40,0,0 +18,2,225859,5,10,0,6,3,0,0,2907,0,30,0,0 +29,2,57889,0,13,1,5,1,0,0,0,0,45,0,1 +59,2,157932,1,9,1,10,1,0,0,0,0,40,0,0 +50,2,187830,3,14,2,1,0,0,0,0,0,62,0,1 +49,2,251180,7,4,1,6,1,0,0,2407,0,50,0,0 +60,2,317083,0,13,1,1,1,0,0,0,0,45,0,1 +35,1,190895,3,14,1,5,1,0,0,0,0,40,0,1 +48,3,328606,1,9,2,2,0,0,0,0,0,40,0,0 +41,2,215479,1,9,4,2,0,1,0,0,0,40,0,0 +56,2,157639,5,10,1,10,1,0,0,0,0,50,0,0 +26,2,152129,14,8,0,4,4,1,0,0,0,40,0,0 +53,2,239284,1,9,2,0,4,0,1,0,0,40,0,0 +23,2,234302,1,9,0,2,0,1,0,0,0,40,0,0 +58,2,218724,7,4,1,7,1,0,0,0,0,50,0,0 +61,2,106330,1,9,1,10,1,0,0,0,0,40,0,0 +29,2,35032,5,10,1,2,1,0,0,0,0,60,0,0 +22,2,234641,1,9,0,6,3,0,0,0,0,40,0,0 +43,2,170730,0,13,1,1,1,0,0,0,1977,50,0,1 +31,2,218322,5,10,0,4,0,0,0,0,0,30,0,0 +90,2,47929,1,9,1,8,1,0,0,0,0,40,0,0 +53,2,142411,9,11,2,3,4,0,1,0,0,40,0,0 +55,2,132887,1,9,1,6,1,1,0,3411,0,40,2,0 +34,0,44464,8,16,0,3,0,0,1,0,0,60,0,0 +28,2,180928,5,10,1,2,1,0,0,5013,0,55,0,0 +36,2,139703,1,9,0,0,0,1,1,0,0,40,0,0 +33,2,202642,0,13,4,3,5,1,1,0,0,40,2,0 +17,2,160049,12,6,0,4,3,0,1,0,0,12,0,0 +38,2,239755,2,7,2,10,0,0,0,0,0,40,0,0 +60,2,152369,9,11,1,10,1,0,0,0,0,60,0,0 +34,2,42900,0,13,1,1,1,0,0,0,0,50,0,1 +57,2,175017,11,3,1,4,1,0,0,0,0,40,25,0 +39,2,342642,1,9,2,5,0,0,0,0,0,60,0,0 +50,1,143730,0,13,1,7,1,0,0,0,0,80,0,0 +45,2,191098,0,13,1,3,1,2,0,0,0,40,26,0 +37,2,208106,0,13,4,1,0,0,0,0,0,35,0,0 +27,2,167737,5,10,0,2,0,0,0,0,0,48,0,0 +43,2,315971,0,13,2,1,0,0,1,0,0,45,0,1 +41,2,142717,5,10,2,9,4,1,1,0,0,36,0,0 +20,2,190227,3,14,0,1,3,0,0,0,0,25,0,0 +44,2,79864,3,14,4,1,4,0,1,0,0,20,0,0 +50,2,34067,9,11,1,1,1,0,0,0,0,50,0,1 +54,2,222882,1,9,6,1,4,0,1,0,0,45,0,0 +31,2,44464,0,13,0,1,0,0,1,0,1564,60,0,1 +33,2,256062,5,10,0,0,4,0,1,0,0,35,5,0 +22,2,251073,4,5,0,4,3,0,0,0,0,50,0,0 +46,2,149949,5,10,1,10,1,0,0,0,0,40,0,0 +30,2,165235,0,13,1,0,2,2,1,0,0,40,11,1 +57,1,175942,5,10,6,1,5,0,0,0,0,25,0,0 +26,2,212793,1,9,0,8,0,0,0,0,0,40,0,0 +52,4,153312,6,12,1,11,1,0,0,0,0,40,0,1 +55,4,173296,3,14,2,3,4,0,1,0,0,45,0,0 +47,2,120131,0,13,1,5,1,0,0,0,0,40,0,1 +19,2,117444,1,9,0,10,3,0,0,0,0,40,0,0 +26,2,226196,1,9,0,6,3,0,0,0,0,40,0,0 +44,2,202872,6,12,2,3,0,0,1,0,0,40,0,1 +42,2,176716,3,14,0,1,0,0,0,0,0,40,0,1 +39,2,82540,5,10,1,1,1,0,0,0,0,60,0,0 +26,2,197292,1,9,0,0,0,0,1,0,0,50,0,0 +26,2,76491,3,14,1,3,1,0,0,0,0,20,0,0 +50,5,101094,3,14,1,5,1,0,0,0,0,55,0,0 +46,1,119944,3,14,1,1,1,0,0,0,0,50,0,1 +18,2,141626,5,10,0,9,3,0,0,2176,0,20,0,0 +26,2,122575,0,13,0,1,4,2,0,0,0,60,36,0 +32,2,194740,0,13,1,5,1,0,0,0,1902,40,0,1 +50,2,263200,11,3,3,4,4,0,1,0,0,34,4,0 +47,4,140644,5,10,1,11,1,0,0,0,0,40,0,1 +52,2,202115,1,9,1,4,2,0,1,0,0,25,0,0 +25,3,27142,5,10,1,1,1,0,0,0,0,40,0,1 +42,4,318046,2,7,1,6,1,0,0,0,0,40,0,0 +53,2,276369,1,9,1,1,1,0,0,0,0,45,0,0 +30,2,67187,1,9,0,2,3,3,1,0,0,8,0,0 +23,2,133582,15,2,0,7,0,0,0,0,0,36,4,0 +32,2,45796,5,10,1,7,1,0,0,0,0,60,0,0 +29,5,31778,1,9,4,3,5,0,0,0,0,25,0,0 +40,2,190044,6,12,1,4,1,0,0,0,0,40,0,0 +45,0,144351,3,14,1,3,1,0,0,0,0,40,0,1 +55,2,193130,0,13,1,3,1,0,0,0,0,40,0,1 +59,4,140478,3,14,1,3,1,0,0,0,0,40,0,1 +56,2,122390,9,11,1,5,1,0,0,15024,0,40,0,1 +23,2,116830,14,8,0,10,0,0,0,0,0,50,0,0 +37,4,117683,1,9,1,11,1,0,0,0,0,40,0,0 +25,2,106491,1,9,1,10,1,0,0,0,0,48,0,0 +27,2,363053,4,5,0,13,4,0,1,0,0,24,4,0 +21,2,54472,1,9,0,4,4,0,1,0,0,40,0,0 +47,4,200471,1,9,1,6,1,0,0,5178,0,40,0,1 +38,2,54317,5,10,1,8,1,0,0,0,0,60,0,0 +62,4,113443,3,14,2,3,0,0,1,10520,0,33,0,1 +27,2,159623,5,10,1,5,1,0,0,0,0,40,0,0 +27,2,247978,1,9,0,4,3,1,1,0,0,40,0,0 +40,2,305846,5,10,1,0,2,0,1,0,0,40,0,1 +22,1,214014,5,10,0,5,3,1,0,99999,0,55,0,1 +33,2,226525,1,9,2,1,0,0,0,0,0,60,0,0 +28,2,247819,9,11,1,3,2,0,1,0,0,5,0,0 +28,2,194940,1,9,1,8,1,0,0,0,0,40,0,0 +29,2,289991,1,9,0,6,4,0,0,0,0,55,0,0 +46,2,585361,4,5,2,1,4,0,1,0,0,40,0,0 +30,2,91145,1,9,1,8,1,0,0,0,0,40,0,0 +28,2,273269,5,10,0,10,0,1,0,0,0,40,0,0 +39,2,202683,0,13,1,0,1,0,0,0,0,40,0,0 +35,2,159179,5,10,0,5,0,0,0,0,0,40,0,0 +50,2,28952,5,10,1,5,2,0,1,0,0,39,0,0 +63,2,163708,4,5,6,4,0,0,1,0,0,20,0,0 +56,2,200235,9,11,1,10,1,0,0,0,0,48,0,1 +46,2,109209,5,10,1,0,1,0,0,0,0,40,0,1 +19,2,166153,5,10,0,4,3,0,1,0,0,30,0,0 +31,2,69056,1,9,2,4,3,0,1,0,0,15,0,0 +51,0,237141,3,14,1,1,1,0,0,0,0,40,0,1 +17,2,277541,2,7,0,5,3,0,0,0,0,5,0,0 +27,4,289039,5,10,0,11,4,2,1,0,0,40,0,0 +30,2,134737,5,10,0,0,3,0,0,0,0,45,0,0 +18,2,56613,5,10,0,11,3,0,1,0,0,20,0,0 +41,2,36699,5,10,2,1,0,0,0,4650,0,40,0,0 +40,4,333530,3,14,1,3,2,0,1,0,0,40,0,1 +35,2,185366,0,13,0,5,0,0,0,0,0,50,0,0 +29,2,154017,1,9,0,5,0,0,1,0,0,10,0,0 +27,2,215504,0,13,1,5,1,0,0,0,1848,55,0,1 +25,2,222539,12,6,0,6,0,0,0,2597,0,50,0,0 +53,2,191565,15,2,2,4,4,1,1,0,0,40,21,0 +53,2,111939,0,13,1,4,1,0,0,0,0,35,0,0 +26,0,53903,1,9,0,10,4,0,0,0,0,50,0,0 +41,2,146659,0,13,1,3,1,0,0,0,0,70,0,0 +28,2,194200,1,9,1,1,1,0,0,0,0,70,0,0 +48,0,78529,3,14,4,3,0,0,0,0,0,60,0,0 +22,2,194829,0,13,0,1,0,0,0,0,0,30,0,0 +40,3,330174,10,15,1,3,1,0,0,7688,0,40,0,1 +52,5,230767,0,13,1,1,1,0,0,0,1902,60,1,1 +53,4,137250,3,14,6,3,4,1,1,0,1669,35,0,0 +40,2,254478,5,10,1,10,1,0,0,7298,0,50,0,1 +57,2,300908,6,12,2,8,0,0,0,0,0,75,0,0 +53,1,187830,9,11,4,10,0,0,0,0,0,40,12,0 +23,2,201138,5,10,0,0,0,0,1,0,0,8,0,0 +31,1,44503,5,10,1,10,1,0,0,0,0,40,0,0 +20,2,381357,4,5,0,2,3,0,0,0,0,28,0,0 +25,2,311124,10,15,0,3,0,0,1,0,0,20,0,0 +37,2,96330,5,10,0,1,4,1,1,0,0,40,0,0 +50,2,228238,1,9,1,10,1,0,0,0,0,40,0,1 +34,1,56964,1,9,1,6,1,0,0,0,0,35,0,0 +37,2,127772,0,13,1,1,1,0,0,0,0,50,0,1 +52,2,386397,0,13,1,1,1,0,0,0,0,45,0,1 +29,1,404998,9,11,1,7,1,0,0,0,0,90,0,0 +49,2,34545,5,10,1,1,1,0,0,0,1887,40,0,1 +31,2,157886,5,10,1,4,2,0,1,0,0,40,0,0 +47,2,101299,1,9,1,10,1,0,0,0,0,40,0,0 +51,1,134447,1,9,1,10,1,0,0,0,0,70,0,0 +27,2,191822,1,9,1,5,2,0,1,0,0,50,0,0 +23,2,70919,0,13,0,1,0,0,0,0,0,40,0,0 +55,2,266343,1,9,1,3,1,0,0,0,0,46,0,0 +28,2,87239,5,10,1,1,1,0,0,0,0,50,0,1 +31,4,236487,0,13,0,3,0,0,1,0,0,40,9,0 +30,2,224147,1,9,0,6,3,1,0,0,0,40,0,0 +23,2,197200,0,13,0,3,3,0,0,0,0,60,0,0 +19,2,124265,1,9,0,5,3,0,0,0,0,50,0,0 +22,2,79980,5,10,0,5,3,0,0,0,0,25,0,0 +50,2,128814,1,9,2,4,4,0,1,0,0,25,0,0 +21,2,51262,1,9,0,4,3,0,0,0,0,35,0,0 +75,5,98116,5,10,6,5,0,0,0,0,0,40,0,1 +29,2,82393,1,9,0,8,3,2,0,0,0,40,9,0 +47,2,57534,5,10,1,10,1,0,0,0,0,40,0,1 +20,2,218962,1,9,0,8,0,0,0,0,0,40,0,0 +33,2,204752,1,9,0,4,3,0,0,0,0,40,0,0 +45,2,243631,8,16,1,3,1,2,0,0,0,45,26,1 +41,2,170299,9,11,2,3,4,0,1,0,0,43,0,0 +23,2,60331,1,9,0,8,3,0,0,0,0,40,0,0 +38,2,269318,0,13,1,0,1,0,0,5178,0,50,0,1 +67,0,132819,5,10,1,11,1,0,0,0,0,41,0,1 +21,2,119665,5,10,0,9,3,0,0,0,0,35,0,0 +38,2,150057,5,10,0,3,0,0,0,0,0,45,0,0 +31,2,128567,1,9,1,10,1,0,0,0,0,40,0,0 +59,1,148526,5,10,1,5,1,0,0,0,0,40,0,0 +36,2,160192,1,9,0,4,0,0,0,0,0,40,0,0 +50,4,74660,5,10,6,3,4,0,0,0,0,40,0,0 +60,5,142494,12,6,1,10,1,0,0,0,0,40,0,0 +30,2,122042,3,14,1,1,1,0,0,0,0,45,0,1 +28,5,37088,0,13,0,5,0,0,0,0,0,50,0,0 +36,2,61778,5,10,1,10,1,0,0,0,0,60,0,1 +27,2,123302,1,9,1,4,1,0,0,0,0,40,12,0 +18,2,89760,14,8,0,4,3,0,1,0,0,20,0,0 +44,4,165304,5,10,1,1,1,0,0,0,1485,40,0,1 +56,2,104945,7,4,1,4,1,1,0,0,0,40,0,0 +51,5,192973,0,13,1,11,1,1,0,0,0,40,0,1 +48,2,97863,0,13,1,3,1,0,0,0,0,45,25,1 +31,2,73585,9,11,1,3,1,0,0,0,0,45,0,0 +35,2,29145,9,11,0,6,0,0,0,0,0,40,0,0 +35,2,175232,1,9,2,2,5,0,0,0,0,40,0,0 +36,2,325374,5,10,1,10,1,0,0,0,0,40,0,0 +47,1,107231,6,12,1,10,1,0,0,0,1672,65,0,0 +23,2,129345,5,10,0,4,0,0,0,0,0,25,0,0 +21,2,228395,5,10,0,5,5,1,1,0,0,20,0,0 +49,2,452402,5,10,4,1,4,1,1,0,0,60,0,0 +51,5,338260,10,15,1,3,1,0,0,15024,0,60,0,1 +46,2,165138,9,11,1,10,1,0,0,0,0,40,0,0 +31,2,109055,1,9,1,7,1,0,0,3137,0,45,0,0 +27,2,193122,1,9,1,8,1,0,0,0,0,40,0,0 +48,2,191858,5,10,1,10,1,0,0,0,0,40,0,0 +30,2,297155,5,10,2,0,4,1,1,0,0,40,0,0 +29,4,181282,0,13,2,3,0,0,0,0,0,50,0,0 +50,3,111700,3,14,0,1,0,0,1,0,0,50,0,0 +18,2,35065,1,9,0,6,0,1,0,0,0,35,0,0 +37,2,298539,1,9,1,1,1,0,0,0,1902,55,0,1 +51,1,95435,1,9,1,5,1,0,0,0,0,60,0,1 +31,2,162160,1,9,1,10,1,0,0,0,0,47,0,0 +29,2,176037,9,11,2,9,0,1,0,14344,0,40,0,1 +39,2,314007,12,6,1,10,1,0,0,0,2051,40,0,0 +48,2,197683,5,10,1,5,1,1,0,0,0,40,0,1 +44,2,242521,0,13,1,5,1,0,0,7688,0,50,0,1 +39,2,290321,12,6,1,8,1,0,0,0,0,40,0,0 +22,4,44064,2,7,0,2,3,0,0,0,0,35,0,0 +42,2,374790,4,5,2,10,0,0,0,0,0,40,0,0 +18,2,231562,1,9,0,5,3,0,1,0,0,33,0,0 +27,2,376150,5,10,3,5,0,0,1,0,0,25,0,0 +51,2,99987,12,6,4,8,4,1,1,0,0,40,0,0 +27,1,120126,5,10,1,1,1,0,0,0,0,40,0,0 +60,1,33717,2,7,1,7,1,0,0,0,0,50,0,0 +36,2,132879,15,2,1,2,1,0,0,0,0,40,25,0 +45,2,304570,0,13,1,1,1,2,0,0,0,60,26,1 +40,2,100292,1,9,1,5,1,0,0,0,0,52,0,1 +63,2,117473,5,10,1,3,1,0,0,4386,0,40,0,1 +41,2,239833,1,9,3,6,4,1,0,0,0,50,0,0 +34,2,130369,1,9,2,6,4,0,1,1151,0,48,9,0 +34,2,347166,5,10,1,0,1,0,0,0,0,40,0,0 +31,2,502752,0,13,1,0,2,0,1,0,0,40,0,1 +22,0,255575,6,12,0,3,0,0,1,0,0,15,0,0 +49,2,277946,5,10,1,1,1,0,0,0,0,50,0,1 +36,2,143123,10,15,1,3,1,0,0,0,0,50,0,1 +27,2,69132,0,13,0,9,0,0,0,0,0,37,0,0 +52,1,34973,1,9,1,7,1,0,0,0,1887,60,0,1 +29,2,236992,1,9,1,4,1,1,0,0,0,50,0,0 +27,2,492263,12,6,4,8,3,0,0,0,0,35,4,0 +42,2,180019,1,9,0,4,0,0,1,0,0,65,0,0 +49,1,47086,0,13,6,5,4,0,1,0,0,40,0,0 +24,2,222853,5,10,0,10,4,0,0,0,0,50,0,0 +22,2,344176,1,9,0,5,4,0,0,0,0,20,0,0 +30,1,223212,0,13,0,5,4,0,0,0,0,40,0,0 +28,2,110981,5,10,0,4,0,0,0,0,0,40,0,0 +20,2,162688,9,11,0,4,3,0,0,0,0,40,0,0 +45,5,181307,10,15,1,3,1,0,0,15024,0,43,0,1 +39,2,148903,1,9,2,5,0,0,1,4687,0,50,0,1 +43,2,306440,10,15,0,3,0,0,0,0,0,66,23,0 +18,2,210311,1,9,0,5,3,0,1,0,0,20,0,0 +53,2,127117,1,9,1,8,1,0,0,0,0,40,0,0 +74,2,54732,5,10,1,5,1,0,0,0,0,20,0,1 +39,2,271521,0,13,1,3,1,2,0,0,0,48,11,1 +49,2,543922,1,9,1,10,1,0,0,0,0,42,0,1 +21,2,766115,12,6,1,2,1,0,0,0,0,35,0,0 +39,2,284166,1,9,0,10,0,0,0,0,1564,50,0,1 +49,2,122206,9,11,1,5,1,0,0,0,0,25,0,0 +47,2,334039,0,13,1,1,1,0,0,7298,0,44,0,1 +46,1,225456,1,9,1,1,1,0,0,0,0,40,0,0 +29,2,112847,9,11,1,10,1,2,0,7298,0,32,0,1 +61,1,171840,1,9,6,3,4,0,1,0,0,16,0,0 +48,2,180695,5,10,2,1,0,0,1,0,0,38,0,0 +44,2,121012,4,5,2,10,0,0,0,0,0,40,0,0 +37,5,126569,0,13,1,10,1,0,0,0,0,60,0,0 +45,2,227791,5,10,1,5,1,0,0,0,1740,50,0,0 +51,1,290290,0,13,1,3,1,0,0,0,0,45,0,1 +33,4,251521,0,13,0,1,0,0,1,0,0,50,0,0 +55,1,41938,0,13,1,3,2,0,1,0,0,8,0,0 +25,2,27678,5,10,1,4,2,0,1,0,0,60,0,0 +26,2,133756,1,9,2,7,0,2,0,0,0,40,11,0 +54,2,215990,1,9,1,1,1,0,0,0,0,40,0,1 +38,2,461337,1,9,0,5,0,0,1,0,0,33,0,0 +39,4,344855,3,14,1,3,2,0,1,0,1977,20,0,1 +20,0,214542,5,10,0,3,3,0,0,0,0,40,0,0 +30,2,258170,1,9,2,0,0,0,1,0,0,40,0,0 +29,3,242147,1,9,2,0,0,4,0,0,0,45,0,0 +42,2,235700,1,9,2,2,0,0,1,0,0,40,0,0 +24,2,278130,6,12,0,0,0,0,0,0,0,40,0,0 +36,2,261241,1,9,1,8,1,0,0,0,0,50,0,1 +60,2,85995,3,14,1,0,1,2,0,0,0,50,27,1 +42,2,340885,1,9,2,7,0,0,0,0,0,44,0,0 +42,2,152889,12,6,1,10,1,0,0,0,0,45,0,0 +46,2,195023,1,9,3,8,0,0,1,0,0,40,13,0 +52,0,109600,3,14,3,1,4,0,1,4787,0,44,0,1 +43,2,158177,5,10,2,0,4,1,1,0,0,35,0,0 +43,0,47818,0,13,0,3,0,0,1,0,0,40,0,0 +27,2,391468,2,7,2,10,3,0,0,0,0,40,0,0 +52,4,199995,3,14,1,1,1,0,0,7298,0,60,0,1 +31,2,231043,5,10,1,6,1,0,0,0,0,50,0,0 +44,2,267790,4,5,0,4,4,1,1,0,0,40,0,0 +27,2,217379,5,10,2,3,3,0,1,0,0,40,0,0 +50,2,421561,5,10,2,1,0,0,0,0,0,40,0,0 +23,2,50953,5,10,0,9,0,0,1,0,0,40,0,0 +22,2,138504,5,10,0,0,4,1,1,0,0,30,0,0 +36,0,177064,5,10,0,1,4,0,1,0,0,40,0,0 +24,2,103064,0,13,0,9,0,0,1,3674,0,40,0,0 +59,2,184493,5,10,1,5,1,0,0,0,0,40,0,1 +39,2,104089,9,11,1,10,1,0,0,0,0,50,0,1 +23,2,149204,0,13,0,1,3,0,0,0,0,40,0,0 +37,2,405284,0,13,0,3,0,0,1,0,1340,42,0,0 +25,4,137296,6,12,0,0,3,1,1,0,0,38,0,0 +40,2,87771,1,9,1,10,2,0,1,0,1628,45,0,0 +38,0,125499,0,13,1,3,1,2,0,7688,0,60,3,1 +31,2,59083,1,9,1,4,1,0,0,0,0,35,0,0 +28,4,138332,8,16,2,3,0,0,1,0,0,40,0,0 +24,2,198914,1,9,0,5,4,1,0,0,0,25,0,0 +46,4,238162,6,12,1,11,1,0,0,0,1887,50,0,1 +29,2,123677,1,9,1,8,2,2,1,0,0,40,17,0 +38,3,325538,10,15,1,3,1,0,0,0,0,50,0,1 +53,2,251063,5,10,4,1,4,1,1,0,0,40,0,0 +33,2,51471,1,9,1,9,2,0,1,0,1902,40,0,1 +44,2,165599,1,9,1,8,1,0,0,0,0,48,0,0 +46,2,149640,0,13,2,3,0,0,0,0,0,45,7,1 +30,2,143526,0,13,0,5,3,0,0,0,0,40,0,0 +24,2,211160,5,10,1,5,1,0,0,0,0,40,0,0 +29,2,342989,1,9,0,0,3,0,1,0,0,40,0,0 +62,1,173631,5,10,1,1,1,0,0,0,0,70,0,0 +25,2,141876,1,9,3,1,0,0,0,0,0,45,0,0 +45,2,137604,5,10,0,4,0,0,0,0,0,40,0,0 +21,2,129232,5,10,0,10,3,0,0,0,0,40,0,0 +64,3,271550,5,10,1,6,1,0,0,0,0,40,0,1 +39,2,456922,0,13,2,9,0,0,0,0,0,40,0,0 +60,2,232242,1,9,1,5,1,0,0,0,0,40,0,0 +35,2,352188,1,9,0,9,0,0,0,0,0,40,0,0 +27,2,114967,0,13,0,9,0,0,0,0,0,40,0,0 +41,2,201981,1,9,2,10,3,0,0,0,0,40,0,0 +32,0,159247,3,14,1,3,1,0,0,0,0,50,0,0 +24,2,125905,1,9,1,10,1,0,0,0,0,40,0,0 +32,2,186824,0,13,1,10,1,0,0,0,0,40,0,1 +42,4,121012,5,10,1,1,1,0,0,0,0,45,0,1 +58,2,110844,3,14,6,5,0,0,1,0,0,27,0,0 +23,2,143003,3,14,1,3,1,2,0,0,1887,50,3,1 +31,3,59732,1,9,1,7,1,3,0,0,0,40,0,0 +37,2,109633,0,13,1,3,2,0,1,0,0,16,0,1 +19,2,160811,1,9,0,5,3,0,0,0,0,38,0,0 +27,1,365110,0,13,0,3,0,0,1,0,0,20,0,0 +61,1,113080,4,5,1,5,1,0,0,0,0,58,0,1 +39,2,206074,0,13,1,3,1,0,0,0,0,45,0,1 +25,2,173062,0,13,0,2,4,1,0,0,0,40,0,0 +58,2,117273,5,10,1,5,1,0,0,0,0,40,0,1 +27,1,153805,5,10,1,6,5,4,0,0,0,50,16,1 +51,2,293802,11,3,1,2,1,1,0,0,0,52,0,0 +43,4,153132,3,14,1,3,1,0,0,15024,0,40,0,1 +46,2,166809,1,9,2,0,4,0,1,0,0,40,0,0 +50,4,231725,1,9,1,2,1,0,0,0,0,40,0,0 +20,2,63210,1,9,0,2,3,0,0,0,0,15,0,0 +35,2,108293,0,13,6,3,4,0,1,0,0,32,0,1 +57,2,116878,15,2,1,2,1,0,0,0,0,40,25,0 +40,2,110622,10,15,1,0,5,2,1,0,0,40,11,0 +42,4,180318,12,6,0,7,4,0,0,0,0,35,0,0 +67,5,112318,12,6,1,10,1,0,0,0,0,40,0,0 +47,2,252079,0,13,1,8,1,0,0,7688,0,44,0,1 +30,2,27153,1,9,0,2,0,0,0,0,0,50,0,0 +26,2,73312,2,7,0,8,4,0,1,0,0,15,0,0 +51,2,145409,1,9,1,10,1,0,0,0,0,40,0,0 +38,2,167882,5,10,6,4,5,1,1,0,0,45,19,0 +24,2,236696,1,9,1,2,3,0,0,0,0,35,0,0 +48,1,28791,1,9,1,5,2,0,1,0,0,50,0,0 +70,2,187292,0,13,1,2,1,0,0,6418,0,40,0,1 +35,2,189922,1,9,1,10,1,0,0,0,0,40,0,0 +26,2,173992,5,10,1,10,1,0,0,0,0,45,0,1 +64,2,253759,1,9,0,1,0,0,0,0,0,3,0,0 +26,2,111243,1,9,0,0,4,0,1,0,0,35,0,0 +39,1,147850,1,9,1,6,1,0,0,0,0,30,0,0 +55,2,171015,5,10,0,0,3,0,1,0,0,36,0,0 +33,1,361497,1,9,1,10,1,0,0,0,0,40,0,0 +31,2,137290,0,13,1,1,1,0,0,0,0,55,0,1 +28,4,401886,1,9,0,0,5,0,0,0,0,20,0,0 +50,2,201882,3,14,1,8,1,0,0,0,0,30,0,0 +26,4,30793,0,13,1,3,2,0,1,0,0,55,0,1 +44,3,139161,6,12,2,0,0,1,1,0,1741,40,0,0 +51,2,210736,1,9,3,10,0,0,0,0,0,40,0,0 +34,2,167781,1,9,1,4,1,0,0,0,0,50,0,0 +37,2,103986,0,13,1,3,1,0,0,7688,0,39,0,1 +29,2,144592,10,15,1,3,1,0,0,0,0,50,0,1 +24,2,493034,0,13,0,3,0,1,0,0,0,40,0,0 +27,2,184078,9,11,2,0,4,0,1,0,0,40,0,0 +44,2,191814,5,10,1,10,1,0,0,0,0,45,0,0 +24,2,329852,1,9,0,8,0,0,0,0,0,40,0,0 +54,2,223660,1,9,1,1,1,0,0,0,0,55,0,1 +47,2,177087,5,10,4,0,4,0,1,0,0,50,0,1 +30,2,143766,1,9,0,4,0,0,0,0,0,30,0,0 +35,2,234271,5,10,2,0,0,0,1,0,0,40,0,0 +39,3,314822,5,10,1,0,1,1,0,0,0,40,0,0 +42,2,195584,6,12,4,0,4,1,1,0,0,40,0,0 +70,5,207938,0,13,1,1,1,0,0,0,2377,50,0,1 +41,2,126850,10,15,1,0,1,2,0,0,0,40,11,0 +36,2,279485,1,9,0,1,0,0,1,0,0,38,0,0 +44,2,267717,3,14,1,3,1,0,0,0,0,42,0,1 +20,2,163665,5,10,0,6,3,0,1,0,0,17,0,0 +29,2,200468,12,6,0,3,0,0,0,0,0,40,0,0 +27,2,91501,1,9,1,9,2,0,1,0,0,40,0,0 +30,2,182771,3,14,1,3,1,2,0,0,0,40,0,1 +59,1,56392,5,10,1,7,1,0,0,0,1579,60,0,0 +31,2,20511,0,13,0,4,0,0,1,0,0,25,0,0 +21,2,538822,1,9,0,4,5,0,0,0,0,40,4,0 +26,2,332008,5,10,0,10,4,2,0,0,0,37,18,0 +57,5,220789,1,9,1,5,1,0,0,0,0,45,0,1 +59,1,114760,5,10,1,10,1,0,0,0,0,20,0,1 +25,2,181576,5,10,0,6,0,0,0,0,0,55,0,0 +39,2,198841,3,14,1,3,1,0,0,7688,0,45,0,1 +53,2,53197,3,14,1,3,1,0,0,3103,0,40,0,1 +32,0,542265,1,9,0,0,0,0,1,0,0,40,0,0 +38,2,193026,2,7,1,10,1,0,0,0,0,40,0,0 +21,2,25505,9,11,0,0,4,1,1,0,0,35,0,0 +17,2,375657,2,7,0,2,3,0,0,0,0,30,0,0 +44,2,201599,2,7,0,8,4,1,1,0,0,40,0,0 +23,2,181820,5,10,0,2,3,0,0,0,0,20,0,0 +57,2,334224,5,10,1,10,2,0,1,9386,0,40,0,1 +30,0,54318,2,7,1,6,1,0,0,0,0,40,0,0 +51,1,141388,1,9,1,7,1,0,0,0,0,55,0,0 +54,1,57101,1,9,1,10,1,0,0,0,0,35,0,0 +44,2,168515,5,10,2,0,0,0,1,0,0,40,9,0 +60,2,163665,5,10,1,11,1,0,0,0,0,16,0,1 +28,2,207513,0,13,1,5,1,0,0,7298,0,42,0,1 +39,2,293291,1,9,1,8,1,0,0,0,0,50,0,1 +55,2,70088,3,14,1,3,1,0,0,0,0,40,0,1 +36,2,199346,3,14,1,3,2,0,1,0,0,50,0,1 +55,4,143949,3,14,1,3,2,0,1,3103,0,45,0,1 +33,2,207201,1,9,1,8,1,0,0,0,0,55,0,1 +30,2,430283,1,9,1,0,2,0,1,7298,0,40,0,1 +40,4,293809,0,13,1,3,1,0,0,0,0,20,0,0 +30,2,378009,3,14,1,1,1,0,0,0,0,50,0,1 +40,2,226608,5,10,2,9,0,0,0,0,0,30,24,1 +24,2,314182,1,9,0,6,0,0,1,0,0,50,0,0 +18,2,170544,2,7,0,5,3,0,0,0,0,20,0,0 +18,2,94196,1,9,0,2,3,0,1,0,0,25,0,0 +49,2,193047,1,9,1,10,1,0,0,0,0,45,0,1 +42,2,112607,1,9,1,10,1,0,0,0,0,50,0,0 +28,4,146949,1,9,1,2,1,0,0,0,0,40,0,0 +32,2,309513,6,12,1,10,1,0,0,0,0,40,0,0 +48,1,191389,5,10,4,5,4,0,1,0,0,50,0,0 +24,2,213902,7,4,0,13,3,0,1,0,0,32,22,0 +73,1,46514,1,9,1,5,2,0,1,0,0,25,0,0 +23,2,38707,5,10,1,6,1,0,0,0,0,60,0,1 +19,2,188568,5,10,0,13,0,0,1,0,0,40,0,0 +27,2,215014,1,9,1,5,1,0,0,0,0,35,4,0 +27,2,184477,14,8,0,4,0,0,0,0,0,40,0,0 +41,1,204235,10,15,1,3,1,0,0,0,0,50,0,1 +31,2,39054,1,9,1,10,1,0,0,0,0,20,0,0 +64,5,272531,1,9,1,10,1,0,0,0,0,40,0,1 +45,2,358701,14,8,0,4,3,0,0,0,0,10,4,0 +47,2,217750,1,9,1,4,2,0,1,0,0,35,0,0 +22,2,200374,1,9,0,8,5,0,0,0,0,35,0,0 +24,2,498349,0,13,0,6,4,1,1,0,0,40,0,0 +69,0,170458,1,9,1,4,1,0,0,0,0,20,0,0 +40,1,57233,9,11,1,1,1,0,0,0,0,40,0,1 +45,2,188432,1,9,1,10,1,0,0,0,0,40,0,0 +47,1,33300,6,12,0,7,5,0,0,10520,0,45,0,1 +31,2,225779,1,9,0,8,0,0,1,0,0,40,0,0 +48,2,46677,6,12,2,1,4,0,1,0,0,42,0,0 +41,2,227968,0,13,1,3,2,1,1,0,0,35,19,1 +34,2,85355,0,13,0,0,3,0,0,0,0,40,0,0 +48,2,207120,5,10,1,3,1,0,0,0,0,40,0,0 +28,4,229223,9,11,1,3,2,0,1,7688,0,36,0,1 +20,2,224640,6,12,0,1,3,0,1,0,0,40,0,0 +39,2,139012,0,13,1,0,1,2,0,0,0,40,11,1 +40,3,130749,5,10,2,1,0,1,1,0,0,40,0,0 +28,2,204516,12,6,0,6,0,0,0,0,0,45,0,0 +20,2,105479,5,10,0,5,0,0,1,0,0,25,0,0 +41,2,197093,0,13,2,3,0,1,0,0,0,40,0,0 +49,5,431245,5,10,1,5,1,0,0,0,0,50,0,1 +24,2,155150,1,9,1,8,1,0,0,0,0,40,0,0 +35,0,216035,1,9,1,11,1,0,0,0,0,40,0,0 +22,2,388247,5,10,0,5,3,0,0,0,0,40,0,0 +23,2,208908,0,13,0,4,0,0,1,0,0,30,0,0 +23,2,259301,1,9,2,1,4,0,1,0,0,40,0,0 +42,1,69333,9,11,1,6,1,0,0,4386,0,80,0,1 +34,2,167893,5,10,1,3,1,0,0,0,0,64,0,1 +32,3,386877,9,11,0,9,3,1,0,4650,0,40,0,0 +54,2,146551,1,9,1,0,1,0,0,0,0,54,0,1 +48,2,238360,0,13,4,0,4,2,1,0,0,40,11,0 +38,2,187748,0,13,1,3,1,0,0,0,0,40,0,1 +48,0,50748,0,13,2,0,4,0,1,0,0,40,0,0 +22,2,50136,11,3,1,4,1,0,0,0,0,40,22,0 +42,2,111483,0,13,1,9,1,0,0,0,0,50,0,1 +31,2,298871,8,16,1,3,1,2,0,0,0,40,26,0 +27,2,147340,1,9,0,4,0,0,1,0,0,50,0,1 +57,2,132704,3,14,4,3,0,0,0,10520,0,32,0,1 +46,0,327786,9,11,2,9,0,0,1,3325,0,42,0,0 +44,3,243636,9,11,1,10,1,0,0,0,0,40,0,1 +42,4,194417,5,10,1,11,1,0,0,0,0,40,0,1 +24,2,236696,0,13,0,1,0,0,0,0,0,40,0,0 +38,2,337130,15,2,3,10,0,0,0,0,0,40,4,0 +29,2,273051,0,13,1,1,1,0,0,0,0,52,29,1 +38,2,186191,1,9,1,10,1,0,0,0,0,55,0,0 +33,2,268451,5,10,2,1,4,0,1,0,0,40,0,0 +61,2,154600,1,9,1,4,2,0,1,0,0,4,0,0 +49,4,405309,9,11,1,10,1,0,0,0,0,40,0,1 +51,1,99185,6,12,1,1,1,0,0,0,0,40,0,1 +42,2,191765,1,9,2,4,5,1,1,0,0,35,0,0 +21,2,253583,1,9,0,2,3,0,0,0,0,40,0,0 +54,2,204397,5,10,1,7,1,0,0,0,0,50,0,0 +23,2,288771,5,10,0,0,0,0,1,0,0,30,0,0 +52,2,173987,12,6,1,10,1,0,0,0,0,40,0,0 +28,4,33662,3,14,1,3,2,0,1,7298,0,40,0,1 +23,2,91658,5,10,2,2,3,0,0,0,0,40,0,0 +43,2,226902,1,9,1,5,1,0,0,0,0,80,0,1 +45,2,232586,5,10,1,10,1,0,0,0,0,50,0,1 +51,1,291755,7,4,1,1,1,0,0,0,0,42,0,0 +23,2,161478,5,10,0,5,3,2,1,0,0,40,0,0 +73,1,109833,0,13,1,7,1,0,0,0,0,30,0,0 +47,1,229394,2,7,2,1,4,0,1,0,0,55,0,0 +26,2,491862,9,11,0,1,0,1,1,0,0,40,0,0 +40,2,311534,1,9,1,2,1,0,0,0,0,40,0,1 +32,1,420895,0,13,1,5,1,0,0,0,0,47,0,0 +39,2,226374,12,6,2,4,4,1,1,0,0,40,0,0 +33,3,101345,0,13,0,3,0,0,1,0,0,40,0,0 +35,2,48779,1,9,1,7,1,0,0,0,0,35,0,0 +42,2,152676,1,9,2,1,3,0,0,0,0,40,0,0 +46,2,164877,5,10,1,10,1,0,0,0,0,44,0,0 +33,2,97521,1,9,0,0,3,0,0,0,0,40,0,0 +47,2,88564,11,3,0,8,3,0,0,0,0,20,0,0 +33,2,188246,0,13,1,1,1,0,0,0,0,40,0,0 +26,2,189185,1,9,2,0,3,0,1,0,0,40,0,0 +42,0,163069,5,10,2,0,4,1,1,0,0,40,0,0 +28,2,251905,0,13,1,3,1,0,0,0,0,50,0,0 +18,2,36882,14,8,0,5,3,0,1,0,0,20,0,0 +33,1,195891,5,10,1,1,1,0,0,0,0,45,0,0 +36,2,194905,0,13,6,3,4,0,1,0,0,44,0,0 +33,2,133503,1,9,1,11,1,0,0,7688,0,48,0,1 +40,2,31621,1,9,3,0,4,0,1,0,0,40,0,0 +57,1,413373,8,16,1,5,1,0,0,0,1902,40,0,1 +40,2,196029,1,9,2,6,4,0,0,0,0,45,0,0 +36,2,107302,1,9,1,9,1,0,0,0,0,50,0,0 +45,2,151267,0,13,0,0,0,1,1,0,0,40,0,1 +52,2,256861,0,13,1,1,1,0,0,0,0,50,0,0 +24,2,82777,1,9,4,8,0,0,0,0,0,40,0,0 +30,2,147430,1,9,3,0,0,0,1,0,0,40,0,0 +46,1,165754,8,16,0,3,0,0,1,0,0,45,0,0 +36,2,448337,1,9,4,5,4,1,1,0,0,40,0,0 +48,2,185079,1,9,0,1,0,0,1,0,0,50,0,0 +36,2,418702,9,11,2,0,4,0,1,0,0,40,0,0 +48,2,41504,1,9,1,6,1,0,0,0,0,40,0,1 +21,2,387335,5,10,0,9,3,0,1,0,1719,9,0,0 +18,2,261720,1,9,0,0,0,0,1,0,0,40,0,0 +38,2,133963,0,13,2,3,0,0,1,0,0,50,0,1 +36,0,179488,0,13,1,11,1,0,0,7298,0,55,0,1 +38,2,60135,1,9,0,6,0,0,1,0,0,40,0,0 +55,1,308746,10,15,6,3,0,0,0,0,0,55,0,1 +27,2,278720,1,9,1,10,1,0,0,0,0,45,0,1 +22,0,477505,6,12,0,0,0,0,0,0,0,40,0,0 +29,2,164711,5,10,0,2,5,0,0,0,0,40,0,0 +40,2,208277,5,10,0,1,4,0,1,0,0,40,0,0 +21,2,39943,5,10,0,5,3,0,1,0,0,20,0,0 +49,2,104542,1,9,2,0,0,0,1,0,0,40,0,0 +29,2,286634,0,13,1,3,2,0,1,0,0,50,0,1 +28,2,142712,0,13,0,1,0,0,0,0,0,50,0,1 +26,2,336404,1,9,1,11,1,0,0,0,0,40,0,0 +33,2,117983,1,9,0,0,0,0,1,0,0,41,0,0 +59,2,59469,3,14,1,9,1,0,0,0,0,40,10,0 +37,2,171968,9,11,1,0,1,0,0,0,0,40,0,0 +27,2,278617,5,10,0,10,0,0,0,0,0,40,0,0 +39,2,72338,3,14,1,3,1,2,0,0,0,40,11,1 +49,4,343231,3,14,0,3,0,0,1,0,0,80,0,0 +30,2,63910,1,9,1,5,3,2,1,0,0,40,0,0 +28,2,190350,4,5,1,11,2,1,1,0,0,40,0,0 +25,0,176162,0,13,0,11,3,0,0,0,0,40,0,0 +18,2,37720,12,6,0,8,3,0,0,0,0,40,0,0 +25,2,421467,6,12,0,2,3,0,0,0,0,26,0,0 +36,2,138441,5,10,0,8,3,0,0,0,0,40,0,0 +52,2,146767,1,9,1,8,1,0,0,0,0,40,0,1 +25,2,160445,1,9,2,10,0,0,0,0,0,40,0,0 +26,2,211695,0,13,0,3,3,0,0,0,0,40,0,0 +50,2,102346,0,13,1,1,2,0,1,0,2415,20,0,1 +48,2,128796,6,12,1,1,1,0,0,0,0,40,0,1 +39,2,111129,1,9,1,2,1,0,0,0,0,40,0,0 +30,4,44566,0,13,1,3,1,0,0,0,0,40,0,0 +26,2,118497,1,9,1,10,1,0,0,0,0,60,0,0 +36,2,334291,5,10,1,10,1,0,0,0,1887,40,0,1 +49,2,237920,8,16,1,5,1,0,0,0,0,60,0,0 +34,4,136331,0,13,1,3,1,0,0,0,0,60,0,0 +28,2,187397,1,9,0,4,5,4,0,0,0,48,4,0 +28,1,119793,1,9,0,4,0,0,0,0,0,40,0,0 +42,2,24982,5,10,1,10,1,0,0,7688,0,40,0,1 +26,1,231714,1,9,1,10,1,0,0,0,0,40,0,0 +54,2,229272,1,9,1,10,1,1,0,0,0,40,0,1 +61,1,268831,1,9,1,5,1,0,0,0,0,53,0,0 +45,1,149640,10,15,0,3,0,0,0,0,0,30,0,1 +29,2,261725,0,13,0,0,0,0,1,0,0,35,0,0 +74,2,161387,1,9,2,2,0,0,1,0,0,16,0,0 +61,4,260167,1,9,6,3,0,0,1,0,0,40,0,0 +27,2,200928,5,10,0,5,3,0,0,0,0,22,0,0 +53,3,155594,0,13,1,3,1,0,0,0,0,40,0,1 +57,1,79539,1,9,1,7,1,2,0,0,0,40,0,0 +41,2,469454,5,10,1,10,1,0,0,0,0,40,0,0 +45,2,331482,0,13,1,3,1,0,0,0,0,50,0,0 +43,2,225193,1,9,1,5,1,0,0,0,0,40,0,0 +29,2,82393,1,9,1,4,3,2,0,0,0,25,11,0 +41,2,58484,0,13,1,1,2,0,1,0,0,40,0,0 +50,2,344621,1,9,2,8,0,0,1,0,0,40,0,0 +52,2,174752,1,9,1,5,1,0,0,0,0,60,0,1 +18,5,174202,1,9,0,6,3,0,0,0,0,60,0,0 +57,2,316000,1,9,1,10,1,0,0,0,0,40,0,0 +63,0,216871,5,10,1,0,1,0,0,0,1740,40,0,0 +29,2,246933,1,9,0,0,5,0,0,0,0,40,4,0 +32,1,112115,0,13,1,3,1,0,0,7688,0,40,0,1 +34,2,264651,1,9,1,8,1,0,0,0,0,40,0,1 +43,2,99185,1,9,2,0,4,0,1,0,0,58,0,0 +39,2,176186,5,10,1,8,1,0,0,0,0,40,0,1 +28,2,100219,1,9,0,8,3,0,0,0,0,45,0,0 +32,2,46691,0,13,0,0,0,0,1,0,0,40,0,0 +28,0,297735,10,15,0,3,0,0,0,0,0,90,0,0 +40,2,132222,5,10,1,8,1,0,0,4386,0,50,0,1 +25,2,189656,0,13,0,9,0,0,0,0,0,60,0,1 +54,4,224934,3,14,1,3,1,0,0,0,0,50,0,1 +48,5,149218,0,13,1,7,1,0,0,0,0,70,0,1 +51,2,158508,5,10,2,1,0,0,1,0,0,36,0,0 +67,0,261203,7,4,1,6,1,0,0,0,0,35,0,0 +17,2,309504,12,6,0,5,4,0,1,0,0,24,0,0 +24,0,324637,5,10,0,4,0,0,0,0,0,40,0,0 +25,2,267426,1,9,1,2,1,0,0,0,0,40,0,0 +54,2,46401,5,10,2,4,0,0,1,0,0,47,0,0 +32,2,114288,1,9,2,3,3,0,1,0,0,40,0,0 +41,3,193882,1,9,0,0,3,0,0,0,0,40,0,0 +53,2,311269,1,9,2,4,0,0,1,0,0,40,0,0 +45,2,156117,9,11,2,3,0,0,1,0,0,32,0,0 +51,2,222615,1,9,1,8,1,0,0,0,0,40,0,1 +41,0,106900,3,14,1,3,1,0,0,7298,0,60,0,1 +40,3,78036,9,11,1,3,2,0,1,0,0,65,0,1 +27,2,380560,1,9,0,7,5,0,0,0,0,40,4,0 +41,2,167106,0,13,1,0,1,2,0,3103,0,35,11,1 +51,2,289436,0,13,1,1,1,0,0,0,0,60,0,1 +36,2,749636,5,10,2,0,4,0,1,0,0,40,0,0 +34,5,154120,1,9,0,7,3,0,0,0,0,55,0,0 +43,2,105119,1,9,1,0,1,0,0,0,0,40,0,0 +61,3,181081,1,9,2,0,3,1,1,0,0,20,0,0 +31,2,182237,12,6,4,6,4,0,0,0,0,40,0,0 +34,2,102130,1,9,1,5,1,0,0,0,0,65,0,1 +43,2,266324,1,9,1,10,1,0,0,0,1902,99,0,1 +52,2,170562,14,8,1,10,1,0,0,0,0,40,0,0 +18,2,240543,2,7,0,4,3,0,1,0,0,20,0,0 +37,3,187046,5,10,1,3,1,0,0,0,0,40,0,1 +60,2,389254,1,9,1,0,1,0,0,0,0,40,0,0 +47,2,179955,5,10,6,6,4,0,1,0,0,25,31,0 +21,2,197997,5,10,0,0,3,0,0,0,0,30,0,0 +34,5,343789,0,13,1,1,1,0,0,7688,0,55,0,1 +28,2,191088,1,9,2,4,0,0,1,0,1741,52,0,0 +40,4,141649,9,11,1,11,1,0,0,0,0,40,0,1 +26,2,433906,6,12,0,4,0,0,0,0,0,40,0,0 +48,2,207982,5,10,0,4,4,1,1,0,0,40,0,0 +46,2,175925,5,10,1,7,1,0,0,0,0,40,0,0 +58,2,85767,5,10,1,5,1,0,0,0,0,48,0,0 +32,5,281030,1,9,0,10,0,0,0,0,0,40,0,0 +38,2,396595,5,10,1,10,1,2,0,0,0,40,0,1 +43,1,163108,5,10,1,7,1,0,0,0,0,99,0,0 +17,2,141590,2,7,0,13,3,0,1,0,0,12,0,0 +36,2,67728,1,9,1,10,1,0,0,5013,0,40,25,0 +30,2,345522,1,9,1,6,1,0,0,3103,0,70,0,1 +45,2,330087,1,9,1,10,1,0,0,0,0,40,0,0 +51,1,204322,1,9,1,6,1,0,0,0,0,50,0,0 +29,2,50295,5,10,1,1,1,0,0,0,0,48,0,0 +35,1,147258,9,11,0,7,3,0,0,0,0,65,0,0 +19,2,194260,5,10,0,5,3,0,1,0,0,20,0,0 +56,2,437727,4,5,1,5,1,0,0,0,0,40,0,0 +24,2,280960,1,9,1,8,2,0,1,0,0,24,0,0 +33,2,33117,6,12,1,11,1,0,0,0,0,40,0,0 +43,2,169628,0,13,0,5,4,1,1,0,0,35,0,1 +22,0,124942,5,10,0,4,3,0,0,0,0,45,0,0 +44,2,143368,5,10,0,4,0,1,0,0,0,55,0,0 +37,2,255621,1,9,4,10,0,0,0,0,0,50,0,0 +34,5,154227,5,10,0,5,0,0,0,0,0,75,0,0 +43,2,171438,9,11,4,5,4,0,1,0,0,45,0,0 +39,2,191524,1,9,2,0,4,0,1,0,0,40,0,0 +30,2,377017,5,10,1,2,1,0,0,0,0,32,0,0 +58,2,192806,7,4,0,2,0,0,1,0,0,33,0,0 +45,4,234195,1,9,2,0,4,0,1,0,0,35,0,0 +30,2,147596,5,10,2,0,4,1,1,0,0,40,0,0 +42,2,147251,5,10,1,3,2,0,1,0,0,36,0,0 +50,2,176157,3,14,1,1,1,0,0,0,0,50,0,1 +25,4,176162,9,11,0,11,3,0,0,0,0,30,0,0 +34,2,384150,0,13,1,1,1,0,0,0,0,40,0,1 +50,2,107665,5,10,1,5,1,0,0,0,0,40,0,1 +60,0,165827,8,16,1,3,1,0,0,0,0,55,0,0 +41,2,287306,6,12,1,3,1,0,0,15024,0,60,0,1 +71,1,78786,7,4,1,7,1,0,0,0,0,10,0,0 +40,1,33310,10,15,2,4,0,0,1,0,2339,35,0,0 +22,2,349368,0,13,0,1,3,0,1,0,0,30,0,0 +52,2,117674,0,13,0,3,0,0,0,0,0,38,0,0 +30,2,310889,5,10,0,2,0,0,0,0,0,55,0,0 +40,2,379919,5,10,1,8,1,0,0,0,0,40,0,0 +31,3,34862,6,12,1,5,1,2,0,0,0,40,0,0 +44,2,201723,0,13,1,1,1,0,0,15024,0,45,0,1 +38,4,161463,10,15,1,3,1,1,0,0,0,40,0,1 +46,2,186410,10,15,0,1,0,0,0,0,0,50,0,1 +57,3,62020,10,15,2,1,0,1,0,0,0,55,0,1 +39,2,42044,2,7,1,6,1,0,0,0,0,40,0,0 +42,2,170230,0,13,2,1,0,0,1,0,0,55,0,1 +43,2,341358,9,11,1,5,1,0,0,0,0,40,0,1 +22,2,199426,5,10,0,5,0,0,1,0,0,17,0,0 +44,2,89172,0,13,1,10,1,0,0,0,0,50,0,1 +37,2,140673,5,10,1,5,2,0,1,0,0,40,0,1 +26,0,326033,0,13,0,0,0,0,1,0,0,80,0,0 +35,2,129305,1,9,0,4,0,0,0,0,0,30,0,0 +28,2,171067,1,9,0,2,3,0,1,0,0,40,0,0 +34,2,143582,5,10,0,0,0,2,1,0,0,35,28,0 +18,2,257980,1,9,0,8,0,0,0,0,0,40,0,0 +25,2,182866,1,9,0,8,3,0,0,0,0,40,0,0 +44,5,69333,0,13,1,10,1,0,0,0,0,50,0,1 +61,2,668362,15,2,6,2,0,0,1,0,0,40,0,0 +39,2,132879,5,10,1,1,1,0,0,0,0,50,0,1 +61,2,181219,0,13,1,3,1,0,0,0,1848,40,0,1 +22,2,120518,1,9,6,0,3,0,1,0,0,40,0,0 +19,2,183532,5,10,0,2,3,0,0,0,0,25,0,0 +45,2,49298,0,13,0,9,3,0,0,0,0,40,0,0 +20,2,157332,5,10,0,0,3,0,1,0,0,25,0,0 +37,2,213726,1,9,2,8,0,2,1,0,0,40,11,0 +26,2,31143,5,10,0,10,0,0,0,0,0,40,0,0 +26,2,184872,0,13,1,1,2,0,1,0,0,55,0,1 +58,2,202652,1,9,4,4,4,0,1,0,0,40,21,0 +64,2,60940,1,9,6,5,0,0,1,8614,0,50,23,1 +19,2,292590,1,9,1,5,5,0,1,0,0,25,0,0 +36,2,141420,0,13,2,2,0,0,0,0,0,30,0,0 +47,2,159389,6,12,0,0,0,0,1,0,0,40,0,0 +62,2,254534,5,10,1,5,1,0,0,0,0,40,0,0 +36,0,89508,10,15,0,3,0,0,0,0,0,40,0,0 +38,1,238980,5,10,0,5,0,0,0,0,0,60,0,0 +54,2,178946,1,9,1,10,1,0,0,0,0,48,0,1 +31,2,204752,0,13,0,1,0,0,0,0,0,50,0,0 +26,2,290213,5,10,4,7,3,0,0,0,0,40,0,0 +50,2,102615,1,9,1,1,1,0,0,0,1902,40,0,1 +41,2,291965,5,10,0,9,4,2,1,0,0,40,11,0 +52,4,175339,0,13,1,11,1,0,0,0,0,40,0,1 +28,2,90547,1,9,1,4,2,1,1,0,0,23,0,0 +46,1,101722,5,10,1,1,1,0,0,3137,0,40,0,0 +30,5,204470,5,10,1,1,1,0,0,0,0,36,0,1 +58,4,311409,3,14,1,3,1,1,0,7688,0,30,0,1 +36,2,218015,5,10,1,8,1,0,0,0,0,48,0,0 +31,0,77634,13,1,0,4,0,0,0,0,0,24,0,0 +52,1,42984,10,15,1,3,1,0,0,0,0,70,0,1 +29,2,413297,5,10,1,1,1,0,0,3411,0,70,4,0 +48,1,218835,3,14,1,5,1,0,0,0,0,50,7,0 +30,2,341051,3,14,1,1,1,0,0,15024,0,60,0,1 +58,2,252419,2,7,1,6,1,0,0,0,0,50,0,0 +20,3,347935,5,10,0,11,3,1,0,0,0,40,0,0 +19,2,237848,5,10,0,4,3,0,0,0,0,3,0,0 +63,2,174826,1,9,2,4,0,0,1,0,0,40,0,0 +51,1,170086,0,13,1,9,1,0,0,0,0,45,0,1 +53,2,470368,6,12,2,0,4,0,1,0,0,48,0,0 +54,3,75235,1,9,1,1,1,0,0,5178,0,40,0,1 +26,2,746432,1,9,0,2,3,1,0,0,0,48,0,0 +47,1,258498,5,10,1,4,2,0,1,0,0,52,0,0 +44,2,176063,0,13,1,1,1,0,0,0,0,45,0,0 +80,1,26865,7,4,0,7,4,0,0,0,0,20,0,0 +55,2,104724,8,16,1,3,1,0,0,0,0,40,0,1 +43,2,346321,3,14,1,3,1,0,0,0,0,45,0,1 +49,2,402462,0,13,3,6,4,0,0,0,0,30,13,0 +27,2,153078,10,15,0,3,3,2,0,0,0,40,0,0 +42,2,176063,9,11,1,1,1,0,0,15024,0,55,0,1 +39,2,451059,4,5,1,2,1,0,0,0,0,40,0,0 +32,2,106437,1,9,4,0,4,0,1,0,0,40,0,0 +58,4,294313,5,10,1,0,2,1,1,0,0,55,0,0 +63,2,67903,4,5,4,7,0,1,0,0,0,40,0,0 +49,2,133669,5,10,1,0,1,0,0,0,0,40,0,1 +36,5,251730,5,10,1,11,1,0,0,0,0,60,0,1 +46,2,72896,5,10,1,1,1,0,0,0,0,50,0,0 +47,2,155664,3,14,1,1,1,0,0,99999,0,55,0,1 +39,2,206520,1,9,0,0,0,0,0,0,0,45,0,0 +33,2,72338,10,15,1,1,1,2,0,0,0,65,28,1 +43,4,34640,1,9,1,1,1,4,0,0,1887,40,0,1 +30,2,236543,5,10,1,3,1,0,0,0,0,68,0,0 +39,4,43702,9,11,1,0,2,0,1,0,0,37,0,0 +44,2,335248,5,10,2,0,0,0,1,0,0,40,0,0 +27,2,198197,0,13,0,9,0,0,0,0,0,45,0,0 +31,2,160594,6,12,0,3,3,0,0,0,0,3,0,0 +34,4,231826,1,9,1,3,1,0,0,0,0,40,22,0 +28,2,188171,6,12,0,6,3,0,0,0,0,60,0,0 +55,2,125000,1,9,1,8,1,0,0,0,0,40,0,1 +36,2,166509,1,9,2,10,0,0,1,0,0,40,0,0 +42,2,402367,5,10,1,6,1,1,0,7688,0,45,0,1 +67,4,204123,0,13,1,3,1,0,0,0,0,10,0,0 +53,5,220786,5,10,6,5,0,0,1,0,0,60,0,0 +43,2,254146,5,10,1,10,1,0,0,0,1902,40,0,1 +29,4,152461,0,13,0,9,0,0,1,0,0,42,0,0 +19,2,223669,5,10,0,4,3,0,0,0,0,30,0,0 +51,2,120270,9,11,1,5,1,0,0,0,0,40,0,1 +21,1,304602,9,11,0,7,3,0,0,0,0,98,0,0 +54,2,24108,5,10,4,1,0,0,1,0,0,40,0,0 +42,1,32546,10,15,2,3,4,0,0,7430,0,40,0,1 +41,2,93885,5,10,2,5,4,0,1,0,0,48,0,0 +28,2,210765,1,9,0,10,3,0,0,0,0,40,0,0 +31,2,191276,9,11,2,2,4,0,1,0,0,40,0,0 +82,1,71438,1,9,1,7,1,0,0,0,0,20,0,0 +23,2,330571,0,13,0,3,0,0,1,0,0,16,0,0 +40,4,138634,1,9,1,1,1,0,0,0,0,40,0,0 +35,2,112264,1,9,1,5,1,0,0,0,0,50,0,0 +24,2,205865,1,9,0,5,4,0,0,0,0,45,0,0 +21,2,224640,5,10,0,5,3,0,1,0,0,40,0,0 +27,2,180758,5,10,1,2,1,0,0,0,0,30,0,0 +40,1,107762,0,13,1,1,1,0,0,0,0,45,0,0 +17,2,214787,14,8,0,0,3,0,1,0,0,25,0,0 +27,2,211032,15,2,0,10,0,0,0,0,0,40,4,0 +34,2,208353,1,9,0,8,3,0,0,0,0,40,0,0 +18,2,157273,12,6,0,4,5,1,0,0,0,15,0,0 +39,2,75891,0,13,2,9,4,0,1,0,0,40,0,0 +34,5,177675,5,10,1,1,1,0,0,0,0,65,0,1 +44,2,182370,1,9,1,10,1,0,0,0,0,40,0,0 +39,2,174242,0,13,1,1,1,0,0,15024,0,60,0,1 +28,2,95566,15,2,3,4,3,4,1,0,0,35,21,0 +30,2,30290,1,9,0,8,0,0,1,0,0,40,0,0 +60,2,240951,1,9,2,0,5,0,1,0,0,40,0,0 +58,2,183810,1,9,1,4,1,0,0,0,0,24,0,0 +49,2,94342,0,13,1,10,1,0,0,0,0,60,0,0 +61,5,148577,1,9,1,5,1,0,0,0,0,55,0,1 +27,2,103634,1,9,2,0,0,0,0,0,0,38,0,0 +59,1,83542,6,12,2,9,0,0,0,0,0,40,0,0 +52,3,76131,5,10,1,1,2,2,1,0,0,40,0,1 +42,3,262402,0,13,0,1,0,0,1,0,0,40,0,0 +27,2,198286,5,10,0,4,0,0,1,0,0,34,0,0 +41,5,145441,3,14,1,1,1,0,0,0,0,50,0,1 +50,4,117496,0,13,1,3,2,0,1,0,0,24,0,0 +36,2,128876,12,6,1,10,1,0,0,0,0,40,0,0 +21,2,199698,1,9,0,7,3,0,0,0,0,45,0,0 +38,2,65390,6,12,1,10,1,0,0,0,0,45,0,0 +46,2,128645,5,10,2,3,0,0,1,0,0,40,0,0 +59,2,53481,5,10,1,5,1,0,0,0,0,50,0,0 +55,2,92215,1,9,0,0,0,0,1,0,0,45,0,0 +49,4,78859,3,14,6,3,4,0,1,0,323,20,0,0 +59,5,187502,5,10,1,10,1,0,0,0,0,50,0,1 +38,2,242080,5,10,1,5,1,0,0,0,0,55,0,1 +22,2,41837,5,10,0,6,3,0,0,0,0,25,0,0 +28,2,291374,14,8,0,5,4,1,1,0,0,40,0,0 +47,2,148995,0,13,1,1,1,0,0,0,2415,60,0,1 +59,2,159008,5,10,1,11,1,0,0,0,0,56,0,0 +37,2,271013,1,9,2,2,0,0,0,0,0,40,0,0 +33,2,199046,0,13,0,5,0,0,1,0,0,40,0,0 +34,2,164280,12,6,1,2,1,0,0,0,0,40,20,0 +35,4,116960,3,14,1,3,1,0,0,0,1887,40,0,1 +55,2,100054,12,6,0,4,0,0,0,0,0,40,0,0 +18,2,183824,14,8,0,4,3,0,0,0,0,30,0,0 +48,2,313925,6,12,1,3,2,0,1,0,0,30,0,1 +48,2,379883,3,14,1,3,1,0,0,0,0,40,1,1 +27,2,189777,1,9,1,10,1,0,0,0,0,40,0,0 +43,2,198330,3,14,6,3,4,1,1,0,0,37,0,0 +32,2,127451,5,10,1,3,1,0,0,0,0,38,0,1 +50,2,301024,0,13,4,5,0,0,0,0,0,40,0,1 +38,1,175732,1,9,0,10,0,3,0,0,0,15,0,0 +18,2,218889,4,5,0,4,3,1,0,0,0,35,0,0 +46,2,117605,4,5,2,5,0,0,0,0,0,35,0,0 +26,2,154571,5,10,0,8,0,2,0,0,0,45,0,1 +44,2,228057,7,4,1,8,2,0,1,0,0,40,21,0 +32,2,173998,5,10,0,0,0,0,1,0,0,60,0,0 +25,2,90752,0,13,1,0,2,0,1,0,0,40,0,0 +55,2,51008,1,9,2,0,4,0,1,0,0,40,0,0 +55,3,113398,5,10,0,0,4,0,0,0,0,40,0,0 +25,2,74977,5,10,1,0,2,0,1,0,0,40,0,0 +40,2,101593,0,13,1,3,1,0,0,0,0,50,0,0 +29,2,228346,9,11,0,10,0,0,0,0,0,50,0,0 +60,2,180418,2,7,1,10,1,0,0,0,0,40,0,0 +45,2,44489,1,9,1,6,1,0,0,0,0,45,0,0 +43,1,277488,1,9,1,7,1,0,0,0,0,30,0,0 +24,2,103064,1,9,0,5,3,0,1,0,0,55,0,0 +34,2,226872,0,13,2,5,0,0,1,0,0,40,0,0 +47,1,330416,5,10,0,7,0,0,0,0,0,60,0,0 +24,2,186495,1,9,2,0,0,0,1,0,0,32,0,0 +47,0,205712,5,10,1,4,1,0,0,0,0,38,0,0 +18,2,217743,2,7,0,5,3,0,1,0,0,40,0,0 +50,5,52565,5,10,1,5,1,0,0,0,1485,40,0,0 +22,2,239954,5,10,0,0,5,0,0,0,0,40,0,0 +49,1,349986,0,13,1,3,1,0,0,0,0,60,0,1 +41,2,117585,1,9,1,1,1,0,0,0,1485,40,0,1 +68,1,122094,1,9,1,10,1,0,0,0,0,15,0,0 +62,1,26857,7,4,6,7,5,0,1,0,0,35,0,0 +25,4,192321,0,13,0,3,3,0,1,0,0,40,0,0 +24,2,88095,5,10,0,8,0,0,1,0,0,24,4,0 +32,2,124187,4,5,1,7,1,1,0,0,0,40,0,0 +49,2,123681,3,14,1,3,1,0,0,0,0,43,0,1 +68,2,145638,5,10,2,5,0,0,1,0,0,40,0,0 +25,2,130513,6,12,0,5,3,0,1,0,0,40,30,0 +47,3,197038,0,13,1,3,1,0,0,0,0,50,0,0 +35,2,189092,0,13,1,1,1,0,0,0,0,40,0,1 +37,1,198841,2,7,1,6,1,0,0,0,0,40,0,0 +57,2,317969,1,9,1,1,1,0,0,0,0,50,0,0 +37,2,103121,0,13,1,1,2,0,1,0,1848,40,0,1 +34,2,111589,12,6,0,4,4,1,1,0,0,40,2,0 +46,4,267952,9,11,2,1,0,0,1,0,0,36,0,0 +21,2,63899,2,7,0,0,5,0,1,0,0,40,0,0 +26,2,473625,1,9,1,4,2,0,1,0,0,30,0,0 +45,2,187901,1,9,2,7,0,0,0,0,2258,44,0,1 +17,2,24090,1,9,0,1,3,0,1,0,0,35,0,0 +36,5,102729,6,12,1,3,1,0,0,0,0,70,0,0 +33,2,91666,14,8,2,1,0,0,0,0,0,40,0,0 +27,2,215873,1,9,0,8,3,1,0,0,0,40,0,0 +32,2,152109,1,9,1,10,1,0,0,0,0,48,0,0 +24,2,175586,1,9,0,8,4,1,1,0,0,40,0,0 +37,2,232614,1,9,2,4,4,1,1,0,0,30,0,0 +53,0,229465,8,16,1,3,1,0,0,0,0,50,0,1 +44,2,147110,5,10,2,0,3,0,0,14344,0,40,0,1 +43,4,161240,1,9,1,11,1,0,0,0,0,45,0,1 +29,2,358124,1,9,0,4,5,1,1,0,0,52,0,0 +47,2,222529,0,13,1,7,1,0,0,0,0,65,0,0 +37,1,338320,3,14,0,1,0,0,0,0,0,60,0,0 +43,5,62026,10,15,1,1,1,0,0,99999,0,40,0,1 +23,2,263886,5,10,0,5,0,1,1,0,0,20,0,0 +50,2,310774,0,13,1,5,1,0,0,0,0,35,0,0 +25,2,98155,5,10,0,3,3,0,0,0,0,40,0,0 +40,2,259307,5,10,0,1,0,0,0,0,0,50,0,0 +39,2,358753,9,11,1,10,1,0,0,7688,0,40,0,1 +41,2,29762,1,9,1,10,1,0,0,0,0,52,0,1 +32,2,202729,1,9,1,6,3,0,0,0,0,40,0,0 +19,2,28790,5,10,0,4,0,0,1,0,0,40,0,0 +26,2,53209,1,9,0,4,3,0,0,0,0,40,0,0 +30,4,169020,0,13,1,3,1,0,0,0,0,40,0,0 +34,2,127195,5,10,1,1,1,0,0,0,0,40,0,0 +41,2,211731,5,10,0,0,0,0,1,0,0,40,4,0 +42,1,126614,0,13,2,1,0,4,0,0,0,30,10,0 +45,2,259463,9,11,1,3,1,0,0,0,0,40,0,1 +22,2,228411,5,10,0,1,0,0,0,0,0,35,0,0 +25,2,117827,5,10,1,0,1,0,0,0,0,40,0,0 +22,3,57216,5,10,0,0,3,1,0,0,0,20,0,0 +46,0,250821,10,15,1,1,1,0,0,15024,0,40,0,1 +48,5,88564,5,10,2,7,0,0,0,0,0,45,0,0 +45,2,172822,1,9,1,8,1,0,0,0,0,52,0,1 +19,2,251579,5,10,0,4,3,0,0,0,0,14,0,0 +31,2,118399,2,7,1,8,1,0,0,0,0,40,0,0 +30,5,178383,5,10,1,10,1,1,0,0,0,70,0,0 +40,1,170866,6,12,1,7,1,0,0,0,0,50,0,1 +22,2,203894,5,10,0,5,3,0,1,0,0,15,0,0 +25,2,237065,5,10,2,4,3,1,0,0,0,38,0,0 +51,4,108435,3,14,1,3,1,0,0,0,0,80,0,1 +32,2,93213,6,12,1,8,1,0,0,0,0,62,0,0 +51,5,231230,0,13,1,1,1,0,0,0,0,25,0,0 +42,2,386175,5,10,2,5,0,0,0,0,0,50,0,1 +39,2,128392,1,9,1,8,1,0,0,0,1887,40,0,1 +24,2,223515,1,9,1,10,1,0,0,0,0,45,0,0 +52,2,208630,1,9,2,0,4,0,1,0,1741,38,0,0 +43,2,174295,3,14,1,3,1,0,0,0,0,55,0,0 +31,2,60229,1,9,1,8,1,0,0,0,0,40,0,0 +28,2,66095,1,9,1,5,1,0,0,0,0,40,0,0 +31,3,130057,3,14,1,1,1,0,0,7688,0,60,0,1 +61,2,179743,1,9,1,10,1,0,0,0,2051,20,0,0 +26,2,192022,0,13,0,3,3,0,1,0,0,40,0,0 +46,2,45288,0,13,0,4,0,0,0,0,0,40,0,0 +50,2,99476,3,14,2,3,0,0,1,0,0,35,0,0 +18,2,41973,2,7,0,0,3,0,1,0,0,5,0,0 +23,2,162228,0,13,0,5,0,0,0,0,0,48,0,0 +21,2,211968,5,10,0,5,3,0,1,0,1762,28,0,0 +46,2,211226,6,12,1,6,1,4,0,0,0,36,0,0 +38,2,33397,1,9,2,5,4,0,1,0,0,40,0,0 +53,2,120839,14,8,2,7,3,0,0,0,0,40,0,0 +53,2,36327,1,9,1,5,1,0,0,0,0,40,0,1 +50,2,139703,5,10,1,10,1,0,0,0,0,40,0,1 +26,2,107827,1,9,0,4,4,0,0,0,0,25,0,0 +46,4,140219,3,14,2,3,0,0,1,8614,0,55,0,1 +44,4,203761,0,13,1,3,1,0,0,0,0,40,0,1 +36,4,114719,3,14,1,3,1,0,0,0,0,50,0,1 +20,2,344394,5,10,0,4,0,0,1,0,0,30,0,0 +35,2,195516,7,4,1,9,1,0,0,0,0,40,4,0 +40,0,31627,0,13,1,1,2,0,1,0,0,20,0,0 +70,2,174032,1,9,1,5,1,0,0,0,0,40,0,0 +57,2,226875,7,4,1,5,1,0,0,0,0,50,0,0 +40,2,566537,13,1,1,4,1,0,0,0,1672,40,4,0 +18,2,36162,2,7,0,10,3,0,0,0,0,5,0,0 +45,1,31478,0,13,1,5,1,0,0,2829,0,60,0,0 +52,2,294991,0,13,1,3,1,0,0,0,0,40,0,1 +42,5,161532,0,13,1,10,1,1,0,0,0,60,0,0 +28,4,332249,1,9,4,6,3,0,0,0,0,45,0,0 +32,2,268147,9,11,0,9,4,0,1,0,0,60,0,0 +56,3,317847,0,13,2,0,0,0,0,0,0,40,0,0 +44,2,52028,15,2,1,4,2,2,1,0,0,40,36,0 +20,2,184045,5,10,0,5,4,1,1,0,0,30,0,0 +32,2,206609,0,13,1,1,1,0,0,0,0,60,0,1 +59,2,152968,5,10,4,0,5,0,0,3325,0,40,0,0 +21,2,213015,1,9,0,2,5,1,0,2176,0,40,0,0 +32,2,313835,3,14,1,3,1,0,0,0,0,40,0,1 +49,2,66385,1,9,1,5,1,0,0,5013,0,40,0,0 +22,2,205940,0,13,0,0,3,0,1,1055,0,30,0,0 +51,5,260938,5,10,1,1,1,0,0,0,0,50,0,1 +33,2,60567,1,9,1,10,1,0,0,3411,0,40,0,0 +23,2,335067,0,13,0,5,0,0,0,0,0,50,0,0 +34,2,331126,1,9,0,4,4,1,0,0,0,30,0,0 +53,2,156612,14,8,2,6,0,0,1,0,0,40,0,0 +44,2,188436,0,13,1,0,1,0,0,0,0,45,0,0 +60,2,227468,5,10,6,11,0,1,1,0,0,40,0,0 +55,2,183580,5,10,1,10,1,0,0,0,0,38,0,0 +57,1,50990,1,9,1,7,1,0,0,0,0,30,0,0 +59,2,384246,8,16,1,3,1,0,0,0,0,50,0,0 +30,2,176410,9,11,1,3,3,0,1,7298,0,16,0,1 +49,2,93639,0,13,1,1,2,0,1,0,0,43,0,0 +45,2,30289,14,8,1,10,1,0,0,0,0,40,0,0 +29,5,124950,0,13,0,5,3,0,1,0,0,40,0,0 +37,1,126675,1,9,1,7,1,0,0,0,0,60,0,1 +21,2,145964,14,8,0,7,0,0,0,0,0,40,0,0 +36,0,345712,1,9,1,1,1,0,0,0,0,40,0,0 +37,2,180342,0,13,0,5,0,0,0,0,0,45,0,0 +19,2,167087,1,9,0,0,0,0,1,0,0,40,0,0 +30,2,318749,9,11,1,9,2,0,1,0,0,35,9,0 +59,3,293971,5,10,1,9,1,0,0,0,0,40,0,1 +32,2,229566,9,11,1,4,1,0,0,0,0,60,0,1 +25,2,242464,0,13,0,0,0,0,0,0,0,40,0,0 +40,2,111067,0,13,1,2,1,0,0,0,0,80,0,1 +49,4,106554,0,13,2,3,4,0,1,0,0,40,0,1 +49,2,23776,5,10,1,0,1,0,0,0,0,40,0,0 +48,2,105808,4,5,6,6,4,0,0,0,0,40,0,1 +42,2,169995,5,10,1,3,1,0,0,0,0,45,0,0 +53,2,141388,2,7,1,10,1,0,0,0,0,40,0,0 +29,1,241431,1,9,0,10,0,0,0,0,0,45,0,0 +54,1,158948,1,9,1,6,1,0,0,0,0,15,0,0 +34,2,272411,0,13,0,0,0,0,1,0,0,40,0,0 +39,2,30529,0,13,1,1,1,0,0,0,1887,40,0,1 +30,2,190228,1,9,1,2,1,0,0,0,0,40,0,0 +27,2,126060,0,13,0,1,0,0,1,0,0,40,0,0 +25,2,391192,9,11,0,10,3,0,0,0,0,40,0,0 +26,2,214069,1,9,4,7,0,0,0,0,0,40,0,0 +45,2,170871,1,9,1,10,1,0,0,7298,0,60,0,1 +55,2,118993,5,10,4,1,4,0,1,0,0,10,0,0 +26,2,245880,1,9,0,4,5,0,0,0,0,40,0,0 +45,2,174794,0,13,4,3,4,0,1,0,0,56,9,0 +61,4,153408,3,14,2,3,0,0,1,0,0,40,0,1 +26,2,385278,1,9,1,1,1,1,0,0,0,60,0,0 +44,3,38434,3,14,0,3,0,0,1,0,0,40,0,0 +45,1,111679,5,10,2,10,0,0,0,0,0,30,0,0 +55,2,168956,5,10,2,0,0,0,1,0,0,40,0,0 +20,2,86143,5,10,0,4,5,2,0,0,0,30,0,0 +48,2,99835,6,12,1,1,1,0,0,0,0,50,0,1 +33,2,263561,1,9,2,10,0,0,0,0,0,60,0,0 +44,2,118536,4,5,1,8,1,1,0,0,0,40,0,0 +32,5,209691,0,13,1,10,1,0,0,0,0,50,8,0 +54,2,123374,7,4,1,10,1,0,0,0,0,40,0,0 +40,2,137225,3,14,1,1,1,0,0,0,0,40,0,1 +29,2,119359,1,9,1,3,2,2,1,0,0,10,26,1 +56,2,134153,12,6,1,0,1,1,0,0,0,40,0,0 +47,2,121124,1,9,1,10,1,0,0,0,0,40,0,1 +22,2,147655,5,10,0,9,0,0,1,0,0,40,0,0 +46,2,165138,5,10,1,6,1,0,0,0,0,45,0,1 +24,3,312017,5,10,0,1,3,0,0,0,0,40,0,0 +37,2,272950,1,9,2,10,0,0,0,0,0,40,0,0 +49,2,259323,1,9,2,10,4,0,0,0,0,40,0,0 +44,3,281739,5,10,0,0,0,0,0,13550,0,50,0,1 +21,2,119156,1,9,0,10,3,0,0,0,0,40,0,0 +55,2,165881,1,9,1,1,1,0,0,0,0,40,0,1 +23,0,136075,0,13,0,3,0,0,1,0,0,32,0,0 +50,2,187465,2,7,2,5,0,0,1,0,0,40,0,0 +44,2,328561,9,11,1,0,5,0,1,0,0,20,0,0 +48,2,350440,5,10,1,10,5,2,0,0,0,40,14,1 +38,1,109133,3,14,1,1,1,0,0,0,0,70,0,1 +48,2,109814,10,15,1,3,1,0,0,0,1977,45,0,1 +39,2,86643,5,10,0,10,0,0,0,0,0,50,0,0 +52,3,154521,1,9,1,0,1,0,0,0,0,44,0,1 +63,2,45912,1,9,6,4,5,0,1,0,0,40,0,0 +48,2,175070,1,9,2,1,0,0,1,0,2258,40,0,1 +37,2,338033,3,14,0,3,0,0,1,0,0,40,0,0 +26,0,158963,3,14,0,1,0,0,1,0,0,40,0,0 +50,5,121441,2,7,0,1,5,0,0,0,2444,40,0,1 +47,1,242391,10,15,1,3,1,0,0,15024,0,40,0,1 +19,2,119964,1,9,0,10,5,0,1,0,0,15,0,0 +34,2,193344,5,10,0,0,4,0,1,0,0,40,9,0 +29,4,45554,5,10,2,0,4,0,1,0,0,40,0,0 +33,2,249716,1,9,0,9,0,0,0,0,0,45,0,0 +53,2,58985,5,10,1,3,2,0,1,0,0,24,0,0 +24,2,456367,1,9,1,10,1,0,0,0,0,40,0,0 +39,2,117381,5,10,2,6,0,0,0,0,0,65,0,0 +50,1,240922,6,12,0,5,0,0,1,0,1408,5,0,0 +31,2,226443,0,13,1,3,1,0,0,0,0,40,0,0 +22,2,364342,9,11,0,5,0,1,1,0,0,25,0,0 +42,4,101593,0,13,1,11,1,0,0,0,0,42,0,0 +23,2,267471,14,8,0,5,3,0,1,0,0,25,0,0 +22,2,186849,2,7,2,5,3,0,0,0,0,50,0,0 +65,2,174603,11,3,6,8,0,0,1,0,0,10,25,0 +34,2,115040,1,9,1,10,1,0,0,0,0,44,0,0 +23,2,142766,5,10,0,0,3,0,0,1055,0,20,0,0 +38,2,59660,0,13,1,5,1,0,0,7298,0,40,0,1 +45,1,49595,5,10,1,1,1,0,0,0,0,80,0,0 +19,2,127491,1,9,0,4,0,0,0,0,0,40,0,0 +46,2,155933,0,13,0,8,0,0,1,0,1602,8,0,0 +23,2,122272,5,10,0,0,3,0,1,0,0,20,0,0 +37,2,143771,1,9,1,1,1,0,0,0,0,60,0,1 +59,2,91384,0,13,1,0,1,0,0,0,0,40,0,0 +36,0,135874,0,13,1,5,1,0,0,0,0,40,0,0 +35,2,207066,0,13,0,5,0,0,0,10520,0,45,0,1 +51,2,172493,5,10,0,1,0,0,1,0,0,12,0,0 +42,4,189956,0,13,2,3,4,1,1,0,0,30,0,0 +35,2,106967,3,14,0,5,0,0,1,0,0,40,0,0 +20,2,200153,1,9,0,4,3,0,1,0,0,38,0,0 +41,2,151736,12,6,0,8,0,0,0,0,0,40,0,0 +40,2,67852,1,9,2,6,0,0,0,0,0,35,0,0 +36,2,54229,6,12,1,1,2,0,1,0,0,37,0,0 +34,5,154120,3,14,1,5,1,0,0,0,0,60,0,1 +44,1,157217,0,13,0,5,0,0,0,0,0,42,0,0 +31,3,381645,0,13,4,3,0,0,0,0,0,40,0,0 +41,4,160785,1,9,1,10,1,0,0,0,0,40,0,0 +43,2,133584,5,10,1,8,1,0,0,0,0,40,0,0 +43,2,170230,3,14,0,9,0,0,1,0,0,40,0,0 +58,2,250206,12,6,1,10,1,0,0,5178,0,40,0,1 +19,2,128363,5,10,0,5,3,0,1,0,0,30,0,0 +43,4,163434,0,13,1,11,1,0,0,0,0,55,0,1 +50,2,195690,1,9,1,2,1,0,0,0,0,45,0,0 +44,5,138991,5,10,1,1,1,0,0,0,0,50,0,1 +46,2,118419,1,9,2,8,4,0,0,0,0,38,0,0 +52,1,185407,0,13,1,1,1,0,0,0,0,50,0,1 +52,1,283079,1,9,0,3,0,0,0,0,0,50,0,0 +18,2,119655,14,8,0,0,3,0,1,0,0,12,0,0 +29,2,153416,0,13,0,1,0,0,1,0,0,55,0,0 +34,2,220362,0,13,0,1,3,0,0,0,0,40,0,0 +23,4,203078,5,10,1,11,1,1,0,0,0,40,0,0 +64,0,104361,5,10,4,0,0,0,1,0,0,65,0,0 +68,2,274096,12,6,2,6,0,0,0,0,0,20,0,0 +42,0,455553,1,9,0,0,4,1,1,0,0,40,0,0 +41,2,112283,1,9,1,10,1,0,0,0,0,60,0,1 +41,5,64506,1,9,1,7,1,0,0,0,0,50,0,0 +22,0,24395,5,10,1,0,2,0,1,0,0,20,0,0 +67,5,182581,5,10,1,1,1,0,0,20051,0,20,0,1 +27,2,100669,5,10,1,10,1,2,0,0,0,40,11,1 +25,2,178025,3,14,1,3,1,0,0,0,0,40,0,0 +28,2,55191,6,12,0,2,0,0,0,0,0,45,0,0 +51,3,223206,8,16,1,3,1,2,0,15024,0,40,36,1 +23,4,162551,0,13,0,3,3,2,1,0,0,35,26,0 +19,2,693066,14,8,0,4,3,0,1,0,0,15,0,0 +33,2,256362,5,10,0,4,0,0,0,0,0,35,0,0 +53,2,539864,5,10,2,10,0,0,0,0,0,20,0,0 +35,2,241153,9,11,0,9,0,0,0,0,0,40,0,0 +31,2,284395,0,13,1,5,1,0,0,0,0,40,0,0 +18,2,180039,14,8,0,5,3,0,1,0,0,20,0,0 +45,2,178416,9,11,2,2,0,0,1,0,0,40,0,0 +22,4,164775,11,3,0,2,5,0,0,0,0,40,24,1 +55,2,176897,5,10,2,9,0,0,0,0,0,40,0,0 +45,2,265097,1,9,1,4,1,0,0,0,1902,40,0,1 +22,2,193090,1,9,0,5,0,0,1,0,0,37,0,0 +37,2,186009,1,9,1,6,1,0,0,0,1672,60,0,0 +28,2,175262,1,9,1,8,3,0,0,0,0,40,0,0 +19,2,109928,2,7,0,5,3,1,1,0,0,35,0,0 +37,1,162834,1,9,1,5,1,0,0,0,1902,45,0,1 +50,2,177896,8,16,1,3,1,0,0,0,0,40,0,1 +31,2,181372,1,9,2,0,4,0,1,0,0,35,0,0 +40,2,70645,13,1,0,4,0,0,1,0,0,20,0,0 +51,2,128272,4,5,1,8,1,0,0,0,0,45,0,0 +56,2,106723,1,9,2,0,0,0,1,0,0,40,0,0 +21,2,122348,5,10,0,9,3,0,1,0,0,35,0,0 +40,2,177905,9,11,1,1,1,0,0,7688,0,44,0,1 +22,2,254547,5,10,0,1,4,1,1,0,0,40,2,0 +47,5,102308,10,15,1,3,1,0,0,0,2415,45,0,1 +44,2,33105,1,9,1,1,1,3,0,0,0,40,0,0 +44,4,197919,5,10,2,4,4,0,1,0,0,40,0,0 +41,2,206139,1,9,1,5,1,0,0,0,0,40,0,1 +47,2,117849,6,12,2,5,3,0,0,0,0,44,0,0 +26,2,323044,5,10,1,1,1,0,0,0,0,45,9,1 +34,2,90415,9,11,0,9,0,1,0,0,0,40,0,0 +47,2,294913,10,15,1,1,1,0,0,99999,0,40,0,1 +36,2,127573,1,9,4,0,0,0,1,0,0,38,0,0 +21,2,180190,9,11,1,7,1,0,0,0,0,46,0,0 +45,0,231013,0,13,2,11,0,0,0,0,0,40,0,0 +33,2,356015,1,9,4,10,0,3,0,0,0,35,37,0 +33,2,198069,1,9,0,8,0,0,0,0,0,65,0,0 +58,1,99141,1,9,2,7,4,0,1,0,0,10,0,0 +31,2,188246,6,12,2,10,0,0,0,0,0,50,0,1 +32,1,116508,5,10,1,7,1,0,0,0,0,50,0,1 +44,3,38434,0,13,6,1,4,0,1,0,0,40,0,1 +24,2,128477,3,14,0,3,0,0,1,0,0,40,0,0 +35,2,91839,0,13,1,4,1,3,0,7688,0,20,0,1 +43,2,409922,0,13,1,1,1,0,0,0,1977,50,0,1 +49,2,185041,1,9,1,8,1,0,0,0,0,40,0,0 +37,1,103925,0,13,1,5,2,0,1,0,0,50,0,0 +42,1,34037,0,13,0,7,3,0,0,0,0,35,0,0 +19,2,57145,1,9,0,4,3,0,1,0,0,25,0,0 +41,2,182108,8,16,0,8,0,0,1,0,0,40,0,1 +51,5,213296,1,9,1,4,1,0,0,0,0,30,0,0 +51,5,28765,10,15,1,3,1,0,0,0,0,60,0,1 +63,2,37792,12,6,6,4,0,0,1,0,0,31,0,0 +39,3,232036,5,10,1,0,1,0,0,0,0,40,0,1 +30,2,33678,1,9,0,5,3,0,0,0,0,40,0,0 +62,6,159908,5,10,1,0,2,0,1,0,0,16,0,0 +27,2,176761,1,9,0,10,5,4,0,0,0,40,35,0 +32,2,260954,2,7,1,10,1,0,0,0,2042,30,0,0 +37,4,180342,0,13,1,4,1,0,0,0,0,40,0,1 +47,4,324791,3,14,1,3,1,0,0,0,1887,50,0,1 +31,2,183801,3,14,1,3,1,0,0,0,1902,43,0,1 +42,2,204235,1,9,1,5,1,0,0,0,0,40,0,0 +37,2,249720,9,11,3,5,4,1,1,0,0,32,0,0 +60,2,127084,1,9,1,11,1,0,0,0,2042,34,0,0 +42,4,201495,5,10,1,11,1,0,0,0,0,72,0,1 +38,2,447346,5,10,1,10,1,0,0,0,0,36,0,1 +24,2,206008,6,12,0,3,3,1,0,0,0,20,0,0 +34,2,286020,1,9,1,8,1,0,0,0,0,45,0,0 +29,4,169544,5,10,0,11,3,0,0,0,0,48,0,0 +90,2,313749,1,9,6,0,4,0,1,0,0,25,0,0 +55,2,89182,14,8,2,8,0,0,1,0,0,40,25,0 +36,2,258102,1,9,0,2,0,0,0,0,0,40,0,0 +49,2,255466,5,10,2,0,0,0,1,0,0,60,0,0 +50,2,38795,0,13,1,3,1,0,0,0,0,50,0,0 +17,2,311907,2,7,0,4,3,0,0,0,0,25,0,0 +54,2,171924,1,9,1,6,1,0,0,0,0,70,0,0 +26,2,164488,0,13,0,1,0,0,0,0,0,10,0,0 +44,2,297991,6,12,0,1,0,2,1,0,0,50,0,0 +28,2,478315,0,13,0,3,3,1,1,0,0,40,0,0 +54,4,34832,8,16,1,1,1,0,0,0,0,60,0,1 +21,2,67804,4,5,0,8,3,1,0,0,0,20,0,0 +24,2,34568,9,11,0,6,0,0,0,0,0,40,0,0 +31,2,47151,1,9,0,4,0,0,1,0,0,56,0,0 +41,2,318046,5,10,1,6,1,0,0,0,0,48,0,1 +29,2,363963,1,9,2,4,0,0,1,0,0,40,0,0 +50,2,92811,0,13,1,9,1,0,0,0,0,40,0,0 +32,2,33678,5,10,1,6,1,0,0,0,0,50,0,1 +42,2,66118,5,10,2,8,0,0,1,0,0,40,0,0 +47,2,160474,1,9,1,1,2,0,1,0,0,30,0,1 +44,2,159960,5,10,2,0,4,0,1,0,0,40,0,0 +49,2,242987,0,13,1,3,1,0,0,0,0,40,13,0 +61,2,232719,3,14,1,3,1,0,0,0,0,50,0,0 +65,4,103153,7,4,1,1,1,0,0,0,1411,40,0,0 +45,4,162187,1,9,1,11,1,0,0,0,0,40,0,1 +59,2,207391,1,9,2,8,0,0,0,0,0,40,0,0 +34,2,356882,5,10,1,5,1,0,0,0,0,45,0,1 +24,2,427686,15,2,1,2,5,0,0,0,0,40,4,0 +37,2,377798,5,10,1,10,1,0,0,3103,0,40,0,1 +36,2,43712,12,6,1,10,1,0,0,0,0,40,0,0 +54,2,161691,3,14,2,3,0,0,1,0,2559,40,0,1 +34,2,346034,14,8,3,2,4,0,0,0,0,35,4,0 +41,2,144460,5,10,2,8,3,0,0,0,0,40,25,0 +26,2,262617,1,9,1,10,1,0,0,0,0,48,0,0 +23,3,173851,1,9,0,12,0,0,0,0,0,8,0,0 +34,2,117963,0,13,1,10,1,0,0,0,0,40,0,1 +54,2,219737,1,9,6,5,0,0,1,0,0,37,0,0 +37,2,328466,1,9,1,10,1,0,0,0,0,72,4,0 +54,0,138852,1,9,1,3,1,0,0,0,0,40,0,0 +22,4,195532,5,10,0,11,5,0,1,0,0,43,0,0 +32,2,188246,1,9,1,10,1,0,0,0,0,40,0,0 +42,0,138162,5,10,2,0,3,0,0,0,0,40,0,0 +31,0,110714,5,10,0,4,3,0,1,0,0,37,0,0 +48,2,123075,8,16,1,3,1,0,0,0,0,45,0,1 +28,2,330466,0,13,0,3,0,2,0,0,0,40,37,0 +31,2,254304,12,6,2,10,0,0,0,0,0,38,0,0 +28,2,435842,0,13,1,1,1,0,0,0,0,40,0,0 +24,2,118657,14,8,1,8,1,0,0,0,0,40,0,0 +50,2,278188,1,9,2,10,0,0,1,0,0,45,0,0 +26,2,233777,1,9,1,10,1,0,0,0,0,72,4,0 +37,5,328466,5,10,1,1,1,0,0,0,0,50,0,1 +24,2,176580,11,3,3,7,0,0,0,0,0,40,4,0 +32,2,172415,1,9,0,4,4,1,1,0,0,40,0,0 +23,2,194951,0,13,0,3,0,2,0,0,0,55,38,0 +33,4,318921,1,9,2,6,0,0,1,0,0,35,0,0 +49,2,189462,1,9,1,10,1,0,0,0,0,40,0,0 +75,1,192813,3,14,6,5,0,0,0,0,0,45,0,0 +74,1,199136,0,13,6,10,0,0,0,15831,0,8,9,1 +26,2,156805,5,10,1,8,1,1,0,0,0,40,0,0 +34,2,121966,0,13,3,0,0,0,1,0,0,45,0,0 +18,2,347336,14,8,0,4,3,0,0,0,0,12,0,0 +33,2,205950,1,9,1,10,1,0,0,0,0,40,0,0 +36,0,212143,0,13,1,0,2,0,1,0,0,20,0,1 +44,2,187821,0,13,1,6,1,0,0,0,0,55,0,0 +36,2,250807,2,7,0,10,0,1,1,0,0,40,0,0 +53,2,291755,9,11,1,10,1,0,0,0,0,40,0,0 +60,2,36077,7,4,3,8,0,0,0,0,0,40,0,0 +28,2,119793,1,9,1,10,1,0,0,0,0,40,20,0 +36,2,184655,12,6,2,6,4,0,0,0,0,48,0,0 +35,2,162256,9,11,2,0,0,0,1,6849,0,40,0,0 +45,1,204405,9,11,1,3,1,0,0,0,0,20,0,0 +23,2,133355,5,10,0,0,3,0,0,0,0,15,0,0 +35,2,89559,5,10,2,0,4,0,1,0,0,55,0,0 +34,2,115066,5,10,1,1,1,0,0,0,0,42,0,1 +46,2,139514,13,1,1,8,5,1,0,0,0,75,21,0 +58,0,200316,1,9,1,10,1,0,0,0,0,40,0,0 +55,4,166502,3,14,0,3,0,0,1,0,0,45,0,0 +63,2,226422,1,9,1,10,1,0,0,0,0,40,0,0 +41,1,251305,5,10,1,5,1,0,0,0,0,40,0,0 +45,2,190482,9,11,1,10,1,0,0,0,0,76,0,0 +41,2,122215,3,14,1,3,1,0,0,15024,0,40,0,1 +42,2,248356,1,9,0,5,4,0,1,0,0,40,0,0 +90,4,214594,7,4,1,11,1,0,0,2653,0,40,0,0 +41,2,220460,1,9,0,5,3,0,0,0,0,40,0,0 +22,2,174043,1,9,0,10,0,0,0,0,0,50,0,0 +53,1,137547,10,15,0,3,0,2,0,27828,0,40,11,1 +49,1,111959,0,13,1,1,1,0,0,0,0,60,32,1 +51,2,40641,5,10,1,1,1,0,0,0,0,60,0,1 +22,2,205940,0,13,0,1,0,0,1,0,0,40,0,0 +23,2,265077,9,11,0,4,0,0,1,0,0,40,0,0 +59,2,395736,1,9,1,2,1,0,0,0,0,40,0,1 +40,2,306225,1,9,2,10,0,2,1,0,0,40,28,0 +28,2,180299,1,9,1,6,1,0,0,0,0,70,0,0 +39,2,214896,1,9,4,4,0,0,1,0,0,40,22,0 +25,2,273792,1,9,0,10,3,0,0,0,0,37,0,0 +48,0,224474,5,10,2,1,0,0,1,0,0,40,0,0 +62,2,271431,4,5,1,4,1,1,0,0,0,42,0,0 +44,4,150171,1,9,2,0,4,0,1,0,0,40,0,0 +28,3,381789,0,13,0,3,0,0,0,0,0,50,0,0 +62,2,170984,5,10,1,10,1,0,0,0,0,45,0,0 +32,2,108256,1,9,1,10,1,0,0,0,0,40,0,0 +59,3,23789,1,9,1,5,2,0,1,0,0,40,0,1 +20,2,176321,5,10,0,0,5,0,1,0,0,20,0,0 +40,2,260425,6,12,4,9,4,0,1,1471,0,32,0,0 +47,2,248059,5,10,1,4,1,0,0,0,0,47,0,1 +60,2,56248,5,10,1,5,1,0,0,0,0,40,0,0 +55,2,199763,1,9,4,11,0,0,0,0,0,81,0,0 +18,2,200047,14,8,0,0,3,0,0,0,0,35,0,0 +43,2,191712,0,13,0,0,0,0,0,0,1741,40,0,0 +31,1,156033,1,9,2,4,0,0,0,0,0,35,0,0 +22,2,173736,1,9,0,10,0,0,0,0,0,50,0,0 +56,2,135458,1,9,2,9,0,1,1,0,0,40,0,0 +41,2,185660,1,9,4,0,4,0,1,0,0,40,0,0 +24,2,222005,1,9,0,4,5,0,0,0,0,30,0,0 +42,2,161510,0,13,1,5,1,0,0,7298,0,40,0,1 +53,4,186303,5,10,1,11,1,0,0,0,1887,40,0,1 +52,4,143533,7,4,0,4,5,1,1,0,0,40,0,0 +42,2,288154,5,10,1,10,1,0,0,0,0,89,0,1 +48,2,325372,15,2,1,8,1,0,0,0,0,40,20,0 +35,2,379959,1,9,2,4,0,0,1,0,0,40,0,0 +33,2,168387,2,7,1,4,1,0,0,0,0,40,0,0 +20,2,234640,5,10,0,0,3,0,1,0,0,40,0,0 +33,2,232475,5,10,0,5,3,0,0,0,0,45,0,0 +30,2,205152,0,13,0,5,0,0,0,0,0,40,0,0 +31,2,112115,5,10,1,5,1,0,0,0,0,40,0,0 +29,2,183854,1,9,0,5,0,0,1,0,0,25,0,0 +26,2,164386,1,9,0,10,3,0,0,0,0,48,0,0 +61,2,149620,5,10,2,4,0,1,0,0,0,40,0,0 +29,2,83742,1,9,2,4,4,0,1,0,0,45,0,0 +57,1,65080,1,9,1,10,1,0,0,0,0,50,0,1 +33,2,191335,6,12,1,10,1,0,0,0,1902,50,0,1 +20,2,227778,5,10,0,5,0,0,1,0,0,56,0,0 +26,2,48280,0,13,0,3,0,0,1,0,0,40,0,0 +36,2,66304,0,13,1,1,1,0,0,0,0,55,0,1 +23,2,45834,0,13,0,1,0,0,1,0,0,50,0,0 +31,2,298995,1,9,1,4,2,1,1,0,0,35,0,0 +47,2,161950,1,9,2,4,4,0,1,0,0,32,0,0 +61,2,98776,2,7,6,2,0,0,1,0,0,30,0,0 +35,2,102268,0,13,1,1,1,0,0,0,0,45,0,0 +23,2,180771,15,2,1,8,2,3,1,0,0,35,4,0 +41,2,206878,1,9,2,4,4,0,1,0,0,32,0,0 +39,3,110622,0,13,1,0,2,2,1,0,0,40,11,0 +51,4,203334,8,16,2,1,0,0,1,0,0,45,0,1 +61,1,50483,7,4,1,7,1,0,0,0,0,56,0,0 +51,2,274502,7,4,2,8,0,0,1,0,0,48,0,0 +36,2,208068,13,1,2,4,0,4,0,0,0,72,4,0 +41,1,168098,0,13,1,3,1,0,0,0,0,50,0,0 +34,2,213307,1,9,0,2,4,0,1,7443,0,35,0,0 +25,2,175128,1,9,1,6,1,0,0,0,0,40,0,0 +37,2,40955,10,15,1,3,1,0,0,0,0,50,0,1 +19,2,60890,1,9,0,10,0,0,0,0,0,49,0,0 +66,1,102686,3,14,1,1,1,0,0,0,0,20,0,1 +23,2,190273,0,13,0,3,3,0,0,0,0,40,0,0 +30,1,176185,5,10,3,10,3,0,0,0,0,60,0,1 +53,2,304504,5,10,1,6,1,0,0,0,1887,45,0,1 +25,2,390657,5,10,0,4,0,1,0,0,0,40,0,0 +18,2,41381,1,9,0,5,3,0,1,0,1602,20,0,0 +51,2,101432,1,9,1,10,1,0,0,0,0,40,0,0 +61,2,190682,1,9,6,10,0,1,1,0,1669,50,0,0 +53,2,158993,1,9,6,8,4,1,1,0,0,38,0,0 +17,2,117798,12,6,0,4,3,0,0,0,0,20,0,0 +61,2,137554,7,4,1,10,1,0,0,0,0,40,0,0 +38,2,257416,4,5,1,6,1,1,0,0,0,40,0,0 +40,2,195617,5,10,4,1,4,0,1,0,0,20,0,0 +32,2,236318,5,10,1,5,1,0,0,0,0,32,0,0 +46,2,42251,5,10,1,5,1,0,0,0,0,45,0,1 +50,2,257933,5,10,2,0,0,0,1,0,0,40,0,0 +36,1,109133,0,13,1,5,1,0,0,0,0,50,0,1 +30,1,261943,2,7,3,10,0,0,0,0,0,30,6,0 +33,2,139057,3,14,1,9,1,2,0,0,0,50,0,1 +36,2,237943,0,13,1,3,1,0,0,0,1977,45,0,1 +85,2,98611,0,13,1,1,1,0,0,0,0,3,12,0 +62,2,128092,1,9,6,0,0,0,1,0,0,32,0,0 +24,2,284317,0,13,0,8,0,0,1,0,0,32,0,0 +48,5,185041,1,9,1,10,1,0,0,7298,0,50,0,1 +58,4,223214,1,9,1,4,1,0,0,0,0,40,0,0 +45,5,173664,0,13,1,1,1,0,0,0,0,45,0,1 +66,2,269665,1,9,6,1,0,0,1,0,0,25,0,0 +37,2,121521,10,15,1,3,1,0,0,15024,0,45,0,1 +55,2,199713,4,5,1,10,1,0,0,0,0,48,0,0 +39,1,193689,1,9,0,1,0,0,0,0,0,65,0,0 +50,2,485710,8,16,2,3,0,0,1,0,0,50,0,0 +28,2,185647,5,10,2,2,0,0,0,0,0,50,0,0 +34,2,30673,3,14,1,3,1,0,0,0,0,55,0,0 +41,3,160467,3,14,2,3,4,0,1,1506,0,40,0,0 +36,2,186819,6,12,1,10,1,0,0,0,0,52,0,1 +22,2,67234,1,9,0,2,4,0,0,0,0,45,0,0 +35,2,30673,14,8,1,10,1,0,0,0,0,84,0,0 +21,2,182117,6,12,0,4,3,0,0,0,0,40,0,0 +64,0,222966,7,4,1,4,2,1,1,0,0,40,0,0 +41,2,201495,3,14,1,1,1,0,0,0,0,40,0,1 +52,2,301229,9,11,4,5,4,0,1,0,0,40,0,0 +32,2,157747,5,10,1,3,1,0,0,0,0,40,0,0 +27,2,155382,5,10,0,4,0,0,1,0,0,25,0,0 +48,2,268083,5,10,2,1,0,0,1,0,0,40,0,0 +28,2,113987,1,9,1,8,2,0,1,0,0,40,0,0 +24,2,216984,5,10,1,4,3,2,1,0,0,35,0,0 +51,2,177669,5,10,1,5,1,0,0,0,0,60,0,0 +32,2,164190,5,10,0,1,3,0,0,0,0,40,0,0 +61,2,355645,1,9,1,5,1,1,0,0,0,40,0,0 +33,2,63079,1,9,2,0,4,1,1,0,0,40,0,0 +24,2,381895,2,7,2,8,4,0,1,0,0,40,0,0 +26,2,179010,5,10,0,10,0,0,0,0,0,65,0,0 +18,2,436163,2,7,0,3,3,0,0,0,0,20,0,0 +34,2,321709,1,9,0,4,0,0,1,0,0,28,0,0 +57,2,153918,1,9,1,6,1,0,0,0,0,40,0,0 +25,2,403788,1,9,0,10,5,1,0,0,0,40,0,0 +34,2,60567,2,7,2,6,4,0,0,0,880,60,0,0 +71,2,138145,4,5,1,4,1,0,0,0,0,40,0,0 +35,4,79649,0,13,1,3,1,0,0,0,0,50,0,0 +47,2,312088,1,9,1,10,1,0,0,0,0,40,0,0 +50,2,208630,3,14,2,5,0,0,1,0,0,50,0,1 +33,2,182401,12,6,0,0,0,1,0,0,0,40,0,0 +38,2,32916,9,11,1,10,1,0,0,0,0,55,0,1 +50,2,302372,0,13,1,3,1,0,0,0,0,40,0,0 +45,2,155093,12,6,2,4,0,1,1,0,0,38,21,0 +32,2,192965,1,9,4,5,0,0,1,0,0,45,0,0 +25,4,514716,0,13,0,0,3,1,1,0,0,40,0,0 +20,2,270436,1,9,0,8,3,0,0,0,0,40,0,0 +46,2,42972,3,14,1,3,2,0,1,0,0,22,0,1 +40,2,142657,9,11,1,10,1,1,0,0,0,45,0,0 +66,3,47358,12,6,1,10,1,0,0,3471,0,40,0,0 +30,2,176175,9,11,2,0,4,0,1,0,0,24,0,0 +36,2,131459,7,4,1,10,1,0,0,0,0,40,0,0 +57,4,110417,1,9,1,10,1,0,0,99999,0,40,0,1 +46,2,364548,5,10,1,1,1,0,0,0,0,48,0,1 +27,2,177398,1,9,0,4,4,0,1,0,0,64,0,0 +33,2,273243,1,9,1,10,1,1,0,0,0,40,0,0 +58,2,147707,2,7,1,5,1,0,0,0,0,40,0,0 +30,2,77266,1,9,2,6,0,0,0,0,0,55,0,0 +26,2,191648,6,12,0,8,5,0,1,0,0,15,0,0 +32,2,211349,12,6,1,6,1,0,0,0,0,40,0,0 +22,2,203715,5,10,0,0,3,0,0,0,0,40,0,0 +31,2,292592,1,9,1,8,2,0,1,0,0,40,0,0 +29,2,125976,1,9,4,5,4,0,1,0,0,35,0,0 +34,2,204461,8,16,1,3,1,0,0,0,0,60,0,1 +54,2,337992,0,13,1,1,1,2,0,0,0,50,28,1 +37,2,179137,5,10,2,0,4,0,1,0,0,39,0,0 +22,2,325033,14,8,0,11,3,1,0,0,0,35,0,0 +34,2,160216,0,13,0,1,0,0,1,0,0,55,0,1 +30,2,345898,1,9,0,10,0,1,0,0,0,46,0,0 +38,2,139180,0,13,2,3,4,1,1,15020,0,45,0,1 +45,0,252208,1,9,4,0,3,0,1,0,0,40,0,0 +45,4,119199,6,12,2,3,4,0,1,0,0,48,0,0 +31,2,199655,3,14,2,4,0,4,1,0,0,30,0,0 +39,4,111499,6,12,1,0,2,0,1,0,0,20,0,1 +37,2,198216,6,12,2,9,0,0,1,0,0,40,0,0 +43,2,260761,1,9,1,8,1,0,0,0,0,40,4,0 +65,1,99359,10,15,0,3,0,0,0,1086,0,60,0,0 +43,0,255835,5,10,2,0,5,0,1,0,0,40,0,0 +43,1,27242,5,10,1,10,1,0,0,0,0,50,0,0 +32,2,34066,12,6,1,2,1,3,0,0,0,40,0,0 +43,2,84661,9,11,1,5,1,0,0,0,0,45,0,0 +32,2,116138,3,14,0,9,0,2,0,0,0,11,18,0 +53,2,321865,3,14,1,1,1,0,0,0,0,40,0,1 +22,2,310152,5,10,0,11,0,0,0,0,0,40,0,0 +27,2,257302,6,12,1,9,2,0,1,0,0,38,0,0 +40,2,154374,1,9,1,8,1,0,0,0,0,40,0,1 +58,2,151910,1,9,6,0,4,0,1,0,0,40,0,0 +22,2,201490,1,9,0,0,3,0,0,0,0,20,0,0 +52,5,287927,1,9,1,1,2,0,1,15024,0,40,0,1 diff --git a/cmake-build-debug-wsl/adult_data_short.csv b/cmake-build-debug-wsl/adult_data_short.csv new file mode 100644 index 0000000..e1db557 --- /dev/null +++ b/cmake-build-debug-wsl/adult_data_short.csv @@ -0,0 +1,6725 @@ +39,0,77516,0,13,0,0,0,0,0,2174,0,40,0,0 +50,1,83311,0,13,1,1,1,0,0,0,0,13,0,0 +38,2,215646,1,9,2,2,0,0,0,0,0,40,0,0 +53,2,234721,2,7,1,2,1,1,0,0,0,40,0,0 +28,2,338409,0,13,1,3,2,1,1,0,0,40,1,0 +37,2,284582,3,14,1,1,2,0,1,0,0,40,0,0 +49,2,160187,4,5,3,4,0,1,1,0,0,16,2,0 +52,1,209642,1,9,1,1,1,0,0,0,0,45,0,1 +31,2,45781,3,14,0,3,0,0,1,14084,0,50,0,1 +42,2,159449,0,13,1,1,1,0,0,5178,0,40,0,1 +37,2,280464,5,10,1,1,1,1,0,0,0,80,0,1 +30,0,141297,0,13,1,3,1,2,0,0,0,40,3,1 +23,2,122272,0,13,0,0,3,0,1,0,0,30,0,0 +32,2,205019,6,12,0,5,0,1,0,0,0,50,0,0 +34,2,245487,7,4,1,6,1,3,0,0,0,45,4,0 +25,1,176756,1,9,0,7,3,0,0,0,0,35,0,0 +32,2,186824,1,9,0,8,4,0,0,0,0,40,0,0 +38,2,28887,2,7,1,5,1,0,0,0,0,50,0,0 +43,1,292175,3,14,2,1,4,0,1,0,0,45,0,1 +40,2,193524,8,16,1,3,1,0,0,0,0,60,0,1 +54,2,302146,1,9,4,4,4,1,1,0,0,20,0,0 +35,3,76845,4,5,1,7,1,1,0,0,0,40,0,0 +43,2,117037,2,7,1,6,1,0,0,0,2042,40,0,0 +59,2,109015,1,9,2,9,4,0,1,0,0,40,0,0 +56,4,216851,0,13,1,9,1,0,0,0,0,40,0,1 +19,2,168294,1,9,0,10,3,0,0,0,0,40,0,0 +39,2,367260,1,9,2,1,0,0,0,0,0,80,0,0 +49,2,193366,1,9,1,10,1,0,0,0,0,40,0,0 +23,4,190709,6,12,0,11,0,0,0,0,0,52,0,0 +20,2,266015,5,10,0,5,3,1,0,0,0,44,0,0 +45,2,386940,0,13,2,1,3,0,0,0,1408,40,0,0 +30,3,59951,5,10,1,0,3,0,0,0,0,40,0,0 +22,0,311512,5,10,1,4,1,1,0,0,0,15,0,0 +48,2,242406,2,7,0,8,4,0,0,0,0,40,5,0 +21,2,197200,5,10,0,8,3,0,0,0,0,40,0,0 +19,2,544091,1,9,5,0,2,0,1,0,0,25,0,0 +48,1,265477,6,12,1,3,1,0,0,0,0,40,0,0 +31,2,507875,4,5,1,8,1,0,0,0,0,43,0,0 +53,1,88506,0,13,1,3,1,0,0,0,0,40,0,0 +24,2,172987,0,13,1,9,1,0,0,0,0,50,0,0 +49,2,94638,1,9,4,0,4,0,1,0,0,40,0,0 +25,2,289980,1,9,0,2,0,0,0,0,0,35,0,0 +57,3,337895,0,13,1,3,1,1,0,0,0,40,0,1 +53,2,144361,1,9,1,8,1,0,0,0,0,38,0,0 +44,2,128354,3,14,2,1,4,0,1,0,0,40,0,0 +41,0,101603,9,11,1,10,1,0,0,0,0,40,0,0 +29,2,271466,9,11,0,3,0,0,0,0,0,43,0,0 +25,2,32275,5,10,1,1,2,4,1,0,0,40,0,0 +47,2,51835,10,15,1,3,2,0,1,0,1902,60,6,1 +50,3,251585,0,13,2,1,0,0,0,0,0,55,0,1 +47,5,109832,1,9,2,1,0,0,0,0,0,60,0,0 +43,2,237993,5,10,1,9,1,0,0,0,0,40,0,1 +46,2,216666,11,3,1,8,1,0,0,0,0,40,4,0 +35,2,56352,9,11,1,4,1,0,0,0,0,40,5,0 +41,2,147372,1,9,1,0,1,0,0,0,0,48,0,0 +30,2,188146,1,9,1,8,1,0,0,5013,0,40,0,0 +30,2,59496,0,13,1,5,1,0,0,2407,0,40,0,0 +48,2,149640,1,9,1,6,1,0,0,0,0,40,0,0 +42,2,116632,8,16,1,3,1,0,0,0,0,45,0,1 +29,2,105598,5,10,2,9,0,0,0,0,0,58,0,0 +36,2,155537,1,9,1,10,1,0,0,0,0,40,0,0 +28,2,183175,5,10,2,0,0,0,1,0,0,40,0,0 +53,2,169846,1,9,1,0,2,0,1,0,0,40,0,1 +49,5,191681,5,10,1,1,1,0,0,0,0,50,0,1 +19,2,101509,5,10,0,3,3,0,0,0,0,32,0,0 +31,2,309974,0,13,4,5,3,1,1,0,0,40,0,0 +29,1,162298,0,13,1,5,1,0,0,0,0,70,0,1 +23,2,211678,5,10,0,8,0,0,0,0,0,40,0,0 +79,2,124744,5,10,1,3,5,0,0,0,0,20,0,0 +27,2,213921,1,9,0,4,3,0,0,0,0,40,4,0 +40,2,32214,6,12,1,0,1,0,0,0,0,40,0,0 +18,2,309634,2,7,0,4,3,0,1,0,0,22,0,0 +31,4,125927,7,4,1,7,1,0,0,0,0,40,0,0 +18,2,446839,1,9,0,5,0,0,0,0,0,30,0,0 +52,2,276515,0,13,1,4,1,0,0,0,0,40,1,0 +46,2,51618,1,9,1,4,2,0,1,0,0,40,0,0 +59,2,159937,1,9,1,5,1,0,0,0,0,48,0,0 +44,2,343591,1,9,2,10,0,0,1,14344,0,40,0,1 +53,2,346253,1,9,2,5,3,0,1,0,0,35,0,0 +49,4,268234,1,9,1,11,1,0,0,0,0,40,0,1 +33,2,202051,3,14,1,3,1,0,0,0,0,50,0,0 +30,2,54334,4,5,0,5,0,0,0,0,0,40,0,0 +43,3,410867,8,16,0,3,0,0,1,0,0,50,0,1 +57,2,249977,9,11,1,3,1,0,0,0,0,40,0,0 +37,2,286730,5,10,2,10,4,0,1,0,0,40,0,0 +28,2,212563,5,10,2,8,4,1,1,0,0,25,0,0 +34,4,226296,0,13,1,11,1,0,0,0,0,40,0,1 +29,4,115585,5,10,0,2,0,0,0,0,0,50,0,0 +48,1,191277,8,16,1,3,1,0,0,0,1902,60,0,1 +37,2,202683,5,10,1,5,1,0,0,0,0,48,0,1 +48,2,171095,6,12,2,1,4,0,1,0,0,40,7,0 +32,3,249409,1,9,0,4,3,1,0,0,0,40,0,0 +76,2,124191,3,14,1,1,1,0,0,0,0,40,0,1 +44,2,198282,0,13,1,1,1,0,0,15024,0,60,0,1 +47,1,149116,3,14,0,3,0,0,1,0,0,50,0,0 +20,2,188300,5,10,0,9,3,0,1,0,0,40,0,0 +29,2,103432,1,9,0,10,0,0,0,0,0,40,0,0 +32,5,317660,1,9,1,10,1,0,0,7688,0,40,0,1 +30,2,194901,2,7,0,2,3,0,0,0,0,40,0,0 +31,4,189265,1,9,0,0,0,0,1,0,0,40,0,0 +42,2,124692,1,9,1,2,1,0,0,0,0,40,0,0 +24,2,432376,0,13,0,5,5,0,0,0,0,40,0,0 +38,2,65324,10,15,1,3,1,0,0,0,0,40,0,1 +56,1,335605,1,9,1,4,1,0,0,0,1887,50,8,1 +28,2,377869,5,10,1,5,2,0,1,4064,0,25,0,0 +36,2,102864,1,9,0,8,3,0,1,0,0,40,0,0 +53,2,95647,4,5,1,2,1,0,0,0,0,50,0,0 +56,5,303090,5,10,1,5,1,0,0,0,0,50,0,0 +49,4,197371,9,11,1,10,1,1,0,0,0,40,0,1 +55,2,247552,5,10,1,5,1,0,0,0,0,56,0,0 +22,2,102632,1,9,0,10,0,0,0,0,0,41,0,0 +21,2,199915,5,10,0,4,3,0,1,0,0,40,0,0 +40,2,118853,0,13,1,1,1,0,0,0,0,60,0,0 +30,2,77143,0,13,0,1,3,1,0,0,0,40,9,0 +29,0,267989,0,13,1,3,1,0,0,0,0,50,0,1 +19,2,301606,5,10,0,4,3,1,0,0,0,35,0,0 +47,2,287828,0,13,1,1,2,0,1,0,0,40,0,1 +20,2,111697,5,10,0,0,3,0,1,0,1719,28,0,0 +31,2,114937,6,12,1,0,1,0,0,0,0,40,0,1 +39,2,365739,5,10,2,10,0,0,0,0,0,40,0,0 +28,2,69621,6,12,0,5,0,0,1,0,0,60,0,0 +24,2,43323,1,9,0,4,0,0,1,0,1762,40,0,0 +38,1,120985,1,9,1,10,1,0,0,4386,0,35,0,0 +37,2,254202,0,13,1,5,1,0,0,0,0,50,0,0 +46,2,146195,6,12,2,9,0,1,1,0,0,36,0,0 +38,3,125933,3,14,1,3,1,0,0,0,0,40,10,1 +43,1,56920,1,9,1,10,1,0,0,0,0,60,0,0 +27,2,163127,9,11,1,0,2,0,1,0,0,35,0,0 +20,2,34310,5,10,0,5,3,0,0,0,0,20,0,0 +49,2,81973,5,10,1,10,1,2,0,0,0,40,0,1 +61,5,66614,1,9,1,10,1,0,0,0,0,40,0,0 +27,2,232782,5,10,0,5,3,0,1,0,0,40,0,0 +19,2,316868,5,10,0,4,3,0,0,0,0,30,4,0 +45,2,196584,9,11,0,3,0,0,1,0,1564,40,0,1 +70,2,105376,5,10,0,9,5,0,0,0,0,40,0,0 +31,2,185814,1,9,0,6,4,1,1,0,0,30,0,0 +22,2,175374,5,10,1,4,1,0,0,0,0,24,0,0 +36,2,108293,1,9,6,4,4,0,1,0,0,24,0,0 +64,2,181232,2,7,1,10,1,0,0,0,2179,40,0,0 +47,4,186009,5,10,2,0,4,0,1,0,0,38,4,0 +34,2,198183,1,9,0,0,0,0,1,0,0,40,0,0 +33,2,163003,0,13,0,1,5,2,1,0,0,40,11,0 +21,2,296158,1,9,0,10,3,0,0,0,0,35,0,0 +48,2,187715,1,9,1,10,1,0,0,0,0,46,0,0 +23,2,214542,0,13,0,2,0,0,0,0,0,40,0,0 +71,1,494223,5,10,4,5,4,1,0,0,1816,2,0,0 +29,2,191535,1,9,2,10,0,0,0,0,0,60,0,0 +42,2,228456,0,13,4,4,5,1,0,0,0,50,0,0 +25,2,252752,1,9,0,4,4,0,1,0,0,40,0,0 +44,5,78374,3,14,2,1,4,2,1,0,0,40,0,0 +28,2,88419,1,9,0,1,0,2,1,0,0,40,7,0 +45,1,201080,3,14,1,5,1,0,0,0,0,40,0,1 +36,2,207157,5,10,2,4,4,0,1,0,0,40,4,0 +39,3,235485,6,12,0,1,0,0,0,0,0,42,0,0 +46,0,102628,3,14,6,11,4,0,0,0,0,40,0,0 +18,2,25828,2,7,0,2,3,0,0,0,0,16,0,0 +66,4,54826,9,11,6,3,0,0,1,0,0,20,0,0 +27,2,124953,1,9,0,4,0,0,0,0,1980,40,0,0 +28,0,175325,1,9,1,11,1,0,0,0,0,40,0,0 +51,2,96062,5,10,1,5,1,0,0,0,1977,40,0,1 +27,2,428030,0,13,0,10,0,0,0,0,0,50,0,0 +28,0,149624,0,13,1,3,1,0,0,0,0,40,0,1 +27,2,253814,1,9,3,5,4,0,1,0,0,25,0,0 +21,2,312956,1,9,0,10,3,1,0,0,0,40,0,0 +34,2,483777,1,9,0,2,0,1,0,0,0,40,0,0 +18,2,183930,1,9,0,4,3,0,0,0,0,12,0,0 +33,2,37274,0,13,1,3,1,0,0,0,0,65,0,0 +44,4,181344,5,10,1,1,1,1,0,0,0,38,0,1 +43,2,114580,5,10,2,0,0,0,1,0,0,40,0,0 +30,2,633742,5,10,0,10,0,1,0,0,0,45,0,0 +40,2,286370,7,4,1,8,1,0,0,0,0,40,4,1 +37,3,29054,5,10,1,0,1,0,0,0,0,42,0,1 +34,2,304030,1,9,1,0,1,1,0,0,0,40,0,0 +41,1,143129,0,13,2,1,0,0,1,0,0,40,0,0 +31,2,99928,3,14,1,3,2,0,1,0,0,50,0,0 +58,0,109567,8,16,1,3,1,0,0,0,0,1,0,1 +38,2,155222,5,10,2,8,0,1,1,0,0,28,0,0 +24,2,159567,5,10,1,8,1,0,0,0,0,40,0,0 +41,4,523910,0,13,1,10,1,1,0,0,0,40,0,0 +47,2,120939,5,10,1,9,1,0,0,0,0,45,0,0 +41,3,130760,0,13,1,9,1,0,0,0,0,24,0,0 +23,2,197387,11,3,1,6,5,0,0,0,0,40,4,0 +36,2,99374,5,10,2,10,0,0,0,0,0,40,0,0 +40,3,56795,3,14,0,1,0,0,1,14084,0,55,0,1 +35,2,138992,3,14,1,3,5,0,0,7298,0,40,0,1 +24,1,32921,1,9,0,5,0,0,0,0,0,40,0,0 +26,2,397317,3,14,0,3,0,0,1,0,1876,40,0,0 +51,2,259323,0,13,1,1,1,0,0,0,0,50,0,1 +42,4,254817,5,10,0,3,0,0,1,0,1340,40,0,0 +37,0,48211,1,9,2,0,4,0,1,0,0,35,0,0 +18,2,140164,2,7,0,5,3,0,1,0,0,40,0,0 +36,2,128757,0,13,1,4,1,1,0,7298,0,36,0,1 +35,2,36270,1,9,2,10,0,0,0,0,0,60,0,0 +58,5,210563,1,9,1,5,2,0,1,15024,0,35,0,1 +17,2,65368,2,7,0,5,3,0,1,0,0,12,0,0 +44,4,160943,1,9,1,6,1,1,0,0,0,40,0,0 +37,2,208358,1,9,1,10,1,0,0,0,0,40,0,1 +35,2,153790,5,10,0,5,0,3,1,0,0,40,0,0 +60,2,85815,1,9,1,10,1,2,0,0,0,40,0,0 +54,5,125417,7,4,1,8,1,0,0,0,0,40,0,1 +37,2,635913,0,13,0,1,0,1,0,0,0,60,0,1 +50,2,313321,6,12,2,5,0,0,1,0,0,40,0,0 +38,2,182609,0,13,1,5,1,0,0,0,0,50,12,0 +45,2,109434,0,13,1,3,1,0,0,0,0,55,0,0 +25,2,255004,12,6,0,10,0,0,0,0,0,40,0,0 +31,2,197860,5,10,1,2,1,0,0,0,0,40,0,0 +90,2,51744,1,9,0,4,0,1,0,0,2206,40,0,0 +54,2,176681,1,9,1,0,1,1,0,0,0,20,0,0 +53,4,140359,13,1,0,8,0,0,1,0,0,35,0,0 +18,2,243313,1,9,0,5,3,0,1,0,0,40,0,0 +66,1,167687,1,9,1,7,1,0,0,1409,0,50,0,0 +75,2,314209,9,11,6,0,0,0,1,0,0,20,13,0 +65,2,176796,1,9,2,0,0,0,1,0,0,40,0,0 +35,2,538583,2,7,4,6,0,1,0,3674,0,40,0,0 +41,2,130408,1,9,2,5,4,1,1,0,0,38,0,0 +25,2,159732,5,10,0,0,0,0,0,0,0,42,0,0 +33,2,110978,5,10,2,10,5,4,1,0,0,40,0,0 +28,2,76714,10,15,0,3,0,0,0,0,0,55,0,1 +59,0,268700,1,9,1,4,1,0,0,0,0,40,0,0 +40,0,170525,5,10,0,0,0,0,1,0,0,38,0,0 +41,2,180138,0,13,1,1,1,0,0,0,0,50,10,1 +38,4,115076,3,14,1,1,1,0,0,0,0,70,0,1 +23,2,115458,1,9,0,6,3,0,0,0,0,40,0,0 +40,2,347890,0,13,1,3,1,0,0,0,0,40,0,1 +41,1,196001,1,9,1,4,2,0,1,0,0,20,0,0 +24,0,273905,6,12,1,11,1,0,0,0,0,50,0,0 +38,2,179488,5,10,2,10,0,0,0,0,1741,40,0,0 +58,2,236596,1,9,1,0,1,0,0,0,0,45,0,1 +32,2,183916,1,9,0,4,0,0,1,0,0,34,0,0 +40,2,207578,6,12,1,9,1,0,0,0,1977,60,0,1 +41,2,112763,10,15,1,3,2,0,1,0,0,40,0,1 +42,2,390781,0,13,1,0,2,1,1,0,0,40,0,0 +59,4,171328,12,6,6,4,4,1,1,0,0,30,0,0 +19,4,27382,5,10,0,0,3,0,0,0,0,40,0,0 +58,2,259014,5,10,0,6,0,0,0,0,0,20,0,0 +42,1,303044,1,9,1,7,1,2,0,0,0,40,14,1 +20,2,117789,1,9,0,4,3,0,1,0,0,40,0,0 +32,2,172579,1,9,4,4,0,0,1,0,0,30,0,0 +45,2,187666,9,11,6,1,0,0,1,0,0,45,0,0 +50,2,204518,7,4,2,10,0,0,0,0,0,40,0,0 +36,2,150042,0,13,2,3,3,0,1,0,0,40,0,0 +45,2,98092,1,9,1,5,1,0,0,0,0,60,0,0 +17,2,245918,2,7,0,4,3,0,0,0,0,12,0,0 +59,2,146013,5,10,1,5,1,0,0,4064,0,40,0,0 +26,2,378322,2,7,1,10,1,0,0,0,0,40,0,0 +37,5,257295,5,10,1,1,1,2,0,0,0,75,15,1 +64,2,21174,1,9,1,1,1,0,0,0,0,40,0,1 +33,2,185480,0,13,0,3,0,0,1,0,0,45,0,0 +33,2,222205,1,9,1,10,2,0,1,0,0,40,0,1 +61,2,69867,1,9,1,1,1,0,0,0,0,40,0,1 +17,2,191260,4,5,0,4,3,0,0,1055,0,24,0,0 +50,1,30653,3,14,1,7,1,0,0,2407,0,98,0,0 +27,4,209109,3,14,0,3,3,0,0,0,0,35,0,0 +30,2,70377,1,9,2,3,3,0,1,0,0,40,0,0 +43,2,477983,1,9,1,2,1,1,0,0,0,40,0,0 +44,2,170924,5,10,1,10,1,0,0,7298,0,40,0,1 +35,2,190174,5,10,0,1,0,0,1,0,0,40,0,0 +25,2,193787,5,10,0,9,3,0,1,0,0,40,0,0 +24,2,279472,5,10,1,8,2,0,1,7298,0,48,0,1 +22,2,34918,0,13,0,3,0,0,1,0,0,15,9,0 +42,4,97688,5,10,1,10,1,0,0,5178,0,40,0,1 +34,2,175413,6,12,2,5,4,1,1,0,0,45,0,0 +60,2,173960,0,13,2,3,0,0,1,0,0,42,0,0 +21,2,205759,1,9,0,2,3,0,0,0,0,40,0,0 +57,3,425161,3,14,1,5,1,0,0,15024,0,40,0,1 +41,2,220531,10,15,1,3,1,0,0,0,0,60,0,1 +50,2,176609,5,10,2,4,0,0,0,0,0,45,0,0 +25,2,371987,0,13,0,1,0,0,1,0,0,40,0,0 +50,2,193884,7,4,1,10,1,0,0,0,0,40,16,0 +36,2,200352,0,13,1,3,1,0,0,0,0,45,0,0 +31,2,127595,1,9,2,3,0,0,1,0,0,40,0,0 +29,4,220419,0,13,0,11,0,0,0,0,0,56,0,0 +21,2,231931,5,10,0,5,3,0,0,0,0,45,0,0 +27,2,248402,0,13,0,9,4,1,1,0,0,40,0,0 +65,2,111095,1,9,1,6,1,0,0,0,0,16,0,0 +37,5,57424,0,13,2,5,0,0,1,0,0,60,0,0 +24,2,278130,1,9,0,10,3,0,0,0,0,40,0,0 +38,2,169469,1,9,2,5,0,0,0,0,0,80,0,0 +48,2,146268,0,13,1,0,1,0,0,7688,0,40,0,1 +21,2,153718,5,10,0,4,0,2,1,0,0,25,0,0 +31,2,217460,1,9,1,6,1,0,0,0,0,45,0,1 +55,2,238638,1,9,1,5,1,0,0,4386,0,40,0,1 +24,2,303296,5,10,1,0,2,2,1,0,0,40,17,0 +43,2,173321,1,9,2,0,0,0,1,0,0,40,0,0 +26,2,193945,6,12,0,9,0,0,0,0,0,45,0,0 +46,2,83082,6,12,0,3,0,0,1,0,0,33,0,0 +35,2,193815,6,12,1,0,1,0,0,0,0,40,0,1 +41,5,34987,5,10,1,7,1,0,0,0,0,54,0,1 +26,2,59306,0,13,0,5,0,0,0,0,0,40,0,0 +34,2,142897,3,14,1,1,1,2,0,7298,0,35,18,1 +36,1,205607,0,13,2,3,0,1,1,0,0,40,0,1 +22,2,199698,5,10,0,5,3,0,0,0,0,15,0,0 +24,2,191954,5,10,0,8,0,0,0,0,0,40,0,0 +77,1,138714,5,10,1,5,1,0,0,0,0,40,0,0 +22,2,399087,11,3,1,8,5,0,1,0,0,40,4,0 +29,2,423158,5,10,0,9,0,0,1,0,0,40,0,0 +62,2,159841,1,9,6,4,0,0,1,0,0,24,0,0 +39,1,174308,1,9,1,1,1,0,0,0,0,40,0,0 +43,2,50356,5,10,1,10,1,0,0,0,1485,50,0,0 +35,2,186110,1,9,2,6,0,0,0,0,0,45,0,0 +29,2,200381,2,7,0,1,0,0,1,0,0,40,0,0 +76,1,174309,3,14,1,10,1,0,0,0,0,10,0,0 +63,1,78383,1,9,1,7,1,0,0,0,0,45,0,0 +43,2,187728,5,10,1,3,2,0,1,0,1887,50,0,1 +58,1,321171,1,9,1,2,1,0,0,0,0,40,0,0 +66,2,127921,1,9,0,6,0,0,0,2050,0,55,0,0 +41,2,206565,5,10,0,10,0,1,0,0,0,45,0,0 +26,2,224563,0,13,0,0,0,0,0,0,0,40,0,0 +47,2,178686,9,11,0,4,0,0,0,0,0,40,0,0 +55,4,98545,12,6,1,0,1,0,0,0,0,40,0,0 +53,2,242606,1,9,1,6,1,0,0,0,0,40,0,0 +17,2,270942,11,3,0,4,5,0,0,0,0,48,4,0 +30,2,94235,1,9,0,10,5,0,0,0,0,40,0,0 +49,2,71195,3,14,0,3,0,0,0,0,0,60,0,0 +19,2,104112,1,9,0,5,4,1,0,0,0,30,19,0 +45,2,261192,1,9,1,4,1,1,0,0,0,40,0,0 +26,2,94936,6,12,0,5,0,0,0,0,0,40,0,0 +38,2,296478,9,11,1,10,1,0,0,7298,0,40,0,1 +36,0,119272,1,9,1,11,1,0,0,7298,0,40,0,1 +33,2,85043,1,9,0,7,0,0,0,0,0,20,0,0 +22,0,293364,5,10,0,11,3,1,1,0,0,40,0,0 +43,1,241895,0,13,0,5,0,0,0,0,0,42,0,0 +56,2,101128,6,12,3,4,0,0,0,0,0,25,10,0 +31,2,156464,0,13,0,3,3,0,0,0,0,25,0,0 +33,2,117963,0,13,1,1,1,0,0,0,0,40,0,1 +26,2,192262,1,9,1,4,1,0,0,0,0,40,0,0 +33,2,111363,0,13,1,1,1,0,0,0,0,40,0,1 +46,4,329752,2,7,1,6,1,0,0,0,0,30,0,0 +38,3,95432,1,9,1,0,1,0,0,0,0,40,0,1 +65,2,161400,2,7,6,4,4,4,0,0,0,40,0,0 +40,2,96129,9,11,1,9,1,0,0,0,0,40,0,1 +42,2,111949,1,9,1,0,2,0,1,0,0,35,0,0 +26,1,117125,4,5,1,10,1,0,0,0,0,40,20,0 +36,2,348022,12,6,1,4,2,0,1,0,0,24,0,0 +62,2,270092,3,14,1,3,1,0,0,0,0,40,0,1 +43,2,180609,0,13,1,6,1,0,0,0,0,45,0,0 +43,2,174575,0,13,2,1,0,0,0,0,1564,45,0,1 +22,2,410439,1,9,3,5,0,0,0,0,0,55,0,0 +28,2,92262,1,9,1,10,1,0,0,0,0,40,0,0 +56,1,183081,5,10,1,5,1,0,0,0,0,45,0,0 +22,2,362589,6,12,0,5,0,0,1,0,0,15,0,0 +57,2,212448,0,13,2,1,0,0,1,0,0,45,0,1 +39,2,481060,1,9,2,5,4,0,1,0,0,40,0,0 +26,3,185885,5,10,0,0,4,0,1,0,0,15,0,0 +17,2,89821,2,7,0,4,3,0,0,0,0,10,0,0 +40,0,184018,9,11,1,8,1,0,0,0,0,38,0,1 +45,2,256649,1,9,1,8,1,1,0,0,0,40,0,0 +44,2,160323,1,9,0,10,0,1,0,0,0,40,0,0 +20,4,350845,5,10,0,0,3,0,1,0,0,10,0,0 +33,2,267404,1,9,1,10,2,0,1,0,0,40,0,0 +23,2,35633,5,10,0,5,0,0,0,0,0,40,0,0 +46,1,80914,3,14,2,1,0,0,0,0,0,30,0,0 +38,2,172927,1,9,1,5,1,0,0,0,0,50,0,0 +54,2,174319,1,9,2,6,0,0,0,0,0,40,0,0 +46,2,214955,11,3,2,10,0,0,1,0,2339,45,0,0 +25,2,344991,5,10,1,10,1,0,0,0,0,40,0,0 +46,2,108699,5,10,2,5,0,0,1,0,0,40,0,0 +36,4,117312,5,10,1,6,2,0,1,0,0,40,0,0 +23,2,396099,1,9,0,4,0,0,1,0,0,25,0,0 +29,2,134152,1,9,4,8,0,0,0,0,0,40,0,0 +44,2,162028,5,10,1,0,2,0,1,0,2415,6,0,1 +19,2,25429,5,10,0,0,3,0,1,0,0,16,0,0 +19,2,232392,1,9,0,4,5,0,1,0,0,40,0,0 +35,2,220098,1,9,1,4,2,0,1,0,0,40,0,1 +27,2,301302,0,13,0,10,0,0,0,0,0,50,0,0 +46,1,277946,6,12,4,10,0,0,0,0,0,40,0,0 +34,2,196164,1,9,0,4,0,0,1,0,0,35,0,0 +44,2,115562,5,10,1,9,1,0,0,0,0,40,0,0 +45,2,96975,5,10,2,2,4,0,1,0,0,40,0,0 +25,2,86872,0,13,1,1,1,0,0,0,0,55,0,1 +52,5,132178,0,13,1,1,1,0,0,0,0,50,0,1 +20,2,416103,5,10,0,2,3,0,0,0,0,40,0,0 +28,2,108574,5,10,0,4,0,0,1,0,0,40,0,0 +50,0,288353,0,13,1,11,1,0,0,0,0,40,0,1 +34,2,227689,9,11,2,9,0,0,1,0,0,64,0,0 +28,2,166481,7,4,1,2,1,4,0,0,2179,40,5,0 +41,2,445382,3,14,1,1,1,0,0,0,1977,65,0,1 +28,2,110145,1,9,1,0,1,0,0,0,0,40,0,0 +46,1,317253,1,9,1,10,1,0,0,0,0,25,0,0 +32,2,364657,5,10,1,1,1,0,0,0,0,50,0,0 +41,4,42346,5,10,2,4,0,1,1,0,0,24,0,0 +24,2,241951,1,9,0,2,4,1,1,0,0,40,0,0 +33,2,118500,5,10,2,1,4,0,1,0,0,40,0,0 +46,2,188386,8,16,1,1,1,0,0,15024,0,60,0,1 +31,0,1033222,5,10,1,8,1,0,0,0,0,40,0,0 +35,2,92440,14,8,2,10,0,0,0,0,0,50,0,1 +52,2,190762,15,2,1,8,1,0,0,0,0,40,4,0 +30,2,426017,2,7,0,4,3,0,1,0,0,19,0,0 +34,4,243867,2,7,4,8,0,1,0,0,0,40,0,0 +34,0,240283,1,9,2,6,4,0,1,0,0,40,0,0 +20,2,61777,5,10,1,5,1,0,0,0,0,30,0,0 +17,2,175024,2,7,0,2,3,0,0,2176,0,18,0,0 +32,0,92003,0,13,1,1,2,0,1,0,0,40,0,1 +29,2,188401,1,9,2,7,0,0,0,0,0,40,0,0 +33,2,228528,12,6,0,10,4,0,1,0,0,35,0,0 +25,2,133373,1,9,1,6,1,0,0,0,0,60,0,0 +36,3,255191,3,14,0,3,0,0,0,0,1408,40,0,0 +23,2,204653,1,9,0,2,0,0,0,0,0,72,21,0 +63,5,222289,1,9,1,1,1,0,0,0,0,40,0,1 +47,4,287480,3,14,1,3,1,0,0,0,0,40,0,0 +40,1,204116,0,13,3,3,0,0,1,2174,0,40,0,0 +30,2,29662,6,12,1,4,2,0,1,0,0,25,0,1 +27,2,116358,5,10,0,10,3,2,0,0,1980,40,11,0 +33,2,208405,3,14,1,3,1,0,0,0,0,50,0,1 +34,4,284843,1,9,0,7,0,1,0,594,0,60,0,0 +34,4,117018,5,10,0,11,0,0,1,0,0,40,0,0 +23,2,81281,5,10,1,0,1,0,0,0,0,40,0,0 +42,4,340148,5,10,1,0,2,0,1,0,0,40,0,0 +29,2,363425,0,13,0,3,0,0,0,0,0,40,0,0 +45,2,45857,1,9,2,0,0,0,1,0,0,28,0,0 +24,3,191073,1,9,0,12,3,0,0,0,0,40,0,0 +44,2,116632,5,10,1,3,1,0,0,0,0,40,0,1 +27,2,405855,4,5,0,10,5,0,0,0,0,40,4,0 +20,2,298227,5,10,0,5,0,0,0,0,0,35,0,0 +44,2,290521,1,9,6,1,4,1,1,0,0,40,0,0 +51,2,56915,1,9,1,10,1,3,0,0,0,40,0,0 +20,2,146538,1,9,1,8,1,0,0,0,0,40,0,0 +19,2,206399,1,9,0,8,3,1,1,0,0,40,0,0 +45,5,197332,5,10,1,10,1,0,0,0,0,55,0,1 +60,2,245062,1,9,1,10,1,0,0,0,0,40,0,1 +44,1,234885,1,9,1,5,2,0,1,0,0,40,0,1 +40,2,72887,9,11,1,8,1,2,0,0,0,40,0,1 +30,2,180374,1,9,1,1,2,0,1,0,0,40,0,0 +38,2,351299,5,10,1,6,1,1,0,0,0,50,0,0 +23,2,54012,1,9,1,6,1,0,0,0,0,60,0,0 +44,2,116632,6,12,0,7,3,0,0,0,0,40,0,0 +54,4,288825,1,9,1,6,1,1,0,0,0,40,0,0 +32,2,132601,0,13,1,3,1,0,0,0,0,50,0,0 +50,2,193374,15,2,3,10,4,0,0,0,0,40,0,0 +24,2,170070,0,13,0,9,0,0,1,0,0,20,0,0 +37,2,126708,1,9,1,0,2,0,1,0,0,60,0,0 +52,2,35598,1,9,2,6,4,0,0,0,0,40,0,0 +38,2,33983,5,10,1,6,1,0,0,0,0,40,0,0 +49,2,192776,3,14,1,1,1,0,0,0,1977,45,0,1 +30,2,118551,0,13,1,9,2,0,1,0,0,16,0,1 +60,2,201965,5,10,0,3,4,0,0,0,0,40,0,1 +35,2,285020,1,9,0,10,0,0,0,0,0,40,0,0 +30,2,303990,1,9,0,6,0,0,0,0,0,60,0,0 +67,2,49401,9,11,2,4,0,0,1,0,0,24,0,0 +46,2,279196,0,13,0,10,0,0,1,0,0,40,0,0 +17,2,211870,4,5,0,4,0,0,0,0,0,6,0,0 +22,2,281432,5,10,0,2,3,0,0,0,0,30,0,0 +27,2,161155,12,6,0,4,0,0,0,0,0,40,0,0 +23,2,197904,1,9,0,4,4,0,1,0,0,35,0,0 +33,2,111746,6,12,1,10,1,0,0,0,0,45,20,0 +43,1,170721,5,10,1,10,1,0,0,0,0,20,0,0 +28,0,70100,0,13,0,3,0,0,0,0,0,20,0,0 +41,2,193626,1,9,3,10,4,0,1,0,0,40,0,0 +25,2,189775,5,10,3,0,3,1,1,0,0,20,0,0 +59,4,286967,1,9,1,6,1,0,0,0,0,45,0,0 +45,4,164427,0,13,2,3,4,0,1,0,0,40,0,0 +38,2,91039,0,13,1,5,1,0,0,15024,0,60,0,1 +40,2,347934,1,9,0,4,0,0,1,0,0,35,0,0 +46,3,371373,1,9,2,0,0,0,0,0,0,40,0,0 +35,2,32220,6,12,0,1,0,0,1,0,0,60,0,0 +34,2,187251,1,9,2,3,4,0,1,0,0,25,0,0 +33,2,178107,0,13,0,10,3,0,0,0,0,20,0,0 +41,2,343121,1,9,2,0,4,0,1,0,0,36,0,0 +20,2,262749,5,10,0,8,3,0,0,0,0,40,0,0 +23,2,403107,11,3,0,4,3,0,0,0,0,40,22,0 +26,2,64293,5,10,0,3,0,0,1,0,0,35,0,0 +23,4,324960,1,9,0,7,0,0,0,0,0,40,12,0 +62,4,114060,1,9,1,6,1,0,0,0,0,40,0,0 +52,2,48925,5,10,1,0,1,0,0,0,0,40,0,0 +58,2,180980,5,10,2,4,4,0,1,0,0,42,23,0 +25,2,181054,0,13,0,5,0,0,1,0,0,40,0,0 +24,2,388093,0,13,0,1,0,1,0,0,0,40,0,0 +19,2,249609,5,10,0,11,3,0,0,0,0,8,0,0 +43,2,112131,5,10,1,1,1,0,0,0,0,40,0,0 +47,4,543162,1,9,4,0,4,1,1,0,0,40,0,0 +39,2,91996,1,9,2,4,4,0,1,0,0,40,0,0 +49,2,141944,9,11,3,2,4,0,0,0,1380,42,0,0 +32,2,37070,9,11,0,10,0,0,0,0,0,45,0,0 +34,2,337587,5,10,1,3,1,0,0,0,0,50,0,1 +28,2,189346,1,9,2,10,0,0,0,0,0,45,0,0 +25,2,267044,5,10,0,0,0,3,1,0,0,20,0,0 +34,2,108116,0,13,1,3,1,0,0,0,0,50,0,1 +38,5,99146,0,13,1,1,1,0,0,15024,0,80,0,1 +50,2,196232,1,9,1,1,1,0,0,7688,0,50,0,1 +24,4,248344,5,10,2,2,0,1,0,0,0,50,0,0 +37,4,186035,5,10,1,9,1,0,0,0,0,45,0,1 +44,2,177905,5,10,2,8,4,0,0,0,0,58,0,1 +28,2,85812,5,10,1,5,2,0,1,0,0,40,0,0 +42,2,221172,0,13,1,1,1,0,0,0,0,40,0,1 +74,2,99183,5,10,2,0,0,0,1,0,0,9,0,0 +38,1,190387,1,9,1,10,1,0,0,0,0,50,0,0 +44,1,202692,3,14,1,3,1,0,0,0,0,40,0,0 +44,2,109339,2,7,2,8,4,4,1,0,0,46,5,0 +26,2,108658,1,9,0,8,0,0,0,0,0,40,0,0 +36,2,197202,1,9,1,4,1,1,0,0,0,40,0,0 +41,2,101739,6,12,1,1,2,0,1,0,0,50,0,1 +67,2,231559,10,15,1,3,1,0,0,20051,0,48,0,1 +39,4,207853,14,8,1,9,1,0,0,0,0,50,0,0 +57,2,190942,15,2,6,13,0,1,1,0,0,30,0,0 +29,2,102345,9,11,4,10,0,0,0,0,0,40,0,0 +31,5,41493,0,13,0,7,0,0,1,0,0,45,0,0 +44,2,210525,5,10,1,6,1,0,0,0,0,40,0,0 +29,2,133937,8,16,0,3,3,0,0,0,0,40,0,0 +30,2,237903,5,10,0,2,4,0,1,0,0,40,0,0 +27,2,163862,1,9,0,6,0,0,0,0,0,40,0,0 +27,2,201872,5,10,1,5,1,0,0,0,0,50,0,0 +32,2,84179,1,9,0,2,0,0,1,0,0,45,0,0 +58,2,51662,12,6,1,4,2,0,1,0,0,8,0,0 +35,4,233327,5,10,1,11,1,0,0,0,0,40,0,0 +21,2,259510,1,9,0,2,3,0,0,0,0,36,0,0 +28,2,184831,5,10,0,10,4,0,0,0,0,40,0,0 +46,1,245724,5,10,2,1,0,0,0,0,0,50,0,0 +36,1,27053,1,9,4,4,4,0,1,0,0,40,0,0 +72,2,205343,2,7,6,0,4,0,1,0,0,40,0,0 +35,2,229328,1,9,1,8,2,1,1,0,0,40,0,0 +33,3,319560,9,11,2,10,4,1,1,0,0,40,0,1 +69,2,136218,2,7,0,8,0,0,1,0,0,40,0,0 +35,2,54576,1,9,1,8,1,0,0,0,0,40,0,0 +34,2,148291,1,9,1,9,2,0,1,0,0,32,0,0 +30,2,152453,2,7,1,4,1,0,0,0,0,40,4,0 +28,2,114053,0,13,0,6,0,0,0,0,0,55,0,0 +54,2,212960,0,13,1,5,1,0,0,0,0,35,0,1 +47,2,264052,5,10,1,3,1,0,0,0,0,50,0,1 +24,2,82804,1,9,0,2,4,1,1,0,0,40,0,0 +52,1,334273,0,13,1,3,1,0,0,0,0,60,0,1 +20,2,27337,1,9,0,2,3,3,0,0,0,48,0,0 +43,5,188436,3,14,1,1,1,0,0,5013,0,45,0,0 +45,2,433665,7,4,4,4,4,0,1,0,0,40,4,0 +29,1,110663,1,9,4,10,0,0,0,0,0,35,0,0 +47,2,87490,3,14,2,1,4,0,0,0,0,42,0,0 +24,2,354351,1,9,0,10,3,0,0,0,0,40,0,0 +51,2,95469,1,9,1,3,1,0,0,0,0,40,0,0 +17,2,242718,2,7,0,5,3,0,0,0,0,12,0,0 +37,2,22463,9,11,1,10,1,0,0,0,1977,40,0,1 +27,2,158156,8,16,0,3,0,0,1,0,0,70,0,0 +29,2,350162,0,13,1,1,2,0,0,0,0,40,0,1 +36,1,28738,6,12,2,5,4,0,1,0,0,35,0,0 +58,4,283635,0,13,0,3,0,0,1,0,0,40,0,0 +26,1,86646,5,10,1,10,1,0,0,0,0,45,0,0 +57,2,69884,1,9,1,5,1,0,0,0,0,40,0,1 +59,2,199713,1,9,1,10,1,0,0,0,0,40,0,0 +27,2,181659,1,9,1,8,1,0,0,0,0,40,0,0 +31,1,340939,0,13,0,9,0,0,0,0,0,40,0,0 +21,2,197747,5,10,0,5,3,0,1,0,0,24,0,0 +29,2,34292,5,10,0,0,0,0,0,0,0,60,0,0 +18,2,156764,2,7,0,4,3,0,0,0,0,40,0,0 +52,2,25826,12,6,1,10,1,0,0,0,1887,47,0,1 +57,5,103948,0,13,2,3,0,0,0,0,0,80,0,0 +60,2,39352,7,4,0,6,0,0,0,0,0,48,0,1 +31,2,168387,0,13,1,3,1,0,0,7688,0,40,8,1 +23,2,117789,0,13,0,0,3,0,1,0,0,40,0,0 +27,2,267147,1,9,0,5,3,0,0,0,0,40,0,0 +42,1,214242,10,15,1,3,1,0,0,0,1902,50,0,1 +25,2,200408,5,10,0,9,0,0,0,2174,0,40,0,0 +49,2,136455,0,13,0,3,0,0,1,0,0,45,0,0 +32,2,239824,0,13,0,9,0,0,0,0,0,40,0,0 +19,2,217039,5,10,0,0,3,0,0,0,0,28,0,0 +60,2,51290,7,4,2,4,0,0,1,0,0,40,0,0 +42,4,175674,4,5,1,4,1,0,0,0,0,40,0,0 +35,1,194404,6,12,0,7,0,0,0,0,0,40,0,0 +48,2,45612,1,9,0,0,4,1,1,0,0,37,0,0 +51,2,410114,3,14,1,10,1,0,0,0,0,40,0,1 +29,2,182521,1,9,0,10,0,3,0,0,0,40,0,0 +36,4,339772,1,9,4,1,0,1,0,0,0,40,0,0 +17,2,169658,12,6,0,4,3,0,1,0,0,21,0,0 +52,2,200853,3,14,2,3,0,0,1,6849,0,60,0,0 +24,2,247564,1,9,0,10,0,0,0,0,0,40,0,0 +24,2,249909,1,9,1,2,1,0,0,0,0,50,0,0 +26,4,208122,0,13,0,3,3,0,0,1055,0,40,0,0 +27,2,109881,0,13,0,4,3,0,1,0,0,20,0,0 +39,2,207824,1,9,0,2,3,0,0,0,0,60,0,0 +30,2,369027,1,9,1,6,1,1,0,0,0,45,0,0 +50,1,114117,1,9,1,1,1,0,0,0,0,32,0,0 +52,5,51048,0,13,1,5,1,0,0,0,0,55,0,0 +46,2,102388,10,15,1,3,1,0,0,15024,0,45,0,1 +23,2,190483,0,13,0,5,3,0,1,0,0,20,0,0 +45,2,462440,2,7,6,4,0,1,1,0,0,20,0,0 +65,2,109351,4,5,6,13,4,1,1,0,0,24,0,0 +29,2,34383,9,11,1,6,1,0,0,0,0,55,0,0 +47,2,241832,4,5,3,2,4,0,0,0,0,40,22,0 +30,2,124187,1,9,0,7,3,1,0,0,0,60,0,0 +34,2,153614,1,9,1,5,1,0,0,0,0,45,0,1 +38,1,267556,1,9,1,5,1,0,0,0,0,64,0,0 +33,2,205469,5,10,1,1,1,0,0,0,0,40,0,1 +49,2,268090,0,13,1,5,1,0,0,0,0,26,0,1 +47,1,165039,5,10,0,4,4,1,1,0,0,40,0,0 +49,4,120451,12,6,4,4,4,1,1,0,0,40,0,0 +43,2,154374,5,10,1,10,1,0,0,15024,0,60,0,1 +30,2,103649,0,13,1,0,2,1,1,0,0,40,0,1 +58,1,35723,1,9,1,10,1,0,0,0,0,60,0,0 +19,2,262601,1,9,0,4,3,0,1,0,0,14,0,0 +21,2,226181,0,13,0,2,0,0,0,0,0,40,0,0 +33,2,175697,0,13,1,1,1,0,0,15024,0,60,0,1 +47,5,248145,11,3,1,6,1,0,0,0,0,50,1,0 +52,1,289436,8,16,1,3,1,0,0,0,0,60,0,1 +26,2,75654,1,9,2,10,0,0,0,0,0,55,0,0 +60,2,199378,1,9,1,10,1,0,0,0,0,40,0,0 +21,2,160968,5,10,0,2,3,0,0,0,0,40,0,0 +36,2,188563,5,10,1,5,1,0,0,5178,0,50,0,1 +31,2,55849,5,10,1,10,1,0,0,0,0,45,0,0 +50,5,195322,8,16,4,3,0,0,0,0,0,40,0,1 +31,4,402089,1,9,2,0,4,0,1,0,0,40,0,0 +71,2,78277,1,9,1,10,1,0,0,0,0,15,0,0 +30,0,169496,0,13,1,9,1,0,0,0,0,40,0,1 +20,2,130959,5,10,0,4,3,0,0,0,0,20,0,0 +24,2,556660,1,9,0,1,5,0,0,4101,0,50,0,0 +35,2,292472,8,16,1,3,1,2,0,0,0,40,18,1 +38,0,143774,5,10,4,1,0,0,1,0,0,45,0,0 +27,2,288341,1,9,0,8,3,0,1,0,0,32,0,0 +29,0,71592,5,10,0,0,4,2,1,0,0,40,11,0 +34,2,106742,1,9,1,10,1,0,0,0,0,45,0,0 +44,2,219288,7,4,1,10,1,0,0,0,0,35,0,0 +43,2,174524,1,9,1,8,1,0,0,0,0,40,0,1 +44,1,335183,14,8,1,2,1,1,0,0,0,40,0,1 +35,2,261293,3,14,0,5,0,0,0,0,0,60,0,0 +27,2,111900,5,10,0,3,0,0,0,0,0,40,0,0 +43,4,194360,3,14,0,3,0,0,0,0,0,38,0,0 +20,2,81145,5,10,0,5,0,0,1,0,0,25,0,0 +42,2,341204,6,12,2,3,4,0,1,8614,0,40,0,1 +27,0,249362,5,10,1,6,1,0,0,3411,0,40,0,0 +42,2,247019,1,9,1,10,1,1,0,0,0,40,0,1 +24,2,172146,4,5,0,8,0,0,0,0,1721,40,0,0 +48,3,110457,5,10,2,1,0,0,0,0,0,40,0,0 +17,1,368700,2,7,0,7,3,0,0,0,0,10,0,0 +33,2,182556,0,13,1,1,1,0,0,0,0,40,0,1 +50,5,219420,1,9,1,5,1,0,0,0,0,50,0,1 +22,2,240817,1,9,0,5,3,0,1,2597,0,40,0,0 +17,2,102726,14,8,0,4,3,0,0,0,0,16,0,0 +32,2,226267,5,10,1,0,1,0,0,0,0,40,4,0 +31,2,125457,1,9,0,10,0,0,0,0,0,45,0,0 +58,1,204021,1,9,6,1,0,0,0,0,0,50,0,0 +29,4,92262,1,9,0,11,3,0,0,0,0,48,0,0 +37,2,161141,9,11,1,10,1,0,0,0,0,40,20,1 +34,1,190290,1,9,1,10,1,0,0,0,0,40,0,1 +23,4,430828,5,10,4,1,4,1,0,0,0,40,0,0 +18,0,59342,2,7,0,0,3,0,1,0,0,5,0,0 +34,2,136721,1,9,2,1,0,0,1,0,0,40,0,0 +45,4,86644,0,13,1,3,2,0,1,0,0,55,0,0 +41,2,195124,3,14,0,1,0,0,0,0,0,35,21,0 +26,2,167350,1,9,0,4,5,0,0,0,0,30,0,0 +54,4,113000,5,10,1,7,1,0,0,0,0,40,0,0 +24,2,140027,5,10,0,8,3,1,1,0,0,45,0,0 +42,2,262425,5,10,1,3,1,0,0,0,0,50,0,0 +20,2,316702,5,10,0,3,3,0,0,0,0,20,0,0 +23,0,335453,0,13,0,9,0,0,1,0,0,20,0,0 +35,2,203628,3,14,0,3,0,0,0,0,0,60,0,1 +31,2,118710,3,14,1,9,1,0,0,0,1902,40,0,1 +30,2,189620,0,13,0,3,3,0,1,0,0,40,12,0 +19,2,475028,1,9,0,5,3,0,1,0,0,20,0,0 +36,4,110866,0,13,0,3,0,0,0,0,0,50,0,0 +31,2,243605,0,13,6,5,4,0,1,0,1380,40,1,0 +21,2,163870,5,10,0,2,3,0,0,0,0,30,0,0 +31,1,80145,5,10,1,10,1,0,0,0,0,40,0,0 +46,2,295566,8,16,2,3,4,0,1,25236,0,65,0,1 +44,2,63042,0,13,2,1,3,0,1,0,0,50,0,1 +40,2,229148,14,8,1,4,1,1,0,0,0,40,2,0 +45,2,242552,5,10,0,5,0,1,0,0,0,40,0,0 +60,2,177665,1,9,1,10,1,0,0,0,0,35,0,0 +18,2,208103,2,7,0,4,5,0,0,0,0,25,0,0 +28,2,296450,0,13,1,3,1,0,0,0,0,40,0,0 +36,2,70282,5,10,2,0,4,1,1,0,0,40,0,0 +40,2,144995,9,11,1,9,1,0,0,4386,0,40,0,0 +36,4,382635,0,13,2,0,4,0,1,0,0,35,6,0 +31,2,295697,1,9,4,4,4,1,1,0,0,40,0,0 +33,2,194141,1,9,1,8,1,0,0,0,0,40,0,0 +19,0,378418,1,9,0,9,3,0,1,0,0,40,0,0 +22,2,214399,5,10,0,5,3,0,1,0,0,15,0,0 +34,2,217460,0,13,1,1,1,0,0,0,0,45,0,1 +33,2,182556,1,9,0,4,0,0,0,0,0,40,0,0 +41,2,125831,1,9,1,10,1,0,0,0,2051,60,0,0 +29,2,271328,0,13,0,3,0,0,0,4650,0,40,0,0 +50,4,50459,1,9,1,1,1,0,0,0,0,42,0,1 +42,2,162140,0,13,1,1,1,0,0,7298,0,45,0,1 +44,2,111502,1,9,1,5,2,0,1,0,0,40,0,0 +20,2,299047,5,10,0,4,0,0,1,0,0,20,0,0 +31,2,223212,1,9,1,4,1,0,0,0,0,40,4,0 +23,2,352139,5,10,0,4,0,0,1,0,0,24,0,0 +55,2,173093,5,10,2,0,0,2,1,0,0,40,0,0 +26,2,181655,9,11,1,0,1,0,0,0,2377,45,0,0 +25,2,332702,9,11,0,4,3,0,1,0,0,15,0,0 +35,2,234901,5,10,1,10,1,0,0,2407,0,40,0,0 +36,2,131414,5,10,0,5,0,1,1,0,0,36,0,0 +43,0,260960,0,13,1,3,1,0,0,0,0,50,0,0 +56,2,156052,1,9,6,4,4,1,1,594,0,20,0,0 +42,2,279914,0,13,1,9,1,0,0,0,0,40,0,1 +19,2,192453,5,10,0,4,5,0,1,0,0,25,0,0 +55,1,200939,1,9,1,6,1,0,0,0,0,72,0,0 +42,2,151408,3,14,0,1,0,0,1,14084,0,50,0,1 +26,2,112847,9,11,0,9,3,0,0,0,0,40,0,0 +17,2,316929,14,8,0,2,3,0,0,0,0,20,0,0 +42,4,126319,0,13,1,3,2,0,1,0,0,40,0,1 +55,2,197422,1,9,1,6,1,0,0,7688,0,40,0,1 +32,2,267736,5,10,0,0,3,1,1,0,0,40,0,0 +29,2,267034,2,7,0,10,3,1,0,0,0,40,19,0 +46,0,193047,0,13,1,3,1,0,0,0,0,37,0,0 +29,0,356089,0,13,1,1,1,0,0,7688,0,40,0,1 +22,2,223515,0,13,0,3,4,0,0,0,0,20,0,0 +58,1,87510,12,6,1,10,1,0,0,0,0,40,0,0 +23,2,145111,1,9,0,6,4,0,0,0,0,50,0,0 +39,2,48093,1,9,0,2,0,0,0,0,0,40,0,0 +27,2,31757,9,11,0,10,3,0,0,0,0,38,0,0 +54,2,285854,1,9,1,6,1,0,0,0,0,40,0,1 +33,4,120064,0,13,0,3,0,0,1,0,0,45,0,0 +46,3,167381,1,9,1,0,2,0,1,0,0,40,0,1 +37,2,103408,1,9,0,7,0,1,0,0,0,40,0,0 +36,2,101460,1,9,0,4,0,0,1,0,0,18,0,0 +59,4,420537,1,9,1,0,2,0,1,0,0,38,0,1 +34,4,119411,1,9,2,11,4,0,0,0,0,40,20,0 +53,5,128272,8,16,1,1,1,0,0,0,0,70,0,1 +51,2,386773,0,13,0,5,0,0,0,0,0,55,0,1 +32,2,283268,12,6,4,4,4,0,1,0,0,42,0,0 +31,0,301526,5,10,3,4,5,0,0,0,0,40,0,0 +22,2,151790,5,10,1,5,2,0,1,0,0,30,9,0 +47,1,106252,0,13,2,5,0,0,1,0,0,50,0,0 +32,2,188557,1,9,0,8,0,0,0,0,0,40,0,0 +26,2,171114,5,10,0,7,0,0,1,0,0,38,0,0 +37,2,327323,11,3,4,7,0,0,0,0,0,32,24,0 +31,2,244147,1,9,2,10,4,0,0,0,0,55,0,0 +37,2,280282,9,11,1,9,2,0,1,0,0,24,0,1 +55,2,116442,1,9,0,5,0,0,0,0,0,38,0,0 +23,4,282579,9,11,2,9,0,0,0,0,0,56,0,0 +36,2,51838,5,10,2,0,4,0,1,0,0,40,0,0 +43,2,226902,0,13,1,5,1,0,0,0,0,50,0,1 +54,2,279129,5,10,0,9,0,0,0,0,0,40,0,0 +28,2,196690,9,11,0,8,0,0,1,0,1669,42,0,0 +40,2,130760,9,11,1,1,1,0,0,0,0,50,0,1 +41,1,49572,5,10,1,1,1,0,0,0,0,60,0,0 +40,2,237601,0,13,0,5,0,4,1,0,0,55,0,1 +42,2,169628,5,10,2,0,0,1,1,0,0,38,0,0 +61,1,36671,1,9,1,7,1,0,0,0,2352,50,0,0 +18,2,231193,14,8,0,8,3,0,0,0,0,30,0,0 +48,2,102102,9,11,1,9,1,0,0,0,0,50,0,1 +41,5,32185,0,13,1,9,1,0,0,0,0,40,0,0 +23,2,211046,1,9,0,5,0,0,1,2463,0,40,0,0 +60,2,31577,1,9,1,6,1,0,0,0,0,60,0,1 +22,2,162343,5,10,0,4,5,1,0,0,0,20,0,0 +61,2,128831,1,9,1,8,1,0,0,0,0,40,0,0 +25,2,316688,1,9,0,8,0,1,0,0,0,40,0,0 +46,2,90758,3,14,0,9,0,0,0,0,0,35,0,1 +43,2,274363,0,13,1,1,1,0,0,0,1902,40,7,1 +43,2,154538,6,12,2,10,0,0,0,0,0,40,0,0 +24,2,106085,1,9,0,4,3,1,0,0,1721,30,0,0 +68,1,315859,2,7,0,7,4,0,0,0,0,20,0,0 +31,2,51471,1,9,2,0,4,0,1,0,0,38,0,0 +17,2,193830,2,7,0,5,3,0,1,0,0,20,0,0 +32,2,231043,1,9,1,10,1,0,0,5178,0,48,0,1 +33,2,169879,0,13,1,3,1,0,0,3103,0,47,0,1 +64,2,270333,0,13,1,3,1,0,0,0,0,40,0,1 +20,2,138768,1,9,0,6,3,0,0,0,0,30,0,0 +30,2,191571,1,9,4,4,3,0,1,0,0,36,0,0 +43,2,94113,5,10,2,1,0,0,0,0,0,45,0,0 +22,2,137510,5,10,0,0,3,0,0,0,0,40,0,0 +17,2,32607,12,6,0,7,3,0,0,0,0,20,0,0 +47,1,93208,1,9,1,4,2,0,1,0,0,75,25,0 +41,2,254440,9,11,0,3,0,0,1,0,0,60,0,0 +56,2,186556,5,10,1,10,1,0,0,0,0,50,0,1 +64,2,169871,1,9,1,6,1,0,0,0,0,45,0,0 +47,2,191277,1,9,1,6,1,0,0,0,0,50,0,1 +48,2,167159,9,11,0,0,4,0,0,0,0,40,0,0 +31,2,171871,3,14,0,3,0,0,1,0,0,46,0,0 +29,2,154411,9,11,0,9,3,0,0,0,0,40,0,0 +30,2,129227,1,9,6,0,0,0,1,0,0,40,0,0 +32,2,110331,1,9,1,1,1,0,0,0,1672,60,0,0 +57,2,34269,1,9,6,6,4,0,0,0,653,42,0,1 +62,2,174355,1,9,6,4,0,0,1,0,0,40,0,0 +39,2,680390,1,9,4,8,4,0,1,0,0,24,0,0 +43,2,233130,5,10,0,0,0,0,0,0,0,25,0,0 +24,5,165474,0,13,0,5,3,0,0,0,0,40,0,0 +53,2,194259,5,10,1,0,2,0,1,4386,0,40,0,1 +26,2,280093,5,10,0,2,3,0,0,0,0,40,0,0 +73,1,177387,1,9,1,1,1,0,0,0,0,40,0,0 +55,2,105304,1,9,1,8,1,0,0,0,0,40,0,0 +25,2,499233,1,9,2,0,0,0,0,0,0,40,0,0 +41,2,180572,0,13,2,3,0,0,1,0,0,50,0,1 +24,2,321435,0,13,0,1,0,0,0,0,0,50,0,0 +63,2,86108,1,9,6,7,0,0,0,0,0,6,0,0 +17,2,198124,2,7,0,5,3,0,0,0,0,20,0,0 +35,2,135162,5,10,1,10,1,0,0,0,0,50,0,0 +51,2,146813,5,10,1,3,1,0,0,0,0,40,0,1 +62,4,291175,0,13,6,3,0,0,1,0,0,48,0,0 +55,2,387569,1,9,1,10,1,0,0,4386,0,40,0,1 +43,2,102895,5,10,2,3,0,0,0,0,0,40,0,0 +40,4,33274,1,9,2,4,0,0,1,0,0,50,0,0 +37,2,86551,0,13,1,1,1,0,0,0,0,45,0,1 +39,2,138192,0,13,1,10,1,0,0,0,0,40,0,0 +31,2,118966,1,9,0,10,3,0,0,0,0,18,0,0 +61,2,99784,3,14,6,3,0,0,1,0,0,40,0,1 +26,2,90980,9,11,2,0,0,0,1,0,0,55,0,0 +46,1,177407,1,9,1,5,1,0,0,0,0,50,0,0 +26,2,96467,0,13,0,3,0,0,1,0,0,40,0,0 +48,0,327886,8,16,2,3,3,0,0,0,0,50,0,1 +34,2,111567,1,9,0,6,3,0,0,0,0,40,0,0 +34,4,166545,1,9,0,0,3,0,1,0,0,40,0,0 +59,2,142182,1,9,1,4,1,0,0,0,0,40,0,1 +34,2,188798,0,13,0,3,3,0,1,0,0,40,0,0 +49,2,38563,0,13,0,1,0,0,1,0,0,56,0,1 +18,2,216284,2,7,0,0,3,0,1,0,0,20,0,0 +43,2,191547,1,9,1,7,1,0,0,0,0,40,4,0 +48,2,285335,2,7,1,1,1,0,0,0,0,50,0,0 +28,5,142712,5,10,1,1,1,0,0,0,0,70,0,0 +33,2,80945,1,9,1,8,1,0,0,0,0,40,0,0 +24,2,309055,5,10,0,5,0,0,1,0,0,15,0,0 +21,2,62339,12,6,0,2,0,0,0,0,0,40,0,0 +17,2,368700,2,7,0,5,3,0,0,0,0,28,0,0 +39,2,176186,5,10,1,7,1,0,0,0,0,50,0,1 +29,1,266855,0,13,4,3,3,0,0,0,0,40,0,0 +44,2,48087,0,13,1,1,1,0,0,0,0,40,0,1 +24,2,121313,5,10,0,6,3,0,0,0,0,50,0,0 +71,1,143437,3,14,1,5,1,0,0,10605,0,40,0,1 +51,1,160724,0,13,1,5,1,2,0,0,2415,40,26,1 +55,2,282753,11,3,2,4,4,1,0,0,0,25,0,0 +41,2,194636,0,13,1,1,1,0,0,0,0,60,0,1 +23,2,153044,1,9,0,2,4,1,1,0,0,7,0,0 +38,2,411797,9,11,2,0,4,0,1,0,0,40,0,0 +39,2,117683,1,9,1,6,1,0,0,0,0,40,0,1 +19,2,376540,1,9,0,0,0,0,1,0,0,30,0,0 +49,2,72393,4,5,2,8,0,0,1,0,0,40,0,0 +32,2,270335,0,13,1,0,5,0,0,0,0,40,11,1 +27,2,96226,1,9,1,10,1,0,0,0,0,70,0,0 +38,2,95336,0,13,1,5,1,0,0,0,0,50,0,1 +33,2,258498,5,10,1,10,2,0,1,0,0,60,0,0 +23,2,205865,0,13,0,1,3,0,0,0,0,28,0,0 +54,1,406468,1,9,1,5,1,1,0,0,0,40,0,0 +29,2,177119,9,11,2,9,0,0,1,2174,0,45,0,0 +35,1,372525,0,13,0,1,0,0,0,0,0,40,0,0 +28,2,164170,9,11,1,0,2,2,1,0,0,40,3,0 +37,2,183800,0,13,1,3,1,0,0,7688,0,50,0,1 +42,1,177307,10,15,1,7,1,0,0,0,0,65,0,1 +40,2,170108,3,14,1,3,1,0,0,0,0,40,0,0 +47,2,341995,5,10,2,5,3,0,0,0,0,55,0,0 +22,2,226508,0,13,0,1,3,0,1,0,0,50,0,0 +30,2,87418,0,13,1,1,1,0,0,0,0,45,0,1 +28,2,109165,1,9,1,9,1,0,0,0,0,40,0,0 +63,4,28856,7,4,1,4,1,0,0,0,0,55,0,0 +51,1,175897,4,5,1,10,1,0,0,0,0,20,0,0 +22,2,99697,1,9,0,2,3,0,1,0,0,40,0,0 +35,2,152375,1,9,0,5,0,0,0,0,0,45,0,0 +46,2,171550,1,9,2,8,0,0,1,0,0,38,0,0 +37,2,211154,5,10,2,8,0,0,0,0,0,52,0,0 +24,2,202570,0,13,0,3,3,1,0,0,0,15,0,0 +37,1,168496,1,9,2,2,3,0,0,0,0,10,0,0 +53,2,68898,5,10,1,9,1,0,0,0,0,40,0,0 +27,2,93235,1,9,0,5,0,0,0,0,0,30,0,0 +38,2,278924,5,10,2,10,0,0,0,0,0,44,0,0 +53,1,311020,12,6,1,7,1,0,0,0,0,60,0,0 +34,2,175878,5,10,0,10,0,0,0,0,0,40,0,0 +23,2,543028,1,9,0,5,3,1,0,0,0,40,0,0 +39,2,202027,0,13,1,1,1,0,0,15024,0,45,0,1 +43,2,158926,3,14,1,3,2,2,1,0,0,50,27,0 +67,5,76860,1,9,1,1,1,2,0,0,0,40,0,1 +81,1,136063,1,9,1,1,1,0,0,0,0,30,0,0 +21,2,186648,5,10,0,4,3,0,0,0,0,20,0,0 +23,2,257509,5,10,0,5,0,0,0,0,0,25,0,0 +25,2,98155,5,10,0,6,4,0,0,0,0,40,0,0 +42,2,274198,11,3,1,8,2,0,1,0,0,38,4,0 +38,2,97083,5,10,1,0,2,1,1,0,0,40,0,0 +32,2,262153,1,9,1,8,1,0,0,0,0,40,0,0 +37,2,214738,1,9,1,8,1,0,0,0,0,40,0,0 +51,2,138022,3,14,1,1,1,0,0,0,0,60,0,1 +22,2,91842,5,10,0,5,0,0,1,0,0,42,0,0 +33,2,373662,15,2,3,13,0,0,1,0,0,40,24,0 +42,2,162003,1,9,2,8,0,0,0,0,0,55,0,0 +51,4,241843,13,1,1,4,1,0,0,0,0,40,0,0 +23,2,375871,1,9,1,0,2,0,1,0,0,40,4,0 +37,2,186934,2,7,1,8,1,0,0,3103,0,44,0,1 +37,2,176900,1,9,1,10,1,0,0,0,0,99,0,1 +47,2,21906,3,14,0,3,0,0,1,0,0,25,0,0 +41,2,132222,10,15,1,3,1,0,0,0,2415,40,0,1 +33,2,143653,1,9,1,10,1,0,0,0,0,30,0,0 +31,2,111567,0,13,0,5,0,0,0,0,0,40,0,1 +31,2,78602,6,12,2,4,4,3,1,0,0,40,0,0 +35,2,465507,1,9,1,8,1,1,0,0,0,40,0,0 +38,5,196373,1,9,1,1,1,0,0,0,0,40,0,1 +18,2,293227,1,9,0,4,0,0,1,0,0,45,0,0 +20,2,241752,1,9,1,8,1,0,0,0,0,40,0,0 +54,4,166398,5,10,2,1,4,1,1,0,0,35,0,0 +40,2,184682,5,10,2,0,4,0,1,0,0,40,0,0 +36,5,108293,0,13,1,1,2,0,1,0,1977,45,0,1 +43,2,250802,5,10,2,10,4,0,0,0,0,35,0,0 +44,1,325159,5,10,2,7,4,0,0,0,0,40,0,0 +44,0,174675,1,9,1,3,2,0,1,0,0,40,0,1 +43,2,227065,3,14,1,1,1,0,0,0,0,43,0,1 +51,2,269080,7,4,6,4,4,1,1,0,0,40,0,0 +18,2,177722,1,9,0,4,3,0,1,0,0,20,0,0 +51,2,133461,5,10,1,1,1,0,0,0,0,40,0,0 +44,5,398473,5,10,1,5,1,0,0,0,0,70,0,1 +33,4,298785,12,6,2,6,0,0,0,0,0,40,0,0 +33,1,123424,0,13,1,1,1,0,0,0,0,40,0,1 +42,2,176286,6,12,1,1,1,0,0,0,0,40,0,1 +25,2,150062,5,10,1,3,1,0,0,0,0,45,0,0 +32,2,169240,1,9,2,8,0,0,1,0,0,38,0,0 +32,2,288273,0,13,1,10,1,0,0,0,0,70,4,0 +36,2,526968,12,6,2,1,4,0,1,0,0,40,0,0 +28,2,57066,1,9,1,6,1,0,0,0,0,40,0,0 +20,2,323573,1,9,0,4,3,0,1,0,0,20,0,0 +35,5,368825,5,10,1,5,1,0,0,0,0,60,0,1 +55,1,189721,1,9,1,10,1,0,0,0,0,20,0,0 +48,2,164966,0,13,1,1,1,2,0,0,0,40,3,1 +34,2,202046,1,9,1,10,1,0,0,0,0,35,0,1 +28,2,161538,0,13,0,9,0,0,1,0,0,35,0,0 +67,2,105252,0,13,6,1,0,0,0,0,2392,40,0,1 +37,2,200153,1,9,1,10,1,0,0,0,0,40,0,0 +44,2,32185,1,9,0,6,4,0,0,0,0,70,0,0 +25,2,178326,5,10,0,5,0,0,1,0,0,40,0,0 +21,2,255957,5,10,0,1,0,0,1,4101,0,40,0,0 +40,0,188693,3,14,1,3,1,0,0,0,0,35,0,1 +78,2,182977,1,9,6,4,0,1,1,2964,0,40,0,0 +34,2,159929,1,9,2,2,3,0,0,0,0,40,0,0 +49,2,123207,1,9,0,0,0,0,1,0,0,44,0,0 +22,2,284317,6,12,0,0,0,0,1,0,0,40,0,0 +60,1,154474,1,9,0,7,4,0,0,0,0,42,0,0 +45,4,318280,1,9,6,11,0,0,0,0,0,40,0,1 +63,2,254907,9,11,2,4,0,0,1,0,0,20,0,0 +41,2,349221,1,9,0,10,3,1,1,0,0,35,0,0 +47,2,335973,1,9,2,0,4,0,1,0,0,40,0,0 +44,2,126701,1,9,2,10,4,0,0,0,0,40,0,0 +51,2,122159,5,10,6,3,0,0,1,3325,0,40,0,0 +46,2,187370,0,13,0,5,0,0,0,0,1504,40,0,0 +41,2,194636,9,11,1,8,1,0,0,0,0,40,0,0 +50,1,124793,1,9,1,10,1,0,0,0,0,30,0,0 +47,2,192835,1,9,1,0,1,0,0,0,0,50,0,1 +35,2,290226,1,9,0,1,0,0,0,0,0,45,0,0 +56,2,112840,1,9,1,1,1,0,0,0,0,55,0,1 +45,2,89325,3,14,2,3,0,0,0,0,0,45,0,0 +48,3,33109,0,13,2,1,4,0,0,0,0,58,0,1 +40,2,82465,5,10,1,8,1,0,0,2580,0,40,0,0 +39,5,329980,0,13,1,1,1,0,0,15024,0,50,0,1 +20,2,148294,5,10,0,4,3,0,0,0,0,40,0,0 +50,2,168212,8,16,1,3,1,0,0,0,1902,65,0,1 +38,0,343642,1,9,1,3,2,0,1,0,0,40,0,1 +23,4,115244,0,13,0,3,3,0,1,0,0,60,0,0 +31,2,162572,1,9,0,4,3,0,0,0,0,16,0,0 +58,2,356067,0,13,1,0,1,0,0,0,0,40,0,0 +66,2,271567,1,9,4,8,0,1,0,0,0,40,0,0 +39,5,180804,1,9,1,1,1,0,0,0,0,40,0,1 +54,1,123011,1,9,1,10,1,0,0,15024,0,52,0,1 +26,2,109186,5,10,1,5,1,0,0,0,0,50,9,0 +51,2,220537,1,9,2,8,0,0,1,0,0,40,0,0 +34,2,124827,9,11,0,6,3,0,0,0,0,40,0,0 +50,2,767403,1,9,1,8,1,0,0,3103,0,40,0,1 +42,2,118494,5,10,1,3,1,0,0,0,0,44,0,1 +38,2,173208,3,14,1,3,1,0,0,0,0,25,0,0 +48,2,107373,7,4,1,2,1,0,0,0,0,40,0,0 +33,2,26973,9,11,1,9,2,0,1,0,0,40,0,1 +51,2,191965,1,9,6,4,4,0,1,0,0,32,0,0 +22,2,122346,1,9,2,10,0,0,0,0,0,40,0,0 +41,2,198316,5,10,0,10,0,0,0,0,0,50,28,0 +48,4,123075,3,14,1,3,1,0,0,0,0,35,0,1 +42,2,209370,1,9,4,5,0,0,1,0,0,30,0,0 +34,2,33117,5,10,1,4,1,0,0,0,0,40,0,0 +23,2,129042,1,9,0,8,4,1,1,0,0,40,0,0 +56,2,169133,1,9,1,4,1,0,0,0,0,50,29,0 +45,2,368561,1,9,1,1,1,0,0,0,0,55,0,1 +48,2,207848,12,6,1,0,2,0,1,0,0,40,0,0 +48,5,138370,3,14,3,5,0,2,0,0,0,50,3,0 +31,2,93106,9,11,0,0,0,0,1,0,0,40,0,0 +20,0,223515,6,12,0,4,3,0,0,0,1719,20,0,0 +27,2,389713,5,10,0,5,0,0,0,0,0,40,0,0 +32,2,206365,1,9,0,4,0,1,1,0,0,40,0,0 +37,2,123785,1,9,0,4,0,0,0,0,0,75,0,0 +34,2,289984,1,9,2,13,4,1,1,0,0,30,0,0 +90,2,137018,1,9,0,4,0,0,1,0,0,40,0,0 +23,2,137994,5,10,0,8,3,1,1,0,0,40,0,0 +43,2,341204,5,10,2,0,0,0,1,0,0,40,0,0 +44,2,167005,0,13,1,1,1,0,0,7688,0,60,0,1 +24,2,34446,5,10,0,9,0,0,1,0,0,37,0,0 +28,2,187160,10,15,2,3,4,0,0,0,0,55,0,0 +23,2,217961,5,10,1,4,1,0,0,0,0,40,0,0 +20,2,74631,5,10,0,5,0,0,1,0,0,50,0,0 +36,2,156667,0,13,1,3,1,0,0,0,1902,50,0,1 +61,2,125155,1,9,1,8,1,0,0,0,0,40,0,0 +53,1,263925,0,13,1,5,1,0,0,0,0,40,8,1 +30,2,296453,0,13,1,0,1,0,0,7298,0,40,0,1 +52,1,44728,5,10,1,5,1,0,0,0,0,55,0,1 +38,2,193026,5,10,2,10,0,0,0,0,0,40,10,0 +32,2,87643,0,13,1,5,1,0,0,0,0,40,0,0 +30,1,106742,14,8,1,6,1,0,0,0,0,75,0,0 +41,2,302122,9,11,2,10,0,0,1,0,0,40,0,0 +49,4,193960,3,14,1,3,1,0,0,0,1902,40,0,1 +45,2,185385,1,9,1,10,1,0,0,0,0,47,0,1 +43,1,277647,1,9,1,1,1,0,0,0,0,35,0,0 +61,2,128848,1,9,1,8,1,0,0,3471,0,40,0,0 +54,2,377701,1,9,1,4,1,0,0,0,0,32,4,0 +34,2,157886,6,12,4,4,4,0,1,0,0,40,0,0 +49,2,175958,5,10,1,5,1,0,0,0,0,80,0,1 +38,2,223004,5,10,0,4,3,0,0,0,0,40,0,0 +35,2,199352,10,15,1,3,1,0,0,0,1977,80,0,1 +36,2,29984,14,8,1,6,1,0,0,0,0,40,0,0 +30,2,181651,0,13,1,1,1,0,0,0,0,50,0,0 +36,2,117312,6,12,2,9,0,0,1,0,0,60,0,0 +22,4,34029,0,13,0,3,3,0,1,0,0,20,0,0 +38,2,132879,1,9,1,10,1,0,0,0,1902,40,0,1 +37,2,215310,1,9,1,10,1,0,0,0,0,50,0,1 +48,0,55863,8,16,1,3,2,0,1,0,1902,46,0,1 +17,2,220384,2,7,0,0,3,0,0,0,0,15,0,0 +19,1,36012,5,10,0,10,3,0,0,0,0,20,0,0 +27,2,137645,0,13,0,5,0,1,1,0,1590,40,0,0 +22,2,191342,0,13,0,5,3,2,0,0,0,50,18,0 +49,2,31339,1,9,1,10,1,0,0,0,0,40,0,0 +43,0,227910,9,11,1,3,2,0,1,0,0,40,0,1 +43,2,173728,0,13,4,3,4,0,1,0,0,40,0,0 +19,4,167816,1,9,2,1,0,0,1,0,0,35,0,0 +58,1,81642,1,9,1,7,1,0,0,0,0,60,0,0 +41,4,195258,5,10,1,11,1,0,0,0,0,40,0,1 +31,2,232475,5,10,1,0,1,0,0,0,0,40,0,0 +30,2,241259,9,11,1,6,1,0,0,0,0,40,0,0 +32,2,118161,1,9,1,11,1,0,0,0,0,40,0,0 +29,2,201954,0,13,0,1,0,0,0,0,0,35,0,0 +42,2,150533,5,10,1,1,1,0,0,7298,0,52,0,1 +38,2,412296,1,9,2,10,3,0,0,0,0,28,0,0 +41,3,133060,6,12,1,3,1,0,0,0,0,40,0,1 +44,1,120539,0,13,0,5,0,0,0,0,0,50,0,1 +31,2,196025,8,16,3,3,0,2,0,0,0,60,26,0 +34,2,107793,1,9,2,10,0,0,0,0,0,40,0,0 +21,2,163870,5,10,0,0,3,0,0,0,0,40,0,0 +22,1,361280,0,13,0,3,3,2,0,0,0,20,3,0 +62,2,92178,12,6,1,8,1,0,0,0,0,40,0,0 +29,5,260729,1,9,1,5,2,0,1,0,1977,25,0,1 +43,2,182254,5,10,2,3,4,0,1,0,0,40,0,0 +45,5,149865,0,13,1,8,1,0,0,0,0,60,0,1 +39,5,218184,4,5,1,1,1,0,0,0,1651,40,4,0 +41,2,118619,0,13,1,1,1,1,0,0,0,50,0,0 +34,1,196791,6,12,1,3,2,0,1,0,0,25,0,1 +34,4,167999,1,9,2,0,4,0,1,0,0,33,0,0 +31,2,51259,0,13,0,3,0,0,0,0,0,47,0,0 +29,2,131088,1,9,0,2,3,0,0,0,0,25,0,0 +41,2,118212,0,13,1,10,1,0,0,3103,0,40,0,1 +41,2,293791,9,11,1,6,1,0,0,0,0,55,0,0 +35,5,289430,3,14,1,5,1,0,0,0,0,45,4,1 +33,2,35378,0,13,1,5,2,0,1,0,0,45,0,1 +37,0,60227,0,13,0,0,0,0,0,0,0,38,0,0 +69,2,168139,1,9,1,5,2,0,1,0,0,40,0,0 +34,2,290763,1,9,2,2,3,0,1,0,0,40,0,0 +36,2,51100,5,10,1,10,1,0,0,0,0,40,0,0 +41,2,227644,1,9,1,6,1,0,0,0,0,50,0,0 +58,4,205267,0,13,1,3,2,0,1,0,0,40,0,1 +53,2,288020,0,13,1,3,1,2,0,0,0,40,28,0 +29,2,140863,5,10,1,9,1,0,0,0,0,40,0,0 +45,3,170915,1,9,2,9,0,0,1,4865,0,40,0,0 +34,0,50178,5,10,1,1,1,0,0,0,0,38,0,0 +36,2,112497,0,13,1,9,1,0,0,0,0,40,0,0 +48,2,95244,5,10,2,4,4,1,1,0,0,35,0,0 +20,2,117606,9,11,0,0,3,0,1,0,0,40,0,0 +35,2,89508,1,9,1,6,1,0,0,0,0,50,0,1 +63,3,124244,1,9,6,2,0,1,0,0,0,40,0,0 +41,1,154374,5,10,2,4,4,0,0,0,0,45,0,0 +28,2,294936,0,13,1,3,1,0,0,0,0,45,0,0 +30,2,347132,5,10,0,8,0,1,1,0,0,40,0,0 +31,2,316672,1,9,0,4,4,0,1,0,0,40,4,0 +37,2,189382,9,11,0,0,3,0,1,0,0,38,0,0 +31,2,184307,5,10,1,1,1,0,0,0,0,50,2,1 +46,1,246212,3,14,1,1,1,0,0,0,0,45,0,1 +35,3,250504,1,9,1,0,1,1,0,0,0,60,0,1 +27,2,138705,1,9,1,10,1,0,0,0,0,53,0,0 +41,2,328447,15,2,1,10,1,0,0,0,0,35,4,0 +19,2,194608,5,10,0,4,3,0,1,0,0,20,0,0 +20,2,230891,5,10,0,5,0,0,0,0,0,45,0,0 +59,3,212448,1,9,6,5,4,0,1,0,0,40,9,0 +40,2,214010,0,13,0,4,0,0,0,0,0,37,0,0 +56,1,200235,5,10,1,5,1,0,0,0,0,60,0,0 +33,2,354573,3,14,1,3,1,0,0,15024,0,44,0,1 +30,5,205733,5,10,0,1,0,0,1,0,0,60,0,0 +46,2,185041,1,9,1,8,1,0,0,0,0,50,0,0 +61,5,84409,1,9,1,1,1,0,0,0,0,35,0,1 +50,5,293196,1,9,1,1,1,0,0,7298,0,40,0,1 +25,2,241626,1,9,0,4,3,0,0,0,0,30,0,0 +40,2,520586,5,10,2,0,4,0,1,0,0,39,0,0 +51,2,302847,1,9,1,10,1,0,0,0,0,54,0,0 +43,0,165309,1,9,1,11,1,0,0,0,0,40,0,0 +34,2,117529,5,10,1,7,1,0,0,0,0,54,4,0 +46,2,106092,1,9,1,1,1,0,0,0,0,45,0,1 +28,0,445824,3,14,1,3,2,0,1,0,0,50,0,1 +20,2,275691,1,9,0,2,3,0,0,0,0,28,0,0 +44,2,193459,9,11,1,10,1,0,0,3411,0,40,0,0 +51,2,284329,1,9,6,6,4,0,0,0,0,40,0,0 +33,2,114691,0,13,1,5,1,0,0,0,0,60,0,1 +54,2,96062,6,12,1,9,1,0,0,0,0,40,0,1 +50,2,133963,0,13,1,3,2,0,1,0,1977,40,0,1 +33,2,178506,1,9,2,0,0,1,1,0,0,40,0,0 +65,2,350498,0,13,1,0,1,0,0,10605,0,20,0,1 +88,1,206291,10,15,1,3,1,0,0,0,0,40,0,0 +40,2,182302,1,9,2,6,0,0,0,0,0,40,0,0 +51,2,241346,1,9,2,0,0,0,1,0,0,43,0,0 +50,2,157043,2,7,2,4,0,1,1,0,0,40,0,0 +25,2,404616,3,14,1,7,0,0,0,0,0,99,0,1 +20,2,411862,9,11,0,4,0,0,0,0,0,30,0,0 +47,2,183013,1,9,1,4,1,0,0,0,0,40,0,0 +22,2,188544,9,11,0,0,3,0,1,0,0,30,0,0 +50,0,356619,1,9,1,3,1,0,0,0,0,48,0,1 +47,2,45857,1,9,0,0,4,0,1,0,0,40,0,0 +24,4,289886,2,7,0,4,0,2,0,0,0,45,0,0 +40,2,216237,0,13,2,1,0,0,1,0,0,45,0,1 +36,2,416745,0,13,1,3,1,0,0,0,0,40,0,0 +32,2,202952,1,9,1,0,1,0,0,0,0,40,0,0 +44,2,167725,1,9,1,10,1,0,0,0,0,40,0,0 +59,3,43280,5,10,0,1,3,1,1,0,0,40,0,0 +65,2,118779,1,9,1,10,1,0,0,0,0,30,0,0 +24,0,191269,0,13,0,0,0,0,1,0,0,65,0,0 +27,4,247507,0,13,0,3,3,0,0,0,0,35,0,0 +51,2,239155,9,11,2,4,0,0,0,0,0,40,0,0 +48,2,182862,5,10,1,10,1,0,0,0,0,40,0,1 +39,2,33886,1,9,1,6,1,0,0,0,0,60,0,0 +28,2,444304,0,13,1,9,1,0,0,0,0,40,0,0 +19,2,187161,5,10,0,4,3,0,1,0,0,25,0,0 +49,4,116892,0,13,2,3,0,1,1,0,0,40,0,0 +51,4,176813,6,12,1,3,1,0,0,0,0,60,0,0 +59,2,151616,3,14,1,3,1,0,0,0,0,55,0,0 +18,2,240747,1,9,0,8,3,0,1,0,0,40,21,0 +45,3,320818,1,9,1,0,1,1,0,0,0,80,0,1 +30,4,235271,0,13,1,3,1,0,0,0,0,50,0,1 +37,2,166497,0,13,2,10,0,0,0,0,0,35,0,0 +44,2,344060,0,13,0,4,0,0,0,0,0,40,0,1 +33,2,221196,5,10,1,10,1,1,0,0,0,40,0,0 +61,5,113544,3,14,1,5,1,0,0,0,0,40,0,1 +61,4,321117,1,9,1,11,1,0,0,0,0,40,0,0 +38,2,79619,0,13,1,5,1,0,0,0,0,42,0,1 +36,2,135289,1,9,1,8,1,0,0,0,0,45,0,0 +44,5,320984,5,10,1,5,1,0,0,5178,0,60,0,1 +37,2,203070,5,10,4,0,3,0,0,0,0,62,0,0 +31,2,32406,5,10,2,10,4,0,1,0,0,20,0,0 +54,2,99185,8,16,1,3,1,0,0,15024,0,45,0,1 +20,2,205839,5,10,0,4,3,0,0,0,0,16,0,0 +48,1,243631,5,10,1,10,1,3,0,7688,0,40,0,1 +31,2,231263,0,13,2,1,0,0,0,4650,0,45,0,0 +38,2,200818,10,15,1,3,1,0,0,0,0,40,0,1 +45,1,247379,1,9,1,10,1,0,0,0,0,40,0,1 +48,2,349151,1,9,1,10,1,0,0,0,0,40,0,0 +53,2,22154,5,10,1,10,1,0,0,0,0,40,0,0 +55,2,176317,1,9,6,0,3,0,1,0,0,40,0,0 +29,2,236436,1,9,0,0,0,0,1,0,0,40,0,0 +36,2,354078,0,13,1,3,1,0,0,0,0,60,0,1 +42,1,166813,5,10,1,7,1,0,0,0,0,60,0,0 +50,2,358740,1,9,2,0,4,0,1,0,0,40,7,0 +75,1,208426,10,15,1,3,1,0,0,0,0,35,0,0 +46,2,265266,0,13,1,3,1,0,0,0,1902,40,0,1 +52,3,31838,1,9,2,0,4,0,1,0,0,40,0,0 +27,2,175034,0,13,0,0,0,0,1,0,0,40,0,0 +43,2,413297,1,9,1,10,1,0,0,0,0,45,0,0 +31,2,106347,2,7,4,4,0,1,1,0,0,42,0,0 +23,2,174754,5,10,0,5,0,0,1,0,0,30,0,0 +34,2,441454,1,9,0,5,0,0,1,0,0,24,0,0 +41,1,209344,1,9,1,5,5,0,1,0,0,40,1,0 +31,2,185732,1,9,0,4,3,0,1,0,0,30,0,0 +42,2,65372,5,10,0,0,3,0,1,0,0,40,0,0 +35,2,33975,3,14,0,3,0,0,0,0,0,45,0,1 +55,2,326297,1,9,4,0,0,0,1,0,0,25,0,0 +36,0,194630,1,9,6,1,0,0,1,0,0,40,0,0 +65,1,167414,1,9,1,1,1,0,0,0,0,59,0,1 +38,4,165799,5,10,0,4,0,0,0,0,0,12,0,0 +62,2,192866,5,10,6,4,0,0,1,0,0,20,0,0 +54,5,166459,10,15,1,3,1,0,0,99999,0,60,0,1 +49,2,148995,1,9,2,0,0,0,0,0,0,40,0,0 +34,2,190040,1,9,1,0,2,0,1,0,0,40,0,0 +32,2,209432,1,9,0,2,3,0,1,0,0,40,0,0 +51,5,229465,3,14,1,1,1,0,0,15024,0,50,0,1 +48,1,397466,5,10,1,1,1,0,0,0,0,60,0,0 +52,3,202452,1,9,2,0,0,0,1,0,0,43,0,0 +28,1,218555,5,10,0,6,0,0,0,0,1762,40,0,0 +29,2,128604,1,9,1,10,1,2,0,0,0,40,0,0 +38,2,65466,0,13,0,0,0,0,1,0,0,50,0,0 +57,2,141326,1,9,1,5,1,0,0,0,0,50,0,1 +43,3,369468,0,13,1,3,1,0,0,0,0,40,0,1 +37,0,136137,5,10,4,0,0,0,0,0,0,40,0,0 +30,2,236770,1,9,1,10,1,0,0,0,0,40,0,0 +53,2,89534,1,9,1,6,1,0,0,0,0,48,0,1 +73,2,29778,1,9,6,4,0,0,1,0,0,37,0,0 +22,5,153516,5,10,0,10,3,0,0,0,0,35,0,0 +31,2,163594,1,9,0,5,0,0,1,0,0,45,0,0 +38,2,189623,0,13,1,3,1,0,0,0,1887,40,0,1 +50,1,343748,5,10,1,10,1,0,0,0,0,35,0,0 +37,2,387430,5,10,1,0,1,0,0,0,0,37,0,0 +44,4,409505,0,13,2,11,0,0,0,0,0,40,0,0 +47,2,200734,0,13,0,1,4,1,1,0,0,45,0,0 +27,2,115831,5,10,1,4,1,0,0,0,0,40,0,0 +28,2,150296,6,12,0,4,0,0,1,0,0,80,0,0 +25,2,323545,1,9,0,9,0,1,1,0,0,40,0,0 +20,2,232577,5,10,0,4,4,0,1,0,0,40,0,0 +51,4,152754,0,13,1,0,1,0,0,0,0,40,0,1 +46,2,129007,0,13,1,5,1,0,0,0,1977,40,0,1 +67,2,171584,0,13,1,11,1,0,0,6514,0,7,0,1 +47,2,386136,1,9,1,6,1,0,0,0,0,35,0,0 +42,2,342865,1,9,1,5,1,0,0,0,0,40,0,0 +52,2,186785,1,9,0,5,0,0,0,0,1876,50,0,0 +42,3,158926,6,12,2,3,4,2,1,0,0,40,11,1 +21,2,164019,5,10,0,7,3,1,0,0,0,10,0,0 +50,2,88926,1,9,1,0,2,0,1,5178,0,40,0,1 +46,2,188861,5,10,1,6,1,0,0,0,0,40,0,0 +47,1,370119,0,13,1,5,1,0,0,15024,0,50,0,1 +57,2,182062,12,6,1,4,1,0,0,0,0,40,0,0 +37,2,37238,0,13,0,1,0,0,0,0,0,45,0,0 +50,2,421132,1,9,1,10,1,0,0,0,0,40,0,0 +63,1,795830,15,2,6,4,4,0,1,0,0,30,22,0 +39,2,278403,1,9,1,6,1,0,0,0,0,65,0,0 +46,2,279661,3,14,1,3,1,1,0,0,0,35,0,0 +36,2,113397,1,9,1,2,1,0,0,0,0,40,0,0 +26,2,280093,11,3,1,10,1,0,0,0,1628,50,0,0 +21,2,236696,5,10,0,4,0,0,0,0,0,57,0,0 +41,2,265266,6,12,1,9,1,0,0,0,0,40,0,0 +44,4,34935,5,10,0,4,3,1,0,0,0,40,0,0 +22,2,58222,1,9,1,10,1,0,0,0,0,40,0,0 +29,3,301010,5,10,0,12,0,1,0,0,0,60,0,0 +29,2,419721,1,9,0,4,4,1,1,0,0,40,28,0 +58,5,186791,5,10,1,6,2,0,1,0,0,40,0,1 +36,1,180686,10,15,1,3,1,0,0,0,0,50,0,0 +30,2,209103,9,11,1,1,1,0,0,0,0,48,0,0 +37,2,32668,0,13,1,8,1,0,0,0,0,43,0,1 +29,2,256956,9,11,0,8,0,0,0,0,0,40,0,0 +26,2,202203,11,3,0,0,3,0,1,0,0,40,4,0 +43,2,85995,1,9,1,5,1,0,0,0,0,45,0,0 +49,2,125421,1,9,1,10,2,0,1,0,0,40,0,1 +45,3,283037,0,13,1,1,1,0,0,0,0,40,0,0 +28,2,192932,0,13,0,3,0,0,1,0,0,40,0,0 +51,2,179646,1,9,2,0,4,0,1,0,0,40,0,0 +32,2,509350,5,10,1,2,1,0,0,0,0,50,8,1 +24,2,96279,1,9,0,8,3,0,1,0,0,40,0,0 +35,2,119098,8,16,1,3,1,0,0,7298,0,40,0,1 +41,0,144928,0,13,1,3,1,0,0,0,0,40,0,1 +48,2,55237,0,13,1,10,1,0,0,0,0,45,0,1 +61,4,101265,1,9,6,0,4,0,1,1471,0,35,0,0 +20,2,114874,5,10,0,0,3,0,0,0,0,30,0,0 +27,2,190525,1,9,0,5,0,0,0,0,0,50,0,1 +55,2,121912,5,10,1,6,1,0,0,0,0,24,0,1 +39,2,83893,1,9,1,0,1,0,0,0,0,40,0,1 +52,2,168381,1,9,6,4,4,2,1,0,0,40,3,1 +24,2,293579,1,9,0,5,3,1,1,0,0,20,0,0 +29,2,285290,2,7,0,4,4,1,1,0,0,40,0,0 +25,2,188488,1,9,0,8,5,0,0,0,0,40,0,0 +20,2,324469,5,10,0,8,0,0,1,0,0,40,0,0 +23,2,275244,1,9,0,8,0,1,0,0,0,35,0,0 +57,2,265099,10,15,1,3,1,0,0,0,0,60,0,0 +51,2,146767,9,11,1,3,1,0,0,0,0,40,0,1 +33,2,40681,5,10,0,3,0,0,1,3674,0,16,0,0 +39,2,174938,0,13,0,3,0,0,0,0,0,40,0,0 +40,2,240124,1,9,1,1,1,0,0,0,0,40,0,1 +71,2,269708,0,13,2,9,3,0,1,2329,0,16,0,0 +38,0,34180,5,10,1,1,1,0,0,0,0,40,0,0 +28,0,225904,10,15,0,3,4,0,0,0,0,40,0,0 +57,2,89392,3,14,3,3,0,0,1,0,0,40,0,0 +47,2,46857,5,10,2,0,0,0,0,0,0,40,0,0 +59,0,105363,1,9,0,0,3,0,0,0,0,40,0,0 +26,2,195105,1,9,0,5,0,4,0,0,0,40,0,0 +35,2,184117,0,13,0,0,3,0,1,0,0,40,0,0 +61,5,134768,0,13,1,1,1,0,0,0,0,50,9,1 +34,2,467108,5,10,0,3,0,0,0,0,0,50,0,1 +32,5,199765,0,13,1,10,1,0,0,7688,0,50,0,1 +42,2,173938,1,9,4,5,3,0,1,0,0,40,0,0 +39,2,191161,5,10,1,10,1,0,0,0,0,40,0,0 +58,2,132606,11,3,2,8,0,1,0,0,0,40,0,0 +61,1,30073,1,9,1,7,1,0,0,0,1848,60,0,1 +40,2,155190,12,6,0,10,5,1,0,0,0,55,0,0 +31,2,42900,0,13,0,9,0,0,0,0,0,37,0,0 +36,2,191161,1,9,0,5,0,0,0,0,0,50,0,0 +23,2,181820,5,10,0,8,3,0,0,0,0,40,0,0 +33,2,105974,1,9,0,10,0,0,0,0,0,41,0,0 +52,2,146378,1,9,1,10,1,0,0,0,0,40,0,1 +22,2,103440,1,9,0,4,0,0,1,0,0,24,0,0 +51,2,203435,5,10,2,5,4,0,1,0,0,40,25,0 +31,3,168312,9,11,0,1,0,0,1,0,0,40,0,0 +49,5,257764,1,9,2,1,4,0,1,0,0,40,0,0 +49,2,171301,1,9,1,8,2,1,1,0,0,40,0,0 +53,3,225339,5,10,6,0,0,1,1,0,0,40,0,0 +52,2,152234,1,9,1,1,1,2,0,99999,0,40,28,1 +20,2,444554,12,6,0,2,3,0,0,0,0,40,0,0 +26,2,403788,6,12,0,4,3,1,0,0,0,40,0,0 +43,2,221550,3,14,0,4,0,0,1,0,0,30,12,0 +46,5,98929,0,13,1,5,1,0,0,0,0,52,0,0 +43,4,169203,9,11,0,0,0,0,1,0,0,35,0,0 +41,2,102332,1,9,2,5,4,1,1,0,0,40,0,0 +44,1,230684,1,9,1,6,1,0,0,0,0,55,0,0 +54,2,449257,1,9,1,7,1,0,0,0,0,40,0,0 +65,2,198766,3,14,1,5,1,0,0,20051,0,40,0,1 +32,2,97429,0,13,2,1,4,0,1,0,0,40,8,0 +25,2,208999,5,10,4,0,3,0,0,0,0,40,0,0 +23,2,37072,0,13,0,5,0,0,0,0,0,50,0,0 +25,4,163101,0,13,0,3,0,0,0,0,0,45,0,0 +19,2,119075,5,10,0,2,3,0,0,0,0,50,0,0 +37,1,137314,1,9,1,1,1,0,0,0,0,60,0,0 +45,2,127303,5,10,0,8,3,0,0,0,0,45,0,0 +37,2,349116,1,9,0,5,0,1,0,0,0,44,0,0 +40,1,266324,5,10,2,1,5,0,0,0,1564,70,10,1 +17,2,46496,2,7,0,4,3,0,0,0,0,5,0,0 +27,2,29904,0,13,0,9,0,0,1,0,0,40,0,0 +59,2,226922,1,9,2,5,4,0,1,0,1762,30,0,0 +19,3,234151,1,9,0,0,4,1,1,0,0,40,0,0 +43,2,238287,12,6,0,8,0,1,0,0,0,40,0,0 +42,2,230624,12,6,0,6,4,0,0,0,0,40,0,1 +54,2,398212,1,9,1,6,1,1,0,5013,0,40,0,0 +54,1,114758,3,14,1,5,1,0,0,0,0,50,0,0 +51,2,246519,12,6,1,2,1,0,0,2105,0,45,0,0 +50,2,137815,1,9,1,6,1,0,0,0,0,60,0,1 +40,2,260696,1,9,0,0,0,0,1,0,0,40,0,0 +55,2,325007,6,12,1,9,1,0,0,0,0,25,0,0 +50,2,113176,1,9,2,0,0,0,1,0,0,40,0,0 +31,2,66815,1,9,1,10,1,0,0,0,0,50,0,0 +24,2,241523,1,9,1,4,1,0,0,0,0,45,0,1 +30,2,30226,2,7,2,5,3,0,0,0,0,40,0,0 +39,4,352628,6,12,1,10,2,0,1,0,0,50,0,1 +37,2,143912,1,9,2,6,0,0,0,0,0,50,0,0 +33,2,130021,1,9,1,6,1,0,0,0,0,40,0,0 +48,2,329778,1,9,6,4,4,0,1,0,0,40,0,0 +43,5,196945,1,9,1,4,1,2,0,0,0,78,15,0 +39,2,24342,0,13,1,3,1,0,0,0,0,40,0,1 +53,2,34368,5,10,1,1,1,0,0,0,0,45,0,1 +52,1,173839,12,6,1,1,1,0,0,0,0,60,0,0 +28,0,73211,5,10,1,0,1,2,0,0,0,20,0,0 +32,2,86723,1,9,0,4,0,0,0,0,0,52,0,0 +31,2,179186,0,13,1,5,1,1,0,0,0,90,0,1 +31,2,127610,0,13,1,3,2,0,1,0,0,40,0,1 +47,2,115070,5,10,0,0,0,0,1,0,0,40,0,0 +40,2,256202,9,11,1,2,1,1,0,0,0,40,0,0 +40,2,202872,6,12,0,0,3,0,1,0,0,45,0,0 +41,2,184102,2,7,2,4,0,0,0,0,0,40,0,0 +53,3,130703,1,9,1,0,1,1,0,0,0,40,0,0 +46,2,134727,2,7,2,8,4,3,0,0,0,43,9,0 +45,5,36228,0,13,1,7,1,0,0,4386,0,35,0,1 +39,2,297847,4,5,1,4,2,1,1,3411,0,34,0,0 +19,2,213644,1,9,0,8,0,0,0,0,0,40,0,0 +57,2,173796,1,9,1,6,1,0,0,0,1887,40,0,1 +49,2,147322,9,11,1,8,2,0,1,0,0,40,30,0 +59,2,296253,1,9,2,1,0,0,1,0,0,40,0,0 +32,2,180871,9,11,2,5,0,0,0,0,0,50,0,1 +35,0,211115,5,10,0,11,0,1,0,0,0,40,0,0 +58,5,183870,12,6,1,6,2,0,1,0,0,40,0,0 +28,2,441620,0,13,0,4,0,0,0,0,0,43,4,0 +36,3,218542,6,12,1,0,2,0,1,0,0,40,0,1 +41,1,141327,3,14,2,3,4,0,1,0,0,35,0,0 +47,2,67716,1,9,1,5,1,0,0,0,0,40,0,1 +50,5,175339,1,9,1,10,1,0,0,0,1672,60,0,0 +36,2,336595,1,9,1,1,1,0,0,0,0,50,0,1 +38,2,27997,9,11,2,10,0,0,0,0,0,40,0,0 +56,1,145574,1,9,1,4,1,0,0,0,1902,60,0,1 +50,2,30447,9,11,1,6,1,0,0,0,0,45,0,0 +45,1,256866,5,10,1,5,1,0,0,5013,0,40,0,0 +44,1,120837,1,9,1,1,1,0,0,0,0,66,0,0 +51,2,185283,5,10,1,1,1,0,0,0,0,45,0,1 +44,5,229466,5,10,1,1,1,0,0,0,0,50,0,1 +25,2,298225,1,9,2,10,0,0,0,0,0,50,0,0 +60,2,185749,2,7,6,6,4,1,0,0,0,40,0,0 +49,5,125892,3,14,1,1,1,0,0,0,0,50,0,1 +46,2,563883,1,9,1,10,1,1,0,0,0,60,0,1 +56,2,311249,1,9,6,0,4,1,1,0,0,38,0,0 +25,2,221757,1,9,2,10,0,0,0,3325,0,45,0,0 +22,2,310152,5,10,0,6,0,0,0,0,0,40,0,0 +41,5,94113,10,15,1,3,1,0,0,0,0,60,0,1 +48,5,192945,1,9,1,1,1,0,0,7688,0,40,0,1 +46,2,161508,12,6,0,8,0,1,0,0,0,40,0,0 +30,2,177675,5,10,0,10,0,0,0,0,0,40,0,1 +39,2,51100,1,9,1,6,1,0,0,0,0,40,0,1 +40,2,100584,12,6,2,10,0,3,0,0,0,40,0,0 +70,3,163003,1,9,1,0,1,1,0,0,0,40,0,0 +35,2,67728,5,10,1,10,1,0,0,0,2051,45,0,0 +49,2,101320,3,14,2,1,0,0,1,0,0,75,0,0 +24,2,42706,9,11,0,11,0,0,0,0,0,60,0,0 +40,2,228535,6,12,1,3,1,0,0,7298,0,36,0,1 +61,2,120939,10,15,1,6,1,0,0,0,0,5,0,1 +25,2,98283,0,13,0,3,3,2,0,0,0,40,0,0 +28,4,216481,0,13,0,3,0,0,1,0,0,40,0,0 +69,0,208869,3,14,1,3,1,0,0,0,0,11,0,0 +22,2,207940,5,10,0,2,3,0,1,0,0,36,0,0 +47,2,34248,1,9,1,0,1,0,0,0,0,38,0,0 +38,2,83727,1,9,2,4,4,0,1,0,0,48,0,0 +26,2,183077,9,11,0,0,3,0,1,0,0,40,0,0 +17,2,197850,2,7,0,0,3,2,1,0,0,24,0,0 +33,1,235271,5,10,0,4,0,0,0,0,0,35,0,0 +43,1,35236,1,9,3,10,0,0,0,0,0,40,0,0 +58,2,255822,9,11,1,10,1,0,0,0,0,40,0,1 +53,5,263925,1,9,1,5,1,0,0,99999,0,40,0,1 +26,2,256263,1,9,0,10,0,0,0,0,0,25,0,0 +43,4,293535,0,13,1,3,1,1,0,0,0,40,0,1 +31,2,209448,12,6,1,7,1,0,0,2105,0,40,4,0 +30,2,57651,1,9,0,0,4,0,0,0,2001,42,0,0 +25,2,174592,1,9,0,4,3,0,1,0,0,25,0,0 +57,3,278763,1,9,2,0,4,0,1,0,0,40,0,0 +37,2,175232,3,14,2,1,4,0,0,0,0,60,0,1 +32,2,402812,5,10,1,5,1,0,0,0,0,48,0,0 +26,2,101150,1,9,2,1,0,0,1,0,0,41,0,0 +45,2,103538,1,9,1,0,1,0,0,0,0,40,0,1 +53,0,156877,1,9,1,0,1,0,0,15024,0,35,0,1 +27,2,23940,1,9,0,2,5,3,0,0,0,40,0,0 +28,5,210295,2,7,1,10,1,0,0,0,0,50,0,1 +32,2,80058,2,7,2,5,0,0,0,0,0,43,0,1 +35,2,187119,0,13,2,5,0,0,1,0,1980,65,0,0 +36,1,105021,5,10,1,1,1,0,0,0,0,55,0,1 +19,2,225775,5,10,0,0,0,0,0,0,0,40,0,0 +37,5,395831,0,13,1,1,1,0,0,0,0,80,0,1 +49,2,50282,5,10,2,8,0,0,0,3325,0,45,0,0 +20,2,32732,5,10,0,4,0,0,0,0,0,45,0,0 +64,5,179436,0,13,1,1,1,0,0,15024,0,55,0,1 +32,2,123253,6,12,1,10,1,0,0,0,0,42,0,0 +58,0,48433,1,9,1,1,1,0,0,0,0,40,0,0 +42,2,245317,1,9,1,5,1,0,0,0,0,50,0,0 +20,2,431745,5,10,0,0,0,1,1,0,0,14,0,0 +42,0,436006,5,10,1,0,1,1,0,0,0,40,0,0 +25,2,224943,5,10,3,3,4,1,0,0,0,40,0,0 +30,1,167990,9,11,1,3,1,0,0,15024,0,65,0,1 +37,5,217054,0,13,1,3,1,0,0,0,0,35,0,1 +66,1,298834,9,11,1,3,1,0,0,0,0,50,0,0 +59,5,125000,0,13,1,1,1,0,0,0,0,40,7,1 +44,2,123983,0,13,2,4,0,2,0,0,0,40,26,0 +46,2,155489,1,9,1,0,1,0,0,0,0,58,0,1 +59,2,284834,0,13,1,0,2,0,1,2885,0,30,0,0 +25,2,212495,0,13,0,1,3,0,0,0,1340,40,0,0 +17,4,32124,4,5,0,4,3,1,0,0,0,9,0,0 +47,4,246891,0,13,1,11,1,0,0,0,0,40,0,0 +47,0,141483,4,5,2,4,0,0,1,0,0,40,0,0 +30,2,31985,5,10,2,1,4,0,1,0,0,40,0,0 +20,2,170800,5,10,0,7,3,0,1,0,0,40,0,0 +26,4,166295,0,13,0,3,0,0,0,0,2339,55,0,0 +20,2,231286,5,10,0,2,0,1,0,0,0,15,0,0 +33,2,159322,1,9,2,4,4,0,0,0,0,40,0,0 +48,2,176026,1,9,1,8,1,0,0,0,0,40,0,0 +52,2,118025,0,13,1,1,1,0,0,99999,0,50,0,1 +37,2,26898,1,9,2,1,4,0,1,0,0,12,0,0 +47,2,232628,1,9,1,10,1,1,0,0,0,40,0,0 +40,2,85995,12,6,1,8,1,0,0,0,0,40,0,1 +48,2,125421,3,14,2,1,4,0,1,0,0,40,0,1 +49,2,245305,12,6,1,6,1,1,0,0,0,42,0,1 +50,2,73493,5,10,2,4,0,0,1,0,0,40,0,0 +30,2,197058,6,12,0,3,0,0,1,0,0,40,0,0 +34,2,122116,5,10,1,1,1,0,0,0,0,40,0,0 +43,2,75742,1,9,1,8,1,0,0,0,0,40,0,0 +22,2,214731,12,6,1,8,2,0,1,0,0,40,0,0 +35,2,265954,1,9,4,4,0,1,0,0,0,40,0,0 +26,0,197156,1,9,2,0,3,0,1,0,0,30,0,0 +62,2,162245,10,15,1,3,1,0,0,0,1628,70,0,0 +39,4,203070,1,9,4,11,0,0,0,0,0,40,0,0 +59,4,165695,5,10,1,10,1,0,0,0,0,40,0,0 +27,2,168107,0,13,1,10,1,0,0,0,0,40,0,0 +17,2,163494,12,6,0,5,3,0,0,0,0,30,0,0 +38,2,180342,0,13,1,0,1,0,0,0,0,40,0,0 +41,2,122381,5,10,1,10,1,0,0,0,1887,50,0,1 +27,2,148069,12,6,0,8,4,0,1,0,0,40,0,0 +23,2,200973,1,9,0,0,3,0,1,0,0,40,0,0 +17,2,130806,12,6,0,2,3,0,0,0,0,24,0,0 +56,2,117148,7,4,2,8,0,0,1,0,0,40,0,0 +24,2,213977,5,10,0,0,0,0,1,0,0,40,0,0 +44,2,139338,14,8,2,6,4,1,0,0,0,40,0,0 +23,2,315877,0,13,0,0,0,0,0,0,0,30,0,0 +25,2,352057,1,9,0,6,0,0,0,0,0,65,0,0 +21,2,236684,5,10,0,4,5,1,1,0,0,8,0,0 +18,2,208447,14,8,0,2,3,0,0,0,0,6,0,0 +45,2,149640,5,10,1,10,1,0,0,0,0,40,0,0 +51,2,154342,7,4,1,11,1,0,0,0,0,40,0,0 +42,3,141459,1,9,4,4,5,1,1,0,0,40,0,0 +47,2,111797,5,10,0,4,0,1,1,0,0,35,31,0 +29,2,111900,5,10,1,7,1,0,0,0,0,40,0,0 +33,2,78707,2,7,0,4,0,1,0,0,0,40,0,0 +43,4,160574,0,13,1,10,1,0,0,0,0,40,0,0 +44,2,216907,6,12,1,10,1,0,0,0,1848,40,0,1 +24,2,198148,5,10,0,4,3,0,0,0,0,30,0,0 +19,2,124265,5,10,0,2,3,0,0,0,0,40,0,0 +52,2,208137,9,11,1,0,1,0,0,0,0,40,0,0 +38,1,257250,1,9,0,7,0,0,0,0,0,52,0,0 +24,0,147253,5,10,0,9,0,0,0,0,0,50,0,0 +32,4,244268,0,13,0,3,0,0,0,0,0,50,0,0 +26,2,266912,1,9,1,5,1,0,0,0,0,50,0,1 +29,2,200511,0,13,1,5,1,0,0,0,0,50,0,0 +39,2,128715,1,9,2,0,0,0,0,10520,0,40,0,1 +48,1,65535,1,9,1,7,1,0,0,0,0,50,0,0 +40,2,103395,5,10,1,10,1,0,0,0,0,45,0,1 +51,2,71046,5,10,2,1,4,0,0,0,0,45,32,0 +28,1,125442,1,9,2,10,3,0,0,0,0,40,0,0 +22,2,169188,1,9,0,1,3,0,1,0,0,20,0,0 +23,2,121471,0,13,0,0,0,0,1,0,0,40,0,0 +65,2,207281,5,10,1,11,1,0,0,0,0,16,0,0 +26,4,46097,0,13,1,3,1,0,0,0,0,40,0,0 +38,1,322143,0,13,1,4,1,0,0,0,0,10,0,0 +33,2,149184,1,9,0,3,0,0,0,0,0,60,0,1 +33,4,119829,1,9,1,0,2,0,1,0,0,60,0,0 +37,2,910398,0,13,0,5,0,1,1,0,0,40,0,0 +19,2,176570,2,7,0,8,3,0,0,0,0,60,0,0 +24,2,216129,0,13,0,5,0,0,0,0,0,50,0,0 +30,2,27207,2,7,1,10,1,0,0,0,0,45,0,0 +57,0,68830,1,9,2,1,0,0,1,0,0,50,0,0 +22,0,178818,5,10,0,3,3,0,1,0,0,20,0,0 +57,2,236944,1,9,1,8,1,1,0,0,0,40,0,1 +46,0,273771,1,9,1,9,1,0,0,0,0,40,0,0 +67,2,318533,1,9,1,0,1,0,0,0,0,35,0,0 +47,2,102318,1,9,4,10,3,0,0,0,0,40,0,0 +39,2,379350,12,6,1,10,1,0,0,0,0,40,0,0 +50,2,21095,5,10,2,4,4,2,0,0,0,40,11,0 +58,1,211547,14,8,2,5,0,0,1,0,0,52,0,0 +36,2,85272,6,12,1,3,2,0,1,0,0,30,0,1 +45,2,46406,3,14,1,3,1,0,0,0,0,36,7,1 +54,2,53833,1,9,1,8,1,0,0,0,0,40,0,1 +26,2,161007,0,13,0,0,3,0,0,0,0,30,0,0 +60,2,53707,1,9,1,3,1,0,0,0,0,40,0,1 +46,2,370119,10,15,1,3,1,0,0,99999,0,60,0,1 +26,2,310907,5,10,1,1,2,0,1,0,0,35,0,0 +32,2,375833,2,7,0,10,5,0,0,0,0,40,0,0 +38,4,107513,1,9,1,6,1,0,0,0,0,40,0,0 +48,1,58683,5,10,1,5,1,0,0,0,0,70,0,1 +44,1,179557,1,9,1,1,1,0,0,0,1977,45,0,1 +37,2,70240,1,9,0,4,3,2,1,0,0,40,11,0 +44,2,147206,5,10,1,1,1,0,0,0,0,40,0,0 +31,2,175548,1,9,0,4,0,4,1,0,0,35,0,0 +61,1,163174,10,15,1,3,1,0,0,0,0,35,0,1 +51,2,126010,1,9,1,10,1,0,0,0,0,40,0,0 +52,2,147876,0,13,1,5,2,0,1,15024,0,60,0,1 +45,2,428350,1,9,1,8,2,0,1,0,1740,40,0,0 +39,2,328466,2,7,1,4,1,0,0,2407,0,70,4,0 +67,4,258973,1,9,2,4,0,0,1,0,0,24,0,0 +40,0,345969,6,12,1,0,1,0,0,0,0,40,0,1 +27,2,127796,11,3,0,7,0,0,0,0,0,35,4,0 +37,2,405723,15,2,1,8,1,0,0,0,0,40,4,0 +57,2,175942,5,10,1,1,1,0,0,0,0,50,0,1 +27,2,284196,12,6,2,4,0,0,1,0,0,40,0,0 +28,2,89718,1,9,0,5,0,0,1,2202,0,48,0,0 +34,5,175761,0,13,1,3,1,0,0,0,0,60,0,1 +54,2,206369,1,9,1,8,1,0,0,5178,0,50,0,1 +52,2,158993,1,9,2,4,5,1,1,0,0,38,0,0 +42,2,285066,0,13,1,3,1,0,0,0,0,45,0,1 +48,2,126754,3,14,1,3,1,0,0,15024,0,40,0,1 +65,0,209280,3,14,1,3,1,0,0,6514,0,35,0,1 +55,1,52888,10,15,1,3,2,0,1,0,0,10,0,0 +71,5,133821,1,9,1,0,2,0,1,0,0,20,0,1 +33,2,240763,5,10,1,8,1,1,0,0,0,40,0,0 +30,2,39054,1,9,1,5,1,0,0,0,0,40,0,0 +35,2,119272,0,13,1,1,1,0,0,0,0,55,0,1 +59,2,143372,12,6,2,0,0,1,1,0,0,40,0,0 +19,2,323421,5,10,0,2,3,0,0,0,0,20,0,0 +36,1,136028,4,5,1,10,1,0,0,0,0,30,0,0 +26,1,163189,1,9,0,5,3,0,0,0,0,40,0,0 +34,4,202729,1,9,1,11,1,0,0,0,0,40,0,0 +41,2,421871,1,9,1,10,1,1,0,0,0,40,0,1 +44,2,120277,0,13,1,3,1,0,0,15024,0,50,25,1 +47,2,198901,1,9,1,10,1,0,0,0,0,48,0,0 +18,2,214617,5,10,0,5,3,0,0,0,0,16,0,0 +55,1,179715,12,6,1,10,1,0,0,0,0,18,0,0 +49,4,107231,1,9,1,10,1,0,0,0,2002,40,0,0 +44,2,110355,0,13,1,1,1,0,0,0,0,40,0,1 +43,2,184378,0,13,0,3,0,0,0,0,0,40,0,0 +62,2,273454,7,4,1,11,1,0,0,0,0,40,1,0 +44,2,443040,1,9,1,2,1,1,0,0,0,40,0,0 +50,5,160151,5,10,1,5,1,0,0,0,0,60,0,1 +35,2,107991,2,7,0,5,0,0,0,0,0,45,0,0 +52,2,94391,1,9,1,0,1,0,0,0,0,40,0,0 +46,2,99835,10,15,1,3,1,0,0,0,0,60,0,1 +44,2,43711,6,12,1,5,1,0,0,7688,0,40,0,1 +43,2,83756,5,10,0,1,4,0,0,0,0,50,0,0 +51,2,120914,7,4,1,10,1,0,0,2961,0,40,0,0 +20,2,180052,5,10,0,5,3,0,0,0,0,20,0,0 +47,2,170846,6,12,1,0,2,0,1,0,0,40,25,1 +43,2,37937,3,14,2,1,4,0,0,0,0,50,0,0 +24,2,38455,5,10,0,10,0,0,0,0,0,40,0,0 +27,3,128059,5,10,1,10,1,0,0,0,0,50,0,0 +32,2,420895,1,9,1,6,1,0,0,0,0,40,0,0 +37,2,166744,1,9,2,4,4,0,1,0,0,12,0,0 +26,2,238768,1,9,1,8,1,0,0,0,0,60,0,0 +43,2,176270,0,13,1,1,1,0,0,99999,0,60,0,1 +50,2,140592,1,9,1,8,2,0,1,0,0,40,0,0 +20,1,211466,1,9,0,6,3,0,0,0,0,80,0,0 +37,2,188540,1,9,1,1,1,0,0,0,1902,45,0,1 +43,2,39581,1,9,0,4,0,1,1,0,0,45,0,0 +37,2,171150,1,9,1,1,1,0,0,0,1887,50,0,1 +53,2,117496,4,5,2,4,0,0,1,0,0,36,8,0 +44,2,145160,8,16,1,3,1,0,0,0,0,40,0,1 +25,2,28520,1,9,0,4,0,0,1,0,0,40,0,0 +17,2,103851,2,7,0,0,3,0,1,1055,0,20,0,0 +19,2,375077,1,9,0,5,3,0,0,0,0,50,0,0 +53,0,281590,1,9,1,1,2,0,1,15024,0,40,0,1 +44,2,151504,5,10,1,5,1,0,0,0,0,50,0,0 +51,2,415287,1,9,1,8,1,1,0,0,1902,40,0,1 +49,2,32212,1,9,1,1,2,0,1,0,0,43,0,0 +35,2,123606,5,10,1,2,1,0,0,0,0,40,0,0 +44,2,202565,1,9,2,10,0,0,0,0,0,45,0,0 +54,2,177927,3,14,1,3,1,0,0,0,0,60,0,0 +37,2,256723,5,10,2,0,4,1,1,0,0,35,0,0 +18,2,46247,5,10,0,4,3,0,1,0,0,15,0,0 +24,2,266926,5,10,1,2,1,0,0,0,0,40,0,0 +29,2,112031,1,9,2,10,0,0,1,0,0,50,0,0 +35,2,168817,1,9,0,8,0,0,0,0,0,40,0,0 +56,2,187487,1,9,1,10,1,0,0,0,0,48,0,1 +24,2,67222,0,13,0,8,0,2,0,0,0,45,26,0 +43,2,201723,3,14,1,1,1,0,0,0,1902,40,0,1 +73,2,267408,1,9,6,5,5,0,1,0,0,15,0,0 +49,2,105444,14,8,1,8,1,0,0,0,0,39,0,0 +38,2,156728,0,13,1,5,1,0,0,0,0,40,0,1 +31,2,148600,1,9,1,8,1,1,0,0,0,40,0,0 +39,2,19914,5,10,2,0,4,3,1,0,0,40,0,0 +42,2,190767,0,13,2,0,0,0,1,0,0,40,0,0 +41,2,233955,3,14,1,3,1,2,0,0,0,45,26,1 +35,2,30381,0,13,1,5,1,0,0,0,0,45,0,1 +38,2,187069,1,9,1,6,1,0,0,0,0,45,0,0 +31,2,367314,1,9,2,0,0,0,1,0,0,40,0,0 +51,4,101119,1,9,1,11,1,0,0,0,0,70,0,0 +38,2,86551,0,13,2,5,0,0,0,0,0,48,0,1 +40,4,218995,5,10,1,1,1,0,0,0,0,42,0,1 +21,2,57711,1,9,0,4,0,0,1,0,0,30,0,0 +44,2,303521,5,10,2,10,0,0,0,0,0,40,0,0 +55,2,199067,1,9,1,10,1,0,0,0,0,40,0,1 +29,2,247445,1,9,2,5,0,0,0,0,0,45,0,0 +49,2,186078,3,14,1,3,2,0,1,0,0,50,0,1 +31,2,77634,9,11,1,4,1,0,0,0,0,42,0,0 +24,2,180060,3,14,0,1,3,0,0,6849,0,90,0,0 +46,2,56482,5,10,0,1,0,1,0,0,0,40,0,0 +26,2,314177,1,9,0,5,0,1,0,0,0,40,0,0 +35,2,239755,0,13,0,4,0,0,0,0,0,38,0,0 +27,2,377680,9,11,0,5,0,0,0,0,0,50,0,0 +64,1,134960,0,13,1,1,1,0,0,15024,0,35,0,1 +26,2,294493,0,13,0,10,5,0,0,0,0,40,0,0 +21,2,32616,1,9,0,4,0,0,1,0,1719,16,0,0 +57,4,52267,1,9,1,6,1,0,0,0,0,72,0,0 +30,2,117963,0,13,1,0,1,0,0,0,0,40,0,1 +45,2,98881,2,7,1,4,2,0,1,0,0,32,0,0 +50,2,196963,7,4,2,10,0,0,1,0,0,30,0,0 +38,2,166988,0,13,0,0,3,0,1,0,0,40,0,0 +43,1,193459,5,10,1,10,1,0,0,0,0,60,0,0 +42,2,182342,5,10,6,1,0,0,1,0,0,55,0,0 +32,2,496743,0,13,0,3,3,0,0,0,0,40,0,0 +20,2,154781,1,9,0,0,0,0,1,0,0,40,0,0 +27,2,219371,1,9,0,4,0,0,1,0,0,35,0,0 +45,2,99179,2,7,6,0,4,0,1,0,0,40,0,0 +40,2,224910,1,9,0,8,0,0,1,0,0,40,0,0 +38,2,304651,1,9,2,6,0,0,0,0,0,60,0,0 +37,2,349689,1,9,2,0,4,0,1,0,0,40,0,0 +60,2,106850,12,6,2,8,0,0,1,0,0,40,0,0 +53,1,196328,1,9,1,1,1,1,0,0,0,45,0,1 +25,2,169323,0,13,1,1,3,0,1,0,0,40,0,0 +47,1,162924,0,13,2,1,0,2,0,0,0,60,28,0 +40,1,34037,1,9,0,7,0,0,0,0,0,70,0,0 +19,2,197384,5,10,0,4,3,0,1,0,0,10,0,0 +42,2,251795,5,10,1,3,2,0,1,0,0,50,0,1 +41,2,165309,0,13,2,0,4,0,1,0,0,40,0,0 +28,2,215873,12,6,0,8,3,1,0,0,0,45,0,0 +46,2,133938,3,14,2,1,0,0,1,27828,0,50,0,1 +49,2,159816,0,13,1,3,2,0,1,99999,0,20,0,1 +24,2,228424,1,9,0,2,5,1,0,0,0,40,0,0 +32,2,195576,2,7,1,8,1,0,0,0,0,40,0,0 +71,2,105200,1,9,1,11,1,0,0,6767,0,20,0,0 +26,2,167350,5,10,1,9,1,0,0,3103,0,40,0,1 +29,2,52199,1,9,3,11,0,0,0,0,0,40,0,0 +50,2,171338,5,10,1,1,1,0,0,99999,0,50,0,1 +51,2,120173,9,11,1,10,1,0,0,3103,0,50,0,1 +49,2,169818,1,9,1,4,2,1,1,0,0,40,0,1 +31,2,288419,12,6,1,8,1,0,0,0,0,40,0,0 +23,2,207546,2,7,1,8,1,0,0,0,0,40,0,0 +59,4,147707,1,9,6,7,4,0,0,0,2339,40,0,0 +43,2,193882,5,10,1,5,1,0,0,7688,0,40,0,1 +38,2,31033,0,13,1,5,1,0,0,7298,0,40,0,1 +37,2,272950,1,9,1,1,1,0,0,0,0,40,0,0 +29,2,183523,12,6,0,4,3,0,0,0,0,40,0,0 +39,2,238415,0,13,1,1,1,0,0,0,0,50,0,1 +31,2,19302,6,12,0,0,0,0,0,2202,0,38,0,0 +42,4,339671,0,13,3,3,0,0,1,8614,0,45,0,1 +35,4,103260,3,14,1,3,2,0,1,0,0,35,0,1 +39,2,79331,3,14,1,1,1,2,0,15024,0,40,0,1 +40,2,135056,6,12,2,0,4,0,1,0,0,40,0,0 +66,2,142723,11,3,3,2,4,0,1,0,0,40,5,0 +30,3,188569,4,5,1,9,1,0,0,0,0,40,0,0 +43,2,57322,6,12,2,10,0,0,0,0,0,40,0,0 +47,2,178309,4,5,0,4,4,0,1,0,0,50,0,0 +45,2,166107,3,14,0,0,0,2,1,0,0,40,11,0 +31,2,53042,5,10,1,8,1,1,0,0,0,40,33,0 +33,2,155343,1,9,1,5,1,0,0,3103,0,40,0,1 +32,2,35595,0,13,0,0,0,0,0,0,0,40,0,0 +28,2,429507,6,12,1,2,1,1,0,0,0,40,0,0 +50,3,159670,1,9,1,0,1,0,0,0,0,40,0,1 +63,2,151210,7,4,2,5,0,0,1,0,0,40,0,0 +28,2,186792,0,13,1,0,1,0,0,0,0,40,0,0 +38,2,204640,5,10,6,0,4,1,1,0,0,40,0,0 +52,2,87205,1,9,2,4,0,0,1,0,0,38,0,0 +38,5,112847,10,15,1,3,1,2,0,0,0,40,0,1 +41,2,107306,1,9,0,1,0,0,0,2174,0,40,0,0 +50,0,211319,3,14,0,3,0,0,0,0,0,38,0,0 +59,2,183606,2,7,1,8,1,0,0,0,0,40,0,0 +32,2,205390,1,9,1,5,1,0,0,0,0,49,0,0 +73,4,232871,7,4,1,11,1,0,0,2228,0,10,0,0 +52,5,101017,1,9,2,1,4,0,0,0,0,38,0,0 +57,2,114495,1,9,1,1,1,0,0,0,0,60,0,0 +35,2,183898,9,11,1,1,1,0,0,7298,0,50,0,1 +51,2,163921,0,13,1,6,1,0,0,0,0,56,0,1 +22,2,311764,2,7,6,5,3,1,1,0,0,35,0,0 +49,2,188330,1,9,1,5,1,0,0,0,0,40,0,1 +22,2,267174,1,9,0,2,3,1,0,0,0,40,0,0 +46,4,36228,1,9,1,10,1,0,0,0,1902,40,0,0 +48,2,199739,1,9,2,10,4,0,1,0,0,40,0,0 +43,0,206139,0,13,1,0,1,0,0,0,0,50,0,1 +25,2,282063,7,4,1,2,1,0,0,0,0,40,4,0 +31,2,332379,7,4,0,10,0,0,0,0,0,40,0,0 +19,2,418324,5,10,0,5,3,0,0,0,0,36,0,0 +51,2,158948,1,9,1,6,1,0,0,0,0,84,0,1 +51,2,221532,0,13,2,1,4,0,0,0,0,40,0,1 +22,1,202920,1,9,0,3,4,0,1,99999,0,40,21,1 +37,4,118909,1,9,2,0,4,1,1,0,0,35,0,0 +19,2,286469,5,10,0,5,3,0,1,0,0,30,0,0 +45,2,191914,1,9,2,6,4,0,1,0,0,55,0,0 +21,0,142766,5,10,0,4,3,0,0,0,0,10,0,0 +52,2,198744,1,9,6,5,0,0,1,0,0,40,0,0 +46,4,272780,5,10,1,3,1,0,0,0,0,24,0,0 +42,0,219553,3,14,2,3,0,0,1,0,0,38,0,0 +56,2,261232,1,9,0,10,0,0,0,0,0,40,0,0 +23,2,64292,1,9,0,0,0,0,1,0,0,40,0,0 +58,2,312131,3,14,1,5,1,0,0,0,0,40,0,0 +70,2,30713,1,9,1,7,1,0,0,0,0,30,0,0 +30,2,246439,5,10,2,0,4,0,0,0,0,40,0,0 +45,2,338105,0,13,1,0,1,2,0,0,0,40,11,0 +23,2,228243,5,10,0,10,0,0,0,0,0,44,0,0 +34,4,62463,5,10,1,6,1,0,0,0,1579,40,0,0 +38,2,31603,0,13,1,10,2,0,1,0,0,40,0,0 +24,2,165054,9,11,1,10,1,0,0,0,0,40,0,0 +53,2,121618,7,4,0,6,0,3,0,0,0,40,0,0 +45,3,273194,1,9,0,6,0,1,0,3325,0,40,0,0 +21,2,538319,5,10,0,4,3,0,1,0,0,40,5,0 +34,2,238246,0,13,0,3,0,0,1,0,0,40,0,0 +32,5,244665,1,9,1,10,1,0,0,5178,0,45,0,1 +21,2,131811,1,9,1,2,1,0,0,0,0,40,0,0 +23,2,156807,4,5,0,2,3,1,0,0,0,36,0,0 +28,2,236861,0,13,2,10,4,0,0,0,0,50,0,0 +29,1,229842,1,9,0,6,4,1,0,0,0,45,0,0 +25,4,190057,0,13,0,3,3,0,1,0,0,40,0,0 +44,0,55076,3,14,0,3,0,0,1,0,0,60,0,0 +18,2,152545,1,9,0,4,3,0,1,0,0,8,0,0 +26,2,153434,1,9,0,4,3,0,0,0,0,24,0,0 +47,4,171095,6,12,1,0,2,0,1,0,0,35,0,1 +23,2,239322,1,9,2,5,0,0,0,0,0,40,0,0 +46,2,138999,5,10,1,8,1,0,0,0,0,40,0,0 +61,4,95450,0,13,1,1,1,0,0,5178,0,50,0,1 +25,2,176520,1,9,0,10,5,0,0,0,0,40,0,0 +38,4,72338,1,9,1,11,1,2,0,0,0,54,0,1 +23,2,235722,5,10,0,4,0,0,0,0,0,20,0,0 +36,3,128884,1,9,2,0,0,0,1,0,0,48,0,0 +46,2,187226,4,5,2,4,0,0,0,0,0,25,0,0 +32,1,298332,0,13,1,3,1,0,0,0,0,45,0,1 +40,2,173607,12,6,1,6,1,0,0,0,0,40,0,0 +31,2,226756,1,9,0,0,3,1,0,0,0,40,0,0 +31,2,157887,5,10,1,1,1,0,0,0,0,65,0,1 +32,0,171111,0,13,0,0,0,0,0,0,0,37,0,0 +21,2,126314,5,10,0,4,3,0,0,0,0,10,0,0 +63,2,174018,5,10,1,5,1,1,0,0,0,40,0,1 +44,2,144778,5,10,4,1,0,0,0,0,0,45,0,1 +42,1,201522,0,13,1,5,1,0,0,0,0,60,0,0 +30,2,399088,5,10,2,0,0,0,1,0,0,45,0,0 +24,2,282202,1,9,0,4,4,0,0,0,0,40,22,0 +42,2,102606,0,13,1,9,1,0,0,0,0,40,0,1 +44,1,246862,1,9,1,3,2,0,1,0,0,40,25,1 +27,3,508336,0,13,0,1,0,1,0,0,0,48,0,0 +27,4,263431,5,10,0,1,4,0,0,0,0,40,0,0 +22,2,235733,1,9,0,4,0,0,1,0,0,45,0,0 +68,2,107910,1,9,0,5,0,0,1,0,0,40,0,0 +55,1,184425,5,10,1,7,1,0,0,0,0,99,0,1 +22,1,143062,1,9,0,4,3,0,0,0,0,40,34,0 +25,2,199545,5,10,1,1,2,0,1,0,0,15,0,0 +68,1,197015,1,9,1,7,1,0,0,0,0,45,0,0 +62,2,149617,5,10,6,1,0,0,1,0,0,16,0,0 +26,2,33610,1,9,2,4,5,0,0,0,0,40,0,0 +34,2,192002,3,14,1,3,1,0,0,0,0,55,0,1 +68,2,67791,5,10,6,5,0,0,0,0,0,40,0,0 +42,4,445382,0,13,4,1,0,0,0,0,0,45,0,1 +45,2,112283,0,13,1,5,1,0,0,0,0,55,0,0 +26,2,157249,2,7,0,6,0,0,0,0,0,40,0,0 +25,2,109872,1,9,1,8,1,0,0,0,0,45,0,0 +23,2,119838,0,13,0,3,3,0,0,0,0,50,0,0 +65,6,27012,7,4,6,7,4,0,1,0,0,50,0,0 +31,2,91666,1,9,0,6,0,0,0,0,0,50,0,0 +26,2,270276,1,9,0,0,0,0,1,0,0,40,0,0 +39,2,179271,5,10,1,10,1,0,0,0,0,50,0,1 +44,2,161819,1,9,1,8,1,0,0,0,0,40,0,1 +45,4,339681,3,14,2,3,4,0,1,1506,0,45,0,0 +26,1,219897,3,14,0,3,0,0,1,0,0,50,0,0 +26,2,91683,12,6,1,6,1,0,0,0,0,35,0,0 +36,2,188834,4,5,1,6,1,0,0,0,0,50,0,0 +38,2,187046,2,7,1,10,1,0,0,0,0,45,0,0 +39,2,191807,1,9,0,8,4,0,0,0,0,48,0,0 +52,5,179951,10,15,1,1,1,0,0,0,0,40,0,0 +39,2,324420,15,2,1,10,1,0,0,0,0,45,4,0 +41,1,66632,5,10,2,10,0,0,0,0,0,40,0,0 +42,4,121718,3,14,1,1,1,0,0,0,1902,60,0,1 +47,2,162034,0,13,1,5,1,0,0,0,0,70,0,0 +28,4,218990,9,11,1,11,1,1,0,0,0,46,0,0 +25,4,125863,0,13,0,3,3,0,0,0,0,35,0,0 +35,2,225330,0,13,0,0,0,0,1,0,0,40,0,0 +32,2,120426,1,9,4,0,4,0,1,0,0,40,0,0 +38,2,119741,3,14,1,10,1,1,0,0,0,40,0,1 +44,2,32000,5,10,1,9,1,0,0,0,0,18,0,1 +27,2,278581,0,13,0,5,3,0,1,0,0,40,0,0 +30,2,230224,0,13,0,1,0,0,0,0,0,55,0,1 +30,2,204374,0,13,0,5,0,0,0,0,1741,48,0,0 +45,2,188386,1,9,1,2,1,0,0,0,1628,45,0,0 +20,2,164922,1,9,0,10,3,0,0,0,0,40,0,0 +57,2,195176,3,14,0,3,0,0,0,0,0,80,0,0 +43,2,166740,5,10,2,0,0,0,0,0,0,48,0,0 +28,2,162551,7,4,1,8,5,2,1,0,0,48,26,0 +25,2,211231,1,9,1,9,5,0,1,0,0,48,0,1 +25,2,169990,1,9,1,5,1,0,0,0,0,40,0,0 +90,2,221832,0,13,1,1,1,0,0,0,0,45,0,0 +38,4,255454,0,13,4,3,4,1,0,0,0,40,0,0 +35,2,28160,0,13,3,1,4,0,1,0,0,40,0,0 +50,0,159219,0,13,1,1,1,0,0,0,0,40,8,1 +26,4,103148,1,9,0,0,0,0,1,0,0,40,0,0 +39,2,165186,5,10,1,7,1,0,0,0,0,45,0,0 +56,2,31782,12,6,1,5,1,0,0,0,0,40,0,0 +24,4,249101,1,9,2,11,4,1,1,0,0,40,0,0 +46,2,243190,1,9,1,0,2,0,1,7688,0,40,0,1 +18,4,153405,2,7,0,0,5,0,1,0,0,25,0,0 +37,2,329980,3,14,1,1,1,0,0,0,2415,60,0,1 +57,2,176079,3,14,2,3,0,0,1,0,0,40,0,0 +43,0,218542,1,9,0,0,4,1,1,0,0,40,0,0 +29,0,303446,0,13,1,3,1,0,0,0,0,25,35,0 +40,2,102606,3,14,1,1,1,0,0,0,0,40,0,1 +44,1,483201,0,13,1,1,1,0,0,0,0,40,0,0 +77,4,144608,1,9,1,1,1,0,0,0,0,6,0,0 +30,2,226013,0,13,0,3,0,1,0,0,0,40,0,0 +21,2,165475,1,9,1,8,1,0,0,0,0,40,0,0 +66,2,263637,12,6,1,11,1,0,0,0,0,40,0,0 +40,2,201495,2,7,0,6,3,0,0,0,0,35,0,0 +68,2,213720,1,9,1,5,1,0,0,0,0,40,0,0 +64,2,170483,1,9,6,4,0,0,1,0,0,38,0,0 +26,2,214303,0,13,0,3,0,0,1,0,0,50,0,0 +32,2,190511,5,10,1,1,1,0,0,0,0,40,0,1 +32,2,242150,1,9,0,0,3,0,0,0,0,38,0,0 +51,4,159755,3,14,1,3,1,0,0,0,0,40,0,1 +50,2,147629,3,14,1,3,1,0,0,15024,0,45,0,1 +49,2,268022,0,13,1,5,1,0,0,0,0,50,0,1 +28,2,188711,0,13,0,6,4,0,0,0,0,20,0,0 +29,2,452205,1,9,2,4,4,0,1,0,0,36,0,0 +21,2,260847,5,10,0,5,3,0,0,0,0,30,0,0 +28,2,291374,1,9,0,0,4,1,1,0,0,40,0,0 +55,2,189933,12,6,1,10,1,0,0,0,0,40,0,0 +45,1,133969,1,9,1,5,1,2,0,0,0,50,27,1 +35,2,330664,5,10,0,5,0,0,0,0,0,40,0,0 +26,2,122999,3,14,0,3,0,0,0,8614,0,40,0,1 +30,2,111415,1,9,1,4,1,0,0,0,0,55,9,0 +33,2,217235,1,9,1,5,1,0,0,0,0,20,0,0 +40,2,121956,0,13,3,3,0,2,0,13550,0,40,14,1 +23,2,120172,0,13,0,1,0,0,0,0,0,40,0,0 +35,2,343403,5,10,0,5,0,0,1,0,0,40,0,0 +48,1,104790,2,7,1,7,1,0,0,0,0,50,0,1 +39,4,473547,12,6,2,2,3,1,0,0,0,40,0,0 +53,4,260106,10,15,2,3,0,0,1,0,0,50,0,0 +49,3,168232,1,9,1,0,1,0,0,0,0,40,0,1 +31,2,348491,0,13,0,1,0,1,1,0,0,40,0,0 +36,2,24106,1,9,1,10,1,0,0,3103,0,40,0,1 +60,5,197553,5,10,1,1,1,0,0,7688,0,50,0,1 +29,2,421065,1,9,0,8,0,0,0,0,0,48,0,0 +54,5,138852,5,10,1,5,1,0,0,0,0,45,0,1 +34,2,379412,1,9,1,10,1,0,0,0,0,50,0,0 +30,2,181992,5,10,0,5,0,1,1,0,0,35,0,0 +26,2,236564,1,9,0,2,0,0,0,0,0,40,0,0 +47,2,363418,5,10,0,5,0,0,0,0,0,70,0,1 +50,2,112351,1,9,2,1,4,0,0,0,0,38,0,0 +30,2,204704,0,13,0,1,4,0,1,0,0,45,0,1 +44,2,54611,5,10,2,8,0,0,0,0,0,50,0,0 +49,2,128132,1,9,1,5,1,0,0,0,0,60,0,1 +75,1,30599,3,14,3,3,0,0,1,0,0,50,0,0 +37,2,379522,0,13,1,5,1,0,0,0,0,55,0,1 +51,0,196504,1,9,2,10,4,0,0,0,0,38,0,0 +35,2,82552,1,9,0,10,4,0,0,0,0,35,0,0 +28,2,104024,5,10,0,5,5,0,1,0,0,40,0,0 +66,1,293114,1,9,1,7,1,0,0,1409,0,40,0,0 +72,2,74141,4,5,1,1,2,2,1,0,0,48,0,1 +39,2,192337,0,13,4,5,0,0,0,0,0,50,0,0 +27,2,262478,1,9,0,7,3,1,0,0,0,30,0,0 +57,2,185072,5,10,0,0,5,1,1,0,0,40,2,0 +24,2,296045,7,4,1,10,1,0,0,2635,0,38,0,0 +28,2,246595,1,9,0,10,3,0,0,0,0,70,0,0 +23,2,54472,5,10,3,4,0,0,1,0,0,50,0,0 +31,2,331065,0,13,0,1,0,0,1,0,1408,40,0,0 +23,2,161708,5,10,0,4,3,0,1,0,0,20,0,0 +31,2,264936,5,10,0,4,0,0,1,0,0,40,0,0 +27,4,113545,0,13,0,3,0,0,1,0,0,40,0,0 +30,2,212237,0,13,1,3,1,0,0,0,1740,45,0,0 +34,2,173806,3,14,0,3,0,0,0,4865,0,60,0,0 +57,3,370890,1,9,0,0,0,0,0,0,2258,40,0,0 +39,2,505119,3,14,1,1,1,0,0,0,0,40,1,1 +23,2,193089,2,7,0,10,3,0,0,0,0,40,0,0 +24,4,33432,6,12,1,4,2,0,1,0,0,40,0,0 +36,2,103110,8,16,0,3,0,0,0,0,0,40,7,0 +32,2,160362,5,10,2,4,5,0,0,0,0,40,35,0 +35,2,204621,6,12,2,4,3,0,1,0,0,40,0,0 +36,2,35309,0,13,1,1,1,0,0,0,0,40,0,0 +47,2,194772,9,11,1,8,1,0,0,0,0,40,0,1 +35,2,154410,1,9,0,2,0,0,0,0,0,40,0,0 +44,3,220563,5,10,1,9,1,0,0,0,0,40,0,0 +32,0,253354,3,14,1,3,1,0,0,0,0,50,0,0 +32,2,211699,6,12,1,1,2,0,1,0,1485,40,0,1 +63,1,167501,5,10,1,3,2,0,1,20051,0,10,0,1 +34,2,229732,9,11,1,10,1,0,0,0,0,40,0,0 +47,2,185465,1,9,1,10,1,1,0,0,0,40,0,0 +27,2,335764,2,7,1,5,3,1,0,0,0,35,0,0 +23,2,460046,1,9,4,1,4,0,1,0,0,42,0,0 +50,2,176924,12,6,1,10,1,0,0,0,0,38,0,0 +49,0,213307,5,10,1,3,1,0,0,0,0,40,0,0 +36,2,83893,5,10,1,1,1,0,0,0,0,40,0,1 +23,2,194102,0,13,0,1,4,0,0,0,0,40,0,0 +61,2,238611,7,4,6,4,4,1,1,0,0,38,0,0 +41,2,113597,5,10,1,7,1,0,0,0,0,16,0,0 +27,1,208406,0,13,1,1,1,0,0,0,0,60,0,1 +53,2,274528,0,13,2,1,0,0,0,0,0,70,0,0 +17,1,60116,12,6,0,0,3,0,0,0,0,10,0,0 +53,2,166368,5,10,0,10,0,0,0,0,0,40,0,0 +28,2,303954,1,9,1,10,1,0,0,0,1848,42,0,1 +24,2,99386,0,13,3,3,3,0,1,0,0,40,0,0 +22,2,188569,5,10,0,0,0,0,1,0,0,20,0,0 +53,2,302868,0,13,1,5,1,0,0,0,0,50,0,1 +18,2,283342,2,7,0,4,5,1,0,0,0,20,0,0 +24,2,233777,5,10,0,5,4,0,0,0,0,50,4,0 +20,2,170038,1,9,0,5,0,0,1,0,0,40,0,0 +30,4,261319,7,4,1,6,1,0,0,0,0,40,0,0 +37,0,367237,9,11,0,3,0,0,0,8614,0,40,0,1 +34,2,126838,1,9,1,6,1,0,0,0,0,40,0,0 +19,2,354104,1,9,0,2,3,0,0,0,0,30,0,0 +20,2,176321,14,8,0,0,3,0,1,0,0,40,4,0 +47,2,85129,1,9,2,4,0,2,1,0,0,40,0,0 +22,2,62507,0,13,0,3,3,0,1,0,0,40,0,0 +42,4,111252,3,14,1,1,1,0,0,0,1977,40,0,1 +60,2,156889,5,10,2,0,0,0,1,0,0,40,0,0 +32,2,549430,1,9,0,13,4,0,1,0,0,40,4,0 +46,2,29696,1,9,1,1,1,0,0,0,0,40,0,1 +66,2,98837,1,9,6,0,0,0,1,0,0,40,0,0 +37,2,86150,0,13,1,4,2,2,1,0,0,30,0,1 +34,2,204991,5,10,2,1,3,0,0,0,0,44,0,0 +45,2,371886,0,13,0,3,0,0,0,0,0,46,0,0 +35,2,103605,2,7,1,7,1,0,0,0,0,40,0,0 +51,4,133050,5,10,1,1,1,1,0,0,0,40,0,1 +36,4,126569,5,10,1,11,1,0,0,0,0,40,0,1 +25,3,144259,1,9,0,0,3,1,0,0,0,40,0,0 +51,2,161482,1,9,2,4,4,0,1,0,0,38,0,0 +25,1,305449,5,10,0,8,3,0,0,0,0,40,0,0 +19,2,125010,1,9,0,7,3,0,0,0,0,45,0,0 +47,2,304133,5,10,1,1,1,0,0,0,0,45,0,0 +59,4,120617,1,9,4,11,4,1,1,0,0,40,0,0 +34,2,157747,0,13,1,1,1,0,0,0,0,40,0,1 +40,2,297396,5,10,4,1,4,0,1,0,0,60,0,0 +42,2,121287,1,9,2,8,0,0,0,0,0,45,0,0 +37,2,49115,3,14,1,1,1,0,0,0,0,60,0,1 +51,5,208302,6,12,1,5,1,0,0,0,0,38,0,1 +25,2,304032,1,9,0,0,3,0,0,0,0,36,0,0 +31,3,207301,1,9,1,0,2,0,1,0,0,40,0,1 +37,2,123211,1,9,1,4,1,0,0,0,0,44,0,1 +42,2,33521,6,12,1,5,1,0,0,0,0,45,0,1 +35,2,410034,5,10,2,5,0,0,0,0,0,50,0,0 +51,2,175339,0,13,1,5,1,0,0,0,0,47,0,1 +49,2,168211,5,10,1,10,1,0,0,0,1485,40,0,1 +26,2,125680,0,13,0,3,0,2,0,0,0,16,28,0 +56,4,160829,1,9,2,0,0,0,1,0,0,46,0,0 +52,2,266529,5,10,1,3,1,0,0,0,0,45,0,1 +47,0,224149,0,13,2,1,0,0,1,0,0,40,0,1 +52,2,150930,9,11,1,10,1,0,0,0,0,40,0,0 +30,2,343699,1,9,2,10,4,0,1,0,0,40,0,0 +43,5,172826,5,10,1,5,1,0,0,99999,0,55,0,1 +42,2,213821,1,9,1,10,1,0,0,0,1887,40,0,1 +26,2,211265,5,10,3,10,5,1,1,0,0,35,21,0 +58,4,160586,1,9,1,7,1,0,0,0,0,40,0,0 +66,2,146454,5,10,1,5,1,0,0,5556,0,40,0,1 +30,2,203277,1,9,1,11,1,0,0,0,0,60,0,1 +46,2,309895,5,10,4,0,4,0,1,0,0,40,0,0 +45,2,26522,5,10,1,0,2,0,1,0,1902,35,0,1 +57,2,103809,1,9,0,5,4,0,1,0,0,40,0,0 +25,2,90291,0,13,0,1,3,0,0,0,0,40,0,0 +21,0,181761,5,10,0,9,3,0,1,0,0,10,0,0 +37,2,35330,1,9,2,10,0,0,0,0,1669,55,0,0 +45,4,135776,3,14,2,3,0,0,1,0,0,30,0,0 +39,2,179579,1,9,0,10,3,0,0,0,0,40,0,0 +42,2,193626,1,9,1,0,2,0,1,0,0,53,0,0 +20,2,108887,1,9,0,8,3,0,1,0,0,40,0,0 +23,2,199070,1,9,0,11,3,1,0,0,0,16,0,0 +25,2,441591,0,13,0,9,3,0,0,0,0,40,0,0 +47,2,185254,11,3,0,13,3,0,1,0,0,40,22,0 +24,2,109307,1,9,0,5,3,0,0,0,0,45,0,0 +35,2,23621,1,9,0,10,0,0,0,0,0,70,0,0 +44,4,145178,1,9,1,4,2,1,1,0,0,38,2,1 +47,0,30575,5,10,1,3,1,0,0,0,0,50,0,0 +28,0,130620,2,7,4,0,4,2,1,0,0,40,3,0 +41,4,22155,3,14,2,3,4,0,1,0,0,60,0,0 +31,2,106437,1,9,0,0,0,0,1,0,0,40,0,0 +27,2,79787,3,14,0,1,0,0,1,0,0,25,0,0 +47,2,326857,9,11,1,10,1,0,0,5013,0,40,0,0 +44,2,81853,1,9,0,5,0,2,1,0,0,40,0,0 +61,2,120933,5,10,0,13,0,0,1,0,0,40,0,0 +42,3,153143,5,10,2,0,5,0,1,0,0,40,5,0 +46,2,27669,1,9,0,4,0,0,1,0,0,28,0,0 +46,2,105444,0,13,1,1,1,0,0,0,0,50,0,1 +54,4,169785,3,14,6,3,4,0,1,0,0,38,0,0 +49,2,122493,1,9,6,9,4,0,0,0,0,40,0,0 +56,4,242670,5,10,6,0,4,0,1,0,0,40,0,0 +52,2,54933,3,14,2,3,3,0,1,0,0,40,0,0 +34,2,209317,1,9,1,6,1,0,0,0,0,40,5,0 +25,1,282631,1,9,1,10,1,0,0,0,0,40,0,0 +18,2,98044,2,7,0,3,3,0,1,0,0,40,0,0 +58,2,187487,1,9,1,8,1,0,0,0,0,40,0,0 +31,0,60186,0,13,2,3,0,0,0,0,0,40,0,0 +29,2,75648,5,10,1,10,1,0,0,0,0,55,0,0 +28,2,201175,2,7,0,8,0,1,0,0,0,40,0,0 +30,2,19302,5,10,0,0,0,0,0,0,0,48,0,0 +44,2,146659,3,14,1,3,1,0,0,0,1887,35,0,1 +75,2,101887,12,6,6,13,0,0,1,0,0,70,0,0 +26,2,60726,5,10,1,10,1,1,0,0,0,40,0,0 +33,5,201763,0,13,1,5,1,0,0,0,0,50,0,1 +57,5,119253,3,14,1,5,1,0,0,15024,0,65,0,1 +47,1,121124,11,3,1,5,1,0,0,0,0,55,25,1 +41,2,220132,1,9,1,1,1,0,0,7298,0,40,0,1 +21,2,60639,5,10,0,4,0,0,1,0,0,37,0,0 +17,2,195262,2,7,0,10,3,0,0,0,0,17,0,0 +22,2,100587,5,10,0,4,3,1,1,0,0,15,0,0 +47,2,298130,1,9,1,5,1,0,0,0,0,40,0,0 +45,2,242391,0,13,1,1,1,0,0,0,0,40,0,1 +32,1,197867,9,11,2,5,4,0,0,0,0,50,0,0 +59,2,151977,12,6,4,13,0,1,1,0,0,30,0,0 +38,2,277347,1,9,1,10,1,0,0,0,0,50,0,0 +33,2,125249,1,9,4,11,3,0,1,0,0,40,0,0 +41,2,222142,1,9,1,8,1,0,0,0,0,40,0,0 +51,2,270194,4,5,1,6,1,0,0,0,0,40,0,0 +42,2,169995,1,9,1,5,1,0,0,0,0,48,0,0 +27,2,359155,0,13,1,3,2,0,1,0,0,40,0,1 +60,2,123992,5,10,1,10,1,0,0,0,0,45,0,0 +64,4,266080,1,9,2,0,0,0,1,0,0,35,0,0 +37,2,201531,6,12,1,8,1,0,0,0,0,40,0,1 +54,1,179704,0,13,1,1,1,0,0,0,0,45,0,1 +36,2,393673,6,12,1,1,2,0,1,0,0,50,0,1 +41,1,438696,3,14,2,5,4,0,0,0,0,5,0,1 +35,1,207568,7,4,1,7,1,0,0,0,0,75,0,0 +63,5,54052,3,14,1,5,1,0,0,0,0,68,0,1 +46,2,187581,1,9,2,10,5,0,0,0,0,40,0,0 +47,1,77102,3,14,2,3,0,0,0,0,0,40,0,0 +24,2,353010,0,13,0,8,0,0,0,0,0,65,0,0 +29,2,54131,5,10,0,5,0,0,0,0,0,30,0,0 +74,3,39890,5,10,6,6,0,0,1,0,0,18,0,0 +50,2,156877,2,7,1,6,1,0,0,0,0,70,0,1 +22,2,355686,5,10,0,0,0,0,1,0,0,40,0,0 +48,2,300168,14,8,4,0,3,1,1,0,0,40,0,0 +30,2,488720,4,5,1,2,5,0,0,0,0,40,4,0 +32,2,157287,0,13,1,5,1,0,0,0,0,40,0,0 +39,2,184659,1,9,1,8,1,0,0,0,0,40,0,0 +49,2,214169,5,10,1,10,1,0,0,0,0,40,0,1 +25,2,192149,0,13,0,0,3,0,1,0,0,40,0,0 +50,2,137253,0,13,1,0,2,0,1,0,0,40,0,1 +44,2,373050,1,9,1,6,1,0,0,0,0,40,0,0 +65,2,90377,9,11,1,7,1,0,0,6767,0,60,0,0 +28,3,183151,6,12,1,0,1,0,0,0,0,60,0,0 +55,2,227158,0,13,6,0,4,0,1,0,0,40,0,0 +49,4,34021,0,13,0,3,3,0,1,0,0,50,0,0 +31,2,165148,1,9,4,1,4,0,1,0,0,12,0,0 +47,2,211668,1,9,1,8,2,1,1,0,0,40,0,1 +45,2,358886,1,9,1,6,1,0,0,0,0,40,0,1 +35,2,47707,1,9,0,4,0,1,1,0,0,40,0,0 +34,1,306982,0,13,1,5,1,2,0,0,0,60,27,0 +49,4,52590,1,9,6,11,0,1,0,0,0,40,0,0 +27,2,158156,1,9,0,4,0,0,1,0,0,42,0,0 +42,2,70055,1,9,1,2,1,0,0,0,0,40,0,0 +64,1,177825,1,9,0,4,0,0,0,1055,0,40,0,0 +33,2,127215,5,10,1,5,1,0,0,0,0,48,0,1 +23,2,175183,5,10,0,0,0,0,1,0,0,40,0,0 +45,2,142287,3,14,1,1,1,0,0,0,0,50,0,1 +34,2,221324,1,9,0,8,4,1,1,0,0,40,0,0 +53,2,227602,1,9,2,5,0,0,1,0,0,37,4,0 +22,2,228452,12,6,0,10,0,0,0,0,0,30,0,0 +57,0,39380,1,9,4,4,0,0,1,0,0,35,0,0 +23,2,336360,7,4,0,10,3,1,0,0,0,40,0,0 +31,2,257644,2,7,0,6,4,0,0,0,0,40,0,0 +23,0,235853,0,13,0,9,0,0,0,0,0,22,0,0 +30,2,270577,1,9,4,0,4,0,1,0,0,40,0,0 +32,4,222900,0,13,4,3,0,0,1,0,0,50,0,1 +42,2,99254,6,12,1,0,2,1,1,0,0,40,0,1 +51,2,224763,7,4,1,6,1,0,0,0,0,40,1,0 +59,1,174056,0,13,1,5,1,0,0,15024,0,40,0,1 +36,2,127306,0,13,0,1,3,0,1,0,0,40,0,0 +45,2,339506,1,9,0,5,0,1,0,0,0,40,0,0 +35,2,178322,9,11,1,5,1,0,0,0,0,50,9,1 +33,2,189843,7,4,1,8,1,0,0,0,0,40,0,0 +43,2,160815,9,11,2,3,4,0,1,0,0,40,0,0 +60,2,207665,1,9,1,9,2,0,1,0,0,40,0,1 +37,0,160402,0,13,1,3,1,0,0,0,0,55,0,1 +35,2,170263,5,10,0,9,4,0,1,0,0,40,0,0 +36,2,184659,5,10,1,0,1,0,0,0,0,52,0,0 +38,3,338320,10,15,1,3,1,0,0,0,1977,50,0,1 +54,2,101017,7,4,1,10,1,0,0,0,0,40,0,0 +51,2,204322,9,11,1,2,1,0,0,0,0,40,0,1 +45,2,241350,6,12,1,10,1,0,0,0,0,45,0,1 +63,3,217994,5,10,2,1,4,0,1,0,0,40,0,0 +51,2,128143,5,10,1,10,1,0,0,0,0,40,0,1 +58,1,164065,3,14,2,5,0,0,0,0,0,18,0,0 +64,4,78866,1,9,2,0,0,0,1,0,0,40,0,0 +20,2,236769,5,10,0,2,3,0,0,0,0,40,0,0 +44,3,239539,0,13,1,0,1,2,0,0,0,40,11,1 +39,2,34028,0,13,2,1,4,0,1,0,0,48,0,0 +45,0,207847,5,10,0,0,4,0,1,0,0,40,0,0 +44,2,175935,8,16,1,0,1,0,0,0,0,55,0,1 +22,3,218445,5,10,0,1,0,0,1,0,0,40,0,0 +63,5,215833,1,9,1,1,1,0,0,0,0,40,0,1 +26,2,156976,9,11,4,4,0,1,0,0,0,40,0,0 +42,1,220647,0,13,1,7,1,0,0,0,0,45,0,0 +20,2,218343,1,9,0,4,3,0,1,0,0,25,0,0 +29,2,241431,3,14,1,5,1,0,0,7298,0,40,0,1 +38,4,123983,0,13,0,1,4,2,0,0,1741,40,36,0 +25,2,73289,1,9,0,6,3,0,0,0,0,40,0,0 +27,2,408623,0,13,1,10,5,0,0,0,0,50,0,0 +46,2,169180,9,11,2,0,0,0,1,0,0,40,0,0 +31,2,54929,5,10,2,10,0,0,0,0,0,60,0,0 +24,2,306779,9,11,0,1,3,0,0,0,0,35,0,0 +43,2,159549,5,10,1,5,1,0,0,0,0,50,0,1 +23,2,482082,14,8,0,8,3,0,0,0,0,21,4,0 +32,4,286101,1,9,0,6,4,1,1,0,0,37,0,0 +44,2,167955,1,9,1,10,1,0,0,0,0,40,12,0 +40,1,209040,0,13,1,5,1,0,0,0,0,40,0,0 +38,2,105017,1,9,2,10,4,0,0,0,0,40,0,0 +23,2,27776,9,11,0,8,0,0,0,0,0,40,0,0 +19,2,242941,5,10,0,5,3,0,1,0,1602,10,0,0 +41,2,118853,5,10,1,5,1,0,0,0,0,40,0,0 +48,2,119565,1,9,1,10,1,0,0,0,0,40,0,0 +23,2,196827,5,10,1,8,1,0,0,0,1902,40,0,0 +47,2,275361,6,12,6,4,3,0,1,0,0,35,0,0 +42,2,225193,1,9,1,10,1,0,0,0,0,40,0,0 +17,2,329783,12,6,0,5,5,0,1,0,0,10,0,0 +29,4,107411,10,15,0,3,0,0,1,0,0,70,0,0 +21,0,258490,5,10,0,3,0,0,1,0,0,20,0,0 +31,2,219509,1,9,1,4,1,0,0,0,0,40,4,1 +27,4,29174,0,13,0,3,4,0,1,0,0,40,0,0 +29,2,40083,8,16,0,3,0,0,0,0,0,40,8,0 +23,2,87528,0,13,0,5,0,0,1,0,0,45,0,0 +41,2,116379,3,14,1,3,1,2,0,0,0,55,18,1 +46,4,216214,0,13,1,3,1,0,0,0,0,35,0,1 +34,2,268051,5,10,1,11,5,1,1,0,0,25,19,0 +42,1,121718,1,9,1,10,1,0,0,0,0,24,0,0 +18,2,201901,1,9,0,2,3,0,1,0,1719,15,0,0 +46,2,109089,1,9,2,10,0,0,0,0,0,37,0,0 +52,2,284129,5,10,1,10,1,0,0,0,0,40,0,1 +56,2,143030,1,9,2,10,4,0,1,0,0,40,0,0 +21,2,212619,9,11,0,8,3,0,0,0,0,40,0,0 +22,1,199011,1,9,0,10,5,0,0,0,0,20,0,0 +31,2,118901,0,13,2,0,4,0,1,0,0,45,0,0 +41,1,129865,1,9,1,4,1,0,0,0,0,60,0,0 +25,2,157900,5,10,4,0,4,0,1,0,0,40,0,0 +43,1,349341,0,13,2,1,0,0,0,0,0,60,0,0 +45,2,158685,1,9,4,5,0,0,1,0,0,40,0,0 +26,2,386585,5,10,2,9,0,0,0,0,0,60,0,0 +90,2,52386,5,10,0,4,0,2,0,0,0,35,0,0 +45,2,246891,0,13,1,5,1,0,0,0,1902,40,0,1 +30,2,190385,0,13,1,4,2,0,1,0,0,40,0,1 +42,2,37869,5,10,1,10,1,0,0,0,0,40,0,0 +20,2,217807,5,10,0,2,3,0,0,0,0,35,0,0 +53,2,149784,0,13,1,3,1,0,0,7688,0,40,0,1 +64,0,201293,1,9,6,0,0,0,1,0,0,38,0,0 +56,2,128764,7,4,6,6,0,0,0,0,0,20,0,0 +42,2,27444,5,10,3,3,0,0,0,0,0,40,0,1 +26,2,62438,0,13,1,5,2,0,1,0,0,40,0,1 +31,4,151726,6,12,0,0,3,3,1,0,0,40,0,0 +40,2,29841,0,13,1,0,2,0,1,0,0,40,0,0 +58,2,131608,5,10,6,10,0,0,0,0,0,40,0,0 +41,2,110562,0,13,1,1,1,0,0,0,0,40,0,0 +58,5,190541,1,9,0,5,0,0,0,0,0,47,0,0 +62,0,33142,3,14,1,3,1,0,0,0,0,60,0,1 +65,5,139272,0,13,1,5,1,0,0,99999,0,60,0,1 +40,2,234633,5,10,0,10,0,0,0,0,0,40,0,0 +45,4,238386,5,10,1,11,1,0,0,0,0,40,0,1 +22,2,460835,1,9,0,10,3,0,0,0,0,55,0,0 +63,3,97855,3,14,1,1,1,0,0,0,0,50,0,1 +39,2,77146,0,13,1,1,1,0,0,0,1887,50,0,1 +37,2,200863,5,10,6,10,4,0,0,0,0,40,0,0 +56,2,77415,2,7,1,7,1,0,0,0,0,50,0,0 +32,2,236770,5,10,2,5,0,0,0,0,0,50,0,0 +53,3,173093,5,10,1,1,2,2,1,0,1887,40,11,1 +32,2,235124,9,11,2,3,0,0,0,0,0,40,0,0 +23,1,282604,2,7,1,6,1,0,0,7688,0,60,0,1 +35,2,199288,2,7,4,6,0,0,0,0,0,90,0,0 +51,2,191659,5,10,1,1,1,0,0,0,1887,65,0,1 +19,2,43285,5,10,0,0,3,0,1,0,0,20,0,0 +41,2,160837,2,7,3,8,0,0,0,0,0,40,24,0 +22,2,230574,12,6,0,6,3,0,0,0,0,25,0,0 +23,2,176178,1,9,0,9,3,0,1,0,0,40,0,0 +36,2,116358,3,14,1,1,1,2,0,0,0,40,18,1 +45,2,107787,9,11,1,10,1,0,0,0,0,40,8,0 +23,1,519627,1,9,0,7,0,0,0,0,0,25,4,0 +21,2,191460,2,7,0,4,4,1,1,0,0,40,0,0 +44,2,198282,3,14,1,1,1,0,0,15024,0,40,0,1 +29,2,214858,0,13,1,5,1,0,0,0,0,40,0,1 +36,1,64875,9,11,1,9,1,0,0,0,0,60,0,0 +18,2,675421,4,5,0,2,3,0,0,594,0,40,0,0 +62,1,134768,14,8,1,10,1,0,0,0,0,40,0,1 +25,3,207342,5,10,0,1,0,1,0,0,0,40,0,0 +34,2,64830,6,12,2,1,0,0,1,0,0,45,0,0 +31,2,220066,0,13,0,1,0,0,1,14344,0,50,0,1 +37,2,82521,0,13,1,1,1,0,0,15024,0,40,0,1 +33,2,176711,0,13,1,7,1,0,0,0,0,40,7,0 +28,2,111900,6,12,1,5,1,0,0,0,0,30,0,0 +47,2,481987,1,9,1,4,1,0,0,0,0,40,0,1 +34,2,158420,0,13,1,1,1,0,0,0,0,70,0,0 +26,2,256000,10,15,1,3,1,0,0,99999,0,60,0,1 +36,2,183892,5,10,1,10,1,0,0,7298,0,44,0,1 +28,2,42734,1,9,0,2,3,0,0,0,0,40,0,0 +22,2,181773,1,9,0,6,3,1,0,0,0,40,0,0 +47,2,184945,5,10,4,4,0,1,1,0,0,35,0,0 +33,2,107248,9,11,0,0,0,0,0,0,0,45,0,0 +34,5,215382,3,14,4,3,0,0,1,4787,0,40,0,1 +25,2,122999,1,9,0,10,3,0,0,0,0,40,0,0 +37,2,758700,4,5,1,2,1,0,0,3781,0,50,4,0 +36,0,166606,1,9,1,11,1,0,0,0,0,40,0,0 +57,2,205708,5,10,1,10,1,0,0,0,0,40,12,0 +55,2,67450,8,16,0,3,0,0,0,0,0,40,7,0 +20,2,242077,1,9,2,5,0,1,1,0,0,40,0,0 +43,2,129573,1,9,0,5,0,1,1,0,0,44,0,0 +54,2,181132,1,9,1,8,1,0,0,0,0,40,7,1 +25,2,212302,5,10,4,0,4,0,1,0,0,40,0,0 +42,2,83411,5,10,2,1,0,0,0,0,1408,40,0,0 +17,2,317681,2,7,0,10,3,0,0,0,0,10,0,0 +63,2,30602,7,4,3,4,4,3,1,0,0,40,0,0 +19,2,172893,5,10,0,1,3,0,1,0,0,30,0,0 +56,5,211804,0,13,1,5,1,0,0,15024,0,50,0,1 +33,1,312055,0,13,1,5,1,0,0,0,0,45,0,1 +37,2,65390,0,13,1,7,1,0,0,0,0,50,0,0 +27,2,200500,7,4,1,6,1,0,0,0,0,45,0,0 +36,4,241962,0,13,1,0,1,0,0,0,0,40,0,0 +30,5,78530,1,9,1,1,1,0,0,0,0,65,8,1 +22,2,189950,0,13,0,3,0,0,0,0,0,55,0,0 +35,2,111387,5,10,1,2,1,0,0,0,1579,40,0,0 +20,2,241951,1,9,0,2,0,0,0,0,0,45,0,0 +18,2,343059,5,10,0,5,3,0,1,0,0,40,0,0 +25,2,302465,14,8,0,8,0,0,0,0,1741,40,0,0 +53,2,156843,3,14,0,3,0,0,1,0,1564,54,0,1 +19,2,55284,1,9,0,5,3,0,1,0,0,35,0,0 +34,2,509364,1,9,2,8,0,0,0,0,0,30,0,0 +32,0,117927,5,10,0,0,0,1,1,0,0,40,0,0 +20,2,137651,5,10,0,8,3,3,0,0,0,40,0,0 +70,2,131060,7,4,1,4,1,0,0,0,0,25,0,0 +57,2,346963,0,13,1,1,1,0,0,0,0,40,0,1 +54,2,183611,5,10,1,5,1,0,0,3137,0,50,0,0 +34,2,134737,9,11,1,8,1,0,0,0,0,40,0,0 +48,2,36503,5,10,1,1,1,0,0,0,0,40,0,1 +42,2,250121,2,7,1,4,2,0,1,0,0,40,0,0 +45,2,330535,1,9,0,0,0,0,0,3325,0,40,0,0 +27,2,387776,5,10,0,4,3,0,0,0,0,40,0,0 +51,2,41474,12,6,1,4,1,0,0,0,0,40,4,0 +36,4,318972,5,10,2,0,4,0,1,0,0,65,0,0 +33,2,86143,5,10,0,1,3,2,0,0,0,40,11,0 +50,2,181139,5,10,0,7,0,0,0,0,0,40,0,0 +44,2,326232,0,13,2,1,4,0,0,0,2547,50,0,1 +39,4,153976,3,14,1,3,1,0,0,0,0,40,0,1 +55,1,59469,4,5,1,7,1,0,0,0,0,25,0,0 +24,2,127139,5,10,0,0,3,0,1,0,0,40,0,0 +35,2,136343,1,9,0,5,0,0,0,0,0,40,0,0 +32,1,350624,14,8,1,10,1,0,0,0,0,40,0,0 +68,2,166149,1,9,6,0,0,0,1,0,2206,30,0,0 +29,2,121523,2,7,1,6,1,0,0,0,0,60,0,0 +24,1,267396,0,13,0,5,0,0,0,0,0,40,0,0 +61,2,83045,4,5,1,8,1,0,0,0,0,40,0,0 +34,2,160449,1,9,1,8,1,0,0,0,0,44,0,1 +55,5,124137,10,15,1,3,1,0,0,0,2415,35,34,1 +41,2,154194,1,9,0,5,3,0,1,0,0,40,0,0 +36,1,295127,1,9,1,7,1,0,0,0,0,84,0,0 +60,2,240521,1,9,1,10,1,0,0,7298,0,40,0,1 +61,1,244087,1,9,1,10,1,0,0,0,0,52,0,1 +35,2,356250,10,15,1,5,1,2,0,0,0,35,26,0 +42,0,293791,0,13,1,1,1,0,0,0,0,50,0,1 +26,2,44308,0,13,0,9,0,0,0,0,0,40,0,0 +44,4,210527,5,10,0,4,4,1,1,0,0,40,0,0 +31,0,151763,3,14,0,0,0,0,0,0,0,25,0,0 +39,0,267581,1,9,0,4,0,1,0,0,0,40,0,0 +20,2,100188,5,10,0,9,3,0,1,0,0,24,0,0 +32,5,111746,5,10,1,10,1,0,0,0,0,40,0,0 +32,1,171091,1,9,1,5,1,0,0,0,0,40,0,0 +61,2,355645,4,5,1,8,1,1,0,0,0,20,33,0 +54,4,137678,5,10,2,0,4,0,1,0,0,40,0,0 +23,2,70894,6,12,0,10,5,0,0,0,0,40,0,0 +19,2,171306,1,9,0,5,3,0,0,0,0,3,0,0 +31,2,100997,5,10,1,3,1,3,0,0,0,40,0,0 +35,2,63921,11,3,1,2,1,0,0,0,0,40,4,0 +29,2,32897,1,9,2,4,0,0,1,0,0,25,0,0 +29,4,251854,1,9,0,11,0,1,1,0,0,40,0,0 +25,2,345121,12,6,4,4,3,0,1,0,0,25,0,0 +46,2,86220,0,13,2,5,0,0,1,0,0,40,0,0 +35,2,172845,9,11,0,4,4,0,1,0,0,30,0,0 +20,2,171398,12,6,0,5,0,4,0,0,0,40,0,0 +24,1,174391,1,9,1,0,2,0,1,0,0,40,0,0 +48,2,207058,1,9,2,0,4,0,1,0,0,37,0,0 +37,2,291251,1,9,2,8,0,0,1,0,0,40,0,0 +60,1,224377,1,9,1,5,1,0,0,0,0,40,0,0 +39,2,105813,1,9,1,10,1,0,0,0,0,40,0,0 +29,4,180916,5,10,4,0,4,0,1,0,0,38,0,0 +31,1,122749,9,11,2,10,3,0,0,0,0,20,0,0 +38,2,31069,9,11,1,10,1,0,0,4386,0,40,0,1 +26,1,284343,6,12,0,10,0,0,0,0,0,40,0,0 +64,2,319371,0,13,1,1,1,0,0,15024,0,40,0,1 +46,2,174224,9,11,2,11,0,1,0,0,0,40,0,0 +39,2,127772,1,9,1,5,1,0,0,3103,0,44,0,1 +48,2,80651,1,9,2,8,0,0,1,0,0,55,0,0 +46,2,62793,1,9,2,5,5,0,1,0,0,40,0,0 +42,2,191712,0,13,2,5,0,0,0,0,1590,40,0,0 +39,1,237532,1,9,1,5,2,1,1,0,0,54,21,1 +50,3,20179,3,14,1,9,1,0,0,0,0,40,0,1 +24,2,311376,0,13,0,3,0,0,1,0,0,40,0,0 +30,2,432565,9,11,1,9,5,0,1,0,0,40,8,1 +39,5,329980,0,13,1,5,1,0,0,0,2415,60,0,1 +29,1,125190,1,9,1,10,1,0,0,0,0,40,0,0 +23,2,342946,2,7,0,6,3,0,1,0,0,38,0,0 +32,2,123429,12,6,4,10,0,0,0,0,0,40,0,0 +69,5,69209,0,13,1,8,1,0,0,3818,0,30,0,0 +55,2,66356,1,9,4,2,4,0,0,0,0,40,0,0 +41,2,195897,5,10,1,5,1,0,0,0,0,50,0,0 +44,5,153132,0,13,1,1,1,0,0,7688,0,52,0,1 +18,2,230875,2,7,0,0,0,0,0,0,0,40,0,0 +74,1,92298,0,13,1,1,1,0,0,0,0,10,0,0 +40,2,185145,8,16,1,3,1,0,0,0,0,40,0,1 +27,2,297296,1,9,1,10,1,0,0,0,0,40,0,0 +55,2,145214,1,9,2,0,0,0,1,0,0,40,0,0 +52,1,242341,7,4,1,10,1,3,0,0,0,40,0,0 +54,2,240542,5,10,2,5,4,0,1,0,0,48,0,0 +36,2,104772,1,9,2,10,4,0,0,0,0,48,0,0 +26,2,181666,1,9,0,2,3,0,1,0,0,40,0,0 +18,2,415520,2,7,0,10,3,0,0,0,0,20,0,0 +38,2,258761,1,9,2,1,0,0,0,0,0,50,0,0 +50,2,88842,0,13,1,6,1,0,0,7298,0,40,0,1 +32,2,158438,5,10,1,1,1,0,0,0,0,60,0,1 +57,2,206206,0,13,1,5,1,0,0,0,0,40,0,1 +20,2,51816,1,9,0,11,3,1,0,0,0,40,0,0 +27,2,253814,5,10,0,0,0,0,1,0,0,40,0,0 +31,1,161745,0,13,3,1,0,0,0,0,1980,60,0,0 +60,2,162947,11,3,2,8,0,0,1,0,0,40,5,0 +52,2,163027,1,9,2,10,4,0,1,0,0,50,0,0 +61,2,146788,7,4,1,6,1,0,0,0,0,40,0,0 +57,1,73309,1,9,6,10,0,0,0,0,0,55,0,1 +59,1,104216,10,15,1,5,1,0,0,0,0,25,0,0 +34,1,345705,1,9,0,10,0,0,0,0,0,45,0,1 +31,2,133770,6,12,1,10,0,2,0,0,0,50,0,1 +42,2,209392,1,9,2,11,0,1,0,0,0,35,0,0 +70,2,262345,5,10,0,0,0,0,1,0,0,6,0,0 +29,2,490332,5,10,1,6,1,0,0,0,0,45,0,1 +27,2,211570,2,7,0,2,5,1,0,0,0,40,0,0 +25,2,374918,14,8,1,4,2,0,1,0,0,40,0,0 +51,2,106728,0,13,1,1,1,0,0,5178,0,60,0,1 +35,2,174597,0,13,1,10,1,0,0,0,0,40,0,0 +36,1,233533,5,10,1,10,1,0,0,0,0,60,0,1 +46,2,133169,9,11,1,10,1,0,0,0,0,40,0,0 +52,2,198824,9,11,4,4,4,0,1,0,0,35,0,0 +65,2,174056,7,4,1,8,1,0,0,0,0,40,0,0 +43,2,188696,9,11,2,8,0,0,0,0,0,40,0,0 +41,4,90692,1,9,2,3,4,2,1,0,0,40,0,0 +34,2,271933,0,13,0,1,5,0,1,0,1741,45,0,0 +47,1,102359,0,13,1,1,1,0,0,0,0,30,0,0 +49,3,213668,3,14,0,1,0,0,0,0,0,56,0,1 +21,2,294789,5,10,0,4,0,0,1,0,0,25,0,0 +20,2,157599,5,10,0,4,0,0,1,0,0,25,0,0 +18,4,134935,14,8,0,11,3,0,0,0,0,40,0,0 +27,2,466224,5,10,0,5,0,1,0,0,0,40,0,0 +34,1,111985,1,9,1,10,1,0,0,0,0,50,0,0 +38,2,264627,5,10,2,0,4,0,1,0,0,40,0,0 +24,2,213427,1,9,0,0,0,0,0,0,0,40,0,0 +34,2,279015,5,10,0,5,0,0,0,0,0,65,0,0 +47,2,165937,1,9,1,8,1,0,0,0,0,50,0,1 +27,3,188343,1,9,4,1,4,1,1,0,0,40,0,0 +63,2,158609,9,11,6,0,4,0,1,0,0,8,0,0 +34,2,193036,5,10,1,0,1,1,0,0,0,40,0,1 +25,2,198632,5,10,3,5,0,0,0,0,0,50,0,0 +54,2,175912,1,9,6,8,4,0,0,914,0,40,0,0 +35,2,101387,1,9,2,5,0,0,1,0,0,50,0,0 +24,2,60783,5,10,1,6,1,0,0,0,0,70,0,1 +26,2,183224,5,10,0,0,3,2,1,0,0,35,0,0 +59,4,100776,9,11,2,0,0,0,1,0,0,40,0,0 +20,2,174063,5,10,0,4,3,0,1,0,0,40,0,0 +41,2,306495,1,9,1,7,1,0,0,0,0,40,0,0 +51,2,249741,5,10,1,5,1,0,0,0,0,40,0,0 +27,2,93021,1,9,0,0,4,4,1,0,0,40,0,0 +36,2,49626,1,9,1,1,1,0,0,0,0,40,0,0 +25,2,63062,5,10,0,7,3,0,0,0,0,60,0,0 +55,2,320835,0,13,1,5,1,0,0,0,0,50,0,1 +22,4,123727,5,10,0,3,0,0,1,0,0,21,0,0 +58,0,110517,8,16,1,3,1,2,0,4064,0,40,3,0 +43,2,149670,5,10,1,0,2,0,1,4064,0,15,0,0 +39,2,172425,9,11,1,0,2,0,1,0,0,20,0,1 +40,2,216116,4,5,0,8,4,1,1,0,0,40,19,0 +46,2,174209,1,9,2,1,0,0,0,0,0,45,0,0 +54,3,175083,1,9,0,0,4,0,1,0,0,20,0,0 +19,2,129059,5,10,0,5,3,1,0,0,0,30,0,0 +24,2,121313,1,9,1,0,1,0,0,0,0,40,0,0 +24,0,166851,3,14,0,3,0,0,0,0,0,13,0,0 +29,1,29616,1,9,0,7,3,0,0,0,0,65,0,0 +56,5,105582,5,10,1,1,1,0,0,7688,0,50,0,1 +56,2,117881,2,7,2,8,0,0,1,0,0,40,0,0 +34,2,203408,0,13,1,3,1,0,0,7688,0,50,0,1 +19,2,446219,12,6,0,5,4,1,1,0,0,40,0,0 +32,5,110331,1,9,1,5,1,0,0,0,0,65,0,1 +48,2,207946,1,9,2,0,4,0,1,0,0,52,0,0 +47,2,188330,1,9,1,6,1,0,0,0,0,25,0,0 +52,2,147629,1,9,1,6,1,0,0,0,0,60,0,1 +40,2,153799,15,2,3,8,4,0,1,0,0,40,21,0 +28,2,203776,12,6,1,10,1,0,0,0,0,50,0,0 +41,2,168071,0,13,1,1,1,0,0,7298,0,50,0,1 +57,2,348430,15,2,2,10,4,0,0,0,0,40,20,0 +51,2,103407,1,9,2,0,0,0,1,0,0,40,0,0 +33,2,326104,5,10,1,1,1,0,0,0,0,50,0,1 +46,2,238162,0,13,1,10,1,0,0,0,0,45,0,1 +50,2,221336,1,9,2,0,5,2,1,0,0,40,11,0 +77,1,145329,1,9,0,8,0,0,0,401,0,20,0,0 +39,2,315776,3,14,0,1,0,1,0,8614,0,52,0,1 +35,2,325802,6,12,2,2,4,0,1,0,0,24,0,0 +23,2,133985,12,6,0,10,3,1,1,0,0,40,0,0 +37,2,269329,9,11,2,3,0,0,1,8614,0,45,0,1 +41,2,183203,1,9,1,6,1,0,0,0,0,50,0,1 +60,2,76127,6,12,1,0,1,0,0,0,0,35,0,1 +32,2,195891,0,13,0,0,0,0,0,0,0,55,0,0 +56,3,162137,1,9,1,6,1,3,0,0,0,40,0,0 +45,0,37672,9,11,2,9,4,0,1,0,0,40,0,0 +24,2,161708,1,9,2,1,0,0,1,0,0,45,0,1 +18,2,80616,12,6,0,2,3,0,0,0,0,27,0,0 +31,2,209276,1,9,1,4,1,4,0,0,0,40,0,0 +45,2,192835,0,13,1,1,1,0,0,0,1977,55,0,1 +23,2,203240,5,10,0,4,0,0,1,0,0,40,0,0 +45,0,102308,5,10,1,1,1,0,0,0,0,40,0,0 +18,2,40829,2,7,0,5,5,3,1,0,0,25,0,0 +25,2,60726,1,9,1,6,1,1,0,0,0,30,0,0 +31,0,116677,1,9,1,5,1,0,0,0,0,40,0,0 +19,2,57067,1,9,0,8,5,0,0,0,0,45,0,0 +41,2,304906,0,13,1,1,1,0,0,0,0,40,0,1 +74,2,101590,10,15,6,0,0,1,1,0,0,20,0,0 +27,2,258102,11,3,0,6,0,0,0,0,0,40,4,0 +23,2,241185,1,9,0,0,0,0,1,0,0,40,0,0 +31,2,124827,9,11,1,5,1,0,0,0,0,40,0,1 +40,5,76625,1,9,1,2,1,0,0,0,0,40,0,0 +41,3,263339,1,9,1,6,1,0,0,0,0,40,0,1 +25,2,135645,3,14,0,5,0,0,0,0,0,20,0,0 +42,2,245626,1,9,1,10,1,3,0,0,0,60,0,0 +24,2,210781,0,13,0,10,0,0,1,0,0,40,0,0 +42,2,235786,6,12,1,10,1,0,0,0,0,50,0,1 +45,1,160167,12,6,1,10,1,0,0,0,0,70,0,0 +52,3,30731,1,9,1,1,1,0,0,7298,0,40,0,1 +34,2,314375,9,11,2,10,0,0,0,0,0,40,0,0 +32,2,81528,1,9,0,2,5,0,0,0,0,60,0,0 +54,2,182854,1,9,1,10,1,0,0,0,0,45,0,0 +42,3,296798,2,7,0,9,0,0,0,0,1340,40,0,0 +32,2,194426,0,13,1,9,1,0,0,15024,0,40,0,1 +55,5,141807,0,13,1,5,1,0,0,0,0,60,0,1 +52,0,71344,3,14,1,3,1,0,0,0,0,40,0,0 +21,0,341410,5,10,0,0,0,0,1,0,0,15,0,0 +33,2,118941,0,13,1,1,2,0,1,0,0,40,0,1 +27,1,229125,2,7,1,10,1,0,0,0,0,40,0,0 +42,4,142756,0,13,2,3,0,0,1,0,0,50,0,0 +27,5,243871,5,10,0,0,3,0,1,0,0,45,0,0 +47,2,213140,9,11,1,10,1,0,0,7688,0,40,0,1 +19,2,196857,1,9,0,4,0,0,1,0,0,40,0,0 +46,2,138626,5,10,1,10,1,0,0,0,0,40,0,0 +55,1,161334,1,9,6,4,0,0,1,0,0,25,35,0 +50,2,273536,7,4,1,5,1,4,0,0,0,49,21,0 +32,2,115631,5,10,0,0,0,0,1,4101,0,50,0,0 +28,2,185957,1,9,1,0,2,0,1,0,0,40,0,0 +23,2,334357,1,9,0,0,3,1,1,0,0,40,0,0 +43,2,96102,3,14,3,1,0,0,0,0,0,50,0,0 +34,2,213226,0,13,1,3,1,0,0,0,0,40,10,1 +19,2,115248,5,10,0,0,0,2,0,0,0,40,36,0 +37,2,185061,5,10,1,1,1,2,0,0,0,55,0,0 +27,2,147638,0,13,0,0,5,2,1,0,0,40,37,0 +18,2,280298,1,9,0,5,3,0,1,0,0,24,0,0 +31,2,163516,5,10,6,0,4,0,1,0,0,40,0,0 +49,2,277434,1,9,1,6,1,0,0,0,0,50,0,0 +26,3,206983,10,15,1,3,1,0,0,0,0,60,13,0 +48,2,108993,1,9,1,10,1,0,0,0,0,45,0,1 +39,2,288551,1,9,1,10,1,1,0,0,0,40,0,0 +41,2,176069,1,9,4,8,4,0,1,0,0,40,0,0 +48,0,183486,9,11,2,3,4,0,1,0,0,56,0,1 +40,2,163215,0,13,2,1,0,0,1,10520,0,40,0,1 +70,2,94692,0,13,1,5,1,0,0,0,0,70,0,1 +20,2,118462,1,9,0,2,3,0,0,0,0,43,0,0 +38,2,407068,11,3,1,4,1,0,0,0,0,75,4,0 +37,1,243587,5,10,4,4,3,0,1,0,0,40,1,0 +49,2,23074,5,10,6,1,0,0,1,0,0,40,0,1 +51,2,237735,1,9,1,2,1,0,0,3103,0,40,0,1 +43,2,188291,15,2,0,5,3,0,0,0,0,40,0,0 +38,2,284166,10,15,0,3,0,0,0,0,0,50,0,0 +23,2,287681,7,4,0,4,0,0,0,0,0,25,4,0 +34,2,509364,1,9,1,10,1,0,0,0,0,40,0,0 +33,2,91964,5,10,0,0,4,0,0,0,0,40,0,0 +31,2,117526,5,10,0,7,0,0,1,0,0,45,0,0 +64,2,91343,5,10,6,9,4,0,1,0,0,40,0,0 +26,4,336969,0,13,1,3,1,0,0,0,0,28,22,0 +55,2,255364,5,10,1,3,1,0,0,0,0,40,0,0 +61,4,167670,0,13,3,3,0,0,0,0,0,40,0,0 +37,2,211494,1,9,1,9,1,0,0,0,0,40,0,1 +78,4,136198,0,13,1,1,1,0,0,0,0,15,0,0 +27,3,409815,5,10,0,0,4,1,1,0,0,40,0,0 +49,2,188823,1,9,2,3,0,0,0,0,0,42,0,0 +55,0,146326,3,14,1,3,1,0,0,7688,0,45,0,1 +42,2,154374,0,13,1,6,1,0,0,0,0,58,0,0 +61,2,197286,4,5,1,10,1,0,0,0,0,40,0,0 +64,1,100722,0,13,1,0,1,0,0,0,0,5,0,0 +46,4,377622,1,9,1,4,1,0,0,0,0,40,0,0 +24,2,145964,0,13,0,1,0,0,0,0,0,40,0,0 +27,2,358636,5,10,1,10,1,0,0,2829,0,70,0,0 +47,2,155489,1,9,1,6,1,0,0,7688,0,55,0,1 +18,2,57413,5,10,2,4,3,0,0,0,0,15,0,0 +48,2,320421,1,9,1,5,1,0,0,0,0,50,0,0 +50,1,174752,1,9,2,7,0,0,0,0,0,40,0,0 +40,0,229364,3,14,2,3,0,0,1,0,0,45,0,0 +56,1,157486,12,6,2,5,3,0,0,0,0,40,0,0 +34,2,92682,1,9,0,0,0,0,1,4865,0,40,0,0 +56,3,101338,0,13,1,5,1,0,0,0,0,40,0,0 +18,2,132652,2,7,0,4,3,0,0,0,0,20,0,0 +21,2,34616,5,10,0,4,3,0,1,0,0,25,0,0 +40,2,218903,1,9,2,9,4,0,1,0,0,40,0,0 +27,4,204098,1,9,1,2,5,0,0,0,0,50,0,0 +52,1,64045,10,15,1,3,1,0,0,99999,0,45,0,1 +46,2,189763,1,9,2,5,0,0,1,0,0,30,0,0 +23,2,26248,1,9,0,0,3,0,1,0,0,40,0,0 +50,2,92079,5,10,1,9,1,0,0,0,0,45,0,1 +19,2,280071,5,10,0,8,5,0,0,0,0,50,0,0 +20,2,224059,1,9,0,4,0,0,0,0,0,40,0,0 +39,2,185520,5,10,2,1,0,0,1,8614,0,40,0,1 +24,2,265567,2,7,0,10,3,0,0,0,0,35,0,0 +72,2,106890,9,11,6,0,0,0,1,0,0,40,0,0 +42,0,39586,3,14,1,3,2,0,1,0,0,20,0,1 +51,2,209912,0,13,2,1,0,3,0,0,0,50,0,0 +39,2,144169,1,9,1,5,1,0,0,0,0,50,0,1 +40,4,50442,5,10,0,0,4,3,1,2977,0,35,0,0 +34,2,89644,5,10,1,5,1,0,0,0,0,55,0,1 +19,2,275889,2,7,0,2,3,0,0,0,0,40,4,0 +26,2,231638,1,9,0,1,3,0,1,0,0,40,0,0 +45,4,224474,0,13,2,3,4,0,1,4934,0,50,0,1 +28,2,355259,3,14,0,3,0,0,1,0,0,40,0,1 +30,3,68330,0,13,0,3,0,0,0,0,0,40,0,1 +32,2,185410,1,9,0,0,0,0,1,0,0,40,0,0 +19,2,87653,5,10,0,4,3,0,1,0,0,25,0,0 +21,2,286853,1,9,0,4,3,0,0,0,0,35,0,0 +54,2,96710,1,9,1,13,5,1,1,0,0,20,0,0 +62,2,160143,10,15,1,3,1,0,0,0,0,30,0,1 +25,2,186925,5,10,0,4,0,0,0,2597,0,48,0,0 +49,5,109705,5,10,2,1,4,0,1,0,0,32,0,0 +32,2,94235,1,9,1,10,1,0,0,0,0,40,0,1 +37,4,297449,1,9,1,11,1,0,0,0,0,40,0,1 +58,2,205896,1,9,2,5,5,0,1,0,0,40,0,0 +37,2,93717,5,10,1,0,2,0,1,7298,0,45,0,1 +41,2,194710,1,9,0,1,0,0,1,0,0,40,0,0 +38,2,236391,0,13,1,1,1,0,0,7688,0,40,0,1 +47,0,189123,1,9,1,4,1,0,0,0,0,40,0,0 +42,2,358677,1,9,2,4,4,1,0,0,0,35,0,0 +30,0,199539,1,9,1,0,1,0,0,0,1902,40,0,0 +43,2,128170,5,10,1,5,1,0,0,7688,0,40,0,1 +34,2,231238,1,9,1,8,1,1,0,0,0,40,0,0 +57,2,296152,5,10,2,1,5,0,1,594,0,10,0,0 +46,2,166003,2,7,1,8,1,0,0,0,0,40,0,0 +32,2,281437,5,10,1,6,1,0,0,0,0,55,0,0 +20,2,190231,4,5,0,8,3,0,1,0,0,11,35,0 +47,2,122026,9,11,2,5,0,0,0,0,0,50,0,0 +53,1,174102,7,4,1,1,1,0,0,4386,0,50,34,1 +43,2,125461,0,13,1,5,1,0,0,0,0,65,0,1 +80,1,184335,7,4,1,7,1,0,0,0,0,30,0,0 +24,2,211345,5,10,0,4,3,0,1,0,0,40,4,0 +43,4,147328,3,14,1,1,1,0,0,0,1977,60,0,1 +22,2,222993,1,9,0,2,3,0,0,0,0,40,0,0 +40,2,225978,5,10,4,1,0,1,0,0,0,40,0,0 +48,2,121124,1,9,1,1,1,0,0,0,0,50,0,1 +51,2,234057,1,9,1,10,1,0,0,0,0,45,0,1 +24,3,306515,1,9,0,0,0,0,1,0,0,40,0,0 +19,2,116562,1,9,0,4,3,0,1,0,0,40,0,0 +34,2,171159,5,10,2,0,4,0,1,0,0,30,0,0 +24,2,199011,1,9,0,10,3,0,0,0,0,40,0,0 +41,2,443508,0,13,1,6,1,0,0,0,0,48,8,1 +24,2,29810,1,9,2,5,0,0,1,0,0,38,0,0 +22,4,238831,5,10,0,11,3,0,0,0,0,40,0,0 +32,3,566117,5,10,2,0,4,0,1,0,0,40,0,0 +41,2,255044,0,13,2,1,0,0,1,0,0,55,0,0 +20,2,436253,5,10,0,4,3,0,0,0,0,35,0,0 +31,2,300687,1,9,0,4,0,1,0,0,0,40,0,0 +55,2,144071,0,13,1,9,1,0,0,0,0,18,0,1 +26,2,188767,0,13,0,5,3,0,0,0,0,40,0,0 +27,1,300777,1,9,2,6,0,0,0,0,0,70,0,0 +35,2,26987,1,9,4,0,0,0,1,0,0,40,0,0 +40,2,174395,1,9,2,4,0,0,0,0,0,60,34,0 +59,2,90290,5,10,1,3,1,0,0,0,0,34,0,0 +61,2,183735,5,10,1,5,1,0,0,0,0,45,0,1 +31,2,123273,1,9,0,5,3,1,1,0,0,40,0,0 +43,3,186916,3,14,2,11,0,0,0,0,0,60,0,1 +61,2,43554,11,3,0,2,0,1,0,0,2339,40,0,0 +54,2,178251,6,12,6,0,4,0,1,0,0,30,0,0 +30,2,255885,5,10,1,5,1,0,0,0,0,50,0,0 +20,2,64292,5,10,0,5,0,0,1,0,0,50,0,0 +27,0,194773,3,14,0,3,0,0,1,0,0,50,9,0 +44,5,133060,5,10,2,8,0,0,0,0,0,60,0,0 +64,2,258006,5,10,6,0,0,0,1,0,0,40,1,0 +55,2,92215,1,9,2,0,0,0,1,0,0,40,0,0 +34,2,33945,1,9,2,10,0,0,0,6849,0,55,0,0 +61,2,153048,1,9,6,5,0,0,1,0,0,35,0,0 +34,2,355571,1,9,2,8,4,1,1,0,0,40,0,0 +47,5,139268,10,15,1,3,1,0,0,0,1977,60,0,1 +26,2,34402,0,13,0,0,0,0,0,0,0,45,0,0 +35,2,25955,2,7,0,4,4,3,0,0,0,40,0,0 +36,2,209609,0,13,1,3,1,0,0,0,0,38,0,0 +47,2,168283,0,13,1,3,1,0,0,0,0,40,0,1 +17,2,295488,2,7,0,4,3,1,1,0,0,25,0,0 +35,2,190895,5,10,1,3,1,0,0,0,0,60,0,0 +33,2,164190,3,14,0,3,3,0,0,0,0,20,0,0 +25,2,216010,6,12,1,0,2,0,1,0,0,40,0,0 +18,2,387568,12,6,0,5,3,0,0,0,0,10,0,0 +47,0,188386,3,14,4,3,0,0,0,0,0,38,0,0 +44,2,174491,1,9,6,4,4,1,1,0,0,30,0,0 +41,2,31221,1,9,2,4,4,0,1,0,0,30,0,0 +30,2,272451,0,13,0,0,0,0,1,0,0,40,0,0 +53,1,152652,5,10,1,7,1,0,0,0,0,50,0,0 +53,2,104413,1,9,6,4,4,1,1,0,0,20,0,0 +40,2,105936,1,9,1,5,2,0,1,5013,0,20,0,0 +24,2,379066,5,10,0,0,0,0,0,0,2205,24,0,0 +27,2,214858,0,13,0,5,3,0,0,0,0,40,0,0 +50,2,237735,11,3,1,6,1,0,0,0,0,37,4,0 +36,2,158592,2,7,1,10,1,0,0,0,0,50,0,0 +41,2,237321,15,2,1,8,1,0,0,0,0,40,4,1 +41,2,23646,3,14,0,3,0,0,1,0,0,40,0,0 +31,2,169240,1,9,0,4,0,0,1,0,0,40,0,0 +32,3,454508,0,13,1,1,1,0,0,0,0,40,0,0 +22,2,130356,5,10,0,8,3,0,0,0,0,48,0,0 +22,2,427686,12,6,2,10,3,0,0,0,0,40,0,0 +18,4,36411,14,8,0,3,3,0,0,0,0,30,0,0 +39,2,548510,0,13,1,3,1,1,0,0,0,30,0,0 +38,2,187264,1,9,1,1,2,0,1,0,0,55,0,0 +35,0,140752,1,9,1,10,1,0,0,0,0,40,0,0 +23,2,325596,5,10,0,8,0,0,0,0,0,40,0,0 +54,1,175804,0,13,1,1,1,0,0,0,0,40,0,1 +36,2,107302,3,14,1,3,1,0,0,0,0,60,0,1 +63,4,41161,1,9,1,1,1,0,0,0,0,55,0,0 +39,2,401832,5,10,1,1,1,0,0,0,0,48,0,0 +57,1,353808,5,10,1,5,1,0,0,0,0,60,0,1 +58,5,349910,10,15,1,3,1,0,0,0,1977,50,0,1 +29,2,161478,0,13,0,0,0,2,1,0,0,40,28,0 +17,2,400225,2,7,0,5,3,0,1,0,0,20,0,0 +40,2,367533,1,9,2,10,0,0,0,0,0,40,0,0 +69,1,69306,5,10,1,4,2,0,1,0,0,15,0,0 +28,2,270366,12,6,2,5,0,0,1,0,0,40,0,0 +38,2,103751,4,5,1,10,1,0,0,0,0,40,0,0 +44,2,75227,10,15,0,3,0,0,0,14084,0,40,0,1 +45,4,132563,10,15,2,3,4,1,1,0,1726,40,0,0 +33,0,79580,0,13,1,0,1,1,0,0,0,40,0,0 +41,4,344624,5,10,1,4,1,0,0,0,1485,40,0,1 +37,5,186359,1,9,1,5,1,0,0,7688,0,60,0,1 +50,2,121685,5,10,1,5,1,0,0,0,0,45,0,1 +48,2,75104,0,13,1,3,1,0,0,0,0,50,0,0 +36,2,246449,5,10,1,1,1,0,0,0,0,60,0,1 +21,2,85088,5,10,0,4,3,0,1,0,0,37,0,0 +37,2,545483,6,12,1,7,1,0,0,0,0,40,0,0 +20,0,243986,5,10,0,3,3,0,1,0,0,20,0,0 +54,1,32778,1,9,1,5,2,0,1,0,0,30,0,0 +28,2,369114,1,9,4,5,5,0,1,0,0,40,0,0 +27,2,217200,5,10,0,3,0,0,0,0,0,40,0,0 +33,2,149220,9,11,0,4,4,1,1,0,0,40,0,0 +40,1,335549,10,15,0,3,0,0,0,0,2444,45,0,1 +47,2,102308,3,14,1,5,1,0,0,0,0,40,0,1 +44,2,367749,15,2,0,8,0,0,1,0,0,40,22,0 +25,2,98281,14,8,0,2,4,0,0,0,0,43,0,0 +35,2,115792,0,13,1,3,1,0,0,0,0,55,0,0 +29,2,277788,5,10,1,5,2,0,1,0,0,25,0,0 +30,2,103435,1,9,2,8,4,0,0,0,0,40,0,0 +30,2,37646,5,10,1,2,1,0,0,0,0,40,0,0 +56,1,385632,7,4,2,4,4,0,1,0,0,40,0,0 +25,1,210278,0,13,0,3,3,0,0,0,0,30,0,0 +28,2,335357,1,9,0,2,3,1,0,0,0,40,0,0 +43,1,272165,4,5,1,10,1,0,0,0,0,40,0,0 +47,4,148995,1,9,1,11,1,0,0,0,0,60,0,1 +46,1,113434,0,13,1,10,1,0,0,0,0,40,0,0 +41,0,132551,3,14,2,3,4,0,1,0,0,35,0,0 +38,3,115433,6,12,1,0,2,0,1,7688,0,33,0,1 +29,2,227890,1,9,0,11,5,1,0,0,0,40,0,0 +25,2,503012,11,3,0,10,0,0,0,0,0,40,4,0 +56,2,250873,2,7,1,10,1,0,0,0,0,45,0,0 +31,2,407930,7,4,1,2,1,0,0,0,0,40,0,0 +22,2,148187,2,7,0,4,5,0,0,0,0,40,0,0 +31,2,159322,1,9,0,2,5,0,0,0,0,40,0,0 +28,2,334368,5,10,4,0,0,0,1,0,0,40,0,0 +53,2,196328,0,13,1,1,1,1,0,0,0,40,0,0 +45,2,270842,3,14,2,1,0,0,1,0,0,50,0,1 +71,2,235079,13,1,6,10,4,1,0,0,0,10,0,0 +39,2,188391,1,9,1,10,1,0,0,7298,0,50,0,1 +19,3,30559,1,9,5,5,2,0,1,0,0,40,0,0 +34,4,255098,0,13,2,3,4,0,1,0,0,40,0,0 +36,2,248010,1,9,1,0,1,0,0,0,0,45,0,0 +40,2,174515,1,9,3,4,3,0,1,0,0,40,0,0 +90,2,171956,5,10,4,0,3,0,1,0,0,40,5,0 +56,2,193130,10,15,1,1,1,0,0,0,0,16,0,0 +21,2,108670,1,9,0,3,0,0,1,0,0,40,0,0 +48,2,186172,0,13,1,1,1,0,0,0,0,45,0,1 +45,2,348854,5,10,4,0,4,0,1,0,0,27,0,0 +46,2,271828,1,9,1,8,1,0,0,0,0,40,0,1 +64,2,148606,12,6,4,4,0,0,1,0,0,35,0,0 +29,4,123983,3,14,0,3,3,2,0,0,0,40,18,0 +22,2,24896,1,9,2,9,4,0,1,0,0,30,9,0 +47,2,573583,1,9,1,6,1,0,0,0,0,48,25,1 +67,5,106175,0,13,1,1,1,0,0,0,2392,75,0,1 +43,2,307767,1,9,1,2,1,0,0,0,0,40,0,0 +42,2,200574,5,10,1,5,1,0,0,0,0,40,0,0 +31,2,59083,5,10,1,4,1,0,0,0,1672,50,0,0 +53,2,358056,2,7,2,4,4,0,1,0,0,40,0,0 +81,2,114670,4,5,6,13,0,1,1,2062,0,5,0,0 +33,4,262042,1,9,2,0,3,0,1,0,1138,40,0,0 +17,2,206010,14,8,0,4,3,0,1,0,0,8,0,0 +28,2,159001,1,9,0,2,3,0,0,0,0,30,0,0 +24,2,155818,5,10,0,5,3,0,1,0,0,40,0,0 +40,2,96055,1,9,4,0,4,0,1,0,0,45,0,0 +30,4,131776,3,14,0,0,0,0,1,0,0,40,0,0 +24,2,228613,2,7,0,8,4,0,1,0,0,40,0,0 +26,2,198163,3,14,1,5,2,0,1,0,0,40,0,0 +38,2,37028,5,10,2,5,4,0,1,0,0,38,0,0 +30,2,177304,1,9,1,9,1,0,0,0,0,40,0,1 +33,2,144064,0,13,1,1,1,0,0,0,0,50,0,0 +40,2,146659,1,9,1,5,1,0,0,0,0,60,0,1 +63,1,26904,1,9,1,7,1,0,0,0,0,98,0,0 +23,2,238917,7,4,0,10,5,0,0,0,0,36,0,0 +56,2,170148,1,9,2,10,4,1,0,0,0,40,0,0 +42,1,27821,9,11,1,1,1,0,0,0,0,60,0,0 +40,2,220460,1,9,0,10,0,0,0,0,0,40,8,0 +49,2,101320,6,12,1,5,2,0,1,0,1902,40,0,1 +52,2,91048,1,9,2,8,3,1,1,0,0,35,0,0 +28,2,298696,0,13,0,0,3,0,1,0,0,40,0,0 +35,2,207202,12,6,1,6,1,0,0,0,0,70,0,0 +43,1,180599,1,9,0,10,0,0,0,0,0,35,0,0 +29,1,132686,10,15,0,3,3,0,0,0,0,50,25,1 +23,2,240063,0,13,0,8,3,0,0,0,0,25,0,0 +50,4,177705,5,10,1,0,1,0,0,0,1740,48,0,0 +34,2,511361,5,10,0,4,3,1,0,0,0,40,0,0 +19,2,89397,1,9,0,4,3,0,0,0,0,40,0,0 +47,2,239439,2,7,1,8,2,1,1,0,0,40,0,0 +37,1,36989,5,10,1,7,1,0,0,0,0,40,0,0 +25,2,76978,1,9,0,5,4,1,1,0,0,35,0,0 +75,2,200068,5,10,1,1,1,0,0,0,0,35,0,1 +24,2,454941,1,9,1,10,1,0,0,0,0,40,0,0 +28,0,107218,0,13,0,9,3,2,0,0,0,20,0,0 +17,4,182070,2,7,0,4,3,0,1,0,0,16,0,0 +31,2,176360,1,9,0,10,3,1,0,0,0,40,0,0 +31,2,452405,13,1,0,4,5,0,1,0,0,35,4,0 +45,2,84790,0,13,1,3,1,0,0,0,0,55,0,1 +31,2,186787,1,9,0,10,3,0,0,0,0,42,0,0 +27,2,169662,0,13,1,3,1,0,0,0,0,42,0,1 +48,2,125933,5,10,6,1,4,1,1,0,1669,38,0,0 +34,2,225548,0,13,1,11,1,1,0,0,0,30,0,0 +26,2,240842,1,9,0,8,4,1,1,0,0,40,0,0 +53,2,103931,5,10,1,3,1,0,0,0,0,40,0,0 +60,2,232618,0,13,1,1,1,0,0,0,0,35,0,1 +49,4,288548,3,14,4,3,4,0,1,0,0,50,0,0 +40,2,220609,5,10,2,1,0,0,1,0,0,40,0,0 +48,5,26145,12,6,1,7,1,0,0,0,0,80,0,0 +23,2,268525,0,13,0,3,0,0,0,0,0,50,0,0 +42,2,121264,9,11,1,3,1,0,0,0,0,40,0,1 +37,1,29814,1,9,0,7,3,0,0,0,0,85,0,0 +27,2,193701,1,9,0,10,3,0,1,0,0,45,0,0 +38,2,183279,5,10,1,1,1,0,0,0,0,44,0,1 +27,2,163942,1,9,0,10,0,0,0,0,0,35,38,0 +75,2,188612,1,9,6,0,0,0,1,0,0,40,0,0 +49,5,102771,0,13,1,5,1,0,0,0,0,52,0,1 +27,2,85625,5,10,0,5,0,0,0,0,0,20,0,0 +36,1,245090,0,13,0,7,0,0,0,0,0,50,4,0 +36,2,131239,0,13,1,3,1,0,0,3103,0,45,0,1 +35,2,182074,1,9,2,2,3,0,0,0,0,35,0,0 +36,2,187046,1,9,1,5,1,0,0,0,0,40,0,1 +53,2,90624,2,7,1,10,1,1,0,0,0,40,0,0 +27,2,37933,5,10,0,0,4,1,1,0,0,40,0,0 +34,2,182177,1,9,2,10,0,0,0,3325,0,35,0,0 +61,2,716416,5,10,1,5,1,0,0,0,0,44,0,1 +29,2,190562,1,9,2,8,4,0,0,0,0,56,0,0 +40,0,141583,5,10,2,0,4,1,1,0,0,35,0,0 +37,2,98941,3,14,0,1,0,0,0,0,0,40,0,1 +22,2,201729,4,5,0,2,5,0,0,0,0,30,0,0 +43,5,175485,5,10,1,1,1,0,0,0,0,40,0,0 +55,1,149168,1,9,1,7,1,0,0,0,0,30,0,0 +28,2,115971,5,10,2,0,4,0,1,0,0,40,0,0 +23,2,161708,0,13,0,4,3,0,1,0,0,30,0,0 +64,4,244903,2,7,1,10,1,1,0,0,0,40,0,1 +46,2,155664,5,10,0,2,0,0,0,0,0,40,0,0 +29,2,112754,5,10,0,10,3,0,0,0,0,40,0,0 +44,2,178385,3,14,1,1,1,2,0,0,0,48,3,0 +20,2,44064,5,10,0,3,3,0,0,0,0,25,0,0 +62,1,120939,5,10,2,5,0,0,0,0,0,40,0,0 +49,2,165134,9,11,0,1,4,0,1,0,0,35,13,0 +29,2,100405,12,6,1,7,2,3,1,0,0,40,0,0 +35,1,361888,0,13,1,5,1,0,0,0,0,60,28,0 +39,4,167864,2,7,1,6,1,0,0,0,0,30,0,0 +39,2,202950,0,13,0,1,0,0,0,0,0,45,0,0 +37,2,218188,1,9,2,8,5,0,1,0,0,32,0,0 +38,2,234962,1,9,1,2,1,0,0,2829,0,30,4,0 +31,2,259931,7,4,1,8,1,0,0,0,0,40,0,0 +55,2,189528,7,4,1,10,1,0,0,0,0,60,0,0 +38,2,34996,5,10,4,4,4,0,1,0,0,40,0,0 +33,2,112584,5,10,2,5,0,0,1,0,0,25,0,0 +25,2,117589,6,12,0,0,0,0,1,0,0,40,0,0 +37,2,267086,9,11,2,9,4,0,1,0,0,52,0,0 +49,2,44434,5,10,2,9,5,0,0,0,0,35,0,0 +26,2,96130,1,9,0,10,5,0,0,0,0,40,0,0 +35,2,181382,1,9,1,10,1,0,0,0,0,43,0,0 +44,5,168845,1,9,1,5,2,0,1,0,0,60,0,0 +37,2,271767,3,14,4,1,0,0,0,0,0,45,0,1 +42,2,194636,0,13,1,3,1,0,0,0,0,45,0,1 +64,0,194894,8,16,0,3,0,0,1,4787,0,40,0,1 +28,2,132686,1,9,1,2,1,0,0,0,0,40,0,1 +35,1,185848,1,9,0,1,0,0,0,4650,0,50,0,0 +40,0,184378,0,13,1,0,1,0,0,0,0,40,0,0 +55,3,270859,0,13,1,3,1,0,0,0,0,40,0,1 +21,2,231866,1,9,0,7,3,0,0,0,0,65,0,0 +49,2,36032,5,10,0,1,0,1,1,0,0,40,0,0 +51,0,172962,8,16,1,3,1,0,0,0,0,40,0,1 +57,2,98350,10,15,1,10,1,2,0,0,1902,40,11,1 +51,2,24185,0,13,1,10,1,0,0,0,0,40,0,1 +24,2,85088,1,9,0,5,3,0,1,0,1762,32,0,0 +45,1,94962,1,9,1,10,1,0,0,0,0,40,7,0 +28,2,480861,1,9,1,8,1,0,0,0,0,45,0,0 +42,5,187702,10,15,1,3,1,0,0,0,2415,60,0,1 +22,2,52262,5,10,0,4,0,0,0,0,0,40,0,0 +28,0,52636,3,14,1,1,1,0,0,0,0,40,0,0 +60,2,175273,1,9,6,8,4,0,1,0,0,40,0,0 +31,2,327825,1,9,4,8,4,0,1,0,2238,40,0,0 +47,2,125892,5,10,1,10,1,0,0,0,0,75,0,1 +30,2,398827,1,9,5,0,1,0,0,0,0,60,0,0 +61,2,208919,3,14,1,5,1,0,0,0,0,60,0,1 +71,4,365996,0,13,6,3,4,0,1,0,0,6,0,0 +42,2,307638,1,9,2,0,3,0,1,0,0,40,0,0 +44,4,33068,14,8,1,10,1,0,0,0,0,55,0,0 +46,1,254291,5,10,1,5,1,0,0,0,0,60,0,1 +50,4,125417,10,15,0,1,0,1,1,0,0,52,0,1 +27,0,28848,0,13,0,3,0,0,0,0,0,9,0,0 +21,2,194723,5,10,0,0,5,0,1,0,0,40,4,0 +25,2,195118,1,9,0,2,5,0,0,0,0,35,0,0 +61,2,123273,11,3,2,6,0,0,0,0,1876,56,0,0 +54,2,220115,5,10,2,0,0,0,0,0,0,30,0,0 +31,2,265706,0,13,0,5,0,0,0,0,0,40,0,0 +53,1,279129,5,10,1,7,1,0,0,0,0,30,0,0 +39,5,122742,6,12,1,1,1,0,0,15024,0,55,0,1 +57,5,172654,10,15,1,6,1,0,0,15024,0,50,0,1 +48,2,119199,0,13,2,5,4,0,1,0,0,44,0,0 +30,2,107793,5,10,1,6,1,0,0,0,0,56,0,1 +35,2,237943,1,9,1,2,1,0,0,0,0,60,0,0 +42,1,64632,1,9,1,1,1,0,0,0,0,50,0,0 +34,1,96245,1,9,1,8,1,0,0,0,0,40,0,0 +59,2,361494,1,9,1,5,1,0,0,0,0,40,0,1 +69,4,122850,12,6,1,1,1,0,0,0,0,20,0,0 +29,2,173652,5,10,0,0,3,0,1,0,0,40,0,0 +40,2,164663,1,9,1,6,1,0,0,0,0,40,0,0 +21,2,98678,5,10,0,4,3,0,0,0,0,15,0,0 +40,2,245529,6,12,2,3,0,0,1,0,0,40,0,0 +43,2,55294,5,10,1,10,1,0,0,0,0,40,0,0 +36,2,140583,1,9,2,2,0,0,0,0,0,40,0,0 +41,2,79797,1,9,3,3,0,2,0,0,0,40,28,1 +20,2,283499,5,10,0,6,3,0,0,0,0,30,0,0 +41,4,51111,0,13,6,0,0,0,1,0,0,40,0,0 +34,2,232475,5,10,2,1,0,0,0,0,0,50,0,0 +48,2,176140,2,7,2,4,4,1,1,0,0,40,0,0 +27,2,301654,1,9,0,1,3,0,1,0,0,40,0,0 +35,2,376455,5,10,1,1,1,0,0,15024,0,60,0,1 +27,2,229803,1,9,0,10,3,1,0,0,0,40,0,0 +20,2,337639,5,10,0,5,3,0,0,0,0,40,0,0 +18,2,130849,5,10,0,5,3,0,1,0,0,15,0,0 +32,2,296282,0,13,1,5,1,0,0,0,0,40,0,0 +38,2,266645,3,14,1,1,1,0,0,0,0,60,0,1 +23,0,110128,5,10,0,4,3,0,0,0,0,40,0,0 +28,2,90196,0,13,1,1,1,0,0,0,0,45,0,1 +40,0,40024,10,15,1,3,1,0,0,0,0,38,0,1 +35,2,144322,1,9,2,8,4,0,1,0,0,40,0,0 +74,5,162340,5,10,6,1,4,0,0,0,0,40,0,0 +28,2,169069,1,9,0,10,3,0,0,0,0,40,0,0 +23,2,113601,5,10,0,2,3,0,0,0,0,30,0,0 +20,1,157145,5,10,0,7,3,0,0,0,2258,10,0,0 +44,2,111275,1,9,2,8,4,1,1,0,0,56,0,0 +46,4,102076,1,9,2,0,4,0,1,0,0,25,0,0 +51,1,145409,0,13,1,5,1,0,0,15024,0,50,0,1 +40,2,190122,5,10,4,0,0,0,1,0,0,40,0,0 +48,2,331482,10,15,1,9,1,0,0,0,1977,40,0,1 +60,1,170114,4,5,1,7,1,0,0,0,1672,84,0,0 +48,5,193188,0,13,1,1,1,0,0,0,0,40,0,1 +46,4,267588,0,13,1,3,2,0,1,0,0,70,0,0 +48,5,200471,0,13,1,1,1,0,0,0,0,40,0,1 +24,4,322658,0,13,0,3,0,0,1,0,0,40,0,0 +45,0,263982,5,10,2,3,4,0,1,0,0,40,0,0 +18,2,266287,14,8,0,5,3,0,1,0,0,35,0,0 +39,2,278187,1,9,1,8,1,0,0,0,0,40,0,0 +65,5,81413,1,9,1,7,1,0,0,0,2352,65,0,0 +22,2,221745,5,10,2,8,3,0,1,0,0,40,0,0 +20,2,140764,5,10,0,4,3,0,1,0,0,20,0,0 +28,2,206351,5,10,1,5,1,0,0,0,0,40,0,0 +46,2,176814,10,15,1,3,1,0,0,99999,0,50,0,1 +42,4,245307,0,13,1,1,1,0,0,0,1977,48,0,1 +28,2,119545,5,10,1,1,3,0,0,7688,0,50,0,1 +18,2,179203,5,10,0,5,3,0,1,0,0,20,0,0 +24,3,44075,0,13,0,3,0,2,0,0,0,40,0,0 +45,2,178319,8,16,1,3,1,0,0,0,0,56,0,1 +24,2,219754,1,9,0,0,3,0,0,0,0,40,0,0 +44,2,198316,0,13,1,1,1,0,0,15024,0,50,0,1 +20,2,168165,5,10,0,4,3,0,0,0,0,30,0,0 +35,2,356838,5,10,1,9,1,0,0,2829,0,55,12,0 +52,5,210736,0,13,1,5,1,0,0,0,0,60,0,0 +25,2,173212,6,12,0,7,0,0,0,2354,0,45,0,0 +19,2,130431,11,3,0,7,0,0,0,0,0,36,4,0 +54,2,197481,5,10,2,0,4,0,1,0,0,40,0,0 +21,2,155066,5,10,0,10,3,0,0,0,0,40,0,0 +26,2,31290,1,9,1,0,2,0,1,0,0,40,0,1 +42,2,54102,9,11,2,0,4,0,1,0,0,40,0,0 +19,2,181546,5,10,0,0,3,0,1,0,0,40,0,0 +55,2,153484,3,14,1,1,1,0,0,0,1977,50,0,1 +44,0,351228,1,9,1,0,1,0,0,0,0,40,0,0 +25,2,131976,0,13,0,1,3,0,0,0,0,55,0,0 +26,2,200639,5,10,1,8,1,0,0,0,0,40,0,0 +64,3,267546,6,12,4,3,0,0,1,0,0,40,0,1 +41,2,179875,2,7,2,4,4,4,1,0,0,40,0,0 +43,2,300528,5,10,1,6,1,0,0,0,0,40,0,0 +45,2,67716,1,9,0,10,3,0,0,10520,0,48,0,1 +48,3,326048,0,13,1,3,1,0,0,0,0,44,0,1 +60,2,191188,1,9,1,6,1,0,0,0,0,40,0,0 +45,1,32172,5,10,0,7,0,0,0,0,0,50,0,0 +51,2,252903,12,6,1,5,1,0,0,0,1977,40,0,1 +37,3,334314,1,9,2,0,4,0,1,0,0,40,0,0 +22,2,83704,5,10,0,0,3,0,0,0,0,30,0,0 +44,2,160574,1,9,1,10,1,0,0,0,0,65,0,1 +27,2,203776,1,9,1,10,1,0,0,0,0,50,0,0 +47,4,328610,1,9,1,10,1,0,0,0,0,40,0,0 +32,2,295589,3,14,1,1,1,1,0,0,1977,40,0,1 +40,2,174373,0,13,1,1,1,0,0,0,0,50,0,1 +41,2,247752,1,9,1,5,1,0,0,0,0,40,0,0 +26,2,139992,0,13,0,3,0,0,1,0,0,40,0,0 +47,2,95680,5,10,1,1,1,2,0,0,0,40,0,0 +55,5,189933,1,9,1,1,1,0,0,0,0,45,0,0 +38,2,498785,1,9,1,2,1,0,0,0,0,40,0,0 +24,0,177526,0,13,0,3,0,0,0,0,0,15,0,0 +64,1,150121,8,16,1,1,1,0,0,0,0,25,0,1 +56,3,130454,0,13,1,3,1,0,0,0,0,40,0,1 +41,2,119079,1,9,1,5,1,0,0,0,0,49,0,1 +33,2,220939,1,9,1,5,1,0,0,7298,0,45,0,1 +33,2,94235,10,15,0,3,3,0,0,0,0,42,0,1 +21,2,305874,5,10,1,4,1,0,0,0,0,40,0,0 +59,4,62020,1,9,6,10,0,1,0,0,0,40,0,0 +58,2,235624,9,11,1,1,1,0,0,0,0,40,9,1 +43,4,247514,3,14,2,3,4,0,0,0,0,40,0,0 +21,2,275726,1,9,0,10,3,1,0,0,0,40,0,0 +45,2,72896,1,9,0,8,0,0,0,0,0,40,0,0 +53,4,110510,1,9,1,1,2,0,1,0,0,50,0,1 +27,2,200641,12,6,1,1,2,0,1,0,0,40,4,0 +38,2,242720,3,14,1,3,1,0,0,0,0,35,0,1 +31,2,111567,0,13,1,1,1,0,0,0,0,70,0,1 +41,2,179533,1,9,1,6,1,0,0,0,0,35,0,0 +22,0,334693,5,10,0,0,3,0,1,0,0,40,0,0 +43,1,198096,3,14,1,5,1,0,0,0,0,60,0,0 +41,0,355756,5,10,0,3,0,0,0,0,0,40,0,0 +27,2,19395,5,10,1,2,2,0,1,0,0,35,0,0 +41,4,242586,5,10,1,1,1,0,0,0,0,40,0,0 +36,2,208358,10,15,2,3,0,0,0,99999,0,45,0,1 +49,2,160647,0,13,1,0,2,0,1,0,0,40,0,1 +20,2,227943,1,9,0,2,3,0,0,0,0,45,0,0 +58,1,197665,1,9,3,4,4,0,1,0,0,45,0,0 +35,1,216129,14,8,0,4,0,1,1,0,0,40,33,0 +30,4,326104,1,9,1,11,1,0,0,0,0,40,0,1 +21,2,57211,1,9,0,10,3,0,0,0,0,40,0,0 +29,2,100219,6,12,0,8,4,0,0,0,0,45,0,0 +40,2,291192,1,9,6,5,0,0,1,0,0,40,0,0 +54,0,93415,0,13,0,3,4,2,1,0,0,40,0,1 +35,2,191502,0,13,1,5,1,0,0,0,0,60,0,1 +35,2,261382,0,13,1,5,1,0,0,0,0,50,0,0 +59,2,374924,1,9,4,5,4,1,1,0,0,40,0,0 +43,5,320984,5,10,1,8,1,0,0,0,0,50,0,0 +39,2,338320,12,6,1,10,1,0,0,0,0,60,0,1 +51,2,135190,7,4,4,8,0,1,1,0,0,30,0,0 +71,2,157909,5,10,0,4,0,0,1,2964,0,60,0,0 +33,2,637222,14,8,2,8,4,1,1,0,0,40,0,0 +28,2,430084,1,9,2,4,3,1,0,0,0,35,0,0 +30,2,125279,1,9,3,5,4,0,0,0,0,40,0,0 +20,2,221955,11,3,3,7,5,0,0,0,0,40,4,0 +51,5,180195,1,9,1,5,1,0,0,0,0,50,0,0 +39,2,208778,1,9,1,8,2,0,1,0,0,40,0,1 +62,2,81534,5,10,1,5,1,2,0,0,0,40,0,1 +28,2,142264,4,5,0,8,0,0,0,0,0,50,21,0 +23,2,128604,1,9,0,5,3,2,0,0,0,48,27,0 +39,2,277886,0,13,1,5,2,0,1,0,0,30,0,0 +50,5,100029,0,13,6,5,4,0,0,0,0,65,0,1 +31,2,169269,7,4,0,10,4,0,0,0,0,40,0,0 +45,4,160472,0,13,1,1,1,0,0,0,1977,50,0,1 +47,2,297884,12,6,6,8,0,0,0,0,0,40,0,0 +59,2,99131,1,9,6,3,0,0,1,0,0,18,0,0 +32,2,44392,6,12,1,2,1,0,0,0,0,40,0,0 +49,2,199029,0,13,1,5,1,0,0,0,2415,55,0,1 +74,3,181508,1,9,6,4,0,0,0,0,0,17,0,0 +22,2,190625,5,10,0,0,3,0,0,0,0,35,0,0 +32,2,194740,5,10,1,10,1,0,0,0,0,55,34,0 +34,2,27380,0,13,1,7,1,0,0,0,0,50,0,1 +59,2,160631,0,13,1,10,1,0,0,0,0,60,0,1 +36,2,224531,0,13,1,5,1,0,0,0,0,50,0,1 +59,2,283005,2,7,2,0,4,0,1,0,0,40,0,0 +47,5,101926,0,13,2,1,0,0,0,0,0,70,0,1 +53,4,135102,1,9,1,4,1,0,0,0,2002,45,0,0 +25,1,113436,5,10,0,10,4,0,0,0,0,35,0,0 +44,2,248973,0,13,2,0,0,1,0,0,0,65,0,0 +57,1,225334,10,15,1,5,2,0,1,15024,0,35,0,1 +42,1,157562,0,13,1,7,1,0,0,0,1902,80,0,1 +58,4,310085,12,6,1,6,1,0,0,0,0,40,0,0 +39,2,129597,0,13,1,5,1,0,0,3464,0,40,0,0 +45,2,204205,7,4,2,8,0,0,0,0,0,48,0,0 +47,2,169324,0,13,1,1,2,1,1,0,0,35,0,1 +52,2,141301,1,9,2,8,0,0,1,0,0,40,0,0 +34,2,235124,1,9,0,4,4,1,1,0,0,35,0,0 +36,1,367020,7,4,1,10,1,0,0,0,0,35,0,0 +41,2,149102,1,9,3,10,0,0,0,0,0,40,12,0 +30,2,423770,5,10,0,3,3,0,0,0,0,40,4,0 +44,2,211759,0,13,1,1,1,4,0,0,0,40,5,0 +34,2,56883,5,10,0,4,4,0,1,0,0,40,0,0 +41,2,223062,5,10,4,4,0,1,0,0,0,40,0,0 +29,2,406662,1,9,0,2,0,0,0,0,0,40,0,0 +25,2,206600,4,5,0,8,5,0,0,0,0,48,4,0 +42,4,147510,0,13,4,3,4,0,0,0,0,40,0,0 +48,2,235646,5,10,1,5,1,0,0,3103,0,40,0,1 +26,2,187577,9,11,0,5,0,0,0,0,0,55,0,0 +46,5,278322,0,13,1,5,1,0,0,0,0,45,0,0 +38,2,278924,0,13,1,1,1,0,0,0,1887,50,0,1 +49,0,203039,2,7,1,0,1,0,0,0,0,40,0,0 +23,2,145651,5,10,0,5,3,1,1,0,0,20,0,0 +46,4,144531,0,13,0,3,0,0,1,0,0,40,0,1 +30,2,91145,1,9,0,2,4,0,0,0,0,55,0,0 +49,1,211762,1,9,1,10,1,0,0,0,0,40,0,1 +31,2,207537,1,9,2,10,3,0,0,0,1669,50,0,0 +19,2,417657,1,9,0,2,3,0,0,0,0,50,0,0 +45,2,189890,6,12,2,3,4,0,1,5455,0,38,0,0 +34,2,223212,0,13,1,3,1,0,0,0,1848,40,30,1 +26,2,108658,1,9,0,10,0,0,0,0,0,40,0,0 +38,1,190023,1,9,1,6,1,0,0,0,0,40,0,1 +31,2,222130,5,10,0,0,0,0,1,0,0,43,0,0 +36,5,164866,6,12,4,1,0,0,0,0,0,50,0,0 +31,2,170983,0,13,1,1,1,0,0,0,0,60,0,1 +30,2,186269,0,13,1,9,1,0,0,0,0,40,0,0 +37,2,286026,1,9,1,3,1,0,0,0,0,40,0,1 +30,2,403433,0,13,0,3,0,1,0,0,0,50,0,1 +73,2,123160,12,6,6,4,0,0,1,0,0,10,0,0 +38,3,99527,3,14,1,1,1,0,0,0,0,40,0,1 +30,2,123178,12,6,0,10,0,0,0,0,0,50,0,0 +33,2,231043,1,9,1,10,1,0,0,0,0,50,0,1 +52,4,317733,0,13,1,3,1,0,0,7688,0,40,0,1 +58,2,241056,5,10,2,0,4,0,1,0,0,46,0,0 +34,4,220066,3,14,0,3,0,0,1,0,0,50,0,0 +35,2,180342,1,9,1,10,1,0,0,0,0,40,0,0 +59,3,31840,1,9,1,10,1,0,0,0,0,40,0,1 +45,2,183168,0,13,2,1,4,0,1,0,0,40,0,0 +27,2,386036,5,10,0,6,0,0,0,0,0,48,0,0 +31,4,446358,8,16,0,3,0,0,0,0,0,50,4,1 +45,2,28035,5,10,0,7,5,0,0,0,0,50,0,0 +40,2,282155,1,9,4,4,5,0,1,0,0,25,0,0 +27,2,192384,10,15,1,0,1,0,0,0,0,40,0,0 +19,2,383637,1,9,0,4,3,0,0,0,0,20,0,0 +29,2,457402,11,3,0,4,0,0,0,0,0,25,4,0 +34,5,80249,5,10,1,7,1,0,0,0,0,72,0,0 +32,0,159537,6,12,1,10,1,0,0,0,0,40,0,0 +49,2,240859,2,7,1,10,1,0,0,0,0,40,1,0 +33,2,83446,2,7,2,1,4,0,1,0,0,40,0,1 +62,2,185503,0,13,1,3,1,0,0,0,0,50,0,1 +39,1,68781,1,9,1,1,1,0,0,0,0,40,0,0 +43,2,220589,1,9,2,1,4,0,1,0,0,40,0,0 +22,2,51136,5,10,0,9,0,0,1,0,0,60,0,0 +24,2,54560,1,9,1,6,1,0,0,0,0,45,0,0 +25,2,201413,5,10,0,4,4,1,1,0,0,40,0,0 +19,2,40425,5,10,0,5,0,0,1,0,0,28,0,0 +31,2,189461,6,12,2,0,4,0,1,0,0,41,0,0 +53,2,200576,2,7,2,10,5,0,1,0,0,40,0,0 +61,2,92691,1,9,1,0,1,0,0,0,0,3,0,0 +47,2,664821,0,13,1,4,1,0,0,0,0,40,22,0 +37,2,175130,1,9,2,0,4,0,1,0,0,45,0,0 +50,1,391016,0,13,2,1,0,0,0,0,0,30,0,0 +27,2,249315,5,10,0,5,0,0,0,0,0,44,0,0 +58,2,111169,1,9,2,0,0,0,1,0,0,40,0,0 +43,2,334946,1,9,1,2,1,1,0,0,0,40,0,0 +39,2,352248,6,12,1,0,1,0,0,0,0,40,0,0 +36,2,173804,5,10,0,5,0,0,1,0,0,35,0,0 +56,2,155449,0,13,1,3,1,0,0,0,0,50,0,0 +26,2,73689,1,9,1,7,1,0,0,0,0,55,0,0 +23,2,227594,0,13,0,3,3,0,1,0,0,38,0,0 +47,2,161676,2,7,0,6,0,1,0,0,0,40,0,0 +68,2,75913,14,8,6,5,0,0,1,0,0,30,0,0 +47,4,242552,5,10,0,11,0,1,0,0,0,40,0,0 +45,3,352094,5,10,1,9,1,0,0,7688,0,40,24,1 +26,2,159732,5,10,1,1,1,0,0,0,0,60,0,0 +20,2,131230,1,9,0,8,3,0,0,0,1590,40,0,0 +46,2,180695,5,10,0,0,3,0,1,0,0,40,0,0 +37,2,189922,6,12,1,9,1,0,0,0,0,50,0,1 +37,2,409189,5,10,1,10,1,0,0,0,0,45,0,0 +43,2,111252,5,10,1,6,1,0,0,0,0,42,0,0 +59,2,294395,3,14,6,3,0,0,1,0,0,40,0,0 +39,2,172718,1,9,2,0,4,0,1,0,0,40,0,0 +32,2,43403,5,10,2,7,0,0,1,0,1590,54,0,0 +63,2,111963,5,10,1,3,1,0,0,0,0,16,0,0 +45,2,247869,0,13,1,3,1,0,0,0,0,60,0,1 +59,2,114032,0,13,2,0,4,0,1,0,0,40,0,0 +26,2,179633,1,9,0,9,5,0,0,0,0,40,0,0 +34,2,19847,1,9,2,0,4,0,1,0,0,40,0,0 +41,2,231689,1,9,1,10,1,0,0,0,0,40,0,1 +26,2,209942,1,9,0,2,3,1,0,0,0,40,0,0 +53,2,197492,1,9,2,8,0,0,1,0,0,40,0,0 +33,2,262439,1,9,1,0,2,0,1,0,0,35,0,1 +46,2,283037,0,13,1,1,1,0,0,0,0,50,0,1 +31,2,83446,1,9,6,10,4,0,1,0,0,40,0,0 +24,2,215443,1,9,4,4,0,0,0,0,0,40,0,0 +57,4,268252,1,9,2,0,4,0,1,0,0,62,0,0 +40,2,181015,1,9,4,4,4,0,1,0,0,47,0,0 +41,5,139916,9,11,1,5,1,4,0,0,2179,84,4,0 +20,2,195770,5,10,0,0,3,0,0,0,0,26,0,0 +45,2,125194,2,7,0,8,0,1,1,0,0,40,0,0 +27,2,58654,9,11,4,0,4,0,1,0,0,40,0,0 +36,2,252327,11,3,3,10,5,0,0,0,0,40,4,0 +30,2,116508,1,9,1,10,1,0,0,0,0,40,9,0 +36,2,166988,0,13,1,3,2,0,1,0,0,40,0,1 +25,2,374163,1,9,3,7,0,4,0,0,0,40,4,0 +31,2,196788,1,9,1,0,2,0,1,0,0,40,0,0 +49,2,186172,1,9,1,10,1,0,0,7688,0,45,0,1 +26,2,245628,2,7,0,2,4,0,0,0,0,20,0,0 +25,2,159732,0,13,0,3,0,0,0,0,0,40,0,0 +29,2,129856,9,11,0,0,3,0,1,0,0,40,0,0 +24,2,182812,5,10,0,0,3,0,1,3325,0,52,21,0 +41,2,314322,1,9,1,0,1,0,0,0,0,40,0,1 +35,2,102976,3,14,0,1,0,0,0,0,0,40,0,1 +57,5,42959,0,13,1,5,2,0,1,0,0,40,0,1 +21,2,256356,2,7,0,13,5,0,1,0,0,40,4,0 +29,2,136277,12,6,0,4,3,1,1,0,0,32,0,0 +36,2,284616,5,10,1,1,1,0,0,0,0,40,0,0 +20,2,185554,5,10,0,0,3,0,1,0,0,25,0,0 +51,2,138847,0,13,1,1,1,0,0,0,0,40,0,1 +39,2,33487,2,7,1,8,1,0,0,0,0,40,0,0 +36,2,84306,0,13,1,1,1,0,0,5013,0,50,0,0 +40,1,223881,10,15,1,3,1,0,0,99999,0,70,0,1 +61,2,149653,1,9,1,1,1,0,0,0,0,50,0,0 +38,2,348739,10,15,1,3,1,0,0,0,0,60,0,0 +21,2,34506,1,9,4,4,3,0,1,0,0,35,0,0 +40,2,346964,1,9,2,9,4,0,1,0,0,40,0,0 +46,2,192208,12,6,1,10,1,0,0,0,0,45,0,0 +21,2,305874,5,10,1,10,1,0,0,0,0,54,0,0 +35,1,462890,12,6,1,6,1,1,0,0,0,50,0,0 +39,2,89508,0,13,1,5,1,0,0,0,0,40,0,0 +38,1,200153,1,9,1,10,1,0,0,0,0,60,0,0 +30,2,179446,1,9,4,0,4,0,1,0,0,40,0,0 +28,2,208965,4,5,0,8,4,4,0,0,0,40,4,0 +32,2,40142,0,13,1,1,1,0,0,0,0,40,0,1 +46,1,57452,9,11,1,10,1,0,0,0,0,40,0,1 +40,2,327573,9,11,1,10,1,0,0,0,0,40,0,0 +47,2,151267,1,9,1,8,2,1,1,15024,0,40,0,1 +44,2,265266,12,6,1,6,1,0,0,0,0,40,0,0 +38,2,203836,1,9,1,5,1,0,0,3464,0,40,13,0 +46,1,28281,0,13,1,7,1,0,0,0,0,40,0,1 +51,2,293196,8,16,1,3,1,0,0,15024,0,60,10,1 +45,2,214627,8,16,6,3,4,0,0,15020,0,40,10,1 +20,2,368852,5,10,0,4,3,0,1,0,0,20,0,0 +44,2,353396,0,13,1,3,1,0,0,0,0,45,0,0 +33,2,161745,9,11,1,7,1,0,0,0,0,45,0,0 +18,2,97963,1,9,0,4,3,0,1,0,0,30,0,0 +61,5,156542,10,15,4,3,0,0,0,0,0,40,0,1 +50,0,198103,0,13,0,1,0,0,1,0,0,40,0,0 +47,3,55377,1,9,0,8,3,1,0,0,0,40,0,0 +34,2,173730,0,13,1,1,1,0,0,0,0,50,0,1 +53,2,374588,1,9,1,6,1,1,0,0,0,60,0,0 +39,1,174330,5,10,1,10,1,0,0,0,0,40,0,0 +58,2,78141,1,9,1,10,1,0,0,0,0,40,0,1 +26,2,31350,2,7,0,7,0,0,0,0,0,50,0,0 +41,2,243607,11,3,1,0,1,0,0,0,0,40,4,0 +47,4,134671,5,10,1,1,1,0,0,0,0,40,0,0 +31,2,197023,9,11,1,8,1,3,0,0,0,40,0,0 +52,2,117674,5,10,1,1,1,0,0,0,0,40,0,1 +29,2,169815,6,12,1,5,1,0,0,0,0,50,0,1 +43,2,598606,4,5,4,2,4,1,1,0,0,50,0,0 +42,3,122861,3,14,1,1,1,0,0,0,0,40,0,1 +35,2,166235,5,10,0,8,0,1,1,0,0,30,0,0 +41,2,187821,1,9,1,8,1,0,0,2885,0,40,0,0 +34,2,340940,0,13,1,5,1,0,0,7298,0,60,0,1 +52,1,194791,5,10,1,10,1,0,0,0,0,40,0,0 +61,2,231323,5,10,1,10,1,0,0,0,0,40,0,0 +39,4,305597,1,9,4,1,4,0,0,0,0,40,0,0 +19,2,25429,5,10,0,5,0,0,1,0,0,25,0,0 +46,0,192779,0,13,1,1,1,0,0,7688,0,40,0,1 +39,2,346478,5,10,0,1,0,0,0,0,0,45,0,0 +22,2,341368,5,10,0,4,0,0,0,0,0,50,0,0 +30,0,295612,1,9,4,0,0,0,1,0,0,40,0,0 +40,2,168936,9,11,2,4,0,0,1,0,0,32,0,0 +43,2,218558,0,13,3,3,0,0,0,3325,0,40,0,0 +37,2,336598,11,3,1,7,1,0,0,0,0,36,4,0 +23,2,308205,6,12,0,4,3,0,0,0,0,20,0,0 +39,4,357173,6,12,2,3,0,0,0,0,0,59,0,0 +54,2,457237,3,14,1,5,1,0,0,0,0,40,0,0 +46,5,284799,5,10,1,5,1,0,0,0,0,60,0,0 +20,2,179423,5,10,0,6,3,0,1,0,0,40,0,0 +50,1,363405,0,13,1,9,2,0,1,0,0,50,0,1 +17,2,139183,12,6,0,5,3,0,1,0,0,15,0,0 +36,2,203482,1,9,1,8,1,0,0,0,0,40,0,0 +37,2,112554,1,9,1,5,1,0,0,0,0,45,0,0 +53,2,99476,1,9,2,4,0,0,1,0,0,38,0,0 +50,2,93690,1,9,1,6,1,0,0,0,0,40,0,1 +38,2,220585,1,9,1,10,1,0,0,0,0,40,0,0 +63,1,194638,1,9,1,10,1,0,0,0,0,32,0,0 +53,2,154785,1,9,1,10,1,0,0,0,0,50,0,1 +23,5,214542,5,10,0,3,0,0,0,0,0,50,0,0 +20,2,161922,1,9,0,2,0,0,0,0,0,43,0,0 +46,2,207940,5,10,1,10,1,1,0,0,0,40,0,1 +28,2,259351,12,6,0,4,5,3,0,0,0,40,4,0 +59,2,208395,3,14,2,3,0,0,0,0,0,50,0,0 +41,2,116391,0,13,1,1,1,0,0,0,0,40,0,1 +33,2,239781,13,1,1,7,1,0,0,0,0,40,4,0 +56,2,174351,14,8,1,10,1,0,0,0,0,40,25,0 +50,1,44368,1,9,1,5,1,0,0,15024,0,55,22,1 +31,4,188798,0,13,0,1,0,0,1,0,0,50,0,0 +41,2,50122,9,11,2,5,3,0,0,0,0,50,0,0 +38,2,111398,0,13,1,3,2,0,1,7688,0,40,0,1 +25,0,152035,6,12,0,0,3,0,1,0,0,40,0,0 +49,4,249289,0,13,2,3,4,1,1,0,0,40,0,0 +39,2,257726,5,10,0,8,3,0,0,0,0,40,0,0 +21,2,151158,5,10,0,3,3,0,1,0,0,25,0,0 +35,2,465326,0,13,1,5,1,0,0,0,0,40,0,0 +38,2,364782,1,9,1,10,1,0,0,0,0,40,0,1 +31,2,329301,1,9,2,6,0,0,0,0,0,55,0,0 +17,5,254859,2,7,0,3,3,0,0,0,0,20,0,0 +31,2,203488,0,13,1,0,1,0,0,7298,0,50,0,1 +25,4,222800,0,13,0,3,0,0,0,0,0,40,0,0 +39,2,96452,3,14,1,1,1,0,0,0,0,55,0,1 +50,2,170050,7,4,1,8,1,0,0,0,0,40,0,0 +38,4,116580,0,13,1,3,2,0,1,0,0,20,0,1 +50,2,400004,5,10,1,5,1,0,0,0,0,60,0,0 +63,2,183608,12,6,1,1,1,0,0,0,0,40,0,0 +31,2,194055,1,9,1,6,1,0,0,0,0,50,0,0 +23,2,210443,0,13,0,3,3,0,1,0,0,40,0,0 +18,2,43272,5,10,0,4,3,0,0,0,0,20,0,0 +43,4,108945,0,13,2,3,4,0,1,0,0,48,0,0 +34,2,114691,5,10,1,1,1,0,0,0,0,50,0,1 +18,2,304169,2,7,0,5,3,0,0,0,0,35,0,0 +46,2,503923,1,9,1,8,1,1,0,4386,0,40,0,1 +35,2,340428,0,13,0,5,4,0,1,0,0,40,0,1 +46,0,106705,3,14,0,1,0,0,1,0,0,38,0,0 +59,2,146391,9,11,1,9,1,0,0,7298,0,40,0,1 +31,2,235389,7,4,0,2,0,0,1,0,0,30,20,0 +27,2,39665,1,9,2,5,4,0,1,0,0,37,0,0 +41,2,113823,3,14,1,3,1,0,0,0,0,40,7,0 +55,2,349304,0,13,1,1,1,0,0,0,0,40,0,1 +44,2,54507,1,9,0,8,0,0,1,0,0,40,0,0 +26,2,117833,0,13,0,1,0,0,1,0,1669,50,0,0 +36,2,163396,9,11,1,3,2,0,1,0,0,40,0,1 +69,2,88566,4,5,1,4,1,0,0,1424,0,35,0,0 +33,2,323619,5,10,0,0,4,0,1,0,0,40,0,0 +30,2,75755,9,11,1,3,1,0,0,0,0,40,0,0 +35,2,148903,1,9,1,4,2,0,1,0,0,16,0,1 +25,2,40915,0,13,0,1,0,0,1,0,0,40,0,1 +18,2,131033,2,7,0,4,5,1,0,0,0,15,0,0 +35,1,168475,5,10,1,10,1,0,0,0,0,60,0,1 +20,2,121568,1,9,1,2,1,0,0,0,0,50,0,0 +26,2,139098,3,14,1,3,1,0,0,5013,0,40,0,0 +46,2,357338,0,13,1,9,1,0,0,0,0,40,0,0 +31,2,283268,0,13,0,3,4,0,1,0,0,36,0,0 +40,2,572751,10,15,1,10,1,0,0,5178,0,40,4,1 +40,2,315321,1,9,2,1,4,0,1,0,625,52,0,0 +31,2,120461,0,13,0,1,0,0,1,0,0,40,0,0 +32,1,65278,8,16,1,1,1,0,0,0,0,40,0,0 +23,1,208503,5,10,2,0,3,0,0,0,0,40,0,0 +25,4,112835,3,14,0,11,0,0,0,0,0,40,0,0 +37,2,265038,5,10,1,6,1,0,0,0,0,50,0,0 +18,2,89478,5,10,0,5,3,0,1,0,0,20,0,0 +55,2,276229,1,9,6,5,0,0,1,0,0,38,0,0 +52,2,366232,4,5,2,10,4,0,1,0,0,40,1,0 +26,2,152035,1,9,0,0,3,0,1,0,0,40,0,0 +37,2,205339,5,10,0,9,0,0,0,0,0,40,0,1 +39,2,75995,1,9,2,1,4,0,1,0,0,45,0,0 +62,1,192236,0,13,2,3,0,0,1,0,0,40,0,1 +47,2,229737,1,9,1,10,1,0,0,0,0,45,0,1 +51,4,199688,0,13,1,11,1,0,0,0,0,40,0,1 +55,2,52953,1,9,2,4,4,0,1,0,0,40,0,0 +30,2,221043,1,9,1,10,1,0,0,0,0,35,0,0 +59,3,115389,5,10,1,10,1,0,0,0,0,36,0,0 +45,1,204205,12,6,1,10,1,0,0,0,0,65,0,0 +52,2,338816,5,10,1,1,1,0,0,15024,0,45,0,1 +21,2,197387,1,9,0,2,3,0,0,0,0,20,0,0 +31,2,42485,1,9,1,8,1,0,0,0,0,55,0,0 +29,2,367706,5,10,0,0,3,1,0,0,0,40,0,0 +24,2,102493,1,9,1,2,1,0,0,0,0,40,0,0 +17,2,263746,12,6,0,4,3,0,0,0,0,24,0,0 +47,2,115358,1,9,2,8,0,1,1,0,0,40,0,0 +46,2,189680,5,10,1,5,1,0,0,0,0,50,0,1 +63,2,230823,14,8,1,6,1,0,0,0,0,40,1,0 +21,2,300812,5,10,0,4,3,0,0,0,0,25,0,0 +18,2,174732,1,9,0,4,5,1,0,0,0,36,0,0 +49,0,183710,8,16,1,1,1,0,0,0,0,50,0,1 +81,1,137018,1,9,6,0,0,0,1,0,0,20,0,0 +36,5,213008,6,12,1,1,1,0,0,0,0,40,0,1 +47,2,357848,1,9,1,10,1,0,0,0,0,40,0,1 +36,2,165799,3,14,1,5,1,0,0,0,0,50,0,1 +39,1,188571,9,11,1,7,1,0,0,0,0,60,0,0 +46,2,97883,0,13,0,5,0,0,1,0,0,35,0,0 +43,4,105862,5,10,1,0,2,0,1,0,1902,40,0,1 +39,4,57424,0,13,2,0,4,0,1,0,0,35,0,0 +29,2,151476,5,10,4,5,0,0,1,0,0,40,0,0 +23,2,129583,1,9,0,2,3,1,1,0,0,16,0,0 +57,2,180920,12,6,1,10,1,0,0,0,0,43,0,0 +38,1,182416,1,9,0,5,4,1,1,0,0,42,0,0 +25,2,251915,0,13,0,5,3,0,1,0,0,40,0,0 +39,4,187127,5,10,1,1,1,0,0,0,0,40,0,0 +24,2,69045,5,10,0,5,0,1,0,0,0,40,2,0 +56,2,192869,3,14,1,10,1,0,0,0,1977,44,0,1 +39,2,74163,14,8,2,5,0,0,1,0,0,40,0,0 +23,2,60847,9,11,0,5,4,0,1,0,0,60,0,0 +67,1,116057,1,9,2,1,0,0,1,3273,0,16,0,0 +41,2,82393,0,13,0,0,0,2,0,0,0,50,0,0 +24,4,134181,0,13,0,3,3,0,1,0,0,50,0,0 +51,2,159910,0,13,2,1,0,1,0,10520,0,40,0,1 +30,5,117570,1,9,2,4,0,0,1,0,0,60,0,0 +47,5,214169,1,9,1,7,1,0,0,15024,0,40,0,1 +56,2,56331,1,9,0,8,0,0,0,0,0,32,0,0 +51,2,35576,1,9,2,10,0,0,0,0,0,38,0,0 +57,1,149168,5,10,1,1,1,0,0,0,0,55,0,0 +34,2,157165,5,10,2,4,4,0,1,0,0,40,0,0 +24,2,278130,0,13,0,3,0,0,0,0,0,40,0,0 +57,2,257200,1,9,1,8,1,0,0,0,0,40,0,0 +38,2,283122,1,9,1,8,1,0,0,0,0,40,0,1 +23,2,580248,1,9,0,9,0,0,1,0,0,40,0,0 +35,2,230054,7,4,1,8,1,0,0,0,0,40,4,0 +58,2,519006,1,9,1,10,1,0,0,0,0,52,0,0 +68,0,235882,8,16,1,3,1,0,0,0,2377,60,0,1 +43,2,336513,5,10,1,1,1,0,0,0,1902,40,0,1 +17,2,115551,2,7,0,4,3,0,1,0,0,20,0,0 +53,0,50048,8,16,1,3,1,0,0,7688,0,50,0,1 +37,5,382802,8,16,1,3,1,1,0,0,0,99,0,1 +63,2,106023,1,9,1,10,1,0,0,0,0,40,0,1 +31,2,332379,5,10,3,6,4,0,0,0,0,50,0,0 +29,2,95465,1,9,1,4,1,0,0,0,0,40,0,0 +43,4,96102,5,10,1,11,1,0,0,0,1887,40,0,1 +27,2,36440,10,15,0,3,0,0,1,0,0,65,0,1 +25,1,209384,1,9,0,4,5,0,0,0,0,32,0,0 +28,2,50814,1,9,0,3,0,0,1,0,0,40,0,0 +54,2,143865,1,9,2,5,4,0,1,0,0,35,0,0 +31,4,50442,5,10,0,1,3,3,1,0,0,32,0,0 +23,2,236601,5,10,0,9,0,0,0,0,0,48,0,0 +19,2,100999,0,13,0,3,3,0,1,0,0,30,0,0 +61,1,32423,1,9,1,7,2,0,1,22040,0,40,0,0 +27,5,153546,9,11,1,4,2,0,1,0,0,36,0,1 +19,2,182355,5,10,0,0,3,1,1,0,0,20,0,0 +25,4,44216,1,9,2,0,0,3,1,0,0,35,0,0 +40,2,97688,5,10,1,9,1,0,0,0,0,48,0,1 +53,2,209022,2,7,2,4,0,0,1,0,0,37,0,0 +32,2,96016,0,13,0,3,0,0,0,0,0,45,0,0 +72,1,52138,8,16,1,3,1,0,0,0,2392,25,0,1 +61,2,159046,7,4,1,6,1,0,0,0,0,40,0,0 +42,2,138634,1,9,1,5,1,0,0,0,0,40,0,0 +17,2,130125,12,6,0,4,3,3,1,1055,0,20,0,0 +73,2,247355,1,9,1,6,1,0,0,0,0,16,8,0 +41,1,227065,5,10,4,10,0,0,0,0,0,40,0,0 +23,2,244771,5,10,0,8,3,1,1,0,0,20,2,0 +23,2,215616,1,9,0,3,0,0,1,0,0,40,8,0 +65,2,386672,9,11,1,0,1,0,0,0,0,15,0,0 +45,5,177543,1,9,1,5,2,0,1,0,0,50,0,0 +52,3,617021,0,13,1,9,1,1,0,7688,0,40,0,1 +24,4,117109,0,13,0,0,3,1,1,0,0,27,0,0 +23,2,373550,9,11,1,10,1,0,0,0,0,40,0,0 +30,2,19847,5,10,2,9,3,0,1,0,0,40,0,0 +26,2,189590,0,13,0,1,0,0,0,0,0,40,0,0 +37,1,58343,1,9,2,7,4,0,0,0,0,56,0,0 +17,2,354201,1,9,0,4,3,0,0,0,0,40,0,0 +31,2,119422,1,9,1,5,1,0,0,0,0,40,0,0 +52,2,363405,1,9,4,0,5,0,1,0,0,40,0,0 +63,2,181863,0,13,0,5,0,0,0,0,0,27,0,0 +27,2,194472,1,9,0,13,0,0,1,0,0,60,0,0 +31,2,247328,4,5,1,8,1,0,0,3137,0,40,4,0 +71,1,130731,1,9,6,0,0,0,1,0,0,35,0,0 +35,2,236910,0,13,1,1,1,0,0,0,0,60,0,0 +44,2,378251,1,9,1,0,2,0,1,0,0,38,0,0 +36,2,120760,3,14,1,3,1,2,0,0,0,40,26,0 +22,2,203182,0,13,0,1,5,0,1,0,0,20,0,0 +32,2,130304,1,9,1,3,1,0,0,0,1485,48,0,0 +30,4,352542,0,13,2,3,4,0,1,0,0,40,0,0 +25,2,197728,5,10,0,0,3,0,1,0,0,40,0,0 +76,2,316185,7,4,6,11,0,0,1,0,0,12,0,0 +41,2,89226,1,9,2,10,0,0,0,0,0,40,0,0 +26,2,292353,7,4,1,8,1,4,0,0,0,40,0,0 +32,2,180296,5,10,2,0,4,0,1,0,0,40,0,0 +22,2,361487,1,9,0,10,0,0,0,0,0,40,0,0 +39,2,218490,0,13,1,5,1,0,0,0,1848,40,0,1 +63,1,231777,0,13,0,6,0,0,0,0,0,40,0,0 +23,2,189832,6,12,0,6,4,0,1,0,0,40,0,0 +61,2,232308,12,6,1,8,1,0,0,0,0,40,0,0 +31,0,33308,9,11,1,10,1,0,0,0,0,40,0,0 +25,2,333677,4,5,1,8,1,0,0,0,0,45,0,0 +33,2,170651,1,9,0,4,3,0,1,1055,0,40,0,0 +39,2,343403,1,9,1,5,2,0,1,0,0,36,0,0 +53,2,166386,0,13,1,8,2,2,1,0,0,40,26,0 +26,3,48099,0,13,0,1,0,0,1,0,0,40,0,0 +21,2,143062,5,10,0,4,3,0,0,0,0,32,0,0 +18,2,104704,1,9,0,0,3,1,0,0,0,40,0,0 +34,2,30497,0,13,1,1,1,0,0,15024,0,60,0,1 +44,0,174325,3,14,1,3,1,1,0,7688,0,40,0,1 +31,2,286675,1,9,2,10,3,0,0,0,0,50,0,0 +44,2,59474,1,9,1,6,1,0,0,0,0,40,0,1 +42,2,378384,10,15,1,3,1,0,0,0,1902,60,0,1 +43,2,245842,1,9,1,8,1,0,0,0,0,44,4,0 +33,2,274222,0,13,1,4,1,2,0,7688,0,38,0,1 +21,2,342575,5,10,0,5,3,1,1,0,0,30,0,0 +30,2,206051,1,9,1,2,1,0,0,0,0,40,0,1 +55,2,234213,1,9,1,6,1,0,0,0,0,60,0,0 +57,2,145189,5,10,0,0,0,0,1,0,0,40,0,0 +37,2,233490,1,9,0,7,0,0,0,0,0,50,0,0 +32,2,344129,1,9,1,8,1,0,0,0,0,40,0,1 +62,1,171315,0,13,1,3,1,0,0,0,0,60,0,1 +31,1,181485,0,13,0,5,0,1,0,0,0,40,0,1 +51,2,255412,0,13,1,1,1,0,0,0,0,50,23,1 +37,2,262409,3,14,2,1,4,0,1,0,213,45,0,0 +45,2,199590,11,3,1,6,1,0,0,0,0,38,4,0 +47,2,84726,5,10,1,8,1,0,0,0,0,40,0,0 +75,1,184335,2,7,1,1,1,0,0,0,0,30,0,0 +43,2,102025,3,14,1,3,1,4,0,0,0,50,0,0 +39,2,183898,6,12,1,10,1,0,0,7688,0,60,9,1 +30,2,55291,0,13,1,3,1,0,0,0,0,40,0,1 +27,2,150025,11,3,0,2,5,0,0,0,0,40,24,0 +44,2,100584,1,9,1,8,1,3,0,0,0,40,0,0 +53,4,181755,3,14,2,3,0,0,1,0,0,35,0,1 +40,2,150528,0,13,1,0,1,0,0,0,0,40,0,0 +18,2,107277,2,7,0,5,3,0,1,0,0,20,0,0 +33,2,247205,0,13,1,11,1,1,0,0,0,40,7,0 +20,2,291979,1,9,0,5,3,0,0,0,0,40,0,0 +38,2,270985,5,10,1,1,1,1,0,0,0,50,0,0 +48,2,62605,1,9,2,0,0,0,1,0,0,35,0,0 +46,1,176863,1,9,1,1,1,0,0,0,0,40,0,0 +51,2,53197,1,9,1,10,1,0,0,0,0,40,0,0 +35,1,267776,1,9,0,4,5,0,1,0,0,30,0,0 +24,2,308205,7,4,0,2,5,0,0,0,0,40,4,0 +30,2,306383,5,10,2,2,0,0,0,0,0,50,0,0 +70,2,35494,1,9,1,1,1,0,0,0,0,30,0,0 +26,2,291968,1,9,1,6,1,0,0,0,0,44,0,0 +34,2,80933,1,9,1,10,1,0,0,0,1672,40,0,0 +46,2,271828,1,9,1,10,1,0,0,0,0,40,0,1 +70,2,121993,1,9,1,0,2,0,1,0,0,5,0,0 +37,4,31023,5,10,1,4,1,0,0,0,0,40,0,0 +36,1,36425,5,10,2,5,4,0,1,0,0,35,0,0 +23,2,407684,4,5,0,8,5,0,1,0,0,40,4,0 +28,2,241895,1,9,1,5,1,0,0,0,1628,40,0,0 +44,1,158555,5,10,1,1,1,0,0,0,0,50,0,1 +58,2,140363,1,9,2,8,0,0,0,3325,0,30,0,0 +53,2,123429,5,10,1,1,1,0,0,0,0,60,0,1 +23,2,40060,5,10,1,2,1,0,0,0,0,40,0,0 +26,2,290286,1,9,0,10,0,1,0,0,0,40,0,0 +34,4,106169,3,14,2,3,0,0,1,0,0,50,0,0 +43,2,76487,2,7,1,10,1,0,0,0,0,40,0,0 +22,2,437994,5,10,0,4,5,1,0,0,0,20,0,0 +41,2,113555,5,10,1,10,1,3,0,7298,0,50,0,1 +36,2,160120,1,9,1,0,1,2,0,0,0,40,36,0 +41,4,343079,0,13,1,3,2,0,1,0,1740,20,0,0 +27,2,406662,1,9,0,0,0,0,0,4416,0,40,0,0 +42,1,37618,5,10,1,7,1,0,0,0,0,60,0,0 +27,2,114158,9,11,0,0,3,0,1,0,0,35,0,0 +41,2,115562,1,9,2,11,3,0,0,0,0,40,0,0 +32,2,353994,0,13,1,1,5,2,1,0,0,40,26,1 +21,2,344891,5,10,0,0,3,2,0,0,0,20,0,0 +44,2,286750,0,13,1,1,1,1,0,0,0,50,0,1 +29,2,194197,0,13,0,1,3,0,0,0,0,40,0,0 +19,1,206599,5,10,0,4,3,0,1,0,0,22,0,0 +21,4,596776,5,10,0,0,3,0,0,0,0,40,24,0 +46,2,56841,1,9,1,6,1,0,0,0,0,40,0,0 +38,2,112561,0,13,1,1,1,0,0,0,0,55,0,1 +43,2,147110,5,10,0,0,4,0,0,0,0,48,0,1 +54,5,175339,1,9,1,5,1,0,0,0,0,50,0,1 +38,2,234901,3,14,1,1,1,0,0,0,1977,60,0,1 +50,2,217083,1,9,1,0,2,0,1,0,0,40,0,1 +30,2,97757,9,11,1,3,2,0,1,0,0,36,0,1 +30,2,151868,4,5,1,10,1,0,0,0,0,40,0,0 +28,4,25864,1,9,0,1,4,3,1,0,0,35,0,0 +26,2,109419,9,11,0,0,0,0,1,0,0,45,0,0 +37,3,203070,5,10,1,10,1,0,0,0,0,43,0,0 +32,2,107843,1,9,1,8,1,0,0,5178,0,50,0,1 +64,0,264544,3,14,1,3,2,0,1,0,0,5,0,1 +18,2,148644,1,9,0,5,3,0,1,0,0,28,0,0 +30,2,125762,5,10,1,0,1,0,0,0,0,30,0,0 +18,2,193741,2,7,0,4,5,1,0,0,0,30,0,0 +27,2,588905,1,9,1,10,1,0,0,0,0,40,0,0 +49,2,115613,4,5,1,4,1,0,0,0,0,40,0,0 +46,0,222374,1,9,1,4,1,0,0,0,0,43,0,1 +37,2,185359,1,9,1,0,1,0,0,0,0,40,0,0 +30,2,173647,5,10,2,6,0,0,0,0,0,40,0,0 +29,2,31166,1,9,2,3,0,4,1,0,0,30,9,0 +25,1,189027,1,9,1,7,1,0,0,0,0,30,0,0 +38,2,296125,1,9,4,13,4,1,1,0,0,30,0,0 +35,2,334291,5,10,1,10,1,0,0,0,0,50,0,0 +56,2,318450,3,14,1,0,1,0,0,0,0,80,0,1 +29,2,174163,5,10,2,1,0,0,1,0,0,40,0,0 +41,2,119721,1,9,1,9,1,0,0,0,0,40,0,0 +47,2,142719,1,9,1,8,1,0,0,0,0,40,0,0 +23,2,162593,0,13,0,0,0,2,1,0,0,40,0,0 +46,1,236852,0,13,1,5,1,0,0,0,0,45,0,1 +28,4,154863,1,9,0,11,5,1,0,0,1876,40,0,0 +39,2,168894,0,13,2,0,4,0,1,0,0,20,0,0 +42,1,344920,5,10,1,7,2,0,1,0,0,50,0,0 +39,2,33355,1,9,1,6,1,0,0,7298,0,48,0,1 +37,5,291518,0,13,1,10,1,0,0,15024,0,55,0,1 +57,2,170244,10,15,0,3,0,0,1,0,0,40,0,0 +22,2,369549,5,10,0,4,0,1,1,0,0,30,0,0 +24,2,23438,9,11,0,0,0,0,0,0,0,30,0,1 +19,2,202673,5,10,0,2,3,0,0,0,0,50,0,0 +55,2,171780,6,12,2,5,4,1,1,0,0,30,0,0 +37,4,264503,1,9,1,11,1,0,0,0,0,40,0,0 +37,4,244341,5,10,0,0,4,1,1,0,0,40,0,0 +28,2,209109,0,13,1,4,1,0,0,0,0,50,0,0 +27,2,187392,1,9,0,4,0,0,1,0,0,40,0,0 +40,0,119578,0,13,0,3,4,0,1,0,0,20,0,0 +51,2,195105,1,9,2,13,3,0,1,0,0,40,0,0 +52,2,101752,9,11,1,6,1,0,0,0,0,56,0,0 +49,5,362654,5,10,1,1,1,0,0,15024,0,50,0,1 +40,3,77332,5,10,2,0,0,0,1,0,0,50,0,0 +80,2,87518,5,10,0,3,0,0,0,0,1816,60,0,0 +63,2,113324,5,10,1,11,1,0,0,0,0,40,0,0 +63,2,96299,1,9,2,6,4,0,0,0,0,45,0,1 +51,2,237729,5,10,2,0,4,0,1,0,0,40,0,0 +23,2,200973,1,9,0,0,0,0,1,0,0,40,0,0 +66,1,212456,1,9,6,10,0,0,0,0,0,20,0,0 +33,1,131568,1,9,1,5,1,0,0,0,0,66,0,0 +49,2,185859,1,9,1,10,1,0,0,0,0,43,0,0 +20,2,231981,5,10,0,6,0,0,0,0,0,32,0,0 +33,5,117963,6,12,1,1,1,0,0,0,1887,60,0,1 +26,2,78172,5,10,5,11,1,0,0,0,0,40,0,0 +52,2,164135,1,9,1,1,1,0,0,0,0,50,0,1 +33,2,171216,0,13,1,1,1,0,0,0,0,50,0,1 +47,2,140664,0,13,2,5,0,0,0,0,0,45,0,0 +23,2,249277,1,9,0,1,3,1,0,0,0,75,0,0 +53,3,117847,6,12,1,0,1,0,0,0,0,40,0,0 +19,2,52372,5,10,0,4,3,0,0,0,0,20,0,0 +26,3,95806,5,10,0,10,0,0,0,3325,0,40,0,0 +53,2,137428,7,4,1,6,1,0,0,0,0,60,0,1 +65,2,169047,1,9,0,8,0,0,0,0,0,10,0,0 +68,2,339168,0,13,1,6,1,0,0,0,0,30,0,0 +30,2,504725,12,6,0,5,5,0,0,0,0,18,24,0 +28,2,132870,2,7,1,10,1,0,0,0,0,45,0,0 +54,4,135840,12,6,1,11,1,0,0,0,0,45,0,0 +30,2,35644,1,9,0,4,3,0,0,0,0,10,0,0 +22,2,198148,5,10,0,0,3,0,0,0,0,50,0,0 +25,2,220098,1,9,0,4,3,0,0,0,0,30,0,0 +19,2,262515,2,7,0,4,5,0,0,0,0,20,0,0 +32,3,111567,10,15,1,3,1,0,0,0,0,40,0,1 +23,2,194096,0,13,0,1,3,0,1,0,0,40,0,0 +51,4,420917,0,13,1,3,1,0,0,0,0,45,0,0 +25,2,197871,5,10,1,5,1,0,0,0,0,44,0,1 +46,4,253116,0,13,0,3,0,1,1,0,0,40,0,0 +38,2,206535,5,10,2,9,4,0,1,0,0,50,0,0 +26,0,70447,1,9,1,11,1,2,0,0,0,40,0,1 +46,2,201217,1,9,2,3,0,0,1,0,0,40,0,0 +25,2,209970,0,13,0,3,0,0,1,0,0,40,0,0 +20,2,196745,5,10,0,4,3,0,1,594,0,16,0,0 +29,4,175262,3,14,1,3,5,0,0,0,0,35,0,0 +51,5,304955,3,14,1,1,1,0,0,0,0,50,0,1 +40,2,181265,5,10,1,10,1,0,0,0,0,52,0,0 +24,2,200973,5,10,0,0,0,0,1,0,0,40,0,0 +24,1,37440,0,13,0,7,4,0,0,0,0,50,0,0 +31,2,395170,9,11,1,4,2,3,1,0,0,24,4,0 +34,2,353213,6,12,4,10,0,0,0,0,0,60,0,0 +19,2,38619,5,10,0,7,3,0,0,0,0,66,0,0 +21,2,177711,1,9,0,6,3,1,0,0,0,40,0,0 +21,2,190761,12,6,1,7,1,0,0,0,0,70,0,0 +23,2,27776,5,10,1,6,1,0,0,0,0,24,0,0 +37,3,470663,5,10,0,10,0,0,0,0,0,40,0,0 +40,2,71738,3,14,1,1,1,0,0,0,0,46,0,1 +57,2,74156,1,9,1,4,1,0,0,0,0,30,0,0 +48,2,202467,0,13,1,3,1,0,0,0,1485,40,0,1 +24,2,123983,2,7,1,6,1,2,0,0,0,40,36,0 +43,2,193494,5,10,1,3,1,0,0,0,0,40,0,0 +40,2,130571,1,9,0,4,0,0,1,0,0,40,0,0 +52,5,90363,10,15,1,3,1,0,0,99999,0,35,0,1 +49,2,83444,1,9,2,1,0,0,0,0,0,40,0,0 +45,1,239093,5,10,1,1,1,3,0,3137,0,40,0,0 +62,4,151369,1,9,0,10,0,0,0,0,0,40,0,0 +29,2,56630,9,11,1,0,1,0,0,0,0,40,0,0 +49,2,117095,1,9,4,8,4,0,1,0,0,40,0,0 +55,3,189985,5,10,2,0,4,1,1,0,0,40,0,0 +37,5,126675,0,13,0,1,3,0,0,0,0,40,0,0 +43,0,199806,0,13,1,0,1,0,0,0,0,40,0,1 +29,2,57596,5,10,2,0,0,0,1,0,0,40,0,0 +44,2,103459,1,9,1,5,2,0,1,0,0,40,0,1 +28,2,282398,5,10,4,9,4,0,0,0,0,40,0,1 +38,2,298841,5,10,0,1,0,0,1,0,0,45,0,0 +45,2,33300,9,11,1,5,1,0,0,0,1977,50,0,1 +19,2,306467,5,10,0,4,3,0,1,0,0,20,0,0 +20,2,189888,14,8,0,4,0,0,0,0,0,40,0,0 +60,2,83861,1,9,1,2,1,0,0,0,0,40,0,0 +30,2,117393,1,9,0,5,0,0,1,0,0,40,0,0 +51,2,179010,5,10,2,5,0,0,1,0,0,60,0,0 +48,2,316101,1,9,2,1,4,0,1,0,0,40,0,0 +43,2,293305,0,13,1,5,1,0,0,0,1887,40,0,1 +51,4,175750,1,9,2,6,4,1,0,0,0,40,0,0 +41,2,121718,9,11,1,9,1,0,0,0,1848,48,0,1 +50,0,229272,1,9,1,10,1,1,0,0,0,40,0,1 +46,2,142828,1,9,1,5,2,0,1,0,0,40,0,1 +54,2,22743,5,10,1,6,1,0,0,15024,0,60,0,1 +68,2,76371,1,9,1,2,1,0,0,0,0,45,0,1 +23,1,216129,6,12,0,10,0,0,0,0,0,30,0,0 +49,2,107425,3,14,0,5,0,0,1,0,0,35,0,0 +24,2,611029,12,6,1,2,1,0,0,0,0,40,0,0 +30,4,363032,1,9,1,11,1,1,0,0,0,40,0,0 +38,2,170020,1,9,1,8,1,0,0,3137,0,45,0,0 +34,2,137900,1,9,0,5,0,0,1,0,0,35,0,0 +22,2,322674,5,10,0,1,3,0,0,0,0,40,0,0 +30,2,23778,7,4,4,2,0,0,0,0,0,40,0,0 +61,2,147845,7,4,1,6,1,0,0,0,0,31,0,0 +36,2,175759,1,9,2,1,4,0,0,0,0,40,0,0 +51,5,166459,9,11,1,1,1,0,0,0,0,40,0,0 +43,2,128212,11,3,1,8,2,2,1,0,0,40,36,1 +54,3,127455,5,10,1,11,1,0,0,0,0,48,0,1 +63,2,134699,1,9,6,3,0,0,1,0,0,25,0,0 +51,2,254230,5,10,1,1,1,0,0,0,0,40,0,1 +63,1,159715,12,6,1,8,1,0,0,0,0,40,0,0 +51,4,116286,3,14,1,3,1,0,0,0,0,60,0,1 +27,2,146719,1,9,2,5,3,0,1,0,0,35,0,0 +35,2,361888,6,12,1,9,1,0,0,0,0,40,0,1 +46,1,32825,1,9,4,10,4,0,0,0,0,40,0,0 +53,2,225768,9,11,1,10,1,1,0,0,0,40,0,1 +26,3,393728,5,10,2,0,3,0,0,0,0,24,0,0 +43,2,160369,1,9,0,8,3,0,0,0,0,40,0,0 +39,2,191807,1,9,1,5,1,0,0,15024,0,50,0,1 +50,3,176969,1,9,2,3,0,0,0,0,1590,40,0,0 +54,3,33863,1,9,1,0,1,0,0,0,0,40,0,1 +57,0,141459,5,10,2,3,4,0,1,0,0,40,0,0 +29,4,95393,1,9,0,4,3,0,0,0,0,20,0,0 +20,2,221095,1,9,0,10,5,1,0,0,0,40,0,0 +53,2,104501,0,13,1,1,1,0,0,0,1902,55,0,1 +23,2,495888,1,9,0,4,0,0,0,0,0,40,22,0 +69,2,185691,2,7,1,0,1,0,0,0,0,20,0,0 +56,2,201822,7,4,1,2,1,0,0,0,2002,40,0,0 +53,4,549341,0,13,1,3,1,1,0,0,0,35,0,0 +28,2,247445,1,9,0,0,0,0,0,0,0,40,0,0 +28,2,199566,0,13,1,4,1,1,0,0,0,40,0,0 +33,5,139057,1,9,1,1,1,2,0,0,0,84,18,1 +48,2,185039,1,9,2,5,4,0,1,0,0,30,0,0 +61,2,166124,1,9,1,10,1,0,0,0,0,40,0,1 +49,2,82649,0,13,1,3,1,0,0,5013,0,45,0,0 +48,2,109275,5,10,1,1,1,0,0,0,0,40,0,0 +32,2,408328,7,4,1,10,1,0,0,0,0,40,0,0 +51,2,186338,1,9,1,10,1,0,0,0,0,40,0,1 +19,2,251579,5,10,0,4,3,0,0,0,0,14,0,0 +47,2,76612,1,9,1,3,1,0,0,0,0,50,0,0 +25,2,22546,0,13,0,6,3,0,0,0,0,60,0,0 +72,2,53684,5,10,1,11,1,1,0,0,0,40,0,0 +29,2,183627,2,7,2,10,0,0,0,0,0,40,0,0 +22,2,73203,1,9,0,0,3,0,1,0,0,40,0,0 +57,2,108426,1,9,1,4,1,1,0,0,0,48,7,0 +50,2,116287,6,12,1,0,1,0,0,0,0,60,13,0 +45,5,145697,5,10,1,5,1,0,0,0,0,30,0,0 +52,2,326156,5,10,2,3,0,0,0,0,0,40,0,1 +53,2,201127,3,14,1,1,1,0,0,0,0,48,0,1 +36,2,250791,1,9,1,2,1,0,0,0,0,48,0,0 +46,2,328216,1,9,1,10,1,0,0,0,0,40,0,1 +20,2,400443,1,9,0,5,3,0,1,0,0,20,0,0 +75,2,95985,11,3,6,4,4,1,0,0,0,10,0,0 +32,4,127651,1,9,1,10,1,0,0,0,0,40,0,1 +28,2,250679,1,9,1,10,1,0,0,0,0,40,0,0 +53,2,103950,3,14,2,3,0,0,1,0,0,40,0,0 +17,2,200199,2,7,0,5,3,0,1,0,0,35,0,0 +46,0,295791,9,11,2,0,4,0,1,0,0,38,0,0 +39,2,191841,6,12,4,3,0,0,1,0,0,30,0,0 +38,2,82622,5,10,2,10,4,0,0,0,0,40,0,0 +36,2,160728,1,9,1,8,1,0,0,0,0,60,0,0 +63,4,109849,0,13,0,3,0,1,1,0,0,21,0,0 +28,2,339897,15,2,1,8,1,0,0,0,0,43,4,0 +49,2,371299,1,9,0,0,4,0,1,0,0,35,0,0 +43,2,421837,5,10,1,8,1,0,0,0,0,40,4,0 +38,2,29702,0,13,1,1,1,0,0,0,0,45,0,1 +39,2,117381,1,9,0,9,0,0,0,0,0,62,7,0 +40,2,338740,1,9,1,1,1,0,0,0,0,40,0,0 +24,3,314525,0,13,0,3,0,0,0,0,1741,45,0,0 +30,2,173005,5,10,1,9,1,0,0,0,0,50,0,1 +44,2,286750,5,10,1,6,1,1,0,0,0,40,0,0 +40,2,163985,1,9,1,5,1,0,0,0,0,24,0,0 +30,2,219318,1,9,0,8,5,0,1,0,0,35,5,0 +42,2,44121,3,14,2,3,0,0,1,0,1876,40,0,0 +52,1,103794,9,11,2,3,0,0,1,0,0,35,0,0 +42,2,310632,5,10,1,10,1,1,0,0,0,40,0,1 +39,2,153976,5,10,1,10,1,0,0,0,0,52,0,1 +43,2,174575,5,10,2,3,4,0,0,0,0,45,0,0 +62,1,82388,1,9,1,10,1,0,0,10566,0,40,0,0 +30,2,207253,9,11,1,10,1,0,0,0,0,40,7,0 +39,2,746786,0,13,1,3,1,0,0,0,0,55,0,1 +41,2,308296,1,9,1,6,2,0,1,0,0,20,0,0 +49,2,101825,3,14,1,3,2,0,1,0,1977,40,0,1 +25,2,109009,2,7,1,10,1,0,0,0,0,40,0,0 +48,2,413363,2,7,1,6,1,0,0,0,2002,40,0,0 +44,0,296326,0,13,0,0,0,0,0,0,0,40,0,0 +36,2,208358,4,5,2,2,0,0,0,4650,0,56,0,0 +40,2,120277,1,9,0,2,3,0,0,0,0,40,38,0 +21,2,193219,1,9,0,0,3,1,1,0,0,35,2,0 +41,2,86399,5,10,4,0,0,0,1,0,0,38,0,0 +24,2,215251,0,13,0,1,0,0,1,0,0,50,0,0 +67,1,124470,1,9,1,7,1,0,0,0,0,60,0,0 +24,2,228649,0,13,0,0,3,0,0,0,0,38,0,0 +50,1,386397,0,13,1,5,1,0,0,0,0,60,0,0 +48,2,96798,3,14,2,5,0,0,0,0,0,35,0,0 +29,2,159768,1,9,0,8,0,0,0,3325,0,40,16,0 +50,2,139464,0,13,2,3,4,0,1,0,0,36,38,0 +64,0,550848,12,6,1,1,1,0,0,0,0,40,0,1 +49,2,68505,4,5,2,4,0,1,0,0,0,37,0,0 +20,2,122215,1,9,0,4,3,1,0,0,0,52,0,0 +30,2,159442,1,9,4,0,0,0,1,0,0,40,0,0 +37,2,80638,0,13,1,4,1,2,0,0,0,30,26,0 +52,2,192390,1,9,1,8,1,0,0,0,0,40,0,1 +22,2,191324,5,10,0,11,3,0,0,0,0,25,0,0 +19,0,73009,5,10,0,0,3,0,0,0,0,15,0,0 +52,2,177858,1,9,2,10,5,0,0,0,0,55,0,1 +42,2,163003,0,13,3,9,3,2,1,0,0,40,0,0 +35,2,95551,1,9,4,1,0,0,1,0,0,36,0,0 +27,2,125298,5,10,0,0,4,0,1,0,0,50,0,0 +54,0,198186,1,9,0,4,0,1,1,0,0,38,0,0 +37,2,295949,1,9,1,10,1,0,0,0,1628,40,0,0 +37,2,182668,12,6,1,6,1,0,0,0,0,35,0,0 +28,2,124905,7,4,1,10,1,0,0,0,0,30,0,0 +63,2,171635,0,13,1,5,1,0,0,0,0,40,0,0 +19,2,376240,1,9,0,8,3,0,0,0,0,42,0,0 +28,2,157391,0,13,0,5,3,0,1,0,0,40,0,0 +44,2,178134,10,15,0,3,0,0,1,0,0,40,0,1 +31,2,207201,5,10,1,10,1,0,0,0,0,40,0,1 +64,2,102103,1,9,2,13,0,0,1,0,0,50,0,0 +40,2,92036,1,9,1,2,1,0,0,0,0,40,0,1 +59,4,236426,6,12,2,3,0,0,1,0,0,50,0,0 +22,2,400966,5,10,0,0,3,0,1,0,0,40,0,0 +40,2,404573,5,10,0,5,0,0,1,0,0,44,0,0 +35,2,227571,7,4,1,2,1,0,0,0,0,40,4,0 +20,2,145917,5,10,0,0,3,0,1,0,0,15,0,0 +35,4,190226,1,9,0,11,3,0,0,0,0,40,0,0 +28,2,356555,5,10,1,1,1,0,0,0,0,48,0,0 +28,2,66473,1,9,2,8,3,0,0,0,0,40,0,0 +25,5,163039,6,12,0,5,0,0,0,0,0,60,0,0 +37,2,89559,1,9,2,0,4,0,1,0,0,40,0,0 +31,2,163303,9,11,2,5,3,0,1,0,0,38,0,0 +41,2,192712,1,9,0,0,5,0,1,0,0,40,0,0 +31,2,381153,12,6,1,9,1,0,0,0,0,40,0,1 +44,2,222434,1,9,1,10,1,0,0,0,0,40,0,0 +20,2,34706,5,10,0,1,0,1,0,0,0,47,0,0 +57,1,47857,5,10,1,7,1,0,0,0,0,50,0,0 +26,2,195216,1,9,2,4,0,0,1,0,0,12,0,0 +44,5,103643,1,9,1,1,1,0,0,5013,0,60,34,0 +29,4,329426,1,9,0,11,0,0,0,0,0,40,0,0 +36,2,183612,1,9,1,3,1,0,0,0,1977,40,0,1 +40,2,184105,9,11,1,10,1,0,0,0,0,40,0,1 +21,2,211385,6,12,0,4,0,1,0,0,0,35,2,0 +21,2,61777,5,10,0,10,0,0,0,0,0,70,0,0 +34,1,320194,10,15,4,3,4,0,0,0,0,48,0,1 +24,2,199444,0,13,0,1,3,0,1,0,0,15,0,0 +28,2,312588,12,6,2,4,0,0,1,0,0,40,0,0 +35,2,168675,1,9,4,6,3,0,0,0,0,50,0,0 +35,2,87556,1,9,2,10,0,0,0,0,0,40,0,0 +38,0,220421,0,13,0,1,0,0,1,0,0,40,0,0 +44,3,404599,1,9,2,0,4,1,1,0,0,40,0,0 +39,2,99065,0,13,1,2,2,0,1,0,0,40,12,1 +57,4,109973,1,9,2,4,0,0,1,0,0,40,0,0 +19,2,246652,5,10,0,5,3,0,1,0,0,40,0,0 +29,2,57423,9,11,1,8,1,0,0,0,0,48,0,0 +23,2,291248,1,9,0,8,5,1,0,0,0,40,0,0 +50,2,163708,1,9,6,4,4,0,1,0,0,40,0,0 +51,1,240358,5,10,1,10,1,0,0,0,0,20,0,0 +28,2,25955,9,11,2,10,0,3,0,0,0,40,0,0 +44,2,101593,0,13,1,5,1,0,0,0,0,60,0,0 +29,1,227890,0,13,0,3,0,1,0,0,0,40,0,0 +31,2,225053,1,9,2,6,0,0,0,0,0,45,0,0 +27,2,228472,0,13,1,10,1,0,0,0,0,45,0,1 +34,2,245378,0,13,1,1,1,0,0,0,0,45,0,0 +50,5,156623,10,15,1,3,1,2,0,7688,0,50,11,1 +27,2,35032,5,10,1,2,1,0,0,0,0,40,0,1 +31,2,258849,9,11,0,0,4,1,1,0,0,40,0,0 +46,2,190115,6,12,1,10,1,0,0,0,0,40,0,1 +39,2,63910,5,10,0,0,3,2,1,0,0,40,0,0 +40,2,510072,0,13,1,5,1,0,0,0,0,55,0,1 +28,2,210867,2,7,2,5,3,0,0,0,0,40,0,0 +18,2,263024,1,9,0,5,3,0,1,0,0,40,0,0 +51,2,306785,1,9,2,0,0,0,1,0,0,40,0,0 +58,5,104333,1,9,2,5,0,0,0,0,0,50,0,0 +66,2,340734,1,9,1,5,1,0,0,0,0,40,0,0 +36,1,288585,1,9,1,4,2,2,1,0,0,20,27,0 +38,2,241765,2,7,2,2,0,0,1,0,0,60,0,0 +25,2,111058,6,12,0,1,3,0,0,0,0,40,0,0 +25,2,104662,1,9,0,4,4,0,1,0,0,22,0,0 +90,2,313986,2,7,0,2,3,0,0,0,0,40,0,0 +41,4,52037,5,10,2,0,4,0,1,0,0,40,0,0 +33,2,131776,0,13,2,3,4,0,1,914,0,40,9,0 +33,2,254221,1,9,0,0,0,0,1,0,0,40,0,0 +35,2,152909,0,13,1,1,1,0,0,0,1887,45,0,1 +39,1,211785,1,9,0,10,3,1,1,0,0,20,0,0 +59,2,160362,1,9,1,5,1,0,0,0,0,60,0,0 +19,2,387215,5,10,0,9,3,0,0,0,1719,16,0,0 +39,2,187046,1,9,1,5,1,0,0,4064,0,38,0,0 +27,2,169631,1,9,0,2,3,0,1,0,0,40,0,0 +52,2,202956,7,4,1,10,1,0,0,0,0,40,0,0 +59,1,80467,1,9,2,4,3,0,1,0,0,24,0,0 +28,2,407672,5,10,2,10,4,0,1,0,0,40,0,0 +37,2,243425,1,9,2,4,5,0,1,0,0,50,30,0 +36,2,347491,0,13,1,1,1,0,0,0,0,50,0,1 +34,2,146161,0,13,1,3,1,0,0,0,0,60,0,1 +23,2,449432,5,10,0,0,3,0,0,0,0,40,0,0 +33,2,288825,1,9,2,10,0,0,0,0,2258,84,0,0 +27,4,134813,3,14,0,3,3,0,0,0,0,52,0,0 +31,4,190401,3,14,1,3,1,0,0,0,0,40,0,0 +21,2,260617,12,6,1,8,1,0,0,0,0,36,0,0 +31,2,45604,1,9,1,1,1,0,0,0,0,54,0,0 +59,2,67841,1,9,1,2,1,0,0,0,0,40,0,1 +40,4,244522,3,14,1,3,1,0,0,0,1902,48,0,1 +19,2,430471,2,7,0,2,3,0,0,0,0,40,0,0 +47,2,194698,1,9,1,6,1,0,0,0,0,50,0,0 +34,2,94235,0,13,0,10,4,0,0,0,0,40,0,0 +57,2,188330,1,9,1,4,1,0,0,0,0,78,0,0 +51,4,146181,4,5,1,6,1,1,0,0,0,40,0,0 +21,2,177125,5,10,0,2,0,0,0,0,0,20,0,0 +30,5,68330,5,10,1,5,1,0,0,0,0,50,0,0 +46,2,95636,5,10,2,2,0,0,0,0,0,45,0,0 +40,2,238329,0,13,0,5,0,0,1,0,0,45,0,0 +52,2,416129,13,1,1,4,0,0,0,0,0,40,22,0 +23,2,285004,0,13,0,5,0,2,0,0,0,50,18,0 +25,2,186294,1,9,0,0,0,0,1,0,0,50,0,0 +43,2,188786,5,10,2,6,0,0,0,0,0,45,0,0 +38,0,31352,5,10,2,11,4,3,1,0,0,40,0,1 +22,2,197613,9,11,0,4,0,0,1,0,0,30,0,0 +33,4,161942,0,13,0,0,0,0,1,1055,0,40,0,0 +34,2,275438,5,10,1,3,1,0,0,5178,0,40,0,1 +65,2,361721,9,11,1,6,1,0,0,0,0,20,0,0 +50,2,144968,1,9,0,9,3,0,0,0,0,15,0,0 +29,2,190539,0,13,0,5,0,0,0,6849,0,48,0,0 +25,2,178037,1,9,1,6,1,0,0,0,0,40,0,0 +54,2,306985,5,10,2,0,0,0,1,0,0,40,0,0 +49,2,87928,1,9,1,0,1,0,0,0,0,40,0,1 +44,2,242619,5,10,1,8,1,0,0,0,0,40,0,0 +24,2,154165,4,5,2,4,3,0,1,0,0,40,0,0 +25,2,511331,0,13,0,5,0,0,0,0,0,38,0,0 +65,4,221026,1,9,1,6,1,0,0,0,0,20,0,0 +56,1,222182,1,9,1,1,1,1,0,0,0,45,0,0 +39,1,126569,10,15,1,3,1,0,0,15024,0,60,0,1 +23,2,202344,0,13,0,3,3,0,1,0,0,40,0,0 +20,2,190423,5,10,0,4,0,0,1,0,0,20,0,0 +24,2,238917,11,3,0,10,4,0,0,0,0,40,22,0 +41,2,221947,5,10,1,1,1,0,0,0,1887,50,0,1 +40,5,37997,5,10,1,7,1,0,0,0,0,50,0,0 +55,2,147098,1,9,1,10,1,0,0,0,0,50,0,1 +38,2,278253,1,9,2,0,4,0,1,0,0,48,0,0 +23,2,195411,1,9,0,0,4,1,1,0,0,40,0,0 +44,2,76196,0,13,1,1,1,0,0,0,0,50,0,0 +45,2,120131,5,10,1,10,1,0,0,0,1887,40,0,1 +20,1,186014,5,10,0,0,3,0,1,0,0,12,9,0 +29,2,205903,1,9,0,4,3,0,0,0,0,40,0,0 +43,0,125405,1,9,1,11,1,0,0,0,0,40,0,0 +30,2,219838,14,8,2,8,0,0,0,0,0,40,0,0 +28,0,19395,5,10,0,0,0,0,1,0,0,38,0,0 +31,2,223327,1,9,1,1,1,0,0,0,0,40,0,1 +52,2,114062,1,9,2,10,4,0,1,0,0,40,0,0 +36,2,95654,0,13,1,3,2,0,1,0,0,50,10,1 +38,2,177305,1,9,1,10,1,0,0,0,0,45,0,0 +63,1,117681,9,11,1,7,1,0,0,0,0,40,0,0 +21,2,237651,5,10,0,4,3,0,0,0,0,35,0,0 +33,0,150570,1,9,2,0,0,0,0,0,0,40,0,0 +46,0,106705,5,10,2,3,4,0,1,1506,0,50,0,0 +47,5,175958,0,13,0,5,0,0,0,3325,0,60,0,0 +33,2,144064,8,16,1,3,1,0,0,0,0,55,0,1 +28,2,152951,1,9,2,2,0,0,0,0,0,40,0,0 +46,2,190487,1,9,2,13,4,0,1,0,0,28,16,0 +25,2,306666,5,10,1,5,1,1,0,0,0,45,0,0 +37,2,195148,1,9,1,10,3,0,0,3137,0,40,0,0 +31,1,226624,4,5,1,10,1,0,0,0,0,60,0,0 +49,2,157569,1,9,1,10,1,0,0,0,0,40,0,0 +22,0,22966,5,10,3,9,4,0,0,0,0,20,0,0 +52,2,379682,9,11,1,4,2,0,1,0,0,20,0,1 +29,2,446559,6,12,1,1,2,0,1,0,0,50,0,0 +18,2,41794,2,7,0,4,3,0,1,0,0,20,0,0 +31,4,90409,5,10,1,1,1,0,0,0,0,35,0,0 +23,2,125491,5,10,0,4,0,2,1,0,0,35,36,0 +54,1,104748,12,6,1,5,1,0,0,0,0,65,0,0 +50,4,169182,1,9,2,4,4,0,1,0,0,49,21,0 +24,2,122272,0,13,0,7,3,0,1,0,0,40,0,0 +49,5,289707,1,9,4,4,0,0,0,0,0,45,0,0 +54,4,137691,1,9,1,10,1,0,0,0,0,40,0,1 +41,2,84610,0,13,1,1,1,0,0,0,1902,60,0,1 +49,2,166789,1,9,1,0,1,0,0,0,0,40,0,0 +36,4,348728,0,13,0,3,0,0,1,0,0,35,0,0 +23,2,348092,1,9,0,6,3,1,0,0,0,40,19,0 +63,2,154526,5,10,6,4,0,0,1,0,0,40,0,0 +67,2,288371,1,9,1,5,1,0,0,0,0,40,8,1 +23,2,182342,1,9,0,10,0,0,0,0,0,40,0,0 +22,2,244366,0,13,0,3,3,0,0,0,0,40,0,0 +66,2,102423,9,11,1,0,1,0,0,0,0,30,0,0 +25,2,259688,2,7,1,10,1,0,0,0,0,50,0,0 +30,2,98733,5,10,2,8,4,0,1,0,0,20,0,0 +35,2,174856,1,9,1,6,1,0,0,2885,0,40,0,0 +67,1,141797,7,4,1,1,1,0,0,0,0,40,0,0 +30,2,327202,14,8,0,10,0,1,0,0,0,40,0,0 +26,2,76996,5,10,0,8,0,1,1,0,0,38,0,0 +34,2,260560,1,9,1,8,1,0,0,0,0,40,0,0 +21,2,370990,5,10,0,5,3,0,0,0,0,40,0,0 +18,2,129010,14,8,0,10,3,0,0,0,0,10,0,0 +21,2,452640,1,9,0,10,0,0,0,0,0,40,0,0 +76,5,120796,4,5,1,3,1,0,0,0,0,40,0,0 +26,2,229523,1,9,1,8,2,0,1,0,0,56,0,0 +18,2,127388,14,8,0,4,0,0,1,0,0,25,0,0 +34,2,119422,9,11,1,8,1,0,0,0,1672,50,0,0 +59,2,193895,1,9,2,1,0,0,1,0,0,40,0,0 +55,2,163083,0,13,4,1,0,0,0,14084,0,45,0,1 +33,1,155343,5,10,0,7,0,0,0,0,0,72,0,0 +25,2,73895,1,9,0,4,3,0,1,0,0,10,0,0 +48,2,107682,1,9,6,8,0,0,1,0,0,10,0,0 +64,2,321166,0,13,2,5,0,0,1,0,0,5,0,0 +47,4,154940,3,14,0,3,0,0,1,0,0,45,0,1 +26,2,103700,5,10,0,9,3,0,1,0,0,40,0,0 +36,2,63509,6,12,1,3,1,0,0,0,0,48,0,1 +21,2,243842,1,9,1,7,1,0,0,0,0,40,0,0 +30,2,58597,1,9,0,8,3,0,0,0,0,44,0,0 +41,1,190290,1,9,2,10,0,0,0,0,0,40,0,0 +34,2,62165,5,10,0,5,5,1,0,0,0,30,0,0 +24,2,280134,12,6,0,5,0,0,0,0,0,49,22,0 +26,2,118736,0,13,0,3,0,0,1,0,0,20,0,0 +25,2,171114,1,9,0,0,0,0,1,0,0,48,0,0 +35,2,169638,5,10,2,5,4,0,1,0,0,36,0,0 +41,2,125461,5,10,2,10,0,0,0,0,0,40,0,1 +33,2,145434,2,7,0,10,3,0,0,0,0,40,0,0 +18,2,152182,5,10,0,4,3,0,1,0,0,25,0,0 +27,5,233724,1,9,4,0,0,0,0,0,0,38,0,0 +32,2,153963,1,9,2,4,4,0,1,0,0,35,0,0 +51,4,88120,1,9,0,4,0,1,0,0,0,40,0,0 +38,2,96330,9,11,2,0,4,1,1,0,0,40,0,0 +41,4,66118,5,10,1,6,2,0,1,0,0,25,0,0 +26,2,182178,5,10,1,10,1,0,0,2829,0,40,0,0 +38,1,53628,9,11,2,1,4,0,0,0,0,35,0,0 +54,2,174865,4,5,1,1,1,0,0,0,0,45,0,1 +30,2,66194,0,13,0,3,0,0,1,0,0,60,31,0 +31,2,73796,5,10,6,1,4,0,1,0,0,30,0,0 +26,0,28366,0,13,0,3,0,0,0,0,0,40,0,0 +75,1,231741,8,16,1,3,1,0,0,4931,0,3,0,0 +29,2,237865,3,14,0,6,3,1,0,0,0,40,0,0 +61,2,195453,1,9,1,1,1,0,0,0,0,50,0,1 +24,2,116934,5,10,4,5,4,0,1,0,0,45,0,0 +34,2,456399,6,12,0,3,0,0,0,0,0,40,0,0 +42,2,263608,5,10,2,10,3,0,0,0,0,40,0,0 +24,2,263498,2,7,0,10,0,0,0,0,0,40,0,0 +27,3,469705,1,9,0,10,0,1,0,0,1980,40,0,0 +39,4,113253,0,13,1,3,2,0,1,0,0,50,0,1 +20,2,138768,1,9,0,2,3,0,0,0,0,40,0,0 +51,2,302146,2,7,0,4,0,1,1,0,0,40,0,0 +68,2,253866,0,13,1,5,1,0,0,0,0,30,0,0 +28,3,214858,1,9,0,8,3,0,0,0,0,48,0,0 +43,2,243476,1,9,2,9,0,0,1,0,0,40,0,0 +35,2,169104,5,10,3,10,0,0,0,0,0,40,0,0 +44,2,103218,1,9,2,0,4,1,1,0,0,40,0,0 +41,2,57233,0,13,0,2,0,0,0,0,0,40,0,0 +44,2,228320,1,9,1,9,1,0,0,0,0,45,0,1 +20,2,217421,1,9,1,0,5,0,1,0,0,40,0,0 +46,2,185041,1,9,1,10,1,0,0,0,0,75,0,1 +27,1,37302,6,12,1,6,1,0,0,7688,0,70,0,1 +32,2,261059,5,10,0,4,0,0,0,0,0,50,0,0 +46,2,59767,5,10,2,5,0,0,0,0,0,50,0,0 +26,2,333541,1,9,0,4,0,0,0,0,0,24,0,0 +20,2,133352,5,10,0,0,3,2,1,0,0,40,36,0 +36,2,99270,1,9,1,7,2,0,1,0,0,40,0,0 +49,2,204629,0,13,1,1,1,0,0,0,0,40,0,1 +32,2,34104,1,9,1,1,1,0,0,3103,0,55,0,1 +32,2,312667,0,13,1,3,1,0,0,15024,0,50,0,1 +49,2,329603,0,13,1,10,1,0,0,0,1902,40,0,1 +36,2,281021,1,9,0,6,0,0,0,0,0,45,0,0 +22,2,275385,5,10,0,4,5,0,0,0,0,25,0,0 +52,3,129177,1,9,2,0,0,0,1,0,0,40,0,0 +42,2,385591,1,9,1,1,1,0,0,0,0,50,0,1 +72,2,38360,1,9,6,4,4,0,1,0,0,16,0,0 +30,4,73796,0,13,4,3,0,0,1,0,0,40,0,0 +44,2,67671,5,10,1,2,1,0,0,0,0,40,0,0 +23,2,257621,0,13,0,5,0,0,1,0,0,45,0,0 +22,2,180052,5,10,0,5,3,0,0,0,0,20,0,0 +59,2,656036,0,13,4,0,4,0,0,0,0,60,0,0 +46,2,215943,1,9,2,3,4,0,1,0,0,40,0,0 +30,2,488720,9,11,1,2,1,0,0,0,0,40,4,0 +64,3,199298,7,4,6,4,4,0,1,0,0,30,5,0 +31,2,305692,5,10,1,5,2,1,1,0,0,40,0,0 +64,2,114994,1,9,1,4,1,0,0,0,0,20,0,0 +45,2,88265,1,9,0,8,3,0,1,0,0,40,0,0 +59,2,168569,1,9,1,8,1,0,0,0,1887,40,0,1 +32,2,175413,1,9,0,0,5,1,1,0,0,40,2,0 +43,2,161226,0,13,1,8,1,3,0,0,0,40,0,0 +23,2,208598,5,10,0,5,0,0,0,0,0,45,0,0 +49,1,200471,1,9,1,10,1,0,0,0,0,40,0,0 +32,2,256609,14,8,1,8,1,0,0,0,0,40,4,0 +49,2,176684,9,11,0,1,4,0,1,0,0,40,0,0 +33,2,206512,5,10,2,3,0,0,0,0,0,40,0,0 +28,2,212640,10,15,0,3,0,0,1,0,0,85,0,0 +47,2,148724,1,9,1,5,1,1,0,0,0,40,0,0 +41,2,266510,1,9,0,4,3,0,0,0,0,40,0,0 +34,4,240252,3,14,1,1,1,0,0,0,0,40,0,1 +25,2,358975,1,9,0,4,0,0,1,0,0,35,0,0 +21,2,434710,5,10,0,5,0,0,1,0,0,15,0,0 +46,2,241844,4,5,1,4,1,0,0,0,0,40,0,0 +37,2,191342,15,2,1,10,1,2,0,0,0,40,14,0 +41,2,221947,5,10,1,10,1,0,0,0,0,56,0,1 +44,2,111483,1,9,0,0,3,0,0,0,1504,50,0,0 +30,2,65278,1,9,1,9,1,0,0,0,0,40,0,1 +54,2,133403,5,10,1,8,1,0,0,0,0,40,0,0 +35,1,166416,1,9,1,7,1,0,0,0,0,99,0,0 +21,2,221480,5,10,0,9,3,0,1,0,0,25,16,0 +35,1,189878,3,14,1,5,1,0,0,0,0,40,0,1 +35,2,278403,10,15,1,3,1,0,0,0,0,80,0,1 +19,2,184710,5,10,0,10,3,0,0,0,0,20,0,0 +48,2,177775,1,9,2,1,0,0,1,0,0,40,0,0 +65,1,225473,5,10,6,10,0,0,1,0,0,35,0,0 +40,2,289403,0,13,4,0,4,1,0,0,0,35,0,0 +26,2,269060,1,9,0,0,0,0,1,0,0,40,0,0 +45,2,449354,5,10,1,1,1,0,0,0,0,40,0,0 +26,2,214413,5,10,0,10,3,0,0,0,0,40,0,0 +32,2,80058,1,9,1,0,1,0,0,0,0,40,0,0 +35,2,202027,0,13,2,1,0,0,0,27828,0,50,0,1 +22,1,123440,5,10,0,10,0,0,0,0,0,48,0,0 +37,2,191524,9,11,4,3,3,0,1,0,0,38,0,0 +25,2,308144,0,13,0,10,0,0,0,0,0,40,4,0 +46,2,205100,9,11,1,1,1,0,0,0,0,48,0,1 +30,2,195750,1,9,0,2,3,0,0,0,0,27,0,0 +63,2,149756,6,12,2,1,0,0,0,0,0,40,0,1 +51,4,240358,1,9,1,11,1,0,0,0,0,40,0,1 +68,1,241174,7,4,1,1,1,0,0,0,0,16,0,0 +36,2,356838,8,16,1,3,1,0,0,0,0,50,8,0 +28,5,115705,5,10,0,1,0,0,0,0,0,50,0,0 +41,4,137142,5,10,1,5,1,0,0,0,0,40,0,0 +47,2,296066,5,10,1,3,1,0,0,0,0,40,0,0 +22,2,401335,5,10,0,4,4,1,1,0,0,30,0,0 +34,5,186824,10,15,1,3,1,0,0,15024,0,40,0,1 +46,3,162187,0,13,1,3,1,0,0,0,0,40,0,1 +28,2,98010,5,10,3,0,3,0,1,0,0,40,0,0 +36,2,172538,1,9,1,10,1,0,0,0,0,52,0,1 +18,2,80163,5,10,0,5,3,0,1,0,0,20,0,0 +33,4,43959,3,14,1,3,1,0,0,7688,0,50,0,1 +51,2,162632,1,9,1,6,1,0,0,7298,0,60,0,1 +56,1,115422,1,9,1,1,1,0,0,0,0,35,0,0 +54,2,100933,1,9,0,0,4,0,1,0,0,40,0,0 +29,2,270379,1,9,0,1,4,1,1,0,0,40,0,0 +40,2,20109,5,10,2,2,0,3,1,0,0,84,0,0 +53,2,114758,3,14,1,1,1,0,0,15024,0,65,0,1 +22,2,100345,1,9,0,2,3,0,0,0,0,35,0,0 +33,2,184901,1,9,1,8,1,0,0,0,0,40,0,1 +28,2,87239,1,9,2,6,0,0,0,0,0,50,0,0 +63,2,127363,5,10,1,3,2,0,1,0,0,12,0,0 +53,3,199720,8,16,1,3,1,0,0,15024,0,60,9,1 +37,2,143058,12,6,1,10,1,0,0,0,0,50,0,0 +50,3,36489,5,10,2,1,4,0,0,0,0,40,0,0 +22,2,141698,1,9,0,10,3,0,0,0,0,40,0,0 +40,3,26358,6,12,0,0,0,0,1,0,0,40,0,0 +22,2,195532,0,13,0,3,0,0,1,8614,0,40,0,1 +21,2,30039,5,10,0,3,3,0,0,0,0,40,0,0 +25,2,125159,6,12,1,2,1,1,0,0,0,40,2,0 +20,2,246250,5,10,0,10,0,0,1,0,0,40,0,0 +43,3,77370,1,9,1,6,1,0,0,0,0,40,0,0 +29,2,355569,9,11,0,1,4,0,1,0,0,50,0,0 +32,2,180603,0,13,1,5,1,0,0,0,0,40,0,1 +42,2,201785,3,14,1,5,1,0,0,0,0,50,0,1 +33,2,256211,1,9,1,8,1,2,0,0,0,40,27,0 +27,2,146764,5,10,1,1,2,0,1,0,0,40,0,1 +29,2,200515,5,10,1,8,1,0,0,0,0,38,0,0 +29,2,52636,1,9,1,6,1,0,0,0,0,40,0,0 +20,2,27049,5,10,0,1,3,0,1,0,0,20,0,0 +35,2,111128,12,6,0,0,3,0,0,0,0,40,0,0 +31,1,348038,0,13,1,3,1,0,0,0,1902,50,5,1 +33,2,93930,1,9,0,10,0,0,0,0,0,50,0,0 +67,2,397831,5,10,1,1,1,0,0,0,1539,40,0,0 +46,2,33794,5,10,1,3,1,0,0,0,0,10,0,0 +45,2,178215,4,5,1,8,2,0,1,0,0,40,0,1 +17,4,191910,2,7,0,5,3,0,0,0,0,20,0,0 +35,2,340110,0,13,1,1,1,0,0,0,1848,70,0,1 +48,1,133694,0,13,3,1,0,1,0,0,0,40,2,1 +49,2,148398,1,9,2,8,0,1,1,0,0,40,0,0 +20,2,133515,5,10,0,5,5,0,1,0,0,40,0,0 +27,2,181667,1,9,1,8,1,0,0,5013,0,46,8,0 +64,2,159715,5,10,1,10,1,0,0,0,0,20,0,0 +53,3,174040,5,10,4,10,0,1,0,0,0,40,0,0 +52,2,117700,1,9,2,0,0,0,1,0,0,40,0,0 +29,2,37215,1,9,1,10,1,0,0,0,0,55,0,0 +32,5,46807,1,9,1,10,1,0,0,99999,0,40,0,1 +48,1,317360,0,13,1,3,2,0,1,0,0,20,0,1 +30,2,425627,5,10,0,10,5,0,0,0,0,40,4,0 +34,2,82623,1,9,1,4,1,0,0,0,0,20,0,0 +39,2,140854,1,9,0,3,0,0,0,0,0,50,0,0 +28,2,185061,2,7,0,2,5,0,0,0,0,40,0,0 +54,2,282680,0,13,0,3,0,0,1,0,0,50,0,0 +24,2,137591,5,10,0,5,3,0,0,0,1762,40,0,0 +25,2,198163,1,9,0,1,3,0,1,0,0,40,0,0 +25,2,132749,2,7,2,4,4,0,1,0,0,12,0,0 +48,4,31264,5,10,1,1,2,0,1,5178,0,40,0,1 +24,2,399449,0,13,0,5,3,0,1,0,0,40,0,0 +31,2,27494,5,10,1,5,1,2,0,0,0,50,18,0 +47,2,368561,5,10,1,10,1,0,0,0,0,40,0,1 +19,2,406078,5,10,0,0,3,0,1,0,0,25,0,0 +52,5,100506,5,10,1,5,1,0,0,15024,0,50,0,1 +52,2,29658,1,9,1,0,1,0,0,0,0,40,0,0 +60,2,181953,1,9,1,6,1,0,0,0,0,28,0,0 +43,2,304175,3,14,1,3,1,0,0,0,0,50,0,1 +24,2,170070,6,12,2,4,3,0,1,0,0,30,0,0 +51,2,194908,1,9,0,0,0,0,1,0,0,40,0,0 +38,1,357962,4,5,2,10,0,0,0,0,0,40,0,0 +21,2,214716,5,10,0,0,3,0,1,0,0,10,0,0 +40,5,207578,1,9,1,0,1,0,0,0,0,50,0,1 +54,2,146409,5,10,6,1,4,0,1,0,0,40,0,0 +35,2,341643,0,13,0,4,5,0,0,0,0,50,0,0 +52,2,131631,2,7,4,8,4,1,0,0,0,40,0,0 +53,2,88842,1,9,1,1,1,0,0,99999,0,40,0,1 +35,2,417136,1,9,2,10,4,1,0,0,0,40,0,0 +43,1,336763,5,10,2,5,4,0,1,0,880,42,0,0 +29,2,209301,0,13,1,10,1,0,0,0,0,40,8,0 +29,2,120986,1,9,1,6,1,3,0,0,0,65,0,0 +27,2,51025,1,9,0,4,0,0,1,0,0,40,0,0 +58,2,218281,0,13,1,0,1,0,0,0,0,40,4,0 +64,2,114994,1,9,1,2,1,0,0,0,0,18,0,0 +53,2,335481,1,9,1,0,2,1,1,0,0,32,0,0 +21,2,174503,1,9,0,0,0,0,1,0,0,30,0,0 +40,1,230478,6,12,2,1,0,0,0,0,0,30,0,0 +52,0,149650,8,16,1,3,1,0,0,0,0,40,10,1 +38,2,149419,9,11,0,9,0,0,0,0,0,50,0,0 +39,2,185099,1,9,1,1,1,0,0,0,0,40,0,0 +68,2,128472,8,16,1,3,1,0,0,0,0,55,0,1 +24,2,124971,1,9,0,5,0,0,0,0,0,38,0,0 +40,5,344060,10,15,1,3,1,0,0,0,0,50,0,1 +43,5,286750,10,15,1,3,1,1,0,0,0,99,0,1 +38,2,296999,0,13,0,1,0,0,1,0,0,70,0,0 +45,2,123681,1,9,1,5,1,0,0,0,0,40,0,1 +18,2,232024,2,7,0,8,3,0,0,0,0,55,0,0 +57,4,52267,3,14,1,1,1,0,0,0,0,50,0,1 +49,2,119182,1,9,4,4,0,1,1,0,0,35,0,0 +25,2,191230,5,10,0,1,3,0,1,0,0,40,29,0 +52,3,23780,5,10,2,0,0,0,0,0,0,40,0,0 +56,2,184553,12,6,2,10,0,0,0,0,0,56,0,0 +26,5,242651,5,10,0,5,0,0,0,0,0,48,0,0 +19,2,246226,1,9,0,10,0,0,1,0,0,40,0,0 +25,5,86745,0,13,0,0,3,2,1,0,0,40,0,0 +25,2,106889,1,9,1,0,2,0,1,0,0,30,0,0 +21,2,460835,1,9,0,5,5,0,0,0,0,45,0,0 +48,1,213140,7,4,1,10,1,0,0,0,0,40,25,0 +33,0,37070,3,14,1,3,1,0,0,0,0,60,8,0 +31,0,93589,1,9,2,11,3,4,0,0,0,40,0,0 +26,1,213258,1,9,2,7,4,0,0,0,0,65,0,0 +37,0,46814,0,13,0,3,0,0,0,0,0,38,0,0 +20,2,284737,5,10,0,4,3,0,0,0,0,20,0,0 +49,2,197418,1,9,6,0,4,0,1,0,0,20,0,0 +49,2,185041,3,14,1,1,1,0,0,0,1977,40,0,1 +51,2,159604,5,10,1,3,2,0,1,0,0,40,0,1 +40,2,123557,5,10,1,5,1,0,0,0,0,40,0,0 +24,2,275421,9,11,0,8,3,0,1,0,0,40,0,0 +18,2,167147,14,8,0,5,3,0,0,0,0,24,0,0 +41,2,197583,12,6,1,6,1,1,0,0,0,40,0,1 +46,2,175109,1,9,1,0,1,0,0,0,1485,40,0,1 +46,2,117502,1,9,1,0,2,0,1,0,0,40,0,0 +64,2,180401,12,6,1,6,1,0,0,0,0,40,0,1 +50,1,146603,10,15,1,3,1,0,0,0,0,40,0,1 +53,0,143822,3,14,1,3,1,0,0,0,0,36,0,1 +21,2,51985,1,9,0,10,0,0,0,0,0,40,0,0 +22,0,48121,5,10,1,4,1,0,0,0,0,25,0,0 +37,2,234807,0,13,2,1,4,0,1,7430,0,45,0,1 +39,3,65324,10,15,0,3,0,0,0,0,0,55,0,1 +30,2,302149,0,13,1,5,1,2,0,0,0,40,3,0 +25,2,168403,0,13,0,3,0,0,0,0,1741,40,0,0 +26,2,159897,5,10,0,1,4,1,1,0,0,40,0,0 +43,2,416338,0,13,0,5,0,0,0,0,0,50,0,0 +59,2,370615,1,9,6,0,4,0,1,0,0,60,0,0 +27,2,219371,1,9,3,0,4,0,1,0,0,40,2,0 +55,2,120970,12,6,1,10,1,1,0,0,0,40,0,1 +20,2,22966,5,10,0,4,3,0,0,0,0,12,8,0 +25,2,34541,9,11,0,3,0,0,1,0,0,36,8,0 +28,2,191027,6,12,4,4,0,0,0,0,0,40,0,0 +29,2,107458,0,13,0,5,0,0,0,0,0,50,0,0 +60,2,121832,2,7,1,5,1,0,0,0,0,40,0,1 +37,4,233825,0,13,1,3,2,0,1,15024,0,50,0,1 +25,2,73839,2,7,2,5,3,0,1,0,0,40,0,0 +27,2,109165,5,10,1,10,1,0,0,0,0,60,0,0 +50,0,103063,0,13,1,1,1,0,0,0,0,40,0,1 +41,1,29762,5,10,1,7,1,0,0,5013,0,70,0,0 +46,2,111979,7,4,1,10,1,0,0,0,0,47,0,0 +35,2,150125,9,11,2,4,4,1,1,0,0,40,0,0 +40,2,118001,1,9,0,2,0,1,0,0,0,40,0,0 +49,2,149337,0,13,1,1,1,0,0,0,0,40,0,1 +29,2,36601,0,13,0,3,0,0,1,0,0,50,0,0 +43,4,118600,0,13,2,3,4,0,1,0,625,40,0,0 +39,2,279272,6,12,0,6,0,1,0,0,0,60,0,0 +35,2,181020,1,9,0,2,3,0,0,0,0,60,0,0 +52,2,165998,5,10,1,8,1,0,0,0,0,40,0,0 +25,2,218136,5,10,0,2,0,1,0,0,0,40,31,0 +20,5,182200,1,9,0,8,3,0,1,0,0,30,0,0 +24,2,140001,0,13,0,1,0,0,0,0,0,40,0,0 +29,2,193260,0,13,1,10,5,2,0,0,0,30,3,0 +21,2,191243,5,10,0,4,3,0,0,0,0,40,0,0 +37,3,207887,0,13,2,1,5,0,1,0,0,50,0,0 +43,3,211450,1,9,0,0,3,0,0,0,0,40,0,0 +19,2,184759,1,9,0,0,0,0,1,0,0,26,0,0 +47,2,197836,1,9,1,5,1,0,0,0,0,45,0,0 +61,2,232308,1,9,1,6,1,0,0,0,0,45,0,1 +35,2,301614,1,9,1,4,1,0,0,0,0,60,0,0 +60,2,146674,12,6,1,2,1,1,0,0,0,40,0,0 +27,2,225291,5,10,0,0,0,0,1,0,0,40,0,0 +57,4,148509,0,13,1,3,1,2,0,0,0,35,3,0 +56,2,136413,15,2,1,10,1,0,0,0,0,40,0,0 +27,2,126060,1,9,0,1,0,0,1,0,0,40,0,0 +47,2,73064,7,4,1,8,2,1,1,0,0,35,0,0 +19,2,39026,1,9,0,4,0,0,0,0,0,30,0,0 +28,1,33035,14,8,2,4,4,0,1,0,0,30,0,0 +43,2,193494,12,6,1,0,1,0,0,0,0,40,0,0 +63,4,147440,5,10,2,1,0,0,1,0,0,35,0,0 +25,2,64671,1,9,2,2,3,2,1,0,0,40,11,0 +35,1,225399,1,9,0,8,3,0,0,8614,0,40,0,1 +20,2,174391,1,9,0,2,3,0,1,0,0,40,0,0 +48,2,377757,12,6,1,5,1,0,0,0,0,70,0,0 +30,4,364310,0,13,0,3,0,1,1,0,0,40,9,0 +31,2,110643,0,13,1,3,1,0,0,0,0,40,0,1 +20,2,70240,1,9,0,5,3,2,1,0,0,24,11,0 +57,0,32694,3,14,1,3,1,0,0,0,0,50,0,1 +41,2,95047,9,11,1,0,2,0,1,7688,0,44,0,1 +33,2,264936,1,9,2,0,5,0,1,0,0,40,0,0 +27,2,367329,9,11,1,7,1,0,0,0,0,40,0,0 +34,2,56026,1,9,1,7,1,0,0,0,0,60,0,1 +22,2,186452,12,6,0,10,0,0,0,0,0,30,0,0 +50,2,125417,6,12,1,1,2,1,1,0,0,40,0,1 +40,1,242082,0,13,1,3,1,0,0,0,0,45,0,1 +37,2,31023,1,9,1,10,1,0,0,0,0,51,0,0 +53,2,424079,3,14,1,1,1,0,0,15024,0,55,0,1 +38,1,108947,5,10,1,8,1,0,0,7688,0,40,0,1 +25,0,261979,1,9,0,3,0,0,0,0,0,40,0,0 +51,2,55507,1,9,1,10,1,1,0,0,0,40,0,0 +18,2,353358,5,10,0,4,3,0,0,0,0,16,0,0 +41,2,67339,2,7,1,2,1,0,0,7688,0,40,0,1 +33,2,235109,1,9,0,0,4,0,1,0,0,40,0,0 +33,2,208180,0,13,0,5,0,0,1,0,0,40,0,0 +67,0,423561,5,10,1,6,1,0,0,0,0,40,0,0 +47,1,145290,1,9,1,1,1,0,0,0,2415,50,0,1 +24,2,403671,5,10,0,8,0,0,0,0,0,40,0,0 +32,4,49325,7,4,1,4,1,0,0,0,0,40,0,0 +29,2,370494,1,9,0,4,4,0,1,0,0,40,4,0 +25,2,267012,9,11,0,5,0,0,0,0,0,45,0,0 +33,2,191856,5,10,2,0,0,0,1,0,0,40,0,0 +55,2,80445,0,13,1,10,1,0,0,0,0,40,0,0 +31,2,379798,5,10,1,5,1,0,0,0,0,40,0,1 +32,4,168387,3,14,1,3,1,0,0,0,0,50,0,0 +18,2,301948,1,9,0,11,3,0,0,34095,0,3,0,0 +36,2,274809,1,9,2,0,4,0,1,0,0,50,0,0 +58,2,233193,1,9,6,0,0,0,1,0,0,27,0,0 +34,2,299635,3,14,1,1,1,0,0,0,1902,50,0,1 +19,2,236396,2,7,0,2,0,0,0,0,0,40,0,0 +21,2,688355,1,9,0,0,4,1,1,0,0,40,0,0 +36,5,37019,1,9,0,7,0,0,0,0,0,50,0,0 +37,2,148015,0,13,1,3,2,1,1,15024,0,40,0,1 +43,2,122975,1,9,1,8,2,1,1,0,0,21,33,0 +52,0,349795,0,13,1,11,1,0,0,0,0,40,0,0 +43,2,108945,5,10,2,3,4,0,1,0,0,38,0,0 +22,2,237498,1,9,0,4,3,0,0,0,0,40,0,0 +57,2,188872,11,3,2,6,4,0,0,6497,0,40,0,0 +37,2,324019,6,12,0,0,0,0,1,0,0,40,0,0 +39,2,82488,5,10,2,5,4,2,1,0,0,38,0,0 +54,2,206964,5,10,1,5,1,0,0,0,0,40,0,1 +27,2,37088,6,12,0,4,0,0,0,0,0,40,0,0 +21,2,152540,1,9,0,0,0,0,1,0,0,35,0,0 +65,2,143554,5,10,4,0,0,0,1,0,0,38,0,0 +30,2,126242,5,10,1,4,2,0,1,0,0,40,0,0 +22,2,127185,4,5,0,8,0,0,1,0,0,40,0,0 +26,2,164018,0,13,1,5,1,0,0,4064,0,50,0,0 +25,2,210184,2,7,4,10,3,0,0,0,0,40,0,0 +47,2,124973,9,11,1,1,1,0,0,15024,0,50,0,1 +23,2,182117,6,12,0,4,3,0,0,0,0,60,0,0 +42,2,220049,1,9,1,5,1,1,0,0,0,40,0,1 +39,1,247975,5,10,0,10,0,2,0,0,0,30,0,0 +55,2,50164,8,16,1,1,1,0,0,0,0,60,0,1 +24,0,123160,3,14,3,3,0,2,1,0,0,10,26,0 +53,2,79324,1,9,1,10,1,0,0,0,0,40,0,1 +44,2,129100,2,7,4,4,4,1,1,0,0,60,0,0 +40,2,210275,1,9,4,6,4,1,1,0,0,40,0,0 +48,2,189462,5,10,1,10,1,0,0,7688,0,40,0,1 +26,2,171114,9,11,4,0,4,0,1,0,0,35,0,0 +22,2,201799,1,9,0,5,3,0,1,0,0,40,0,0 +43,2,191149,1,9,2,1,0,0,1,0,0,40,0,0 +37,4,34173,1,9,1,4,2,0,1,0,0,25,0,0 +30,2,350979,1,9,1,10,1,2,0,0,0,40,17,0 +41,2,147314,1,9,1,5,1,3,0,0,0,50,0,0 +38,2,136081,10,15,1,3,1,0,0,0,0,60,0,1 +42,1,373403,1,9,1,7,1,0,0,0,0,50,0,0 +20,2,120601,1,9,0,6,3,1,0,0,0,40,0,0 +36,2,130926,0,13,2,0,0,0,1,3674,0,40,0,0 +32,3,72338,9,11,0,3,5,2,0,0,0,40,0,0 +27,2,129624,0,13,1,1,1,0,0,0,0,40,0,1 +25,0,328697,5,10,2,11,5,0,0,0,0,45,0,0 +40,2,191196,3,14,0,1,0,0,0,0,0,40,0,0 +49,2,110243,0,13,1,1,1,0,0,0,0,45,0,1 +17,2,181580,2,7,0,4,3,0,1,0,0,16,0,0 +29,2,89030,1,9,0,5,4,0,1,0,0,40,0,0 +47,2,345493,10,15,1,3,1,2,0,99999,0,55,18,1 +24,1,277700,5,10,4,2,3,0,0,0,0,45,0,0 +29,2,250679,1,9,0,10,0,0,0,0,0,40,0,0 +45,2,168837,5,10,1,0,2,0,1,0,0,24,8,1 +30,2,142675,14,8,1,10,1,0,0,0,0,50,0,0 +19,2,299050,5,10,0,0,3,0,0,0,0,20,0,0 +59,2,107833,12,6,1,6,1,0,0,0,1485,40,0,1 +47,2,121958,7,4,3,4,4,0,1,0,0,30,0,0 +41,2,282948,5,10,1,9,1,1,0,3137,0,40,0,0 +28,2,176683,6,12,0,3,3,0,0,0,0,40,23,0 +46,2,34377,6,12,1,10,1,0,0,0,0,40,0,1 +40,1,209833,5,10,1,10,1,0,0,0,0,60,0,0 +66,0,41506,12,6,2,4,0,1,1,0,0,40,0,0 +44,1,147206,5,10,0,10,3,0,0,0,0,12,0,0 +58,1,93664,1,9,1,1,1,0,0,15024,0,60,0,1 +21,2,315065,7,4,0,4,5,0,0,0,0,48,4,0 +59,2,381851,4,5,6,4,4,1,1,0,0,40,0,0 +35,4,185769,5,10,1,4,1,0,0,0,0,40,0,0 +45,2,186272,4,5,1,0,1,1,0,5178,0,40,0,1 +30,2,312667,1,9,1,6,1,0,0,0,0,40,0,0 +33,2,343925,1,9,0,2,0,1,0,0,0,40,2,0 +26,2,195994,5,10,0,5,0,0,1,0,0,15,0,0 +48,2,398843,5,10,4,5,4,1,1,0,0,35,0,0 +31,2,73514,1,9,0,5,3,2,1,0,0,40,0,0 +36,2,288049,1,9,1,1,1,0,0,0,0,45,0,0 +48,2,54759,1,9,2,3,4,0,1,0,0,38,0,0 +30,2,155343,1,9,1,10,1,0,0,5013,0,40,0,0 +33,2,401104,1,9,1,2,1,0,0,0,0,50,0,1 +53,2,113995,0,13,1,1,1,0,0,0,0,45,0,1 +38,2,111499,5,10,1,6,1,0,0,7298,0,50,0,1 +34,2,34374,5,10,0,4,0,0,0,0,0,50,0,0 +45,2,162187,0,13,1,5,1,0,0,0,0,52,0,1 +33,4,147654,9,11,1,3,1,0,0,0,0,60,0,0 +35,2,182467,9,11,1,10,2,0,1,0,0,44,0,0 +22,2,183970,1,9,0,2,3,1,0,0,0,40,0,0 +35,2,332588,1,9,2,4,4,0,1,0,0,30,0,0 +45,2,26781,1,9,1,3,1,3,0,0,0,8,0,0 +17,2,48610,2,7,0,7,3,0,0,0,0,45,0,0 +50,2,162632,1,9,1,1,1,0,0,0,0,45,0,0 +38,4,91711,0,13,1,3,1,0,0,0,0,50,0,1 +33,2,198003,5,10,1,10,1,0,0,7298,0,50,0,1 +25,2,262778,0,13,0,5,0,0,1,6849,0,50,0,0 +64,2,102470,1,9,1,10,1,0,0,0,0,40,0,0 +62,1,123170,5,10,1,1,1,0,0,0,0,10,0,0 +32,2,164243,1,9,1,9,1,0,0,0,0,60,0,1 +17,2,262511,2,7,0,5,3,0,0,0,0,20,0,0 +61,2,51170,1,9,1,10,1,0,0,0,0,55,0,0 +40,0,91949,8,16,0,3,0,1,1,0,0,40,0,0 +21,2,123727,1,9,0,1,5,0,1,0,0,40,0,0 +39,2,173175,0,13,1,1,1,0,0,15024,0,50,0,1 +35,1,120301,5,10,1,1,1,0,0,0,0,45,0,0 +29,2,250967,9,11,1,3,1,0,0,0,0,40,0,0 +27,3,285432,6,12,0,6,0,1,0,0,0,40,0,0 +20,2,36235,6,12,0,0,0,0,1,0,0,40,0,0 +51,4,110965,3,14,0,3,3,0,0,0,0,40,0,0 +45,2,123283,1,9,4,8,4,1,1,0,0,15,0,0 +31,2,152940,5,10,1,10,1,0,0,0,0,40,0,0 +29,2,376680,1,9,0,9,3,1,0,0,0,40,0,0 +56,2,231232,0,13,1,0,1,0,0,0,0,30,8,0 +55,1,168625,5,10,2,9,0,0,1,0,0,12,0,1 +26,2,33939,5,10,0,9,3,0,0,0,0,20,0,0 +46,2,155659,5,10,1,10,1,0,0,15024,0,45,0,1 +32,4,190228,1,9,1,4,1,0,0,0,0,40,0,0 +28,2,216178,1,9,1,5,1,0,0,0,0,40,0,0 +27,2,587310,7,4,0,4,5,0,0,0,0,35,24,0 +23,2,155919,4,5,3,10,0,0,0,0,0,40,4,0 +59,2,227386,12,6,1,10,1,0,0,0,0,40,0,0 +26,2,138152,14,8,0,10,5,4,0,0,0,48,24,0 +36,2,167482,12,6,0,2,0,0,0,0,0,40,0,0 +18,2,57957,1,9,0,5,3,0,1,0,0,15,0,0 +33,2,157747,4,5,2,2,0,0,0,0,0,70,0,0 +60,1,88570,9,11,1,6,2,0,1,0,0,15,9,1 +40,2,273308,1,9,2,8,4,0,1,0,0,48,4,0 +48,2,216292,1,9,1,7,1,0,0,0,0,43,0,0 +27,1,131298,12,6,1,10,1,0,0,0,0,48,0,0 +19,2,386378,5,10,0,4,3,0,0,0,0,20,0,0 +38,2,179668,0,13,1,3,1,0,0,0,0,50,0,1 +26,2,210812,5,10,2,10,0,0,0,0,0,43,0,0 +45,3,311671,9,11,1,11,1,0,0,3908,0,40,0,0 +20,2,215247,5,10,0,0,3,0,1,0,0,20,0,0 +32,3,125856,1,9,2,10,4,0,0,0,0,40,0,0 +22,2,74631,5,10,0,2,3,0,1,0,0,13,0,0 +22,2,24008,1,9,0,0,0,0,0,0,0,40,0,0 +38,0,354591,1,9,0,4,4,1,1,114,0,38,0,0 +34,2,155343,1,9,1,10,1,0,0,0,1848,50,0,1 +46,2,308334,15,2,6,4,4,4,1,0,0,30,4,0 +39,2,245361,0,13,2,1,0,0,1,0,0,25,0,0 +79,1,158319,1,9,6,4,0,0,1,0,0,24,0,0 +24,2,314823,1,9,0,5,3,0,0,0,0,40,21,0 +31,2,211334,5,10,1,10,1,0,0,2407,0,65,0,0 +37,1,73199,0,13,1,5,1,2,0,3137,0,77,36,0 +23,2,126550,1,9,0,10,5,0,0,0,0,40,0,0 +31,2,260782,5,10,1,6,1,0,0,0,1579,45,22,0 +29,2,114224,0,13,1,3,1,0,0,0,0,40,0,1 +22,0,64292,0,13,0,3,3,0,1,0,0,43,0,0 +55,4,219775,1,9,2,4,4,0,1,0,0,38,0,0 +43,2,212894,1,9,2,10,5,0,0,0,0,40,0,0 +23,2,260019,7,4,0,7,4,4,0,0,0,36,4,0 +29,2,228075,1,9,0,0,4,0,0,0,0,35,4,0 +22,2,239806,9,11,0,4,5,0,1,0,0,40,4,0 +22,2,324637,5,10,0,5,0,0,0,0,0,42,0,0 +25,2,163620,1,9,1,1,1,0,0,7298,0,84,0,1 +29,2,194200,5,10,0,8,3,0,0,0,0,45,0,0 +25,0,129200,5,10,0,6,0,1,0,0,0,40,0,0 +33,3,207172,1,9,0,1,0,0,1,0,0,40,0,0 +33,2,135312,0,13,0,3,0,0,0,0,0,40,0,1 +31,2,100734,8,16,0,3,0,0,1,0,0,28,0,0 +30,4,226443,3,14,1,3,1,0,0,0,1887,45,0,1 +55,2,110871,0,13,1,5,1,0,0,0,0,40,0,0 +36,2,192704,14,8,0,1,0,0,0,4650,0,50,0,0 +28,2,78870,0,13,0,5,0,0,0,8614,0,40,0,1 +42,2,107762,3,14,1,3,1,0,0,0,0,40,0,1 +51,2,183611,6,12,2,1,4,0,0,0,0,55,9,0 +62,4,249078,0,13,2,3,0,1,1,0,0,40,0,0 +65,5,208452,5,10,1,5,1,0,0,0,0,35,0,1 +23,2,302195,0,13,1,3,1,0,0,0,0,40,0,0 +47,2,379118,7,4,1,10,1,1,0,0,0,60,0,1 +50,5,174855,1,9,2,1,4,0,1,0,0,40,0,0 +32,1,39369,0,13,1,10,1,0,0,0,0,40,0,0 +37,3,196348,5,10,1,8,1,0,0,0,0,40,0,0 +31,2,340917,1,9,0,10,4,0,0,14344,0,40,0,1 +76,2,97077,12,6,6,5,4,1,1,0,0,12,0,0 +54,2,200098,0,13,2,5,0,1,1,0,0,60,0,0 +32,3,127651,0,13,1,3,1,0,0,0,0,40,0,1 +31,2,315128,5,10,0,0,0,0,1,0,0,52,0,0 +31,3,206823,0,13,2,11,0,0,0,0,0,50,0,1 +65,1,316093,10,15,2,3,0,0,0,0,1668,40,0,0 +30,2,112115,1,9,1,8,1,0,0,0,0,60,38,1 +21,2,250051,5,10,0,3,3,0,1,0,0,10,0,0 +40,3,298635,3,14,1,9,1,2,0,0,1902,40,11,1 +26,0,109193,5,10,0,10,0,0,1,0,0,40,0,0 +18,2,130849,2,7,0,4,3,0,1,0,0,8,0,0 +34,4,43959,1,9,1,4,1,0,0,0,0,50,0,0 +44,1,27242,5,10,0,7,3,0,0,0,0,60,0,0 +30,2,53158,6,12,0,9,0,0,1,0,0,40,0,0 +36,1,206520,0,13,0,10,3,0,0,0,0,40,0,0 +31,2,164190,5,10,1,3,1,0,0,0,0,50,0,1 +22,2,287988,5,10,0,5,0,0,0,0,0,20,0,0 +23,2,83891,1,9,0,5,3,2,0,0,0,40,0,0 +49,2,65087,3,14,1,1,1,0,0,15024,0,50,0,1 +39,1,363418,0,13,4,10,3,0,0,0,0,35,0,0 +19,2,278870,5,10,0,2,3,0,0,0,0,16,0,0 +30,2,174789,6,12,1,1,1,0,0,0,1848,50,0,1 +25,2,228608,5,10,0,10,5,2,1,0,0,40,14,0 +46,2,263568,1,9,1,8,1,0,0,0,0,40,0,0 +37,2,117381,3,14,1,3,1,0,0,0,0,45,0,0 +41,3,83411,1,9,1,4,1,0,0,0,0,40,0,0 +40,1,49156,5,10,1,3,1,0,0,0,0,20,0,0 +44,2,421449,1,9,2,0,4,0,1,0,0,40,0,0 +32,2,238944,1,9,1,8,1,0,0,0,0,40,0,0 +58,2,188982,1,9,1,2,1,1,0,0,0,20,0,1 +48,2,175925,1,9,1,8,1,0,0,0,0,48,0,0 +34,2,164190,0,13,1,1,1,0,0,0,0,40,0,0 +29,2,232914,9,11,0,0,3,1,1,0,0,40,0,0 +46,5,120121,0,13,1,5,1,0,0,0,0,50,0,1 +36,4,180805,1,9,0,6,0,2,0,0,0,40,0,0 +59,4,161944,0,13,0,0,0,0,0,0,0,38,0,0 +29,2,319149,14,8,1,6,1,0,0,0,0,40,4,0 +25,2,290528,1,9,1,8,1,0,0,0,0,40,0,0 +27,2,123984,6,12,0,4,0,2,1,0,0,35,11,0 +48,2,34186,1,9,1,7,1,0,0,0,0,70,0,0 +51,3,282680,8,16,0,3,0,0,1,0,1564,70,0,1 +36,2,183892,1,9,2,6,0,0,0,8614,0,45,0,1 +42,4,195124,2,7,2,5,4,0,0,7430,0,50,5,1 +49,0,55938,0,13,1,0,1,0,0,0,0,40,0,1 +33,2,209900,5,10,0,9,3,0,0,0,0,20,0,0 +40,2,179717,0,13,2,5,0,0,0,0,1564,60,0,1 +26,2,150361,0,13,0,3,0,0,1,0,0,40,0,0 +59,2,252714,1,9,1,8,1,0,0,0,0,30,25,0 +30,2,205204,1,9,0,0,3,0,1,0,0,40,0,0 +31,4,168906,6,12,1,0,2,0,1,0,0,35,0,0 +30,2,112115,0,13,1,1,1,0,0,0,0,50,0,1 +27,2,116531,0,13,0,1,0,0,1,0,0,40,0,0 +56,2,191917,6,12,2,0,4,0,1,4101,0,40,0,0 +24,2,341294,1,9,1,8,1,0,0,0,0,40,0,0 +47,2,216734,0,13,2,5,4,0,1,0,0,50,0,0 +51,2,182187,0,13,0,3,0,1,0,0,0,35,0,0 +34,2,424988,1,9,1,10,1,0,0,0,0,45,0,0 +47,2,379118,1,9,2,4,4,1,0,0,0,9,0,0 +47,2,168232,5,10,1,0,1,0,0,0,0,44,0,1 +20,2,147171,5,10,0,0,4,2,1,0,0,40,36,0 +31,2,193650,2,7,2,4,0,0,1,0,0,40,0,0 +42,2,200187,9,11,2,4,4,0,1,0,0,32,0,0 +52,2,188644,11,3,3,10,5,0,0,0,0,40,4,0 +56,2,398067,1,9,6,0,0,0,1,0,0,40,0,0 +53,2,29658,1,9,1,10,1,0,0,0,0,40,0,1 +26,2,154966,5,10,1,5,1,0,0,0,0,50,0,1 +81,2,364099,5,10,2,0,0,0,1,0,0,20,0,0 +57,3,97837,5,10,2,3,0,0,0,0,0,48,0,1 +34,2,117983,1,9,0,0,0,0,1,0,0,40,0,0 +24,2,64167,9,11,0,9,4,1,1,0,0,40,0,0 +20,2,315877,1,9,0,4,4,0,0,0,2001,40,0,0 +68,3,232151,5,10,2,0,5,1,1,2346,0,40,0,0 +60,2,225526,1,9,4,5,0,0,1,0,0,32,0,0 +37,3,289653,5,10,1,10,1,0,0,0,0,40,0,0 +25,2,179462,7,4,0,2,4,0,0,0,0,40,0,0 +36,3,67317,1,9,1,0,1,0,0,0,0,40,0,0 +45,2,77764,6,12,1,10,1,0,0,0,0,40,0,0 +34,2,253438,5,10,1,1,1,0,0,0,0,60,0,1 +31,2,150309,0,13,4,1,0,0,1,0,0,70,0,0 +47,1,83064,0,13,1,7,1,0,0,0,0,60,0,0 +60,1,376973,1,9,1,10,1,0,0,0,0,42,0,1 +75,2,311184,0,13,1,1,1,0,0,0,0,24,0,0 +43,4,159449,5,10,1,11,1,0,0,0,0,40,0,0 +18,2,168288,1,9,0,2,3,0,0,0,0,40,0,0 +25,2,74883,0,13,0,9,0,2,1,0,1092,40,11,0 +20,2,275190,1,9,0,0,3,0,1,0,0,40,0,0 +32,2,189838,1,9,0,5,0,0,1,0,0,50,0,0 +57,5,101338,0,13,1,1,1,0,0,0,0,20,0,0 +43,2,331894,5,10,1,6,1,0,0,0,0,60,0,1 +18,1,40293,1,9,0,7,5,0,0,0,0,40,0,0 +41,4,88904,0,13,4,3,4,1,1,0,0,40,0,0 +48,2,145041,1,9,0,8,5,0,0,0,0,40,21,0 +35,2,46385,1,9,1,6,1,0,0,5178,0,90,0,1 +41,0,363591,9,11,1,1,1,0,0,0,0,40,0,0 +23,2,183327,1,9,0,10,3,1,1,0,1594,20,0,0 +32,0,182556,0,13,1,11,1,0,0,0,1887,45,0,1 +33,2,267859,1,9,0,10,3,0,0,0,0,40,22,0 +58,2,190747,1,9,1,8,1,0,0,0,0,40,0,0 +22,2,162869,5,10,0,5,5,0,0,0,0,65,0,0 +33,2,141229,5,10,2,4,0,0,1,0,0,50,0,0 +42,1,174216,10,15,1,3,1,0,0,0,0,38,0,1 +25,2,366416,1,9,0,0,3,0,1,0,0,40,0,0 +39,2,172538,1,9,1,3,1,0,0,0,0,50,0,1 +35,2,193026,0,13,1,5,1,0,0,0,0,45,0,1 +50,2,184424,5,10,1,0,2,0,1,0,1902,38,0,1 +49,4,337768,3,14,1,1,1,0,0,0,0,50,0,1 +25,4,179059,0,13,0,3,3,0,0,0,0,40,0,0 +47,3,99549,5,10,2,0,4,1,1,0,0,40,0,0 +46,2,72619,5,10,1,1,2,0,1,0,0,40,0,1 +42,0,55764,6,12,2,3,0,1,0,0,0,40,0,0 +37,2,30267,2,7,0,6,0,0,0,0,0,60,0,1 +25,2,308144,0,13,0,10,0,0,0,0,0,40,4,0 +29,2,206351,12,6,1,10,1,0,0,5013,0,40,0,0 +26,2,282304,5,10,0,5,0,0,0,0,0,45,0,0 +45,5,142719,0,13,1,1,1,0,0,0,0,40,0,1 +34,2,114973,1,9,4,1,4,0,1,0,0,30,0,0 +33,3,159548,6,12,0,0,4,1,1,0,0,40,0,0 +43,2,91209,0,13,1,1,1,0,0,0,0,40,0,1 +28,2,196564,1,9,1,10,1,0,0,0,0,45,0,0 +51,1,149220,5,10,1,7,1,0,0,0,0,75,0,0 +21,2,169699,5,10,0,4,0,0,1,0,0,35,0,0 +23,2,218215,6,12,0,4,3,0,1,0,0,35,0,0 +30,2,156718,1,9,0,9,0,0,1,0,0,40,0,0 +46,2,55720,3,14,1,1,1,0,0,0,0,45,0,1 +38,5,257250,1,9,0,7,0,0,0,0,0,50,0,0 +20,2,194630,1,9,0,5,0,0,0,0,0,40,0,0 +36,2,398931,0,13,1,3,1,0,0,0,1485,50,0,1 +37,1,362062,10,15,1,3,1,0,0,99999,0,50,0,1 +44,4,101593,3,14,0,3,0,0,0,0,1876,42,0,0 +33,2,196266,1,9,1,10,1,0,0,0,0,40,0,1 +45,4,197332,0,13,0,1,0,0,0,0,0,40,0,0 +47,2,97842,5,10,1,10,1,0,0,0,0,40,0,0 +54,2,86837,1,9,1,10,1,2,0,0,1902,40,0,1 +17,2,57324,12,6,0,4,3,0,0,0,0,30,0,0 +43,2,116852,1,9,1,1,2,0,1,0,0,36,20,1 +45,2,154430,0,13,6,3,0,0,1,10520,0,50,0,1 +37,2,38468,5,10,0,0,0,0,1,0,0,40,0,0 +44,4,188808,9,11,1,10,1,0,0,0,0,40,0,1 +55,4,177163,3,14,6,3,4,0,1,914,0,50,0,0 +41,2,187322,1,9,1,8,1,0,0,0,0,48,0,0 +23,2,107578,0,13,0,0,3,0,1,2174,0,40,0,0 +38,2,168680,5,10,0,0,3,1,1,0,0,40,0,0 +23,2,256755,0,13,0,2,5,0,1,0,0,40,1,0 +35,2,360799,1,9,1,10,1,0,0,7298,0,40,0,1 +18,2,188476,2,7,0,1,3,0,0,0,0,20,0,0 +47,2,30457,9,11,1,4,1,0,0,0,0,40,0,0 +25,2,252752,5,10,0,3,0,0,1,0,0,8,0,0 +41,1,443508,1,9,1,1,1,0,0,0,0,50,0,0 +23,2,244408,5,10,0,0,5,2,1,0,0,24,36,0 +41,2,178983,1,9,1,0,2,0,1,0,0,40,0,0 +26,2,143068,5,10,1,1,1,0,0,2407,0,50,0,0 +30,4,247328,5,10,0,0,0,0,0,0,0,40,0,0 +42,2,201732,5,10,1,5,1,0,0,0,0,40,0,1 +35,2,246829,1,9,2,1,4,0,1,0,0,40,0,0 +29,2,119170,5,10,4,9,4,0,1,0,0,40,0,0 +21,2,207923,5,10,3,0,3,0,1,0,0,15,0,0 +48,0,170142,3,14,2,3,0,0,0,0,0,40,0,1 +44,1,187164,1,9,2,6,4,0,0,0,0,60,0,0 +34,4,303867,4,5,0,4,3,0,0,0,0,40,0,0 +19,2,291429,1,9,0,4,3,0,1,0,0,25,0,0 +32,2,213179,5,10,2,10,3,0,0,0,0,40,0,1 +31,0,111843,6,12,4,4,4,1,1,0,0,40,0,0 +25,2,297154,1,9,1,2,1,0,0,2407,0,40,0,0 +47,3,68493,1,9,1,0,1,1,0,0,0,40,0,1 +46,3,340718,2,7,6,0,0,0,1,0,0,40,0,0 +18,2,194059,14,8,0,0,3,0,0,0,0,40,0,0 +31,2,47296,5,10,1,0,2,0,1,0,1740,20,0,0 +28,0,286310,1,9,1,0,3,0,1,0,0,40,0,0 +38,2,207202,1,9,1,8,1,0,0,0,0,48,0,1 +33,5,132601,1,9,1,10,1,0,0,0,0,40,0,1 +41,2,160785,9,11,1,1,1,0,0,0,0,40,0,1 +46,2,117849,5,10,1,5,1,0,0,15024,0,40,0,1 +38,4,225605,5,10,1,3,1,0,0,0,0,44,0,0 +24,2,190290,0,13,0,5,0,0,0,0,0,60,0,0 +49,2,164799,1,9,1,8,1,0,0,0,0,40,0,1 +60,3,21876,5,10,2,3,0,3,1,0,0,40,0,0 +44,2,160785,0,13,1,5,1,0,0,0,0,60,0,1 +63,5,272425,9,11,1,1,1,0,0,0,0,40,0,1 +40,2,168538,1,9,1,5,1,0,0,0,0,60,0,1 +45,5,204205,5,10,1,1,1,0,0,0,0,50,0,1 +49,2,142287,5,10,1,0,1,0,0,0,1902,50,0,1 +36,2,169926,1,9,2,5,0,0,1,0,0,40,0,0 +65,4,205024,1,9,1,4,1,0,0,0,0,8,0,0 +41,2,374764,0,13,6,1,4,0,0,0,0,20,0,0 +25,2,108779,3,14,4,4,3,0,1,0,0,40,0,0 +60,2,227332,9,11,6,0,0,0,0,0,0,40,0,0 +17,4,246308,2,7,0,3,3,0,1,0,0,20,5,0 +28,2,51331,6,12,1,1,2,0,1,0,0,16,0,1 +31,2,153078,6,12,0,10,3,4,0,0,0,50,0,0 +47,2,169180,3,14,0,3,0,0,1,0,0,35,0,0 +45,1,193451,5,10,1,6,1,0,0,0,0,45,0,0 +51,2,305147,0,13,0,3,0,0,0,0,0,40,0,0 +23,2,138892,1,9,0,8,3,1,0,0,0,40,0,0 +44,1,402397,3,14,1,1,2,0,1,0,1902,60,0,1 +34,2,223267,1,9,0,1,5,0,0,0,0,50,0,0 +19,2,29250,5,10,0,3,3,0,0,0,0,10,0,0 +46,0,29696,1,9,1,6,1,0,0,0,0,40,0,0 +30,2,315640,8,16,1,3,1,2,0,0,1977,40,26,1 +37,2,632613,12,6,1,7,1,0,0,0,0,35,4,0 +56,2,282023,10,15,1,3,1,0,0,0,0,45,0,1 +29,2,77760,1,9,1,0,1,0,0,0,0,45,0,0 +46,1,148599,3,14,1,10,1,0,0,0,0,50,0,1 +55,2,414994,1,9,1,10,1,0,0,0,0,40,0,0 +45,2,339863,0,13,2,5,0,0,0,8614,0,48,0,1 +34,2,499249,1,9,3,2,0,0,0,0,0,40,24,0 +41,2,252058,0,13,0,0,0,0,0,0,0,40,0,0 +34,2,117963,10,15,1,3,1,0,0,0,0,50,0,1 +27,2,194652,1,9,0,10,3,1,0,0,0,40,0,0 +29,2,299705,5,10,0,2,4,1,0,0,0,37,0,0 +19,3,27433,14,8,0,4,3,0,1,0,0,30,0,0 +47,4,39986,0,13,1,3,1,0,0,0,0,40,0,0 +43,5,135342,5,10,1,1,1,0,0,0,0,50,0,1 +52,2,270142,9,11,4,1,4,1,1,0,0,60,0,0 +33,1,118267,6,12,2,5,0,0,0,0,0,60,0,0 +29,2,266043,4,5,1,6,1,0,0,0,0,40,0,0 +23,2,35633,1,9,1,2,1,0,0,0,0,40,0,0 +23,2,74568,5,10,0,1,0,0,0,0,0,40,0,0 +39,2,214816,0,13,1,1,1,0,0,0,0,60,0,0 +43,2,222971,11,3,0,8,4,0,1,0,0,40,4,0 +31,2,259425,1,9,1,10,1,0,0,0,0,40,0,1 +47,5,212120,1,9,1,10,1,0,0,0,0,40,0,1 +26,2,245880,1,9,0,0,0,0,0,0,0,60,0,0 +58,4,54947,5,10,0,3,0,0,1,0,0,55,0,0 +47,5,79627,10,15,2,3,0,0,0,27828,0,50,0,1 +55,2,151474,0,13,0,9,5,0,1,0,1590,38,0,0 +26,2,132661,1,9,1,1,2,0,1,5013,0,40,0,0 +28,2,161674,1,9,0,8,4,0,1,0,0,40,0,0 +36,2,62346,1,9,1,10,1,1,0,0,0,40,0,0 +40,2,227236,1,9,1,5,1,0,0,0,0,50,0,0 +19,2,283033,2,7,0,4,0,0,0,0,0,40,0,0 +63,1,298249,0,13,1,5,1,0,0,10605,0,40,0,1 +42,2,251229,0,13,1,6,1,0,0,0,0,40,0,0 +76,2,199949,4,5,1,11,1,0,0,0,0,13,0,0 +23,0,305498,9,11,0,9,0,0,1,0,0,40,0,0 +38,1,203836,11,3,0,6,0,0,0,0,0,40,0,0 +33,0,79440,3,14,0,3,0,2,0,0,0,30,28,0 +48,4,142719,3,14,1,3,1,0,0,0,0,40,0,1 +56,2,119859,5,10,2,6,0,0,0,0,0,40,0,1 +32,2,141410,1,9,1,8,1,1,0,0,0,40,0,0 +44,4,202872,5,10,2,3,4,0,1,0,0,25,0,0 +27,2,198813,1,9,2,0,3,1,1,0,0,40,0,0 +33,3,129707,5,10,0,1,0,0,0,0,0,50,0,0 +22,2,445758,11,3,0,2,0,0,0,0,0,40,4,0 +44,2,173981,1,9,1,10,1,0,0,0,0,40,0,0 +42,2,108506,1,9,1,6,1,3,0,0,0,60,0,0 +34,2,134886,5,10,0,0,0,0,1,0,0,40,0,0 +45,3,181970,1,9,1,0,1,0,0,0,1672,40,0,0 +57,5,282913,1,9,1,5,1,0,0,0,0,40,1,0 +59,4,196013,0,13,1,3,1,0,0,0,0,40,0,1 +33,3,348491,5,10,1,1,2,1,1,0,0,40,0,1 +52,2,416164,1,9,1,7,1,4,0,0,0,49,4,0 +17,2,121037,14,8,0,5,3,0,1,0,0,15,0,0 +29,2,103111,1,9,0,4,3,0,0,0,0,30,8,0 +63,1,147589,0,13,1,5,1,0,0,0,0,30,0,1 +20,2,24008,5,10,0,2,0,0,0,0,0,24,0,0 +42,5,123838,10,15,1,3,1,0,0,0,1977,50,0,1 +50,1,175456,1,9,1,7,1,0,0,0,0,50,0,0 +55,2,84774,1,9,1,13,2,0,1,0,0,30,0,0 +27,2,194590,6,12,1,0,2,1,1,0,0,25,0,0 +28,2,134566,0,13,1,1,1,0,0,0,0,45,0,0 +55,2,211678,9,11,1,8,1,0,0,0,0,45,0,0 +44,3,44822,5,10,1,10,1,0,0,0,0,40,0,0 +53,0,144586,5,10,0,11,0,0,1,0,0,40,0,0 +23,2,119156,1,9,1,10,1,0,0,0,0,40,0,0 +25,2,371987,1,9,2,0,0,0,1,0,0,40,0,0 +44,0,144125,0,13,2,3,0,0,1,0,0,40,0,0 +55,2,31905,3,14,1,1,1,0,0,0,1977,40,0,1 +48,1,121124,5,10,1,3,1,0,0,0,0,35,0,1 +46,2,58126,1,9,1,10,1,0,0,0,0,40,0,0 +26,2,318518,5,10,0,6,0,0,0,0,0,40,0,0 +30,2,296509,7,4,4,7,0,0,0,0,0,45,4,0 +32,2,473133,3,14,1,3,1,0,0,0,0,40,0,1 +52,2,155434,1,9,1,1,1,0,0,0,0,48,0,0 +52,2,99185,1,9,1,5,1,0,0,7298,0,50,0,1 +39,2,56648,1,9,4,5,0,0,1,0,0,47,0,0 +57,4,118481,0,13,1,3,1,0,0,0,1902,40,0,1 +21,2,321666,1,9,0,10,3,0,0,594,0,40,0,0 +22,0,119838,5,10,0,4,3,0,0,0,0,10,0,0 +26,2,330695,5,10,1,8,1,0,0,0,0,40,0,0 +26,0,58039,5,10,1,4,1,0,0,0,0,40,0,0 +44,2,313022,9,11,1,1,1,1,0,0,0,40,0,1 +42,2,178134,5,10,2,0,0,0,1,0,0,30,0,0 +40,2,165309,5,10,1,6,1,0,0,0,0,43,0,0 +22,2,216181,2,7,0,10,3,0,0,0,0,45,0,0 +62,2,178745,1,9,1,10,1,0,0,0,0,45,0,1 +44,2,111067,5,10,1,10,1,0,0,0,0,40,0,0 +33,1,295591,15,2,3,10,0,0,0,0,0,40,4,0 +45,2,123075,1,9,1,1,1,0,0,0,0,50,0,0 +18,2,78045,2,7,1,2,3,0,0,0,0,40,0,0 +32,4,255004,5,10,0,10,0,0,0,0,0,40,0,0 +33,2,254221,8,16,0,3,0,0,1,0,0,60,0,1 +20,2,174714,5,10,0,3,3,0,0,0,0,15,0,0 +68,1,450580,1,9,1,7,1,0,0,0,0,20,0,0 +61,2,128230,7,4,1,5,1,0,0,0,0,50,0,1 +48,2,192894,8,16,1,3,1,0,0,0,0,40,0,1 +45,2,325390,1,9,1,5,1,0,0,0,0,40,0,0 +36,1,20333,1,9,1,5,2,0,1,7688,0,40,0,1 +32,3,128714,1,9,0,4,3,1,1,0,0,32,0,0 +35,2,170797,0,13,2,4,0,0,1,0,0,40,0,0 +39,2,269186,1,9,1,10,1,0,0,0,0,40,0,0 +53,2,127671,7,4,1,8,1,0,0,0,0,40,0,0 +30,2,211840,5,10,4,5,4,1,1,0,0,16,0,0 +40,2,201495,0,13,2,11,0,0,0,0,0,45,0,0 +25,2,251854,5,10,0,0,0,1,1,0,0,40,2,0 +41,2,279297,1,9,0,5,0,1,1,0,0,60,0,0 +52,1,195462,1,9,1,7,1,0,0,0,0,98,0,1 +33,2,170769,1,9,1,10,1,0,0,0,0,40,0,0 +28,2,142443,1,9,0,10,3,0,0,0,0,40,0,0 +25,1,182809,1,9,1,10,1,0,0,7298,0,40,0,1 +53,2,121441,5,10,1,5,1,0,0,0,0,55,0,0 +44,2,275094,15,2,0,4,3,0,0,0,0,10,0,0 +35,2,170263,1,9,2,1,4,0,1,0,0,40,0,0 +38,2,172571,5,10,2,10,3,0,0,0,0,58,12,0 +34,2,178615,1,9,1,8,1,0,0,0,0,40,0,0 +33,2,279524,1,9,2,8,0,0,1,0,0,40,0,0 +24,0,165201,5,10,1,0,2,0,1,0,0,45,0,0 +65,4,323006,1,9,6,4,4,1,1,0,0,25,0,0 +29,2,235168,6,12,1,5,1,0,0,0,0,60,0,0 +39,5,114844,10,15,1,3,1,0,0,99999,0,65,0,1 +46,4,216414,5,10,1,11,1,0,0,0,0,40,0,1 +37,2,34378,7,4,1,7,1,0,0,2580,0,60,0,0 +47,0,80914,3,14,1,1,1,0,0,0,0,47,0,1 +62,2,73292,5,10,1,4,1,0,0,0,0,40,0,0 +54,1,212165,1,9,1,5,1,0,0,0,0,60,0,0 +90,2,52386,5,10,0,4,0,2,0,0,0,35,0,0 +33,2,205649,6,12,3,10,0,0,0,0,0,20,0,0 +57,2,109638,5,10,1,1,1,0,0,0,1672,45,0,0 +25,2,200408,6,12,0,10,3,0,0,0,0,40,0,0 +44,5,187720,5,10,1,5,1,0,0,0,0,50,0,1 +52,2,236180,0,13,3,4,0,0,0,0,0,50,0,0 +21,2,118693,5,10,0,8,3,0,0,0,0,40,0,0 +31,2,363130,1,9,0,4,4,1,0,0,0,18,0,0 +39,2,225544,3,14,1,6,1,0,0,0,0,40,12,0 +59,3,243612,1,9,6,8,4,0,1,0,0,40,0,0 +29,1,160786,1,9,1,1,1,0,0,0,0,55,0,0 +49,2,234320,7,4,0,3,5,1,0,0,0,45,0,0 +34,2,314646,4,5,1,10,1,0,0,0,0,40,0,0 +22,2,124971,0,13,0,5,0,0,0,0,0,40,0,0 +32,2,209184,0,13,1,5,1,4,0,0,0,40,5,0 +39,0,121838,1,9,2,4,4,1,1,0,0,40,0,0 +46,2,265275,3,14,1,3,1,0,0,0,0,60,0,0 +50,2,71417,1,9,1,10,1,0,0,3103,0,40,0,1 +34,2,45522,1,9,0,4,0,0,0,0,0,40,0,0 +28,4,250135,3,14,1,3,2,0,1,0,1902,55,0,0 +18,2,120283,14,8,0,5,3,0,1,0,0,24,0,0 +20,2,216972,1,9,0,5,0,0,0,0,0,30,0,0 +20,2,116791,1,9,0,8,5,0,1,0,0,40,0,0 +55,0,26290,9,11,6,1,0,3,1,0,0,38,0,0 +22,2,216134,5,10,0,5,3,1,1,0,0,40,0,0 +60,1,143932,3,14,1,1,1,0,0,0,0,40,0,0 +40,2,217120,12,6,2,10,0,0,0,0,0,50,0,0 +47,0,223944,5,10,1,0,2,0,1,0,0,30,0,0 +23,2,185452,0,13,0,1,0,0,1,0,0,35,8,0 +57,4,44273,1,9,6,6,0,0,1,0,0,40,0,0 +52,2,178983,2,7,1,4,1,0,0,0,0,40,0,0 +42,2,219288,7,4,6,10,4,0,0,0,0,40,0,0 +25,2,349190,6,12,0,2,3,0,0,0,0,20,0,0 +49,5,158685,1,9,1,0,2,0,1,0,2377,40,0,1 +41,3,57924,5,10,0,11,3,0,0,0,0,40,0,0 +40,0,270324,9,11,1,4,1,1,0,0,0,30,0,0 +38,2,33001,0,13,1,1,1,0,0,0,0,55,0,1 +58,2,204021,1,9,0,6,3,0,0,0,0,40,8,0 +26,2,192506,0,13,0,4,0,1,1,0,0,35,0,0 +57,2,372967,12,6,2,0,5,0,1,0,0,70,9,0 +28,2,273929,1,9,1,5,1,0,0,0,1628,60,0,0 +42,2,195821,1,9,4,5,4,0,1,0,0,40,0,0 +28,2,56179,5,10,0,1,0,0,0,2174,0,55,0,0 +39,1,124090,4,5,1,10,1,0,0,0,0,40,0,0 +28,2,199600,1,9,1,8,1,1,0,0,0,40,0,0 +42,2,255847,1,9,1,8,1,0,0,4386,0,48,0,1 +51,1,218311,5,10,2,5,4,0,1,0,0,50,0,0 +27,2,167336,5,10,0,0,0,0,1,0,0,39,0,0 +41,2,59938,1,9,2,0,4,0,1,0,0,43,0,0 +28,2,263728,0,13,1,10,1,0,0,0,0,40,0,0 +54,1,278230,5,10,2,7,4,0,1,10520,0,30,0,1 +49,2,43910,1,9,1,0,2,0,1,0,0,30,0,0 +47,2,190139,3,14,1,1,1,0,0,0,0,40,0,1 +27,2,109001,5,10,1,10,1,0,0,0,0,49,0,0 +42,4,159931,0,13,1,3,2,0,1,0,0,45,0,1 +32,2,194987,1,9,1,0,2,1,1,0,0,40,0,0 +32,4,87310,1,9,1,4,1,0,0,0,0,41,0,0 +27,2,133937,3,14,0,5,3,0,0,0,0,40,0,0 +29,2,207064,1,9,1,10,1,0,0,0,0,40,0,1 +22,2,36011,9,11,0,3,0,0,0,0,0,30,0,0 +41,3,168294,1,9,1,0,1,0,0,5178,0,40,0,1 +49,4,194895,5,10,1,2,1,0,0,7298,0,40,0,1 +58,1,49884,1,9,1,7,1,0,0,0,0,50,0,0 +41,1,27305,1,9,1,7,1,0,0,7688,0,40,0,1 +26,2,229977,4,5,1,10,1,0,0,0,0,35,0,0 +21,2,64520,1,9,0,5,0,0,0,0,0,55,0,0 +37,2,305379,0,13,1,1,1,0,0,0,0,50,0,1 +23,2,202284,0,13,0,5,3,0,0,0,0,20,0,0 +42,1,99185,5,10,1,1,1,0,0,0,0,40,0,1 +25,2,159662,1,9,1,5,3,0,0,0,0,26,0,1 +67,2,197865,5,10,2,0,0,0,1,0,0,40,0,0 +41,4,175149,1,9,2,6,0,1,1,0,0,38,0,0 +49,4,349633,3,14,1,3,2,0,1,0,0,50,0,1 +18,2,242893,2,7,0,10,3,0,0,0,0,35,0,0 +25,2,218667,11,3,1,2,3,0,0,0,0,40,0,0 +43,0,144811,10,15,2,3,0,0,0,0,0,50,0,0 +38,2,146091,8,16,1,1,2,0,1,99999,0,36,0,1 +65,1,226215,0,13,1,5,1,0,0,0,0,15,0,0 +66,2,114447,9,11,6,3,0,0,1,0,0,35,0,0 +33,2,124187,2,7,0,6,0,1,0,0,0,60,0,0 +51,2,147954,1,9,1,0,2,1,1,3411,0,38,0,0 +27,5,64379,1,9,1,10,1,0,0,0,1740,40,0,0 +17,2,156501,14,8,0,4,3,0,1,0,0,16,0,0 +32,2,207668,0,13,1,1,1,0,0,15024,0,45,0,1 +38,2,225707,1,9,1,8,1,0,0,0,0,40,1,1 +43,4,115603,5,10,2,0,4,0,1,0,0,40,0,0 +40,0,506329,8,16,1,3,1,2,0,0,0,40,18,1 +63,2,275034,0,13,1,5,1,0,0,0,1740,35,0,0 +42,2,56483,6,12,2,0,4,0,1,0,0,40,0,0 +43,3,144778,0,13,0,1,0,0,0,0,0,40,0,1 +41,4,297248,10,15,1,3,1,0,0,0,2415,45,0,1 +17,2,137042,12,6,0,3,3,0,0,0,0,20,0,0 +30,1,33308,1,9,0,10,0,0,0,0,0,40,0,0 +30,2,158420,0,13,0,3,0,0,0,0,0,50,10,0 +22,2,41763,5,10,0,4,0,0,0,0,0,25,0,0 +28,2,149734,1,9,0,4,4,1,1,0,0,52,0,0 +24,2,349691,5,10,0,5,5,1,1,0,0,40,0,0 +47,2,185385,12,6,1,8,1,0,0,0,0,40,0,1 +34,1,174463,9,11,0,7,0,0,0,0,0,50,0,0 +26,2,236068,5,10,0,5,5,0,1,0,0,20,0,0 +25,2,91334,9,11,1,1,1,0,0,0,0,75,0,0 +28,2,33895,0,13,0,5,0,0,0,0,0,45,0,0 +36,2,214816,1,9,0,10,0,0,1,0,0,40,0,0 +24,2,229773,0,13,0,1,0,0,0,0,0,40,0,0 +51,5,166386,0,13,1,1,2,2,1,0,0,35,18,0 +44,2,266135,0,13,1,3,1,0,0,0,0,50,0,1 +18,2,300379,14,8,0,0,3,0,0,0,0,12,0,0 +54,3,392502,5,10,1,3,1,0,0,0,0,40,0,1 +61,2,73809,5,10,2,0,0,0,1,0,0,40,0,0 +51,2,193720,0,13,1,1,1,0,0,0,0,45,0,1 +43,2,316183,7,4,1,8,1,0,0,0,0,40,0,0 +51,2,162944,1,9,1,10,1,0,0,0,0,40,0,0 +50,4,186888,1,9,1,1,2,1,1,0,0,40,0,1 +24,2,192017,5,10,1,2,1,0,0,0,0,30,0,0 +20,0,161978,5,10,1,4,1,0,0,0,0,20,0,0 +52,2,202930,0,13,2,1,0,0,0,0,0,40,0,1 +57,4,323309,7,4,2,4,0,0,0,0,0,40,0,0 +49,5,197332,5,10,1,5,1,0,0,0,0,60,0,0 +22,2,271274,2,7,0,5,0,0,1,0,0,40,0,0 +38,2,174242,5,10,1,9,1,0,0,0,0,40,0,1 +21,2,209483,5,10,0,5,3,0,1,0,0,20,0,0 +39,3,99146,0,13,1,11,1,0,0,0,1887,60,0,1 +52,1,102346,5,10,0,3,3,0,1,0,0,35,0,0 +25,2,181666,6,12,0,9,3,0,1,0,0,40,0,0 +50,2,207367,5,10,3,4,0,0,1,0,0,40,1,0 +35,0,82622,5,10,1,1,1,0,0,0,0,80,0,0 +50,2,202296,9,11,4,3,4,0,1,0,0,40,0,0 +58,2,142182,1,9,1,10,1,0,0,0,0,25,0,0 +48,3,94342,0,13,2,1,0,0,0,0,0,45,0,0 +30,2,41493,5,10,2,0,0,0,1,0,0,35,8,0 +18,2,181712,2,7,0,2,3,0,0,0,0,12,0,0 +29,1,164607,1,9,1,10,1,0,0,0,0,40,0,0 +52,1,41496,5,10,1,5,1,0,0,0,0,45,0,0 +63,2,143098,1,9,1,5,1,0,0,4064,0,40,0,0 +36,4,196529,3,14,1,3,2,0,1,0,0,40,0,1 +24,2,157332,5,10,0,8,3,0,1,0,0,42,0,0 +30,4,154935,6,12,0,11,0,1,0,0,0,40,0,0 +23,2,223231,1,9,1,8,1,4,0,0,0,40,4,0 +21,2,362589,0,13,0,4,3,0,1,0,0,20,0,0 +28,2,94880,5,10,0,10,0,0,0,0,0,43,4,0 +20,2,309580,1,9,0,0,3,0,0,0,0,40,0,0 +18,2,130389,2,7,0,4,3,0,0,0,0,20,32,0 +21,2,349365,5,10,0,0,3,0,1,0,0,15,0,0 +27,2,376936,1,9,0,10,0,0,0,0,0,40,0,0 +42,2,179557,5,10,2,9,0,0,1,0,0,40,0,0 +21,2,105577,5,10,0,4,3,0,1,0,0,30,0,0 +51,2,224207,5,10,1,5,1,0,0,0,0,40,0,1 +27,3,47907,0,13,0,0,0,0,1,0,0,40,0,0 +23,1,191283,1,9,0,6,3,0,0,0,0,40,0,0 +57,2,20953,5,10,1,5,1,0,0,0,1902,40,0,1 +22,0,186569,0,13,0,3,3,0,1,0,0,12,0,0 +59,2,43221,4,5,1,6,1,0,0,0,0,60,0,1 +38,2,161141,1,9,2,6,0,0,0,0,0,40,0,0 +20,2,203003,1,9,0,6,5,0,0,0,0,40,0,0 +90,2,141758,4,5,0,0,0,0,1,0,0,40,0,0 +35,2,113322,9,11,1,5,1,0,0,0,0,40,0,0 +50,2,343847,1,9,1,11,1,0,0,0,0,38,0,1 +45,2,214068,8,16,1,3,1,0,0,0,0,50,0,1 +44,2,116632,3,14,1,1,1,0,0,0,0,50,0,1 +23,2,240160,6,12,0,3,3,0,0,0,0,40,0,0 +34,2,516337,2,7,1,2,1,0,0,0,0,40,4,0 +23,5,284651,0,13,2,5,0,0,1,0,0,43,0,0 +39,0,141420,5,10,1,11,1,0,0,0,0,40,0,0 +19,2,42750,5,10,0,2,0,0,0,0,0,55,0,0 +54,2,165278,5,10,1,1,1,0,0,0,0,40,0,1 +40,2,167265,3,14,2,3,0,0,0,0,0,43,0,0 +44,2,139907,5,10,0,5,3,0,0,0,0,50,0,0 +31,5,236415,5,10,1,0,2,0,1,0,0,20,0,1 +25,2,312966,4,5,4,2,5,0,0,0,0,40,22,0 +33,2,118941,0,13,1,1,2,0,1,0,0,32,0,1 +32,2,198068,1,9,0,6,0,0,0,0,0,60,0,0 +36,2,373952,12,6,1,8,1,0,0,0,0,40,0,0 +47,1,236111,5,10,1,3,1,4,0,0,0,55,0,1 +80,2,157778,3,14,6,3,0,0,1,0,0,10,0,0 +21,2,143604,5,10,0,5,3,0,1,0,0,8,0,0 +35,1,319831,5,10,1,7,1,0,0,0,0,60,0,0 +30,2,137606,1,9,1,6,1,0,0,5013,0,40,0,0 +49,2,268234,7,4,1,2,1,0,0,0,0,40,0,0 +33,2,100135,1,9,1,0,2,0,1,0,1740,25,0,0 +53,1,34973,5,10,1,7,1,0,0,0,0,45,0,0 +41,2,323790,1,9,2,2,4,0,0,0,0,55,0,0 +57,2,319733,0,13,1,8,1,0,0,0,0,40,12,1 +19,2,125591,5,10,0,4,3,0,1,0,0,40,0,0 +28,2,60772,0,13,0,1,3,0,1,0,0,45,0,0 +42,3,74680,3,14,2,0,0,0,0,0,2001,60,0,0 +29,1,141185,5,10,1,7,1,0,0,0,0,55,0,0 +26,2,273792,5,10,0,4,3,0,0,0,0,20,0,0 +40,2,343068,5,10,2,1,0,0,1,0,0,40,0,0 +36,1,177907,8,16,0,3,0,0,0,0,0,40,0,1 +28,2,144063,1,9,1,1,1,0,0,0,0,40,0,0 +25,1,257574,0,13,0,0,0,1,1,0,0,20,0,0 +42,1,67065,1,9,1,7,1,0,0,0,0,60,0,0 +32,2,183356,1,9,0,10,3,0,0,0,0,40,0,0 +32,2,152940,6,12,0,0,3,0,0,0,0,30,0,0 +37,2,227128,11,3,1,10,1,0,0,0,0,40,0,0 +39,4,45607,1,9,1,11,1,0,0,0,0,56,0,0 +49,2,155489,0,13,1,10,1,0,0,0,0,40,0,0 +19,2,165115,1,9,0,5,0,0,1,0,0,40,0,0 +31,2,49923,1,9,1,6,1,0,0,0,0,40,0,0 +40,2,272240,1,9,2,8,0,0,1,0,0,40,0,0 +29,2,255476,7,4,0,2,3,0,0,0,0,30,4,0 +59,2,194290,1,9,1,7,1,0,0,0,0,48,0,0 +52,2,145548,6,12,1,11,1,0,0,0,0,40,0,1 +27,2,175262,0,13,0,1,3,0,0,0,0,40,0,0 +45,4,37306,0,13,1,3,1,0,0,0,0,45,0,1 +58,2,137547,0,13,1,4,1,2,0,0,0,40,27,0 +53,2,276515,0,13,0,1,3,0,0,0,0,40,1,0 +23,2,174626,1,9,0,2,3,0,0,0,0,25,0,0 +35,2,215310,2,7,2,2,5,0,0,0,0,40,0,0 +49,2,332355,1,9,1,1,1,0,0,0,0,40,0,0 +49,2,204057,6,12,2,1,0,0,1,0,0,40,0,0 +25,2,391591,14,8,0,10,0,0,0,0,0,40,0,0 +47,2,169092,3,14,2,3,4,0,1,0,0,50,0,1 +28,2,230743,6,12,2,0,0,0,1,0,0,40,0,0 +20,2,190963,5,10,0,1,0,0,1,0,0,30,0,0 +19,2,169853,1,9,0,8,3,0,0,0,0,24,0,0 +28,2,212091,1,9,1,8,1,0,0,2580,0,40,0,0 +31,2,202822,5,10,2,0,4,1,1,0,0,40,0,0 +30,2,140011,9,11,1,2,1,0,0,0,0,53,0,0 +23,2,224424,0,13,0,4,3,0,0,0,0,40,0,0 +25,2,168943,0,13,1,1,2,0,1,0,0,30,0,1 +19,2,571853,1,9,0,4,3,0,0,0,0,30,0,0 +30,2,156464,3,14,0,3,0,0,0,0,0,45,0,1 +26,2,108542,1,9,0,10,3,0,0,0,0,35,0,0 +34,4,194325,1,9,1,6,1,0,0,0,0,45,0,0 +49,2,114797,0,13,2,1,4,1,1,0,0,40,0,0 +35,2,40135,5,10,1,2,1,0,0,0,2042,40,0,0 +38,2,204756,1,9,0,5,3,0,1,0,0,40,0,0 +36,2,228190,1,9,1,2,1,1,0,0,0,20,0,0 +33,2,163392,1,9,1,3,1,3,0,0,0,48,0,1 +54,2,138845,5,10,0,4,0,0,1,0,0,40,0,0 +19,4,169853,1,9,0,10,3,0,0,0,0,40,0,0 +60,2,224097,1,9,1,10,1,0,0,0,0,40,0,0 +28,1,160786,1,9,0,10,3,0,0,0,0,40,0,0 +43,1,190044,1,9,1,5,1,0,0,0,0,40,0,0 +49,4,145290,11,3,1,4,1,0,0,0,0,40,0,0 +25,2,120268,0,13,0,3,3,0,0,0,0,70,0,0 +17,2,327434,12,6,0,5,3,0,0,0,0,20,0,0 +41,5,218302,0,13,1,5,1,0,0,0,0,60,0,1 +30,2,1184622,5,10,1,6,1,1,0,0,0,35,0,0 +90,4,227796,3,14,1,1,1,0,0,20051,0,60,0,1 +25,2,206343,1,9,0,11,5,0,0,0,0,40,0,0 +27,2,36851,9,11,1,5,1,0,0,0,0,35,0,0 +29,2,148550,1,9,1,10,1,0,0,0,0,40,0,0 +31,3,142470,0,13,0,1,0,1,1,0,0,40,0,0 +43,2,86750,9,11,1,10,1,0,0,0,0,99,0,0 +63,2,361631,3,14,4,3,0,0,1,0,0,40,0,1 +46,2,163229,7,4,1,6,1,0,0,0,0,40,0,0 +59,2,179594,1,9,1,5,1,0,0,0,0,40,0,0 +42,2,254773,0,13,1,1,2,1,1,0,0,50,0,1 +26,2,58065,0,13,0,0,0,0,1,0,0,20,0,0 +26,2,205428,5,10,1,5,1,0,0,0,0,45,0,0 +61,2,173924,4,5,2,2,0,0,0,0,0,40,5,1 +23,0,142547,1,9,1,1,1,0,0,0,0,40,0,0 +24,2,119704,1,9,1,0,2,0,1,0,0,40,0,0 +35,2,275364,0,13,2,9,4,0,0,7430,0,40,9,1 +42,1,207392,1,9,1,5,1,0,0,0,0,12,0,0 +31,2,147215,14,8,2,4,4,0,1,0,0,21,0,0 +31,2,101562,1,9,1,8,2,0,1,0,0,55,0,0 +63,2,216413,0,13,6,0,0,0,1,0,0,25,0,0 +29,0,188986,9,11,0,9,0,0,1,0,1590,64,0,0 +43,0,52849,0,13,1,3,1,0,0,0,0,40,0,0 +22,2,304710,0,13,0,0,0,2,1,0,0,10,36,0 +17,2,265657,2,7,0,4,3,0,0,0,0,25,0,0 +23,1,258298,0,13,0,0,3,0,0,0,2231,40,0,1 +35,2,360814,4,5,2,10,0,0,0,0,0,45,0,0 +32,2,53260,1,9,2,4,4,4,1,0,0,28,0,0 +50,5,127315,0,13,1,1,1,0,0,15024,0,60,0,1 +26,4,197530,3,14,3,3,0,0,1,0,0,40,0,0 +32,2,340940,0,13,1,1,1,0,0,0,0,40,0,0 +29,2,88432,9,11,1,10,1,0,0,0,0,50,0,0 +57,2,183810,5,10,1,3,1,0,0,0,0,40,0,1 +90,2,51744,3,14,0,1,0,1,0,0,0,50,0,1 +35,2,175614,9,11,2,3,4,0,1,0,0,40,0,1 +31,1,235237,5,10,1,5,1,1,0,0,0,60,0,1 +60,2,227266,1,9,2,5,0,0,1,0,0,33,0,0 +21,2,146499,9,11,1,0,5,0,1,0,1579,40,0,0 +71,4,337064,3,14,6,3,0,0,1,0,0,40,0,0 +22,2,141003,9,11,0,4,3,0,0,0,0,30,0,0 +50,4,117791,1,9,2,0,0,0,1,0,0,40,0,0 +37,2,172846,5,10,1,5,1,0,0,0,0,45,0,1 +23,2,73514,1,9,0,0,3,2,1,0,0,40,36,0 +74,2,211075,1,9,1,4,1,0,0,0,0,30,0,0 +67,2,197816,5,10,1,5,1,0,0,0,1844,70,0,0 +59,2,43221,5,10,1,10,1,0,0,0,0,43,0,1 +28,2,183780,1,9,1,6,1,0,0,0,1740,40,0,0 +45,2,26781,1,9,1,7,1,3,0,0,0,40,0,0 +63,1,271550,5,10,1,7,1,0,0,0,0,20,0,0 +39,2,250157,0,13,0,3,0,0,1,0,0,63,0,0 +33,0,913447,5,10,2,4,4,1,1,0,0,40,0,0 +32,2,153078,0,13,0,4,0,2,0,0,0,40,27,0 +34,2,181091,0,13,1,1,1,0,0,0,1977,45,0,1 +39,2,231491,1,9,0,2,5,0,0,0,0,40,0,0 +29,0,95423,3,14,1,0,1,0,0,0,0,36,0,0 +22,2,234663,1,9,1,8,1,0,0,0,0,40,0,0 +53,2,283602,0,13,2,5,0,0,1,13550,0,43,0,1 +46,2,328669,9,11,1,10,1,0,0,0,0,42,0,0 +51,2,143741,5,10,1,4,2,0,1,0,0,40,0,1 +44,2,83508,10,15,2,3,0,0,1,2354,0,99,0,0 +56,0,81954,1,9,2,0,0,0,1,0,0,40,0,0 +27,2,261375,0,13,0,0,3,1,1,0,0,40,0,0 +52,2,310045,4,5,3,8,0,2,1,0,0,30,26,0 +39,2,316211,0,13,0,3,0,0,0,0,0,40,0,1 +45,3,88564,5,10,1,1,1,0,0,7688,0,40,0,1 +37,2,61299,5,10,1,10,1,0,0,0,0,45,0,0 +33,2,113364,1,9,2,0,3,0,0,0,0,40,0,0 +46,2,267107,11,3,1,10,2,0,1,0,0,45,25,0 +35,2,48123,14,8,1,10,2,0,1,0,0,50,0,0 +33,2,214635,1,9,1,1,1,1,0,0,0,50,0,0 +48,2,115585,0,13,1,5,1,0,0,0,0,40,0,0 +32,2,194141,1,9,2,8,3,0,0,0,0,50,0,0 +20,2,89991,5,10,0,4,3,0,1,0,0,32,0,0 +35,2,101709,1,9,0,6,3,2,0,0,0,60,0,0 +19,2,237455,1,9,0,2,3,0,1,0,0,25,0,0 +56,2,28729,2,7,4,8,0,0,1,0,0,40,0,0 +28,2,153475,0,13,0,0,3,0,1,0,0,16,22,0 +45,2,275517,1,9,2,10,4,0,1,0,0,40,0,0 +32,2,128002,9,11,1,0,2,0,1,0,0,45,0,0 +44,2,175485,0,13,1,10,1,0,0,0,0,12,0,0 +55,2,189664,1,9,1,3,1,0,0,0,0,40,0,1 +34,2,209808,5,10,1,0,1,0,0,0,0,40,0,1 +33,2,176992,3,14,1,3,1,0,0,0,0,40,0,1 +36,2,154669,0,13,0,1,3,0,0,0,0,55,0,0 +25,2,191271,1,9,0,0,3,0,1,0,0,40,0,0 +28,2,375482,0,13,0,5,0,0,0,0,0,40,0,0 +39,2,102953,0,13,1,5,1,0,0,7298,0,55,0,1 +53,2,169182,12,6,3,8,0,0,1,0,0,40,13,0 +47,2,184005,1,9,2,1,0,3,1,3325,0,45,0,0 +49,5,30751,9,11,2,1,0,0,0,0,0,60,0,0 +22,2,145477,1,9,0,2,3,3,0,0,0,40,0,0 +31,2,91964,5,10,0,0,5,0,0,0,0,40,0,0 +44,5,49249,5,10,2,4,4,0,0,0,0,80,0,0 +19,2,218956,1,9,0,3,3,0,0,0,0,40,0,0 +37,1,241306,1,9,2,10,0,0,0,0,0,40,0,0 +23,2,319842,5,10,0,2,3,0,0,0,0,25,0,0 +44,2,332401,10,15,1,3,1,0,0,99999,0,65,0,1 +54,4,182388,1,9,1,4,2,0,1,0,0,35,0,0 +23,2,205939,1,9,1,10,1,0,0,0,0,38,0,0 +21,2,203914,5,10,0,4,3,0,1,0,0,10,0,0 +19,0,156294,5,10,0,3,3,0,0,0,0,25,0,0 +51,2,254211,0,13,1,10,1,0,0,0,0,20,0,1 +41,2,151504,0,13,1,1,1,0,0,7688,0,50,0,1 +61,2,85548,5,10,1,9,1,0,0,15024,0,18,0,1 +19,1,30800,12,6,3,0,4,3,1,0,0,40,0,0 +22,2,131230,0,13,0,5,3,0,0,0,0,40,0,0 +22,2,61850,1,9,0,4,0,0,1,0,0,40,0,0 +49,2,227800,7,4,1,3,1,0,0,0,0,32,0,0 +35,2,133454,12,6,2,8,0,0,0,0,0,50,0,0 +38,2,104094,5,10,1,5,1,0,0,0,0,40,0,0 +29,2,105422,1,9,1,3,1,0,0,0,0,40,0,1 +56,2,142182,9,11,1,10,1,0,0,0,0,45,0,1 +41,2,336643,5,10,2,1,0,0,1,0,0,80,0,0 +62,5,200577,3,14,1,5,1,0,0,0,0,45,0,1 +27,2,208703,1,9,0,11,3,0,0,0,0,40,28,0 +25,2,272428,1,9,0,5,0,0,0,4416,0,42,0,0 +33,2,56701,0,13,1,3,1,0,0,15024,0,75,0,1 +26,2,288592,1,9,0,0,0,0,1,0,0,40,0,0 +43,2,266439,1,9,2,8,0,0,0,0,0,45,0,0 +53,3,276868,3,14,1,0,1,0,0,0,0,40,0,1 +43,2,131435,0,13,2,4,0,0,1,0,0,40,0,0 +56,2,175127,1,9,2,10,4,0,0,0,0,35,0,0 +25,2,277444,0,13,1,5,1,0,0,0,0,50,0,0 +60,2,63296,3,14,2,3,5,1,0,0,0,40,0,0 +28,2,96337,5,10,0,0,0,0,1,0,0,40,0,0 +21,2,221955,1,9,0,8,4,0,0,0,0,40,4,0 +40,2,197923,0,13,0,0,4,1,1,2977,0,40,0,0 +29,2,632593,1,9,1,10,1,1,0,0,0,40,0,0 +20,2,205970,5,10,0,10,3,0,1,0,0,25,0,0 +25,2,139730,1,9,1,10,1,0,0,0,0,80,0,1 +18,2,201901,2,7,0,5,3,0,1,0,0,10,0,0 +32,0,230224,6,12,1,4,1,0,0,0,0,35,0,0 +27,2,113464,15,2,0,4,3,4,0,0,0,35,21,0 +48,2,94461,1,9,6,8,0,0,1,0,0,16,0,0 +20,2,271379,5,10,0,5,3,0,1,0,0,25,0,0 +55,2,231738,1,9,2,5,0,0,1,0,0,40,7,0 +33,4,198183,0,13,0,3,0,0,1,0,0,50,0,1 +21,0,140764,5,10,0,0,3,0,1,0,0,12,0,0 +43,1,183479,1,9,1,10,1,0,0,0,0,30,0,0 +35,2,165767,5,10,1,8,1,0,0,0,0,40,0,0 +39,4,139364,0,13,1,3,1,0,0,0,0,35,0,1 +19,2,227491,1,9,0,5,0,2,1,0,0,40,0,0 +25,2,222254,1,9,0,4,0,1,1,0,0,40,0,0 +44,2,193494,5,10,1,6,1,0,0,0,0,72,0,1 +27,2,29261,6,12,0,10,4,0,0,0,0,40,0,0 +39,2,174368,1,9,1,0,2,0,1,0,0,40,0,1 +69,2,108196,12,6,0,10,5,0,0,0,0,40,0,0 +34,2,110622,0,13,0,1,0,2,1,0,0,40,11,0 +37,2,130277,11,3,4,4,4,0,1,0,0,40,0,0 +43,4,98130,0,13,2,3,3,0,1,0,0,39,0,0 +34,0,595000,3,14,1,3,2,1,1,0,0,40,0,1 +31,1,349148,5,10,1,8,1,0,0,0,0,48,0,0 +42,0,117583,8,16,2,3,0,0,1,8614,0,60,0,1 +26,2,164583,1,9,2,5,4,0,1,0,0,30,0,0 +39,2,340091,5,10,4,4,4,0,1,0,0,75,0,0 +25,2,49092,0,13,0,4,3,0,0,0,0,40,0,0 +54,4,186884,5,10,1,6,1,1,0,0,0,30,0,0 +44,0,167265,3,14,1,3,1,0,0,0,0,60,0,1 +34,0,34104,3,14,1,3,1,0,0,7688,0,38,0,1 +21,5,265116,5,10,0,1,0,0,0,0,0,40,0,0 +33,2,158416,1,9,0,8,0,0,0,0,0,40,0,0 +40,5,169878,6,12,1,1,2,0,1,0,0,40,0,1 +44,2,296728,3,14,1,1,1,0,0,0,0,40,0,1 +33,4,342458,6,12,2,11,0,0,0,0,0,56,0,0 +21,4,38771,5,10,0,0,3,0,0,0,0,40,0,0 +35,1,269300,0,13,0,4,0,1,1,0,0,60,0,0 +43,2,111483,5,10,1,5,1,0,0,7298,0,40,0,1 +51,4,33863,3,14,1,3,1,0,0,0,0,45,0,0 +29,2,132874,1,9,1,10,1,0,0,0,0,40,0,0 +51,4,277024,1,9,4,11,0,1,0,0,0,40,0,0 +35,2,112160,1,9,1,5,1,0,0,0,0,40,0,0 +18,2,703067,2,7,0,5,3,0,0,0,0,20,0,0 +58,2,127264,12,6,1,10,1,0,0,0,0,50,0,0 +57,5,257200,5,10,1,1,1,0,0,0,0,40,0,1 +19,2,57206,1,9,0,5,3,0,1,0,0,20,0,0 +37,2,201319,5,10,4,4,4,0,1,0,0,40,0,0 +38,2,114079,1,9,1,5,1,0,0,0,0,44,0,0 +45,2,230979,5,10,3,0,0,0,1,0,0,40,0,0 +27,2,292472,5,10,1,3,1,2,0,0,0,40,14,1 +38,4,134444,5,10,1,11,1,0,0,0,0,72,0,0 +30,2,172403,1,9,2,10,0,0,0,0,0,30,0,0 +46,2,191357,0,13,1,9,1,0,0,0,0,40,0,0 +60,2,389254,1,9,1,5,1,0,0,0,0,40,0,1 +30,2,303867,1,9,4,6,0,0,0,0,0,44,0,0 +47,2,164113,5,10,1,10,1,1,0,7688,0,40,0,1 +39,2,111499,0,13,0,1,0,0,1,0,0,40,0,0 +42,2,266084,5,10,1,10,1,0,0,7298,0,45,0,1 +27,2,61580,5,10,2,0,5,0,1,0,0,40,0,0 +44,2,231348,5,10,2,5,0,0,0,0,0,40,0,0 +33,2,164748,0,13,1,6,1,0,0,0,0,40,0,0 +54,2,205337,0,13,0,1,0,0,0,0,0,50,0,1 +58,1,54566,5,10,1,7,1,0,0,0,0,35,0,0 +45,2,34419,0,13,0,6,0,0,0,0,0,30,0,0 +59,2,116442,5,10,1,8,1,0,0,0,0,50,0,0 +29,2,290740,6,12,0,13,0,0,1,0,0,50,0,0 +27,2,255582,1,9,0,8,0,0,1,0,0,40,0,0 +44,2,112517,3,14,1,9,1,0,0,0,0,20,0,1 +44,2,169397,1,9,1,10,1,0,0,0,0,40,0,1 +33,2,172664,5,10,1,1,1,0,0,0,0,70,0,1 +27,2,329005,1,9,0,10,3,0,0,0,0,40,0,0 +33,2,123253,0,13,1,1,1,0,0,0,0,55,0,1 +55,2,81865,9,11,2,0,4,1,1,0,0,40,0,0 +32,1,173314,9,11,1,3,1,4,0,0,0,60,0,0 +31,2,34572,9,11,1,2,1,0,0,0,0,45,0,0 +57,5,159028,10,15,1,3,1,0,0,99999,0,60,0,1 +30,2,149184,0,13,1,1,1,0,0,0,0,45,0,1 +28,2,308709,0,13,0,5,0,0,1,0,0,48,0,0 +30,1,257295,5,10,0,5,5,2,0,0,2258,40,27,0 +29,2,168479,3,14,1,3,1,0,0,0,0,40,0,1 +66,2,142501,1,9,0,4,5,1,1,0,0,3,0,0 +60,2,338345,1,9,1,10,1,0,0,0,0,45,0,1 +31,2,177675,0,13,1,3,1,0,0,0,0,40,0,0 +26,2,262617,1,9,0,10,5,0,0,2597,0,40,0,0 +24,2,200997,1,9,0,2,3,0,0,0,0,45,0,0 +29,2,176683,0,13,0,5,0,0,0,0,0,50,0,1 +44,2,376072,1,9,1,9,1,0,0,0,0,45,0,1 +34,4,177675,0,13,1,1,1,0,0,0,0,55,0,1 +59,2,348430,0,13,1,3,1,0,0,0,1902,43,0,1 +23,2,320451,0,13,0,1,3,2,0,0,0,24,0,0 +23,2,38151,2,7,0,4,5,0,0,0,0,40,11,0 +55,4,123382,9,11,4,3,4,1,1,0,0,35,0,0 +39,5,151029,1,9,1,1,1,0,0,0,0,40,0,1 +39,2,484475,2,7,0,10,0,1,0,0,0,40,0,0 +57,2,329792,7,4,2,6,4,0,0,0,0,75,0,0 +35,2,148903,1,9,2,5,4,0,1,0,0,40,0,0 +39,4,301614,9,11,1,11,1,0,0,0,0,48,0,1 +47,2,176319,1,9,1,5,3,0,1,0,0,38,0,1 +53,0,53197,8,16,1,0,1,0,0,0,0,50,0,1 +23,2,291407,5,10,0,5,3,1,0,0,0,25,0,0 +35,2,204527,3,14,0,10,0,0,0,0,0,50,0,1 +44,2,476391,5,10,2,7,0,0,1,0,0,40,0,0 +28,2,224964,1,9,0,4,3,0,1,0,0,25,0,0 +26,2,306225,0,13,0,1,0,2,1,0,0,40,12,0 +23,2,292023,1,9,0,1,0,0,0,0,0,45,0,0 +32,2,94041,1,9,1,4,1,0,0,0,0,25,38,0 +49,5,187563,5,10,1,6,1,0,0,0,0,50,0,1 +36,2,176101,5,10,0,10,3,0,0,2174,0,60,0,0 +36,2,749105,1,9,2,4,4,0,1,0,0,36,0,0 +21,2,216070,6,12,1,0,2,3,1,0,0,46,0,1 +54,1,105010,0,13,1,1,1,0,0,0,0,40,0,1 +43,2,198203,5,10,3,4,0,1,1,0,0,40,0,0 +35,4,215419,5,10,2,0,4,0,1,0,0,40,0,0 +31,2,120460,5,10,1,7,1,0,0,0,0,50,0,1 +46,2,199316,5,10,1,10,5,2,0,0,0,40,3,0 +46,2,146919,1,9,4,5,0,0,1,0,0,40,0,0 +56,2,174744,1,9,1,4,1,0,0,0,0,40,0,0 +21,2,249957,1,9,0,0,3,0,0,0,0,40,0,0 +51,2,146574,3,14,1,1,1,0,0,0,0,50,0,1 +47,0,156417,5,10,2,3,4,0,0,0,0,20,0,0 +42,2,236110,11,3,3,10,0,0,0,0,0,40,5,0 +19,2,63363,5,10,0,5,3,0,1,0,0,30,0,0 +25,2,190107,0,13,0,10,3,0,0,0,0,40,0,0 +37,2,126569,3,14,1,9,1,0,0,0,0,60,0,1 +35,2,176756,14,8,1,4,1,1,0,0,0,40,0,0 +40,2,115161,1,9,1,6,1,0,0,0,0,30,0,0 +57,1,138892,2,7,1,5,1,0,0,0,0,15,0,0 +38,2,256864,1,9,1,9,1,0,0,0,0,50,0,1 +48,2,265083,12,6,2,5,0,0,1,0,0,38,0,0 +34,2,249948,5,10,2,4,0,0,1,0,0,34,0,0 +46,3,31141,5,10,2,6,0,0,0,0,0,40,0,0 +45,0,67544,3,14,2,11,0,0,0,0,0,50,0,0 +32,1,174789,0,13,1,3,1,0,0,0,0,50,0,1 +35,2,199753,1,9,0,8,3,0,0,0,0,48,0,0 +62,2,122246,5,10,0,10,0,0,1,8614,0,39,0,1 +50,2,96586,9,11,1,4,1,0,0,0,0,40,0,0 +25,2,189590,0,13,0,9,0,0,0,0,0,40,0,0 +41,2,140590,5,10,0,5,0,1,0,0,0,33,0,0 +35,2,255702,1,9,0,4,3,0,1,0,0,27,0,0 +33,2,260782,5,10,1,10,1,0,0,0,0,41,0,1 +38,2,169926,6,12,1,1,2,0,1,0,1902,40,0,1 +37,0,151322,0,13,0,3,0,0,0,0,0,40,0,0 +56,2,192869,1,9,1,8,1,0,0,0,0,40,0,1 +19,2,93604,7,4,0,10,3,0,0,0,1602,32,0,0 +31,2,86958,4,5,1,1,2,0,1,0,0,40,0,0 +33,2,192644,1,9,4,2,4,0,0,0,0,35,5,0 +72,2,284080,15,2,2,4,0,1,0,0,0,40,0,0 +54,2,43269,1,9,1,6,1,0,0,0,0,50,0,1 +30,2,190040,0,13,0,8,0,0,1,0,0,40,0,0 +51,2,306108,8,16,0,3,0,0,0,0,0,40,0,1 +30,2,220148,1,9,1,10,1,0,0,0,1848,50,0,1 +30,2,381645,0,13,0,3,0,0,0,0,0,50,0,0 +32,2,216361,5,10,1,11,1,1,0,0,0,16,0,0 +30,2,213722,5,10,0,5,0,0,0,0,0,50,0,1 +35,2,112271,3,14,1,0,1,0,0,0,0,40,0,0 +40,2,208277,5,10,2,0,3,0,1,0,0,44,0,1 +38,0,352628,0,13,2,3,0,0,1,0,0,40,0,0 +19,2,129620,12,6,0,4,5,0,1,0,0,30,0,0 +32,2,249550,5,10,0,3,0,0,0,0,0,44,0,0 +49,2,178749,3,14,3,0,4,0,1,0,0,40,0,0 +60,2,167670,0,13,1,3,1,0,0,0,0,35,0,0 +60,2,81578,4,5,1,5,1,0,0,0,0,40,0,0 +55,2,160662,8,16,1,1,1,0,0,0,0,80,0,1 +24,2,152189,1,9,0,10,3,0,0,0,0,40,0,0 +53,2,106176,3,14,1,5,1,0,0,7298,0,60,0,1 +69,0,159191,5,10,6,0,0,0,1,0,810,38,0,0 +41,2,78410,1,9,1,0,2,0,1,0,0,40,0,1 +32,2,131379,1,9,0,4,3,0,1,0,0,40,0,0 +45,2,166929,2,7,1,10,1,0,0,0,0,40,0,0 +59,2,380357,0,13,2,1,0,0,0,0,0,40,0,0 +31,2,79190,1,9,0,4,3,0,1,0,0,35,0,0 +40,2,342164,1,9,4,0,4,0,1,0,0,37,0,0 +44,2,182616,9,11,1,9,1,0,0,0,0,40,0,1 +63,2,339473,5,10,2,5,0,0,1,0,0,60,0,0 +31,4,381153,5,10,1,11,1,0,0,15024,0,56,0,1 +51,2,300816,0,13,0,0,4,0,0,0,0,20,0,0 +51,2,240988,2,7,1,8,1,2,0,0,0,40,11,0 +23,2,149224,1,9,0,5,0,0,0,0,0,40,0,0 +49,2,168216,7,4,1,8,1,0,0,0,0,48,0,0 +56,2,286487,1,9,1,10,1,0,0,2885,0,45,0,0 +39,2,305597,1,9,1,10,1,0,0,0,0,40,0,1 +39,1,109766,10,15,1,3,1,0,0,15024,0,50,0,1 +30,1,188798,1,9,2,4,4,0,1,0,0,40,0,0 +43,1,240170,0,13,1,1,1,0,0,0,0,50,9,0 +31,2,459465,5,10,0,10,0,0,0,0,0,50,0,0 +44,4,162506,3,14,1,3,1,0,0,0,0,35,0,0 +43,1,145441,10,15,1,3,1,0,0,0,0,30,0,1 +41,2,27444,5,10,1,0,1,0,0,0,0,46,0,1 +43,2,195258,1,9,1,0,1,0,0,0,0,40,0,1 +47,0,55272,5,10,1,10,1,0,0,0,0,40,0,1 +38,1,164526,10,15,0,3,0,0,0,0,2824,45,0,1 +46,2,27802,9,11,1,8,1,0,0,0,0,40,0,0 +19,0,165289,5,10,0,4,3,0,1,0,0,40,0,0 +19,2,274657,11,3,0,4,0,0,0,0,0,50,24,0 +24,2,317175,0,13,1,5,1,0,0,0,0,45,0,1 +39,5,163237,5,10,1,7,1,0,0,0,0,65,0,0 +37,2,170408,9,11,2,8,0,0,1,0,0,30,0,0 +40,2,76625,1,9,2,10,4,0,0,0,0,40,0,0 +27,2,366066,6,12,0,5,3,0,1,0,0,40,0,0 +22,2,349368,1,9,0,0,5,0,1,0,0,40,0,0 +21,2,286824,5,10,0,2,3,0,0,0,0,12,0,0 +32,2,373263,1,9,1,1,2,0,1,0,0,40,0,0 +20,2,161978,1,9,4,8,3,0,0,0,0,40,0,0 +45,2,543922,3,14,2,6,0,0,0,14344,0,48,0,1 +46,4,109089,10,15,1,11,1,0,0,0,0,40,0,1 +46,2,110151,9,11,2,1,4,0,1,0,0,45,0,0 +26,2,34110,5,10,0,11,0,0,0,0,0,44,0,0 +47,1,118506,0,13,1,1,3,0,0,0,0,60,0,0 +22,2,117789,5,10,0,3,3,0,1,0,0,10,0,0 +34,1,353881,1,9,1,1,1,0,0,0,0,60,0,0 +49,2,200471,15,2,1,10,1,0,0,0,0,40,20,0 +20,2,258517,5,10,0,2,3,0,0,0,0,25,0,0 +28,2,190367,1,9,1,8,1,0,0,0,0,45,0,0 +30,2,174704,2,7,1,8,1,1,0,0,0,40,0,0 +23,2,179413,1,9,1,10,1,0,0,0,0,40,0,0 +20,2,329530,4,5,0,13,3,0,0,0,0,40,4,0 +31,2,273818,5,10,1,4,1,0,0,0,0,55,4,0 +46,2,256522,15,2,0,8,3,0,0,0,0,40,5,0 +42,2,196001,1,9,4,0,4,0,1,0,0,40,0,0 +60,1,282660,7,4,1,10,1,0,0,0,0,40,0,0 +30,2,72630,0,13,0,3,0,0,0,0,0,50,0,0 +27,2,50295,5,10,1,6,1,0,0,0,0,48,0,0 +20,2,203240,4,5,0,5,3,0,1,0,0,32,0,0 +56,1,172618,0,13,1,3,1,0,0,7688,0,40,0,1 +41,2,202168,5,10,1,1,1,0,0,0,0,60,0,1 +61,2,176839,1,9,1,8,1,0,0,0,0,40,0,0 +47,2,176140,1,9,2,1,4,1,1,0,0,40,0,1 +60,2,39952,4,5,1,8,1,0,0,2228,0,37,0,0 +33,2,292465,4,5,1,8,1,0,0,0,0,50,0,0 +48,2,355320,0,13,1,3,1,0,0,0,0,45,8,1 +56,2,182460,1,9,1,2,1,0,0,0,0,40,0,1 +50,2,69345,9,11,1,6,1,0,0,3103,0,55,0,1 +57,1,102058,3,14,1,3,1,0,0,0,0,40,0,1 +20,2,165804,5,10,0,0,3,4,1,0,0,40,0,0 +46,2,318259,9,11,2,9,5,0,1,0,0,36,0,0 +21,2,117606,5,10,0,3,0,0,1,0,0,40,0,0 +37,2,170718,1,9,1,1,1,0,0,0,0,40,0,0 +42,2,413297,5,10,1,9,1,0,0,0,0,40,0,0 +20,2,190457,1,9,0,4,3,0,1,0,0,30,0,0 +54,2,88278,8,16,1,3,1,0,0,0,1977,50,0,1 +32,4,217296,1,9,1,6,2,0,1,4064,0,22,0,0 +50,2,123429,5,10,1,10,1,0,0,0,0,40,0,1 +49,3,420282,5,10,0,0,4,1,1,0,0,40,0,0 +48,2,498325,6,12,1,6,1,0,0,0,0,50,0,0 +24,2,248533,5,10,0,5,5,1,1,0,0,40,0,0 +46,2,137354,3,14,1,9,1,2,0,0,0,40,11,1 +42,2,272910,1,9,2,4,0,0,1,0,0,40,0,0 +52,5,206054,5,10,1,10,1,0,0,0,0,40,0,0 +58,4,92141,6,12,6,0,0,1,1,0,0,40,0,0 +37,2,163199,5,10,2,9,0,3,1,0,0,40,0,0 +34,2,195860,1,9,1,10,1,0,0,0,0,40,0,0 +26,2,115717,5,10,1,0,1,0,0,0,2051,40,0,0 +18,2,120029,5,10,0,0,5,0,1,0,0,20,0,0 +33,2,221762,5,10,0,3,0,1,0,0,0,40,0,0 +41,2,342164,5,10,2,5,0,0,1,0,0,15,0,0 +21,2,176356,6,12,0,0,3,0,1,0,0,20,0,0 +23,2,133239,9,11,0,9,0,0,1,0,0,40,0,0 +26,3,169101,5,10,0,9,3,0,1,0,0,40,0,0 +33,2,159442,0,13,1,4,2,0,1,0,0,40,0,0 +24,2,174461,5,10,0,1,3,0,1,0,0,45,0,0 +43,2,361280,12,6,1,10,1,2,0,0,0,42,26,0 +52,0,447579,1,9,2,0,0,0,1,0,0,40,7,0 +61,2,248448,7,4,2,4,4,0,1,0,0,40,0,0 +35,2,161141,1,9,1,8,1,0,0,0,0,40,0,0 +35,2,212465,1,9,1,10,1,0,0,0,0,40,0,1 +45,5,170871,1,9,1,1,1,0,0,15024,0,55,0,1 +43,4,233865,1,9,1,1,1,0,0,0,0,40,0,1 +51,2,163052,1,9,1,11,1,0,0,0,0,40,0,1 +35,2,348690,0,13,1,6,1,0,0,0,0,40,0,0 +47,3,34845,0,13,1,0,1,0,0,0,0,45,9,1 +22,2,206861,5,10,0,0,3,0,0,0,0,40,0,0 +49,5,349230,9,11,1,1,1,0,0,0,0,60,0,1 +20,2,130840,1,9,0,10,3,0,0,0,0,20,0,0 +19,2,415354,12,6,2,4,0,0,1,0,0,40,0,0 +27,2,132191,1,9,0,10,0,0,0,0,0,40,0,0 +42,2,202466,6,12,2,3,4,0,1,0,0,45,0,0 +23,1,236804,5,10,0,7,3,0,0,0,0,35,0,0 +20,2,107658,5,10,0,9,0,0,1,0,0,10,0,0 +47,2,102771,1,9,1,6,1,0,0,0,0,50,0,0 +17,2,221403,14,8,0,4,3,1,0,0,0,18,0,0 +39,2,52645,5,10,2,5,4,0,1,0,0,40,0,0 +25,2,276310,4,5,1,8,1,0,0,0,0,40,4,0 +31,2,134613,9,11,1,1,2,1,1,0,0,43,0,0 +44,2,215479,1,9,2,6,0,1,0,0,0,20,19,0 +53,2,266529,9,11,1,1,1,0,0,0,0,40,0,1 +34,2,265807,5,10,4,10,0,0,0,0,0,45,0,0 +45,1,67716,5,10,1,1,1,0,0,0,0,60,0,0 +34,2,178951,1,9,1,5,1,0,0,0,0,45,0,0 +35,2,241126,3,14,1,5,1,0,0,0,0,40,0,1 +36,2,176544,5,10,0,4,0,0,0,0,0,48,0,0 +45,2,169180,5,10,6,4,4,0,1,0,0,45,0,0 +37,1,282461,5,10,1,1,1,0,0,0,0,60,0,0 +53,2,157069,6,12,1,8,1,0,0,0,0,40,0,1 +35,2,99357,3,14,1,3,2,0,1,15024,0,50,0,1 +65,5,338316,5,10,1,5,1,0,0,0,0,40,0,0 +49,1,59612,12,6,2,7,4,0,0,0,0,70,0,0 +24,2,220426,1,9,0,2,0,0,0,0,0,40,0,0 +54,2,115912,5,10,1,10,1,0,0,0,0,40,0,0 +17,2,27032,12,6,0,5,3,0,1,0,0,12,0,0 +19,2,170720,14,8,0,4,3,0,0,0,0,16,0,0 +60,2,183162,1,9,6,8,0,0,1,0,0,40,0,0 +46,2,192360,0,13,1,1,1,0,0,0,0,35,0,1 +26,2,128553,5,10,0,1,3,1,1,0,0,40,0,0 +58,2,209423,15,2,1,4,1,0,0,0,0,38,1,0 +37,1,121510,1,9,2,1,4,0,0,0,0,55,0,0 +41,2,93793,3,14,1,3,1,0,0,0,0,38,0,1 +30,2,133602,0,13,2,1,0,0,0,0,0,40,0,0 +19,2,391329,5,10,0,0,0,0,1,0,0,30,0,0 +48,2,96359,0,13,1,1,1,0,0,0,0,60,34,1 +22,2,203894,5,10,0,6,0,0,1,0,0,24,0,0 +25,2,195994,15,2,0,13,0,0,1,0,0,40,24,0 +18,2,50879,12,6,0,4,3,0,0,0,0,6,0,0 +21,2,186849,1,9,0,2,3,0,0,0,0,40,0,0 +47,2,201127,5,10,1,6,1,0,0,0,0,50,0,0 +33,2,110998,1,9,0,4,5,3,1,0,0,36,0,0 +39,2,190466,1,9,2,10,3,0,0,2174,0,40,0,0 +67,1,173935,0,13,1,1,1,0,0,0,0,8,0,1 +19,2,167140,5,10,0,4,3,0,0,0,1602,24,0,0 +18,2,110230,12,6,0,4,3,0,0,0,0,11,0,0 +36,2,287658,1,9,0,0,3,1,0,0,0,40,0,0 +23,2,224954,5,10,0,8,3,0,0,0,0,25,0,0 +73,1,29306,1,9,1,7,1,0,0,0,0,40,0,0 +35,2,37314,5,10,1,10,1,0,0,5013,0,40,0,0 +31,2,420749,6,12,1,10,1,0,0,0,0,40,0,1 +20,2,482732,12,6,0,8,0,0,0,0,0,40,0,0 +20,2,206215,1,9,0,0,3,0,1,0,0,40,0,0 +27,2,101364,1,9,1,2,1,0,0,0,0,40,4,0 +66,5,185369,12,6,1,5,1,0,0,0,0,30,0,0 +66,2,216856,3,14,1,5,1,0,0,0,0,50,0,0 +64,2,256019,3,14,0,3,0,0,1,0,0,35,0,0 +48,2,348144,5,10,2,6,0,0,0,3325,0,53,0,0 +24,2,190293,0,13,0,3,0,0,1,0,0,40,0,0 +51,1,25932,1,9,1,7,1,0,0,0,0,60,0,0 +25,2,176729,0,13,1,10,1,0,0,0,0,60,0,1 +33,2,166961,2,7,4,5,3,0,1,0,0,20,0,0 +50,2,86373,1,9,1,8,1,0,0,0,0,50,0,0 +51,2,320513,7,4,3,10,0,1,0,0,0,50,21,0 +34,0,190290,0,13,1,3,1,0,0,0,0,38,0,1 +41,4,111891,7,4,0,4,4,1,1,0,0,40,0,0 +30,1,45796,5,10,1,8,1,0,0,0,0,40,0,0 +59,2,108496,5,10,2,10,0,0,0,2907,0,40,0,0 +41,1,120539,5,10,1,8,1,0,0,3103,0,40,0,1 +36,1,164526,3,14,0,5,0,0,0,10520,0,45,0,1 +37,2,323155,15,2,1,7,1,0,0,0,0,85,4,0 +28,2,65389,1,9,0,4,0,3,0,0,0,30,0,0 +19,2,414871,1,9,0,10,3,0,0,0,0,40,0,0 +28,2,161607,5,10,1,6,1,0,0,0,0,45,0,0 +62,2,224953,12,6,1,8,1,1,0,0,0,40,0,0 +36,2,261382,3,14,1,5,1,0,0,15024,0,45,0,1 +58,1,231818,12,6,0,10,0,0,0,0,0,40,34,0 +42,5,184018,1,9,2,5,4,0,0,1151,0,50,0,0 +43,5,133060,1,9,1,10,1,0,0,0,0,40,0,0 +29,2,35032,1,9,1,10,1,0,0,0,0,40,0,0 +32,0,304212,1,9,0,1,0,0,0,0,0,50,0,0 +64,4,50442,4,5,0,0,5,0,0,0,0,40,0,0 +39,2,146091,0,13,1,3,2,0,1,0,0,20,0,1 +26,2,267431,0,13,0,5,3,1,1,0,0,20,0,0 +19,2,121240,1,9,0,4,0,0,0,0,0,30,0,0 +21,2,192572,1,9,0,0,3,0,1,0,0,45,0,0 +32,2,211028,5,10,0,0,0,0,1,0,0,40,0,0 +30,4,346122,6,12,1,11,1,0,0,5013,0,45,0,0 +26,2,202203,0,13,0,0,5,0,1,0,0,50,0,0 +20,2,159297,5,10,0,0,3,2,1,0,0,15,0,0 +19,2,310158,5,10,0,6,3,0,0,0,0,30,0,0 +33,3,193246,0,13,1,0,1,0,0,0,0,42,0,1 +23,2,200089,5,10,1,10,5,0,0,0,0,40,22,0 +29,2,38353,1,9,1,10,1,0,0,0,0,45,0,0 +42,2,76280,1,9,1,1,2,0,1,0,0,40,0,0 +30,1,243665,1,9,1,5,1,0,0,0,0,50,0,0 +63,2,68872,1,9,1,6,2,2,1,0,0,20,0,0 +34,2,103596,1,9,1,2,1,0,0,0,0,40,0,0 +60,1,88055,5,10,1,10,1,0,0,0,0,24,0,0 +48,2,186203,1,9,1,4,1,0,0,0,0,50,0,0 +25,2,257910,0,13,0,1,0,0,0,0,0,50,0,0 +27,2,200227,9,11,1,0,2,1,1,0,0,40,0,0 +55,1,124975,1,9,2,10,4,0,0,27828,0,55,0,1 +32,2,227669,5,10,0,8,3,1,1,0,0,40,0,0 +22,2,117210,5,10,0,0,3,0,0,0,0,25,34,0 +25,2,76144,1,9,0,1,0,0,0,0,0,50,0,0 +18,2,98667,2,7,0,4,3,0,1,0,0,16,0,0 +24,4,155818,5,10,1,0,2,0,1,0,0,44,0,0 +29,2,283760,0,13,0,1,0,0,1,0,0,40,0,0 +39,2,186183,1,9,1,10,1,0,0,0,0,40,0,1 +33,5,202153,3,14,1,10,1,0,0,0,0,40,0,0 +57,2,365683,1,9,2,8,0,0,1,0,0,40,0,1 +22,2,187538,12,6,4,4,4,0,1,0,0,40,0,0 +33,2,126950,1,9,1,6,1,0,0,0,0,60,0,0 +42,2,110028,1,9,1,10,1,0,0,0,0,40,0,0 +43,2,104660,0,13,4,3,4,0,0,0,0,45,0,0 +57,1,437281,5,10,1,9,1,0,0,0,0,38,0,1 +42,2,259643,3,14,2,3,0,0,0,4650,0,40,0,0 +22,2,217961,5,10,0,6,3,0,0,0,1719,30,0,0 +42,1,120539,0,13,1,5,1,0,0,0,0,50,0,1 +39,2,25803,5,10,1,5,1,0,0,0,0,55,0,0 +41,2,63596,5,10,1,3,2,0,1,0,0,32,0,1 +20,4,325493,1,9,0,2,3,1,0,0,0,40,0,0 +47,2,211239,5,10,1,10,1,0,0,0,0,40,0,0 +44,2,206686,5,10,2,0,4,0,1,0,0,40,0,0 +29,2,427965,0,13,0,0,0,1,1,0,0,40,0,0 +52,2,218550,5,10,3,0,0,0,1,14084,0,16,0,1 +71,2,163385,5,10,6,5,0,0,0,0,0,35,0,1 +52,2,124993,1,9,0,10,3,0,0,0,0,55,0,0 +36,2,107410,1,9,1,5,1,0,0,0,0,40,0,0 +53,2,152373,5,10,2,10,0,0,0,0,0,48,0,1 +37,2,161226,1,9,1,4,2,0,1,0,0,30,0,1 +26,2,213799,12,6,0,2,0,0,0,0,0,40,0,0 +34,2,204461,0,13,1,3,1,0,0,0,0,55,0,1 +35,2,377798,0,13,0,3,0,0,0,0,0,50,0,1 +20,2,116375,4,5,0,5,3,0,1,0,0,40,0,0 +34,4,210164,5,10,1,10,1,0,0,0,1740,40,0,0 +56,1,258752,0,13,1,1,1,0,0,0,0,60,0,0 +39,2,327435,0,13,1,3,2,0,1,0,0,36,0,1 +24,2,301199,5,10,0,9,3,0,1,0,0,20,0,0 +24,2,186221,2,7,2,5,4,0,1,0,0,35,0,0 +23,2,203924,0,13,0,3,0,0,0,0,0,50,0,0 +27,2,192236,0,13,0,3,0,0,0,0,0,45,0,0 +25,2,152035,1,9,0,0,4,0,1,0,0,40,0,0 +29,2,201454,5,10,0,0,0,0,1,0,0,40,0,0 +42,2,156580,5,10,1,8,2,0,1,0,0,37,0,1 +51,2,115851,1,9,1,10,1,0,0,0,0,40,0,0 +31,2,106753,9,11,1,10,1,0,0,0,1740,40,0,0 +59,2,359292,15,2,1,8,1,0,0,0,0,40,4,0 +29,2,83003,1,9,1,4,2,0,1,0,0,40,0,0 +18,2,78817,1,9,0,0,3,0,1,0,0,20,0,0 +24,2,200967,1,9,1,10,2,0,1,0,0,36,0,0 +38,0,107164,5,10,4,1,3,0,0,0,0,40,0,0 +34,1,90614,1,9,4,1,0,0,0,0,0,50,0,0 +42,1,323790,0,13,1,1,1,0,0,0,1977,70,0,1 +45,1,242552,14,8,2,10,5,1,0,0,0,35,0,0 +21,2,90935,9,11,0,6,3,0,0,0,0,40,0,0 +64,5,165667,8,16,1,3,1,0,0,7688,0,60,8,1 +32,2,162604,1,9,0,8,5,1,0,0,0,40,0,0 +45,2,205424,0,13,0,3,0,0,0,0,0,40,0,1 +53,2,97411,11,3,1,8,1,2,0,0,0,40,17,0 +42,2,184857,1,9,1,10,1,0,0,0,0,16,0,0 +32,2,165226,1,9,2,4,0,0,1,0,0,40,0,0 +49,2,115784,1,9,1,8,1,0,0,0,0,40,0,0 +62,2,368476,11,3,1,7,1,0,0,0,0,24,4,0 +28,2,53063,0,13,1,1,1,0,0,0,0,45,0,0 +32,2,153471,1,9,0,7,0,0,0,0,0,35,0,0 +37,5,107164,12,6,0,6,0,0,0,0,2559,50,0,1 +38,2,180303,0,13,1,1,1,2,0,0,0,50,28,1 +44,4,236321,1,9,2,6,3,0,0,0,0,25,0,0 +19,2,141868,1,9,0,6,3,0,0,0,0,40,0,0 +24,2,203518,0,13,0,3,0,0,1,0,0,40,0,0 +58,2,119558,1,9,1,1,1,0,0,0,0,50,0,1 +56,2,108276,0,13,6,4,0,0,1,0,0,40,0,0 +37,2,385452,12,6,2,10,4,0,1,0,0,40,0,0 +43,2,162003,5,10,2,8,0,0,0,0,0,40,0,0 +32,2,349028,1,9,1,10,1,0,0,0,0,40,0,0 +34,2,45114,0,13,0,5,3,1,1,0,0,40,0,0 +44,2,112797,4,5,2,4,3,0,1,0,0,50,0,0 +28,2,183639,1,9,0,2,4,0,0,0,0,40,0,0 +35,2,177121,1,9,2,4,0,0,1,0,0,35,0,0 +38,2,239755,1,9,1,8,1,0,0,0,0,40,0,0 +26,2,150361,5,10,0,9,3,0,1,0,0,40,0,0 +20,2,293091,2,7,0,6,3,0,0,0,0,60,0,0 +24,2,200089,1,9,1,10,1,0,0,0,0,60,4,1 +40,2,91836,1,9,2,10,0,0,0,0,0,45,0,0 +23,2,324960,1,9,0,10,5,0,0,0,0,40,0,0 +79,4,84616,2,7,1,1,1,0,0,0,0,7,0,0 +44,2,252930,12,6,2,0,4,4,1,0,0,42,0,0 +51,2,44000,3,14,1,3,2,0,1,99999,0,50,0,1 +30,2,154843,1,9,1,8,1,0,0,0,0,40,0,0 +52,2,99307,6,12,1,5,1,0,0,3103,0,48,0,1 +33,2,93206,11,3,1,7,1,2,0,0,0,40,11,0 +50,2,100109,0,13,2,1,4,0,0,0,0,45,0,1 +51,2,114927,9,11,1,9,1,0,0,7298,0,40,0,1 +41,2,121287,1,9,0,8,0,0,0,0,0,40,0,0 +35,2,189916,0,13,1,5,2,0,1,0,0,30,0,1 +34,2,157747,5,10,1,1,1,0,0,7298,0,40,0,1 +28,2,39232,0,13,0,3,0,0,0,0,0,45,0,0 +31,5,133861,9,11,2,5,0,0,0,0,0,40,0,0 +22,2,505980,1,9,0,2,3,0,0,0,0,40,0,0 +65,2,193216,1,9,1,5,1,0,0,9386,0,40,0,1 +39,1,140752,1,9,1,5,1,0,0,0,0,50,0,1 +23,2,549349,5,10,0,9,3,0,0,0,0,40,0,0 +29,1,179008,6,12,1,5,1,0,0,0,0,50,0,0 +57,1,190554,12,6,2,1,3,0,0,0,0,60,0,1 +47,2,80924,5,10,6,4,0,0,1,0,0,35,0,0 +51,4,319054,1,9,1,6,1,1,0,0,0,60,0,0 +34,2,297094,1,9,1,2,1,1,0,0,0,40,0,0 +52,2,170562,1,9,1,1,1,0,0,0,0,60,0,1 +29,2,240738,1,9,1,3,1,0,0,0,0,40,0,1 +29,2,297544,1,9,1,10,1,0,0,0,0,40,0,0 +25,4,169905,5,10,1,7,1,0,0,0,0,40,0,0 +21,2,149637,5,10,0,4,0,0,1,0,0,40,0,0 +38,2,182526,0,13,3,3,0,0,1,0,0,40,0,0 +55,1,158315,1,9,1,5,1,0,0,0,0,50,0,1 +61,5,227232,0,13,4,5,0,0,1,0,0,30,0,0 +34,2,96483,6,12,0,0,0,2,1,8614,0,60,0,1 +41,2,286970,0,13,1,0,1,0,0,0,0,40,0,0 +27,4,223529,9,11,0,0,3,0,0,0,0,43,0,0 +78,1,316261,0,13,0,1,0,0,0,99999,0,20,0,1 +40,2,170214,1,9,1,6,1,0,0,0,0,40,0,1 +26,1,224361,7,4,1,6,1,0,0,0,0,75,0,0 +43,2,124919,1,9,1,4,1,2,0,0,0,60,28,0 +25,2,306352,9,11,1,9,1,0,0,0,0,40,4,0 +26,1,227858,5,10,0,4,0,0,1,0,0,48,0,0 +43,5,150533,1,9,1,5,1,0,0,0,0,68,0,1 +25,2,144478,5,10,0,4,3,0,0,0,0,40,12,0 +22,2,254547,5,10,0,0,5,1,1,0,0,30,2,0 +52,1,313243,1,9,1,10,1,0,0,0,0,55,0,1 +61,2,149981,1,9,1,0,2,0,1,2414,0,5,0,0 +42,2,125461,0,13,0,5,4,0,0,0,0,40,0,0 +21,2,306967,9,11,0,0,0,0,1,0,0,40,0,0 +44,2,192976,1,9,1,6,1,3,0,0,0,40,0,0 +65,2,192133,1,9,1,10,1,0,0,2290,0,40,34,0 +33,3,339388,6,12,2,4,4,0,0,0,0,40,0,0 +22,2,203240,12,6,0,0,0,0,1,0,0,40,0,0 +43,2,83827,1,9,2,8,0,0,1,0,0,24,0,0 +45,5,160440,1,9,2,1,0,0,0,0,0,42,0,0 +42,2,108502,1,9,2,5,0,0,1,0,0,42,0,0 +37,2,410913,1,9,3,7,4,4,0,0,0,40,4,0 +56,2,193818,4,5,2,10,0,0,0,0,0,40,0,0 +40,2,103789,6,12,2,0,4,1,1,0,0,32,0,0 +31,2,34572,0,13,1,5,1,0,0,0,0,55,0,0 +26,2,43408,0,13,1,3,1,0,0,0,0,40,0,0 +26,0,105787,0,13,0,3,3,0,0,0,0,40,0,0 +42,5,90693,0,13,1,1,1,0,0,0,0,70,0,0 +45,1,285575,1,9,1,1,1,2,0,0,0,40,26,0 +47,4,56482,5,10,1,3,1,1,0,7688,0,50,0,1 +22,2,496025,5,10,1,8,1,0,0,0,0,40,4,0 +33,2,382764,0,13,0,1,3,0,0,0,0,40,0,0 +37,2,259284,1,9,0,6,0,1,0,0,0,50,0,0 +48,1,185385,1,9,1,7,1,0,0,0,0,98,0,0 +57,1,286836,12,6,1,10,1,0,0,0,0,8,0,0 +47,2,139145,5,10,2,0,0,0,1,0,0,60,0,0 +58,4,44246,4,5,1,6,1,0,0,0,0,40,0,0 +55,2,169611,2,7,6,0,4,0,1,0,0,40,0,0 +52,2,133403,5,10,1,10,1,0,0,0,0,55,0,0 +29,2,187327,0,13,0,3,0,0,0,0,0,40,0,0 +42,2,180032,3,14,0,3,0,0,1,0,0,40,0,0 +23,2,46561,1,9,2,10,0,0,0,0,0,60,0,0 +23,2,86065,14,8,0,4,0,0,1,0,0,30,0,0 +46,1,256014,9,11,1,1,1,0,0,0,0,60,0,0 +30,2,188403,5,10,0,8,0,0,0,0,0,40,0,0 +43,1,396758,0,13,1,3,2,0,1,0,1887,70,0,1 +25,2,60485,5,10,0,0,3,0,1,0,0,30,0,0 +32,2,271276,1,9,1,6,1,0,0,0,0,80,0,1 +56,2,229525,4,5,1,6,1,1,0,0,0,40,0,0 +33,2,34574,1,9,1,6,1,0,0,0,0,43,0,0 +19,0,112432,5,10,0,0,3,0,0,0,0,10,0,0 +20,2,105312,5,10,0,5,3,0,1,0,0,18,0,0 +34,2,221396,5,10,1,0,1,0,0,0,0,40,0,0 +34,2,304872,4,5,2,4,4,0,1,0,0,40,0,0 +55,1,319733,1,9,1,10,1,0,0,0,0,40,0,0 +55,2,176012,4,5,1,9,2,0,1,0,0,23,0,0 +31,2,213750,5,10,0,5,0,0,0,0,0,45,0,0 +30,2,248384,1,9,2,4,4,0,1,0,0,40,0,0 +31,2,351187,1,9,2,4,4,0,0,0,0,40,0,0 +51,2,138179,1,9,4,8,0,0,0,0,1876,40,0,0 +59,2,50223,1,9,1,10,1,0,0,0,0,40,0,0 +58,2,117477,1,9,2,0,4,1,1,0,0,36,0,0 +40,2,194360,4,5,1,2,1,0,0,0,0,40,0,0 +54,2,118108,1,9,1,10,1,1,0,0,0,40,0,0 +25,4,90730,0,13,1,3,1,0,0,0,1977,40,0,1 +18,5,38307,2,7,0,7,3,0,0,0,0,30,0,0 +41,2,116391,5,10,1,10,1,0,0,0,0,40,0,0 +57,2,210496,12,6,6,4,4,0,1,0,0,40,0,0 +37,2,168475,1,9,1,1,1,0,0,0,0,40,0,1 +46,2,174386,1,9,0,4,4,0,1,0,0,24,0,0 +39,2,166744,1,9,0,4,3,0,1,0,0,38,0,0 +19,2,375114,1,9,0,10,0,0,1,0,0,40,0,0 +41,2,373469,6,12,1,8,1,0,0,0,0,40,0,0 +54,2,339667,1,9,0,0,0,0,0,0,0,41,0,0 +39,2,91711,3,14,1,1,1,0,0,0,0,40,0,1 +41,2,82049,1,9,1,10,1,0,0,0,0,40,0,1 +26,2,236242,10,15,0,3,0,0,1,0,0,30,0,0 +57,5,140319,1,9,1,0,1,0,0,0,0,50,0,0 +33,4,34080,5,10,1,11,1,0,0,0,0,40,0,1 +56,2,204816,5,10,1,1,1,0,0,0,0,40,0,1 +60,2,187124,1,9,1,8,1,0,0,0,0,40,0,0 +22,2,72310,1,9,0,6,0,0,0,0,0,70,0,0 +58,2,175127,14,8,1,6,5,0,0,0,0,40,0,0 +48,3,205707,3,14,3,1,0,0,1,10520,0,50,0,1 +45,4,236586,3,14,1,3,1,0,0,7688,0,55,0,1 +18,2,71792,1,9,0,5,3,2,1,0,0,40,0,0 +56,2,87584,1,9,6,4,4,0,1,0,0,40,0,0 +48,5,136878,1,9,1,10,1,0,0,0,0,60,0,1 +40,2,287983,0,13,0,9,0,2,1,0,2258,48,11,0 +38,2,110607,1,9,2,4,0,0,0,0,0,32,0,0 +58,2,109015,5,10,2,0,4,0,1,0,0,40,0,0 +23,2,235071,5,10,0,1,3,0,0,0,0,50,0,0 +51,2,332243,0,13,2,3,0,0,0,0,0,45,0,0 +44,2,45093,1,9,1,7,1,0,0,0,0,70,0,0 +46,3,161337,5,10,2,9,0,0,0,0,0,40,0,0 +64,0,211222,0,13,1,0,1,0,0,0,0,40,0,0 +32,2,295117,0,13,1,1,1,1,0,0,0,40,7,1 +31,2,206541,5,10,1,0,1,0,0,0,0,40,0,0 +36,2,238415,9,11,1,5,1,0,0,0,0,50,0,1 +21,2,29810,1,9,0,4,0,0,1,0,0,50,0,0 +30,2,108023,5,10,1,10,1,0,0,0,0,40,0,0 +31,2,114324,9,11,0,4,0,1,1,0,0,40,0,0 +54,2,172281,1,9,1,6,1,0,0,0,2051,50,0,0 +59,4,197290,4,5,1,4,1,0,0,0,0,40,0,0 +28,4,191177,3,14,1,3,2,0,1,0,0,20,0,1 +57,2,562558,1,9,2,0,4,0,1,0,0,40,0,0 +44,2,79531,1,9,1,10,1,0,0,0,0,45,0,0 +53,5,157881,5,10,2,1,0,0,0,0,0,60,0,0 +58,1,204816,5,10,1,1,1,0,0,0,0,60,0,1 +19,2,185695,5,10,0,4,3,0,1,0,0,20,0,0 +39,5,167482,6,12,1,1,1,0,0,0,0,50,0,1 +31,5,83748,5,10,1,1,2,2,1,0,0,70,27,0 +27,2,39232,1,9,1,10,1,0,0,0,0,40,0,0 +46,4,236827,4,5,4,4,4,1,1,0,0,40,0,0 +37,1,154410,3,14,0,1,0,0,0,0,0,40,0,0 +27,2,135308,0,13,0,5,0,1,1,0,0,40,0,0 +33,2,204042,5,10,0,6,0,0,0,0,0,55,0,0 +20,2,308239,5,10,0,4,3,0,0,0,0,16,0,0 +55,2,183884,1,9,2,10,0,0,0,0,0,45,0,0 +39,2,98948,6,12,0,5,0,0,1,0,0,40,0,0 +41,2,141642,1,9,0,4,0,0,1,0,0,40,0,0 +30,2,162623,0,13,0,3,0,0,1,0,0,40,0,0 +39,5,186934,0,13,3,5,0,0,0,0,0,40,0,0 +28,2,179512,1,9,4,1,4,0,1,0,0,50,0,0 +25,2,391192,5,10,0,5,3,0,0,0,0,24,0,0 +31,2,87054,1,9,1,10,1,0,0,0,0,50,0,0 +51,2,30008,1,9,1,6,1,0,0,0,0,60,0,0 +24,2,113466,0,13,0,0,3,0,0,0,0,40,0,0 +70,2,642830,1,9,2,11,0,0,1,0,0,32,0,0 +23,2,182117,5,10,0,0,3,0,0,0,0,40,0,0 +61,2,162432,1,9,6,1,0,0,1,0,0,40,0,0 +45,1,242184,7,4,1,1,1,0,0,0,0,55,0,1 +47,2,170850,1,9,1,2,1,0,0,4064,0,60,0,0 +56,2,435022,5,10,2,4,0,0,1,0,0,50,0,0 +79,2,120707,8,16,1,3,1,0,0,20051,0,35,22,1 +20,2,170800,5,10,0,0,3,0,1,0,0,15,0,0 +30,2,268575,1,9,0,10,4,2,0,0,0,40,36,0 +40,2,224232,0,13,1,5,1,0,0,0,0,40,0,1 +58,2,177368,1,9,1,10,1,0,0,0,0,40,0,1 +71,1,163293,10,15,1,7,1,0,0,0,0,2,0,0 +50,2,178530,10,15,1,3,1,0,0,0,0,60,0,1 +29,4,183523,5,10,0,1,0,0,0,0,0,40,10,0 +33,2,207267,12,6,4,4,4,0,1,3418,0,35,0,0 +60,0,27037,1,9,1,11,1,3,0,0,0,40,0,1 +33,2,176711,6,12,0,0,0,0,0,0,0,50,0,0 +33,2,394727,12,6,0,2,4,1,0,0,0,40,0,0 +33,2,195488,1,9,1,0,2,0,1,0,0,52,0,0 +32,0,443546,1,9,1,11,1,0,0,0,0,45,0,0 +21,2,121023,5,10,0,4,3,0,1,0,0,9,0,0 +38,2,51838,1,9,1,3,2,0,1,0,0,40,0,0 +38,2,258888,5,10,1,0,2,0,1,0,0,35,0,1 +39,0,189385,5,10,4,1,4,1,1,0,0,30,0,0 +17,2,198146,2,7,0,5,3,0,1,0,0,15,0,0 +21,2,337766,5,10,1,0,1,0,0,0,0,40,0,0 +42,2,210525,5,10,1,9,1,0,0,0,0,20,0,1 +42,2,185602,1,9,1,1,2,0,1,0,0,40,0,1 +36,2,173804,2,7,2,4,0,0,1,0,0,40,0,0 +32,2,251243,5,10,2,1,0,0,1,0,0,50,0,1 +37,1,415847,0,13,1,3,1,0,0,0,0,40,0,1 +28,2,119793,0,13,0,5,0,0,0,0,0,40,0,0 +37,2,181705,9,11,1,10,1,0,0,0,0,40,0,0 +50,2,182360,1,9,4,3,4,4,1,0,0,60,5,0 +49,2,61885,2,7,1,10,1,0,0,0,0,40,0,0 +40,2,146520,3,14,1,1,1,0,0,0,0,40,0,1 +40,2,323790,5,10,1,4,1,0,0,0,0,40,0,0 +49,2,146268,5,10,1,10,1,0,0,0,0,40,0,0 +35,3,287031,3,14,0,1,0,0,0,8614,0,40,0,1 +33,4,292217,1,9,2,11,4,0,0,0,0,40,0,0 +24,2,88126,1,9,0,10,0,0,0,0,0,40,0,0 +41,2,143046,3,14,0,0,0,0,1,0,0,40,0,0 +43,2,401623,5,10,1,9,1,1,0,0,0,40,2,1 +36,1,283122,1,9,1,7,1,0,0,0,1902,60,0,1 +84,1,155057,0,13,1,7,1,0,0,0,0,20,0,0 +23,2,260254,1,9,0,5,3,0,0,0,0,40,0,0 +41,2,152292,0,13,1,3,1,0,0,0,0,50,0,1 +55,5,138594,1,9,1,1,1,0,0,0,1977,45,0,1 +30,1,523095,5,10,0,10,0,0,0,0,0,45,0,0 +46,2,175262,6,12,1,0,1,2,0,0,0,40,3,0 +55,2,323706,5,10,1,1,1,0,0,0,1902,40,0,1 +34,2,316470,5,10,0,0,0,0,0,0,0,40,0,0 +54,1,163815,3,14,2,5,0,0,0,0,0,60,0,0 +27,2,72208,5,10,0,0,3,1,0,0,0,40,0,0 +52,4,74784,3,14,1,3,2,0,1,0,0,40,0,1 +36,2,383518,5,10,1,0,2,1,1,99999,0,40,0,1 +25,1,266668,1,9,0,3,0,0,0,0,0,40,0,0 +52,2,347519,0,13,1,1,1,0,0,0,0,55,0,1 +24,2,336088,1,9,2,1,0,3,1,0,0,50,0,0 +36,2,190350,1,9,0,0,0,1,1,0,0,40,0,0 +31,2,204052,1,9,1,2,1,0,0,0,0,40,0,0 +90,1,155981,0,13,1,3,1,0,0,10566,0,50,0,0 +67,2,195161,3,14,1,3,1,0,0,20051,0,60,0,1 +22,5,269583,7,4,1,10,1,0,0,2580,0,40,0,0 +47,2,26994,5,10,2,0,0,0,1,0,0,35,0,0 +32,2,116539,0,13,1,1,1,0,0,0,1887,55,0,1 +55,1,189933,7,4,1,7,1,0,0,0,0,50,0,0 +32,2,101283,1,9,0,2,0,0,1,0,0,35,0,0 +48,2,113598,5,10,4,0,5,1,1,0,0,40,0,0 +21,2,188793,1,9,1,5,1,4,0,0,0,35,0,0 +33,2,109996,6,12,3,3,3,0,1,0,0,40,0,0 +47,2,436770,9,11,0,3,0,0,1,0,0,40,0,0 +18,2,84253,2,7,0,4,3,0,1,0,0,24,0,0 +44,5,383493,1,9,1,10,1,0,0,0,0,60,0,1 +23,2,216867,5,10,0,10,3,0,0,0,0,37,4,0 +18,2,401051,12,6,0,5,3,0,1,0,0,35,0,0 +56,2,83196,1,9,1,1,1,0,0,0,0,50,0,0 +24,2,325596,0,13,0,0,3,0,0,0,0,35,0,0 +43,2,187322,0,13,1,10,1,0,0,0,0,40,0,1 +23,2,193949,0,13,0,5,3,0,1,0,0,60,0,0 +26,2,133373,5,10,0,5,3,0,0,0,0,42,0,0 +42,2,113324,1,9,6,5,4,0,0,0,0,40,0,0 +23,2,178818,1,9,0,0,0,0,1,0,0,40,0,0 +53,1,152810,12,6,1,10,1,0,0,0,0,40,0,0 +51,2,335997,1,9,1,1,1,0,0,4386,0,55,0,1 +40,2,436493,1,9,0,4,3,0,0,0,0,25,0,0 +27,2,704108,0,13,0,3,0,0,0,0,0,50,0,0 +24,4,150084,5,10,4,11,0,0,0,0,0,60,0,0 +42,2,341204,1,9,2,10,5,0,1,0,0,40,0,0 +41,2,187336,1,9,4,0,4,0,1,0,0,40,0,0 +23,2,204209,5,10,0,2,3,0,0,0,0,10,0,0 +42,1,206066,3,14,1,3,1,0,0,0,0,65,0,0 +38,2,63509,1,9,1,10,1,0,0,0,0,40,0,1 +63,1,391121,7,4,1,7,1,0,0,0,0,30,0,0 +31,2,56026,1,9,1,10,1,0,0,0,0,40,0,0 +18,1,60981,2,7,0,4,3,0,1,0,0,4,0,0 +21,2,228255,5,10,0,4,3,0,0,0,0,30,0,0 +24,2,86745,0,13,1,3,5,2,1,0,0,40,11,0 +55,2,234327,5,10,1,10,1,0,0,0,0,40,0,0 +20,2,59948,4,5,0,0,4,1,1,114,0,20,0,0 +31,2,137814,5,10,2,5,3,0,1,0,0,30,0,0 +23,2,167692,5,10,0,0,3,0,1,0,0,20,0,0 +35,2,245090,1,9,1,10,1,0,0,0,0,40,4,0 +51,1,256963,5,10,1,5,1,0,0,0,0,60,0,0 +19,2,160033,5,10,0,11,3,0,1,0,0,30,0,0 +38,4,289430,1,9,2,11,0,0,0,0,0,56,0,0 +52,4,305053,1,9,1,10,1,0,0,0,2051,40,0,0 +70,1,172370,10,15,1,3,1,0,0,0,0,25,0,0 +53,2,320510,12,6,2,10,0,0,0,0,0,40,0,0 +59,2,171355,8,16,1,1,1,0,0,0,0,40,0,1 +39,2,65027,5,10,1,6,1,0,0,0,0,43,0,0 +18,2,215190,14,8,0,5,3,0,1,0,0,20,0,0 +24,2,138938,5,10,2,0,0,0,1,0,0,40,0,0 +25,2,557082,1,9,0,0,0,0,1,0,0,38,0,0 +32,2,273287,5,10,0,1,0,1,0,0,0,40,2,0 +34,1,77209,1,9,1,5,1,0,0,0,1902,60,0,1 +35,2,317153,1,9,0,5,0,0,1,0,0,40,0,0 +50,2,95469,1,9,1,0,1,0,0,7298,0,45,0,1 +18,2,302859,1,9,0,5,3,0,0,0,0,20,0,0 +37,2,333651,1,9,0,0,0,0,0,0,0,42,0,0 +30,2,177596,5,10,0,4,4,0,1,0,0,36,0,0 +40,5,157240,3,14,1,1,2,0,1,15024,0,30,10,1 +22,2,184779,1,9,0,3,0,0,1,0,0,40,0,0 +50,4,138358,5,10,4,4,4,1,1,0,0,28,0,0 +70,2,176285,1,9,2,4,0,0,1,0,0,23,0,0 +43,2,102180,3,14,1,3,1,0,0,0,0,40,0,1 +77,1,209507,5,10,0,10,0,0,0,0,0,40,0,0 +30,1,229741,1,9,1,10,1,0,0,0,0,40,0,0 +33,2,324546,5,10,1,8,1,0,0,0,0,39,0,0 +51,2,337195,5,10,1,5,1,0,0,0,1902,50,0,1 +58,0,194068,3,14,1,3,1,0,0,0,1977,50,0,1 +22,2,250647,5,10,0,0,3,0,0,0,0,12,0,0 +33,2,477106,1,9,1,6,1,1,0,0,0,40,0,0 +27,2,104329,2,7,1,5,1,0,0,0,0,40,0,0 +35,2,224566,5,10,0,1,0,0,0,0,0,60,0,0 +32,2,169841,5,10,2,5,0,0,1,0,0,55,0,0 +41,2,42563,0,13,1,9,2,0,1,0,0,25,0,1 +37,2,31368,5,10,1,10,1,0,0,0,0,40,0,0 +17,2,132755,2,7,0,5,3,0,0,0,0,15,0,0 +50,2,279129,0,13,2,1,0,0,0,0,0,55,0,1 +54,0,44172,1,9,4,1,4,0,1,0,0,38,0,0 +23,0,93076,1,9,0,4,3,1,0,0,0,40,0,0 +40,2,146653,0,13,2,0,4,0,1,0,0,20,0,0 +29,2,221366,0,13,1,3,1,0,0,5013,0,40,9,0 +30,2,172304,9,11,1,1,1,0,0,0,0,55,0,0 +20,2,116666,5,10,0,5,3,2,0,0,0,8,3,0 +43,1,64112,5,10,1,7,1,0,0,0,0,50,0,0 +25,2,55718,5,10,0,9,3,0,0,0,0,25,0,0 +39,2,126675,3,14,1,5,1,0,0,0,0,50,0,1 +48,2,102112,6,12,1,3,1,0,0,0,0,50,0,1 +41,1,226505,1,9,2,4,4,0,1,0,0,40,0,0 +24,2,211527,0,13,0,0,0,0,0,0,0,30,0,0 +20,2,175069,5,10,0,0,3,0,0,0,0,40,29,0 +25,2,25249,5,10,0,0,0,0,1,0,0,40,0,0 +57,2,73411,5,10,1,10,1,0,0,0,0,40,0,1 +39,2,207185,5,10,1,1,2,0,1,0,0,35,5,1 +66,2,127139,0,13,1,3,1,0,0,0,0,40,0,1 +34,2,41809,5,10,2,0,4,0,1,0,0,40,0,0 +36,2,297449,0,13,2,3,0,0,0,14084,0,40,0,1 +46,2,141483,1,9,1,5,2,0,1,0,0,40,0,0 +42,4,117227,3,14,2,3,4,0,1,0,0,45,0,0 +46,2,377401,1,9,1,6,1,0,0,0,1902,70,8,1 +34,4,167063,1,9,0,11,3,0,0,0,0,40,0,0 +43,2,253759,5,10,1,9,2,1,1,0,0,40,0,0 +42,2,183096,5,10,2,1,3,0,1,0,0,40,0,0 +31,2,269654,0,13,0,5,0,0,0,0,0,48,0,0 +32,2,34104,5,10,1,1,1,0,0,0,0,40,0,0 +46,3,80057,1,9,1,0,1,0,0,0,0,40,9,1 +42,5,369781,7,4,2,10,4,0,0,0,0,25,0,0 +21,2,223811,9,11,0,1,3,0,0,0,0,40,0,0 +24,2,163053,0,13,0,5,0,0,1,0,0,40,0,0 +23,2,189461,1,9,0,5,5,0,0,0,0,55,0,0 +50,4,145166,3,14,1,3,1,0,0,7298,0,40,0,1 +37,2,86310,5,10,2,0,4,0,1,0,0,45,0,0 +44,3,280362,6,12,1,10,1,0,0,0,0,40,0,1 +29,2,301031,1,9,1,6,1,1,0,0,0,40,0,0 +30,2,74966,9,11,1,0,2,0,1,0,0,24,0,0 +36,2,254493,5,10,1,5,1,0,0,0,0,44,0,0 +49,1,204241,0,13,0,5,0,0,0,0,0,45,0,0 +29,2,225024,1,9,2,10,0,0,0,0,0,40,0,0 +45,4,148222,1,9,0,0,0,1,1,0,0,40,0,0 +75,0,113868,8,16,1,3,1,1,0,0,0,20,0,1 +37,2,44780,6,12,2,1,0,0,1,0,0,40,0,0 +51,2,86373,0,13,1,8,1,0,0,0,0,25,0,0 +61,4,176753,1,9,1,7,1,0,0,0,0,48,0,0 +50,4,370733,1,9,1,0,1,1,0,0,0,40,0,0 +59,2,216851,1,9,0,8,0,0,0,0,0,40,0,0 +25,2,137951,1,9,0,0,4,0,1,0,0,30,0,0 +22,2,185279,1,9,0,2,3,0,0,0,0,16,0,0 +56,2,159724,5,10,1,6,1,0,0,0,0,40,0,1 +44,2,103233,0,13,0,0,4,1,1,0,0,40,0,0 +35,2,63509,9,11,1,10,1,0,0,0,0,50,0,0 +57,2,174353,1,9,0,1,0,0,0,0,0,40,0,0 +47,1,168109,1,9,1,7,1,0,0,15024,0,50,0,1 +27,2,159724,0,13,0,1,0,0,1,0,0,40,0,0 +50,1,105010,1,9,1,7,1,0,0,0,2051,20,0,0 +46,2,364913,2,7,1,6,1,1,0,0,0,40,0,0 +48,5,155664,10,15,1,3,1,0,0,0,0,60,0,1 +61,2,230568,0,13,2,0,0,0,0,0,0,40,0,1 +33,2,86492,1,9,0,6,0,0,0,0,0,87,0,0 +40,2,71305,1,9,1,4,1,1,0,0,0,40,0,0 +58,5,189933,5,10,1,1,1,0,0,0,0,65,0,1 +46,5,191978,3,14,1,1,1,0,0,0,2392,50,0,1 +35,2,38948,5,10,1,3,1,0,0,0,0,40,0,1 +51,5,139127,5,10,2,1,4,0,1,0,0,50,0,0 +37,2,301568,14,8,0,4,3,0,1,0,0,40,0,0 +64,2,149044,3,14,1,3,1,2,0,0,2057,60,26,0 +41,2,197344,1,9,0,10,0,0,0,0,0,54,0,0 +18,2,32244,2,7,0,2,3,0,0,594,0,30,0,0 +44,1,315406,2,7,1,7,1,0,0,0,0,88,0,0 +41,0,47170,0,13,1,3,2,3,1,0,0,48,0,1 +33,0,208785,5,10,4,3,0,0,0,10520,0,40,0,1 +37,2,196338,4,5,4,13,4,0,1,0,0,16,4,0 +34,2,269243,5,10,0,0,3,0,1,0,0,40,0,0 +20,2,117767,5,10,0,2,3,0,0,0,0,40,0,0 +38,2,176101,0,13,1,1,1,0,0,0,0,40,0,0 +28,2,138283,9,11,0,4,0,0,1,0,0,40,0,0 +20,1,132320,1,9,0,6,3,0,0,0,0,45,0,0 +22,3,471452,0,13,0,9,3,0,0,0,0,8,0,0 +55,2,147653,0,13,2,0,4,0,1,0,0,73,0,0 +20,2,49179,5,10,0,3,0,0,0,0,0,35,0,0 +26,2,174921,0,13,0,3,0,0,1,0,0,40,0,0 +20,5,95997,1,9,0,7,3,0,0,0,0,70,0,0 +40,2,247245,4,5,2,4,0,0,1,0,0,40,0,0 +33,2,67072,1,9,1,5,1,0,0,0,0,50,0,1 +24,2,107882,1,9,0,5,0,0,1,0,0,40,0,0 +25,2,241825,5,10,0,1,3,0,0,0,0,46,0,0 +18,2,79443,2,7,0,4,3,0,0,0,0,8,0,0 +49,1,233059,1,9,1,10,1,0,0,0,0,60,0,0 +17,2,226980,14,8,0,2,3,0,0,0,0,17,0,0 +34,1,181087,9,11,1,10,1,0,0,0,0,45,0,0 +37,2,305597,0,13,1,3,1,0,0,0,0,45,0,1 +49,3,311671,5,10,1,1,1,0,0,0,0,40,0,1 +74,2,129879,1,9,6,0,0,0,1,15831,0,40,0,1 +37,2,83375,1,9,2,7,0,0,0,0,0,40,0,0 +20,2,115824,2,7,1,2,1,0,0,0,1573,40,0,0 +40,2,141657,1,9,1,1,2,0,1,0,0,35,0,1 +34,2,50276,0,13,0,5,0,0,0,27828,0,40,0,1 +30,2,177216,10,15,1,3,1,1,0,0,1740,40,19,0 +44,2,228057,1,9,4,0,0,0,1,0,0,40,5,0 +40,2,222848,12,6,1,4,2,1,1,0,0,32,0,0 +58,2,121111,1,9,1,5,2,0,1,0,0,40,34,0 +44,2,298885,1,9,1,10,1,0,0,0,0,40,0,0 +42,2,149909,5,10,1,5,1,0,0,0,0,25,0,1 +39,2,387430,1,9,0,4,0,0,0,0,0,18,0,0 +19,2,121972,1,9,0,4,3,1,0,0,0,40,0,0 +41,2,280167,3,14,1,1,1,0,0,15024,0,70,0,1 +29,0,191355,3,14,0,3,0,0,0,0,0,40,0,0 +34,3,112115,5,10,0,10,5,0,0,0,0,40,0,0 +27,2,211032,13,1,1,7,5,0,0,41310,0,24,4,0 +54,2,199307,5,10,2,10,4,0,1,0,0,48,0,0 +40,2,205175,1,9,6,8,4,1,1,0,0,37,0,0 +19,2,257750,5,10,0,5,5,0,1,0,0,25,0,0 +17,2,191260,2,7,0,4,3,0,0,594,0,10,0,0 +33,2,342730,5,10,1,5,1,0,0,0,0,52,0,0 +80,2,249983,7,4,6,4,0,0,1,0,0,24,0,0 +24,1,161508,1,9,0,10,3,0,0,0,0,50,0,0 +28,2,338376,0,13,0,3,3,0,0,0,0,40,0,0 +55,2,334308,1,9,1,1,2,0,1,0,0,30,0,1 +21,2,133471,5,10,0,1,3,0,0,0,0,40,0,0 +51,2,129177,1,9,2,0,0,0,1,0,0,38,0,0 +19,2,178811,1,9,0,8,3,1,1,0,0,40,0,0 +42,2,178537,1,9,0,4,0,0,1,0,0,24,0,0 +60,1,235535,1,9,1,1,1,0,0,0,0,48,0,0 +51,2,145114,1,9,2,0,0,0,1,0,0,40,0,0 +21,2,194096,5,10,0,4,3,0,1,0,0,40,0,0 +37,0,191779,5,10,1,10,1,0,0,0,0,40,0,0 +26,2,159732,1,9,0,8,0,0,0,0,0,52,0,0 +42,3,170230,3,14,0,1,0,0,1,14084,0,60,0,1 +40,2,104719,5,10,1,2,1,0,0,0,0,40,0,0 +55,2,163083,3,14,1,3,1,0,0,0,0,40,0,1 +33,2,403552,1,9,0,4,0,1,0,0,0,32,0,0 +62,2,218009,1,9,1,6,1,0,0,0,1977,60,0,1 +47,2,179313,12,6,2,5,4,0,1,0,0,30,0,0 +26,2,51961,14,8,0,5,5,1,0,0,0,51,0,0 +59,2,426001,1,9,3,0,4,0,1,0,0,20,5,0 +70,4,176493,5,10,6,0,0,0,1,0,0,17,0,0 +26,2,124068,5,10,0,0,0,0,1,0,0,20,0,0 +47,2,108510,12,6,1,5,1,0,0,0,0,65,0,0 +25,2,181528,3,14,0,1,0,0,1,0,0,43,0,0 +52,5,173754,10,15,1,3,1,0,0,15024,0,60,0,1 +46,2,169699,1,9,1,10,1,0,0,0,0,40,0,0 +67,2,126849,12,6,1,6,1,3,0,0,0,20,0,0 +34,2,204470,3,14,1,1,1,0,0,0,0,50,0,1 +53,0,116367,5,10,2,0,5,0,1,4650,0,40,0,0 +22,2,117363,0,13,0,0,0,0,1,0,0,35,0,0 +39,4,106297,1,9,2,0,3,0,0,0,0,42,0,0 +54,1,108933,1,9,1,10,1,0,0,0,0,35,0,0 +24,2,190143,0,13,1,5,1,0,0,0,0,40,0,0 +37,2,246677,1,9,4,3,4,0,1,0,0,38,0,0 +38,2,175360,12,6,0,3,0,0,0,0,2559,90,0,1 +41,4,210259,3,14,0,3,0,1,1,0,0,40,0,0 +36,2,166304,1,9,1,6,1,0,0,0,0,33,0,0 +43,2,303051,9,11,1,1,1,0,0,15024,0,40,0,1 +39,2,49308,0,13,2,3,0,0,0,0,0,40,0,0 +26,2,192262,0,13,0,5,3,0,0,0,0,45,0,0 +49,4,192349,3,14,0,3,0,0,1,4650,0,40,0,0 +37,1,48063,0,13,1,3,1,0,0,0,0,55,0,1 +43,2,170214,5,10,1,1,1,0,0,0,0,50,0,1 +54,3,51048,1,9,1,3,1,0,0,0,0,40,0,1 +53,5,246562,11,3,1,5,1,0,0,0,0,40,4,1 +57,4,215175,3,14,1,3,1,0,0,0,0,60,0,0 +28,2,114967,0,13,1,3,1,0,0,0,0,40,0,1 +29,2,464536,0,13,1,4,1,0,0,0,0,40,0,0 +21,2,451996,1,9,0,5,3,0,0,0,0,40,0,0 +51,2,138852,1,9,1,10,1,0,0,0,0,40,0,0 +46,0,353012,1,9,1,6,1,0,0,0,0,40,0,0 +50,5,321822,10,15,1,3,1,0,0,0,0,75,0,1 +50,1,324506,1,9,6,1,4,2,1,0,0,48,27,0 +36,2,162256,1,9,2,1,4,0,1,0,0,40,0,0 +31,4,356689,0,13,1,3,1,0,0,0,0,40,0,0 +20,2,260199,1,9,0,0,3,0,1,0,0,10,0,0 +36,2,103605,1,9,1,2,1,0,0,0,0,40,0,0 +38,2,316211,1,9,2,10,3,0,0,0,0,40,0,0 +37,2,308691,0,13,1,10,1,0,0,0,0,45,0,1 +39,2,194404,3,14,1,3,1,0,0,7688,0,40,0,1 +18,2,334427,12,6,0,7,3,0,0,0,0,36,0,0 +33,2,213226,1,9,2,5,0,0,0,0,0,50,0,0 +35,2,342824,1,9,0,9,0,0,1,1151,0,40,0,0 +23,2,33105,5,10,0,2,3,3,0,0,0,40,0,0 +37,2,147638,0,13,4,4,4,2,1,0,0,36,11,0 +25,2,315643,1,9,1,4,1,0,0,0,0,30,0,0 +51,3,106257,6,12,1,9,1,1,0,0,0,40,0,0 +35,2,342768,1,9,1,10,1,0,0,0,0,40,0,0 +54,2,108960,2,7,1,8,1,0,0,0,0,40,0,0 +32,2,136935,1,9,0,4,4,1,1,0,0,13,0,0 +37,1,188774,0,13,0,11,0,0,0,0,0,55,0,1 +29,2,280344,0,13,1,5,1,0,0,0,0,40,0,1 +45,2,202496,0,13,1,2,1,0,0,0,0,37,0,0 +61,5,134768,5,10,1,5,1,0,0,0,0,40,0,0 +40,2,175686,5,10,2,0,4,0,1,0,0,40,0,0 +24,2,194748,1,9,0,6,0,0,1,0,0,49,0,0 +49,2,61307,7,4,1,8,1,4,0,0,0,38,0,0 +51,1,165001,3,14,2,1,4,0,0,25236,0,50,0,1 +34,2,325658,1,9,1,6,1,0,0,0,0,40,0,0 +20,2,505980,5,10,0,5,3,0,0,0,0,40,0,0 +30,2,185336,5,10,2,0,4,1,1,0,0,37,0,0 +49,5,362795,3,14,2,3,4,0,0,99999,0,80,4,1 +26,2,126829,5,10,0,5,0,0,0,0,0,40,0,0 +63,2,264600,12,6,1,0,1,0,0,0,0,45,0,0 +36,2,82743,6,12,0,6,0,0,0,0,0,55,10,0 +63,1,125178,0,13,1,3,1,0,0,0,0,40,0,1 +22,2,128487,1,9,0,0,0,0,1,0,0,10,0,0 +40,2,321758,1,9,1,5,1,0,0,0,0,40,0,1 +31,2,128220,7,4,6,0,0,0,1,0,0,35,0,0 +49,2,176814,5,10,1,10,1,0,0,0,0,50,8,0 +23,0,156423,0,13,0,3,3,0,1,0,0,20,0,0 +25,2,169905,9,11,0,5,0,0,0,27828,0,40,0,1 +28,2,176972,0,13,1,10,1,0,0,0,0,45,0,1 +44,1,171424,5,10,2,8,0,0,0,0,2205,35,0,0 +33,2,91811,1,9,4,6,0,0,0,0,0,40,0,0 +21,2,203924,5,10,0,0,0,0,0,2597,0,45,0,0 +55,2,177484,2,7,1,4,1,1,0,0,1672,40,0,0 +75,1,242108,1,9,2,5,0,0,0,2346,0,15,0,0 +61,2,132972,4,5,0,8,4,1,1,0,0,40,0,0 +53,2,157947,1,9,2,0,0,0,1,0,0,40,0,0 +26,4,177482,6,12,1,11,1,0,0,0,0,45,0,1 +48,2,246891,5,10,6,5,4,0,0,0,0,50,0,1 +28,0,158834,3,14,1,1,1,0,0,0,0,50,0,1 +29,2,110442,1,9,1,2,1,0,0,0,0,45,0,0 +25,2,240676,5,10,2,9,3,0,1,0,0,40,0,0 +37,2,192939,1,9,1,6,1,0,0,0,0,40,0,0 +43,4,260696,0,13,2,3,4,0,1,0,0,55,0,0 +40,4,55363,1,9,1,6,1,0,0,0,0,40,0,0 +34,2,144949,12,6,1,10,1,0,0,0,0,45,0,1 +55,2,116878,8,16,1,3,1,0,0,15024,0,30,0,1 +31,4,357954,6,12,0,9,0,0,0,0,0,20,0,0 +32,1,190290,1,9,1,7,1,0,0,0,0,40,25,0 +26,0,203279,10,15,0,3,0,2,0,2463,0,50,3,0 +26,2,167761,0,13,1,3,1,0,0,0,0,50,0,1 +44,2,138845,5,10,1,6,1,0,0,0,0,40,0,0 +49,2,144844,1,9,1,6,1,0,0,0,0,52,0,1 +26,2,55743,1,9,0,0,4,1,1,0,0,30,0,0 +40,1,117721,1,9,1,7,1,0,0,0,0,60,0,0 +19,1,116385,2,7,0,0,0,0,1,0,0,40,0,0 +58,2,301867,1,9,1,7,1,0,0,0,0,40,0,0 +61,2,238913,9,11,1,9,1,0,0,0,0,40,0,1 +28,1,123983,5,10,1,5,3,2,0,0,0,63,27,0 +26,2,165510,0,13,0,7,3,0,0,0,0,40,0,0 +64,2,183513,1,9,0,0,0,0,1,0,0,25,0,0 +42,5,119281,0,13,1,1,1,0,0,0,0,60,0,1 +41,2,152629,5,10,1,9,1,0,0,0,0,40,0,1 +45,2,110171,1,9,0,2,0,0,0,0,0,40,0,0 +39,2,211440,0,13,1,5,1,0,0,0,0,50,0,1 +41,4,359259,1,9,1,4,1,0,0,0,0,40,0,0 +51,2,125796,2,7,4,4,0,1,1,0,0,40,2,0 +34,2,39609,9,11,2,0,4,0,1,0,0,40,0,0 +33,2,111567,3,14,1,1,1,0,0,0,1902,45,9,1 +23,2,44064,5,10,4,4,0,0,0,0,2559,40,0,1 +35,1,120066,5,10,1,10,1,3,0,0,0,60,0,0 +41,2,132633,2,7,2,13,4,0,1,0,0,25,24,0 +39,2,192702,3,14,0,10,0,0,1,0,0,50,0,0 +41,2,166813,5,10,1,5,1,0,0,0,0,55,0,0 +33,5,40444,5,10,1,1,1,0,0,0,0,40,0,0 +22,2,290504,1,9,0,4,5,0,0,0,0,40,0,0 +25,2,178505,5,10,0,1,5,0,1,0,1504,45,0,0 +25,2,175370,5,10,2,8,3,0,1,0,0,40,0,0 +77,1,72931,7,4,3,0,0,0,0,0,0,20,25,1 +66,2,284021,1,9,6,5,0,0,1,0,0,40,0,0 +19,2,277974,5,10,0,5,3,0,0,0,0,35,0,0 +44,2,111275,1,9,0,4,4,1,1,0,0,38,0,0 +45,5,191776,3,14,2,5,4,0,1,25236,0,42,0,1 +28,2,125527,5,10,0,5,0,0,0,0,0,50,0,0 +19,2,38294,1,9,0,2,5,0,0,2597,0,40,0,0 +43,2,313022,1,9,1,8,1,1,0,4386,0,40,0,1 +39,2,179668,0,13,1,9,1,0,0,15024,0,40,0,1 +33,2,198660,0,13,1,5,1,0,0,0,0,50,0,0 +44,2,216116,1,9,3,4,0,1,1,0,0,40,2,0 +62,2,200922,7,4,6,8,0,0,1,0,0,40,0,0 +40,2,153372,5,10,1,5,1,0,0,0,0,50,0,1 +41,2,406603,1,9,0,4,0,0,0,0,0,6,10,0 +23,4,248344,5,10,0,4,0,1,0,0,0,30,0,0 +48,2,240629,1,9,1,10,1,0,0,0,0,40,25,1 +38,2,314310,3,14,1,3,1,0,0,0,0,45,0,0 +37,2,259785,3,14,1,1,1,0,0,0,0,50,0,1 +45,2,127111,3,14,1,3,1,0,0,0,0,55,0,1 +29,2,178272,1,9,1,11,1,0,0,0,0,40,0,0 +66,4,75134,1,9,6,0,4,0,1,0,0,25,0,0 +19,2,195985,1,9,0,4,0,0,1,0,0,50,0,0 +23,2,221955,4,5,0,2,5,0,0,0,0,39,4,0 +34,2,177675,0,13,1,9,1,0,0,0,0,40,0,1 +39,2,182828,3,14,0,1,0,0,1,0,0,45,0,0 +33,1,270889,1,9,0,6,0,0,0,0,0,60,0,0 +43,2,183096,5,10,4,5,4,0,1,0,0,10,0,0 +27,2,336951,1,9,1,6,1,0,0,0,0,99,0,0 +33,0,295589,5,10,4,0,3,1,0,0,0,35,0,0 +26,2,289980,11,3,1,7,1,0,0,0,0,30,4,0 +56,5,70720,3,14,2,1,0,0,0,27828,0,60,0,1 +46,2,163352,1,9,1,5,1,0,0,0,0,36,0,0 +38,2,190776,6,12,2,10,4,0,1,0,0,40,0,0 +90,2,313986,2,7,1,10,1,0,0,0,0,40,0,0 +72,5,473748,5,10,1,1,1,0,0,0,0,25,0,1 +20,2,163003,1,9,0,0,4,2,1,0,0,15,0,0 +29,2,183061,1,9,1,10,1,3,0,0,0,48,0,0 +49,2,123584,2,7,1,6,1,0,0,0,0,75,0,0 +23,2,120910,1,9,0,4,4,0,1,0,0,35,0,0 +20,2,227554,5,10,3,5,3,1,1,0,0,18,0,0 +57,2,182677,0,13,1,1,1,2,0,4508,0,40,27,0 +46,2,214955,6,12,2,3,4,0,1,0,0,40,0,0 +33,2,209768,0,13,1,3,1,0,0,0,0,40,0,1 +24,2,258120,0,13,0,5,0,0,0,0,0,55,2,0 +49,2,110015,9,11,1,10,1,0,0,0,0,45,34,0 +54,2,152652,1,9,1,6,1,0,0,0,0,65,0,0 +46,3,43206,8,16,0,3,0,0,1,0,1564,50,0,1 +31,1,114639,9,11,1,10,1,0,0,0,0,50,0,0 +43,5,221172,10,15,1,3,1,0,0,0,1977,40,0,1 +19,2,131615,1,9,0,8,3,0,0,0,0,40,0,0 +46,2,353824,6,12,0,0,0,0,0,0,0,40,0,0 +43,2,178417,0,13,2,3,0,0,0,0,0,40,0,0 +58,2,178644,1,9,6,10,4,0,0,0,0,40,0,0 +43,1,271665,1,9,1,5,1,0,0,0,0,45,0,0 +21,3,169003,14,8,0,0,3,1,0,0,0,25,0,0 +52,0,338816,3,14,0,0,0,0,0,0,0,70,0,1 +34,2,506858,9,11,1,10,1,0,0,0,0,32,0,1 +28,2,265628,9,11,0,2,3,0,1,0,0,40,0,0 +34,2,173495,1,9,2,6,0,0,0,0,0,40,0,0 +29,2,177413,1,9,1,8,1,0,0,0,0,40,0,1 +39,2,31670,1,9,1,7,1,0,0,0,0,65,0,0 +49,2,154451,2,7,2,8,4,1,1,0,0,35,0,0 +35,2,265535,5,10,1,10,1,1,0,0,0,50,2,1 +31,2,118941,5,10,2,4,3,0,1,0,0,20,0,0 +18,2,214617,5,10,0,2,3,0,0,0,0,30,0,0 +47,4,265097,1,9,1,4,1,0,0,4386,0,40,0,1 +46,2,276087,1,9,1,5,1,0,0,5013,0,50,0,0 +43,2,124692,0,13,1,5,1,0,0,0,0,40,0,1 +51,3,306784,1,9,1,10,1,0,0,4386,0,40,0,1 +21,2,434102,5,10,0,0,0,0,1,0,0,40,0,0 +31,0,181824,0,13,1,3,2,0,1,0,1902,35,0,1 +39,4,177907,1,9,1,11,1,0,0,0,1887,40,0,1 +58,2,87329,2,7,1,0,1,0,0,0,0,48,0,0 +36,2,263130,3,14,0,3,0,0,1,0,0,40,0,0 +38,2,262882,1,9,1,8,2,0,1,0,0,40,0,0 +31,2,37546,0,13,1,1,2,0,1,0,1902,35,0,1 +19,2,27433,2,7,0,2,0,0,0,0,0,40,0,0 +38,2,393945,9,11,2,9,0,0,1,0,0,36,0,0 +26,2,173927,9,11,0,3,3,4,1,0,0,60,2,0 +38,2,343403,6,12,2,0,0,0,1,0,0,16,0,0 +36,2,111128,5,10,1,10,1,0,0,0,0,45,0,0 +40,2,193882,1,9,1,1,1,0,0,0,0,45,0,1 +41,2,128354,0,13,1,9,2,0,1,0,0,25,0,1 +33,2,113364,1,9,0,5,0,0,0,0,0,45,0,0 +51,2,136913,1,9,1,8,1,0,0,0,0,40,0,0 +34,2,115488,1,9,1,5,1,0,0,0,0,40,0,0 +33,2,154227,9,11,2,5,0,0,0,0,0,40,0,0 +25,2,279667,12,6,1,10,1,0,0,0,0,45,0,0 +30,1,281030,1,9,0,5,4,0,0,0,0,66,0,0 +19,2,283945,5,10,0,0,3,0,0,0,0,25,0,0 +47,2,454989,1,9,1,1,2,0,1,0,0,40,0,1 +26,2,391349,0,13,0,0,0,0,1,0,0,40,0,0 +21,0,166704,5,10,0,4,3,0,1,0,0,14,0,0 +36,2,151835,1,9,1,4,1,0,0,0,0,60,0,1 +60,2,199085,12,6,1,8,1,0,0,0,0,40,0,0 +28,2,61487,1,9,0,3,4,1,0,0,0,40,0,0 +19,2,120251,1,9,0,0,3,0,1,0,0,14,0,0 +42,2,273230,0,13,1,3,1,0,0,0,0,90,0,0 +36,2,358373,1,9,4,8,0,1,1,0,0,36,0,0 +35,2,267891,1,9,1,4,2,0,1,0,0,38,0,0 +22,2,234880,5,10,0,0,3,0,1,0,0,25,0,0 +54,2,48358,1,9,1,10,1,0,0,0,0,40,0,1 +36,2,96452,0,13,1,3,1,0,0,0,0,45,0,0 +55,2,204751,1,9,1,6,1,0,0,0,0,65,0,0 +57,2,375868,3,14,1,0,1,0,0,0,0,40,0,0 +56,2,413373,7,4,1,6,1,0,0,0,0,36,0,0 +24,2,537222,1,9,1,1,1,0,0,0,0,50,0,0 +35,4,33975,0,13,1,3,1,0,0,0,0,40,0,1 +51,5,162327,2,7,2,5,0,0,0,0,0,40,0,0 +34,2,182691,1,9,2,1,3,0,0,0,0,44,0,0 +36,2,300829,6,12,2,0,4,0,1,0,0,42,0,0 +51,4,114508,4,5,4,4,5,0,1,0,0,40,0,0 +46,5,214627,8,16,1,3,1,0,0,0,0,60,0,1 +42,2,129684,1,9,2,1,0,1,1,5455,0,50,0,0 +25,0,120041,0,13,0,3,0,0,1,0,0,40,0,0 +22,2,361138,1,9,0,2,5,0,0,0,0,50,0,0 +37,2,76893,1,9,1,10,1,0,0,0,0,40,0,0 +48,2,205424,0,13,2,5,4,0,0,0,0,40,0,1 +61,2,176839,0,13,1,3,1,0,0,15024,0,50,0,1 +40,2,229148,14,8,1,6,1,1,0,0,0,40,2,0 +58,5,154537,1,9,1,1,2,0,1,0,0,20,0,1 +52,2,181901,1,9,3,7,5,0,0,0,0,20,4,0 +18,2,152004,2,7,0,4,3,1,0,0,0,20,0,0 +27,2,205188,12,6,1,8,1,0,0,0,0,40,0,0 +48,1,30840,5,10,1,3,1,0,0,5013,0,45,0,0 +63,2,66634,4,5,1,10,1,0,0,0,0,16,0,0 +38,1,180220,1,9,1,10,1,0,0,0,0,60,0,0 +31,2,291052,5,10,1,0,1,0,0,0,2051,40,0,0 +40,1,99651,5,10,1,3,1,0,0,0,0,60,0,0 +41,2,327723,1,9,2,1,0,0,0,0,0,40,0,0 +28,2,32291,0,13,0,3,0,0,1,2174,0,40,0,0 +31,2,345122,10,15,2,3,0,0,0,14084,0,50,0,1 +32,2,127384,9,11,1,10,1,0,0,0,0,55,0,1 +30,2,363296,1,9,0,2,4,1,0,0,0,72,0,0 +39,4,86551,1,9,2,10,0,0,0,0,1876,40,0,0 +28,2,30070,0,13,1,5,1,0,0,0,0,50,0,0 +31,2,595000,1,9,0,2,5,1,1,0,0,35,0,0 +44,0,111483,3,14,1,3,1,0,0,0,0,40,0,1 +22,2,199555,5,10,0,7,3,0,0,0,0,25,0,0 +36,2,218490,6,12,1,10,1,0,0,0,0,35,0,0 +39,2,49020,3,14,0,1,0,0,0,0,1974,40,0,0 +61,2,213321,5,10,1,1,1,0,0,0,1672,40,0,0 +31,2,159187,1,9,2,6,3,0,0,0,0,40,0,0 +21,2,83033,5,10,0,4,0,0,1,0,0,25,9,0 +39,1,31848,5,10,1,7,1,0,0,2829,0,90,0,0 +34,1,24961,1,9,1,7,1,0,0,0,0,80,0,0 +21,2,182117,5,10,0,4,3,0,0,0,0,15,0,0 +75,1,146576,0,13,6,3,4,0,0,0,0,48,0,1 +21,2,176690,5,10,0,4,3,0,0,0,0,24,0,0 +81,2,122651,5,10,1,5,1,0,0,0,0,15,0,0 +54,5,149650,1,9,2,4,0,0,0,0,0,40,8,0 +34,2,454508,0,13,1,3,1,0,0,0,0,65,10,0 +54,1,269068,10,15,1,3,1,2,0,99999,0,50,11,1 +41,2,266530,1,9,1,4,1,3,0,0,0,45,0,0 +63,2,133144,1,9,1,4,1,0,0,2580,0,20,0,0 +24,2,217961,5,10,0,8,0,0,0,0,0,40,0,0 +20,2,221661,1,9,1,0,2,0,1,0,0,40,4,0 +44,4,60735,0,13,2,3,3,0,1,0,0,60,0,0 +47,1,121124,0,13,1,5,1,0,0,0,0,40,0,1 +31,2,48588,5,10,1,10,1,0,0,0,0,40,0,0 +41,2,48087,7,4,2,10,0,0,0,0,1590,40,0,0 +53,1,240138,1,9,1,10,1,0,0,0,0,60,0,0 +63,2,273010,1,9,1,0,2,0,1,3471,0,40,0,0 +44,2,104196,3,14,1,3,1,0,0,0,0,45,0,1 +37,2,230035,1,9,1,10,1,0,0,0,0,46,0,1 +28,2,38918,5,10,1,10,1,0,0,0,0,50,9,1 +57,2,176079,1,9,2,0,0,0,1,0,0,40,0,0 +22,2,180052,5,10,0,7,3,0,0,0,0,10,0,0 +33,4,173005,0,13,1,0,1,0,0,0,1848,45,0,1 +30,2,378723,5,10,2,0,3,0,1,0,0,55,0,0 +20,2,233624,1,9,0,10,3,0,0,0,0,40,0,0 +28,2,192591,0,13,0,0,0,0,1,0,0,45,0,0 +54,2,249860,2,7,2,13,4,1,1,0,0,10,0,0 +20,2,247564,1,9,0,2,3,0,0,0,0,35,0,0 +34,2,238912,1,9,1,1,1,0,0,0,0,40,0,0 +21,2,190227,5,10,0,0,3,0,0,0,0,40,0,0 +29,0,293287,5,10,0,4,4,0,1,0,0,40,0,0 +51,2,180807,5,10,2,1,4,0,1,0,0,40,0,0 +39,2,250217,1,9,2,8,0,1,1,0,0,70,0,0 +19,2,217418,5,10,0,0,5,1,1,0,0,38,0,0 +22,4,137510,1,9,0,7,3,0,0,0,0,40,0,0 +59,0,163047,5,10,2,0,0,0,1,0,0,38,0,0 +18,2,577521,2,7,0,5,3,0,0,0,0,13,0,0 +22,2,221533,1,9,0,4,0,0,0,0,0,20,0,0 +42,4,255675,5,10,1,10,1,0,0,0,0,40,0,1 +39,2,114079,6,12,0,10,0,0,0,0,0,40,0,0 +31,2,155781,0,13,1,5,1,0,0,0,0,40,0,1 +28,2,243762,2,7,4,10,4,0,1,0,0,40,0,0 +22,2,113062,0,13,0,1,3,0,1,0,0,7,0,0 +67,2,217028,3,14,0,4,0,0,1,0,0,40,0,0 +17,2,110723,2,7,0,5,3,0,1,0,0,25,0,0 +47,3,191858,6,12,1,0,1,0,0,0,0,40,0,1 +23,2,179423,0,13,0,0,0,0,1,0,0,5,0,0 +20,2,339588,1,9,1,4,2,0,1,0,0,40,30,0 +22,2,206815,1,9,0,5,4,0,1,0,0,40,30,0 +47,0,103743,7,4,1,6,1,0,0,0,0,40,0,0 +49,2,235683,5,10,1,5,2,0,1,0,0,40,0,1 +35,0,197495,5,10,2,1,0,1,1,0,0,40,0,0 +52,3,424012,5,10,2,1,0,0,1,0,0,40,0,0 +29,2,178469,1,9,0,5,0,0,1,0,0,40,0,0 +73,5,92886,12,6,6,5,4,0,1,0,0,40,8,0 +38,1,214008,1,9,1,3,1,0,0,0,0,50,0,1 +59,1,325732,1,9,1,1,1,0,0,0,1902,52,0,1 +35,2,28572,5,10,1,10,1,0,0,4064,0,35,0,0 +18,2,118376,5,10,0,5,3,0,1,0,0,15,0,0 +24,2,51799,1,9,1,0,2,1,1,0,0,40,0,0 +33,4,115488,0,13,1,3,1,0,0,0,0,50,0,0 +40,2,190621,5,10,2,1,5,1,1,0,0,55,0,0 +55,2,193568,1,9,6,0,0,0,1,0,0,40,0,0 +44,2,192878,1,9,2,3,0,0,0,0,0,40,0,0 +40,2,264663,0,13,0,3,3,0,1,0,0,60,0,0 +22,2,234731,1,9,2,2,3,0,0,0,0,40,0,0 +55,2,308373,5,10,1,1,2,0,1,0,0,40,0,1 +45,2,205644,1,9,4,9,0,0,1,0,0,26,0,0 +47,4,321851,0,13,0,3,0,0,1,0,0,50,0,1 +56,2,206399,1,9,1,10,1,0,0,0,0,40,0,0 +44,2,124563,1,9,1,8,1,1,0,0,0,40,0,0 +32,0,198211,5,10,0,0,0,0,0,0,0,38,0,0 +17,2,130795,12,6,0,4,3,0,0,0,0,20,0,0 +44,2,71269,5,10,2,1,0,0,0,0,0,50,0,0 +32,1,319280,6,12,0,5,0,0,0,0,0,80,0,0 +35,2,125933,0,13,1,5,1,0,0,0,0,60,0,1 +27,2,107236,1,9,1,4,1,0,0,0,0,40,0,0 +32,2,32732,1,9,1,3,1,0,0,0,0,50,0,0 +68,2,284763,2,7,2,6,0,0,0,0,0,70,0,0 +20,2,112668,5,10,0,4,3,0,1,0,0,20,0,0 +33,2,376483,5,10,2,0,0,1,1,0,0,40,0,0 +24,2,402778,4,5,0,2,3,0,0,0,0,12,0,0 +48,2,36177,1,9,1,10,1,0,0,0,0,45,0,0 +45,2,125489,3,14,2,3,4,0,1,0,0,50,0,0 +48,2,304791,5,10,6,0,0,0,1,0,0,40,0,0 +28,2,209205,3,14,1,3,1,0,0,0,0,45,0,1 +39,4,178100,3,14,2,3,4,0,1,0,0,40,0,0 +23,2,70261,5,10,0,4,3,0,0,0,0,30,0,0 +23,0,186634,14,8,0,1,0,0,0,0,0,40,0,0 +36,2,32958,5,10,4,0,5,0,1,0,0,40,0,0 +25,2,254746,0,13,1,3,2,0,1,0,0,40,0,0 +52,2,158746,1,9,0,4,4,0,0,0,0,40,0,0 +35,1,140854,1,9,1,10,1,0,0,0,0,40,0,0 +41,2,51506,1,9,1,1,1,0,0,0,0,40,0,0 +45,2,189564,0,13,1,5,2,0,1,0,0,42,0,1 +58,2,213975,9,11,6,3,0,0,1,0,0,40,0,0 +67,1,431426,1,9,1,0,2,0,1,0,0,2,0,0 +48,2,199763,1,9,1,3,2,0,1,0,0,8,0,0 +63,2,161563,1,9,1,10,1,0,0,0,0,48,0,0 +24,4,252024,5,10,1,11,1,0,0,0,0,72,0,1 +43,2,43945,5,10,1,10,1,0,0,0,0,40,0,1 +36,2,178487,1,9,2,6,3,0,0,0,0,60,0,0 +32,2,604506,1,9,1,6,3,0,0,0,0,72,4,0 +36,2,228157,5,10,0,10,0,2,0,0,0,40,17,0 +43,2,199191,5,10,0,0,0,0,1,0,0,50,0,0 +27,2,189775,1,9,0,0,0,1,1,0,0,40,0,0 +17,2,171080,2,7,0,4,3,0,0,0,0,12,0,0 +45,2,117310,0,13,2,5,0,0,1,0,0,46,0,0 +41,5,82049,1,9,1,10,1,0,0,0,0,40,0,0 +41,1,126094,1,9,1,1,1,0,0,0,0,38,0,0 +48,4,246392,6,12,4,0,0,1,1,0,0,40,0,0 +26,2,292803,5,10,0,4,3,0,1,0,0,24,0,0 +54,2,286989,13,1,1,7,1,0,0,0,0,60,0,0 +22,2,190483,5,10,2,5,3,0,1,0,0,48,10,0 +19,2,235849,1,9,0,6,3,0,0,0,0,35,0,0 +47,2,359766,7,4,2,2,5,1,0,0,0,40,0,0 +32,2,128016,1,9,3,4,4,0,1,0,0,20,0,0 +46,2,360096,0,13,1,1,1,0,0,15024,0,60,0,1 +30,2,170154,0,13,0,9,0,0,1,0,0,40,0,1 +35,2,337286,3,14,0,1,0,2,0,0,0,40,0,0 +52,2,204322,9,11,1,9,1,0,0,5013,0,40,0,0 +73,1,143833,14,8,1,7,1,0,0,0,0,18,0,0 +17,2,365613,12,6,0,4,3,0,0,0,0,10,8,0 +32,2,100135,0,13,4,3,4,0,1,0,0,32,0,0 +43,4,180096,3,14,1,3,1,0,0,0,0,40,0,1 +26,2,61270,1,9,0,8,4,4,1,0,0,40,13,0 +41,3,564135,3,14,1,1,1,0,0,0,0,40,0,1 +49,2,198759,6,12,1,5,1,0,0,15024,0,60,0,1 +52,0,303462,5,10,4,11,4,0,0,0,0,40,0,0 +35,2,193106,1,9,4,0,4,0,1,0,0,32,0,0 +57,2,250201,2,7,1,4,1,0,0,0,0,52,0,0 +35,2,200426,9,11,3,3,4,0,1,0,0,44,0,0 +33,2,222654,0,13,0,3,0,0,0,0,0,40,0,0 +56,2,53366,7,4,2,6,4,0,0,0,0,40,0,0 +42,2,132222,0,13,0,5,3,0,0,0,0,60,0,0 +17,2,100828,5,10,0,0,3,0,0,0,0,20,0,0 +49,2,31264,1,9,2,0,0,0,1,0,0,35,0,0 +39,2,202027,10,15,1,3,1,0,0,0,0,45,0,1 +34,1,168906,5,10,2,0,4,0,1,0,0,50,0,0 +37,1,255454,5,10,0,3,0,1,0,0,0,40,0,0 +22,2,245524,14,8,0,4,0,0,0,0,0,35,0,0 +27,2,386040,9,11,1,10,1,0,0,0,0,40,4,0 +21,2,35424,5,10,0,5,3,0,1,0,0,25,0,0 +44,2,152629,0,13,1,0,1,0,0,3103,0,40,0,1 +53,1,151159,12,6,3,6,0,0,0,0,0,99,0,0 +26,2,410240,2,7,0,10,0,0,0,0,0,40,0,0 +48,2,138970,0,13,1,1,1,0,0,0,0,45,0,1 +39,2,269722,0,13,1,1,1,0,0,0,0,70,0,0 +34,2,223678,1,9,0,4,4,3,1,0,0,32,0,0 +54,0,197184,0,13,1,1,1,0,0,0,0,38,0,0 +36,2,143486,1,9,1,6,1,0,0,7298,0,50,0,1 +60,2,160625,1,9,1,3,1,0,0,5013,0,40,0,0 +50,2,140516,1,9,1,11,1,0,0,0,0,40,0,1 +48,4,85341,0,13,1,3,1,0,0,0,0,45,0,0 +35,2,108293,5,10,0,0,3,0,1,0,2205,40,0,0 +40,1,192507,6,12,2,3,0,0,1,0,0,50,0,0 +30,2,186932,0,13,1,1,1,0,0,0,0,70,0,0 +65,1,223580,5,10,1,8,1,0,0,6514,0,40,0,1 +31,2,236861,1,9,1,10,1,0,0,0,0,60,0,0 +46,4,327886,6,12,1,0,1,0,0,0,0,40,0,0 +62,5,197060,9,11,1,1,1,0,0,0,0,50,0,0 +38,2,229180,0,13,0,1,4,0,1,0,0,40,1,0 +24,2,284317,0,13,0,4,3,0,1,0,0,30,0,0 +24,2,73514,5,10,0,5,0,2,1,0,0,50,11,0 +27,2,47907,0,13,0,3,0,0,1,0,0,48,0,0 +43,0,134782,6,12,3,4,4,0,1,0,0,30,0,0 +48,2,118831,1,9,2,2,4,2,1,0,0,40,27,0 +41,2,299505,1,9,4,10,0,1,0,0,0,40,0,0 +30,2,267161,5,10,1,9,2,1,1,0,0,45,0,0 +38,2,119177,0,13,1,5,1,0,0,0,0,40,0,1 +45,2,327886,10,15,0,3,0,0,0,0,0,40,0,1 +45,2,187730,0,13,0,3,3,0,0,0,0,40,0,0 +55,2,109015,5,10,2,0,0,0,1,0,0,38,0,0 +46,1,110015,7,4,1,1,1,0,0,0,0,75,34,0 +24,2,104146,0,13,0,3,3,2,0,0,0,40,0,0 +31,4,50442,5,10,0,0,3,3,1,0,0,25,0,0 +35,2,57640,1,9,1,10,1,0,0,0,0,35,0,0 +37,4,333664,5,10,4,0,0,0,1,0,0,40,0,0 +29,2,224858,5,10,1,3,1,0,0,0,0,45,0,0 +56,2,290641,0,13,1,1,1,0,0,0,0,50,0,1 +25,2,34402,0,13,0,1,0,0,0,0,1590,60,0,0 +33,2,245378,12,6,1,8,1,0,0,0,0,40,0,0 +44,2,179136,1,9,0,5,0,0,1,0,0,40,0,0 +21,2,116788,1,9,0,10,3,0,0,0,0,40,0,0 +21,2,129699,1,9,0,0,0,0,0,0,0,40,0,0 +46,3,39606,3,14,1,1,1,0,0,0,0,40,7,1 +44,5,95150,5,10,1,1,1,0,0,0,0,50,0,1 +63,2,102479,0,13,2,1,0,0,1,0,0,40,0,0 +44,2,199191,1,9,1,0,2,0,1,0,0,30,0,0 +31,2,229636,5,10,1,10,1,0,0,0,0,45,4,0 +26,2,53833,5,10,1,1,1,0,0,0,0,42,0,0 +37,5,27997,1,9,0,6,0,0,0,0,0,50,0,0 +33,2,111363,0,13,1,10,1,0,0,0,0,45,0,0 +38,2,107630,0,13,1,1,1,0,0,0,0,40,0,0 +26,2,134287,9,11,0,5,3,0,1,0,0,35,0,0 +46,5,283004,9,11,2,1,4,2,1,0,0,63,15,0 +24,2,33616,1,9,0,4,4,0,1,0,0,35,0,0 +47,4,121124,3,14,1,3,1,0,0,0,0,35,0,1 +27,2,188189,5,10,0,9,0,0,1,0,0,30,0,0 +46,2,106255,5,10,1,10,1,0,0,0,0,40,0,0 +47,3,282830,6,12,1,0,1,1,0,0,0,40,0,1 +47,2,243904,1,9,2,0,4,0,0,0,0,40,6,0 +69,2,165017,1,9,6,8,4,0,0,2538,0,40,0,0 +32,2,131584,1,9,1,5,1,0,0,7298,0,40,0,1 +51,2,427781,1,9,1,6,1,1,0,0,0,40,0,0 +36,2,334291,1,9,1,5,1,0,0,0,0,40,0,1 +50,4,173224,3,14,1,3,2,0,1,0,0,40,0,0 +29,2,87507,8,16,1,3,1,2,0,0,0,60,3,0 +32,2,187560,10,15,1,3,1,0,0,3908,0,40,0,0 +27,2,204497,12,6,2,6,0,3,0,0,0,75,0,0 +60,2,230545,7,4,2,0,0,0,1,0,0,35,1,0 +31,2,118161,1,9,1,4,1,0,0,0,0,40,0,0 +46,2,150499,6,12,1,10,1,0,0,0,0,40,0,0 +40,4,96554,1,9,0,0,3,0,1,0,0,40,0,0 +39,2,288551,5,10,1,10,1,1,0,0,0,52,0,1 +69,1,104003,7,4,1,5,1,0,0,0,0,55,0,0 +54,5,124963,0,13,1,1,1,0,0,0,0,40,0,1 +56,2,198388,1,9,2,0,0,0,1,0,0,40,0,0 +47,3,126204,5,10,2,0,0,0,1,0,0,40,0,0 +25,2,91709,6,12,0,9,0,0,1,0,0,45,0,0 +34,1,152109,1,9,1,6,1,0,0,0,0,60,0,0 +24,1,191954,7,4,0,7,3,0,0,0,0,50,0,0 +63,2,108097,5,10,1,10,1,0,0,10566,0,45,0,0 +29,4,289991,3,14,1,3,1,0,0,0,0,50,0,0 +64,2,92115,5,10,1,0,1,0,0,0,0,40,0,0 +44,2,320277,0,13,0,3,0,0,0,0,0,40,0,0 +26,2,33610,1,9,0,10,5,0,0,0,0,60,0,0 +36,2,168276,12,6,2,4,0,0,1,0,0,40,0,0 +55,0,175127,0,13,1,0,1,0,0,7688,0,38,0,1 +37,2,254973,1,9,1,2,2,0,1,0,0,40,0,1 +37,2,95336,12,6,0,8,0,0,0,0,0,65,0,0 +63,2,346975,0,13,1,3,2,0,1,7688,0,36,0,1 +33,2,227282,1,9,1,6,1,0,0,0,0,60,0,0 +19,2,138153,5,10,0,0,3,0,1,0,0,10,0,0 +57,4,174132,3,14,1,3,2,1,1,0,1977,40,0,1 +31,2,182237,6,12,1,5,1,0,0,4386,0,45,0,1 +58,4,217775,1,9,1,1,1,0,0,7298,0,40,0,1 +25,2,394503,5,10,1,5,1,0,0,0,0,40,0,0 +40,2,141657,1,9,2,0,4,0,1,0,0,40,0,0 +18,2,125441,2,7,0,4,3,0,0,1055,0,20,0,0 +26,2,172230,1,9,0,0,0,0,0,0,0,40,0,0 +29,2,282944,8,16,1,3,1,0,0,0,0,50,0,1 +45,4,55377,0,13,1,3,1,1,0,0,0,40,0,0 +35,0,49352,5,10,0,0,3,0,1,0,0,38,0,0 +32,2,213887,5,10,2,8,4,0,0,0,0,45,0,0 +61,1,24046,1,9,6,4,5,0,1,0,0,40,0,0 +26,0,208122,0,13,0,3,0,0,0,0,0,15,0,0 +56,2,176118,1,9,1,10,1,0,0,3103,0,40,0,1 +22,2,227994,5,10,3,0,3,2,1,0,0,39,0,0 +49,2,215389,0,13,1,8,1,1,0,0,0,48,0,0 +40,2,99434,1,9,1,4,2,0,1,0,0,12,0,0 +37,2,190964,1,9,4,1,3,0,0,0,0,40,0,0 +28,2,259840,0,13,1,5,1,0,0,0,0,60,0,1 +27,2,168827,1,9,1,8,1,0,0,0,0,40,0,0 +34,5,28984,9,11,2,5,4,0,1,0,0,40,0,0 +49,2,182211,4,5,1,2,1,0,0,0,0,45,0,0 +41,2,82393,5,10,0,10,3,2,0,0,0,40,0,0 +28,2,183639,0,13,0,0,0,0,0,0,0,21,0,0 +38,2,342448,5,10,1,1,1,0,0,0,0,55,0,1 +47,0,469907,6,12,1,11,1,0,0,0,1740,40,0,0 +28,4,211920,1,9,1,11,1,0,0,0,0,40,0,0 +44,0,33658,3,14,1,3,1,0,0,7688,0,50,0,1 +41,3,34178,0,13,2,3,0,0,0,0,0,40,0,0 +50,2,400630,10,15,1,3,1,0,0,0,0,36,0,1 +73,1,161251,1,9,6,10,0,0,0,0,0,24,0,0 +21,2,255685,5,10,0,4,3,1,0,0,0,40,31,0 +38,2,199256,1,9,2,0,4,0,1,0,0,40,0,0 +47,2,221666,5,10,2,9,4,0,1,0,0,40,0,0 +52,2,145409,5,10,1,6,1,0,0,15024,0,60,8,1 +24,2,39615,0,13,0,5,0,0,0,0,0,45,0,0 +44,2,104440,0,13,1,1,1,0,0,0,0,40,0,1 +27,2,151382,7,4,2,8,4,0,0,0,974,40,0,0 +61,1,503675,5,10,1,5,1,1,0,0,0,60,0,1 +58,2,306233,0,13,1,5,1,0,0,15024,0,40,0,1 +51,2,216475,0,13,0,5,0,0,1,0,1564,43,0,1 +49,2,50748,5,10,2,5,4,0,1,0,0,55,7,0 +23,2,107190,5,10,0,0,3,1,0,0,0,20,0,0 +19,2,206874,9,11,0,0,3,1,1,0,0,40,0,0 +21,2,83141,1,9,0,7,0,0,0,0,0,53,0,0 +56,2,444089,2,7,2,5,0,0,1,0,0,40,0,0 +35,2,141896,14,8,1,10,1,0,0,0,0,40,0,0 +37,3,33487,5,10,2,9,4,3,1,0,0,20,0,0 +41,2,65372,8,16,2,5,4,0,1,0,0,50,0,1 +30,2,341346,2,7,1,5,1,0,0,0,0,40,0,0 +47,2,287480,5,10,1,10,1,0,0,0,0,40,0,0 +59,5,107287,12,6,6,1,4,0,1,0,2559,50,0,1 +55,2,199067,2,7,1,8,1,0,0,0,0,32,0,0 +31,2,159737,12,6,0,0,4,1,1,0,0,40,0,0 +30,2,110643,3,14,1,0,1,0,0,4386,0,40,0,1 +24,2,117583,0,13,0,1,3,0,0,0,0,48,0,0 +49,1,43479,5,10,1,10,1,0,0,0,0,40,0,0 +23,2,203003,7,4,0,10,0,0,0,0,0,25,9,0 +50,2,133963,1,9,2,0,4,0,1,0,0,35,0,0 +38,2,227794,0,13,0,0,0,1,0,0,0,40,0,0 +20,1,112137,5,10,0,3,5,2,1,0,0,20,27,0 +49,1,110457,5,10,1,10,1,0,0,0,0,50,0,1 +45,2,281565,1,9,6,4,5,2,1,0,0,50,27,0 +46,3,297906,0,13,1,3,1,2,0,0,0,50,0,1 +19,2,151506,1,9,0,4,3,0,1,0,0,30,0,0 +31,3,139455,0,13,0,1,3,0,1,0,0,40,1,0 +38,2,26987,1,9,2,4,4,0,1,0,0,40,0,0 +56,1,233312,3,14,1,10,1,0,0,0,0,50,0,1 +24,2,161092,0,13,0,1,3,0,0,0,0,40,0,0 +58,4,98361,1,9,1,1,1,0,0,0,0,50,0,0 +28,2,188928,1,9,1,4,1,0,0,0,0,40,0,0 +22,2,164922,1,9,1,4,1,0,0,0,0,40,0,0 +46,2,185673,1,9,2,6,0,0,0,0,0,40,0,0 +30,2,193598,13,1,0,7,0,0,0,0,0,40,4,0 +56,2,274111,0,13,1,0,1,0,0,0,0,45,0,1 +56,2,160932,1,9,1,6,1,0,0,0,0,44,0,1 +50,2,44368,5,10,1,1,1,0,0,0,0,40,0,0 +30,2,280927,0,13,0,0,0,0,1,0,0,40,0,0 +24,2,222993,1,9,0,8,3,0,0,0,0,40,0,0 +42,3,25240,9,11,2,3,4,3,1,0,0,40,0,0 +31,1,204052,1,9,1,10,1,0,0,0,0,40,0,1 +46,2,169042,12,6,0,4,0,0,1,0,0,25,16,0 +31,2,104509,0,13,0,5,0,0,1,0,0,65,0,1 +38,4,185394,0,13,1,3,2,0,1,7688,0,40,0,1 +44,4,254146,3,14,1,3,1,0,0,0,0,40,0,1 +55,5,227856,0,13,1,1,1,0,0,0,2415,50,0,1 +19,2,183041,1,9,0,4,3,0,0,0,0,20,0,0 +45,2,107682,3,14,2,1,0,0,1,0,0,40,0,1 +50,5,287598,5,10,1,10,1,0,0,0,0,70,0,0 +53,2,182186,4,5,1,4,1,0,0,0,0,40,21,0 +41,5,194636,0,13,1,5,1,0,0,99999,0,65,0,1 +45,2,112305,5,10,2,4,4,1,1,0,0,40,0,0 +21,2,212661,12,6,0,0,0,0,1,0,0,39,0,0 +37,2,32709,0,13,1,9,2,0,1,0,0,40,0,1 +42,3,46366,1,9,4,0,4,1,1,0,0,40,0,0 +37,1,24106,1,9,1,9,1,0,0,0,0,30,0,0 +45,1,40666,9,11,1,7,1,0,0,0,0,60,0,0 +32,2,182975,5,10,0,9,0,0,1,0,0,20,0,0 +30,2,345122,10,15,1,3,1,0,0,0,0,50,0,0 +37,2,120045,1,9,2,8,0,0,1,0,0,56,0,0 +32,2,152940,5,10,1,5,1,0,0,0,0,40,0,1 +43,2,243580,0,13,1,3,1,0,0,0,0,40,0,1 +46,2,182128,3,14,2,3,4,0,1,6497,0,50,0,0 +33,2,101562,3,14,0,1,0,0,1,0,0,40,0,0 +48,2,108699,1,9,0,0,0,0,1,0,0,40,0,0 +34,2,175878,1,9,1,5,1,0,1,0,0,40,0,0 +34,4,177675,5,10,0,11,0,0,0,0,0,50,0,1 +33,2,213887,1,9,2,7,0,0,0,0,0,40,0,0 +36,2,357619,0,13,1,1,2,0,1,0,0,60,9,0 +23,2,435835,1,9,0,5,0,0,0,0,1669,55,0,0 +39,2,165799,1,9,1,1,1,0,0,0,0,40,0,0 +22,2,71469,6,12,0,5,3,0,1,0,0,25,0,0 +19,2,229745,1,9,0,7,3,0,0,0,0,20,0,0 +47,2,284916,1,9,1,5,1,0,0,7298,0,45,0,1 +46,2,28419,9,11,0,6,0,0,0,0,0,50,0,0 +47,2,26950,3,14,2,5,0,0,1,0,0,6,0,0 +47,1,107231,8,16,1,3,1,0,0,0,0,35,0,1 +52,4,512103,5,10,2,6,0,0,1,0,0,40,0,0 +38,1,245090,4,5,1,10,1,0,0,0,0,40,4,0 +58,2,314153,1,9,1,5,1,0,0,0,0,40,0,1 +32,2,243988,11,3,1,4,1,0,0,0,0,40,4,0 +54,1,82551,9,11,1,9,5,0,1,0,0,10,0,0 +20,2,42706,5,10,0,0,0,0,0,0,0,25,0,0 +25,2,235795,6,12,0,5,0,0,0,0,0,48,0,0 +25,1,108001,4,5,0,10,0,0,0,0,0,15,0,0 +36,0,112497,0,13,2,3,0,0,0,0,1876,44,0,0 +69,1,128206,1,9,1,9,1,0,0,0,0,30,0,0 +28,2,224634,0,13,1,3,2,0,1,0,0,45,0,1 +20,2,362999,5,10,0,0,3,0,1,0,0,20,0,0 +21,2,346693,7,4,0,7,4,0,0,0,0,40,0,0 +37,2,175759,0,13,1,9,1,0,0,0,0,40,0,1 +21,2,99199,1,9,0,8,3,0,0,0,0,32,0,0 +39,2,143445,1,9,1,4,5,1,1,0,0,40,0,0 +34,2,118710,9,11,1,4,1,0,0,0,0,40,0,1 +33,4,224185,1,9,1,10,1,0,0,0,0,40,0,0 +47,2,118972,1,9,1,6,1,0,0,0,0,50,0,1 +29,2,165360,9,11,0,0,0,0,1,0,0,40,0,0 +48,2,38950,1,9,1,9,1,0,0,0,0,89,0,0 +42,5,277256,8,16,1,3,1,0,0,0,1977,60,0,1 +29,2,247151,2,7,2,8,4,0,1,0,0,40,0,0 +34,2,213722,1,9,0,2,3,0,0,0,0,40,0,0 +20,2,209955,5,10,0,4,3,0,0,0,0,25,0,0 +41,2,174395,3,14,1,3,1,0,0,0,0,40,0,1 +45,2,138626,5,10,2,1,0,0,0,0,1876,50,0,0 +23,2,200207,1,9,2,2,3,0,0,0,0,44,0,0 +19,2,156587,5,10,0,0,3,0,1,0,0,38,0,0 +24,2,33016,5,10,0,10,3,0,0,0,0,40,0,0 +32,2,153588,1,9,2,10,0,0,0,0,0,40,0,0 +52,2,99736,3,14,2,3,4,0,0,15020,0,50,0,1 +36,2,284166,1,9,0,5,4,0,0,0,0,60,0,1 +18,2,716066,12,6,0,8,3,0,0,0,0,30,0,0 +27,2,188519,1,9,2,5,3,0,1,0,0,40,0,0 +26,2,109080,5,10,1,5,1,0,0,0,0,60,0,0 +52,2,174421,6,12,2,3,4,0,1,0,0,32,0,0 +24,2,259351,5,10,0,10,4,3,0,0,0,40,4,0 +42,3,284403,1,9,2,0,0,1,0,0,0,40,0,0 +39,2,85319,10,15,1,3,2,0,1,7688,0,60,0,1 +20,0,340475,5,10,0,0,3,0,1,0,0,10,0,0 +35,2,170617,1,9,0,8,4,1,1,0,0,48,0,0 +54,2,94055,0,13,1,4,1,0,0,0,0,40,0,0 +24,2,117779,0,13,0,1,3,0,0,0,0,40,0,0 +24,2,209770,0,13,0,3,0,0,1,0,0,8,0,0 +20,2,317443,5,10,0,0,3,1,1,0,0,15,0,0 +28,2,107411,0,13,0,3,0,0,1,0,0,35,0,0 +36,1,122493,1,9,1,10,1,0,0,0,0,47,0,0 +38,2,101978,5,10,4,8,0,0,0,0,2258,55,0,1 +22,2,335453,1,9,0,0,0,0,1,0,0,60,0,0 +56,2,318329,1,9,1,8,1,0,0,0,0,40,0,0 +24,2,100321,0,13,1,3,1,0,0,0,0,45,0,0 +24,1,81145,5,10,0,4,0,0,1,0,0,75,0,0 +22,2,62865,6,12,0,0,0,0,1,0,0,40,0,0 +21,2,176262,5,10,0,1,3,0,1,0,0,30,0,0 +42,2,168103,0,13,1,1,1,0,0,0,0,40,0,1 +41,4,208174,3,14,2,3,4,0,1,0,0,55,0,0 +19,2,188815,1,9,0,4,3,0,1,34095,0,20,0,0 +67,1,226092,5,10,1,7,1,0,0,0,0,44,0,0 +20,2,212668,5,10,0,5,3,0,1,0,0,30,0,0 +32,2,381583,1,9,1,10,1,4,0,0,0,40,0,0 +46,2,239439,1,9,4,8,3,1,1,0,0,40,0,0 +52,2,172493,1,9,0,5,0,0,1,0,0,36,0,0 +44,2,239876,0,13,2,3,4,1,0,0,0,40,0,0 +37,4,218184,0,13,1,3,1,0,0,0,1887,40,0,1 +27,1,206889,5,10,1,7,1,0,0,0,0,50,0,0 +35,2,110668,1,9,1,8,2,1,1,0,0,35,0,0 +30,2,211028,1,9,0,0,0,0,1,0,0,45,0,0 +64,4,202984,1,9,1,10,1,0,0,3137,0,40,0,0 +48,2,20296,1,9,2,0,0,0,1,0,0,37,0,1 +35,2,194690,7,4,2,9,4,0,1,0,0,40,0,0 +28,1,204984,0,13,0,9,0,0,0,0,0,45,0,0 +63,1,35021,0,13,1,3,1,2,0,0,1977,32,26,1 +40,1,238574,10,15,1,3,1,0,0,0,0,55,0,1 +33,2,345360,5,10,0,5,0,0,0,0,0,40,0,0 +40,2,192381,5,10,1,10,1,0,0,0,0,50,0,1 +25,2,479765,7,4,0,5,5,0,0,0,0,45,24,0 +45,5,34091,0,13,1,1,1,0,0,0,0,38,0,1 +30,2,151773,5,10,1,8,1,0,0,0,0,40,0,1 +53,2,299080,5,10,0,0,4,1,1,0,0,40,0,0 +63,2,135339,1,9,1,0,1,2,0,2105,0,40,36,0 +27,4,52156,5,10,1,11,1,0,0,0,0,60,0,0 +31,2,318647,2,7,0,10,0,0,0,0,0,40,0,0 +33,2,80145,1,9,1,6,1,0,0,0,0,60,0,0 +39,0,343646,0,13,2,11,0,0,0,0,0,40,4,1 +42,1,198692,5,10,1,10,1,0,0,0,0,45,0,1 +19,2,266635,1,9,0,4,3,1,0,0,0,30,0,0 +31,2,197672,0,13,1,3,1,0,0,0,0,40,0,0 +53,2,185846,1,9,1,10,1,0,0,0,0,40,0,0 +47,1,315110,5,10,1,3,1,0,0,0,0,20,0,0 +27,2,220754,8,16,0,0,3,0,1,0,0,40,0,0 +22,2,64292,1,9,0,9,0,0,1,0,0,40,0,0 +29,2,126060,1,9,1,5,2,0,1,0,0,40,0,1 +52,2,78012,1,9,6,5,4,0,1,0,1762,40,0,0 +32,2,210562,9,11,2,10,3,0,0,0,0,46,0,0 +23,2,350181,1,9,0,5,0,0,0,0,0,40,0,0 +27,2,233421,5,10,0,0,3,0,0,0,0,20,0,0 +53,2,167170,1,9,6,8,0,1,1,0,0,40,0,0 +18,2,260801,1,9,0,2,3,0,0,0,0,20,0,0 +41,2,173370,0,13,4,5,4,0,1,0,0,30,0,0 +27,2,135520,1,9,1,8,2,0,1,0,0,40,21,0 +30,2,121308,5,10,2,5,3,0,0,0,0,40,0,0 +41,2,444743,1,9,2,9,4,0,1,0,0,40,0,0 +21,2,65225,5,10,0,0,0,0,1,0,0,30,0,0 +58,0,136982,1,9,3,4,4,1,1,0,0,40,6,0 +45,0,271962,0,13,2,11,0,0,1,0,0,40,0,0 +40,2,204046,12,6,2,6,3,0,0,0,0,40,0,0 +21,2,225823,5,10,0,0,0,0,1,0,0,40,0,0 +29,2,183009,0,13,0,3,0,4,1,0,1590,40,0,0 +50,2,121038,9,11,1,4,2,1,1,0,0,40,0,0 +26,2,49092,1,9,1,10,1,0,0,0,0,40,0,0 +23,2,148709,1,9,4,2,5,0,1,0,0,40,0,0 +27,2,209205,0,13,0,9,3,0,0,0,0,40,0,0 +36,4,285865,0,13,0,0,0,1,1,0,0,40,0,0 +22,3,216129,1,9,0,0,5,0,0,0,0,40,0,0 +37,3,40955,5,10,0,4,3,0,0,0,0,40,28,0 +54,2,197189,0,13,1,6,1,0,0,0,0,40,0,0 +36,2,33001,1,9,2,7,4,0,0,0,0,50,0,0 +44,2,227399,9,11,1,1,1,1,0,0,0,40,0,0 +38,2,164050,5,10,1,11,1,1,0,0,0,40,0,1 +49,2,259087,5,10,2,10,0,0,1,0,0,40,0,0 +18,2,236262,2,7,0,2,3,0,0,0,0,12,0,0 +26,2,177929,0,13,0,5,0,0,0,0,0,48,0,0 +32,2,199963,2,7,1,8,2,0,1,0,0,40,0,0 +35,0,98776,1,9,0,9,3,0,0,0,0,40,0,0 +40,2,135056,1,9,0,0,0,0,1,0,0,45,0,0 +40,1,55363,1,9,1,10,1,0,0,3411,0,40,0,0 +42,0,102343,10,15,1,3,1,2,0,0,0,72,3,1 +30,2,231263,1,9,1,5,1,0,0,0,0,40,0,0 +19,2,226913,5,10,0,5,3,0,1,0,0,20,0,0 +36,2,129573,6,12,1,5,1,0,0,0,0,60,0,1 +31,2,191001,1,9,0,5,0,0,1,0,0,40,0,0 +50,3,69345,6,12,1,1,1,0,0,0,0,60,0,0 +38,2,204556,1,9,2,10,0,1,0,0,0,40,0,0 +35,2,192626,5,10,1,3,1,0,0,0,0,50,0,1 +45,2,202812,0,13,1,3,1,0,0,0,0,40,0,1 +29,2,405177,12,6,4,5,4,0,1,0,0,40,0,0 +41,2,227890,5,10,2,10,0,0,0,0,0,46,0,1 +33,2,101352,10,15,0,3,0,0,1,0,0,50,0,1 +49,2,82572,5,10,0,4,0,0,1,0,0,60,0,0 +28,2,132686,5,10,1,1,1,0,0,0,0,40,0,1 +49,4,149210,0,13,1,11,1,1,0,15024,0,40,0,1 +27,2,245661,1,9,4,8,3,0,1,0,0,40,0,0 +47,5,483596,1,9,1,1,1,0,0,2885,0,32,0,0 +42,0,104663,8,16,0,1,0,0,1,0,0,40,25,1 +30,2,347166,1,9,0,1,0,0,0,0,0,60,0,0 +37,4,108540,1,9,1,10,1,0,0,0,0,40,0,0 +37,2,333305,8,16,1,3,2,0,1,0,0,35,0,0 +51,2,155408,1,9,3,5,0,1,1,0,0,38,0,0 +27,3,246372,1,9,1,4,1,0,0,0,0,40,0,0 +53,2,30290,1,9,0,5,0,0,1,0,0,40,0,0 +45,2,347321,1,9,0,10,0,0,0,0,0,40,0,0 +37,5,205852,0,13,1,3,1,0,0,0,0,45,0,0 +54,0,93449,3,14,1,3,1,2,0,0,0,40,3,1 +47,5,116927,1,9,1,1,1,0,0,0,0,42,0,1 +35,2,164526,1,9,1,4,1,0,0,0,0,40,29,1 +33,2,31573,1,9,1,8,1,0,0,0,0,40,0,0 +28,4,125159,5,10,0,0,5,1,0,0,0,40,19,0 +39,0,201105,0,13,1,1,2,0,1,0,0,55,0,1 +33,2,150570,0,13,1,5,1,0,0,0,0,40,0,0 +34,2,118941,2,7,0,4,0,0,1,0,0,40,38,0 +53,2,141388,1,9,1,6,1,0,0,0,0,40,0,1 diff --git a/cmake-build-debug-wsl/cmake_install.cmake b/cmake-build-debug-wsl/cmake_install.cmake new file mode 100644 index 0000000..25dd220 --- /dev/null +++ b/cmake-build-debug-wsl/cmake_install.cmake @@ -0,0 +1,49 @@ +# Install script for directory: /home/ryazur/src/PhysicsFormula + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "/home/ryazur/src/PhysicsFormula/cmake-build-debug-wsl/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/cmake-build-debug-wsl/frictionCoeff.txt b/cmake-build-debug-wsl/frictionCoeff.txt new file mode 100644 index 0000000..7f7b17c --- /dev/null +++ b/cmake-build-debug-wsl/frictionCoeff.txt @@ -0,0 +1,26 @@ +static_rubber_concrete_dry 1.0 +static_rubber_concrete_wet .7 +static_wood_wood .5 +static_waxedWood_wetSnow .14 +static_metal_wood .5 +static_steel_steel_dry .6 +static_steel_steel_oiled .05 +static_teflon_steel .04 +static_bone_lubricated_synovial_fluid .016 +static_shoes_wood .9 +static_shoes_ice .1 +static_ice_ice .1 +static_steel_ice 0.4 +kinetic_rubber_concrete_dry .7 +kinetic_rubber_concrete_wet .5 +kinetic_wood_wood .3 +kinetic_waxedWood_wetSnow .1 +kinetic_metal_wood .3 +kinetic_steel_steel_dry .3 +kinetic_steel_steel_oiled .03 +kinetic_teflon_steel = .4 +kinetic_bone_lubricated_synovial_fluid .015 +kinetic_shoes_wood .5 +kinetic_shoes_ice .5 +kinetic_ice_ice .03 +kinetic_steel_ice .04 \ No newline at end of file diff --git a/cmake-build-debug-wsl/winedata.csv b/cmake-build-debug-wsl/winedata.csv new file mode 100644 index 0000000..1661391 --- /dev/null +++ b/cmake-build-debug-wsl/winedata.csv @@ -0,0 +1,1599 @@ +7.4,0.7,0.0,1.9,0.076,11.0,34.0,0.9978,3.51,0.56,9.4,5 +7.8,0.88,0.0,2.6,0.098,25.0,67.0,0.9968,3.2,0.68,9.8,5 +7.8,0.76,0.04,2.3,0.092,15.0,54.0,0.997,3.26,0.65,9.8,5 +11.2,0.28,0.56,1.9,0.075,17.0,60.0,0.998,3.16,0.58,9.8,6 +7.4,0.7,0.0,1.9,0.076,11.0,34.0,0.9978,3.51,0.56,9.4,5 +7.4,0.66,0.0,1.8,0.075,13.0,40.0,0.9978,3.51,0.56,9.4,5 +7.9,0.6,0.06,1.6,0.069,15.0,59.0,0.9964,3.3,0.46,9.4,5 +7.3,0.65,0.0,1.2,0.065,15.0,21.0,0.9946,3.39,0.47,10.0,7 +7.8,0.58,0.02,2.0,0.073,9.0,18.0,0.9968,3.36,0.57,9.5,7 +7.5,0.5,0.36,6.1,0.071,17.0,102.0,0.9978,3.35,0.8,10.5,5 +6.7,0.58,0.08,1.8,0.097,15.0,65.0,0.9959,3.28,0.54,9.2,5 +7.5,0.5,0.36,6.1,0.071,17.0,102.0,0.9978,3.35,0.8,10.5,5 +5.6,0.615,0.0,1.6,0.08900000000000001,16.0,59.0,0.9943,3.58,0.52,9.9,5 +7.8,0.61,0.29,1.6,0.114,9.0,29.0,0.9974,3.26,1.56,9.1,5 +8.9,0.62,0.18,3.8,0.17600000000000002,52.0,145.0,0.9986,3.16,0.88,9.2,5 +8.9,0.62,0.19,3.9,0.17,51.0,148.0,0.9986,3.17,0.93,9.2,5 +8.5,0.28,0.56,1.8,0.092,35.0,103.0,0.9969,3.3,0.75,10.5,7 +8.1,0.56,0.28,1.7,0.368,16.0,56.0,0.9968,3.11,1.28,9.3,5 +7.4,0.59,0.08,4.4,0.086,6.0,29.0,0.9974,3.38,0.5,9.0,4 +7.9,0.32,0.51,1.8,0.341,17.0,56.0,0.9969,3.04,1.08,9.2,6 +8.9,0.22,0.48,1.8,0.077,29.0,60.0,0.9968,3.39,0.53,9.4,6 +7.6,0.39,0.31,2.3,0.08199999999999999,23.0,71.0,0.9982,3.52,0.65,9.7,5 +7.9,0.43,0.21,1.6,0.106,10.0,37.0,0.9966,3.17,0.91,9.5,5 +8.5,0.49,0.11,2.3,0.084,9.0,67.0,0.9968,3.17,0.53,9.4,5 +6.9,0.4,0.14,2.4,0.085,21.0,40.0,0.9968,3.43,0.63,9.7,6 +6.3,0.39,0.16,1.4,0.08,11.0,23.0,0.9955,3.34,0.56,9.3,5 +7.6,0.41,0.24,1.8,0.08,4.0,11.0,0.9962,3.28,0.59,9.5,5 +7.9,0.43,0.21,1.6,0.106,10.0,37.0,0.9966,3.17,0.91,9.5,5 +7.1,0.71,0.0,1.9,0.08,14.0,35.0,0.9972,3.47,0.55,9.4,5 +7.8,0.645,0.0,2.0,0.08199999999999999,8.0,16.0,0.9964,3.38,0.59,9.8,6 +6.7,0.675,0.07,2.4,0.08900000000000001,17.0,82.0,0.9958,3.35,0.54,10.1,5 +6.9,0.685,0.0,2.5,0.105,22.0,37.0,0.9966,3.46,0.57,10.6,6 +8.3,0.655,0.12,2.3,0.083,15.0,113.0,0.9966,3.17,0.66,9.8,5 +6.9,0.605,0.12,10.7,0.073,40.0,83.0,0.9993,3.45,0.52,9.4,6 +5.2,0.32,0.25,1.8,0.103,13.0,50.0,0.9957,3.38,0.55,9.2,5 +7.8,0.645,0.0,5.5,0.086,5.0,18.0,0.9986,3.4,0.55,9.6,6 +7.8,0.6,0.14,2.4,0.086,3.0,15.0,0.9975,3.42,0.6,10.8,6 +8.1,0.38,0.28,2.1,0.066,13.0,30.0,0.9968,3.23,0.73,9.7,7 +5.7,1.13,0.09,1.5,0.172,7.0,19.0,0.994,3.5,0.48,9.8,4 +7.3,0.45,0.36,5.9,0.07400000000000001,12.0,87.0,0.9978,3.33,0.83,10.5,5 +7.3,0.45,0.36,5.9,0.07400000000000001,12.0,87.0,0.9978,3.33,0.83,10.5,5 +8.8,0.61,0.3,2.8,0.08800000000000001,17.0,46.0,0.9976,3.26,0.51,9.3,4 +7.5,0.49,0.2,2.6,0.332,8.0,14.0,0.9968,3.21,0.9,10.5,6 +8.1,0.66,0.22,2.2,0.069,9.0,23.0,0.9968,3.3,1.2,10.3,5 +6.8,0.67,0.02,1.8,0.05,5.0,11.0,0.9962,3.48,0.52,9.5,5 +4.6,0.52,0.15,2.1,0.054000000000000006,8.0,65.0,0.9934,3.9,0.56,13.1,4 +7.7,0.935,0.43,2.2,0.114,22.0,114.0,0.997,3.25,0.73,9.2,5 +8.7,0.29,0.52,1.6,0.113,12.0,37.0,0.9969,3.25,0.58,9.5,5 +6.4,0.4,0.23,1.6,0.066,5.0,12.0,0.9958,3.34,0.56,9.2,5 +5.6,0.31,0.37,1.4,0.07400000000000001,12.0,96.0,0.9954,3.32,0.58,9.2,5 +8.8,0.66,0.26,1.7,0.07400000000000001,4.0,23.0,0.9971,3.15,0.74,9.2,5 +6.6,0.52,0.04,2.2,0.069,8.0,15.0,0.9956,3.4,0.63,9.4,6 +6.6,0.5,0.04,2.1,0.068,6.0,14.0,0.9955,3.39,0.64,9.4,6 +8.6,0.38,0.36,3.0,0.081,30.0,119.0,0.997,3.2,0.56,9.4,5 +7.6,0.51,0.15,2.8,0.11,33.0,73.0,0.9955,3.17,0.63,10.2,6 +7.7,0.62,0.04,3.8,0.084,25.0,45.0,0.9978,3.34,0.53,9.5,5 +10.2,0.42,0.57,3.4,0.07,4.0,10.0,0.9971,3.04,0.63,9.6,5 +7.5,0.63,0.12,5.1,0.111,50.0,110.0,0.9983,3.26,0.77,9.4,5 +7.8,0.59,0.18,2.3,0.076,17.0,54.0,0.9975,3.43,0.59,10.0,5 +7.3,0.39,0.31,2.4,0.07400000000000001,9.0,46.0,0.9962,3.41,0.54,9.4,6 +8.8,0.4,0.4,2.2,0.079,19.0,52.0,0.998,3.44,0.64,9.2,5 +7.7,0.69,0.49,1.8,0.115,20.0,112.0,0.9968,3.21,0.71,9.3,5 +7.5,0.52,0.16,1.9,0.085,12.0,35.0,0.9968,3.38,0.62,9.5,7 +7.0,0.735,0.05,2.0,0.081,13.0,54.0,0.9966,3.39,0.57,9.8,5 +7.2,0.725,0.05,4.65,0.086,4.0,11.0,0.9962,3.41,0.39,10.9,5 +7.2,0.725,0.05,4.65,0.086,4.0,11.0,0.9962,3.41,0.39,10.9,5 +7.5,0.52,0.11,1.5,0.079,11.0,39.0,0.9968,3.42,0.58,9.6,5 +6.6,0.705,0.07,1.6,0.076,6.0,15.0,0.9962,3.44,0.58,10.7,5 +9.3,0.32,0.57,2.0,0.07400000000000001,27.0,65.0,0.9969,3.28,0.79,10.7,5 +8.0,0.705,0.05,1.9,0.07400000000000001,8.0,19.0,0.9962,3.34,0.95,10.5,6 +7.7,0.63,0.08,1.9,0.076,15.0,27.0,0.9967,3.32,0.54,9.5,6 +7.7,0.67,0.23,2.1,0.08800000000000001,17.0,96.0,0.9962,3.32,0.48,9.5,5 +7.7,0.69,0.22,1.9,0.084,18.0,94.0,0.9961,3.31,0.48,9.5,5 +8.3,0.675,0.26,2.1,0.084,11.0,43.0,0.9976,3.31,0.53,9.2,4 +9.7,0.32,0.54,2.5,0.094,28.0,83.0,0.9984,3.28,0.82,9.6,5 +8.8,0.41,0.64,2.2,0.093,9.0,42.0,0.9986,3.54,0.66,10.5,5 +8.8,0.41,0.64,2.2,0.093,9.0,42.0,0.9986,3.54,0.66,10.5,5 +6.8,0.785,0.0,2.4,0.104,14.0,30.0,0.9966,3.52,0.55,10.7,6 +6.7,0.75,0.12,2.0,0.086,12.0,80.0,0.9958,3.38,0.52,10.1,5 +8.3,0.625,0.2,1.5,0.08,27.0,119.0,0.9972,3.16,1.12,9.1,4 +6.2,0.45,0.2,1.6,0.069,3.0,15.0,0.9958,3.41,0.56,9.2,5 +7.8,0.43,0.7,1.9,0.464,22.0,67.0,0.9974,3.13,1.28,9.4,5 +7.4,0.5,0.47,2.0,0.086,21.0,73.0,0.997,3.36,0.57,9.1,5 +7.3,0.67,0.26,1.8,0.401,16.0,51.0,0.9969,3.16,1.14,9.4,5 +6.3,0.3,0.48,1.8,0.069,18.0,61.0,0.9959,3.44,0.78,10.3,6 +6.9,0.55,0.15,2.2,0.076,19.0,40.0,0.9961,3.41,0.59,10.1,5 +8.6,0.49,0.28,1.9,0.11,20.0,136.0,0.9972,2.93,1.95,9.9,6 +7.7,0.49,0.26,1.9,0.062,9.0,31.0,0.9966,3.39,0.64,9.6,5 +9.3,0.39,0.44,2.1,0.107,34.0,125.0,0.9978,3.14,1.22,9.5,5 +7.0,0.62,0.08,1.8,0.076,8.0,24.0,0.9978,3.48,0.53,9.0,5 +7.9,0.52,0.26,1.9,0.079,42.0,140.0,0.9964,3.23,0.54,9.5,5 +8.6,0.49,0.28,1.9,0.11,20.0,136.0,0.9972,2.93,1.95,9.9,6 +8.6,0.49,0.29,2.0,0.11,19.0,133.0,0.9972,2.93,1.98,9.8,5 +7.7,0.49,0.26,1.9,0.062,9.0,31.0,0.9966,3.39,0.64,9.6,5 +5.0,1.02,0.04,1.4,0.045,41.0,85.0,0.9938,3.75,0.48,10.5,4 +4.7,0.6,0.17,2.3,0.058,17.0,106.0,0.9932,3.85,0.6,12.9,6 +6.8,0.775,0.0,3.0,0.102,8.0,23.0,0.9965,3.45,0.56,10.7,5 +7.0,0.5,0.25,2.0,0.07,3.0,22.0,0.9963,3.25,0.63,9.2,5 +7.6,0.9,0.06,2.5,0.079,5.0,10.0,0.9967,3.39,0.56,9.8,5 +8.1,0.545,0.18,1.9,0.08,13.0,35.0,0.9972,3.3,0.59,9.0,6 +8.3,0.61,0.3,2.1,0.084,11.0,50.0,0.9972,3.4,0.61,10.2,6 +7.8,0.5,0.3,1.9,0.075,8.0,22.0,0.9959,3.31,0.56,10.4,6 +8.1,0.545,0.18,1.9,0.08,13.0,35.0,0.9972,3.3,0.59,9.0,6 +8.1,0.575,0.22,2.1,0.077,12.0,65.0,0.9967,3.29,0.51,9.2,5 +7.2,0.49,0.24,2.2,0.07,5.0,36.0,0.996,3.33,0.48,9.4,5 +8.1,0.575,0.22,2.1,0.077,12.0,65.0,0.9967,3.29,0.51,9.2,5 +7.8,0.41,0.68,1.7,0.467,18.0,69.0,0.9973,3.08,1.31,9.3,5 +6.2,0.63,0.31,1.7,0.08800000000000001,15.0,64.0,0.9969,3.46,0.79,9.3,5 +8.0,0.33,0.53,2.5,0.091,18.0,80.0,0.9976,3.37,0.8,9.6,6 +8.1,0.785,0.52,2.0,0.122,37.0,153.0,0.9969,3.21,0.69,9.3,5 +7.8,0.56,0.19,1.8,0.104,12.0,47.0,0.9964,3.19,0.93,9.5,5 +8.4,0.62,0.09,2.2,0.084,11.0,108.0,0.9964,3.15,0.66,9.8,5 +8.4,0.6,0.1,2.2,0.085,14.0,111.0,0.9964,3.15,0.66,9.8,5 +10.1,0.31,0.44,2.3,0.08,22.0,46.0,0.9988,3.32,0.67,9.7,6 +7.8,0.56,0.19,1.8,0.104,12.0,47.0,0.9964,3.19,0.93,9.5,5 +9.4,0.4,0.31,2.2,0.09,13.0,62.0,0.9966,3.07,0.63,10.5,6 +8.3,0.54,0.28,1.9,0.077,11.0,40.0,0.9978,3.39,0.61,10.0,6 +7.8,0.56,0.12,2.0,0.08199999999999999,7.0,28.0,0.997,3.37,0.5,9.4,6 +8.8,0.55,0.04,2.2,0.119,14.0,56.0,0.9962,3.21,0.6,10.9,6 +7.0,0.69,0.08,1.8,0.097,22.0,89.0,0.9959,3.34,0.54,9.2,6 +7.3,1.07,0.09,1.7,0.17800000000000002,10.0,89.0,0.9962,3.3,0.57,9.0,5 +8.8,0.55,0.04,2.2,0.119,14.0,56.0,0.9962,3.21,0.6,10.9,6 +7.3,0.695,0.0,2.5,0.075,3.0,13.0,0.998,3.49,0.52,9.2,5 +8.0,0.71,0.0,2.6,0.08,11.0,34.0,0.9976,3.44,0.53,9.5,5 +7.8,0.5,0.17,1.6,0.08199999999999999,21.0,102.0,0.996,3.39,0.48,9.5,5 +9.0,0.62,0.04,1.9,0.146,27.0,90.0,0.9984,3.16,0.7,9.4,5 +8.2,1.33,0.0,1.7,0.081,3.0,12.0,0.9964,3.53,0.49,10.9,5 +8.1,1.33,0.0,1.8,0.08199999999999999,3.0,12.0,0.9964,3.54,0.48,10.9,5 +8.0,0.59,0.16,1.8,0.065,3.0,16.0,0.9962,3.42,0.92,10.5,7 +6.1,0.38,0.15,1.8,0.07200000000000001,6.0,19.0,0.9955,3.42,0.57,9.4,5 +8.0,0.745,0.56,2.0,0.118,30.0,134.0,0.9968,3.24,0.66,9.4,5 +5.6,0.5,0.09,2.3,0.049,17.0,99.0,0.9937,3.63,0.63,13.0,5 +5.6,0.5,0.09,2.3,0.049,17.0,99.0,0.9937,3.63,0.63,13.0,5 +6.6,0.5,0.01,1.5,0.06,17.0,26.0,0.9952,3.4,0.58,9.8,6 +7.9,1.04,0.05,2.2,0.084,13.0,29.0,0.9959,3.22,0.55,9.9,6 +8.4,0.745,0.11,1.9,0.09,16.0,63.0,0.9965,3.19,0.82,9.6,5 +8.3,0.715,0.15,1.8,0.08900000000000001,10.0,52.0,0.9968,3.23,0.77,9.5,5 +7.2,0.415,0.36,2.0,0.081,13.0,45.0,0.9972,3.48,0.64,9.2,5 +7.8,0.56,0.19,2.1,0.081,15.0,105.0,0.9962,3.33,0.54,9.5,5 +7.8,0.56,0.19,2.0,0.081,17.0,108.0,0.9962,3.32,0.54,9.5,5 +8.4,0.745,0.11,1.9,0.09,16.0,63.0,0.9965,3.19,0.82,9.6,5 +8.3,0.715,0.15,1.8,0.08900000000000001,10.0,52.0,0.9968,3.23,0.77,9.5,5 +5.2,0.34,0.0,1.8,0.05,27.0,63.0,0.9916,3.68,0.79,14.0,6 +6.3,0.39,0.08,1.7,0.066,3.0,20.0,0.9954,3.34,0.58,9.4,5 +5.2,0.34,0.0,1.8,0.05,27.0,63.0,0.9916,3.68,0.79,14.0,6 +8.1,0.67,0.55,1.8,0.117,32.0,141.0,0.9968,3.17,0.62,9.4,5 +5.8,0.68,0.02,1.8,0.087,21.0,94.0,0.9944,3.54,0.52,10.0,5 +7.6,0.49,0.26,1.6,0.236,10.0,88.0,0.9968,3.11,0.8,9.3,5 +6.9,0.49,0.1,2.3,0.07400000000000001,12.0,30.0,0.9959,3.42,0.58,10.2,6 +8.2,0.4,0.44,2.8,0.08900000000000001,11.0,43.0,0.9975,3.53,0.61,10.5,6 +7.3,0.33,0.47,2.1,0.077,5.0,11.0,0.9958,3.33,0.53,10.3,6 +9.2,0.52,1.0,3.4,0.61,32.0,69.0,0.9996,2.74,2.0,9.4,4 +7.5,0.6,0.03,1.8,0.095,25.0,99.0,0.995,3.35,0.54,10.1,5 +7.5,0.6,0.03,1.8,0.095,25.0,99.0,0.995,3.35,0.54,10.1,5 +7.1,0.43,0.42,5.5,0.07,29.0,129.0,0.9973,3.42,0.72,10.5,5 +7.1,0.43,0.42,5.5,0.071,28.0,128.0,0.9973,3.42,0.71,10.5,5 +7.1,0.43,0.42,5.5,0.07,29.0,129.0,0.9973,3.42,0.72,10.5,5 +7.1,0.43,0.42,5.5,0.071,28.0,128.0,0.9973,3.42,0.71,10.5,5 +7.1,0.68,0.0,2.2,0.073,12.0,22.0,0.9969,3.48,0.5,9.3,5 +6.8,0.6,0.18,1.9,0.079,18.0,86.0,0.9968,3.59,0.57,9.3,6 +7.6,0.95,0.03,2.0,0.09,7.0,20.0,0.9959,3.2,0.56,9.6,5 +7.6,0.68,0.02,1.3,0.07200000000000001,9.0,20.0,0.9965,3.17,1.08,9.2,4 +7.8,0.53,0.04,1.7,0.076,17.0,31.0,0.9964,3.33,0.56,10.0,6 +7.4,0.6,0.26,7.3,0.07,36.0,121.0,0.9982,3.37,0.49,9.4,5 +7.3,0.59,0.26,7.2,0.07,35.0,121.0,0.9981,3.37,0.49,9.4,5 +7.8,0.63,0.48,1.7,0.1,14.0,96.0,0.9961,3.19,0.62,9.5,5 +6.8,0.64,0.1,2.1,0.085,18.0,101.0,0.9956,3.34,0.52,10.2,5 +7.3,0.55,0.03,1.6,0.07200000000000001,17.0,42.0,0.9956,3.37,0.48,9.0,4 +6.8,0.63,0.07,2.1,0.08900000000000001,11.0,44.0,0.9953,3.47,0.55,10.4,6 +7.5,0.705,0.24,1.8,0.36,15.0,63.0,0.9964,3.0,1.59,9.5,5 +7.9,0.885,0.03,1.8,0.058,4.0,8.0,0.9972,3.36,0.33,9.1,4 +8.0,0.42,0.17,2.0,0.073,6.0,18.0,0.9972,3.29,0.61,9.2,6 +8.0,0.42,0.17,2.0,0.073,6.0,18.0,0.9972,3.29,0.61,9.2,6 +7.4,0.62,0.05,1.9,0.068,24.0,42.0,0.9961,3.42,0.57,11.5,6 +7.3,0.38,0.21,2.0,0.08,7.0,35.0,0.9961,3.33,0.47,9.5,5 +6.9,0.5,0.04,1.5,0.085,19.0,49.0,0.9958,3.35,0.78,9.5,5 +7.3,0.38,0.21,2.0,0.08,7.0,35.0,0.9961,3.33,0.47,9.5,5 +7.5,0.52,0.42,2.3,0.087,8.0,38.0,0.9972,3.58,0.61,10.5,6 +7.0,0.805,0.0,2.5,0.068,7.0,20.0,0.9969,3.48,0.56,9.6,5 +8.8,0.61,0.14,2.4,0.067,10.0,42.0,0.9969,3.19,0.59,9.5,5 +8.8,0.61,0.14,2.4,0.067,10.0,42.0,0.9969,3.19,0.59,9.5,5 +8.9,0.61,0.49,2.0,0.27,23.0,110.0,0.9972,3.12,1.02,9.3,5 +7.2,0.73,0.02,2.5,0.076,16.0,42.0,0.9972,3.44,0.52,9.3,5 +6.8,0.61,0.2,1.8,0.077,11.0,65.0,0.9971,3.54,0.58,9.3,5 +6.7,0.62,0.21,1.9,0.079,8.0,62.0,0.997,3.52,0.58,9.3,6 +8.9,0.31,0.57,2.0,0.111,26.0,85.0,0.9971,3.26,0.53,9.7,5 +7.4,0.39,0.48,2.0,0.08199999999999999,14.0,67.0,0.9972,3.34,0.55,9.2,5 +7.7,0.705,0.1,2.6,0.084,9.0,26.0,0.9976,3.39,0.49,9.7,5 +7.9,0.5,0.33,2.0,0.084,15.0,143.0,0.9968,3.2,0.55,9.5,5 +7.9,0.49,0.32,1.9,0.08199999999999999,17.0,144.0,0.9968,3.2,0.55,9.5,5 +8.2,0.5,0.35,2.9,0.077,21.0,127.0,0.9976,3.23,0.62,9.4,5 +6.4,0.37,0.25,1.9,0.07400000000000001,21.0,49.0,0.9974,3.57,0.62,9.8,6 +6.8,0.63,0.12,3.8,0.099,16.0,126.0,0.9969,3.28,0.61,9.5,5 +7.6,0.55,0.21,2.2,0.071,7.0,28.0,0.9964,3.28,0.55,9.7,5 +7.6,0.55,0.21,2.2,0.071,7.0,28.0,0.9964,3.28,0.55,9.7,5 +7.8,0.59,0.33,2.0,0.07400000000000001,24.0,120.0,0.9968,3.25,0.54,9.4,5 +7.3,0.58,0.3,2.4,0.07400000000000001,15.0,55.0,0.9968,3.46,0.59,10.2,5 +11.5,0.3,0.6,2.0,0.067,12.0,27.0,0.9981,3.11,0.97,10.1,6 +5.4,0.835,0.08,1.2,0.046,13.0,93.0,0.9924,3.57,0.85,13.0,7 +6.9,1.09,0.06,2.1,0.061,12.0,31.0,0.9948,3.51,0.43,11.4,4 +9.6,0.32,0.47,1.4,0.056,9.0,24.0,0.99695,3.22,0.82,10.3,7 +8.8,0.37,0.48,2.1,0.097,39.0,145.0,0.9975,3.04,1.03,9.3,5 +6.8,0.5,0.11,1.5,0.075,16.0,49.0,0.99545,3.36,0.79,9.5,5 +7.0,0.42,0.35,1.6,0.08800000000000001,16.0,39.0,0.9961,3.34,0.55,9.2,5 +7.0,0.43,0.36,1.6,0.08900000000000001,14.0,37.0,0.99615,3.34,0.56,9.2,6 +12.8,0.3,0.74,2.6,0.095,9.0,28.0,0.9994,3.2,0.77,10.8,7 +12.8,0.3,0.74,2.6,0.095,9.0,28.0,0.9994,3.2,0.77,10.8,7 +7.8,0.57,0.31,1.8,0.069,26.0,120.0,0.99625,3.29,0.53,9.3,5 +7.8,0.44,0.28,2.7,0.1,18.0,95.0,0.9966,3.22,0.67,9.4,5 +11.0,0.3,0.58,2.1,0.054000000000000006,7.0,19.0,0.998,3.31,0.88,10.5,7 +9.7,0.53,0.6,2.0,0.039,5.0,19.0,0.99585,3.3,0.86,12.4,6 +8.0,0.725,0.24,2.8,0.083,10.0,62.0,0.99685,3.35,0.56,10.0,6 +11.6,0.44,0.64,2.1,0.059,5.0,15.0,0.998,3.21,0.67,10.2,6 +8.2,0.57,0.26,2.2,0.06,28.0,65.0,0.9959,3.3,0.43,10.1,5 +7.8,0.735,0.08,2.4,0.092,10.0,41.0,0.9974,3.24,0.71,9.8,6 +7.0,0.49,0.49,5.6,0.06,26.0,121.0,0.9974,3.34,0.76,10.5,5 +8.7,0.625,0.16,2.0,0.101,13.0,49.0,0.9962,3.14,0.57,11.0,5 +8.1,0.725,0.22,2.2,0.07200000000000001,11.0,41.0,0.9967,3.36,0.55,9.1,5 +7.5,0.49,0.19,1.9,0.076,10.0,44.0,0.9957,3.39,0.54,9.7,5 +7.8,0.53,0.33,2.4,0.08,24.0,144.0,0.99655,3.3,0.6,9.5,5 +7.8,0.34,0.37,2.0,0.08199999999999999,24.0,58.0,0.9964,3.34,0.59,9.4,6 +7.4,0.53,0.26,2.0,0.101,16.0,72.0,0.9957,3.15,0.57,9.4,5 +6.8,0.61,0.04,1.5,0.057,5.0,10.0,0.99525,3.42,0.6,9.5,5 +8.6,0.645,0.25,2.0,0.083,8.0,28.0,0.99815,3.28,0.6,10.0,6 +8.4,0.635,0.36,2.0,0.08900000000000001,15.0,55.0,0.99745,3.31,0.57,10.4,4 +7.7,0.43,0.25,2.6,0.073,29.0,63.0,0.99615,3.37,0.58,10.5,6 +8.9,0.59,0.5,2.0,0.337,27.0,81.0,0.9964,3.04,1.61,9.5,6 +9.0,0.82,0.14,2.6,0.08900000000000001,9.0,23.0,0.9984,3.39,0.63,9.8,5 +7.7,0.43,0.25,2.6,0.073,29.0,63.0,0.99615,3.37,0.58,10.5,6 +6.9,0.52,0.25,2.6,0.081,10.0,37.0,0.99685,3.46,0.5,11.0,5 +5.2,0.48,0.04,1.6,0.054000000000000006,19.0,106.0,0.9927,3.54,0.62,12.2,7 +8.0,0.38,0.06,1.8,0.078,12.0,49.0,0.99625,3.37,0.52,9.9,6 +8.5,0.37,0.2,2.8,0.09,18.0,58.0,0.998,3.34,0.7,9.6,6 +6.9,0.52,0.25,2.6,0.081,10.0,37.0,0.99685,3.46,0.5,11.0,5 +8.2,1.0,0.09,2.3,0.065,7.0,37.0,0.99685,3.32,0.55,9.0,6 +7.2,0.63,0.0,1.9,0.097,14.0,38.0,0.99675,3.37,0.58,9.0,6 +7.2,0.63,0.0,1.9,0.097,14.0,38.0,0.99675,3.37,0.58,9.0,6 +7.2,0.645,0.0,1.9,0.097,15.0,39.0,0.99675,3.37,0.58,9.2,6 +7.2,0.63,0.0,1.9,0.097,14.0,38.0,0.99675,3.37,0.58,9.0,6 +8.2,1.0,0.09,2.3,0.065,7.0,37.0,0.99685,3.32,0.55,9.0,6 +8.9,0.635,0.37,1.7,0.263,5.0,62.0,0.9971,3.0,1.09,9.3,5 +12.0,0.38,0.56,2.1,0.093,6.0,24.0,0.99925,3.14,0.71,10.9,6 +7.7,0.58,0.1,1.8,0.102,28.0,109.0,0.99565,3.08,0.49,9.8,6 +15.0,0.21,0.44,2.2,0.075,10.0,24.0,1.00005,3.07,0.84,9.2,7 +15.0,0.21,0.44,2.2,0.075,10.0,24.0,1.00005,3.07,0.84,9.2,7 +7.3,0.66,0.0,2.0,0.084,6.0,23.0,0.9983,3.61,0.96,9.9,6 +7.1,0.68,0.07,1.9,0.075,16.0,51.0,0.99685,3.38,0.52,9.5,5 +8.2,0.6,0.17,2.3,0.07200000000000001,11.0,73.0,0.9963,3.2,0.45,9.3,5 +7.7,0.53,0.06,1.7,0.07400000000000001,9.0,39.0,0.99615,3.35,0.48,9.8,6 +7.3,0.66,0.0,2.0,0.084,6.0,23.0,0.9983,3.61,0.96,9.9,6 +10.8,0.32,0.44,1.6,0.063,16.0,37.0,0.9985,3.22,0.78,10.0,6 +7.1,0.6,0.0,1.8,0.07400000000000001,16.0,34.0,0.9972,3.47,0.7,9.9,6 +11.1,0.35,0.48,3.1,0.09,5.0,21.0,0.9986,3.17,0.53,10.5,5 +7.7,0.775,0.42,1.9,0.092,8.0,86.0,0.9959,3.23,0.59,9.5,5 +7.1,0.6,0.0,1.8,0.07400000000000001,16.0,34.0,0.9972,3.47,0.7,9.9,6 +8.0,0.57,0.23,3.2,0.073,17.0,119.0,0.99675,3.26,0.57,9.3,5 +9.4,0.34,0.37,2.2,0.075,5.0,13.0,0.998,3.22,0.62,9.2,5 +6.6,0.695,0.0,2.1,0.075,12.0,56.0,0.9968,3.49,0.67,9.2,5 +7.7,0.41,0.76,1.8,0.611,8.0,45.0,0.9968,3.06,1.26,9.4,5 +10.0,0.31,0.47,2.6,0.085,14.0,33.0,0.99965,3.36,0.8,10.5,7 +7.9,0.33,0.23,1.7,0.077,18.0,45.0,0.99625,3.29,0.65,9.3,5 +7.0,0.975,0.04,2.0,0.087,12.0,67.0,0.99565,3.35,0.6,9.4,4 +8.0,0.52,0.03,1.7,0.07,10.0,35.0,0.99575,3.34,0.57,10.0,5 +7.9,0.37,0.23,1.8,0.077,23.0,49.0,0.9963,3.28,0.67,9.3,5 +12.5,0.56,0.49,2.4,0.064,5.0,27.0,0.9999,3.08,0.87,10.9,5 +11.8,0.26,0.52,1.8,0.071,6.0,10.0,0.9968,3.2,0.72,10.2,7 +8.1,0.87,0.0,3.3,0.096,26.0,61.0,1.00025,3.6,0.72,9.8,4 +7.9,0.35,0.46,3.6,0.078,15.0,37.0,0.9973,3.35,0.86,12.8,8 +6.9,0.54,0.04,3.0,0.077,7.0,27.0,0.9987,3.69,0.91,9.4,6 +11.5,0.18,0.51,4.0,0.104,4.0,23.0,0.9996,3.28,0.97,10.1,6 +7.9,0.545,0.06,4.0,0.087,27.0,61.0,0.9965,3.36,0.67,10.7,6 +11.5,0.18,0.51,4.0,0.104,4.0,23.0,0.9996,3.28,0.97,10.1,6 +10.9,0.37,0.58,4.0,0.071,17.0,65.0,0.99935,3.22,0.78,10.1,5 +8.4,0.715,0.2,2.4,0.076,10.0,38.0,0.99735,3.31,0.64,9.4,5 +7.5,0.65,0.18,7.0,0.08800000000000001,27.0,94.0,0.99915,3.38,0.77,9.4,5 +7.9,0.545,0.06,4.0,0.087,27.0,61.0,0.9965,3.36,0.67,10.7,6 +6.9,0.54,0.04,3.0,0.077,7.0,27.0,0.9987,3.69,0.91,9.4,6 +11.5,0.18,0.51,4.0,0.104,4.0,23.0,0.9996,3.28,0.97,10.1,6 +10.3,0.32,0.45,6.4,0.073,5.0,13.0,0.9976,3.23,0.82,12.6,8 +8.9,0.4,0.32,5.6,0.087,10.0,47.0,0.9991,3.38,0.77,10.5,7 +11.4,0.26,0.44,3.6,0.071,6.0,19.0,0.9986,3.12,0.82,9.3,6 +7.7,0.27,0.68,3.5,0.358,5.0,10.0,0.9972,3.25,1.08,9.9,7 +7.6,0.52,0.12,3.0,0.067,12.0,53.0,0.9971,3.36,0.57,9.1,5 +8.9,0.4,0.32,5.6,0.087,10.0,47.0,0.9991,3.38,0.77,10.5,7 +9.9,0.59,0.07,3.4,0.102,32.0,71.0,1.00015,3.31,0.71,9.8,5 +9.9,0.59,0.07,3.4,0.102,32.0,71.0,1.00015,3.31,0.71,9.8,5 +12.0,0.45,0.55,2.0,0.073,25.0,49.0,0.9997,3.1,0.76,10.3,6 +7.5,0.4,0.12,3.0,0.092,29.0,53.0,0.9967,3.37,0.7,10.3,6 +8.7,0.52,0.09,2.5,0.091,20.0,49.0,0.9976,3.34,0.86,10.6,7 +11.6,0.42,0.53,3.3,0.105,33.0,98.0,1.001,3.2,0.95,9.2,5 +8.7,0.52,0.09,2.5,0.091,20.0,49.0,0.9976,3.34,0.86,10.6,7 +11.0,0.2,0.48,2.0,0.343,6.0,18.0,0.9979,3.3,0.71,10.5,5 +10.4,0.55,0.23,2.7,0.091,18.0,48.0,0.9994,3.22,0.64,10.3,6 +6.9,0.36,0.25,2.4,0.098,5.0,16.0,0.9964,3.41,0.6,10.1,6 +13.3,0.34,0.52,3.2,0.094,17.0,53.0,1.0014,3.05,0.81,9.5,6 +10.8,0.5,0.46,2.5,0.073,5.0,27.0,1.0001,3.05,0.64,9.5,5 +10.6,0.83,0.37,2.6,0.086,26.0,70.0,0.9981,3.16,0.52,9.9,5 +7.1,0.63,0.06,2.0,0.083,8.0,29.0,0.99855,3.67,0.73,9.6,5 +7.2,0.65,0.02,2.3,0.094,5.0,31.0,0.9993,3.67,0.8,9.7,5 +6.9,0.67,0.06,2.1,0.08,8.0,33.0,0.99845,3.68,0.71,9.6,5 +7.5,0.53,0.06,2.6,0.086,20.0,44.0,0.9965,3.38,0.59,10.7,6 +11.1,0.18,0.48,1.5,0.068,7.0,15.0,0.9973,3.22,0.64,10.1,6 +8.3,0.705,0.12,2.6,0.092,12.0,28.0,0.9994,3.51,0.72,10.0,5 +7.4,0.67,0.12,1.6,0.18600000000000005,5.0,21.0,0.996,3.39,0.54,9.5,5 +8.4,0.65,0.6,2.1,0.112,12.0,90.0,0.9973,3.2,0.52,9.2,5 +10.3,0.53,0.48,2.5,0.063,6.0,25.0,0.9998,3.12,0.59,9.3,6 +7.6,0.62,0.32,2.2,0.08199999999999999,7.0,54.0,0.9966,3.36,0.52,9.4,5 +10.3,0.41,0.42,2.4,0.213,6.0,14.0,0.9994,3.19,0.62,9.5,6 +10.3,0.43,0.44,2.4,0.214,5.0,12.0,0.9994,3.19,0.63,9.5,6 +7.4,0.29,0.38,1.7,0.062,9.0,30.0,0.9968,3.41,0.53,9.5,6 +10.3,0.53,0.48,2.5,0.063,6.0,25.0,0.9998,3.12,0.59,9.3,6 +7.9,0.53,0.24,2.0,0.07200000000000001,15.0,105.0,0.996,3.27,0.54,9.4,6 +9.0,0.46,0.31,2.8,0.093,19.0,98.0,0.99815,3.32,0.63,9.5,6 +8.6,0.47,0.3,3.0,0.076,30.0,135.0,0.9976,3.3,0.53,9.4,5 +7.4,0.36,0.29,2.6,0.087,26.0,72.0,0.99645,3.39,0.68,11.0,5 +7.1,0.35,0.29,2.5,0.096,20.0,53.0,0.9962,3.42,0.65,11.0,6 +9.6,0.56,0.23,3.4,0.102,37.0,92.0,0.9996,3.3,0.65,10.1,5 +9.6,0.77,0.12,2.9,0.08199999999999999,30.0,74.0,0.99865,3.3,0.64,10.4,6 +9.8,0.66,0.39,3.2,0.083,21.0,59.0,0.9989,3.37,0.71,11.5,7 +9.6,0.77,0.12,2.9,0.08199999999999999,30.0,74.0,0.99865,3.3,0.64,10.4,6 +9.8,0.66,0.39,3.2,0.083,21.0,59.0,0.9989,3.37,0.71,11.5,7 +9.3,0.61,0.26,3.4,0.09,25.0,87.0,0.99975,3.24,0.62,9.7,5 +7.8,0.62,0.05,2.3,0.079,6.0,18.0,0.99735,3.29,0.63,9.3,5 +10.3,0.59,0.42,2.8,0.09,35.0,73.0,0.999,3.28,0.7,9.5,6 +10.0,0.49,0.2,11.0,0.071,13.0,50.0,1.0015,3.16,0.69,9.2,6 +10.0,0.49,0.2,11.0,0.071,13.0,50.0,1.0015,3.16,0.69,9.2,6 +11.6,0.53,0.66,3.65,0.121,6.0,14.0,0.9978,3.05,0.74,11.5,7 +10.3,0.44,0.5,4.5,0.107,5.0,13.0,0.998,3.28,0.83,11.5,5 +13.4,0.27,0.62,2.6,0.08199999999999999,6.0,21.0,1.0002,3.16,0.67,9.7,6 +10.7,0.46,0.39,2.0,0.061,7.0,15.0,0.9981,3.18,0.62,9.5,5 +10.2,0.36,0.64,2.9,0.122,10.0,41.0,0.998,3.23,0.66,12.5,6 +10.2,0.36,0.64,2.9,0.122,10.0,41.0,0.998,3.23,0.66,12.5,6 +8.0,0.58,0.28,3.2,0.066,21.0,114.0,0.9973,3.22,0.54,9.4,6 +8.4,0.56,0.08,2.1,0.105,16.0,44.0,0.9958,3.13,0.52,11.0,5 +7.9,0.65,0.01,2.5,0.078,17.0,38.0,0.9963,3.34,0.74,11.7,7 +11.9,0.695,0.53,3.4,0.128,7.0,21.0,0.9992,3.17,0.84,12.2,7 +8.9,0.43,0.45,1.9,0.052000000000000005,6.0,16.0,0.9948,3.35,0.7,12.5,6 +7.8,0.43,0.32,2.8,0.08,29.0,58.0,0.9974,3.31,0.64,10.3,5 +12.4,0.49,0.58,3.0,0.103,28.0,99.0,1.0008,3.16,1.0,11.5,6 +12.5,0.28,0.54,2.3,0.08199999999999999,12.0,29.0,0.9997,3.11,1.36,9.8,7 +12.2,0.34,0.5,2.4,0.066,10.0,21.0,1.0,3.12,1.18,9.2,6 +10.6,0.42,0.48,2.7,0.065,5.0,18.0,0.9972,3.21,0.87,11.3,6 +10.9,0.39,0.47,1.8,0.118,6.0,14.0,0.9982,3.3,0.75,9.8,6 +10.9,0.39,0.47,1.8,0.118,6.0,14.0,0.9982,3.3,0.75,9.8,6 +11.9,0.57,0.5,2.6,0.08199999999999999,6.0,32.0,1.0006,3.12,0.78,10.7,6 +7.0,0.685,0.0,1.9,0.067,40.0,63.0,0.9979,3.6,0.81,9.9,5 +6.6,0.815,0.02,2.7,0.07200000000000001,17.0,34.0,0.9955,3.58,0.89,12.3,7 +13.8,0.49,0.67,3.0,0.093,6.0,15.0,0.9986,3.02,0.93,12.0,6 +9.6,0.56,0.31,2.8,0.08900000000000001,15.0,46.0,0.9979,3.11,0.92,10.0,6 +9.1,0.785,0.0,2.6,0.093,11.0,28.0,0.9994,3.36,0.86,9.4,6 +10.7,0.67,0.22,2.7,0.107,17.0,34.0,1.0004,3.28,0.98,9.9,6 +9.1,0.795,0.0,2.6,0.096,11.0,26.0,0.9994,3.35,0.83,9.4,6 +7.7,0.665,0.0,2.4,0.09,8.0,19.0,0.9974,3.27,0.73,9.3,5 +13.5,0.53,0.79,4.8,0.12,23.0,77.0,1.0018,3.18,0.77,13.0,5 +6.1,0.21,0.4,1.4,0.066,40.5,165.0,0.9912,3.25,0.59,11.9,6 +6.7,0.75,0.01,2.4,0.078,17.0,32.0,0.9955,3.55,0.61,12.8,6 +11.5,0.41,0.52,3.0,0.08,29.0,55.0,1.0001,3.26,0.88,11.0,5 +10.5,0.42,0.66,2.95,0.116,12.0,29.0,0.997,3.24,0.75,11.7,7 +11.9,0.43,0.66,3.1,0.109,10.0,23.0,1.0,3.15,0.85,10.4,7 +12.6,0.38,0.66,2.6,0.08800000000000001,10.0,41.0,1.001,3.17,0.68,9.8,6 +8.2,0.7,0.23,2.0,0.099,14.0,81.0,0.9973,3.19,0.7,9.4,5 +8.6,0.45,0.31,2.6,0.086,21.0,50.0,0.9982,3.37,0.91,9.9,6 +11.9,0.58,0.66,2.5,0.07200000000000001,6.0,37.0,0.9992,3.05,0.56,10.0,5 +12.5,0.46,0.63,2.0,0.071,6.0,15.0,0.9988,2.99,0.87,10.2,5 +12.8,0.615,0.66,5.8,0.083,7.0,42.0,1.0022,3.07,0.73,10.0,7 +10.0,0.42,0.5,3.4,0.107,7.0,21.0,0.9979,3.26,0.93,11.8,6 +12.8,0.615,0.66,5.8,0.083,7.0,42.0,1.0022,3.07,0.73,10.0,7 +10.4,0.575,0.61,2.6,0.076,11.0,24.0,1.0,3.16,0.69,9.0,5 +10.3,0.34,0.52,2.8,0.159,15.0,75.0,0.9998,3.18,0.64,9.4,5 +9.4,0.27,0.53,2.4,0.07400000000000001,6.0,18.0,0.9962,3.2,1.13,12.0,7 +6.9,0.765,0.02,2.3,0.063,35.0,63.0,0.9975,3.57,0.78,9.9,5 +7.9,0.24,0.4,1.6,0.056,11.0,25.0,0.9967,3.32,0.87,8.7,6 +9.1,0.28,0.48,1.8,0.067,26.0,46.0,0.9967,3.32,1.04,10.6,6 +7.4,0.55,0.22,2.2,0.106,12.0,72.0,0.9959,3.05,0.63,9.2,5 +14.0,0.41,0.63,3.8,0.08900000000000001,6.0,47.0,1.0014,3.01,0.81,10.8,6 +11.5,0.54,0.71,4.4,0.124,6.0,15.0,0.9984,3.01,0.83,11.8,7 +11.5,0.45,0.5,3.0,0.078,19.0,47.0,1.0003,3.26,1.11,11.0,6 +9.4,0.27,0.53,2.4,0.07400000000000001,6.0,18.0,0.9962,3.2,1.13,12.0,7 +11.4,0.625,0.66,6.2,0.08800000000000001,6.0,24.0,0.9988,3.11,0.99,13.3,6 +8.3,0.42,0.38,2.5,0.094,24.0,60.0,0.9979,3.31,0.7,10.8,6 +8.3,0.26,0.42,2.0,0.08,11.0,27.0,0.9974,3.21,0.8,9.4,6 +13.7,0.415,0.68,2.9,0.085,17.0,43.0,1.0014,3.06,0.8,10.0,6 +8.3,0.26,0.42,2.0,0.08,11.0,27.0,0.9974,3.21,0.8,9.4,6 +8.3,0.26,0.42,2.0,0.08,11.0,27.0,0.9974,3.21,0.8,9.4,6 +7.7,0.51,0.28,2.1,0.087,23.0,54.0,0.998,3.42,0.74,9.2,5 +7.4,0.63,0.07,2.4,0.09,11.0,37.0,0.9979,3.43,0.76,9.7,6 +7.8,0.54,0.26,2.0,0.08800000000000001,23.0,48.0,0.9981,3.41,0.74,9.2,6 +8.3,0.66,0.15,1.9,0.079,17.0,42.0,0.9972,3.31,0.54,9.6,6 +7.8,0.46,0.26,1.9,0.08800000000000001,23.0,53.0,0.9981,3.43,0.74,9.2,6 +9.6,0.38,0.31,2.5,0.096,16.0,49.0,0.9982,3.19,0.7,10.0,7 +5.6,0.85,0.05,1.4,0.045,12.0,88.0,0.9924,3.56,0.82,12.9,8 +13.7,0.415,0.68,2.9,0.085,17.0,43.0,1.0014,3.06,0.8,10.0,6 +9.5,0.37,0.52,2.0,0.08199999999999999,6.0,26.0,0.998,3.18,0.51,9.5,5 +8.4,0.665,0.61,2.0,0.112,13.0,95.0,0.997,3.16,0.54,9.1,5 +12.7,0.6,0.65,2.3,0.063,6.0,25.0,0.9997,3.03,0.57,9.9,5 +12.0,0.37,0.76,4.2,0.066,7.0,38.0,1.0004,3.22,0.6,13.0,7 +6.6,0.735,0.02,7.9,0.122,68.0,124.0,0.9994,3.47,0.53,9.9,5 +11.5,0.59,0.59,2.6,0.087,13.0,49.0,0.9988,3.18,0.65,11.0,6 +11.5,0.59,0.59,2.6,0.087,13.0,49.0,0.9988,3.18,0.65,11.0,6 +8.7,0.765,0.22,2.3,0.064,9.0,42.0,0.9963,3.1,0.55,9.4,5 +6.6,0.735,0.02,7.9,0.122,68.0,124.0,0.9994,3.47,0.53,9.9,5 +7.7,0.26,0.3,1.7,0.059,20.0,38.0,0.9949,3.29,0.47,10.8,6 +12.2,0.48,0.54,2.6,0.085,19.0,64.0,1.0,3.1,0.61,10.5,6 +11.4,0.6,0.49,2.7,0.085,10.0,41.0,0.9994,3.15,0.63,10.5,6 +7.7,0.69,0.05,2.7,0.075,15.0,27.0,0.9974,3.26,0.61,9.1,5 +8.7,0.31,0.46,1.4,0.059,11.0,25.0,0.9966,3.36,0.76,10.1,6 +9.8,0.44,0.47,2.5,0.063,9.0,28.0,0.9981,3.24,0.65,10.8,6 +12.0,0.39,0.66,3.0,0.093,12.0,30.0,0.9996,3.18,0.63,10.8,7 +10.4,0.34,0.58,3.7,0.174,6.0,16.0,0.997,3.19,0.7,11.3,6 +12.5,0.46,0.49,4.5,0.07,26.0,49.0,0.9981,3.05,0.57,9.6,4 +9.0,0.43,0.34,2.5,0.08,26.0,86.0,0.9987,3.38,0.62,9.5,6 +9.1,0.45,0.35,2.4,0.08,23.0,78.0,0.9987,3.38,0.62,9.5,5 +7.1,0.735,0.16,1.9,0.1,15.0,77.0,0.9966,3.27,0.64,9.3,5 +9.9,0.4,0.53,6.7,0.097,6.0,19.0,0.9986,3.27,0.82,11.7,7 +8.8,0.52,0.34,2.7,0.087,24.0,122.0,0.9982,3.26,0.61,9.5,5 +8.6,0.725,0.24,6.6,0.117,31.0,134.0,1.0014,3.32,1.07,9.3,5 +10.6,0.48,0.64,2.2,0.111,6.0,20.0,0.997,3.26,0.66,11.7,6 +7.0,0.58,0.12,1.9,0.091,34.0,124.0,0.9956,3.44,0.48,10.5,5 +11.9,0.38,0.51,2.0,0.121,7.0,20.0,0.9996,3.24,0.76,10.4,6 +6.8,0.77,0.0,1.8,0.066,34.0,52.0,0.9976,3.62,0.68,9.9,5 +9.5,0.56,0.33,2.4,0.08900000000000001,35.0,67.0,0.9972,3.28,0.73,11.8,7 +6.6,0.84,0.03,2.3,0.059,32.0,48.0,0.9952,3.52,0.56,12.3,7 +7.7,0.96,0.2,2.0,0.047,15.0,60.0,0.9955,3.36,0.44,10.9,5 +10.5,0.24,0.47,2.1,0.066,6.0,24.0,0.9978,3.15,0.9,11.0,7 +7.7,0.96,0.2,2.0,0.047,15.0,60.0,0.9955,3.36,0.44,10.9,5 +6.6,0.84,0.03,2.3,0.059,32.0,48.0,0.9952,3.52,0.56,12.3,7 +6.4,0.67,0.08,2.1,0.045,19.0,48.0,0.9949,3.49,0.49,11.4,6 +9.5,0.78,0.22,1.9,0.077,6.0,32.0,0.9988,3.26,0.56,10.6,6 +9.1,0.52,0.33,1.3,0.07,9.0,30.0,0.9978,3.24,0.6,9.3,5 +12.8,0.84,0.63,2.4,0.08800000000000001,13.0,35.0,0.9997,3.1,0.6,10.4,6 +10.5,0.24,0.47,2.1,0.066,6.0,24.0,0.9978,3.15,0.9,11.0,7 +7.8,0.55,0.35,2.2,0.07400000000000001,21.0,66.0,0.9974,3.25,0.56,9.2,5 +11.9,0.37,0.69,2.3,0.078,12.0,24.0,0.9958,3.0,0.65,12.8,6 +12.3,0.39,0.63,2.3,0.091,6.0,18.0,1.0004,3.16,0.49,9.5,5 +10.4,0.41,0.55,3.2,0.076,22.0,54.0,0.9996,3.15,0.89,9.9,6 +12.3,0.39,0.63,2.3,0.091,6.0,18.0,1.0004,3.16,0.49,9.5,5 +8.0,0.67,0.3,2.0,0.06,38.0,62.0,0.9958,3.26,0.56,10.2,6 +11.1,0.45,0.73,3.2,0.066,6.0,22.0,0.9986,3.17,0.66,11.2,6 +10.4,0.41,0.55,3.2,0.076,22.0,54.0,0.9996,3.15,0.89,9.9,6 +7.0,0.62,0.18,1.5,0.062,7.0,50.0,0.9951,3.08,0.6,9.3,5 +12.6,0.31,0.72,2.2,0.07200000000000001,6.0,29.0,0.9987,2.88,0.82,9.8,8 +11.9,0.4,0.65,2.15,0.068,7.0,27.0,0.9988,3.06,0.68,11.3,6 +15.6,0.685,0.76,3.7,0.1,6.0,43.0,1.0032,2.95,0.68,11.2,7 +10.0,0.44,0.49,2.7,0.077,11.0,19.0,0.9963,3.23,0.63,11.6,7 +5.3,0.57,0.01,1.7,0.054000000000000006,5.0,27.0,0.9934,3.57,0.84,12.5,7 +9.5,0.735,0.1,2.1,0.079,6.0,31.0,0.9986,3.23,0.56,10.1,6 +12.5,0.38,0.6,2.6,0.081,31.0,72.0,0.9996,3.1,0.73,10.5,5 +9.3,0.48,0.29,2.1,0.127,6.0,16.0,0.9968,3.22,0.72,11.2,5 +8.6,0.53,0.22,2.0,0.1,7.0,27.0,0.9967,3.2,0.56,10.2,6 +11.9,0.39,0.69,2.8,0.095,17.0,35.0,0.9994,3.1,0.61,10.8,6 +11.9,0.39,0.69,2.8,0.095,17.0,35.0,0.9994,3.1,0.61,10.8,6 +8.4,0.37,0.53,1.8,0.413,9.0,26.0,0.9979,3.06,1.06,9.1,6 +6.8,0.56,0.03,1.7,0.084,18.0,35.0,0.9968,3.44,0.63,10.0,6 +10.4,0.33,0.63,2.8,0.084,5.0,22.0,0.9998,3.26,0.74,11.2,7 +7.0,0.23,0.4,1.6,0.063,21.0,67.0,0.9952,3.5,0.63,11.1,5 +11.3,0.62,0.67,5.2,0.086,6.0,19.0,0.9988,3.22,0.69,13.4,8 +8.9,0.59,0.39,2.3,0.095,5.0,22.0,0.9986,3.37,0.58,10.3,5 +9.2,0.63,0.21,2.7,0.097,29.0,65.0,0.9988,3.28,0.58,9.6,5 +10.4,0.33,0.63,2.8,0.084,5.0,22.0,0.9998,3.26,0.74,11.2,7 +11.6,0.58,0.66,2.2,0.07400000000000001,10.0,47.0,1.0008,3.25,0.57,9.0,3 +9.2,0.43,0.52,2.3,0.083,14.0,23.0,0.9976,3.35,0.61,11.3,6 +8.3,0.615,0.22,2.6,0.087,6.0,19.0,0.9982,3.26,0.61,9.3,5 +11.0,0.26,0.68,2.55,0.085,10.0,25.0,0.997,3.18,0.61,11.8,5 +8.1,0.66,0.7,2.2,0.098,25.0,129.0,0.9972,3.08,0.53,9.0,5 +11.5,0.315,0.54,2.1,0.084,5.0,15.0,0.9987,2.98,0.7,9.2,6 +10.0,0.29,0.4,2.9,0.098,10.0,26.0,1.0006,3.48,0.91,9.7,5 +10.3,0.5,0.42,2.0,0.069,21.0,51.0,0.9982,3.16,0.72,11.5,6 +8.8,0.46,0.45,2.6,0.065,7.0,18.0,0.9947,3.32,0.79,14.0,6 +11.4,0.36,0.69,2.1,0.09,6.0,21.0,1.0,3.17,0.62,9.2,6 +8.7,0.82,0.02,1.2,0.07,36.0,48.0,0.9952,3.2,0.58,9.8,5 +13.0,0.32,0.65,2.6,0.093,15.0,47.0,0.9996,3.05,0.61,10.6,5 +9.6,0.54,0.42,2.4,0.081,25.0,52.0,0.997,3.2,0.71,11.4,6 +12.5,0.37,0.55,2.6,0.083,25.0,68.0,0.9995,3.15,0.82,10.4,6 +9.9,0.35,0.55,2.1,0.062,5.0,14.0,0.9971,3.26,0.79,10.6,5 +10.5,0.28,0.51,1.7,0.08,10.0,24.0,0.9982,3.2,0.89,9.4,6 +9.6,0.68,0.24,2.2,0.087,5.0,28.0,0.9988,3.14,0.6,10.2,5 +9.3,0.27,0.41,2.0,0.091,6.0,16.0,0.998,3.28,0.7,9.7,5 +10.4,0.24,0.49,1.8,0.075,6.0,20.0,0.9977,3.18,1.06,11.0,6 +9.6,0.68,0.24,2.2,0.087,5.0,28.0,0.9988,3.14,0.6,10.2,5 +9.4,0.685,0.11,2.7,0.077,6.0,31.0,0.9984,3.19,0.7,10.1,6 +10.6,0.28,0.39,15.5,0.069,6.0,23.0,1.0026,3.12,0.66,9.2,5 +9.4,0.3,0.56,2.8,0.08,6.0,17.0,0.9964,3.15,0.92,11.7,8 +10.6,0.36,0.59,2.2,0.152,6.0,18.0,0.9986,3.04,1.05,9.4,5 +10.6,0.36,0.6,2.2,0.152,7.0,18.0,0.9986,3.04,1.06,9.4,5 +10.6,0.44,0.68,4.1,0.114,6.0,24.0,0.997,3.06,0.66,13.4,6 +10.2,0.67,0.39,1.9,0.054000000000000006,6.0,17.0,0.9976,3.17,0.47,10.0,5 +10.2,0.67,0.39,1.9,0.054000000000000006,6.0,17.0,0.9976,3.17,0.47,10.0,5 +10.2,0.645,0.36,1.8,0.053,5.0,14.0,0.9982,3.17,0.42,10.0,6 +11.6,0.32,0.55,2.8,0.081,35.0,67.0,1.0002,3.32,0.92,10.8,7 +9.3,0.39,0.4,2.6,0.073,10.0,26.0,0.9984,3.34,0.75,10.2,6 +9.3,0.775,0.27,2.8,0.078,24.0,56.0,0.9984,3.31,0.67,10.6,6 +9.2,0.41,0.5,2.5,0.055,12.0,25.0,0.9952,3.34,0.79,13.3,7 +8.9,0.4,0.51,2.6,0.052000000000000005,13.0,27.0,0.995,3.32,0.9,13.4,7 +8.7,0.69,0.31,3.0,0.086,23.0,81.0,1.0002,3.48,0.74,11.6,6 +6.5,0.39,0.23,8.3,0.051,28.0,91.0,0.9952,3.44,0.55,12.1,6 +10.7,0.35,0.53,2.6,0.07,5.0,16.0,0.9972,3.15,0.65,11.0,8 +7.8,0.52,0.25,1.9,0.081,14.0,38.0,0.9984,3.43,0.65,9.0,6 +7.2,0.34,0.32,2.5,0.09,43.0,113.0,0.9966,3.32,0.79,11.1,5 +10.7,0.35,0.53,2.6,0.07,5.0,16.0,0.9972,3.15,0.65,11.0,8 +8.7,0.69,0.31,3.0,0.086,23.0,81.0,1.0002,3.48,0.74,11.6,6 +7.8,0.52,0.25,1.9,0.081,14.0,38.0,0.9984,3.43,0.65,9.0,6 +10.4,0.44,0.73,6.55,0.07400000000000001,38.0,76.0,0.999,3.17,0.85,12.0,7 +10.4,0.44,0.73,6.55,0.07400000000000001,38.0,76.0,0.999,3.17,0.85,12.0,7 +10.5,0.26,0.47,1.9,0.078,6.0,24.0,0.9976,3.18,1.04,10.9,7 +10.5,0.24,0.42,1.8,0.077,6.0,22.0,0.9976,3.21,1.05,10.8,7 +10.2,0.49,0.63,2.9,0.07200000000000001,10.0,26.0,0.9968,3.16,0.78,12.5,7 +10.4,0.24,0.46,1.8,0.075,6.0,21.0,0.9976,3.25,1.02,10.8,7 +11.2,0.67,0.55,2.3,0.084,6.0,13.0,1.0,3.17,0.71,9.5,6 +10.0,0.59,0.31,2.2,0.09,26.0,62.0,0.9994,3.18,0.63,10.2,6 +13.3,0.29,0.75,2.8,0.084,23.0,43.0,0.9986,3.04,0.68,11.4,7 +12.4,0.42,0.49,4.6,0.073,19.0,43.0,0.9978,3.02,0.61,9.5,5 +10.0,0.59,0.31,2.2,0.09,26.0,62.0,0.9994,3.18,0.63,10.2,6 +10.7,0.4,0.48,2.1,0.125,15.0,49.0,0.998,3.03,0.81,9.7,6 +10.5,0.51,0.64,2.4,0.107,6.0,15.0,0.9973,3.09,0.66,11.8,7 +10.5,0.51,0.64,2.4,0.107,6.0,15.0,0.9973,3.09,0.66,11.8,7 +8.5,0.655,0.49,6.1,0.122,34.0,151.0,1.001,3.31,1.14,9.3,5 +12.5,0.6,0.49,4.3,0.1,5.0,14.0,1.001,3.25,0.74,11.9,6 +10.4,0.61,0.49,2.1,0.2,5.0,16.0,0.9994,3.16,0.63,8.4,3 +10.9,0.21,0.49,2.8,0.08800000000000001,11.0,32.0,0.9972,3.22,0.68,11.7,6 +7.3,0.365,0.49,2.5,0.08800000000000001,39.0,106.0,0.9966,3.36,0.78,11.0,5 +9.8,0.25,0.49,2.7,0.08800000000000001,15.0,33.0,0.9982,3.42,0.9,10.0,6 +7.6,0.41,0.49,2.0,0.08800000000000001,16.0,43.0,0.998,3.48,0.64,9.1,5 +8.2,0.39,0.49,2.3,0.099,47.0,133.0,0.9979,3.38,0.99,9.8,5 +9.3,0.4,0.49,2.5,0.085,38.0,142.0,0.9978,3.22,0.55,9.4,5 +9.2,0.43,0.49,2.4,0.086,23.0,116.0,0.9976,3.23,0.64,9.5,5 +10.4,0.64,0.24,2.8,0.105,29.0,53.0,0.9998,3.24,0.67,9.9,5 +7.3,0.365,0.49,2.5,0.08800000000000001,39.0,106.0,0.9966,3.36,0.78,11.0,5 +7.0,0.38,0.49,2.5,0.097,33.0,85.0,0.9962,3.39,0.77,11.4,6 +8.2,0.42,0.49,2.6,0.084,32.0,55.0,0.9988,3.34,0.75,8.7,6 +9.9,0.63,0.24,2.4,0.077,6.0,33.0,0.9974,3.09,0.57,9.4,5 +9.1,0.22,0.24,2.1,0.078,1.0,28.0,0.999,3.41,0.87,10.3,6 +11.9,0.38,0.49,2.7,0.098,12.0,42.0,1.0004,3.16,0.61,10.3,5 +11.9,0.38,0.49,2.7,0.098,12.0,42.0,1.0004,3.16,0.61,10.3,5 +10.3,0.27,0.24,2.1,0.07200000000000001,15.0,33.0,0.9956,3.22,0.66,12.8,6 +10.0,0.48,0.24,2.7,0.102,13.0,32.0,1.0,3.28,0.56,10.0,6 +9.1,0.22,0.24,2.1,0.078,1.0,28.0,0.999,3.41,0.87,10.3,6 +9.9,0.63,0.24,2.4,0.077,6.0,33.0,0.9974,3.09,0.57,9.4,5 +8.1,0.825,0.24,2.1,0.084,5.0,13.0,0.9972,3.37,0.77,10.7,6 +12.9,0.35,0.49,5.8,0.066,5.0,35.0,1.0014,3.2,0.66,12.0,7 +11.2,0.5,0.74,5.15,0.1,5.0,17.0,0.9996,3.22,0.62,11.2,5 +9.2,0.59,0.24,3.3,0.101,20.0,47.0,0.9988,3.26,0.67,9.6,5 +9.5,0.46,0.49,6.3,0.064,5.0,17.0,0.9988,3.21,0.73,11.0,6 +9.3,0.715,0.24,2.1,0.07,5.0,20.0,0.9966,3.12,0.59,9.9,5 +11.2,0.66,0.24,2.5,0.085,16.0,53.0,0.9993,3.06,0.72,11.0,6 +14.3,0.31,0.74,1.8,0.075,6.0,15.0,1.0008,2.86,0.79,8.4,6 +9.1,0.47,0.49,2.6,0.094,38.0,106.0,0.9982,3.08,0.59,9.1,5 +7.5,0.55,0.24,2.0,0.078,10.0,28.0,0.9983,3.45,0.78,9.5,6 +10.6,0.31,0.49,2.5,0.067,6.0,21.0,0.9987,3.26,0.86,10.7,6 +12.4,0.35,0.49,2.6,0.079,27.0,69.0,0.9994,3.12,0.75,10.4,6 +9.0,0.53,0.49,1.9,0.171,6.0,25.0,0.9975,3.27,0.61,9.4,6 +6.8,0.51,0.01,2.1,0.07400000000000001,9.0,25.0,0.9958,3.33,0.56,9.5,6 +9.4,0.43,0.24,2.8,0.092,14.0,45.0,0.998,3.19,0.73,10.0,6 +9.5,0.46,0.24,2.7,0.092,14.0,44.0,0.998,3.12,0.74,10.0,6 +5.0,1.04,0.24,1.6,0.05,32.0,96.0,0.9934,3.74,0.62,11.5,5 +15.5,0.645,0.49,4.2,0.095,10.0,23.0,1.00315,2.92,0.74,11.1,5 +15.5,0.645,0.49,4.2,0.095,10.0,23.0,1.00315,2.92,0.74,11.1,5 +10.9,0.53,0.49,4.6,0.118,10.0,17.0,1.0002,3.07,0.56,11.7,6 +15.6,0.645,0.49,4.2,0.095,10.0,23.0,1.00315,2.92,0.74,11.1,5 +10.9,0.53,0.49,4.6,0.118,10.0,17.0,1.0002,3.07,0.56,11.7,6 +13.0,0.47,0.49,4.3,0.085,6.0,47.0,1.0021,3.3,0.68,12.7,6 +12.7,0.6,0.49,2.8,0.075,5.0,19.0,0.9994,3.14,0.57,11.4,5 +9.0,0.44,0.49,2.4,0.078,26.0,121.0,0.9978,3.23,0.58,9.2,5 +9.0,0.54,0.49,2.9,0.094,41.0,110.0,0.9982,3.08,0.61,9.2,5 +7.6,0.29,0.49,2.7,0.092,25.0,60.0,0.9971,3.31,0.61,10.1,6 +13.0,0.47,0.49,4.3,0.085,6.0,47.0,1.0021,3.3,0.68,12.7,6 +12.7,0.6,0.49,2.8,0.075,5.0,19.0,0.9994,3.14,0.57,11.4,5 +8.7,0.7,0.24,2.5,0.226,5.0,15.0,0.9991,3.32,0.6,9.0,6 +8.7,0.7,0.24,2.5,0.226,5.0,15.0,0.9991,3.32,0.6,9.0,6 +9.8,0.5,0.49,2.6,0.25,5.0,20.0,0.999,3.31,0.79,10.7,6 +6.2,0.36,0.24,2.2,0.095,19.0,42.0,0.9946,3.57,0.57,11.7,6 +11.5,0.35,0.49,3.3,0.07,10.0,37.0,1.0003,3.32,0.91,11.0,6 +6.2,0.36,0.24,2.2,0.095,19.0,42.0,0.9946,3.57,0.57,11.7,6 +10.2,0.24,0.49,2.4,0.075,10.0,28.0,0.9978,3.14,0.61,10.4,5 +10.5,0.59,0.49,2.1,0.07,14.0,47.0,0.9991,3.3,0.56,9.6,4 +10.6,0.34,0.49,3.2,0.078,20.0,78.0,0.9992,3.19,0.7,10.0,6 +12.3,0.27,0.49,3.1,0.079,28.0,46.0,0.9993,3.2,0.8,10.2,6 +9.9,0.5,0.24,2.3,0.103,6.0,14.0,0.9978,3.34,0.52,10.0,4 +8.8,0.44,0.49,2.8,0.083,18.0,111.0,0.9982,3.3,0.6,9.5,5 +8.8,0.47,0.49,2.9,0.085,17.0,110.0,0.9982,3.29,0.6,9.8,5 +10.6,0.31,0.49,2.2,0.063,18.0,40.0,0.9976,3.14,0.51,9.8,6 +12.3,0.5,0.49,2.2,0.08900000000000001,5.0,14.0,1.0002,3.19,0.44,9.6,5 +12.3,0.5,0.49,2.2,0.08900000000000001,5.0,14.0,1.0002,3.19,0.44,9.6,5 +11.7,0.49,0.49,2.2,0.083,5.0,15.0,1.0,3.19,0.43,9.2,5 +12.0,0.28,0.49,1.9,0.07400000000000001,10.0,21.0,0.9976,2.98,0.66,9.9,7 +11.8,0.33,0.49,3.4,0.093,54.0,80.0,1.0002,3.3,0.76,10.7,7 +7.6,0.51,0.24,2.4,0.091,8.0,38.0,0.998,3.47,0.66,9.6,6 +11.1,0.31,0.49,2.7,0.094,16.0,47.0,0.9986,3.12,1.02,10.6,7 +7.3,0.73,0.24,1.9,0.108,18.0,102.0,0.9967,3.26,0.59,9.3,5 +5.0,0.42,0.24,2.0,0.06,19.0,50.0,0.9917,3.72,0.74,14.0,8 +10.2,0.29,0.49,2.6,0.059,5.0,13.0,0.9976,3.05,0.74,10.5,7 +9.0,0.45,0.49,2.6,0.084,21.0,75.0,0.9987,3.35,0.57,9.7,5 +6.6,0.39,0.49,1.7,0.07,23.0,149.0,0.9922,3.12,0.5,11.5,6 +9.0,0.45,0.49,2.6,0.084,21.0,75.0,0.9987,3.35,0.57,9.7,5 +9.9,0.49,0.58,3.5,0.094,9.0,43.0,1.0004,3.29,0.58,9.0,5 +7.9,0.72,0.17,2.6,0.096,20.0,38.0,0.9978,3.4,0.53,9.5,5 +8.9,0.595,0.41,7.9,0.086,30.0,109.0,0.9998,3.27,0.57,9.3,5 +12.4,0.4,0.51,2.0,0.059,6.0,24.0,0.9994,3.04,0.6,9.3,6 +11.9,0.58,0.58,1.9,0.071,5.0,18.0,0.998,3.09,0.63,10.0,6 +8.5,0.585,0.18,2.1,0.078,5.0,30.0,0.9967,3.2,0.48,9.8,6 +12.7,0.59,0.45,2.3,0.08199999999999999,11.0,22.0,1.0,3.0,0.7,9.3,6 +8.2,0.915,0.27,2.1,0.08800000000000001,7.0,23.0,0.9962,3.26,0.47,10.0,4 +13.2,0.46,0.52,2.2,0.071,12.0,35.0,1.0006,3.1,0.56,9.0,6 +7.7,0.835,0.0,2.6,0.081,6.0,14.0,0.9975,3.3,0.52,9.3,5 +13.2,0.46,0.52,2.2,0.071,12.0,35.0,1.0006,3.1,0.56,9.0,6 +8.3,0.58,0.13,2.9,0.096,14.0,63.0,0.9984,3.17,0.62,9.1,6 +8.3,0.6,0.13,2.6,0.085,6.0,24.0,0.9984,3.31,0.59,9.2,6 +9.4,0.41,0.48,4.6,0.07200000000000001,10.0,20.0,0.9973,3.34,0.79,12.2,7 +8.8,0.48,0.41,3.3,0.092,26.0,52.0,0.9982,3.31,0.53,10.5,6 +10.1,0.65,0.37,5.1,0.11,11.0,65.0,1.0026,3.32,0.64,10.4,6 +6.3,0.36,0.19,3.2,0.075,15.0,39.0,0.9956,3.56,0.52,12.7,6 +8.8,0.24,0.54,2.5,0.083,25.0,57.0,0.9983,3.39,0.54,9.2,5 +13.2,0.38,0.55,2.7,0.081,5.0,16.0,1.0006,2.98,0.54,9.4,5 +7.5,0.64,0.0,2.4,0.077,18.0,29.0,0.9965,3.32,0.6,10.0,6 +8.2,0.39,0.38,1.5,0.058,10.0,29.0,0.9962,3.26,0.74,9.8,5 +9.2,0.755,0.18,2.2,0.14800000000000002,10.0,103.0,0.9969,2.87,1.36,10.2,6 +9.6,0.6,0.5,2.3,0.079,28.0,71.0,0.9997,3.5,0.57,9.7,5 +9.6,0.6,0.5,2.3,0.079,28.0,71.0,0.9997,3.5,0.57,9.7,5 +11.5,0.31,0.51,2.2,0.079,14.0,28.0,0.9982,3.03,0.93,9.8,6 +11.4,0.46,0.5,2.7,0.122,4.0,17.0,1.0006,3.13,0.7,10.2,5 +11.3,0.37,0.41,2.3,0.08800000000000001,6.0,16.0,0.9988,3.09,0.8,9.3,5 +8.3,0.54,0.24,3.4,0.076,16.0,112.0,0.9976,3.27,0.61,9.4,5 +8.2,0.56,0.23,3.4,0.078,14.0,104.0,0.9976,3.28,0.62,9.4,5 +10.0,0.58,0.22,1.9,0.08,9.0,32.0,0.9974,3.13,0.55,9.5,5 +7.9,0.51,0.25,2.9,0.077,21.0,45.0,0.9974,3.49,0.96,12.1,6 +6.8,0.69,0.0,5.6,0.124,21.0,58.0,0.9997,3.46,0.72,10.2,5 +6.8,0.69,0.0,5.6,0.124,21.0,58.0,0.9997,3.46,0.72,10.2,5 +8.8,0.6,0.29,2.2,0.098,5.0,15.0,0.9988,3.36,0.49,9.1,5 +8.8,0.6,0.29,2.2,0.098,5.0,15.0,0.9988,3.36,0.49,9.1,5 +8.7,0.54,0.26,2.5,0.097,7.0,31.0,0.9976,3.27,0.6,9.3,6 +7.6,0.685,0.23,2.3,0.111,20.0,84.0,0.9964,3.21,0.61,9.3,5 +8.7,0.54,0.26,2.5,0.097,7.0,31.0,0.9976,3.27,0.6,9.3,6 +10.4,0.28,0.54,2.7,0.105,5.0,19.0,0.9988,3.25,0.63,9.5,5 +7.6,0.41,0.14,3.0,0.087,21.0,43.0,0.9964,3.32,0.57,10.5,6 +10.1,0.935,0.22,3.4,0.105,11.0,86.0,1.001,3.43,0.64,11.3,4 +7.9,0.35,0.21,1.9,0.073,46.0,102.0,0.9964,3.27,0.58,9.5,5 +8.7,0.84,0.0,1.4,0.065,24.0,33.0,0.9954,3.27,0.55,9.7,5 +9.6,0.88,0.28,2.4,0.086,30.0,147.0,0.9979,3.24,0.53,9.4,5 +9.5,0.885,0.27,2.3,0.084,31.0,145.0,0.9978,3.24,0.53,9.4,5 +7.7,0.915,0.12,2.2,0.14300000000000002,7.0,23.0,0.9964,3.35,0.65,10.2,7 +8.9,0.29,0.35,1.9,0.067,25.0,57.0,0.997,3.18,1.36,10.3,6 +9.9,0.54,0.45,2.3,0.071,16.0,40.0,0.9991,3.39,0.62,9.4,5 +9.5,0.59,0.44,2.3,0.071,21.0,68.0,0.9992,3.46,0.63,9.5,5 +9.9,0.54,0.45,2.3,0.071,16.0,40.0,0.9991,3.39,0.62,9.4,5 +9.5,0.59,0.44,2.3,0.071,21.0,68.0,0.9992,3.46,0.63,9.5,5 +9.9,0.54,0.45,2.3,0.071,16.0,40.0,0.9991,3.39,0.62,9.4,5 +7.8,0.64,0.1,6.0,0.115,5.0,11.0,0.9984,3.37,0.69,10.1,7 +7.3,0.67,0.05,3.6,0.107,6.0,20.0,0.9972,3.4,0.63,10.1,5 +8.3,0.845,0.01,2.2,0.07,5.0,14.0,0.9967,3.32,0.58,11.0,4 +8.7,0.48,0.3,2.8,0.066,10.0,28.0,0.9964,3.33,0.67,11.2,7 +6.7,0.42,0.27,8.6,0.068,24.0,148.0,0.9948,3.16,0.57,11.3,6 +10.7,0.43,0.39,2.2,0.106,8.0,32.0,0.9986,2.89,0.5,9.6,5 +9.8,0.88,0.25,2.5,0.104,35.0,155.0,1.001,3.41,0.67,11.2,5 +15.9,0.36,0.65,7.5,0.096,22.0,71.0,0.9976,2.98,0.84,14.9,5 +9.4,0.33,0.59,2.8,0.079,9.0,30.0,0.9976,3.12,0.54,12.0,6 +8.6,0.47,0.47,2.4,0.07400000000000001,7.0,29.0,0.9979,3.08,0.46,9.5,5 +9.7,0.55,0.17,2.9,0.087,20.0,53.0,1.0004,3.14,0.61,9.4,5 +10.7,0.43,0.39,2.2,0.106,8.0,32.0,0.9986,2.89,0.5,9.6,5 +12.0,0.5,0.59,1.4,0.073,23.0,42.0,0.998,2.92,0.68,10.5,7 +7.2,0.52,0.07,1.4,0.07400000000000001,5.0,20.0,0.9973,3.32,0.81,9.6,6 +7.1,0.84,0.02,4.4,0.096,5.0,13.0,0.997,3.41,0.57,11.0,4 +7.2,0.52,0.07,1.4,0.07400000000000001,5.0,20.0,0.9973,3.32,0.81,9.6,6 +7.5,0.42,0.31,1.6,0.08,15.0,42.0,0.9978,3.31,0.64,9.0,5 +7.2,0.57,0.06,1.6,0.076,9.0,27.0,0.9972,3.36,0.7,9.6,6 +10.1,0.28,0.46,1.8,0.05,5.0,13.0,0.9974,3.04,0.79,10.2,6 +12.1,0.4,0.52,2.0,0.092,15.0,54.0,1.0,3.03,0.66,10.2,5 +9.4,0.59,0.14,2.0,0.084,25.0,48.0,0.9981,3.14,0.56,9.7,5 +8.3,0.49,0.36,1.8,0.222,6.0,16.0,0.998,3.18,0.6,9.5,6 +11.3,0.34,0.45,2.0,0.08199999999999999,6.0,15.0,0.9988,2.94,0.66,9.2,6 +10.0,0.73,0.43,2.3,0.059,15.0,31.0,0.9966,3.15,0.57,11.0,5 +11.3,0.34,0.45,2.0,0.08199999999999999,6.0,15.0,0.9988,2.94,0.66,9.2,6 +6.9,0.4,0.24,2.5,0.083,30.0,45.0,0.9959,3.26,0.58,10.0,5 +8.2,0.73,0.21,1.7,0.07400000000000001,5.0,13.0,0.9968,3.2,0.52,9.5,5 +9.8,1.24,0.34,2.0,0.079,32.0,151.0,0.998,3.15,0.53,9.5,5 +8.2,0.73,0.21,1.7,0.07400000000000001,5.0,13.0,0.9968,3.2,0.52,9.5,5 +10.8,0.4,0.41,2.2,0.084,7.0,17.0,0.9984,3.08,0.67,9.3,6 +9.3,0.41,0.39,2.2,0.064,12.0,31.0,0.9984,3.26,0.65,10.2,5 +10.8,0.4,0.41,2.2,0.084,7.0,17.0,0.9984,3.08,0.67,9.3,6 +8.6,0.8,0.11,2.3,0.084,12.0,31.0,0.9979,3.4,0.48,9.9,5 +8.3,0.78,0.1,2.6,0.081,45.0,87.0,0.9983,3.48,0.53,10.0,5 +10.8,0.26,0.45,3.3,0.06,20.0,49.0,0.9972,3.13,0.54,9.6,5 +13.3,0.43,0.58,1.9,0.07,15.0,40.0,1.0004,3.06,0.49,9.0,5 +8.0,0.45,0.23,2.2,0.094,16.0,29.0,0.9962,3.21,0.49,10.2,6 +8.5,0.46,0.31,2.25,0.078,32.0,58.0,0.998,3.33,0.54,9.8,5 +8.1,0.78,0.23,2.6,0.059,5.0,15.0,0.997,3.37,0.56,11.3,5 +9.8,0.98,0.32,2.3,0.078,35.0,152.0,0.998,3.25,0.48,9.4,5 +8.1,0.78,0.23,2.6,0.059,5.0,15.0,0.997,3.37,0.56,11.3,5 +7.1,0.65,0.18,1.8,0.07,13.0,40.0,0.997,3.44,0.6,9.1,5 +9.1,0.64,0.23,3.1,0.095,13.0,38.0,0.9998,3.28,0.59,9.7,5 +7.7,0.66,0.04,1.6,0.039,4.0,9.0,0.9962,3.4,0.47,9.4,5 +8.1,0.38,0.48,1.8,0.157,5.0,17.0,0.9976,3.3,1.05,9.4,5 +7.4,1.185,0.0,4.25,0.097,5.0,14.0,0.9966,3.63,0.54,10.7,3 +9.2,0.92,0.24,2.6,0.087,12.0,93.0,0.9998,3.48,0.54,9.8,5 +8.6,0.49,0.51,2.0,0.422,16.0,62.0,0.9979,3.03,1.17,9.0,5 +9.0,0.48,0.32,2.8,0.084,21.0,122.0,0.9984,3.32,0.62,9.4,5 +9.0,0.47,0.31,2.7,0.084,24.0,125.0,0.9984,3.31,0.61,9.4,5 +5.1,0.47,0.02,1.3,0.034,18.0,44.0,0.9921,3.9,0.62,12.8,6 +7.0,0.65,0.02,2.1,0.066,8.0,25.0,0.9972,3.47,0.67,9.5,6 +7.0,0.65,0.02,2.1,0.066,8.0,25.0,0.9972,3.47,0.67,9.5,6 +9.4,0.615,0.28,3.2,0.087,18.0,72.0,1.0001,3.31,0.53,9.7,5 +11.8,0.38,0.55,2.1,0.071,5.0,19.0,0.9986,3.11,0.62,10.8,6 +10.6,1.02,0.43,2.9,0.076,26.0,88.0,0.9984,3.08,0.57,10.1,6 +7.0,0.65,0.02,2.1,0.066,8.0,25.0,0.9972,3.47,0.67,9.5,6 +7.0,0.64,0.02,2.1,0.067,9.0,23.0,0.997,3.47,0.67,9.4,6 +7.5,0.38,0.48,2.6,0.073,22.0,84.0,0.9972,3.32,0.7,9.6,4 +9.1,0.765,0.04,1.6,0.078,4.0,14.0,0.998,3.29,0.54,9.7,4 +8.4,1.035,0.15,6.0,0.073,11.0,54.0,0.999,3.37,0.49,9.9,5 +7.0,0.78,0.08,2.0,0.093,10.0,19.0,0.9956,3.4,0.47,10.0,5 +7.4,0.49,0.19,3.0,0.077,16.0,37.0,0.9966,3.37,0.51,10.5,5 +7.8,0.545,0.12,2.5,0.068,11.0,35.0,0.996,3.34,0.61,11.6,6 +9.7,0.31,0.47,1.6,0.062,13.0,33.0,0.9983,3.27,0.66,10.0,6 +10.6,1.025,0.43,2.8,0.08,21.0,84.0,0.9985,3.06,0.57,10.1,5 +8.9,0.565,0.34,3.0,0.093,16.0,112.0,0.9998,3.38,0.61,9.5,5 +8.7,0.69,0.0,3.2,0.084,13.0,33.0,0.9992,3.36,0.45,9.4,5 +8.0,0.43,0.36,2.3,0.075,10.0,48.0,0.9976,3.34,0.46,9.4,5 +9.9,0.74,0.28,2.6,0.078,21.0,77.0,0.998,3.28,0.51,9.8,5 +7.2,0.49,0.18,2.7,0.069,13.0,34.0,0.9967,3.29,0.48,9.2,6 +8.0,0.43,0.36,2.3,0.075,10.0,48.0,0.9976,3.34,0.46,9.4,5 +7.6,0.46,0.11,2.6,0.079,12.0,49.0,0.9968,3.21,0.57,10.0,5 +8.4,0.56,0.04,2.0,0.08199999999999999,10.0,22.0,0.9976,3.22,0.44,9.6,5 +7.1,0.66,0.0,3.9,0.086,17.0,45.0,0.9976,3.46,0.54,9.5,5 +8.4,0.56,0.04,2.0,0.08199999999999999,10.0,22.0,0.9976,3.22,0.44,9.6,5 +8.9,0.48,0.24,2.85,0.094,35.0,106.0,0.9982,3.1,0.53,9.2,5 +7.6,0.42,0.08,2.7,0.084,15.0,48.0,0.9968,3.21,0.59,10.0,5 +7.1,0.31,0.3,2.2,0.053,36.0,127.0,0.9965,2.94,1.62,9.5,5 +7.5,1.115,0.1,3.1,0.086,5.0,12.0,0.9958,3.54,0.6,11.2,4 +9.0,0.66,0.17,3.0,0.077,5.0,13.0,0.9976,3.29,0.55,10.4,5 +8.1,0.72,0.09,2.8,0.084,18.0,49.0,0.9994,3.43,0.72,11.1,6 +6.4,0.57,0.02,1.8,0.067,4.0,11.0,0.997,3.46,0.68,9.5,5 +6.4,0.57,0.02,1.8,0.067,4.0,11.0,0.997,3.46,0.68,9.5,5 +6.4,0.865,0.03,3.2,0.071,27.0,58.0,0.995,3.61,0.49,12.7,6 +9.5,0.55,0.66,2.3,0.387,12.0,37.0,0.9982,3.17,0.67,9.6,5 +8.9,0.875,0.13,3.45,0.08800000000000001,4.0,14.0,0.9994,3.44,0.52,11.5,5 +7.3,0.835,0.03,2.1,0.092,10.0,19.0,0.9966,3.39,0.47,9.6,5 +7.0,0.45,0.34,2.7,0.08199999999999999,16.0,72.0,0.998,3.55,0.6,9.5,5 +7.7,0.56,0.2,2.0,0.075,9.0,39.0,0.9987,3.48,0.62,9.3,5 +7.7,0.965,0.1,2.1,0.112,11.0,22.0,0.9963,3.26,0.5,9.5,5 +7.7,0.965,0.1,2.1,0.112,11.0,22.0,0.9963,3.26,0.5,9.5,5 +8.2,0.59,0.0,2.5,0.093,19.0,58.0,1.0002,3.5,0.65,9.3,6 +9.0,0.46,0.23,2.8,0.092,28.0,104.0,0.9983,3.1,0.56,9.2,5 +9.0,0.69,0.0,2.4,0.08800000000000001,19.0,38.0,0.999,3.35,0.6,9.3,5 +8.3,0.76,0.29,4.2,0.075,12.0,16.0,0.9965,3.45,0.68,11.5,6 +9.2,0.53,0.24,2.6,0.078,28.0,139.0,0.99788,3.21,0.57,9.5,5 +6.5,0.615,0.0,1.9,0.065,9.0,18.0,0.9972,3.46,0.65,9.2,5 +11.6,0.41,0.58,2.8,0.096,25.0,101.0,1.00024,3.13,0.53,10.0,5 +11.1,0.39,0.54,2.7,0.095,21.0,101.0,1.0001,3.13,0.51,9.5,5 +7.3,0.51,0.18,2.1,0.07,12.0,28.0,0.99768,3.52,0.73,9.5,6 +8.2,0.34,0.38,2.5,0.08,12.0,57.0,0.9978,3.3,0.47,9.0,6 +8.6,0.33,0.4,2.6,0.083,16.0,68.0,0.99782,3.3,0.48,9.4,5 +7.2,0.5,0.18,2.1,0.071,12.0,31.0,0.99761,3.52,0.72,9.6,6 +7.3,0.51,0.18,2.1,0.07,12.0,28.0,0.99768,3.52,0.73,9.5,6 +8.3,0.65,0.1,2.9,0.08900000000000001,17.0,40.0,0.99803,3.29,0.55,9.5,5 +8.3,0.65,0.1,2.9,0.08900000000000001,17.0,40.0,0.99803,3.29,0.55,9.5,5 +7.6,0.54,0.13,2.5,0.097,24.0,66.0,0.99785,3.39,0.61,9.4,5 +8.3,0.65,0.1,2.9,0.08900000000000001,17.0,40.0,0.99803,3.29,0.55,9.5,5 +7.8,0.48,0.68,1.7,0.415,14.0,32.0,0.99656,3.09,1.06,9.1,6 +7.8,0.91,0.07,1.9,0.058,22.0,47.0,0.99525,3.51,0.43,10.7,6 +6.3,0.98,0.01,2.0,0.057,15.0,33.0,0.99488,3.6,0.46,11.2,6 +8.1,0.87,0.0,2.2,0.084,10.0,31.0,0.99656,3.25,0.5,9.8,5 +8.1,0.87,0.0,2.2,0.084,10.0,31.0,0.99656,3.25,0.5,9.8,5 +8.8,0.42,0.21,2.5,0.092,33.0,88.0,0.99823,3.19,0.52,9.2,5 +9.0,0.58,0.25,2.8,0.075,9.0,104.0,0.99779,3.23,0.57,9.7,5 +9.3,0.655,0.26,2.0,0.096,5.0,35.0,0.99738,3.25,0.42,9.6,5 +8.8,0.7,0.0,1.7,0.069,8.0,19.0,0.99701,3.31,0.53,10.0,6 +9.3,0.655,0.26,2.0,0.096,5.0,35.0,0.99738,3.25,0.42,9.6,5 +9.1,0.68,0.11,2.8,0.093,11.0,44.0,0.99888,3.31,0.55,9.5,6 +9.2,0.67,0.1,3.0,0.091,12.0,48.0,0.99888,3.31,0.54,9.5,6 +8.8,0.59,0.18,2.9,0.08900000000000001,12.0,74.0,0.99738,3.14,0.54,9.4,5 +7.5,0.6,0.32,2.7,0.103,13.0,98.0,0.99938,3.45,0.62,9.5,5 +7.1,0.59,0.02,2.3,0.08199999999999999,24.0,94.0,0.99744,3.55,0.53,9.7,6 +7.9,0.72,0.01,1.9,0.076,7.0,32.0,0.99668,3.39,0.54,9.6,5 +7.1,0.59,0.02,2.3,0.08199999999999999,24.0,94.0,0.99744,3.55,0.53,9.7,6 +9.4,0.685,0.26,2.4,0.08199999999999999,23.0,143.0,0.9978,3.28,0.55,9.4,5 +9.5,0.57,0.27,2.3,0.08199999999999999,23.0,144.0,0.99782,3.27,0.55,9.4,5 +7.9,0.4,0.29,1.8,0.157,1.0,44.0,0.9973,3.3,0.92,9.5,6 +7.9,0.4,0.3,1.8,0.157,2.0,45.0,0.99727,3.31,0.91,9.5,6 +7.2,1.0,0.0,3.0,0.102,7.0,16.0,0.99586,3.43,0.46,10.0,5 +6.9,0.765,0.18,2.4,0.243,5.5,48.0,0.99612,3.4,0.6,10.3,6 +6.9,0.635,0.17,2.4,0.241,6.0,18.0,0.9961,3.4,0.59,10.3,6 +8.3,0.43,0.3,3.4,0.079,7.0,34.0,0.99788,3.36,0.61,10.5,5 +7.1,0.52,0.03,2.6,0.076,21.0,92.0,0.99745,3.5,0.6,9.8,5 +7.0,0.57,0.0,2.0,0.19,12.0,45.0,0.99676,3.31,0.6,9.4,6 +6.5,0.46,0.14,2.4,0.114,9.0,37.0,0.99732,3.66,0.65,9.8,5 +9.0,0.82,0.05,2.4,0.081,26.0,96.0,0.99814,3.36,0.53,10.0,5 +6.5,0.46,0.14,2.4,0.114,9.0,37.0,0.99732,3.66,0.65,9.8,5 +7.1,0.59,0.01,2.5,0.077,20.0,85.0,0.99746,3.55,0.59,9.8,5 +9.9,0.35,0.41,2.3,0.083,11.0,61.0,0.9982,3.21,0.5,9.5,5 +9.9,0.35,0.41,2.3,0.083,11.0,61.0,0.9982,3.21,0.5,9.5,5 +10.0,0.56,0.24,2.2,0.079,19.0,58.0,0.9991,3.18,0.56,10.1,6 +10.0,0.56,0.24,2.2,0.079,19.0,58.0,0.9991,3.18,0.56,10.1,6 +8.6,0.63,0.17,2.9,0.099,21.0,119.0,0.998,3.09,0.52,9.3,5 +7.4,0.37,0.43,2.6,0.08199999999999999,18.0,82.0,0.99708,3.33,0.68,9.7,6 +8.8,0.64,0.17,2.9,0.084,25.0,130.0,0.99818,3.23,0.54,9.6,5 +7.1,0.61,0.02,2.5,0.081,17.0,87.0,0.99745,3.48,0.6,9.7,6 +7.7,0.6,0.0,2.6,0.055,7.0,13.0,0.99639,3.38,0.56,10.8,5 +10.1,0.27,0.54,2.3,0.065,7.0,26.0,0.99531,3.17,0.53,12.5,6 +10.8,0.89,0.3,2.6,0.132,7.0,60.0,0.99786,2.99,1.18,10.2,5 +8.7,0.46,0.31,2.5,0.126,24.0,64.0,0.99746,3.1,0.74,9.6,5 +9.3,0.37,0.44,1.6,0.038,21.0,42.0,0.99526,3.24,0.81,10.8,7 +9.4,0.5,0.34,3.6,0.08199999999999999,5.0,14.0,0.9987,3.29,0.52,10.7,6 +9.4,0.5,0.34,3.6,0.08199999999999999,5.0,14.0,0.9987,3.29,0.52,10.7,6 +7.2,0.61,0.08,4.0,0.08199999999999999,26.0,108.0,0.99641,3.25,0.51,9.4,5 +8.6,0.55,0.09,3.3,0.068,8.0,17.0,0.99735,3.23,0.44,10.0,5 +5.1,0.585,0.0,1.7,0.044,14.0,86.0,0.99264,3.56,0.94,12.9,7 +7.7,0.56,0.08,2.5,0.114,14.0,46.0,0.9971,3.24,0.66,9.6,6 +8.4,0.52,0.22,2.7,0.084,4.0,18.0,0.99682,3.26,0.57,9.9,6 +8.2,0.28,0.4,2.4,0.052000000000000005,4.0,10.0,0.99356,3.33,0.7,12.8,7 +8.4,0.25,0.39,2.0,0.041,4.0,10.0,0.99386,3.27,0.71,12.5,7 +8.2,0.28,0.4,2.4,0.052000000000000005,4.0,10.0,0.99356,3.33,0.7,12.8,7 +7.4,0.53,0.12,1.9,0.165,4.0,12.0,0.99702,3.26,0.86,9.2,5 +7.6,0.48,0.31,2.8,0.07,4.0,15.0,0.99693,3.22,0.55,10.3,6 +7.3,0.49,0.1,2.6,0.068,4.0,14.0,0.99562,3.3,0.47,10.5,5 +12.9,0.5,0.55,2.8,0.07200000000000001,7.0,24.0,1.00012,3.09,0.68,10.9,6 +10.8,0.45,0.33,2.5,0.099,20.0,38.0,0.99818,3.24,0.71,10.8,5 +6.9,0.39,0.24,2.1,0.102,4.0,7.0,0.99462,3.44,0.58,11.4,4 +12.6,0.41,0.54,2.8,0.103,19.0,41.0,0.99939,3.21,0.76,11.3,6 +10.8,0.45,0.33,2.5,0.099,20.0,38.0,0.99818,3.24,0.71,10.8,5 +9.8,0.51,0.19,3.2,0.081,8.0,30.0,0.9984,3.23,0.58,10.5,6 +10.8,0.29,0.42,1.6,0.084,19.0,27.0,0.99545,3.28,0.73,11.9,6 +7.1,0.715,0.0,2.35,0.071,21.0,47.0,0.99632,3.29,0.45,9.4,5 +9.1,0.66,0.15,3.2,0.097,9.0,59.0,0.99976,3.28,0.54,9.6,5 +7.0,0.685,0.0,1.9,0.099,9.0,22.0,0.99606,3.34,0.6,9.7,5 +4.9,0.42,0.0,2.1,0.048,16.0,42.0,0.99154,3.71,0.74,14.0,7 +6.7,0.54,0.13,2.0,0.076,15.0,36.0,0.9973,3.61,0.64,9.8,5 +6.7,0.54,0.13,2.0,0.076,15.0,36.0,0.9973,3.61,0.64,9.8,5 +7.1,0.48,0.28,2.8,0.068,6.0,16.0,0.99682,3.24,0.53,10.3,5 +7.1,0.46,0.14,2.8,0.076,15.0,37.0,0.99624,3.36,0.49,10.7,5 +7.5,0.27,0.34,2.3,0.05,4.0,8.0,0.9951,3.4,0.64,11.0,7 +7.1,0.46,0.14,2.8,0.076,15.0,37.0,0.99624,3.36,0.49,10.7,5 +7.8,0.57,0.09,2.3,0.065,34.0,45.0,0.99417,3.46,0.74,12.7,8 +5.9,0.61,0.08,2.1,0.071,16.0,24.0,0.99376,3.56,0.77,11.1,6 +7.5,0.685,0.07,2.5,0.058,5.0,9.0,0.99632,3.38,0.55,10.9,4 +5.9,0.61,0.08,2.1,0.071,16.0,24.0,0.99376,3.56,0.77,11.1,6 +10.4,0.44,0.42,1.5,0.145,34.0,48.0,0.99832,3.38,0.86,9.9,3 +11.6,0.47,0.44,1.6,0.147,36.0,51.0,0.99836,3.38,0.86,9.9,4 +8.8,0.685,0.26,1.6,0.08800000000000001,16.0,23.0,0.99694,3.32,0.47,9.4,5 +7.6,0.665,0.1,1.5,0.066,27.0,55.0,0.99655,3.39,0.51,9.3,5 +6.7,0.28,0.28,2.4,0.012,36.0,100.0,0.99064,3.26,0.39,11.7,7 +6.7,0.28,0.28,2.4,0.012,36.0,100.0,0.99064,3.26,0.39,11.7,7 +10.1,0.31,0.35,1.6,0.075,9.0,28.0,0.99672,3.24,0.83,11.2,7 +6.0,0.5,0.04,2.2,0.092,13.0,26.0,0.99647,3.46,0.47,10.0,5 +11.1,0.42,0.47,2.65,0.085,9.0,34.0,0.99736,3.24,0.77,12.1,7 +6.6,0.66,0.0,3.0,0.115,21.0,31.0,0.99629,3.45,0.63,10.3,5 +10.6,0.5,0.45,2.6,0.119,34.0,68.0,0.99708,3.23,0.72,10.9,6 +7.1,0.685,0.35,2.0,0.08800000000000001,9.0,92.0,0.9963,3.28,0.62,9.4,5 +9.9,0.25,0.46,1.7,0.062,26.0,42.0,0.9959,3.18,0.83,10.6,6 +6.4,0.64,0.21,1.8,0.081,14.0,31.0,0.99689,3.59,0.66,9.8,5 +6.4,0.64,0.21,1.8,0.081,14.0,31.0,0.99689,3.59,0.66,9.8,5 +7.4,0.68,0.16,1.8,0.078,12.0,39.0,0.9977,3.5,0.7,9.9,6 +6.4,0.64,0.21,1.8,0.081,14.0,31.0,0.99689,3.59,0.66,9.8,5 +6.4,0.63,0.21,1.6,0.08,12.0,32.0,0.99689,3.58,0.66,9.8,5 +9.3,0.43,0.44,1.9,0.085,9.0,22.0,0.99708,3.28,0.55,9.5,5 +9.3,0.43,0.44,1.9,0.085,9.0,22.0,0.99708,3.28,0.55,9.5,5 +8.0,0.42,0.32,2.5,0.08,26.0,122.0,0.99801,3.22,1.07,9.7,5 +9.3,0.36,0.39,1.5,0.08,41.0,55.0,0.99652,3.47,0.73,10.9,6 +9.3,0.36,0.39,1.5,0.08,41.0,55.0,0.99652,3.47,0.73,10.9,6 +7.6,0.735,0.02,2.5,0.071,10.0,14.0,0.99538,3.51,0.71,11.7,7 +9.3,0.36,0.39,1.5,0.08,41.0,55.0,0.99652,3.47,0.73,10.9,6 +8.2,0.26,0.34,2.5,0.073,16.0,47.0,0.99594,3.4,0.78,11.3,7 +11.7,0.28,0.47,1.7,0.054000000000000006,17.0,32.0,0.99686,3.15,0.67,10.6,7 +6.8,0.56,0.22,1.8,0.07400000000000001,15.0,24.0,0.99438,3.4,0.82,11.2,6 +7.2,0.62,0.06,2.7,0.077,15.0,85.0,0.99746,3.51,0.54,9.5,5 +5.8,1.01,0.66,2.0,0.039,15.0,88.0,0.99357,3.66,0.6,11.5,6 +7.5,0.42,0.32,2.7,0.067,7.0,25.0,0.99628,3.24,0.44,10.4,5 +7.2,0.62,0.06,2.5,0.078,17.0,84.0,0.99746,3.51,0.53,9.7,5 +7.2,0.62,0.06,2.7,0.077,15.0,85.0,0.99746,3.51,0.54,9.5,5 +7.2,0.635,0.07,2.6,0.077,16.0,86.0,0.99748,3.51,0.54,9.7,5 +6.8,0.49,0.22,2.3,0.071,13.0,24.0,0.99438,3.41,0.83,11.3,6 +6.9,0.51,0.23,2.0,0.07200000000000001,13.0,22.0,0.99438,3.4,0.84,11.2,6 +6.8,0.56,0.22,1.8,0.07400000000000001,15.0,24.0,0.99438,3.4,0.82,11.2,6 +7.6,0.63,0.03,2.0,0.08,27.0,43.0,0.99578,3.44,0.64,10.9,6 +7.7,0.715,0.01,2.1,0.064,31.0,43.0,0.99371,3.41,0.57,11.8,6 +6.9,0.56,0.03,1.5,0.086,36.0,46.0,0.99522,3.53,0.57,10.6,5 +7.3,0.35,0.24,2.0,0.067,28.0,48.0,0.99576,3.43,0.54,10.0,4 +9.1,0.21,0.37,1.6,0.067,6.0,10.0,0.99552,3.23,0.58,11.1,7 +10.4,0.38,0.46,2.1,0.104,6.0,10.0,0.99664,3.12,0.65,11.8,7 +8.8,0.31,0.4,2.8,0.109,7.0,16.0,0.99614,3.31,0.79,11.8,7 +7.1,0.47,0.0,2.2,0.067,7.0,14.0,0.99517,3.4,0.58,10.9,4 +7.7,0.715,0.01,2.1,0.064,31.0,43.0,0.99371,3.41,0.57,11.8,6 +8.8,0.61,0.19,4.0,0.094,30.0,69.0,0.99787,3.22,0.5,10.0,6 +7.2,0.6,0.04,2.5,0.076,18.0,88.0,0.99745,3.53,0.55,9.5,5 +9.2,0.56,0.18,1.6,0.078,10.0,21.0,0.99576,3.15,0.49,9.9,5 +7.6,0.715,0.0,2.1,0.068,30.0,35.0,0.99533,3.48,0.65,11.4,6 +8.4,0.31,0.29,3.1,0.194,14.0,26.0,0.99536,3.22,0.78,12.0,6 +7.2,0.6,0.04,2.5,0.076,18.0,88.0,0.99745,3.53,0.55,9.5,5 +8.8,0.61,0.19,4.0,0.094,30.0,69.0,0.99787,3.22,0.5,10.0,6 +8.9,0.75,0.14,2.5,0.086,9.0,30.0,0.99824,3.34,0.64,10.5,5 +9.0,0.8,0.12,2.4,0.083,8.0,28.0,0.99836,3.33,0.65,10.4,6 +10.7,0.52,0.38,2.6,0.066,29.0,56.0,0.99577,3.15,0.79,12.1,7 +6.8,0.57,0.0,2.5,0.07200000000000001,32.0,64.0,0.99491,3.43,0.56,11.2,6 +10.7,0.9,0.34,6.6,0.112,23.0,99.0,1.00289,3.22,0.68,9.3,5 +7.2,0.34,0.24,2.0,0.071,30.0,52.0,0.99576,3.44,0.58,10.1,5 +7.2,0.66,0.03,2.3,0.078,16.0,86.0,0.99743,3.53,0.57,9.7,5 +10.1,0.45,0.23,1.9,0.08199999999999999,10.0,18.0,0.99774,3.22,0.65,9.3,6 +7.2,0.66,0.03,2.3,0.078,16.0,86.0,0.99743,3.53,0.57,9.7,5 +7.2,0.63,0.03,2.2,0.08,17.0,88.0,0.99745,3.53,0.58,9.8,6 +7.1,0.59,0.01,2.3,0.08,27.0,43.0,0.9955,3.42,0.58,10.7,6 +8.3,0.31,0.39,2.4,0.078,17.0,43.0,0.99444,3.31,0.77,12.5,7 +7.1,0.59,0.01,2.3,0.08,27.0,43.0,0.9955,3.42,0.58,10.7,6 +8.3,0.31,0.39,2.4,0.078,17.0,43.0,0.99444,3.31,0.77,12.5,7 +8.3,1.02,0.02,3.4,0.084,6.0,11.0,0.99892,3.48,0.49,11.0,3 +8.9,0.31,0.36,2.6,0.056,10.0,39.0,0.99562,3.4,0.69,11.8,5 +7.4,0.635,0.1,2.4,0.08,16.0,33.0,0.99736,3.58,0.69,10.8,7 +7.4,0.635,0.1,2.4,0.08,16.0,33.0,0.99736,3.58,0.69,10.8,7 +6.8,0.59,0.06,6.0,0.06,11.0,18.0,0.9962,3.41,0.59,10.8,7 +6.8,0.59,0.06,6.0,0.06,11.0,18.0,0.9962,3.41,0.59,10.8,7 +9.2,0.58,0.2,3.0,0.081,15.0,115.0,0.998,3.23,0.59,9.5,5 +7.2,0.54,0.27,2.6,0.084,12.0,78.0,0.9964,3.39,0.71,11.0,5 +6.1,0.56,0.0,2.2,0.079,6.0,9.0,0.9948,3.59,0.54,11.5,6 +7.4,0.52,0.13,2.4,0.078,34.0,61.0,0.99528,3.43,0.59,10.8,6 +7.3,0.305,0.39,1.2,0.059,7.0,11.0,0.99331,3.29,0.52,11.5,6 +9.3,0.38,0.48,3.8,0.132,3.0,11.0,0.99577,3.23,0.57,13.2,6 +9.1,0.28,0.46,9.0,0.114,3.0,9.0,0.99901,3.18,0.6,10.9,6 +10.0,0.46,0.44,2.9,0.065,4.0,8.0,0.99674,3.33,0.62,12.2,6 +9.4,0.395,0.46,4.6,0.094,3.0,10.0,0.99639,3.27,0.64,12.2,7 +7.3,0.305,0.39,1.2,0.059,7.0,11.0,0.99331,3.29,0.52,11.5,6 +8.6,0.315,0.4,2.2,0.079,3.0,6.0,0.99512,3.27,0.67,11.9,6 +5.3,0.715,0.19,1.5,0.161,7.0,62.0,0.99395,3.62,0.61,11.0,5 +6.8,0.41,0.31,8.8,0.084,26.0,45.0,0.99824,3.38,0.64,10.1,6 +8.4,0.36,0.32,2.2,0.081,32.0,79.0,0.9964,3.3,0.72,11.0,6 +8.4,0.62,0.12,1.8,0.07200000000000001,38.0,46.0,0.99504,3.38,0.89,11.8,6 +9.6,0.41,0.37,2.3,0.091,10.0,23.0,0.99786,3.24,0.56,10.5,5 +8.4,0.36,0.32,2.2,0.081,32.0,79.0,0.9964,3.3,0.72,11.0,6 +8.4,0.62,0.12,1.8,0.07200000000000001,38.0,46.0,0.99504,3.38,0.89,11.8,6 +6.8,0.41,0.31,8.8,0.084,26.0,45.0,0.99824,3.38,0.64,10.1,6 +8.6,0.47,0.27,2.3,0.055,14.0,28.0,0.99516,3.18,0.8,11.2,5 +8.6,0.22,0.36,1.9,0.064,53.0,77.0,0.99604,3.47,0.87,11.0,7 +9.4,0.24,0.33,2.3,0.061,52.0,73.0,0.99786,3.47,0.9,10.2,6 +8.4,0.67,0.19,2.2,0.093,11.0,75.0,0.99736,3.2,0.59,9.2,4 +8.6,0.47,0.27,2.3,0.055,14.0,28.0,0.99516,3.18,0.8,11.2,5 +8.7,0.33,0.38,3.3,0.063,10.0,19.0,0.99468,3.3,0.73,12.0,7 +6.6,0.61,0.01,1.9,0.08,8.0,25.0,0.99746,3.69,0.73,10.5,5 +7.4,0.61,0.01,2.0,0.07400000000000001,13.0,38.0,0.99748,3.48,0.65,9.8,5 +7.6,0.4,0.29,1.9,0.078,29.0,66.0,0.9971,3.45,0.59,9.5,6 +7.4,0.61,0.01,2.0,0.07400000000000001,13.0,38.0,0.99748,3.48,0.65,9.8,5 +6.6,0.61,0.01,1.9,0.08,8.0,25.0,0.99746,3.69,0.73,10.5,5 +8.8,0.3,0.38,2.3,0.06,19.0,72.0,0.99543,3.39,0.72,11.8,6 +8.8,0.3,0.38,2.3,0.06,19.0,72.0,0.99543,3.39,0.72,11.8,6 +12.0,0.63,0.5,1.4,0.071,6.0,26.0,0.99791,3.07,0.6,10.4,4 +7.2,0.38,0.38,2.8,0.068,23.0,42.0,0.99356,3.34,0.72,12.9,7 +6.2,0.46,0.17,1.6,0.073,7.0,11.0,0.99425,3.61,0.54,11.4,5 +9.6,0.33,0.52,2.2,0.07400000000000001,13.0,25.0,0.99509,3.36,0.76,12.4,7 +9.9,0.27,0.49,5.0,0.08199999999999999,9.0,17.0,0.99484,3.19,0.52,12.5,7 +10.1,0.43,0.4,2.6,0.092,13.0,52.0,0.99834,3.22,0.64,10.0,7 +9.8,0.5,0.34,2.3,0.094,10.0,45.0,0.99864,3.24,0.6,9.7,7 +8.3,0.3,0.49,3.8,0.09,11.0,24.0,0.99498,3.27,0.64,12.1,7 +10.2,0.44,0.42,2.0,0.071,7.0,20.0,0.99566,3.14,0.79,11.1,7 +10.2,0.44,0.58,4.1,0.092,11.0,24.0,0.99745,3.29,0.99,12.0,7 +8.3,0.28,0.48,2.1,0.093,6.0,12.0,0.99408,3.26,0.62,12.4,7 +8.9,0.12,0.45,1.8,0.075,10.0,21.0,0.99552,3.41,0.76,11.9,7 +8.9,0.12,0.45,1.8,0.075,10.0,21.0,0.99552,3.41,0.76,11.9,7 +8.9,0.12,0.45,1.8,0.075,10.0,21.0,0.99552,3.41,0.76,11.9,7 +8.3,0.28,0.48,2.1,0.093,6.0,12.0,0.99408,3.26,0.62,12.4,7 +8.2,0.31,0.4,2.2,0.058,6.0,10.0,0.99536,3.31,0.68,11.2,7 +10.2,0.34,0.48,2.1,0.052000000000000005,5.0,9.0,0.99458,3.2,0.69,12.1,7 +7.6,0.43,0.4,2.7,0.08199999999999999,6.0,11.0,0.99538,3.44,0.54,12.2,6 +8.5,0.21,0.52,1.9,0.09,9.0,23.0,0.99648,3.36,0.67,10.4,5 +9.0,0.36,0.52,2.1,0.111,5.0,10.0,0.99568,3.31,0.62,11.3,6 +9.5,0.37,0.52,2.0,0.08800000000000001,12.0,51.0,0.99613,3.29,0.58,11.1,6 +6.4,0.57,0.12,2.3,0.12,25.0,36.0,0.99519,3.47,0.71,11.3,7 +8.0,0.59,0.05,2.0,0.08900000000000001,12.0,32.0,0.99735,3.36,0.61,10.0,5 +8.5,0.47,0.27,1.9,0.058,18.0,38.0,0.99518,3.16,0.85,11.1,6 +7.1,0.56,0.14,1.6,0.078,7.0,18.0,0.99592,3.27,0.62,9.3,5 +6.6,0.57,0.02,2.1,0.115,6.0,16.0,0.99654,3.38,0.69,9.5,5 +8.8,0.27,0.39,2.0,0.1,20.0,27.0,0.99546,3.15,0.69,11.2,6 +8.5,0.47,0.27,1.9,0.058,18.0,38.0,0.99518,3.16,0.85,11.1,6 +8.3,0.34,0.4,2.4,0.065,24.0,48.0,0.99554,3.34,0.86,11.0,6 +9.0,0.38,0.41,2.4,0.103,6.0,10.0,0.99604,3.13,0.58,11.9,7 +8.5,0.66,0.2,2.1,0.097,23.0,113.0,0.99733,3.13,0.48,9.2,5 +9.0,0.4,0.43,2.4,0.068,29.0,46.0,0.9943,3.2,0.6,12.2,6 +6.7,0.56,0.09,2.9,0.079,7.0,22.0,0.99669,3.46,0.61,10.2,5 +10.4,0.26,0.48,1.9,0.066,6.0,10.0,0.99724,3.33,0.87,10.9,6 +10.4,0.26,0.48,1.9,0.066,6.0,10.0,0.99724,3.33,0.87,10.9,6 +10.1,0.38,0.5,2.4,0.104,6.0,13.0,0.99643,3.22,0.65,11.6,7 +8.5,0.34,0.44,1.7,0.079,6.0,12.0,0.99605,3.52,0.63,10.7,5 +8.8,0.33,0.41,5.9,0.073,7.0,13.0,0.99658,3.3,0.62,12.1,7 +7.2,0.41,0.3,2.1,0.083,35.0,72.0,0.997,3.44,0.52,9.4,5 +7.2,0.41,0.3,2.1,0.083,35.0,72.0,0.997,3.44,0.52,9.4,5 +8.4,0.59,0.29,2.6,0.109,31.0,119.0,0.99801,3.15,0.5,9.1,5 +7.0,0.4,0.32,3.6,0.061,9.0,29.0,0.99416,3.28,0.49,11.3,7 +12.2,0.45,0.49,1.4,0.075,3.0,6.0,0.9969,3.13,0.63,10.4,5 +9.1,0.5,0.3,1.9,0.065,8.0,17.0,0.99774,3.32,0.71,10.5,6 +9.5,0.86,0.26,1.9,0.079,13.0,28.0,0.99712,3.25,0.62,10.0,5 +7.3,0.52,0.32,2.1,0.07,51.0,70.0,0.99418,3.34,0.82,12.9,6 +9.1,0.5,0.3,1.9,0.065,8.0,17.0,0.99774,3.32,0.71,10.5,6 +12.2,0.45,0.49,1.4,0.075,3.0,6.0,0.9969,3.13,0.63,10.4,5 +7.4,0.58,0.0,2.0,0.064,7.0,11.0,0.99562,3.45,0.58,11.3,6 +9.8,0.34,0.39,1.4,0.066,3.0,7.0,0.9947,3.19,0.55,11.4,7 +7.1,0.36,0.3,1.6,0.08,35.0,70.0,0.99693,3.44,0.5,9.4,5 +7.7,0.39,0.12,1.7,0.097,19.0,27.0,0.99596,3.16,0.49,9.4,5 +9.7,0.295,0.4,1.5,0.073,14.0,21.0,0.99556,3.14,0.51,10.9,6 +7.7,0.39,0.12,1.7,0.097,19.0,27.0,0.99596,3.16,0.49,9.4,5 +7.1,0.34,0.28,2.0,0.08199999999999999,31.0,68.0,0.99694,3.45,0.48,9.4,5 +6.5,0.4,0.1,2.0,0.076,30.0,47.0,0.99554,3.36,0.48,9.4,6 +7.1,0.34,0.28,2.0,0.08199999999999999,31.0,68.0,0.99694,3.45,0.48,9.4,5 +10.0,0.35,0.45,2.5,0.092,20.0,88.0,0.99918,3.15,0.43,9.4,5 +7.7,0.6,0.06,2.0,0.079,19.0,41.0,0.99697,3.39,0.62,10.1,6 +5.6,0.66,0.0,2.2,0.087,3.0,11.0,0.99378,3.71,0.63,12.8,7 +5.6,0.66,0.0,2.2,0.087,3.0,11.0,0.99378,3.71,0.63,12.8,7 +8.9,0.84,0.34,1.4,0.05,4.0,10.0,0.99554,3.12,0.48,9.1,6 +6.4,0.69,0.0,1.65,0.055,7.0,12.0,0.99162,3.47,0.53,12.9,6 +7.5,0.43,0.3,2.2,0.062,6.0,12.0,0.99495,3.44,0.72,11.5,7 +9.9,0.35,0.38,1.5,0.058,31.0,47.0,0.99676,3.26,0.82,10.6,7 +9.1,0.29,0.33,2.05,0.063,13.0,27.0,0.99516,3.26,0.84,11.7,7 +6.8,0.36,0.32,1.8,0.067,4.0,8.0,0.9928,3.36,0.55,12.8,7 +8.2,0.43,0.29,1.6,0.081,27.0,45.0,0.99603,3.25,0.54,10.3,5 +6.8,0.36,0.32,1.8,0.067,4.0,8.0,0.9928,3.36,0.55,12.8,7 +9.1,0.29,0.33,2.05,0.063,13.0,27.0,0.99516,3.26,0.84,11.7,7 +9.1,0.3,0.34,2.0,0.064,12.0,25.0,0.99516,3.26,0.84,11.7,7 +8.9,0.35,0.4,3.6,0.11,12.0,24.0,0.99549,3.23,0.7,12.0,7 +9.6,0.5,0.36,2.8,0.116,26.0,55.0,0.99722,3.18,0.68,10.9,5 +8.9,0.28,0.45,1.7,0.067,7.0,12.0,0.99354,3.25,0.55,12.3,7 +8.9,0.32,0.31,2.0,0.08800000000000001,12.0,19.0,0.9957,3.17,0.55,10.4,6 +7.7,1.005,0.15,2.1,0.102,11.0,32.0,0.99604,3.23,0.48,10.0,5 +7.5,0.71,0.0,1.6,0.092,22.0,31.0,0.99635,3.38,0.58,10.0,6 +8.0,0.58,0.16,2.0,0.12,3.0,7.0,0.99454,3.22,0.58,11.2,6 +10.5,0.39,0.46,2.2,0.075,14.0,27.0,0.99598,3.06,0.84,11.4,6 +8.9,0.38,0.4,2.2,0.068,12.0,28.0,0.99486,3.27,0.75,12.6,7 +8.0,0.18,0.37,0.9,0.049,36.0,109.0,0.99007,2.89,0.44,12.7,6 +8.0,0.18,0.37,0.9,0.049,36.0,109.0,0.99007,2.89,0.44,12.7,6 +7.0,0.5,0.14,1.8,0.078,10.0,23.0,0.99636,3.53,0.61,10.4,5 +11.3,0.36,0.66,2.4,0.123,3.0,8.0,0.99642,3.2,0.53,11.9,6 +11.3,0.36,0.66,2.4,0.123,3.0,8.0,0.99642,3.2,0.53,11.9,6 +7.0,0.51,0.09,2.1,0.062,4.0,9.0,0.99584,3.35,0.54,10.5,5 +8.2,0.32,0.42,2.3,0.098,3.0,9.0,0.99506,3.27,0.55,12.3,6 +7.7,0.58,0.01,1.8,0.08800000000000001,12.0,18.0,0.99568,3.32,0.56,10.5,7 +8.6,0.83,0.0,2.8,0.095,17.0,43.0,0.99822,3.33,0.6,10.4,6 +7.9,0.31,0.32,1.9,0.066,14.0,36.0,0.99364,3.41,0.56,12.6,6 +6.4,0.795,0.0,2.2,0.065,28.0,52.0,0.99378,3.49,0.52,11.6,5 +7.2,0.34,0.21,2.5,0.075,41.0,68.0,0.99586,3.37,0.54,10.1,6 +7.7,0.58,0.01,1.8,0.08800000000000001,12.0,18.0,0.99568,3.32,0.56,10.5,7 +7.1,0.59,0.0,2.1,0.091,9.0,14.0,0.99488,3.42,0.55,11.5,7 +7.3,0.55,0.01,1.8,0.093,9.0,15.0,0.99514,3.35,0.58,11.0,7 +8.1,0.82,0.0,4.1,0.095,5.0,14.0,0.99854,3.36,0.53,9.6,5 +7.5,0.57,0.08,2.6,0.08900000000000001,14.0,27.0,0.99592,3.3,0.59,10.4,6 +8.9,0.745,0.18,2.5,0.077,15.0,48.0,0.99739,3.2,0.47,9.7,6 +10.1,0.37,0.34,2.4,0.085,5.0,17.0,0.99683,3.17,0.65,10.6,7 +7.6,0.31,0.34,2.5,0.08199999999999999,26.0,35.0,0.99356,3.22,0.59,12.5,7 +7.3,0.91,0.1,1.8,0.07400000000000001,20.0,56.0,0.99672,3.35,0.56,9.2,5 +8.7,0.41,0.41,6.2,0.078,25.0,42.0,0.9953,3.24,0.77,12.6,7 +8.9,0.5,0.21,2.2,0.08800000000000001,21.0,39.0,0.99692,3.33,0.83,11.1,6 +7.4,0.965,0.0,2.2,0.08800000000000001,16.0,32.0,0.99756,3.58,0.67,10.2,5 +6.9,0.49,0.19,1.7,0.079,13.0,26.0,0.99547,3.38,0.64,9.8,6 +8.9,0.5,0.21,2.2,0.08800000000000001,21.0,39.0,0.99692,3.33,0.83,11.1,6 +9.5,0.39,0.41,8.9,0.069,18.0,39.0,0.99859,3.29,0.81,10.9,7 +6.4,0.39,0.33,3.3,0.046,12.0,53.0,0.99294,3.36,0.62,12.2,6 +6.9,0.44,0.0,1.4,0.07,32.0,38.0,0.99438,3.32,0.58,11.4,6 +7.6,0.78,0.0,1.7,0.076,33.0,45.0,0.99612,3.31,0.62,10.7,6 +7.1,0.43,0.17,1.8,0.08199999999999999,27.0,51.0,0.99634,3.49,0.64,10.4,5 +9.3,0.49,0.36,1.7,0.081,3.0,14.0,0.99702,3.27,0.78,10.9,6 +9.3,0.5,0.36,1.8,0.084,6.0,17.0,0.99704,3.27,0.77,10.8,6 +7.1,0.43,0.17,1.8,0.08199999999999999,27.0,51.0,0.99634,3.49,0.64,10.4,5 +8.5,0.46,0.59,1.4,0.414,16.0,45.0,0.99702,3.03,1.34,9.2,5 +5.6,0.605,0.05,2.4,0.073,19.0,25.0,0.99258,3.56,0.55,12.9,5 +8.3,0.33,0.42,2.3,0.07,9.0,20.0,0.99426,3.38,0.77,12.7,7 +8.2,0.64,0.27,2.0,0.095,5.0,77.0,0.99747,3.13,0.62,9.1,6 +8.2,0.64,0.27,2.0,0.095,5.0,77.0,0.99747,3.13,0.62,9.1,6 +8.9,0.48,0.53,4.0,0.101,3.0,10.0,0.99586,3.21,0.59,12.1,7 +7.6,0.42,0.25,3.9,0.104,28.0,90.0,0.99784,3.15,0.57,9.1,5 +9.9,0.53,0.57,2.4,0.093,30.0,52.0,0.9971,3.19,0.76,11.6,7 +8.9,0.48,0.53,4.0,0.101,3.0,10.0,0.99586,3.21,0.59,12.1,7 +11.6,0.23,0.57,1.8,0.07400000000000001,3.0,8.0,0.9981,3.14,0.7,9.9,6 +9.1,0.4,0.5,1.8,0.071,7.0,16.0,0.99462,3.21,0.69,12.5,8 +8.0,0.38,0.44,1.9,0.098,6.0,15.0,0.9956,3.3,0.64,11.4,6 +10.2,0.29,0.65,2.4,0.075,6.0,17.0,0.99565,3.22,0.63,11.8,6 +8.2,0.74,0.09,2.0,0.067,5.0,10.0,0.99418,3.28,0.57,11.8,6 +7.7,0.61,0.18,2.4,0.083,6.0,20.0,0.9963,3.29,0.6,10.2,6 +6.6,0.52,0.08,2.4,0.07,13.0,26.0,0.99358,3.4,0.72,12.5,7 +11.1,0.31,0.53,2.2,0.06,3.0,10.0,0.99572,3.02,0.83,10.9,7 +11.1,0.31,0.53,2.2,0.06,3.0,10.0,0.99572,3.02,0.83,10.9,7 +8.0,0.62,0.35,2.8,0.086,28.0,52.0,0.997,3.31,0.62,10.8,5 +9.3,0.33,0.45,1.5,0.057,19.0,37.0,0.99498,3.18,0.89,11.1,7 +7.5,0.77,0.2,8.1,0.098,30.0,92.0,0.99892,3.2,0.58,9.2,5 +7.2,0.35,0.26,1.8,0.083,33.0,75.0,0.9968,3.4,0.58,9.5,6 +8.0,0.62,0.33,2.7,0.08800000000000001,16.0,37.0,0.9972,3.31,0.58,10.7,6 +7.5,0.77,0.2,8.1,0.098,30.0,92.0,0.99892,3.2,0.58,9.2,5 +9.1,0.25,0.34,2.0,0.071,45.0,67.0,0.99769,3.44,0.86,10.2,7 +9.9,0.32,0.56,2.0,0.073,3.0,8.0,0.99534,3.15,0.73,11.4,6 +8.6,0.37,0.65,6.4,0.08,3.0,8.0,0.99817,3.27,0.58,11.0,5 +8.6,0.37,0.65,6.4,0.08,3.0,8.0,0.99817,3.27,0.58,11.0,5 +7.9,0.3,0.68,8.3,0.05,37.5,278.0,0.99316,3.01,0.51,12.3,7 +10.3,0.27,0.56,1.4,0.047,3.0,8.0,0.99471,3.16,0.51,11.8,6 +7.9,0.3,0.68,8.3,0.05,37.5,289.0,0.99316,3.01,0.51,12.3,7 +7.2,0.38,0.3,1.8,0.073,31.0,70.0,0.99685,3.42,0.59,9.5,6 +8.7,0.42,0.45,2.4,0.07200000000000001,32.0,59.0,0.99617,3.33,0.77,12.0,6 +7.2,0.38,0.3,1.8,0.073,31.0,70.0,0.99685,3.42,0.59,9.5,6 +6.8,0.48,0.08,1.8,0.07400000000000001,40.0,64.0,0.99529,3.12,0.49,9.6,5 +8.5,0.34,0.4,4.7,0.055,3.0,9.0,0.99738,3.38,0.66,11.6,7 +7.9,0.19,0.42,1.6,0.057,18.0,30.0,0.994,3.29,0.69,11.2,6 +11.6,0.41,0.54,1.5,0.095,22.0,41.0,0.99735,3.02,0.76,9.9,7 +11.6,0.41,0.54,1.5,0.095,22.0,41.0,0.99735,3.02,0.76,9.9,7 +10.0,0.26,0.54,1.9,0.083,42.0,74.0,0.99451,2.98,0.63,11.8,8 +7.9,0.34,0.42,2.0,0.086,8.0,19.0,0.99546,3.35,0.6,11.4,6 +7.0,0.54,0.09,2.0,0.081,10.0,16.0,0.99479,3.43,0.59,11.5,6 +9.2,0.31,0.36,2.2,0.079,11.0,31.0,0.99615,3.33,0.86,12.0,7 +6.6,0.725,0.09,5.5,0.117,9.0,17.0,0.99655,3.35,0.49,10.8,6 +9.4,0.4,0.47,2.5,0.087,6.0,20.0,0.99772,3.15,0.5,10.5,5 +6.6,0.725,0.09,5.5,0.117,9.0,17.0,0.99655,3.35,0.49,10.8,6 +8.6,0.52,0.38,1.5,0.096,5.0,18.0,0.99666,3.2,0.52,9.4,5 +8.0,0.31,0.45,2.1,0.21600000000000005,5.0,16.0,0.99358,3.15,0.81,12.5,7 +8.6,0.52,0.38,1.5,0.096,5.0,18.0,0.99666,3.2,0.52,9.4,5 +8.4,0.34,0.42,2.1,0.07200000000000001,23.0,36.0,0.99392,3.11,0.78,12.4,6 +7.4,0.49,0.27,2.1,0.071,14.0,25.0,0.99388,3.35,0.63,12.0,6 +6.1,0.48,0.09,1.7,0.078,18.0,30.0,0.99402,3.45,0.54,11.2,6 +7.4,0.49,0.27,2.1,0.071,14.0,25.0,0.99388,3.35,0.63,12.0,6 +8.0,0.48,0.34,2.2,0.073,16.0,25.0,0.9936,3.28,0.66,12.4,6 +6.3,0.57,0.28,2.1,0.048,13.0,49.0,0.99374,3.41,0.6,12.8,5 +8.2,0.23,0.42,1.9,0.069,9.0,17.0,0.99376,3.21,0.54,12.3,6 +9.1,0.3,0.41,2.0,0.068,10.0,24.0,0.99523,3.27,0.85,11.7,7 +8.1,0.78,0.1,3.3,0.09,4.0,13.0,0.99855,3.36,0.49,9.5,5 +10.8,0.47,0.43,2.1,0.171,27.0,66.0,0.9982,3.17,0.76,10.8,6 +8.3,0.53,0.0,1.4,0.07,6.0,14.0,0.99593,3.25,0.64,10.0,6 +5.4,0.42,0.27,2.0,0.092,23.0,55.0,0.99471,3.78,0.64,12.3,7 +7.9,0.33,0.41,1.5,0.056,6.0,35.0,0.99396,3.29,0.71,11.0,6 +8.9,0.24,0.39,1.6,0.07400000000000001,3.0,10.0,0.99698,3.12,0.59,9.5,6 +5.0,0.4,0.5,4.3,0.046,29.0,80.0,0.9902,3.49,0.66,13.6,6 +7.0,0.69,0.07,2.5,0.091,15.0,21.0,0.99572,3.38,0.6,11.3,6 +7.0,0.69,0.07,2.5,0.091,15.0,21.0,0.99572,3.38,0.6,11.3,6 +7.0,0.69,0.07,2.5,0.091,15.0,21.0,0.99572,3.38,0.6,11.3,6 +7.1,0.39,0.12,2.1,0.065,14.0,24.0,0.99252,3.3,0.53,13.3,6 +5.6,0.66,0.0,2.5,0.066,7.0,15.0,0.99256,3.52,0.58,12.9,5 +7.9,0.54,0.34,2.5,0.076,8.0,17.0,0.99235,3.2,0.72,13.1,8 +6.6,0.5,0.0,1.8,0.062,21.0,28.0,0.99352,3.44,0.55,12.3,6 +6.3,0.47,0.0,1.4,0.055,27.0,33.0,0.9922,3.45,0.48,12.3,6 +10.7,0.4,0.37,1.9,0.081,17.0,29.0,0.99674,3.12,0.65,11.2,6 +6.5,0.58,0.0,2.2,0.096,3.0,13.0,0.99557,3.62,0.62,11.5,4 +8.8,0.24,0.35,1.7,0.055,13.0,27.0,0.99394,3.14,0.59,11.3,7 +5.8,0.29,0.26,1.7,0.063,3.0,11.0,0.9915,3.39,0.54,13.5,6 +6.3,0.76,0.0,2.9,0.07200000000000001,26.0,52.0,0.99379,3.51,0.6,11.5,6 +10.0,0.43,0.33,2.7,0.095,28.0,89.0,0.9984,3.22,0.68,10.0,5 +10.5,0.43,0.35,3.3,0.092,24.0,70.0,0.99798,3.21,0.69,10.5,6 +9.1,0.6,0.0,1.9,0.058,5.0,10.0,0.9977,3.18,0.63,10.4,6 +5.9,0.19,0.21,1.7,0.045,57.0,135.0,0.99341,3.32,0.44,9.5,5 +7.4,0.36,0.34,1.8,0.075,18.0,38.0,0.9933,3.38,0.88,13.6,7 +7.2,0.48,0.07,5.5,0.08900000000000001,10.0,18.0,0.99684,3.37,0.68,11.2,7 +8.5,0.28,0.35,1.7,0.061,6.0,15.0,0.99524,3.3,0.74,11.8,7 +8.0,0.25,0.43,1.7,0.067,22.0,50.0,0.9946,3.38,0.6,11.9,6 +10.4,0.52,0.45,2.0,0.08,6.0,13.0,0.99774,3.22,0.76,11.4,6 +10.4,0.52,0.45,2.0,0.08,6.0,13.0,0.99774,3.22,0.76,11.4,6 +7.5,0.41,0.15,3.7,0.104,29.0,94.0,0.99786,3.14,0.58,9.1,5 +8.2,0.51,0.24,2.0,0.079,16.0,86.0,0.99764,3.34,0.64,9.5,6 +7.3,0.4,0.3,1.7,0.08,33.0,79.0,0.9969,3.41,0.65,9.5,6 +8.2,0.38,0.32,2.5,0.08,24.0,71.0,0.99624,3.27,0.85,11.0,6 +6.9,0.45,0.11,2.4,0.043,6.0,12.0,0.99354,3.3,0.65,11.4,6 +7.0,0.22,0.3,1.8,0.065,16.0,20.0,0.99672,3.61,0.82,10.0,6 +7.3,0.32,0.23,2.3,0.066,35.0,70.0,0.99588,3.43,0.62,10.1,5 +8.2,0.2,0.43,2.5,0.076,31.0,51.0,0.99672,3.53,0.81,10.4,6 +7.8,0.5,0.12,1.8,0.17800000000000002,6.0,21.0,0.996,3.28,0.87,9.8,6 +10.0,0.41,0.45,6.2,0.071,6.0,14.0,0.99702,3.21,0.49,11.8,7 +7.8,0.39,0.42,2.0,0.086,9.0,21.0,0.99526,3.39,0.66,11.6,6 +10.0,0.35,0.47,2.0,0.061,6.0,11.0,0.99585,3.23,0.52,12.0,6 +8.2,0.33,0.32,2.8,0.067,4.0,12.0,0.99473,3.3,0.76,12.8,7 +6.1,0.58,0.23,2.5,0.044,16.0,70.0,0.99352,3.46,0.65,12.5,6 +8.3,0.6,0.25,2.2,0.118,9.0,38.0,0.99616,3.15,0.53,9.8,5 +9.6,0.42,0.35,2.1,0.083,17.0,38.0,0.99622,3.23,0.66,11.1,6 +6.6,0.58,0.0,2.2,0.1,50.0,63.0,0.99544,3.59,0.68,11.4,6 +8.3,0.6,0.25,2.2,0.118,9.0,38.0,0.99616,3.15,0.53,9.8,5 +8.5,0.18,0.51,1.75,0.071,45.0,88.0,0.99524,3.33,0.76,11.8,7 +5.1,0.51,0.18,2.1,0.042,16.0,101.0,0.9924,3.46,0.87,12.9,7 +6.7,0.41,0.43,2.8,0.076,22.0,54.0,0.99572,3.42,1.16,10.6,6 +10.2,0.41,0.43,2.2,0.11,11.0,37.0,0.99728,3.16,0.67,10.8,5 +10.6,0.36,0.57,2.3,0.087,6.0,20.0,0.99676,3.14,0.72,11.1,7 +8.8,0.45,0.43,1.4,0.076,12.0,21.0,0.99551,3.21,0.75,10.2,6 +8.5,0.32,0.42,2.3,0.075,12.0,19.0,0.99434,3.14,0.71,11.8,7 +9.0,0.785,0.24,1.7,0.078,10.0,21.0,0.99692,3.29,0.67,10.0,5 +9.0,0.785,0.24,1.7,0.078,10.0,21.0,0.99692,3.29,0.67,10.0,5 +8.5,0.44,0.5,1.9,0.369,15.0,38.0,0.99634,3.01,1.1,9.4,5 +9.9,0.54,0.26,2.0,0.111,7.0,60.0,0.99709,2.94,0.98,10.2,5 +8.2,0.33,0.39,2.5,0.07400000000000001,29.0,48.0,0.99528,3.32,0.88,12.4,7 +6.5,0.34,0.27,2.8,0.067,8.0,44.0,0.99384,3.21,0.56,12.0,6 +7.6,0.5,0.29,2.3,0.086,5.0,14.0,0.99502,3.32,0.62,11.5,6 +9.2,0.36,0.34,1.6,0.062,5.0,12.0,0.99667,3.2,0.67,10.5,6 +7.1,0.59,0.0,2.2,0.078,26.0,44.0,0.99522,3.42,0.68,10.8,6 +9.7,0.42,0.46,2.1,0.07400000000000001,5.0,16.0,0.99649,3.27,0.74,12.3,6 +7.6,0.36,0.31,1.7,0.079,26.0,65.0,0.99716,3.46,0.62,9.5,6 +7.6,0.36,0.31,1.7,0.079,26.0,65.0,0.99716,3.46,0.62,9.5,6 +6.5,0.61,0.0,2.2,0.095,48.0,59.0,0.99541,3.61,0.7,11.5,6 +6.5,0.88,0.03,5.6,0.079,23.0,47.0,0.99572,3.58,0.5,11.2,4 +7.1,0.66,0.0,2.4,0.052000000000000005,6.0,11.0,0.99318,3.35,0.66,12.7,7 +5.6,0.915,0.0,2.1,0.041,17.0,78.0,0.99346,3.68,0.73,11.4,5 +8.2,0.35,0.33,2.4,0.076,11.0,47.0,0.99599,3.27,0.81,11.0,6 +8.2,0.35,0.33,2.4,0.076,11.0,47.0,0.99599,3.27,0.81,11.0,6 +9.8,0.39,0.43,1.65,0.068,5.0,11.0,0.99478,3.19,0.46,11.4,5 +10.2,0.4,0.4,2.5,0.068,41.0,54.0,0.99754,3.38,0.86,10.5,6 +6.8,0.66,0.07,1.6,0.07,16.0,61.0,0.99572,3.29,0.6,9.3,5 +6.7,0.64,0.23,2.1,0.08,11.0,119.0,0.99538,3.36,0.7,10.9,5 +7.0,0.43,0.3,2.0,0.085,6.0,39.0,0.99346,3.33,0.46,11.9,6 +6.6,0.8,0.03,7.8,0.079,6.0,12.0,0.9963,3.52,0.5,12.2,5 +7.0,0.43,0.3,2.0,0.085,6.0,39.0,0.99346,3.33,0.46,11.9,6 +6.7,0.64,0.23,2.1,0.08,11.0,119.0,0.99538,3.36,0.7,10.9,5 +8.8,0.955,0.05,1.8,0.075,5.0,19.0,0.99616,3.3,0.44,9.6,4 +9.1,0.4,0.57,4.6,0.08,6.0,20.0,0.99652,3.28,0.57,12.5,6 +6.5,0.885,0.0,2.3,0.166,6.0,12.0,0.99551,3.56,0.51,10.8,5 +7.2,0.25,0.37,2.5,0.063,11.0,41.0,0.99439,3.52,0.8,12.4,7 +6.4,0.885,0.0,2.3,0.166,6.0,12.0,0.99551,3.56,0.51,10.8,5 +7.0,0.745,0.12,1.8,0.114,15.0,64.0,0.99588,3.22,0.59,9.5,6 +6.2,0.43,0.22,1.8,0.078,21.0,56.0,0.99633,3.52,0.6,9.5,6 +7.9,0.58,0.23,2.3,0.076,23.0,94.0,0.99686,3.21,0.58,9.5,6 +7.7,0.57,0.21,1.5,0.069,4.0,9.0,0.99458,3.16,0.54,9.8,6 +7.7,0.26,0.26,2.0,0.052000000000000005,19.0,77.0,0.9951,3.15,0.79,10.9,6 +7.9,0.58,0.23,2.3,0.076,23.0,94.0,0.99686,3.21,0.58,9.5,6 +7.7,0.57,0.21,1.5,0.069,4.0,9.0,0.99458,3.16,0.54,9.8,6 +7.9,0.34,0.36,1.9,0.065,5.0,10.0,0.99419,3.27,0.54,11.2,7 +8.6,0.42,0.39,1.8,0.068,6.0,12.0,0.99516,3.35,0.69,11.7,8 +9.9,0.74,0.19,5.8,0.111,33.0,76.0,0.99878,3.14,0.55,9.4,5 +7.2,0.36,0.46,2.1,0.07400000000000001,24.0,44.0,0.99534,3.4,0.85,11.0,7 +7.2,0.36,0.46,2.1,0.07400000000000001,24.0,44.0,0.99534,3.4,0.85,11.0,7 +7.2,0.36,0.46,2.1,0.07400000000000001,24.0,44.0,0.99534,3.4,0.85,11.0,7 +9.9,0.72,0.55,1.7,0.136,24.0,52.0,0.99752,3.35,0.94,10.0,5 +7.2,0.36,0.46,2.1,0.07400000000000001,24.0,44.0,0.99534,3.4,0.85,11.0,7 +6.2,0.39,0.43,2.0,0.071,14.0,24.0,0.99428,3.45,0.87,11.2,7 +6.8,0.65,0.02,2.1,0.078,8.0,15.0,0.99498,3.35,0.62,10.4,6 +6.6,0.44,0.15,2.1,0.076,22.0,53.0,0.9957,3.32,0.62,9.3,5 +6.8,0.65,0.02,2.1,0.078,8.0,15.0,0.99498,3.35,0.62,10.4,6 +9.6,0.38,0.42,1.9,0.071,5.0,13.0,0.99659,3.15,0.75,10.5,6 +10.2,0.33,0.46,1.9,0.081,6.0,9.0,0.99628,3.1,0.48,10.4,6 +8.8,0.27,0.46,2.1,0.095,20.0,29.0,0.99488,3.26,0.56,11.3,6 +7.9,0.57,0.31,2.0,0.079,10.0,79.0,0.99677,3.29,0.69,9.5,6 +8.2,0.34,0.37,1.9,0.057,43.0,74.0,0.99408,3.23,0.81,12.0,6 +8.2,0.4,0.31,1.9,0.08199999999999999,8.0,24.0,0.996,3.24,0.69,10.6,6 +9.0,0.39,0.4,1.3,0.044,25.0,50.0,0.99478,3.2,0.83,10.9,6 +10.9,0.32,0.52,1.8,0.132,17.0,44.0,0.99734,3.28,0.77,11.5,6 +10.9,0.32,0.52,1.8,0.132,17.0,44.0,0.99734,3.28,0.77,11.5,6 +8.1,0.53,0.22,2.2,0.078,33.0,89.0,0.99678,3.26,0.46,9.6,6 +10.5,0.36,0.47,2.2,0.07400000000000001,9.0,23.0,0.99638,3.23,0.76,12.0,6 +12.6,0.39,0.49,2.5,0.08,8.0,20.0,0.9992,3.07,0.82,10.3,6 +9.2,0.46,0.23,2.6,0.091,18.0,77.0,0.99922,3.15,0.51,9.4,5 +7.5,0.58,0.03,4.1,0.08,27.0,46.0,0.99592,3.02,0.47,9.2,5 +9.0,0.58,0.25,2.0,0.104,8.0,21.0,0.99769,3.27,0.72,9.6,5 +5.1,0.42,0.0,1.8,0.044,18.0,88.0,0.99157,3.68,0.73,13.6,7 +7.6,0.43,0.29,2.1,0.075,19.0,66.0,0.99718,3.4,0.64,9.5,5 +7.7,0.18,0.34,2.7,0.066,15.0,58.0,0.9947,3.37,0.78,11.8,6 +7.8,0.815,0.01,2.6,0.07400000000000001,48.0,90.0,0.99621,3.38,0.62,10.8,5 +7.6,0.43,0.29,2.1,0.075,19.0,66.0,0.99718,3.4,0.64,9.5,5 +10.2,0.23,0.37,2.2,0.057,14.0,36.0,0.99614,3.23,0.49,9.3,4 +7.1,0.75,0.01,2.2,0.059,11.0,18.0,0.99242,3.39,0.4,12.8,6 +6.0,0.33,0.32,12.9,0.054000000000000006,6.0,113.0,0.99572,3.3,0.56,11.5,4 +7.8,0.55,0.0,1.7,0.07,7.0,17.0,0.99659,3.26,0.64,9.4,6 +7.1,0.75,0.01,2.2,0.059,11.0,18.0,0.99242,3.39,0.4,12.8,6 +8.1,0.73,0.0,2.5,0.081,12.0,24.0,0.99798,3.38,0.46,9.6,4 +6.5,0.67,0.0,4.3,0.057,11.0,20.0,0.99488,3.45,0.56,11.8,4 +7.5,0.61,0.2,1.7,0.076,36.0,60.0,0.99494,3.1,0.4,9.3,5 +9.8,0.37,0.39,2.5,0.079,28.0,65.0,0.99729,3.16,0.59,9.8,5 +9.0,0.4,0.41,2.0,0.058,15.0,40.0,0.99414,3.22,0.6,12.2,6 +8.3,0.56,0.22,2.4,0.08199999999999999,10.0,86.0,0.9983,3.37,0.62,9.5,5 +5.9,0.29,0.25,13.4,0.067,72.0,160.0,0.99721,3.33,0.54,10.3,6 +7.4,0.55,0.19,1.8,0.08199999999999999,15.0,34.0,0.99655,3.49,0.68,10.5,5 +7.4,0.74,0.07,1.7,0.086,15.0,48.0,0.99502,3.12,0.48,10.0,5 +7.4,0.55,0.19,1.8,0.08199999999999999,15.0,34.0,0.99655,3.49,0.68,10.5,5 +6.9,0.41,0.33,2.2,0.081,22.0,36.0,0.9949,3.41,0.75,11.1,6 +7.1,0.6,0.01,2.3,0.079,24.0,37.0,0.99514,3.4,0.61,10.9,6 +7.1,0.6,0.01,2.3,0.079,24.0,37.0,0.99514,3.4,0.61,10.9,6 +7.5,0.58,0.14,2.2,0.077,27.0,60.0,0.9963,3.28,0.59,9.8,5 +7.1,0.72,0.0,1.8,0.123,6.0,14.0,0.99627,3.45,0.58,9.8,5 +7.9,0.66,0.0,1.4,0.096,6.0,13.0,0.99569,3.43,0.58,9.5,5 +7.8,0.7,0.06,1.9,0.079,20.0,35.0,0.99628,3.4,0.69,10.9,5 +6.1,0.64,0.02,2.4,0.069,26.0,46.0,0.99358,3.47,0.45,11.0,5 +7.5,0.59,0.22,1.8,0.08199999999999999,43.0,60.0,0.99499,3.1,0.42,9.2,5 +7.0,0.58,0.28,4.8,0.085,12.0,69.0,0.99633,3.32,0.7,11.0,6 +6.8,0.64,0.0,2.7,0.123,15.0,33.0,0.99538,3.44,0.63,11.3,6 +6.8,0.64,0.0,2.7,0.123,15.0,33.0,0.99538,3.44,0.63,11.3,6 +8.6,0.635,0.68,1.8,0.403,19.0,56.0,0.99632,3.02,1.15,9.3,5 +6.3,1.02,0.0,2.0,0.083,17.0,24.0,0.99437,3.59,0.55,11.2,4 +9.8,0.45,0.38,2.5,0.081,34.0,66.0,0.99726,3.15,0.58,9.8,5 +8.2,0.78,0.0,2.2,0.08900000000000001,13.0,26.0,0.9978,3.37,0.46,9.6,4 +8.5,0.37,0.32,1.8,0.066,26.0,51.0,0.99456,3.38,0.72,11.8,6 +7.2,0.57,0.05,2.3,0.081,16.0,36.0,0.99564,3.38,0.6,10.3,6 +7.2,0.57,0.05,2.3,0.081,16.0,36.0,0.99564,3.38,0.6,10.3,6 +10.4,0.43,0.5,2.3,0.068,13.0,19.0,0.996,3.1,0.87,11.4,6 +6.9,0.41,0.31,2.0,0.079,21.0,51.0,0.99668,3.47,0.55,9.5,6 +5.5,0.49,0.03,1.8,0.044,28.0,87.0,0.9908,3.5,0.82,14.0,8 +5.0,0.38,0.01,1.6,0.048,26.0,60.0,0.99084,3.7,0.75,14.0,6 +7.3,0.44,0.2,1.6,0.049,24.0,64.0,0.9935,3.38,0.57,11.7,6 +5.9,0.46,0.0,1.9,0.077,25.0,44.0,0.99385,3.5,0.53,11.2,5 +7.5,0.58,0.2,2.0,0.073,34.0,44.0,0.99494,3.1,0.43,9.3,5 +7.8,0.58,0.13,2.1,0.102,17.0,36.0,0.9944,3.24,0.53,11.2,6 +8.0,0.715,0.22,2.3,0.075,13.0,81.0,0.99688,3.24,0.54,9.5,6 +8.5,0.4,0.4,6.3,0.05,3.0,10.0,0.99566,3.28,0.56,12.0,4 +7.0,0.69,0.0,1.9,0.114,3.0,10.0,0.99636,3.35,0.6,9.7,6 +8.0,0.715,0.22,2.3,0.075,13.0,81.0,0.99688,3.24,0.54,9.5,6 +9.8,0.3,0.39,1.7,0.062,3.0,9.0,0.9948,3.14,0.57,11.5,7 +7.1,0.46,0.2,1.9,0.077,28.0,54.0,0.9956,3.37,0.64,10.4,6 +7.1,0.46,0.2,1.9,0.077,28.0,54.0,0.9956,3.37,0.64,10.4,6 +7.9,0.765,0.0,2.0,0.084,9.0,22.0,0.99619,3.33,0.68,10.9,6 +8.7,0.63,0.28,2.7,0.096,17.0,69.0,0.99734,3.26,0.63,10.2,6 +7.0,0.42,0.19,2.3,0.071,18.0,36.0,0.99476,3.39,0.56,10.9,5 +11.3,0.37,0.5,1.8,0.09,20.0,47.0,0.99734,3.15,0.57,10.5,5 +7.1,0.16,0.44,2.5,0.068,17.0,31.0,0.99328,3.35,0.54,12.4,6 +8.0,0.6,0.08,2.6,0.056,3.0,7.0,0.99286,3.22,0.37,13.0,5 +7.0,0.6,0.3,4.5,0.068,20.0,110.0,0.99914,3.3,1.17,10.2,5 +7.0,0.6,0.3,4.5,0.068,20.0,110.0,0.99914,3.3,1.17,10.2,5 +7.6,0.74,0.0,1.9,0.1,6.0,12.0,0.99521,3.36,0.59,11.0,5 +8.2,0.635,0.1,2.1,0.073,25.0,60.0,0.99638,3.29,0.75,10.9,6 +5.9,0.395,0.13,2.4,0.056,14.0,28.0,0.99362,3.62,0.67,12.4,6 +7.5,0.755,0.0,1.9,0.084,6.0,12.0,0.99672,3.34,0.49,9.7,4 +8.2,0.635,0.1,2.1,0.073,25.0,60.0,0.99638,3.29,0.75,10.9,6 +6.6,0.63,0.0,4.3,0.093,51.0,77.5,0.99558,3.2,0.45,9.5,5 +6.6,0.63,0.0,4.3,0.093,51.0,77.5,0.99558,3.2,0.45,9.5,5 +7.2,0.53,0.14,2.1,0.064,15.0,29.0,0.99323,3.35,0.61,12.1,6 +5.7,0.6,0.0,1.4,0.063,11.0,18.0,0.99191,3.45,0.56,12.2,6 +7.6,1.58,0.0,2.1,0.13699999999999998,5.0,9.0,0.99476,3.5,0.4,10.9,3 +5.2,0.645,0.0,2.15,0.08,15.0,28.0,0.99444,3.78,0.61,12.5,6 +6.7,0.86,0.07,2.0,0.1,20.0,57.0,0.99598,3.6,0.74,11.7,6 +9.1,0.37,0.32,2.1,0.064,4.0,15.0,0.99576,3.3,0.8,11.2,6 +8.0,0.28,0.44,1.8,0.081,28.0,68.0,0.99501,3.36,0.66,11.2,5 +7.6,0.79,0.21,2.3,0.087,21.0,68.0,0.9955,3.12,0.44,9.2,5 +7.5,0.61,0.26,1.9,0.073,24.0,88.0,0.99612,3.3,0.53,9.8,5 +9.7,0.69,0.32,2.5,0.08800000000000001,22.0,91.0,0.9979,3.29,0.62,10.1,5 +6.8,0.68,0.09,3.9,0.068,15.0,29.0,0.99524,3.41,0.52,11.1,4 +9.7,0.69,0.32,2.5,0.08800000000000001,22.0,91.0,0.9979,3.29,0.62,10.1,5 +7.0,0.62,0.1,1.4,0.071,27.0,63.0,0.996,3.28,0.61,9.2,5 +7.5,0.61,0.26,1.9,0.073,24.0,88.0,0.99612,3.3,0.53,9.8,5 +6.5,0.51,0.15,3.0,0.064,12.0,27.0,0.9929,3.33,0.59,12.8,6 +8.0,1.18,0.21,1.9,0.083,14.0,41.0,0.99532,3.34,0.47,10.5,5 +7.0,0.36,0.21,2.3,0.086,20.0,65.0,0.99558,3.4,0.54,10.1,6 +7.0,0.36,0.21,2.4,0.086,24.0,69.0,0.99556,3.4,0.53,10.1,6 +7.5,0.63,0.27,2.0,0.083,17.0,91.0,0.99616,3.26,0.58,9.8,6 +5.4,0.74,0.0,1.2,0.041,16.0,46.0,0.99258,4.01,0.59,12.5,6 +9.9,0.44,0.46,2.2,0.091,10.0,41.0,0.99638,3.18,0.69,11.9,6 +7.5,0.63,0.27,2.0,0.083,17.0,91.0,0.99616,3.26,0.58,9.8,6 +9.1,0.76,0.68,1.7,0.414,18.0,64.0,0.99652,2.9,1.33,9.1,6 +9.7,0.66,0.34,2.6,0.094,12.0,88.0,0.99796,3.26,0.66,10.1,5 +5.0,0.74,0.0,1.2,0.041,16.0,46.0,0.99258,4.01,0.59,12.5,6 +9.1,0.34,0.42,1.8,0.058,9.0,18.0,0.99392,3.18,0.55,11.4,5 +9.1,0.36,0.39,1.8,0.06,21.0,55.0,0.99495,3.18,0.82,11.0,7 +6.7,0.46,0.24,1.7,0.077,18.0,34.0,0.9948,3.39,0.6,10.6,6 +6.7,0.46,0.24,1.7,0.077,18.0,34.0,0.9948,3.39,0.6,10.6,6 +6.7,0.46,0.24,1.7,0.077,18.0,34.0,0.9948,3.39,0.6,10.6,6 +6.7,0.46,0.24,1.7,0.077,18.0,34.0,0.9948,3.39,0.6,10.6,6 +6.5,0.52,0.11,1.8,0.073,13.0,38.0,0.9955,3.34,0.52,9.3,5 +7.4,0.6,0.26,2.1,0.083,17.0,91.0,0.99616,3.29,0.56,9.8,6 +7.4,0.6,0.26,2.1,0.083,17.0,91.0,0.99616,3.29,0.56,9.8,6 +7.8,0.87,0.26,3.8,0.107,31.0,67.0,0.99668,3.26,0.46,9.2,5 +8.4,0.39,0.1,1.7,0.075,6.0,25.0,0.99581,3.09,0.43,9.7,6 +9.1,0.775,0.22,2.2,0.079,12.0,48.0,0.9976,3.18,0.51,9.6,5 +7.2,0.835,0.0,2.0,0.166,4.0,11.0,0.99608,3.39,0.52,10.0,5 +6.6,0.58,0.02,2.4,0.069,19.0,40.0,0.99387,3.38,0.66,12.6,6 +6.0,0.5,0.0,1.4,0.057,15.0,26.0,0.99448,3.36,0.45,9.5,5 +6.0,0.5,0.0,1.4,0.057,15.0,26.0,0.99448,3.36,0.45,9.5,5 +6.0,0.5,0.0,1.4,0.057,15.0,26.0,0.99448,3.36,0.45,9.5,5 +7.5,0.51,0.02,1.7,0.084,13.0,31.0,0.99538,3.36,0.54,10.5,6 +7.5,0.51,0.02,1.7,0.084,13.0,31.0,0.99538,3.36,0.54,10.5,6 +7.5,0.51,0.02,1.7,0.084,13.0,31.0,0.99538,3.36,0.54,10.5,6 +7.6,0.54,0.02,1.7,0.085,17.0,31.0,0.99589,3.37,0.51,10.4,6 +7.5,0.51,0.02,1.7,0.084,13.0,31.0,0.99538,3.36,0.54,10.5,6 +11.5,0.42,0.48,2.6,0.077,8.0,20.0,0.99852,3.09,0.53,11.0,5 +8.2,0.44,0.24,2.3,0.063,10.0,28.0,0.99613,3.25,0.53,10.2,6 +6.1,0.59,0.01,2.1,0.056,5.0,13.0,0.99472,3.52,0.56,11.4,5 +7.2,0.655,0.03,1.8,0.078,7.0,12.0,0.99587,3.34,0.39,9.5,5 +7.2,0.655,0.03,1.8,0.078,7.0,12.0,0.99587,3.34,0.39,9.5,5 +6.9,0.57,0.0,2.8,0.081,21.0,41.0,0.99518,3.41,0.52,10.8,5 +9.0,0.6,0.29,2.0,0.069,32.0,73.0,0.99654,3.34,0.57,10.0,5 +7.2,0.62,0.01,2.3,0.065,8.0,46.0,0.99332,3.32,0.51,11.8,6 +7.6,0.645,0.03,1.9,0.086,14.0,57.0,0.9969,3.37,0.46,10.3,5 +7.6,0.645,0.03,1.9,0.086,14.0,57.0,0.9969,3.37,0.46,10.3,5 +7.2,0.58,0.03,2.3,0.077,7.0,28.0,0.99568,3.35,0.52,10.0,5 +6.1,0.32,0.25,1.8,0.086,5.0,32.0,0.99464,3.36,0.44,10.1,5 +6.1,0.34,0.25,1.8,0.084,4.0,28.0,0.99464,3.36,0.44,10.1,5 +7.3,0.43,0.24,2.5,0.078,27.0,67.0,0.99648,3.6,0.59,11.1,6 +7.4,0.64,0.17,5.4,0.168,52.0,98.0,0.99736,3.28,0.5,9.5,5 +11.6,0.475,0.4,1.4,0.091,6.0,28.0,0.99704,3.07,0.65,10.0333333333333,6 +9.2,0.54,0.31,2.3,0.112,11.0,38.0,0.99699,3.24,0.56,10.9,5 +8.3,0.85,0.14,2.5,0.093,13.0,54.0,0.99724,3.36,0.54,10.1,5 +11.6,0.475,0.4,1.4,0.091,6.0,28.0,0.99704,3.07,0.65,10.0333333333333,6 +8.0,0.83,0.27,2.0,0.08,11.0,63.0,0.99652,3.29,0.48,9.8,4 +7.2,0.605,0.02,1.9,0.096,10.0,31.0,0.995,3.46,0.53,11.8,6 +7.8,0.5,0.09,2.2,0.115,10.0,42.0,0.9971,3.18,0.62,9.5,5 +7.3,0.74,0.08,1.7,0.094,10.0,45.0,0.99576,3.24,0.5,9.8,5 +6.9,0.54,0.3,2.2,0.08800000000000001,9.0,105.0,0.99725,3.25,1.18,10.5,6 +8.0,0.77,0.32,2.1,0.079,16.0,74.0,0.99656,3.27,0.5,9.8,6 +6.6,0.61,0.0,1.6,0.069,4.0,8.0,0.99396,3.33,0.37,10.4,4 +8.7,0.78,0.51,1.7,0.415,12.0,66.0,0.99623,3.0,1.17,9.2,5 +7.5,0.58,0.56,3.1,0.153,5.0,14.0,0.99476,3.21,1.03,11.6,6 +8.7,0.78,0.51,1.7,0.415,12.0,66.0,0.99623,3.0,1.17,9.2,5 +7.7,0.75,0.27,3.8,0.11,34.0,89.0,0.99664,3.24,0.45,9.3,5 +6.8,0.815,0.0,1.2,0.267,16.0,29.0,0.99471,3.32,0.51,9.8,3 +7.2,0.56,0.26,2.0,0.083,13.0,100.0,0.99586,3.26,0.52,9.9,5 +8.2,0.885,0.2,1.4,0.086,7.0,31.0,0.9946,3.11,0.46,10.0,5 +5.2,0.49,0.26,2.3,0.09,23.0,74.0,0.9953,3.71,0.62,12.2,6 +7.2,0.45,0.15,2.0,0.078,10.0,28.0,0.99609,3.29,0.51,9.9,6 +7.5,0.57,0.02,2.6,0.077,11.0,35.0,0.99557,3.36,0.62,10.8,6 +7.5,0.57,0.02,2.6,0.077,11.0,35.0,0.99557,3.36,0.62,10.8,6 +6.8,0.83,0.09,1.8,0.07400000000000001,4.0,25.0,0.99534,3.38,0.45,9.6,5 +8.0,0.6,0.22,2.1,0.08,25.0,105.0,0.99613,3.3,0.49,9.9,5 +8.0,0.6,0.22,2.1,0.08,25.0,105.0,0.99613,3.3,0.49,9.9,5 +7.1,0.755,0.15,1.8,0.107,20.0,84.0,0.99593,3.19,0.5,9.5,5 +8.0,0.81,0.25,3.4,0.076,34.0,85.0,0.99668,3.19,0.42,9.2,5 +7.4,0.64,0.07,1.8,0.1,8.0,23.0,0.9961,3.3,0.58,9.6,5 +7.4,0.64,0.07,1.8,0.1,8.0,23.0,0.9961,3.3,0.58,9.6,5 +6.6,0.64,0.31,6.1,0.083,7.0,49.0,0.99718,3.35,0.68,10.3,5 +6.7,0.48,0.02,2.2,0.08,36.0,111.0,0.99524,3.1,0.53,9.7,5 +6.0,0.49,0.0,2.3,0.068,15.0,33.0,0.99292,3.58,0.59,12.5,6 +8.0,0.64,0.22,2.4,0.094,5.0,33.0,0.99612,3.37,0.58,11.0,5 +7.1,0.62,0.06,1.3,0.07,5.0,12.0,0.9942,3.17,0.48,9.8,5 +8.0,0.52,0.25,2.0,0.078,19.0,59.0,0.99612,3.3,0.48,10.2,5 +6.4,0.57,0.14,3.9,0.07,27.0,73.0,0.99669,3.32,0.48,9.2,5 +8.6,0.685,0.1,1.6,0.092,3.0,12.0,0.99745,3.31,0.65,9.55,6 +8.7,0.675,0.1,1.6,0.09,4.0,11.0,0.99745,3.31,0.65,9.55,5 +7.3,0.59,0.26,2.0,0.08,17.0,104.0,0.99584,3.28,0.52,9.9,5 +7.0,0.6,0.12,2.2,0.083,13.0,28.0,0.9966,3.52,0.62,10.2,7 +7.2,0.67,0.0,2.2,0.068,10.0,24.0,0.9956,3.42,0.72,11.1,6 +7.9,0.69,0.21,2.1,0.08,33.0,141.0,0.9962,3.25,0.51,9.9,5 +7.9,0.69,0.21,2.1,0.08,33.0,141.0,0.9962,3.25,0.51,9.9,5 +7.6,0.3,0.42,2.0,0.052000000000000005,6.0,24.0,0.9963,3.44,0.82,11.9,6 +7.2,0.33,0.33,1.7,0.061,3.0,13.0,0.996,3.23,1.1,10.0,8 +8.0,0.5,0.39,2.6,0.08199999999999999,12.0,46.0,0.9985,3.43,0.62,10.7,6 +7.7,0.28,0.3,2.0,0.062,18.0,34.0,0.9952,3.28,0.9,11.3,7 +8.2,0.24,0.34,5.1,0.062,8.0,22.0,0.9974,3.22,0.94,10.9,6 +6.0,0.51,0.0,2.1,0.064,40.0,54.0,0.995,3.54,0.93,10.7,6 +8.1,0.29,0.36,2.2,0.048,35.0,53.0,0.995,3.27,1.01,12.4,7 +6.0,0.51,0.0,2.1,0.064,40.0,54.0,0.995,3.54,0.93,10.7,6 +6.6,0.96,0.0,1.8,0.08199999999999999,5.0,16.0,0.9936,3.5,0.44,11.9,6 +6.4,0.47,0.4,2.4,0.071,8.0,19.0,0.9963,3.56,0.73,10.6,6 +8.2,0.24,0.34,5.1,0.062,8.0,22.0,0.9974,3.22,0.94,10.9,6 +9.9,0.57,0.25,2.0,0.104,12.0,89.0,0.9963,3.04,0.9,10.1,5 +10.0,0.32,0.59,2.2,0.077,3.0,15.0,0.9994,3.2,0.78,9.6,5 +6.2,0.58,0.0,1.6,0.065,8.0,18.0,0.9966,3.56,0.84,9.4,5 +10.0,0.32,0.59,2.2,0.077,3.0,15.0,0.9994,3.2,0.78,9.6,5 +7.3,0.34,0.33,2.5,0.064,21.0,37.0,0.9952,3.35,0.77,12.1,7 +7.8,0.53,0.01,1.6,0.077,3.0,19.0,0.995,3.16,0.46,9.8,5 +7.7,0.64,0.21,2.2,0.077,32.0,133.0,0.9956,3.27,0.45,9.9,5 +7.8,0.53,0.01,1.6,0.077,3.0,19.0,0.995,3.16,0.46,9.8,5 +7.5,0.4,0.18,1.6,0.079,24.0,58.0,0.9965,3.34,0.58,9.4,5 +7.0,0.54,0.0,2.1,0.079,39.0,55.0,0.9956,3.39,0.84,11.4,6 +6.4,0.53,0.09,3.9,0.123,14.0,31.0,0.9968,3.5,0.67,11.0,4 +8.3,0.26,0.37,1.4,0.076,8.0,23.0,0.9974,3.26,0.7,9.6,6 +8.3,0.26,0.37,1.4,0.076,8.0,23.0,0.9974,3.26,0.7,9.6,6 +7.7,0.23,0.37,1.8,0.046,23.0,60.0,0.9971,3.41,0.71,12.1,6 +7.6,0.41,0.33,2.5,0.078,6.0,23.0,0.9957,3.3,0.58,11.2,5 +7.8,0.64,0.0,1.9,0.07200000000000001,27.0,55.0,0.9962,3.31,0.63,11.0,5 +7.9,0.18,0.4,2.2,0.049,38.0,67.0,0.996,3.33,0.93,11.3,5 +7.4,0.41,0.24,1.8,0.066,18.0,47.0,0.9956,3.37,0.62,10.4,5 +7.6,0.43,0.31,2.1,0.069,13.0,74.0,0.9958,3.26,0.54,9.9,6 +5.9,0.44,0.0,1.6,0.042,3.0,11.0,0.9944,3.48,0.85,11.7,6 +6.1,0.4,0.16,1.8,0.069,11.0,25.0,0.9955,3.42,0.74,10.1,7 +10.2,0.54,0.37,15.4,0.214,55.0,95.0,1.00369,3.18,0.77,9.0,6 +10.2,0.54,0.37,15.4,0.214,55.0,95.0,1.00369,3.18,0.77,9.0,6 +10.0,0.38,0.38,1.6,0.16899999999999998,27.0,90.0,0.99914,3.15,0.65,8.5,5 +6.8,0.915,0.29,4.8,0.07,15.0,39.0,0.99577,3.53,0.54,11.1,5 +7.0,0.59,0.0,1.7,0.052000000000000005,3.0,8.0,0.996,3.41,0.47,10.3,5 +7.3,0.67,0.02,2.2,0.07200000000000001,31.0,92.0,0.99566,3.32,0.68,11.066666666666698,6 +7.2,0.37,0.32,2.0,0.062,15.0,28.0,0.9947,3.23,0.73,11.3,7 +7.4,0.785,0.19,5.2,0.094,19.0,98.0,0.99713,3.16,0.52,9.56666666666667,6 +6.9,0.63,0.02,1.9,0.078,18.0,30.0,0.99712,3.4,0.75,9.8,5 +6.9,0.58,0.2,1.75,0.058,8.0,22.0,0.99322,3.38,0.49,11.7,5 +7.3,0.67,0.02,2.2,0.07200000000000001,31.0,92.0,0.99566,3.32,0.68,11.1,6 +7.4,0.785,0.19,5.2,0.094,19.0,98.0,0.99713,3.16,0.52,9.6,6 +6.9,0.63,0.02,1.9,0.078,18.0,30.0,0.99712,3.4,0.75,9.8,5 +6.8,0.67,0.0,1.9,0.08,22.0,39.0,0.99701,3.4,0.74,9.7,5 +6.9,0.58,0.01,1.9,0.08,40.0,54.0,0.99683,3.4,0.73,9.7,5 +7.2,0.38,0.31,2.0,0.056,15.0,29.0,0.99472,3.23,0.76,11.3,8 +7.2,0.37,0.32,2.0,0.062,15.0,28.0,0.9947,3.23,0.73,11.3,7 +7.8,0.32,0.44,2.7,0.104,8.0,17.0,0.99732,3.33,0.78,11.0,7 +6.6,0.58,0.02,2.0,0.062,37.0,53.0,0.99374,3.35,0.76,11.6,7 +7.6,0.49,0.33,1.9,0.07400000000000001,27.0,85.0,0.99706,3.41,0.58,9.0,5 +11.7,0.45,0.63,2.2,0.073,7.0,23.0,0.99974,3.21,0.69,10.9,6 +6.5,0.9,0.0,1.6,0.052000000000000005,9.0,17.0,0.99467,3.5,0.63,10.9,6 +6.0,0.54,0.06,1.8,0.05,38.0,89.0,0.99236,3.3,0.5,10.55,6 +7.6,0.49,0.33,1.9,0.07400000000000001,27.0,85.0,0.99706,3.41,0.58,9.0,5 +8.4,0.29,0.4,1.7,0.067,8.0,20.0,0.99603,3.39,0.6,10.5,5 +7.9,0.2,0.35,1.7,0.054000000000000006,7.0,15.0,0.99458,3.32,0.8,11.9,7 +6.4,0.42,0.09,2.3,0.054000000000000006,34.0,64.0,0.99724,3.41,0.68,10.4,6 +6.2,0.785,0.0,2.1,0.06,6.0,13.0,0.99664,3.59,0.61,10.0,4 +6.8,0.64,0.03,2.3,0.075,14.0,31.0,0.99545,3.36,0.58,10.4,6 +6.9,0.63,0.01,2.4,0.076,14.0,39.0,0.99522,3.34,0.53,10.8,6 +6.8,0.59,0.1,1.7,0.063,34.0,53.0,0.9958,3.41,0.67,9.7,5 +6.8,0.59,0.1,1.7,0.063,34.0,53.0,0.9958,3.41,0.67,9.7,5 +7.3,0.48,0.32,2.1,0.062,31.0,54.0,0.99728,3.3,0.65,10.0,7 +6.7,1.04,0.08,2.3,0.067,19.0,32.0,0.99648,3.52,0.57,11.0,4 +7.3,0.48,0.32,2.1,0.062,31.0,54.0,0.99728,3.3,0.65,10.0,7 +7.3,0.98,0.05,2.1,0.061,20.0,49.0,0.99705,3.31,0.55,9.7,3 +10.0,0.69,0.11,1.4,0.084,8.0,24.0,0.99578,2.88,0.47,9.7,5 +6.7,0.7,0.08,3.75,0.067,8.0,16.0,0.99334,3.43,0.52,12.6,5 +7.6,0.35,0.6,2.6,0.073,23.0,44.0,0.99656,3.38,0.79,11.1,6 +6.1,0.6,0.08,1.8,0.071,14.0,45.0,0.99336,3.38,0.54,11.0,5 +9.9,0.5,0.5,13.8,0.205,48.0,82.0,1.00242,3.16,0.75,8.8,5 +5.3,0.47,0.11,2.2,0.048,16.0,89.0,0.99182,3.54,0.88,13.566666666666698,7 +9.9,0.5,0.5,13.8,0.205,48.0,82.0,1.00242,3.16,0.75,8.8,5 +5.3,0.47,0.11,2.2,0.048,16.0,89.0,0.99182,3.54,0.88,13.6,7 +7.1,0.875,0.05,5.7,0.08199999999999999,3.0,14.0,0.99808,3.4,0.52,10.2,3 +8.2,0.28,0.6,3.0,0.104,10.0,22.0,0.99828,3.39,0.68,10.6,5 +5.6,0.62,0.03,1.5,0.08,6.0,13.0,0.99498,3.66,0.62,10.1,4 +8.2,0.28,0.6,3.0,0.104,10.0,22.0,0.99828,3.39,0.68,10.6,5 +7.2,0.58,0.54,2.1,0.114,3.0,9.0,0.99719,3.33,0.57,10.3,4 +8.1,0.33,0.44,1.5,0.042,6.0,12.0,0.99542,3.35,0.61,10.7,5 +6.8,0.91,0.06,2.0,0.06,4.0,11.0,0.99592,3.53,0.64,10.9,4 +7.0,0.655,0.16,2.1,0.07400000000000001,8.0,25.0,0.99606,3.37,0.55,9.7,5 +6.8,0.68,0.21,2.1,0.07,9.0,23.0,0.99546,3.38,0.6,10.3,5 +6.0,0.64,0.05,1.9,0.066,9.0,17.0,0.99496,3.52,0.78,10.6,5 +5.6,0.54,0.04,1.7,0.049,5.0,13.0,0.9942,3.72,0.58,11.4,5 +6.2,0.57,0.1,2.1,0.048,4.0,11.0,0.99448,3.44,0.76,10.8,6 +7.1,0.22,0.49,1.8,0.039,8.0,18.0,0.99344,3.39,0.56,12.4,6 +5.6,0.54,0.04,1.7,0.049,5.0,13.0,0.9942,3.72,0.58,11.4,5 +6.2,0.65,0.06,1.6,0.05,6.0,18.0,0.99348,3.57,0.54,11.95,5 +7.7,0.54,0.26,1.9,0.08900000000000001,23.0,147.0,0.99636,3.26,0.59,9.7,5 +6.4,0.31,0.09,1.4,0.066,15.0,28.0,0.99459,3.42,0.7,10.0,7 +7.0,0.43,0.02,1.9,0.08,15.0,28.0,0.99492,3.35,0.81,10.6,6 +7.7,0.54,0.26,1.9,0.08900000000000001,23.0,147.0,0.99636,3.26,0.59,9.7,5 +6.9,0.74,0.03,2.3,0.054000000000000006,7.0,16.0,0.99508,3.45,0.63,11.5,6 +6.6,0.895,0.04,2.3,0.068,7.0,13.0,0.99582,3.53,0.58,10.8,6 +6.9,0.74,0.03,2.3,0.054000000000000006,7.0,16.0,0.99508,3.45,0.63,11.5,6 +7.5,0.725,0.04,1.5,0.076,8.0,15.0,0.99508,3.26,0.53,9.6,5 +7.8,0.82,0.29,4.3,0.083,21.0,64.0,0.99642,3.16,0.53,9.4,5 +7.3,0.585,0.18,2.4,0.078,15.0,60.0,0.99638,3.31,0.54,9.8,5 +6.2,0.44,0.39,2.5,0.077,6.0,14.0,0.99555,3.51,0.69,11.0,6 +7.5,0.38,0.57,2.3,0.106,5.0,12.0,0.99605,3.36,0.55,11.4,6 +6.7,0.76,0.02,1.8,0.078,6.0,12.0,0.996,3.55,0.63,9.95,3 +6.8,0.81,0.05,2.0,0.07,6.0,14.0,0.99562,3.51,0.66,10.8,6 +7.5,0.38,0.57,2.3,0.106,5.0,12.0,0.99605,3.36,0.55,11.4,6 +7.1,0.27,0.6,2.1,0.07400000000000001,17.0,25.0,0.99814,3.38,0.72,10.6,6 +7.9,0.18,0.4,1.8,0.062,7.0,20.0,0.9941,3.28,0.7,11.1,5 +6.4,0.36,0.21,2.2,0.047,26.0,48.0,0.99661,3.47,0.77,9.7,6 +7.1,0.69,0.04,2.1,0.068,19.0,27.0,0.99712,3.44,0.67,9.8,5 +6.4,0.79,0.04,2.2,0.061,11.0,17.0,0.99588,3.53,0.65,10.4,6 +6.4,0.56,0.15,1.8,0.078,17.0,65.0,0.99294,3.33,0.6,10.5,6 +6.9,0.84,0.21,4.1,0.07400000000000001,16.0,65.0,0.99842,3.53,0.72,9.23333333333333,6 +6.9,0.84,0.21,4.1,0.07400000000000001,16.0,65.0,0.99842,3.53,0.72,9.25,6 +6.1,0.32,0.25,2.3,0.071,23.0,58.0,0.99633,3.42,0.97,10.6,5 +6.5,0.53,0.06,2.0,0.063,29.0,44.0,0.99489,3.38,0.83,10.3,6 +7.4,0.47,0.46,2.2,0.114,7.0,20.0,0.99647,3.32,0.63,10.5,5 +6.6,0.7,0.08,2.6,0.106,14.0,27.0,0.99665,3.44,0.58,10.2,5 +6.5,0.53,0.06,2.0,0.063,29.0,44.0,0.99489,3.38,0.83,10.3,6 +6.9,0.48,0.2,1.9,0.08199999999999999,9.0,23.0,0.99585,3.39,0.43,9.05,4 +6.1,0.32,0.25,2.3,0.071,23.0,58.0,0.99633,3.42,0.97,10.6,5 +6.8,0.48,0.25,2.0,0.076,29.0,61.0,0.9953,3.34,0.6,10.4,5 +6.0,0.42,0.19,2.0,0.075,22.0,47.0,0.99522,3.39,0.78,10.0,6 +6.7,0.48,0.08,2.1,0.064,18.0,34.0,0.99552,3.33,0.64,9.7,5 +6.8,0.47,0.08,2.2,0.064,18.0,38.0,0.99553,3.3,0.65,9.6,6 +7.1,0.53,0.07,1.7,0.071,15.0,24.0,0.9951,3.29,0.66,10.8,6 +7.9,0.29,0.49,2.2,0.096,21.0,59.0,0.99714,3.31,0.67,10.1,6 +7.1,0.69,0.08,2.1,0.063,42.0,52.0,0.99608,3.42,0.6,10.2,6 +6.6,0.44,0.09,2.2,0.063,9.0,18.0,0.99444,3.42,0.69,11.3,6 +6.1,0.705,0.1,2.8,0.081,13.0,28.0,0.99631,3.6,0.66,10.2,5 +7.2,0.53,0.13,2.0,0.058,18.0,22.0,0.99573,3.21,0.68,9.9,6 +8.0,0.39,0.3,1.9,0.07400000000000001,32.0,84.0,0.99717,3.39,0.61,9.0,5 +6.6,0.56,0.14,2.4,0.064,13.0,29.0,0.99397,3.42,0.62,11.7,7 +7.0,0.55,0.13,2.2,0.075,15.0,35.0,0.9959,3.36,0.59,9.7,6 +6.1,0.53,0.08,1.9,0.077,24.0,45.0,0.99528,3.6,0.68,10.3,6 +5.4,0.58,0.08,1.9,0.059,20.0,31.0,0.99484,3.5,0.64,10.2,6 +6.2,0.64,0.09,2.5,0.081,15.0,26.0,0.99538,3.57,0.63,12.0,5 +7.2,0.39,0.32,1.8,0.065,34.0,60.0,0.99714,3.46,0.78,9.9,5 +6.2,0.52,0.08,4.4,0.071,11.0,32.0,0.99646,3.56,0.63,11.6,6 +7.4,0.25,0.29,2.2,0.054000000000000006,19.0,49.0,0.99666,3.4,0.76,10.9,7 +6.7,0.855,0.02,1.9,0.064,29.0,38.0,0.99472,3.3,0.56,10.75,6 +11.1,0.44,0.42,2.2,0.064,14.0,19.0,0.99758,3.25,0.57,10.4,6 +8.4,0.37,0.43,2.3,0.063,12.0,19.0,0.9955,3.17,0.81,11.2,7 +6.5,0.63,0.33,1.8,0.059,16.0,28.0,0.99531,3.36,0.64,10.1,6 +7.0,0.57,0.02,2.0,0.07200000000000001,17.0,26.0,0.99575,3.36,0.61,10.2,5 +6.3,0.6,0.1,1.6,0.048,12.0,26.0,0.99306,3.55,0.51,12.1,5 +11.2,0.4,0.5,2.0,0.099,19.0,50.0,0.99783,3.1,0.58,10.4,5 +7.4,0.36,0.3,1.8,0.07400000000000001,17.0,24.0,0.99419,3.24,0.7,11.4,8 +7.1,0.68,0.0,2.3,0.087,17.0,26.0,0.99783,3.45,0.53,9.5,5 +7.1,0.67,0.0,2.3,0.083,18.0,27.0,0.99768,3.44,0.54,9.4,5 +6.3,0.68,0.01,3.7,0.103,32.0,54.0,0.99586,3.51,0.66,11.3,6 +7.3,0.735,0.0,2.2,0.08,18.0,28.0,0.99765,3.41,0.6,9.4,5 +6.6,0.855,0.02,2.4,0.062,15.0,23.0,0.99627,3.54,0.6,11.0,6 +7.0,0.56,0.17,1.7,0.065,15.0,24.0,0.99514,3.44,0.68,10.55,7 +6.6,0.88,0.04,2.2,0.066,12.0,20.0,0.99636,3.53,0.56,9.9,5 +6.6,0.855,0.02,2.4,0.062,15.0,23.0,0.99627,3.54,0.6,11.0,6 +6.9,0.63,0.33,6.7,0.235,66.0,115.0,0.99787,3.22,0.56,9.5,5 +7.8,0.6,0.26,2.0,0.08,31.0,131.0,0.99622,3.21,0.52,9.9,5 +7.8,0.6,0.26,2.0,0.08,31.0,131.0,0.99622,3.21,0.52,9.9,5 +7.8,0.6,0.26,2.0,0.08,31.0,131.0,0.99622,3.21,0.52,9.9,5 +7.2,0.695,0.13,2.0,0.076,12.0,20.0,0.99546,3.29,0.54,10.1,5 +7.2,0.695,0.13,2.0,0.076,12.0,20.0,0.99546,3.29,0.54,10.1,5 +7.2,0.695,0.13,2.0,0.076,12.0,20.0,0.99546,3.29,0.54,10.1,5 +6.7,0.67,0.02,1.9,0.061,26.0,42.0,0.99489,3.39,0.82,10.9,6 +6.7,0.16,0.64,2.1,0.059,24.0,52.0,0.99494,3.34,0.71,11.2,6 +7.2,0.695,0.13,2.0,0.076,12.0,20.0,0.99546,3.29,0.54,10.1,5 +7.0,0.56,0.13,1.6,0.077,25.0,42.0,0.99629,3.34,0.59,9.2,5 +6.2,0.51,0.14,1.9,0.056,15.0,34.0,0.99396,3.48,0.57,11.5,6 +6.4,0.36,0.53,2.2,0.23,19.0,35.0,0.9934,3.37,0.93,12.4,6 +6.4,0.38,0.14,2.2,0.038,15.0,25.0,0.99514,3.44,0.65,11.1,6 +7.3,0.69,0.32,2.2,0.069,35.0,104.0,0.99632,3.33,0.51,9.5,5 +6.0,0.58,0.2,2.4,0.075,15.0,50.0,0.99467,3.58,0.67,12.5,6 +5.6,0.31,0.78,13.9,0.07400000000000001,23.0,92.0,0.99677,3.39,0.48,10.5,6 +7.5,0.52,0.4,2.2,0.06,12.0,20.0,0.99474,3.26,0.64,11.8,6 +8.0,0.3,0.63,1.6,0.081,16.0,29.0,0.99588,3.3,0.78,10.8,6 +6.2,0.7,0.15,5.1,0.076,13.0,27.0,0.99622,3.54,0.6,11.9,6 +6.8,0.67,0.15,1.8,0.118,13.0,20.0,0.9954,3.42,0.67,11.3,6 +6.2,0.56,0.09,1.7,0.053,24.0,32.0,0.99402,3.54,0.6,11.3,5 +7.4,0.35,0.33,2.4,0.068,9.0,26.0,0.9947,3.36,0.6,11.9,6 +6.2,0.56,0.09,1.7,0.053,24.0,32.0,0.99402,3.54,0.6,11.3,5 +6.1,0.715,0.1,2.6,0.053,13.0,27.0,0.99362,3.57,0.5,11.9,5 +6.2,0.46,0.29,2.1,0.07400000000000001,32.0,98.0,0.99578,3.33,0.62,9.8,5 +6.7,0.32,0.44,2.4,0.061,24.0,34.0,0.99484,3.29,0.8,11.6,7 +7.2,0.39,0.44,2.6,0.066,22.0,48.0,0.99494,3.3,0.84,11.5,6 +7.5,0.31,0.41,2.4,0.065,34.0,60.0,0.99492,3.34,0.85,11.4,6 +5.8,0.61,0.11,1.8,0.066,18.0,28.0,0.99483,3.55,0.66,10.9,6 +7.2,0.66,0.33,2.5,0.068,34.0,102.0,0.99414,3.27,0.78,12.8,6 +6.6,0.725,0.2,7.8,0.073,29.0,79.0,0.9977,3.29,0.54,9.2,5 +6.3,0.55,0.15,1.8,0.077,26.0,35.0,0.99314,3.32,0.82,11.6,6 +5.4,0.74,0.09,1.7,0.08900000000000001,16.0,26.0,0.99402,3.67,0.56,11.6,6 +6.3,0.51,0.13,2.3,0.076,29.0,40.0,0.99574,3.42,0.75,11.0,6 +6.8,0.62,0.08,1.9,0.068,28.0,38.0,0.99651,3.42,0.82,9.5,6 +6.2,0.6,0.08,2.0,0.09,32.0,44.0,0.9949,3.45,0.58,10.5,5 +5.9,0.55,0.1,2.2,0.062,39.0,51.0,0.99512,3.52,0.76,11.2,6 +6.3,0.51,0.13,2.3,0.076,29.0,40.0,0.99574,3.42,0.75,11.0,6 +5.9,0.645,0.12,2.0,0.075,32.0,44.0,0.99547,3.57,0.71,10.2,5 +6.0,0.31,0.47,3.6,0.067,18.0,42.0,0.99549,3.39,0.66,11.0,6 \ No newline at end of file diff --git a/cmake-build-debug-wsl/winedata1.xlsx b/cmake-build-debug-wsl/winedata1.xlsx new file mode 100644 index 0000000..90b40d2 Binary files /dev/null and b/cmake-build-debug-wsl/winedata1.xlsx differ diff --git a/cmake-build-debug-wsl/winequality-red.csv b/cmake-build-debug-wsl/winequality-red.csv new file mode 100644 index 0000000..62e674c --- /dev/null +++ b/cmake-build-debug-wsl/winequality-red.csv @@ -0,0 +1,1600 @@ +fixed acidity,volatile acidity,citric acid,residual sugar,chlorides,free sulfur dioxide,total sulfur dioxide,density,pH,sulphates,alcohol,quality +7.4,0.7,0.0,1.9,0.076,11.0,34.0,0.9978,3.51,0.56,9.4,5 +7.8,0.88,0.0,2.6,0.098,25.0,67.0,0.9968,3.2,0.68,9.8,5 +7.8,0.76,0.04,2.3,0.092,15.0,54.0,0.997,3.26,0.65,9.8,5 +11.2,0.28,0.56,1.9,0.075,17.0,60.0,0.998,3.16,0.58,9.8,6 +7.4,0.7,0.0,1.9,0.076,11.0,34.0,0.9978,3.51,0.56,9.4,5 +7.4,0.66,0.0,1.8,0.075,13.0,40.0,0.9978,3.51,0.56,9.4,5 +7.9,0.6,0.06,1.6,0.069,15.0,59.0,0.9964,3.3,0.46,9.4,5 +7.3,0.65,0.0,1.2,0.065,15.0,21.0,0.9946,3.39,0.47,10.0,7 +7.8,0.58,0.02,2.0,0.073,9.0,18.0,0.9968,3.36,0.57,9.5,7 +7.5,0.5,0.36,6.1,0.071,17.0,102.0,0.9978,3.35,0.8,10.5,5 +6.7,0.58,0.08,1.8,0.09699999999999999,15.0,65.0,0.9959,3.28,0.54,9.2,5 +7.5,0.5,0.36,6.1,0.071,17.0,102.0,0.9978,3.35,0.8,10.5,5 +5.6,0.615,0.0,1.6,0.08900000000000001,16.0,59.0,0.9943,3.58,0.52,9.9,5 +7.8,0.61,0.29,1.6,0.114,9.0,29.0,0.9974,3.26,1.56,9.1,5 +8.9,0.62,0.18,3.8,0.17600000000000002,52.0,145.0,0.9986,3.16,0.88,9.2,5 +8.9,0.62,0.19,3.9,0.17,51.0,148.0,0.9986,3.17,0.93,9.2,5 +8.5,0.28,0.56,1.8,0.092,35.0,103.0,0.9969,3.3,0.75,10.5,7 +8.1,0.56,0.28,1.7,0.368,16.0,56.0,0.9968,3.11,1.28,9.3,5 +7.4,0.59,0.08,4.4,0.086,6.0,29.0,0.9974,3.38,0.5,9.0,4 +7.9,0.32,0.51,1.8,0.341,17.0,56.0,0.9969,3.04,1.08,9.2,6 +8.9,0.22,0.48,1.8,0.077,29.0,60.0,0.9968,3.39,0.53,9.4,6 +7.6,0.39,0.31,2.3,0.08199999999999999,23.0,71.0,0.9982,3.52,0.65,9.7,5 +7.9,0.43,0.21,1.6,0.106,10.0,37.0,0.9966,3.17,0.91,9.5,5 +8.5,0.49,0.11,2.3,0.084,9.0,67.0,0.9968,3.17,0.53,9.4,5 +6.9,0.4,0.14,2.4,0.085,21.0,40.0,0.9968,3.43,0.63,9.7,6 +6.3,0.39,0.16,1.4,0.08,11.0,23.0,0.9955,3.34,0.56,9.3,5 +7.6,0.41,0.24,1.8,0.08,4.0,11.0,0.9962,3.28,0.59,9.5,5 +7.9,0.43,0.21,1.6,0.106,10.0,37.0,0.9966,3.17,0.91,9.5,5 +7.1,0.71,0.0,1.9,0.08,14.0,35.0,0.9972,3.47,0.55,9.4,5 +7.8,0.645,0.0,2.0,0.08199999999999999,8.0,16.0,0.9964,3.38,0.59,9.8,6 +6.7,0.675,0.07,2.4,0.08900000000000001,17.0,82.0,0.9958,3.35,0.54,10.1,5 +6.9,0.685,0.0,2.5,0.105,22.0,37.0,0.9966,3.46,0.57,10.6,6 +8.3,0.655,0.12,2.3,0.083,15.0,113.0,0.9966,3.17,0.66,9.8,5 +6.9,0.605,0.12,10.7,0.073,40.0,83.0,0.9993,3.45,0.52,9.4,6 +5.2,0.32,0.25,1.8,0.10300000000000001,13.0,50.0,0.9957,3.38,0.55,9.2,5 +7.8,0.645,0.0,5.5,0.086,5.0,18.0,0.9986,3.4,0.55,9.6,6 +7.8,0.6,0.14,2.4,0.086,3.0,15.0,0.9975,3.42,0.6,10.8,6 +8.1,0.38,0.28,2.1,0.066,13.0,30.0,0.9968,3.23,0.73,9.7,7 +5.7,1.13,0.09,1.5,0.172,7.0,19.0,0.9940000000000001,3.5,0.48,9.8,4 +7.3,0.45,0.36,5.9,0.07400000000000001,12.0,87.0,0.9978,3.33,0.83,10.5,5 +7.3,0.45,0.36,5.9,0.07400000000000001,12.0,87.0,0.9978,3.33,0.83,10.5,5 +8.8,0.61,0.3,2.8,0.08800000000000001,17.0,46.0,0.9976,3.26,0.51,9.3,4 +7.5,0.49,0.2,2.6,0.332,8.0,14.0,0.9968,3.21,0.9,10.5,6 +8.1,0.66,0.22,2.2,0.069,9.0,23.0,0.9968,3.3,1.2,10.3,5 +6.8,0.67,0.02,1.8,0.05,5.0,11.0,0.9962,3.48,0.52,9.5,5 +4.6,0.52,0.15,2.1,0.054000000000000006,8.0,65.0,0.9934,3.9,0.56,13.1,4 +7.7,0.935,0.43,2.2,0.114,22.0,114.0,0.997,3.25,0.73,9.2,5 +8.7,0.29,0.52,1.6,0.113,12.0,37.0,0.9969,3.25,0.58,9.5,5 +6.4,0.4,0.23,1.6,0.066,5.0,12.0,0.9958,3.34,0.56,9.2,5 +5.6,0.31,0.37,1.4,0.07400000000000001,12.0,96.0,0.9954,3.32,0.58,9.2,5 +8.8,0.66,0.26,1.7,0.07400000000000001,4.0,23.0,0.9971,3.15,0.74,9.2,5 +6.6,0.52,0.04,2.2,0.069,8.0,15.0,0.9956,3.4,0.63,9.4,6 +6.6,0.5,0.04,2.1,0.068,6.0,14.0,0.9955,3.39,0.64,9.4,6 +8.6,0.38,0.36,3.0,0.081,30.0,119.0,0.997,3.2,0.56,9.4,5 +7.6,0.51,0.15,2.8,0.11,33.0,73.0,0.9955,3.17,0.63,10.2,6 +7.7,0.62,0.04,3.8,0.084,25.0,45.0,0.9978,3.34,0.53,9.5,5 +10.2,0.42,0.57,3.4,0.07,4.0,10.0,0.9971,3.04,0.63,9.6,5 +7.5,0.63,0.12,5.1,0.111,50.0,110.0,0.9983,3.26,0.77,9.4,5 +7.8,0.59,0.18,2.3,0.076,17.0,54.0,0.9975,3.43,0.59,10.0,5 +7.3,0.39,0.31,2.4,0.07400000000000001,9.0,46.0,0.9962,3.41,0.54,9.4,6 +8.8,0.4,0.4,2.2,0.079,19.0,52.0,0.998,3.44,0.64,9.2,5 +7.7,0.69,0.49,1.8,0.115,20.0,112.0,0.9968,3.21,0.71,9.3,5 +7.5,0.52,0.16,1.9,0.085,12.0,35.0,0.9968,3.38,0.62,9.5,7 +7.0,0.735,0.05,2.0,0.081,13.0,54.0,0.9966,3.39,0.57,9.8,5 +7.2,0.725,0.05,4.65,0.086,4.0,11.0,0.9962,3.41,0.39,10.9,5 +7.2,0.725,0.05,4.65,0.086,4.0,11.0,0.9962,3.41,0.39,10.9,5 +7.5,0.52,0.11,1.5,0.079,11.0,39.0,0.9968,3.42,0.58,9.6,5 +6.6,0.705,0.07,1.6,0.076,6.0,15.0,0.9962,3.44,0.58,10.7,5 +9.3,0.32,0.57,2.0,0.07400000000000001,27.0,65.0,0.9969,3.28,0.79,10.7,5 +8.0,0.705,0.05,1.9,0.07400000000000001,8.0,19.0,0.9962,3.34,0.95,10.5,6 +7.7,0.63,0.08,1.9,0.076,15.0,27.0,0.9967,3.32,0.54,9.5,6 +7.7,0.67,0.23,2.1,0.08800000000000001,17.0,96.0,0.9962,3.32,0.48,9.5,5 +7.7,0.69,0.22,1.9,0.084,18.0,94.0,0.9961,3.31,0.48,9.5,5 +8.3,0.675,0.26,2.1,0.084,11.0,43.0,0.9976,3.31,0.53,9.2,4 +9.7,0.32,0.54,2.5,0.094,28.0,83.0,0.9984,3.28,0.82,9.6,5 +8.8,0.41,0.64,2.2,0.09300000000000001,9.0,42.0,0.9986,3.54,0.66,10.5,5 +8.8,0.41,0.64,2.2,0.09300000000000001,9.0,42.0,0.9986,3.54,0.66,10.5,5 +6.8,0.785,0.0,2.4,0.10400000000000001,14.0,30.0,0.9966,3.52,0.55,10.7,6 +6.7,0.75,0.12,2.0,0.086,12.0,80.0,0.9958,3.38,0.52,10.1,5 +8.3,0.625,0.2,1.5,0.08,27.0,119.0,0.9972,3.16,1.12,9.1,4 +6.2,0.45,0.2,1.6,0.069,3.0,15.0,0.9958,3.41,0.56,9.2,5 +7.8,0.43,0.7,1.9,0.46399999999999997,22.0,67.0,0.9974,3.13,1.28,9.4,5 +7.4,0.5,0.47,2.0,0.086,21.0,73.0,0.997,3.36,0.57,9.1,5 +7.3,0.67,0.26,1.8,0.401,16.0,51.0,0.9969,3.16,1.14,9.4,5 +6.3,0.3,0.48,1.8,0.069,18.0,61.0,0.9959,3.44,0.78,10.3,6 +6.9,0.55,0.15,2.2,0.076,19.0,40.0,0.9961,3.41,0.59,10.1,5 +8.6,0.49,0.28,1.9,0.11,20.0,136.0,0.9972,2.93,1.95,9.9,6 +7.7,0.49,0.26,1.9,0.062,9.0,31.0,0.9966,3.39,0.64,9.6,5 +9.3,0.39,0.44,2.1,0.107,34.0,125.0,0.9978,3.14,1.22,9.5,5 +7.0,0.62,0.08,1.8,0.076,8.0,24.0,0.9978,3.48,0.53,9.0,5 +7.9,0.52,0.26,1.9,0.079,42.0,140.0,0.9964,3.23,0.54,9.5,5 +8.6,0.49,0.28,1.9,0.11,20.0,136.0,0.9972,2.93,1.95,9.9,6 +8.6,0.49,0.29,2.0,0.11,19.0,133.0,0.9972,2.93,1.98,9.8,5 +7.7,0.49,0.26,1.9,0.062,9.0,31.0,0.9966,3.39,0.64,9.6,5 +5.0,1.02,0.04,1.4,0.045,41.0,85.0,0.9938,3.75,0.48,10.5,4 +4.7,0.6,0.17,2.3,0.057999999999999996,17.0,106.0,0.9932,3.85,0.6,12.9,6 +6.8,0.775,0.0,3.0,0.102,8.0,23.0,0.9965,3.45,0.56,10.7,5 +7.0,0.5,0.25,2.0,0.07,3.0,22.0,0.9963,3.25,0.63,9.2,5 +7.6,0.9,0.06,2.5,0.079,5.0,10.0,0.9967,3.39,0.56,9.8,5 +8.1,0.545,0.18,1.9,0.08,13.0,35.0,0.9972,3.3,0.59,9.0,6 +8.3,0.61,0.3,2.1,0.084,11.0,50.0,0.9972,3.4,0.61,10.2,6 +7.8,0.5,0.3,1.9,0.075,8.0,22.0,0.9959,3.31,0.56,10.4,6 +8.1,0.545,0.18,1.9,0.08,13.0,35.0,0.9972,3.3,0.59,9.0,6 +8.1,0.575,0.22,2.1,0.077,12.0,65.0,0.9967,3.29,0.51,9.2,5 +7.2,0.49,0.24,2.2,0.07,5.0,36.0,0.996,3.33,0.48,9.4,5 +8.1,0.575,0.22,2.1,0.077,12.0,65.0,0.9967,3.29,0.51,9.2,5 +7.8,0.41,0.68,1.7,0.467,18.0,69.0,0.9973,3.08,1.31,9.3,5 +6.2,0.63,0.31,1.7,0.08800000000000001,15.0,64.0,0.9969,3.46,0.79,9.3,5 +8.0,0.33,0.53,2.5,0.091,18.0,80.0,0.9976,3.37,0.8,9.6,6 +8.1,0.785,0.52,2.0,0.122,37.0,153.0,0.9969,3.21,0.69,9.3,5 +7.8,0.56,0.19,1.8,0.10400000000000001,12.0,47.0,0.9964,3.19,0.93,9.5,5 +8.4,0.62,0.09,2.2,0.084,11.0,108.0,0.9964,3.15,0.66,9.8,5 +8.4,0.6,0.1,2.2,0.085,14.0,111.0,0.9964,3.15,0.66,9.8,5 +10.1,0.31,0.44,2.3,0.08,22.0,46.0,0.9988,3.32,0.67,9.7,6 +7.8,0.56,0.19,1.8,0.10400000000000001,12.0,47.0,0.9964,3.19,0.93,9.5,5 +9.4,0.4,0.31,2.2,0.09,13.0,62.0,0.9966,3.07,0.63,10.5,6 +8.3,0.54,0.28,1.9,0.077,11.0,40.0,0.9978,3.39,0.61,10.0,6 +7.8,0.56,0.12,2.0,0.08199999999999999,7.0,28.0,0.997,3.37,0.5,9.4,6 +8.8,0.55,0.04,2.2,0.11900000000000001,14.0,56.0,0.9962,3.21,0.6,10.9,6 +7.0,0.69,0.08,1.8,0.09699999999999999,22.0,89.0,0.9959,3.34,0.54,9.2,6 +7.3,1.07,0.09,1.7,0.17800000000000002,10.0,89.0,0.9962,3.3,0.57,9.0,5 +8.8,0.55,0.04,2.2,0.11900000000000001,14.0,56.0,0.9962,3.21,0.6,10.9,6 +7.3,0.695,0.0,2.5,0.075,3.0,13.0,0.998,3.49,0.52,9.2,5 +8.0,0.71,0.0,2.6,0.08,11.0,34.0,0.9976,3.44,0.53,9.5,5 +7.8,0.5,0.17,1.6,0.08199999999999999,21.0,102.0,0.996,3.39,0.48,9.5,5 +9.0,0.62,0.04,1.9,0.146,27.0,90.0,0.9984,3.16,0.7,9.4,5 +8.2,1.33,0.0,1.7,0.081,3.0,12.0,0.9964,3.53,0.49,10.9,5 +8.1,1.33,0.0,1.8,0.08199999999999999,3.0,12.0,0.9964,3.54,0.48,10.9,5 +8.0,0.59,0.16,1.8,0.065,3.0,16.0,0.9962,3.42,0.92,10.5,7 +6.1,0.38,0.15,1.8,0.07200000000000001,6.0,19.0,0.9955,3.42,0.57,9.4,5 +8.0,0.745,0.56,2.0,0.11800000000000001,30.0,134.0,0.9968,3.24,0.66,9.4,5 +5.6,0.5,0.09,2.3,0.049,17.0,99.0,0.9937,3.63,0.63,13.0,5 +5.6,0.5,0.09,2.3,0.049,17.0,99.0,0.9937,3.63,0.63,13.0,5 +6.6,0.5,0.01,1.5,0.06,17.0,26.0,0.9952,3.4,0.58,9.8,6 +7.9,1.04,0.05,2.2,0.084,13.0,29.0,0.9959,3.22,0.55,9.9,6 +8.4,0.745,0.11,1.9,0.09,16.0,63.0,0.9965,3.19,0.82,9.6,5 +8.3,0.715,0.15,1.8,0.08900000000000001,10.0,52.0,0.9968,3.23,0.77,9.5,5 +7.2,0.415,0.36,2.0,0.081,13.0,45.0,0.9972,3.48,0.64,9.2,5 +7.8,0.56,0.19,2.1,0.081,15.0,105.0,0.9962,3.33,0.54,9.5,5 +7.8,0.56,0.19,2.0,0.081,17.0,108.0,0.9962,3.32,0.54,9.5,5 +8.4,0.745,0.11,1.9,0.09,16.0,63.0,0.9965,3.19,0.82,9.6,5 +8.3,0.715,0.15,1.8,0.08900000000000001,10.0,52.0,0.9968,3.23,0.77,9.5,5 +5.2,0.34,0.0,1.8,0.05,27.0,63.0,0.9916,3.68,0.79,14.0,6 +6.3,0.39,0.08,1.7,0.066,3.0,20.0,0.9954,3.34,0.58,9.4,5 +5.2,0.34,0.0,1.8,0.05,27.0,63.0,0.9916,3.68,0.79,14.0,6 +8.1,0.67,0.55,1.8,0.11699999999999999,32.0,141.0,0.9968,3.17,0.62,9.4,5 +5.8,0.68,0.02,1.8,0.087,21.0,94.0,0.9944,3.54,0.52,10.0,5 +7.6,0.49,0.26,1.6,0.23600000000000002,10.0,88.0,0.9968,3.11,0.8,9.3,5 +6.9,0.49,0.1,2.3,0.07400000000000001,12.0,30.0,0.9959,3.42,0.58,10.2,6 +8.2,0.4,0.44,2.8,0.08900000000000001,11.0,43.0,0.9975,3.53,0.61,10.5,6 +7.3,0.33,0.47,2.1,0.077,5.0,11.0,0.9958,3.33,0.53,10.3,6 +9.2,0.52,1.0,3.4,0.61,32.0,69.0,0.9996,2.74,2.0,9.4,4 +7.5,0.6,0.03,1.8,0.095,25.0,99.0,0.995,3.35,0.54,10.1,5 +7.5,0.6,0.03,1.8,0.095,25.0,99.0,0.995,3.35,0.54,10.1,5 +7.1,0.43,0.42,5.5,0.07,29.0,129.0,0.9973,3.42,0.72,10.5,5 +7.1,0.43,0.42,5.5,0.071,28.0,128.0,0.9973,3.42,0.71,10.5,5 +7.1,0.43,0.42,5.5,0.07,29.0,129.0,0.9973,3.42,0.72,10.5,5 +7.1,0.43,0.42,5.5,0.071,28.0,128.0,0.9973,3.42,0.71,10.5,5 +7.1,0.68,0.0,2.2,0.073,12.0,22.0,0.9969,3.48,0.5,9.3,5 +6.8,0.6,0.18,1.9,0.079,18.0,86.0,0.9968,3.59,0.57,9.3,6 +7.6,0.95,0.03,2.0,0.09,7.0,20.0,0.9959,3.2,0.56,9.6,5 +7.6,0.68,0.02,1.3,0.07200000000000001,9.0,20.0,0.9965,3.17,1.08,9.2,4 +7.8,0.53,0.04,1.7,0.076,17.0,31.0,0.9964,3.33,0.56,10.0,6 +7.4,0.6,0.26,7.3,0.07,36.0,121.0,0.9982,3.37,0.49,9.4,5 +7.3,0.59,0.26,7.2,0.07,35.0,121.0,0.9981,3.37,0.49,9.4,5 +7.8,0.63,0.48,1.7,0.1,14.0,96.0,0.9961,3.19,0.62,9.5,5 +6.8,0.64,0.1,2.1,0.085,18.0,101.0,0.9956,3.34,0.52,10.2,5 +7.3,0.55,0.03,1.6,0.07200000000000001,17.0,42.0,0.9956,3.37,0.48,9.0,4 +6.8,0.63,0.07,2.1,0.08900000000000001,11.0,44.0,0.9953,3.47,0.55,10.4,6 +7.5,0.705,0.24,1.8,0.36,15.0,63.0,0.9964,3.0,1.59,9.5,5 +7.9,0.885,0.03,1.8,0.057999999999999996,4.0,8.0,0.9972,3.36,0.33,9.1,4 +8.0,0.42,0.17,2.0,0.073,6.0,18.0,0.9972,3.29,0.61,9.2,6 +8.0,0.42,0.17,2.0,0.073,6.0,18.0,0.9972,3.29,0.61,9.2,6 +7.4,0.62,0.05,1.9,0.068,24.0,42.0,0.9961,3.42,0.57,11.5,6 +7.3,0.38,0.21,2.0,0.08,7.0,35.0,0.9961,3.33,0.47,9.5,5 +6.9,0.5,0.04,1.5,0.085,19.0,49.0,0.9958,3.35,0.78,9.5,5 +7.3,0.38,0.21,2.0,0.08,7.0,35.0,0.9961,3.33,0.47,9.5,5 +7.5,0.52,0.42,2.3,0.087,8.0,38.0,0.9972,3.58,0.61,10.5,6 +7.0,0.805,0.0,2.5,0.068,7.0,20.0,0.9969,3.48,0.56,9.6,5 +8.8,0.61,0.14,2.4,0.067,10.0,42.0,0.9969,3.19,0.59,9.5,5 +8.8,0.61,0.14,2.4,0.067,10.0,42.0,0.9969,3.19,0.59,9.5,5 +8.9,0.61,0.49,2.0,0.27,23.0,110.0,0.9972,3.12,1.02,9.3,5 +7.2,0.73,0.02,2.5,0.076,16.0,42.0,0.9972,3.44,0.52,9.3,5 +6.8,0.61,0.2,1.8,0.077,11.0,65.0,0.9971,3.54,0.58,9.3,5 +6.7,0.62,0.21,1.9,0.079,8.0,62.0,0.997,3.52,0.58,9.3,6 +8.9,0.31,0.57,2.0,0.111,26.0,85.0,0.9971,3.26,0.53,9.7,5 +7.4,0.39,0.48,2.0,0.08199999999999999,14.0,67.0,0.9972,3.34,0.55,9.2,5 +7.7,0.705,0.1,2.6,0.084,9.0,26.0,0.9976,3.39,0.49,9.7,5 +7.9,0.5,0.33,2.0,0.084,15.0,143.0,0.9968,3.2,0.55,9.5,5 +7.9,0.49,0.32,1.9,0.08199999999999999,17.0,144.0,0.9968,3.2,0.55,9.5,5 +8.2,0.5,0.35,2.9,0.077,21.0,127.0,0.9976,3.23,0.62,9.4,5 +6.4,0.37,0.25,1.9,0.07400000000000001,21.0,49.0,0.9974,3.57,0.62,9.8,6 +6.8,0.63,0.12,3.8,0.099,16.0,126.0,0.9969,3.28,0.61,9.5,5 +7.6,0.55,0.21,2.2,0.071,7.0,28.0,0.9964,3.28,0.55,9.7,5 +7.6,0.55,0.21,2.2,0.071,7.0,28.0,0.9964,3.28,0.55,9.7,5 +7.8,0.59,0.33,2.0,0.07400000000000001,24.0,120.0,0.9968,3.25,0.54,9.4,5 +7.3,0.58,0.3,2.4,0.07400000000000001,15.0,55.0,0.9968,3.46,0.59,10.2,5 +11.5,0.3,0.6,2.0,0.067,12.0,27.0,0.9981,3.11,0.97,10.1,6 +5.4,0.835,0.08,1.2,0.046,13.0,93.0,0.9924,3.57,0.85,13.0,7 +6.9,1.09,0.06,2.1,0.061,12.0,31.0,0.9948,3.51,0.43,11.4,4 +9.6,0.32,0.47,1.4,0.055999999999999994,9.0,24.0,0.99695,3.22,0.82,10.3,7 +8.8,0.37,0.48,2.1,0.09699999999999999,39.0,145.0,0.9975,3.04,1.03,9.3,5 +6.8,0.5,0.11,1.5,0.075,16.0,49.0,0.99545,3.36,0.79,9.5,5 +7.0,0.42,0.35,1.6,0.08800000000000001,16.0,39.0,0.9961,3.34,0.55,9.2,5 +7.0,0.43,0.36,1.6,0.08900000000000001,14.0,37.0,0.99615,3.34,0.56,9.2,6 +12.8,0.3,0.74,2.6,0.095,9.0,28.0,0.9994,3.2,0.77,10.8,7 +12.8,0.3,0.74,2.6,0.095,9.0,28.0,0.9994,3.2,0.77,10.8,7 +7.8,0.57,0.31,1.8,0.069,26.0,120.0,0.99625,3.29,0.53,9.3,5 +7.8,0.44,0.28,2.7,0.1,18.0,95.0,0.9966,3.22,0.67,9.4,5 +11.0,0.3,0.58,2.1,0.054000000000000006,7.0,19.0,0.998,3.31,0.88,10.5,7 +9.7,0.53,0.6,2.0,0.039,5.0,19.0,0.99585,3.3,0.86,12.4,6 +8.0,0.725,0.24,2.8,0.083,10.0,62.0,0.99685,3.35,0.56,10.0,6 +11.6,0.44,0.64,2.1,0.059000000000000004,5.0,15.0,0.998,3.21,0.67,10.2,6 +8.2,0.57,0.26,2.2,0.06,28.0,65.0,0.9959,3.3,0.43,10.1,5 +7.8,0.735,0.08,2.4,0.092,10.0,41.0,0.9974,3.24,0.71,9.8,6 +7.0,0.49,0.49,5.6,0.06,26.0,121.0,0.9974,3.34,0.76,10.5,5 +8.7,0.625,0.16,2.0,0.10099999999999999,13.0,49.0,0.9962,3.14,0.57,11.0,5 +8.1,0.725,0.22,2.2,0.07200000000000001,11.0,41.0,0.9967,3.36,0.55,9.1,5 +7.5,0.49,0.19,1.9,0.076,10.0,44.0,0.9957,3.39,0.54,9.7,5 +7.8,0.53,0.33,2.4,0.08,24.0,144.0,0.99655,3.3,0.6,9.5,5 +7.8,0.34,0.37,2.0,0.08199999999999999,24.0,58.0,0.9964,3.34,0.59,9.4,6 +7.4,0.53,0.26,2.0,0.10099999999999999,16.0,72.0,0.9957,3.15,0.57,9.4,5 +6.8,0.61,0.04,1.5,0.057,5.0,10.0,0.99525,3.42,0.6,9.5,5 +8.6,0.645,0.25,2.0,0.083,8.0,28.0,0.99815,3.28,0.6,10.0,6 +8.4,0.635,0.36,2.0,0.08900000000000001,15.0,55.0,0.99745,3.31,0.57,10.4,4 +7.7,0.43,0.25,2.6,0.073,29.0,63.0,0.99615,3.37,0.58,10.5,6 +8.9,0.59,0.5,2.0,0.337,27.0,81.0,0.9964,3.04,1.61,9.5,6 +9.0,0.82,0.14,2.6,0.08900000000000001,9.0,23.0,0.9984,3.39,0.63,9.8,5 +7.7,0.43,0.25,2.6,0.073,29.0,63.0,0.99615,3.37,0.58,10.5,6 +6.9,0.52,0.25,2.6,0.081,10.0,37.0,0.99685,3.46,0.5,11.0,5 +5.2,0.48,0.04,1.6,0.054000000000000006,19.0,106.0,0.9927,3.54,0.62,12.2,7 +8.0,0.38,0.06,1.8,0.078,12.0,49.0,0.99625,3.37,0.52,9.9,6 +8.5,0.37,0.2,2.8,0.09,18.0,58.0,0.998,3.34,0.7,9.6,6 +6.9,0.52,0.25,2.6,0.081,10.0,37.0,0.99685,3.46,0.5,11.0,5 +8.2,1.0,0.09,2.3,0.065,7.0,37.0,0.99685,3.32,0.55,9.0,6 +7.2,0.63,0.0,1.9,0.09699999999999999,14.0,38.0,0.99675,3.37,0.58,9.0,6 +7.2,0.63,0.0,1.9,0.09699999999999999,14.0,38.0,0.99675,3.37,0.58,9.0,6 +7.2,0.645,0.0,1.9,0.09699999999999999,15.0,39.0,0.99675,3.37,0.58,9.2,6 +7.2,0.63,0.0,1.9,0.09699999999999999,14.0,38.0,0.99675,3.37,0.58,9.0,6 +8.2,1.0,0.09,2.3,0.065,7.0,37.0,0.99685,3.32,0.55,9.0,6 +8.9,0.635,0.37,1.7,0.263,5.0,62.0,0.9971,3.0,1.09,9.3,5 +12.0,0.38,0.56,2.1,0.09300000000000001,6.0,24.0,0.99925,3.14,0.71,10.9,6 +7.7,0.58,0.1,1.8,0.102,28.0,109.0,0.99565,3.08,0.49,9.8,6 +15.0,0.21,0.44,2.2,0.075,10.0,24.0,1.00005,3.07,0.84,9.2,7 +15.0,0.21,0.44,2.2,0.075,10.0,24.0,1.00005,3.07,0.84,9.2,7 +7.3,0.66,0.0,2.0,0.084,6.0,23.0,0.9983,3.61,0.96,9.9,6 +7.1,0.68,0.07,1.9,0.075,16.0,51.0,0.99685,3.38,0.52,9.5,5 +8.2,0.6,0.17,2.3,0.07200000000000001,11.0,73.0,0.9963,3.2,0.45,9.3,5 +7.7,0.53,0.06,1.7,0.07400000000000001,9.0,39.0,0.99615,3.35,0.48,9.8,6 +7.3,0.66,0.0,2.0,0.084,6.0,23.0,0.9983,3.61,0.96,9.9,6 +10.8,0.32,0.44,1.6,0.063,16.0,37.0,0.9985,3.22,0.78,10.0,6 +7.1,0.6,0.0,1.8,0.07400000000000001,16.0,34.0,0.9972,3.47,0.7,9.9,6 +11.1,0.35,0.48,3.1,0.09,5.0,21.0,0.9986,3.17,0.53,10.5,5 +7.7,0.775,0.42,1.9,0.092,8.0,86.0,0.9959,3.23,0.59,9.5,5 +7.1,0.6,0.0,1.8,0.07400000000000001,16.0,34.0,0.9972,3.47,0.7,9.9,6 +8.0,0.57,0.23,3.2,0.073,17.0,119.0,0.99675,3.26,0.57,9.3,5 +9.4,0.34,0.37,2.2,0.075,5.0,13.0,0.998,3.22,0.62,9.2,5 +6.6,0.695,0.0,2.1,0.075,12.0,56.0,0.9968,3.49,0.67,9.2,5 +7.7,0.41,0.76,1.8,0.611,8.0,45.0,0.9968,3.06,1.26,9.4,5 +10.0,0.31,0.47,2.6,0.085,14.0,33.0,0.99965,3.36,0.8,10.5,7 +7.9,0.33,0.23,1.7,0.077,18.0,45.0,0.99625,3.29,0.65,9.3,5 +7.0,0.975,0.04,2.0,0.087,12.0,67.0,0.99565,3.35,0.6,9.4,4 +8.0,0.52,0.03,1.7,0.07,10.0,35.0,0.99575,3.34,0.57,10.0,5 +7.9,0.37,0.23,1.8,0.077,23.0,49.0,0.9963,3.28,0.67,9.3,5 +12.5,0.56,0.49,2.4,0.064,5.0,27.0,0.9999,3.08,0.87,10.9,5 +11.8,0.26,0.52,1.8,0.071,6.0,10.0,0.9968,3.2,0.72,10.2,7 +8.1,0.87,0.0,3.3,0.096,26.0,61.0,1.00025,3.6,0.72,9.8,4 +7.9,0.35,0.46,3.6,0.078,15.0,37.0,0.9973,3.35,0.86,12.8,8 +6.9,0.54,0.04,3.0,0.077,7.0,27.0,0.9987,3.69,0.91,9.4,6 +11.5,0.18,0.51,4.0,0.10400000000000001,4.0,23.0,0.9996,3.28,0.97,10.1,6 +7.9,0.545,0.06,4.0,0.087,27.0,61.0,0.9965,3.36,0.67,10.7,6 +11.5,0.18,0.51,4.0,0.10400000000000001,4.0,23.0,0.9996,3.28,0.97,10.1,6 +10.9,0.37,0.58,4.0,0.071,17.0,65.0,0.99935,3.22,0.78,10.1,5 +8.4,0.715,0.2,2.4,0.076,10.0,38.0,0.99735,3.31,0.64,9.4,5 +7.5,0.65,0.18,7.0,0.08800000000000001,27.0,94.0,0.99915,3.38,0.77,9.4,5 +7.9,0.545,0.06,4.0,0.087,27.0,61.0,0.9965,3.36,0.67,10.7,6 +6.9,0.54,0.04,3.0,0.077,7.0,27.0,0.9987,3.69,0.91,9.4,6 +11.5,0.18,0.51,4.0,0.10400000000000001,4.0,23.0,0.9996,3.28,0.97,10.1,6 +10.3,0.32,0.45,6.4,0.073,5.0,13.0,0.9976,3.23,0.82,12.6,8 +8.9,0.4,0.32,5.6,0.087,10.0,47.0,0.9991,3.38,0.77,10.5,7 +11.4,0.26,0.44,3.6,0.071,6.0,19.0,0.9986,3.12,0.82,9.3,6 +7.7,0.27,0.68,3.5,0.358,5.0,10.0,0.9972,3.25,1.08,9.9,7 +7.6,0.52,0.12,3.0,0.067,12.0,53.0,0.9971,3.36,0.57,9.1,5 +8.9,0.4,0.32,5.6,0.087,10.0,47.0,0.9991,3.38,0.77,10.5,7 +9.9,0.59,0.07,3.4,0.102,32.0,71.0,1.00015,3.31,0.71,9.8,5 +9.9,0.59,0.07,3.4,0.102,32.0,71.0,1.00015,3.31,0.71,9.8,5 +12.0,0.45,0.55,2.0,0.073,25.0,49.0,0.9997,3.1,0.76,10.3,6 +7.5,0.4,0.12,3.0,0.092,29.0,53.0,0.9967,3.37,0.7,10.3,6 +8.7,0.52,0.09,2.5,0.091,20.0,49.0,0.9976,3.34,0.86,10.6,7 +11.6,0.42,0.53,3.3,0.105,33.0,98.0,1.001,3.2,0.95,9.2,5 +8.7,0.52,0.09,2.5,0.091,20.0,49.0,0.9976,3.34,0.86,10.6,7 +11.0,0.2,0.48,2.0,0.34299999999999997,6.0,18.0,0.9979,3.3,0.71,10.5,5 +10.4,0.55,0.23,2.7,0.091,18.0,48.0,0.9994,3.22,0.64,10.3,6 +6.9,0.36,0.25,2.4,0.098,5.0,16.0,0.9964,3.41,0.6,10.1,6 +13.3,0.34,0.52,3.2,0.094,17.0,53.0,1.0014,3.05,0.81,9.5,6 +10.8,0.5,0.46,2.5,0.073,5.0,27.0,1.0001,3.05,0.64,9.5,5 +10.6,0.83,0.37,2.6,0.086,26.0,70.0,0.9981,3.16,0.52,9.9,5 +7.1,0.63,0.06,2.0,0.083,8.0,29.0,0.99855,3.67,0.73,9.6,5 +7.2,0.65,0.02,2.3,0.094,5.0,31.0,0.9993,3.67,0.8,9.7,5 +6.9,0.67,0.06,2.1,0.08,8.0,33.0,0.99845,3.68,0.71,9.6,5 +7.5,0.53,0.06,2.6,0.086,20.0,44.0,0.9965,3.38,0.59,10.7,6 +11.1,0.18,0.48,1.5,0.068,7.0,15.0,0.9973,3.22,0.64,10.1,6 +8.3,0.705,0.12,2.6,0.092,12.0,28.0,0.9994,3.51,0.72,10.0,5 +7.4,0.67,0.12,1.6,0.18600000000000003,5.0,21.0,0.996,3.39,0.54,9.5,5 +8.4,0.65,0.6,2.1,0.11199999999999999,12.0,90.0,0.9973,3.2,0.52,9.2,5 +10.3,0.53,0.48,2.5,0.063,6.0,25.0,0.9998,3.12,0.59,9.3,6 +7.6,0.62,0.32,2.2,0.08199999999999999,7.0,54.0,0.9966,3.36,0.52,9.4,5 +10.3,0.41,0.42,2.4,0.213,6.0,14.0,0.9994,3.19,0.62,9.5,6 +10.3,0.43,0.44,2.4,0.214,5.0,12.0,0.9994,3.19,0.63,9.5,6 +7.4,0.29,0.38,1.7,0.062,9.0,30.0,0.9968,3.41,0.53,9.5,6 +10.3,0.53,0.48,2.5,0.063,6.0,25.0,0.9998,3.12,0.59,9.3,6 +7.9,0.53,0.24,2.0,0.07200000000000001,15.0,105.0,0.996,3.27,0.54,9.4,6 +9.0,0.46,0.31,2.8,0.09300000000000001,19.0,98.0,0.99815,3.32,0.63,9.5,6 +8.6,0.47,0.3,3.0,0.076,30.0,135.0,0.9976,3.3,0.53,9.4,5 +7.4,0.36,0.29,2.6,0.087,26.0,72.0,0.99645,3.39,0.68,11.0,5 +7.1,0.35,0.29,2.5,0.096,20.0,53.0,0.9962,3.42,0.65,11.0,6 +9.6,0.56,0.23,3.4,0.102,37.0,92.0,0.9996,3.3,0.65,10.1,5 +9.6,0.77,0.12,2.9,0.08199999999999999,30.0,74.0,0.99865,3.3,0.64,10.4,6 +9.8,0.66,0.39,3.2,0.083,21.0,59.0,0.9989,3.37,0.71,11.5,7 +9.6,0.77,0.12,2.9,0.08199999999999999,30.0,74.0,0.99865,3.3,0.64,10.4,6 +9.8,0.66,0.39,3.2,0.083,21.0,59.0,0.9989,3.37,0.71,11.5,7 +9.3,0.61,0.26,3.4,0.09,25.0,87.0,0.99975,3.24,0.62,9.7,5 +7.8,0.62,0.05,2.3,0.079,6.0,18.0,0.99735,3.29,0.63,9.3,5 +10.3,0.59,0.42,2.8,0.09,35.0,73.0,0.9990000000000001,3.28,0.7,9.5,6 +10.0,0.49,0.2,11.0,0.071,13.0,50.0,1.0015,3.16,0.69,9.2,6 +10.0,0.49,0.2,11.0,0.071,13.0,50.0,1.0015,3.16,0.69,9.2,6 +11.6,0.53,0.66,3.65,0.121,6.0,14.0,0.9978,3.05,0.74,11.5,7 +10.3,0.44,0.5,4.5,0.107,5.0,13.0,0.998,3.28,0.83,11.5,5 +13.4,0.27,0.62,2.6,0.08199999999999999,6.0,21.0,1.0002,3.16,0.67,9.7,6 +10.7,0.46,0.39,2.0,0.061,7.0,15.0,0.9981,3.18,0.62,9.5,5 +10.2,0.36,0.64,2.9,0.122,10.0,41.0,0.998,3.23,0.66,12.5,6 +10.2,0.36,0.64,2.9,0.122,10.0,41.0,0.998,3.23,0.66,12.5,6 +8.0,0.58,0.28,3.2,0.066,21.0,114.0,0.9973,3.22,0.54,9.4,6 +8.4,0.56,0.08,2.1,0.105,16.0,44.0,0.9958,3.13,0.52,11.0,5 +7.9,0.65,0.01,2.5,0.078,17.0,38.0,0.9963,3.34,0.74,11.7,7 +11.9,0.695,0.53,3.4,0.128,7.0,21.0,0.9992,3.17,0.84,12.2,7 +8.9,0.43,0.45,1.9,0.052000000000000005,6.0,16.0,0.9948,3.35,0.7,12.5,6 +7.8,0.43,0.32,2.8,0.08,29.0,58.0,0.9974,3.31,0.64,10.3,5 +12.4,0.49,0.58,3.0,0.10300000000000001,28.0,99.0,1.0008,3.16,1.0,11.5,6 +12.5,0.28,0.54,2.3,0.08199999999999999,12.0,29.0,0.9997,3.11,1.36,9.8,7 +12.2,0.34,0.5,2.4,0.066,10.0,21.0,1.0,3.12,1.18,9.2,6 +10.6,0.42,0.48,2.7,0.065,5.0,18.0,0.9972,3.21,0.87,11.3,6 +10.9,0.39,0.47,1.8,0.11800000000000001,6.0,14.0,0.9982,3.3,0.75,9.8,6 +10.9,0.39,0.47,1.8,0.11800000000000001,6.0,14.0,0.9982,3.3,0.75,9.8,6 +11.9,0.57,0.5,2.6,0.08199999999999999,6.0,32.0,1.0006,3.12,0.78,10.7,6 +7.0,0.685,0.0,1.9,0.067,40.0,63.0,0.9979,3.6,0.81,9.9,5 +6.6,0.815,0.02,2.7,0.07200000000000001,17.0,34.0,0.9955,3.58,0.89,12.3,7 +13.8,0.49,0.67,3.0,0.09300000000000001,6.0,15.0,0.9986,3.02,0.93,12.0,6 +9.6,0.56,0.31,2.8,0.08900000000000001,15.0,46.0,0.9979,3.11,0.92,10.0,6 +9.1,0.785,0.0,2.6,0.09300000000000001,11.0,28.0,0.9994,3.36,0.86,9.4,6 +10.7,0.67,0.22,2.7,0.107,17.0,34.0,1.0004,3.28,0.98,9.9,6 +9.1,0.795,0.0,2.6,0.096,11.0,26.0,0.9994,3.35,0.83,9.4,6 +7.7,0.665,0.0,2.4,0.09,8.0,19.0,0.9974,3.27,0.73,9.3,5 +13.5,0.53,0.79,4.8,0.12,23.0,77.0,1.0018,3.18,0.77,13.0,5 +6.1,0.21,0.4,1.4,0.066,40.5,165.0,0.9912,3.25,0.59,11.9,6 +6.7,0.75,0.01,2.4,0.078,17.0,32.0,0.9955,3.55,0.61,12.8,6 +11.5,0.41,0.52,3.0,0.08,29.0,55.0,1.0001,3.26,0.88,11.0,5 +10.5,0.42,0.66,2.95,0.11599999999999999,12.0,29.0,0.997,3.24,0.75,11.7,7 +11.9,0.43,0.66,3.1,0.109,10.0,23.0,1.0,3.15,0.85,10.4,7 +12.6,0.38,0.66,2.6,0.08800000000000001,10.0,41.0,1.001,3.17,0.68,9.8,6 +8.2,0.7,0.23,2.0,0.099,14.0,81.0,0.9973,3.19,0.7,9.4,5 +8.6,0.45,0.31,2.6,0.086,21.0,50.0,0.9982,3.37,0.91,9.9,6 +11.9,0.58,0.66,2.5,0.07200000000000001,6.0,37.0,0.9992,3.05,0.56,10.0,5 +12.5,0.46,0.63,2.0,0.071,6.0,15.0,0.9988,2.99,0.87,10.2,5 +12.8,0.615,0.66,5.8,0.083,7.0,42.0,1.0022,3.07,0.73,10.0,7 +10.0,0.42,0.5,3.4,0.107,7.0,21.0,0.9979,3.26,0.93,11.8,6 +12.8,0.615,0.66,5.8,0.083,7.0,42.0,1.0022,3.07,0.73,10.0,7 +10.4,0.575,0.61,2.6,0.076,11.0,24.0,1.0,3.16,0.69,9.0,5 +10.3,0.34,0.52,2.8,0.159,15.0,75.0,0.9998,3.18,0.64,9.4,5 +9.4,0.27,0.53,2.4,0.07400000000000001,6.0,18.0,0.9962,3.2,1.13,12.0,7 +6.9,0.765,0.02,2.3,0.063,35.0,63.0,0.9975,3.57,0.78,9.9,5 +7.9,0.24,0.4,1.6,0.055999999999999994,11.0,25.0,0.9967,3.32,0.87,8.7,6 +9.1,0.28,0.48,1.8,0.067,26.0,46.0,0.9967,3.32,1.04,10.6,6 +7.4,0.55,0.22,2.2,0.106,12.0,72.0,0.9959,3.05,0.63,9.2,5 +14.0,0.41,0.63,3.8,0.08900000000000001,6.0,47.0,1.0014,3.01,0.81,10.8,6 +11.5,0.54,0.71,4.4,0.124,6.0,15.0,0.9984,3.01,0.83,11.8,7 +11.5,0.45,0.5,3.0,0.078,19.0,47.0,1.0003,3.26,1.11,11.0,6 +9.4,0.27,0.53,2.4,0.07400000000000001,6.0,18.0,0.9962,3.2,1.13,12.0,7 +11.4,0.625,0.66,6.2,0.08800000000000001,6.0,24.0,0.9988,3.11,0.99,13.3,6 +8.3,0.42,0.38,2.5,0.094,24.0,60.0,0.9979,3.31,0.7,10.8,6 +8.3,0.26,0.42,2.0,0.08,11.0,27.0,0.9974,3.21,0.8,9.4,6 +13.7,0.415,0.68,2.9,0.085,17.0,43.0,1.0014,3.06,0.8,10.0,6 +8.3,0.26,0.42,2.0,0.08,11.0,27.0,0.9974,3.21,0.8,9.4,6 +8.3,0.26,0.42,2.0,0.08,11.0,27.0,0.9974,3.21,0.8,9.4,6 +7.7,0.51,0.28,2.1,0.087,23.0,54.0,0.998,3.42,0.74,9.2,5 +7.4,0.63,0.07,2.4,0.09,11.0,37.0,0.9979,3.43,0.76,9.7,6 +7.8,0.54,0.26,2.0,0.08800000000000001,23.0,48.0,0.9981,3.41,0.74,9.2,6 +8.3,0.66,0.15,1.9,0.079,17.0,42.0,0.9972,3.31,0.54,9.6,6 +7.8,0.46,0.26,1.9,0.08800000000000001,23.0,53.0,0.9981,3.43,0.74,9.2,6 +9.6,0.38,0.31,2.5,0.096,16.0,49.0,0.9982,3.19,0.7,10.0,7 +5.6,0.85,0.05,1.4,0.045,12.0,88.0,0.9924,3.56,0.82,12.9,8 +13.7,0.415,0.68,2.9,0.085,17.0,43.0,1.0014,3.06,0.8,10.0,6 +9.5,0.37,0.52,2.0,0.08199999999999999,6.0,26.0,0.998,3.18,0.51,9.5,5 +8.4,0.665,0.61,2.0,0.11199999999999999,13.0,95.0,0.997,3.16,0.54,9.1,5 +12.7,0.6,0.65,2.3,0.063,6.0,25.0,0.9997,3.03,0.57,9.9,5 +12.0,0.37,0.76,4.2,0.066,7.0,38.0,1.0004,3.22,0.6,13.0,7 +6.6,0.735,0.02,7.9,0.122,68.0,124.0,0.9994,3.47,0.53,9.9,5 +11.5,0.59,0.59,2.6,0.087,13.0,49.0,0.9988,3.18,0.65,11.0,6 +11.5,0.59,0.59,2.6,0.087,13.0,49.0,0.9988,3.18,0.65,11.0,6 +8.7,0.765,0.22,2.3,0.064,9.0,42.0,0.9963,3.1,0.55,9.4,5 +6.6,0.735,0.02,7.9,0.122,68.0,124.0,0.9994,3.47,0.53,9.9,5 +7.7,0.26,0.3,1.7,0.059000000000000004,20.0,38.0,0.9949,3.29,0.47,10.8,6 +12.2,0.48,0.54,2.6,0.085,19.0,64.0,1.0,3.1,0.61,10.5,6 +11.4,0.6,0.49,2.7,0.085,10.0,41.0,0.9994,3.15,0.63,10.5,6 +7.7,0.69,0.05,2.7,0.075,15.0,27.0,0.9974,3.26,0.61,9.1,5 +8.7,0.31,0.46,1.4,0.059000000000000004,11.0,25.0,0.9966,3.36,0.76,10.1,6 +9.8,0.44,0.47,2.5,0.063,9.0,28.0,0.9981,3.24,0.65,10.8,6 +12.0,0.39,0.66,3.0,0.09300000000000001,12.0,30.0,0.9996,3.18,0.63,10.8,7 +10.4,0.34,0.58,3.7,0.174,6.0,16.0,0.997,3.19,0.7,11.3,6 +12.5,0.46,0.49,4.5,0.07,26.0,49.0,0.9981,3.05,0.57,9.6,4 +9.0,0.43,0.34,2.5,0.08,26.0,86.0,0.9987,3.38,0.62,9.5,6 +9.1,0.45,0.35,2.4,0.08,23.0,78.0,0.9987,3.38,0.62,9.5,5 +7.1,0.735,0.16,1.9,0.1,15.0,77.0,0.9966,3.27,0.64,9.3,5 +9.9,0.4,0.53,6.7,0.09699999999999999,6.0,19.0,0.9986,3.27,0.82,11.7,7 +8.8,0.52,0.34,2.7,0.087,24.0,122.0,0.9982,3.26,0.61,9.5,5 +8.6,0.725,0.24,6.6,0.11699999999999999,31.0,134.0,1.0014,3.32,1.07,9.3,5 +10.6,0.48,0.64,2.2,0.111,6.0,20.0,0.997,3.26,0.66,11.7,6 +7.0,0.58,0.12,1.9,0.091,34.0,124.0,0.9956,3.44,0.48,10.5,5 +11.9,0.38,0.51,2.0,0.121,7.0,20.0,0.9996,3.24,0.76,10.4,6 +6.8,0.77,0.0,1.8,0.066,34.0,52.0,0.9976,3.62,0.68,9.9,5 +9.5,0.56,0.33,2.4,0.08900000000000001,35.0,67.0,0.9972,3.28,0.73,11.8,7 +6.6,0.84,0.03,2.3,0.059000000000000004,32.0,48.0,0.9952,3.52,0.56,12.3,7 +7.7,0.96,0.2,2.0,0.047,15.0,60.0,0.9955,3.36,0.44,10.9,5 +10.5,0.24,0.47,2.1,0.066,6.0,24.0,0.9978,3.15,0.9,11.0,7 +7.7,0.96,0.2,2.0,0.047,15.0,60.0,0.9955,3.36,0.44,10.9,5 +6.6,0.84,0.03,2.3,0.059000000000000004,32.0,48.0,0.9952,3.52,0.56,12.3,7 +6.4,0.67,0.08,2.1,0.045,19.0,48.0,0.9949,3.49,0.49,11.4,6 +9.5,0.78,0.22,1.9,0.077,6.0,32.0,0.9988,3.26,0.56,10.6,6 +9.1,0.52,0.33,1.3,0.07,9.0,30.0,0.9978,3.24,0.6,9.3,5 +12.8,0.84,0.63,2.4,0.08800000000000001,13.0,35.0,0.9997,3.1,0.6,10.4,6 +10.5,0.24,0.47,2.1,0.066,6.0,24.0,0.9978,3.15,0.9,11.0,7 +7.8,0.55,0.35,2.2,0.07400000000000001,21.0,66.0,0.9974,3.25,0.56,9.2,5 +11.9,0.37,0.69,2.3,0.078,12.0,24.0,0.9958,3.0,0.65,12.8,6 +12.3,0.39,0.63,2.3,0.091,6.0,18.0,1.0004,3.16,0.49,9.5,5 +10.4,0.41,0.55,3.2,0.076,22.0,54.0,0.9996,3.15,0.89,9.9,6 +12.3,0.39,0.63,2.3,0.091,6.0,18.0,1.0004,3.16,0.49,9.5,5 +8.0,0.67,0.3,2.0,0.06,38.0,62.0,0.9958,3.26,0.56,10.2,6 +11.1,0.45,0.73,3.2,0.066,6.0,22.0,0.9986,3.17,0.66,11.2,6 +10.4,0.41,0.55,3.2,0.076,22.0,54.0,0.9996,3.15,0.89,9.9,6 +7.0,0.62,0.18,1.5,0.062,7.0,50.0,0.9951,3.08,0.6,9.3,5 +12.6,0.31,0.72,2.2,0.07200000000000001,6.0,29.0,0.9987,2.88,0.82,9.8,8 +11.9,0.4,0.65,2.15,0.068,7.0,27.0,0.9988,3.06,0.68,11.3,6 +15.6,0.685,0.76,3.7,0.1,6.0,43.0,1.0032,2.95,0.68,11.2,7 +10.0,0.44,0.49,2.7,0.077,11.0,19.0,0.9963,3.23,0.63,11.6,7 +5.3,0.57,0.01,1.7,0.054000000000000006,5.0,27.0,0.9934,3.57,0.84,12.5,7 +9.5,0.735,0.1,2.1,0.079,6.0,31.0,0.9986,3.23,0.56,10.1,6 +12.5,0.38,0.6,2.6,0.081,31.0,72.0,0.9996,3.1,0.73,10.5,5 +9.3,0.48,0.29,2.1,0.127,6.0,16.0,0.9968,3.22,0.72,11.2,5 +8.6,0.53,0.22,2.0,0.1,7.0,27.0,0.9967,3.2,0.56,10.2,6 +11.9,0.39,0.69,2.8,0.095,17.0,35.0,0.9994,3.1,0.61,10.8,6 +11.9,0.39,0.69,2.8,0.095,17.0,35.0,0.9994,3.1,0.61,10.8,6 +8.4,0.37,0.53,1.8,0.413,9.0,26.0,0.9979,3.06,1.06,9.1,6 +6.8,0.56,0.03,1.7,0.084,18.0,35.0,0.9968,3.44,0.63,10.0,6 +10.4,0.33,0.63,2.8,0.084,5.0,22.0,0.9998,3.26,0.74,11.2,7 +7.0,0.23,0.4,1.6,0.063,21.0,67.0,0.9952,3.5,0.63,11.1,5 +11.3,0.62,0.67,5.2,0.086,6.0,19.0,0.9988,3.22,0.69,13.4,8 +8.9,0.59,0.39,2.3,0.095,5.0,22.0,0.9986,3.37,0.58,10.3,5 +9.2,0.63,0.21,2.7,0.09699999999999999,29.0,65.0,0.9988,3.28,0.58,9.6,5 +10.4,0.33,0.63,2.8,0.084,5.0,22.0,0.9998,3.26,0.74,11.2,7 +11.6,0.58,0.66,2.2,0.07400000000000001,10.0,47.0,1.0008,3.25,0.57,9.0,3 +9.2,0.43,0.52,2.3,0.083,14.0,23.0,0.9976,3.35,0.61,11.3,6 +8.3,0.615,0.22,2.6,0.087,6.0,19.0,0.9982,3.26,0.61,9.3,5 +11.0,0.26,0.68,2.55,0.085,10.0,25.0,0.997,3.18,0.61,11.8,5 +8.1,0.66,0.7,2.2,0.098,25.0,129.0,0.9972,3.08,0.53,9.0,5 +11.5,0.315,0.54,2.1,0.084,5.0,15.0,0.9987,2.98,0.7,9.2,6 +10.0,0.29,0.4,2.9,0.098,10.0,26.0,1.0006,3.48,0.91,9.7,5 +10.3,0.5,0.42,2.0,0.069,21.0,51.0,0.9982,3.16,0.72,11.5,6 +8.8,0.46,0.45,2.6,0.065,7.0,18.0,0.9947,3.32,0.79,14.0,6 +11.4,0.36,0.69,2.1,0.09,6.0,21.0,1.0,3.17,0.62,9.2,6 +8.7,0.82,0.02,1.2,0.07,36.0,48.0,0.9952,3.2,0.58,9.8,5 +13.0,0.32,0.65,2.6,0.09300000000000001,15.0,47.0,0.9996,3.05,0.61,10.6,5 +9.6,0.54,0.42,2.4,0.081,25.0,52.0,0.997,3.2,0.71,11.4,6 +12.5,0.37,0.55,2.6,0.083,25.0,68.0,0.9995,3.15,0.82,10.4,6 +9.9,0.35,0.55,2.1,0.062,5.0,14.0,0.9971,3.26,0.79,10.6,5 +10.5,0.28,0.51,1.7,0.08,10.0,24.0,0.9982,3.2,0.89,9.4,6 +9.6,0.68,0.24,2.2,0.087,5.0,28.0,0.9988,3.14,0.6,10.2,5 +9.3,0.27,0.41,2.0,0.091,6.0,16.0,0.998,3.28,0.7,9.7,5 +10.4,0.24,0.49,1.8,0.075,6.0,20.0,0.9977,3.18,1.06,11.0,6 +9.6,0.68,0.24,2.2,0.087,5.0,28.0,0.9988,3.14,0.6,10.2,5 +9.4,0.685,0.11,2.7,0.077,6.0,31.0,0.9984,3.19,0.7,10.1,6 +10.6,0.28,0.39,15.5,0.069,6.0,23.0,1.0026,3.12,0.66,9.2,5 +9.4,0.3,0.56,2.8,0.08,6.0,17.0,0.9964,3.15,0.92,11.7,8 +10.6,0.36,0.59,2.2,0.152,6.0,18.0,0.9986,3.04,1.05,9.4,5 +10.6,0.36,0.6,2.2,0.152,7.0,18.0,0.9986,3.04,1.06,9.4,5 +10.6,0.44,0.68,4.1,0.114,6.0,24.0,0.997,3.06,0.66,13.4,6 +10.2,0.67,0.39,1.9,0.054000000000000006,6.0,17.0,0.9976,3.17,0.47,10.0,5 +10.2,0.67,0.39,1.9,0.054000000000000006,6.0,17.0,0.9976,3.17,0.47,10.0,5 +10.2,0.645,0.36,1.8,0.053,5.0,14.0,0.9982,3.17,0.42,10.0,6 +11.6,0.32,0.55,2.8,0.081,35.0,67.0,1.0002,3.32,0.92,10.8,7 +9.3,0.39,0.4,2.6,0.073,10.0,26.0,0.9984,3.34,0.75,10.2,6 +9.3,0.775,0.27,2.8,0.078,24.0,56.0,0.9984,3.31,0.67,10.6,6 +9.2,0.41,0.5,2.5,0.055,12.0,25.0,0.9952,3.34,0.79,13.3,7 +8.9,0.4,0.51,2.6,0.052000000000000005,13.0,27.0,0.995,3.32,0.9,13.4,7 +8.7,0.69,0.31,3.0,0.086,23.0,81.0,1.0002,3.48,0.74,11.6,6 +6.5,0.39,0.23,8.3,0.051,28.0,91.0,0.9952,3.44,0.55,12.1,6 +10.7,0.35,0.53,2.6,0.07,5.0,16.0,0.9972,3.15,0.65,11.0,8 +7.8,0.52,0.25,1.9,0.081,14.0,38.0,0.9984,3.43,0.65,9.0,6 +7.2,0.34,0.32,2.5,0.09,43.0,113.0,0.9966,3.32,0.79,11.1,5 +10.7,0.35,0.53,2.6,0.07,5.0,16.0,0.9972,3.15,0.65,11.0,8 +8.7,0.69,0.31,3.0,0.086,23.0,81.0,1.0002,3.48,0.74,11.6,6 +7.8,0.52,0.25,1.9,0.081,14.0,38.0,0.9984,3.43,0.65,9.0,6 +10.4,0.44,0.73,6.55,0.07400000000000001,38.0,76.0,0.9990000000000001,3.17,0.85,12.0,7 +10.4,0.44,0.73,6.55,0.07400000000000001,38.0,76.0,0.9990000000000001,3.17,0.85,12.0,7 +10.5,0.26,0.47,1.9,0.078,6.0,24.0,0.9976,3.18,1.04,10.9,7 +10.5,0.24,0.42,1.8,0.077,6.0,22.0,0.9976,3.21,1.05,10.8,7 +10.2,0.49,0.63,2.9,0.07200000000000001,10.0,26.0,0.9968,3.16,0.78,12.5,7 +10.4,0.24,0.46,1.8,0.075,6.0,21.0,0.9976,3.25,1.02,10.8,7 +11.2,0.67,0.55,2.3,0.084,6.0,13.0,1.0,3.17,0.71,9.5,6 +10.0,0.59,0.31,2.2,0.09,26.0,62.0,0.9994,3.18,0.63,10.2,6 +13.3,0.29,0.75,2.8,0.084,23.0,43.0,0.9986,3.04,0.68,11.4,7 +12.4,0.42,0.49,4.6,0.073,19.0,43.0,0.9978,3.02,0.61,9.5,5 +10.0,0.59,0.31,2.2,0.09,26.0,62.0,0.9994,3.18,0.63,10.2,6 +10.7,0.4,0.48,2.1,0.125,15.0,49.0,0.998,3.03,0.81,9.7,6 +10.5,0.51,0.64,2.4,0.107,6.0,15.0,0.9973,3.09,0.66,11.8,7 +10.5,0.51,0.64,2.4,0.107,6.0,15.0,0.9973,3.09,0.66,11.8,7 +8.5,0.655,0.49,6.1,0.122,34.0,151.0,1.001,3.31,1.14,9.3,5 +12.5,0.6,0.49,4.3,0.1,5.0,14.0,1.001,3.25,0.74,11.9,6 +10.4,0.61,0.49,2.1,0.2,5.0,16.0,0.9994,3.16,0.63,8.4,3 +10.9,0.21,0.49,2.8,0.08800000000000001,11.0,32.0,0.9972,3.22,0.68,11.7,6 +7.3,0.365,0.49,2.5,0.08800000000000001,39.0,106.0,0.9966,3.36,0.78,11.0,5 +9.8,0.25,0.49,2.7,0.08800000000000001,15.0,33.0,0.9982,3.42,0.9,10.0,6 +7.6,0.41,0.49,2.0,0.08800000000000001,16.0,43.0,0.998,3.48,0.64,9.1,5 +8.2,0.39,0.49,2.3,0.099,47.0,133.0,0.9979,3.38,0.99,9.8,5 +9.3,0.4,0.49,2.5,0.085,38.0,142.0,0.9978,3.22,0.55,9.4,5 +9.2,0.43,0.49,2.4,0.086,23.0,116.0,0.9976,3.23,0.64,9.5,5 +10.4,0.64,0.24,2.8,0.105,29.0,53.0,0.9998,3.24,0.67,9.9,5 +7.3,0.365,0.49,2.5,0.08800000000000001,39.0,106.0,0.9966,3.36,0.78,11.0,5 +7.0,0.38,0.49,2.5,0.09699999999999999,33.0,85.0,0.9962,3.39,0.77,11.4,6 +8.2,0.42,0.49,2.6,0.084,32.0,55.0,0.9988,3.34,0.75,8.7,6 +9.9,0.63,0.24,2.4,0.077,6.0,33.0,0.9974,3.09,0.57,9.4,5 +9.1,0.22,0.24,2.1,0.078,1.0,28.0,0.9990000000000001,3.41,0.87,10.3,6 +11.9,0.38,0.49,2.7,0.098,12.0,42.0,1.0004,3.16,0.61,10.3,5 +11.9,0.38,0.49,2.7,0.098,12.0,42.0,1.0004,3.16,0.61,10.3,5 +10.3,0.27,0.24,2.1,0.07200000000000001,15.0,33.0,0.9956,3.22,0.66,12.8,6 +10.0,0.48,0.24,2.7,0.102,13.0,32.0,1.0,3.28,0.56,10.0,6 +9.1,0.22,0.24,2.1,0.078,1.0,28.0,0.9990000000000001,3.41,0.87,10.3,6 +9.9,0.63,0.24,2.4,0.077,6.0,33.0,0.9974,3.09,0.57,9.4,5 +8.1,0.825,0.24,2.1,0.084,5.0,13.0,0.9972,3.37,0.77,10.7,6 +12.9,0.35,0.49,5.8,0.066,5.0,35.0,1.0014,3.2,0.66,12.0,7 +11.2,0.5,0.74,5.15,0.1,5.0,17.0,0.9996,3.22,0.62,11.2,5 +9.2,0.59,0.24,3.3,0.10099999999999999,20.0,47.0,0.9988,3.26,0.67,9.6,5 +9.5,0.46,0.49,6.3,0.064,5.0,17.0,0.9988,3.21,0.73,11.0,6 +9.3,0.715,0.24,2.1,0.07,5.0,20.0,0.9966,3.12,0.59,9.9,5 +11.2,0.66,0.24,2.5,0.085,16.0,53.0,0.9993,3.06,0.72,11.0,6 +14.3,0.31,0.74,1.8,0.075,6.0,15.0,1.0008,2.86,0.79,8.4,6 +9.1,0.47,0.49,2.6,0.094,38.0,106.0,0.9982,3.08,0.59,9.1,5 +7.5,0.55,0.24,2.0,0.078,10.0,28.0,0.9983,3.45,0.78,9.5,6 +10.6,0.31,0.49,2.5,0.067,6.0,21.0,0.9987,3.26,0.86,10.7,6 +12.4,0.35,0.49,2.6,0.079,27.0,69.0,0.9994,3.12,0.75,10.4,6 +9.0,0.53,0.49,1.9,0.171,6.0,25.0,0.9975,3.27,0.61,9.4,6 +6.8,0.51,0.01,2.1,0.07400000000000001,9.0,25.0,0.9958,3.33,0.56,9.5,6 +9.4,0.43,0.24,2.8,0.092,14.0,45.0,0.998,3.19,0.73,10.0,6 +9.5,0.46,0.24,2.7,0.092,14.0,44.0,0.998,3.12,0.74,10.0,6 +5.0,1.04,0.24,1.6,0.05,32.0,96.0,0.9934,3.74,0.62,11.5,5 +15.5,0.645,0.49,4.2,0.095,10.0,23.0,1.00315,2.92,0.74,11.1,5 +15.5,0.645,0.49,4.2,0.095,10.0,23.0,1.00315,2.92,0.74,11.1,5 +10.9,0.53,0.49,4.6,0.11800000000000001,10.0,17.0,1.0002,3.07,0.56,11.7,6 +15.6,0.645,0.49,4.2,0.095,10.0,23.0,1.00315,2.92,0.74,11.1,5 +10.9,0.53,0.49,4.6,0.11800000000000001,10.0,17.0,1.0002,3.07,0.56,11.7,6 +13.0,0.47,0.49,4.3,0.085,6.0,47.0,1.0021,3.3,0.68,12.7,6 +12.7,0.6,0.49,2.8,0.075,5.0,19.0,0.9994,3.14,0.57,11.4,5 +9.0,0.44,0.49,2.4,0.078,26.0,121.0,0.9978,3.23,0.58,9.2,5 +9.0,0.54,0.49,2.9,0.094,41.0,110.0,0.9982,3.08,0.61,9.2,5 +7.6,0.29,0.49,2.7,0.092,25.0,60.0,0.9971,3.31,0.61,10.1,6 +13.0,0.47,0.49,4.3,0.085,6.0,47.0,1.0021,3.3,0.68,12.7,6 +12.7,0.6,0.49,2.8,0.075,5.0,19.0,0.9994,3.14,0.57,11.4,5 +8.7,0.7,0.24,2.5,0.226,5.0,15.0,0.9991,3.32,0.6,9.0,6 +8.7,0.7,0.24,2.5,0.226,5.0,15.0,0.9991,3.32,0.6,9.0,6 +9.8,0.5,0.49,2.6,0.25,5.0,20.0,0.9990000000000001,3.31,0.79,10.7,6 +6.2,0.36,0.24,2.2,0.095,19.0,42.0,0.9946,3.57,0.57,11.7,6 +11.5,0.35,0.49,3.3,0.07,10.0,37.0,1.0003,3.32,0.91,11.0,6 +6.2,0.36,0.24,2.2,0.095,19.0,42.0,0.9946,3.57,0.57,11.7,6 +10.2,0.24,0.49,2.4,0.075,10.0,28.0,0.9978,3.14,0.61,10.4,5 +10.5,0.59,0.49,2.1,0.07,14.0,47.0,0.9991,3.3,0.56,9.6,4 +10.6,0.34,0.49,3.2,0.078,20.0,78.0,0.9992,3.19,0.7,10.0,6 +12.3,0.27,0.49,3.1,0.079,28.0,46.0,0.9993,3.2,0.8,10.2,6 +9.9,0.5,0.24,2.3,0.10300000000000001,6.0,14.0,0.9978,3.34,0.52,10.0,4 +8.8,0.44,0.49,2.8,0.083,18.0,111.0,0.9982,3.3,0.6,9.5,5 +8.8,0.47,0.49,2.9,0.085,17.0,110.0,0.9982,3.29,0.6,9.8,5 +10.6,0.31,0.49,2.2,0.063,18.0,40.0,0.9976,3.14,0.51,9.8,6 +12.3,0.5,0.49,2.2,0.08900000000000001,5.0,14.0,1.0002,3.19,0.44,9.6,5 +12.3,0.5,0.49,2.2,0.08900000000000001,5.0,14.0,1.0002,3.19,0.44,9.6,5 +11.7,0.49,0.49,2.2,0.083,5.0,15.0,1.0,3.19,0.43,9.2,5 +12.0,0.28,0.49,1.9,0.07400000000000001,10.0,21.0,0.9976,2.98,0.66,9.9,7 +11.8,0.33,0.49,3.4,0.09300000000000001,54.0,80.0,1.0002,3.3,0.76,10.7,7 +7.6,0.51,0.24,2.4,0.091,8.0,38.0,0.998,3.47,0.66,9.6,6 +11.1,0.31,0.49,2.7,0.094,16.0,47.0,0.9986,3.12,1.02,10.6,7 +7.3,0.73,0.24,1.9,0.10800000000000001,18.0,102.0,0.9967,3.26,0.59,9.3,5 +5.0,0.42,0.24,2.0,0.06,19.0,50.0,0.9917,3.72,0.74,14.0,8 +10.2,0.29,0.49,2.6,0.059000000000000004,5.0,13.0,0.9976,3.05,0.74,10.5,7 +9.0,0.45,0.49,2.6,0.084,21.0,75.0,0.9987,3.35,0.57,9.7,5 +6.6,0.39,0.49,1.7,0.07,23.0,149.0,0.9922,3.12,0.5,11.5,6 +9.0,0.45,0.49,2.6,0.084,21.0,75.0,0.9987,3.35,0.57,9.7,5 +9.9,0.49,0.58,3.5,0.094,9.0,43.0,1.0004,3.29,0.58,9.0,5 +7.9,0.72,0.17,2.6,0.096,20.0,38.0,0.9978,3.4,0.53,9.5,5 +8.9,0.595,0.41,7.9,0.086,30.0,109.0,0.9998,3.27,0.57,9.3,5 +12.4,0.4,0.51,2.0,0.059000000000000004,6.0,24.0,0.9994,3.04,0.6,9.3,6 +11.9,0.58,0.58,1.9,0.071,5.0,18.0,0.998,3.09,0.63,10.0,6 +8.5,0.585,0.18,2.1,0.078,5.0,30.0,0.9967,3.2,0.48,9.8,6 +12.7,0.59,0.45,2.3,0.08199999999999999,11.0,22.0,1.0,3.0,0.7,9.3,6 +8.2,0.915,0.27,2.1,0.08800000000000001,7.0,23.0,0.9962,3.26,0.47,10.0,4 +13.2,0.46,0.52,2.2,0.071,12.0,35.0,1.0006,3.1,0.56,9.0,6 +7.7,0.835,0.0,2.6,0.081,6.0,14.0,0.9975,3.3,0.52,9.3,5 +13.2,0.46,0.52,2.2,0.071,12.0,35.0,1.0006,3.1,0.56,9.0,6 +8.3,0.58,0.13,2.9,0.096,14.0,63.0,0.9984,3.17,0.62,9.1,6 +8.3,0.6,0.13,2.6,0.085,6.0,24.0,0.9984,3.31,0.59,9.2,6 +9.4,0.41,0.48,4.6,0.07200000000000001,10.0,20.0,0.9973,3.34,0.79,12.2,7 +8.8,0.48,0.41,3.3,0.092,26.0,52.0,0.9982,3.31,0.53,10.5,6 +10.1,0.65,0.37,5.1,0.11,11.0,65.0,1.0026,3.32,0.64,10.4,6 +6.3,0.36,0.19,3.2,0.075,15.0,39.0,0.9956,3.56,0.52,12.7,6 +8.8,0.24,0.54,2.5,0.083,25.0,57.0,0.9983,3.39,0.54,9.2,5 +13.2,0.38,0.55,2.7,0.081,5.0,16.0,1.0006,2.98,0.54,9.4,5 +7.5,0.64,0.0,2.4,0.077,18.0,29.0,0.9965,3.32,0.6,10.0,6 +8.2,0.39,0.38,1.5,0.057999999999999996,10.0,29.0,0.9962,3.26,0.74,9.8,5 +9.2,0.755,0.18,2.2,0.14800000000000002,10.0,103.0,0.9969,2.87,1.36,10.2,6 +9.6,0.6,0.5,2.3,0.079,28.0,71.0,0.9997,3.5,0.57,9.7,5 +9.6,0.6,0.5,2.3,0.079,28.0,71.0,0.9997,3.5,0.57,9.7,5 +11.5,0.31,0.51,2.2,0.079,14.0,28.0,0.9982,3.03,0.93,9.8,6 +11.4,0.46,0.5,2.7,0.122,4.0,17.0,1.0006,3.13,0.7,10.2,5 +11.3,0.37,0.41,2.3,0.08800000000000001,6.0,16.0,0.9988,3.09,0.8,9.3,5 +8.3,0.54,0.24,3.4,0.076,16.0,112.0,0.9976,3.27,0.61,9.4,5 +8.2,0.56,0.23,3.4,0.078,14.0,104.0,0.9976,3.28,0.62,9.4,5 +10.0,0.58,0.22,1.9,0.08,9.0,32.0,0.9974,3.13,0.55,9.5,5 +7.9,0.51,0.25,2.9,0.077,21.0,45.0,0.9974,3.49,0.96,12.1,6 +6.8,0.69,0.0,5.6,0.124,21.0,58.0,0.9997,3.46,0.72,10.2,5 +6.8,0.69,0.0,5.6,0.124,21.0,58.0,0.9997,3.46,0.72,10.2,5 +8.8,0.6,0.29,2.2,0.098,5.0,15.0,0.9988,3.36,0.49,9.1,5 +8.8,0.6,0.29,2.2,0.098,5.0,15.0,0.9988,3.36,0.49,9.1,5 +8.7,0.54,0.26,2.5,0.09699999999999999,7.0,31.0,0.9976,3.27,0.6,9.3,6 +7.6,0.685,0.23,2.3,0.111,20.0,84.0,0.9964,3.21,0.61,9.3,5 +8.7,0.54,0.26,2.5,0.09699999999999999,7.0,31.0,0.9976,3.27,0.6,9.3,6 +10.4,0.28,0.54,2.7,0.105,5.0,19.0,0.9988,3.25,0.63,9.5,5 +7.6,0.41,0.14,3.0,0.087,21.0,43.0,0.9964,3.32,0.57,10.5,6 +10.1,0.935,0.22,3.4,0.105,11.0,86.0,1.001,3.43,0.64,11.3,4 +7.9,0.35,0.21,1.9,0.073,46.0,102.0,0.9964,3.27,0.58,9.5,5 +8.7,0.84,0.0,1.4,0.065,24.0,33.0,0.9954,3.27,0.55,9.7,5 +9.6,0.88,0.28,2.4,0.086,30.0,147.0,0.9979,3.24,0.53,9.4,5 +9.5,0.885,0.27,2.3,0.084,31.0,145.0,0.9978,3.24,0.53,9.4,5 +7.7,0.915,0.12,2.2,0.14300000000000002,7.0,23.0,0.9964,3.35,0.65,10.2,7 +8.9,0.29,0.35,1.9,0.067,25.0,57.0,0.997,3.18,1.36,10.3,6 +9.9,0.54,0.45,2.3,0.071,16.0,40.0,0.9991,3.39,0.62,9.4,5 +9.5,0.59,0.44,2.3,0.071,21.0,68.0,0.9992,3.46,0.63,9.5,5 +9.9,0.54,0.45,2.3,0.071,16.0,40.0,0.9991,3.39,0.62,9.4,5 +9.5,0.59,0.44,2.3,0.071,21.0,68.0,0.9992,3.46,0.63,9.5,5 +9.9,0.54,0.45,2.3,0.071,16.0,40.0,0.9991,3.39,0.62,9.4,5 +7.8,0.64,0.1,6.0,0.115,5.0,11.0,0.9984,3.37,0.69,10.1,7 +7.3,0.67,0.05,3.6,0.107,6.0,20.0,0.9972,3.4,0.63,10.1,5 +8.3,0.845,0.01,2.2,0.07,5.0,14.0,0.9967,3.32,0.58,11.0,4 +8.7,0.48,0.3,2.8,0.066,10.0,28.0,0.9964,3.33,0.67,11.2,7 +6.7,0.42,0.27,8.6,0.068,24.0,148.0,0.9948,3.16,0.57,11.3,6 +10.7,0.43,0.39,2.2,0.106,8.0,32.0,0.9986,2.89,0.5,9.6,5 +9.8,0.88,0.25,2.5,0.10400000000000001,35.0,155.0,1.001,3.41,0.67,11.2,5 +15.9,0.36,0.65,7.5,0.096,22.0,71.0,0.9976,2.98,0.84,14.9,5 +9.4,0.33,0.59,2.8,0.079,9.0,30.0,0.9976,3.12,0.54,12.0,6 +8.6,0.47,0.47,2.4,0.07400000000000001,7.0,29.0,0.9979,3.08,0.46,9.5,5 +9.7,0.55,0.17,2.9,0.087,20.0,53.0,1.0004,3.14,0.61,9.4,5 +10.7,0.43,0.39,2.2,0.106,8.0,32.0,0.9986,2.89,0.5,9.6,5 +12.0,0.5,0.59,1.4,0.073,23.0,42.0,0.998,2.92,0.68,10.5,7 +7.2,0.52,0.07,1.4,0.07400000000000001,5.0,20.0,0.9973,3.32,0.81,9.6,6 +7.1,0.84,0.02,4.4,0.096,5.0,13.0,0.997,3.41,0.57,11.0,4 +7.2,0.52,0.07,1.4,0.07400000000000001,5.0,20.0,0.9973,3.32,0.81,9.6,6 +7.5,0.42,0.31,1.6,0.08,15.0,42.0,0.9978,3.31,0.64,9.0,5 +7.2,0.57,0.06,1.6,0.076,9.0,27.0,0.9972,3.36,0.7,9.6,6 +10.1,0.28,0.46,1.8,0.05,5.0,13.0,0.9974,3.04,0.79,10.2,6 +12.1,0.4,0.52,2.0,0.092,15.0,54.0,1.0,3.03,0.66,10.2,5 +9.4,0.59,0.14,2.0,0.084,25.0,48.0,0.9981,3.14,0.56,9.7,5 +8.3,0.49,0.36,1.8,0.222,6.0,16.0,0.998,3.18,0.6,9.5,6 +11.3,0.34,0.45,2.0,0.08199999999999999,6.0,15.0,0.9988,2.94,0.66,9.2,6 +10.0,0.73,0.43,2.3,0.059000000000000004,15.0,31.0,0.9966,3.15,0.57,11.0,5 +11.3,0.34,0.45,2.0,0.08199999999999999,6.0,15.0,0.9988,2.94,0.66,9.2,6 +6.9,0.4,0.24,2.5,0.083,30.0,45.0,0.9959,3.26,0.58,10.0,5 +8.2,0.73,0.21,1.7,0.07400000000000001,5.0,13.0,0.9968,3.2,0.52,9.5,5 +9.8,1.24,0.34,2.0,0.079,32.0,151.0,0.998,3.15,0.53,9.5,5 +8.2,0.73,0.21,1.7,0.07400000000000001,5.0,13.0,0.9968,3.2,0.52,9.5,5 +10.8,0.4,0.41,2.2,0.084,7.0,17.0,0.9984,3.08,0.67,9.3,6 +9.3,0.41,0.39,2.2,0.064,12.0,31.0,0.9984,3.26,0.65,10.2,5 +10.8,0.4,0.41,2.2,0.084,7.0,17.0,0.9984,3.08,0.67,9.3,6 +8.6,0.8,0.11,2.3,0.084,12.0,31.0,0.9979,3.4,0.48,9.9,5 +8.3,0.78,0.1,2.6,0.081,45.0,87.0,0.9983,3.48,0.53,10.0,5 +10.8,0.26,0.45,3.3,0.06,20.0,49.0,0.9972,3.13,0.54,9.6,5 +13.3,0.43,0.58,1.9,0.07,15.0,40.0,1.0004,3.06,0.49,9.0,5 +8.0,0.45,0.23,2.2,0.094,16.0,29.0,0.9962,3.21,0.49,10.2,6 +8.5,0.46,0.31,2.25,0.078,32.0,58.0,0.998,3.33,0.54,9.8,5 +8.1,0.78,0.23,2.6,0.059000000000000004,5.0,15.0,0.997,3.37,0.56,11.3,5 +9.8,0.98,0.32,2.3,0.078,35.0,152.0,0.998,3.25,0.48,9.4,5 +8.1,0.78,0.23,2.6,0.059000000000000004,5.0,15.0,0.997,3.37,0.56,11.3,5 +7.1,0.65,0.18,1.8,0.07,13.0,40.0,0.997,3.44,0.6,9.1,5 +9.1,0.64,0.23,3.1,0.095,13.0,38.0,0.9998,3.28,0.59,9.7,5 +7.7,0.66,0.04,1.6,0.039,4.0,9.0,0.9962,3.4,0.47,9.4,5 +8.1,0.38,0.48,1.8,0.157,5.0,17.0,0.9976,3.3,1.05,9.4,5 +7.4,1.185,0.0,4.25,0.09699999999999999,5.0,14.0,0.9966,3.63,0.54,10.7,3 +9.2,0.92,0.24,2.6,0.087,12.0,93.0,0.9998,3.48,0.54,9.8,5 +8.6,0.49,0.51,2.0,0.42200000000000004,16.0,62.0,0.9979,3.03,1.17,9.0,5 +9.0,0.48,0.32,2.8,0.084,21.0,122.0,0.9984,3.32,0.62,9.4,5 +9.0,0.47,0.31,2.7,0.084,24.0,125.0,0.9984,3.31,0.61,9.4,5 +5.1,0.47,0.02,1.3,0.034,18.0,44.0,0.9921,3.9,0.62,12.8,6 +7.0,0.65,0.02,2.1,0.066,8.0,25.0,0.9972,3.47,0.67,9.5,6 +7.0,0.65,0.02,2.1,0.066,8.0,25.0,0.9972,3.47,0.67,9.5,6 +9.4,0.615,0.28,3.2,0.087,18.0,72.0,1.0001,3.31,0.53,9.7,5 +11.8,0.38,0.55,2.1,0.071,5.0,19.0,0.9986,3.11,0.62,10.8,6 +10.6,1.02,0.43,2.9,0.076,26.0,88.0,0.9984,3.08,0.57,10.1,6 +7.0,0.65,0.02,2.1,0.066,8.0,25.0,0.9972,3.47,0.67,9.5,6 +7.0,0.64,0.02,2.1,0.067,9.0,23.0,0.997,3.47,0.67,9.4,6 +7.5,0.38,0.48,2.6,0.073,22.0,84.0,0.9972,3.32,0.7,9.6,4 +9.1,0.765,0.04,1.6,0.078,4.0,14.0,0.998,3.29,0.54,9.7,4 +8.4,1.035,0.15,6.0,0.073,11.0,54.0,0.9990000000000001,3.37,0.49,9.9,5 +7.0,0.78,0.08,2.0,0.09300000000000001,10.0,19.0,0.9956,3.4,0.47,10.0,5 +7.4,0.49,0.19,3.0,0.077,16.0,37.0,0.9966,3.37,0.51,10.5,5 +7.8,0.545,0.12,2.5,0.068,11.0,35.0,0.996,3.34,0.61,11.6,6 +9.7,0.31,0.47,1.6,0.062,13.0,33.0,0.9983,3.27,0.66,10.0,6 +10.6,1.025,0.43,2.8,0.08,21.0,84.0,0.9985,3.06,0.57,10.1,5 +8.9,0.565,0.34,3.0,0.09300000000000001,16.0,112.0,0.9998,3.38,0.61,9.5,5 +8.7,0.69,0.0,3.2,0.084,13.0,33.0,0.9992,3.36,0.45,9.4,5 +8.0,0.43,0.36,2.3,0.075,10.0,48.0,0.9976,3.34,0.46,9.4,5 +9.9,0.74,0.28,2.6,0.078,21.0,77.0,0.998,3.28,0.51,9.8,5 +7.2,0.49,0.18,2.7,0.069,13.0,34.0,0.9967,3.29,0.48,9.2,6 +8.0,0.43,0.36,2.3,0.075,10.0,48.0,0.9976,3.34,0.46,9.4,5 +7.6,0.46,0.11,2.6,0.079,12.0,49.0,0.9968,3.21,0.57,10.0,5 +8.4,0.56,0.04,2.0,0.08199999999999999,10.0,22.0,0.9976,3.22,0.44,9.6,5 +7.1,0.66,0.0,3.9,0.086,17.0,45.0,0.9976,3.46,0.54,9.5,5 +8.4,0.56,0.04,2.0,0.08199999999999999,10.0,22.0,0.9976,3.22,0.44,9.6,5 +8.9,0.48,0.24,2.85,0.094,35.0,106.0,0.9982,3.1,0.53,9.2,5 +7.6,0.42,0.08,2.7,0.084,15.0,48.0,0.9968,3.21,0.59,10.0,5 +7.1,0.31,0.3,2.2,0.053,36.0,127.0,0.9965,2.94,1.62,9.5,5 +7.5,1.115,0.1,3.1,0.086,5.0,12.0,0.9958,3.54,0.6,11.2,4 +9.0,0.66,0.17,3.0,0.077,5.0,13.0,0.9976,3.29,0.55,10.4,5 +8.1,0.72,0.09,2.8,0.084,18.0,49.0,0.9994,3.43,0.72,11.1,6 +6.4,0.57,0.02,1.8,0.067,4.0,11.0,0.997,3.46,0.68,9.5,5 +6.4,0.57,0.02,1.8,0.067,4.0,11.0,0.997,3.46,0.68,9.5,5 +6.4,0.865,0.03,3.2,0.071,27.0,58.0,0.995,3.61,0.49,12.7,6 +9.5,0.55,0.66,2.3,0.387,12.0,37.0,0.9982,3.17,0.67,9.6,5 +8.9,0.875,0.13,3.45,0.08800000000000001,4.0,14.0,0.9994,3.44,0.52,11.5,5 +7.3,0.835,0.03,2.1,0.092,10.0,19.0,0.9966,3.39,0.47,9.6,5 +7.0,0.45,0.34,2.7,0.08199999999999999,16.0,72.0,0.998,3.55,0.6,9.5,5 +7.7,0.56,0.2,2.0,0.075,9.0,39.0,0.9987,3.48,0.62,9.3,5 +7.7,0.965,0.1,2.1,0.11199999999999999,11.0,22.0,0.9963,3.26,0.5,9.5,5 +7.7,0.965,0.1,2.1,0.11199999999999999,11.0,22.0,0.9963,3.26,0.5,9.5,5 +8.2,0.59,0.0,2.5,0.09300000000000001,19.0,58.0,1.0002,3.5,0.65,9.3,6 +9.0,0.46,0.23,2.8,0.092,28.0,104.0,0.9983,3.1,0.56,9.2,5 +9.0,0.69,0.0,2.4,0.08800000000000001,19.0,38.0,0.9990000000000001,3.35,0.6,9.3,5 +8.3,0.76,0.29,4.2,0.075,12.0,16.0,0.9965,3.45,0.68,11.5,6 +9.2,0.53,0.24,2.6,0.078,28.0,139.0,0.9978799999999999,3.21,0.57,9.5,5 +6.5,0.615,0.0,1.9,0.065,9.0,18.0,0.9972,3.46,0.65,9.2,5 +11.6,0.41,0.58,2.8,0.096,25.0,101.0,1.00024,3.13,0.53,10.0,5 +11.1,0.39,0.54,2.7,0.095,21.0,101.0,1.0001,3.13,0.51,9.5,5 +7.3,0.51,0.18,2.1,0.07,12.0,28.0,0.9976799999999999,3.52,0.73,9.5,6 +8.2,0.34,0.38,2.5,0.08,12.0,57.0,0.9978,3.3,0.47,9.0,6 +8.6,0.33,0.4,2.6,0.083,16.0,68.0,0.99782,3.3,0.48,9.4,5 +7.2,0.5,0.18,2.1,0.071,12.0,31.0,0.99761,3.52,0.72,9.6,6 +7.3,0.51,0.18,2.1,0.07,12.0,28.0,0.9976799999999999,3.52,0.73,9.5,6 +8.3,0.65,0.1,2.9,0.08900000000000001,17.0,40.0,0.99803,3.29,0.55,9.5,5 +8.3,0.65,0.1,2.9,0.08900000000000001,17.0,40.0,0.99803,3.29,0.55,9.5,5 +7.6,0.54,0.13,2.5,0.09699999999999999,24.0,66.0,0.99785,3.39,0.61,9.4,5 +8.3,0.65,0.1,2.9,0.08900000000000001,17.0,40.0,0.99803,3.29,0.55,9.5,5 +7.8,0.48,0.68,1.7,0.415,14.0,32.0,0.99656,3.09,1.06,9.1,6 +7.8,0.91,0.07,1.9,0.057999999999999996,22.0,47.0,0.99525,3.51,0.43,10.7,6 +6.3,0.98,0.01,2.0,0.057,15.0,33.0,0.9948799999999999,3.6,0.46,11.2,6 +8.1,0.87,0.0,2.2,0.084,10.0,31.0,0.99656,3.25,0.5,9.8,5 +8.1,0.87,0.0,2.2,0.084,10.0,31.0,0.99656,3.25,0.5,9.8,5 +8.8,0.42,0.21,2.5,0.092,33.0,88.0,0.99823,3.19,0.52,9.2,5 +9.0,0.58,0.25,2.8,0.075,9.0,104.0,0.99779,3.23,0.57,9.7,5 +9.3,0.655,0.26,2.0,0.096,5.0,35.0,0.9973799999999999,3.25,0.42,9.6,5 +8.8,0.7,0.0,1.7,0.069,8.0,19.0,0.9970100000000001,3.31,0.53,10.0,6 +9.3,0.655,0.26,2.0,0.096,5.0,35.0,0.9973799999999999,3.25,0.42,9.6,5 +9.1,0.68,0.11,2.8,0.09300000000000001,11.0,44.0,0.9988799999999999,3.31,0.55,9.5,6 +9.2,0.67,0.1,3.0,0.091,12.0,48.0,0.9988799999999999,3.31,0.54,9.5,6 +8.8,0.59,0.18,2.9,0.08900000000000001,12.0,74.0,0.9973799999999999,3.14,0.54,9.4,5 +7.5,0.6,0.32,2.7,0.10300000000000001,13.0,98.0,0.9993799999999999,3.45,0.62,9.5,5 +7.1,0.59,0.02,2.3,0.08199999999999999,24.0,94.0,0.99744,3.55,0.53,9.7,6 +7.9,0.72,0.01,1.9,0.076,7.0,32.0,0.9966799999999999,3.39,0.54,9.6,5 +7.1,0.59,0.02,2.3,0.08199999999999999,24.0,94.0,0.99744,3.55,0.53,9.7,6 +9.4,0.685,0.26,2.4,0.08199999999999999,23.0,143.0,0.9978,3.28,0.55,9.4,5 +9.5,0.57,0.27,2.3,0.08199999999999999,23.0,144.0,0.99782,3.27,0.55,9.4,5 +7.9,0.4,0.29,1.8,0.157,1.0,44.0,0.9973,3.3,0.92,9.5,6 +7.9,0.4,0.3,1.8,0.157,2.0,45.0,0.9972700000000001,3.31,0.91,9.5,6 +7.2,1.0,0.0,3.0,0.102,7.0,16.0,0.9958600000000001,3.43,0.46,10.0,5 +6.9,0.765,0.18,2.4,0.243,5.5,48.0,0.9961200000000001,3.4,0.6,10.3,6 +6.9,0.635,0.17,2.4,0.24100000000000002,6.0,18.0,0.9961,3.4,0.59,10.3,6 +8.3,0.43,0.3,3.4,0.079,7.0,34.0,0.9978799999999999,3.36,0.61,10.5,5 +7.1,0.52,0.03,2.6,0.076,21.0,92.0,0.99745,3.5,0.6,9.8,5 +7.0,0.57,0.0,2.0,0.19,12.0,45.0,0.9967600000000001,3.31,0.6,9.4,6 +6.5,0.46,0.14,2.4,0.114,9.0,37.0,0.9973200000000001,3.66,0.65,9.8,5 +9.0,0.82,0.05,2.4,0.081,26.0,96.0,0.9981399999999999,3.36,0.53,10.0,5 +6.5,0.46,0.14,2.4,0.114,9.0,37.0,0.9973200000000001,3.66,0.65,9.8,5 +7.1,0.59,0.01,2.5,0.077,20.0,85.0,0.99746,3.55,0.59,9.8,5 +9.9,0.35,0.41,2.3,0.083,11.0,61.0,0.9982,3.21,0.5,9.5,5 +9.9,0.35,0.41,2.3,0.083,11.0,61.0,0.9982,3.21,0.5,9.5,5 +10.0,0.56,0.24,2.2,0.079,19.0,58.0,0.9991,3.18,0.56,10.1,6 +10.0,0.56,0.24,2.2,0.079,19.0,58.0,0.9991,3.18,0.56,10.1,6 +8.6,0.63,0.17,2.9,0.099,21.0,119.0,0.998,3.09,0.52,9.3,5 +7.4,0.37,0.43,2.6,0.08199999999999999,18.0,82.0,0.99708,3.33,0.68,9.7,6 +8.8,0.64,0.17,2.9,0.084,25.0,130.0,0.99818,3.23,0.54,9.6,5 +7.1,0.61,0.02,2.5,0.081,17.0,87.0,0.99745,3.48,0.6,9.7,6 +7.7,0.6,0.0,2.6,0.055,7.0,13.0,0.99639,3.38,0.56,10.8,5 +10.1,0.27,0.54,2.3,0.065,7.0,26.0,0.99531,3.17,0.53,12.5,6 +10.8,0.89,0.3,2.6,0.132,7.0,60.0,0.9978600000000001,2.99,1.18,10.2,5 +8.7,0.46,0.31,2.5,0.126,24.0,64.0,0.99746,3.1,0.74,9.6,5 +9.3,0.37,0.44,1.6,0.038,21.0,42.0,0.99526,3.24,0.81,10.8,7 +9.4,0.5,0.34,3.6,0.08199999999999999,5.0,14.0,0.9987,3.29,0.52,10.7,6 +9.4,0.5,0.34,3.6,0.08199999999999999,5.0,14.0,0.9987,3.29,0.52,10.7,6 +7.2,0.61,0.08,4.0,0.08199999999999999,26.0,108.0,0.99641,3.25,0.51,9.4,5 +8.6,0.55,0.09,3.3,0.068,8.0,17.0,0.99735,3.23,0.44,10.0,5 +5.1,0.585,0.0,1.7,0.044000000000000004,14.0,86.0,0.99264,3.56,0.94,12.9,7 +7.7,0.56,0.08,2.5,0.114,14.0,46.0,0.9971,3.24,0.66,9.6,6 +8.4,0.52,0.22,2.7,0.084,4.0,18.0,0.99682,3.26,0.57,9.9,6 +8.2,0.28,0.4,2.4,0.052000000000000005,4.0,10.0,0.99356,3.33,0.7,12.8,7 +8.4,0.25,0.39,2.0,0.040999999999999995,4.0,10.0,0.9938600000000001,3.27,0.71,12.5,7 +8.2,0.28,0.4,2.4,0.052000000000000005,4.0,10.0,0.99356,3.33,0.7,12.8,7 +7.4,0.53,0.12,1.9,0.165,4.0,12.0,0.99702,3.26,0.86,9.2,5 +7.6,0.48,0.31,2.8,0.07,4.0,15.0,0.9969299999999999,3.22,0.55,10.3,6 +7.3,0.49,0.1,2.6,0.068,4.0,14.0,0.9956200000000001,3.3,0.47,10.5,5 +12.9,0.5,0.55,2.8,0.07200000000000001,7.0,24.0,1.0001200000000001,3.09,0.68,10.9,6 +10.8,0.45,0.33,2.5,0.099,20.0,38.0,0.99818,3.24,0.71,10.8,5 +6.9,0.39,0.24,2.1,0.102,4.0,7.0,0.9946200000000001,3.44,0.58,11.4,4 +12.6,0.41,0.54,2.8,0.10300000000000001,19.0,41.0,0.99939,3.21,0.76,11.3,6 +10.8,0.45,0.33,2.5,0.099,20.0,38.0,0.99818,3.24,0.71,10.8,5 +9.8,0.51,0.19,3.2,0.081,8.0,30.0,0.9984,3.23,0.58,10.5,6 +10.8,0.29,0.42,1.6,0.084,19.0,27.0,0.99545,3.28,0.73,11.9,6 +7.1,0.715,0.0,2.35,0.071,21.0,47.0,0.9963200000000001,3.29,0.45,9.4,5 +9.1,0.66,0.15,3.2,0.09699999999999999,9.0,59.0,0.99976,3.28,0.54,9.6,5 +7.0,0.685,0.0,1.9,0.099,9.0,22.0,0.9960600000000001,3.34,0.6,9.7,5 +4.9,0.42,0.0,2.1,0.048,16.0,42.0,0.99154,3.71,0.74,14.0,7 +6.7,0.54,0.13,2.0,0.076,15.0,36.0,0.9973,3.61,0.64,9.8,5 +6.7,0.54,0.13,2.0,0.076,15.0,36.0,0.9973,3.61,0.64,9.8,5 +7.1,0.48,0.28,2.8,0.068,6.0,16.0,0.99682,3.24,0.53,10.3,5 +7.1,0.46,0.14,2.8,0.076,15.0,37.0,0.99624,3.36,0.49,10.7,5 +7.5,0.27,0.34,2.3,0.05,4.0,8.0,0.9951,3.4,0.64,11.0,7 +7.1,0.46,0.14,2.8,0.076,15.0,37.0,0.99624,3.36,0.49,10.7,5 +7.8,0.57,0.09,2.3,0.065,34.0,45.0,0.9941700000000001,3.46,0.74,12.7,8 +5.9,0.61,0.08,2.1,0.071,16.0,24.0,0.9937600000000001,3.56,0.77,11.1,6 +7.5,0.685,0.07,2.5,0.057999999999999996,5.0,9.0,0.9963200000000001,3.38,0.55,10.9,4 +5.9,0.61,0.08,2.1,0.071,16.0,24.0,0.9937600000000001,3.56,0.77,11.1,6 +10.4,0.44,0.42,1.5,0.145,34.0,48.0,0.9983200000000001,3.38,0.86,9.9,3 +11.6,0.47,0.44,1.6,0.147,36.0,51.0,0.99836,3.38,0.86,9.9,4 +8.8,0.685,0.26,1.6,0.08800000000000001,16.0,23.0,0.9969399999999999,3.32,0.47,9.4,5 +7.6,0.665,0.1,1.5,0.066,27.0,55.0,0.99655,3.39,0.51,9.3,5 +6.7,0.28,0.28,2.4,0.012,36.0,100.0,0.99064,3.26,0.39,11.7,7 +6.7,0.28,0.28,2.4,0.012,36.0,100.0,0.99064,3.26,0.39,11.7,7 +10.1,0.31,0.35,1.6,0.075,9.0,28.0,0.99672,3.24,0.83,11.2,7 +6.0,0.5,0.04,2.2,0.092,13.0,26.0,0.9964700000000001,3.46,0.47,10.0,5 +11.1,0.42,0.47,2.65,0.085,9.0,34.0,0.99736,3.24,0.77,12.1,7 +6.6,0.66,0.0,3.0,0.115,21.0,31.0,0.99629,3.45,0.63,10.3,5 +10.6,0.5,0.45,2.6,0.11900000000000001,34.0,68.0,0.99708,3.23,0.72,10.9,6 +7.1,0.685,0.35,2.0,0.08800000000000001,9.0,92.0,0.9963,3.28,0.62,9.4,5 +9.9,0.25,0.46,1.7,0.062,26.0,42.0,0.9959,3.18,0.83,10.6,6 +6.4,0.64,0.21,1.8,0.081,14.0,31.0,0.9968899999999999,3.59,0.66,9.8,5 +6.4,0.64,0.21,1.8,0.081,14.0,31.0,0.9968899999999999,3.59,0.66,9.8,5 +7.4,0.68,0.16,1.8,0.078,12.0,39.0,0.9977,3.5,0.7,9.9,6 +6.4,0.64,0.21,1.8,0.081,14.0,31.0,0.9968899999999999,3.59,0.66,9.8,5 +6.4,0.63,0.21,1.6,0.08,12.0,32.0,0.9968899999999999,3.58,0.66,9.8,5 +9.3,0.43,0.44,1.9,0.085,9.0,22.0,0.99708,3.28,0.55,9.5,5 +9.3,0.43,0.44,1.9,0.085,9.0,22.0,0.99708,3.28,0.55,9.5,5 +8.0,0.42,0.32,2.5,0.08,26.0,122.0,0.9980100000000001,3.22,1.07,9.7,5 +9.3,0.36,0.39,1.5,0.08,41.0,55.0,0.9965200000000001,3.47,0.73,10.9,6 +9.3,0.36,0.39,1.5,0.08,41.0,55.0,0.9965200000000001,3.47,0.73,10.9,6 +7.6,0.735,0.02,2.5,0.071,10.0,14.0,0.9953799999999999,3.51,0.71,11.7,7 +9.3,0.36,0.39,1.5,0.08,41.0,55.0,0.9965200000000001,3.47,0.73,10.9,6 +8.2,0.26,0.34,2.5,0.073,16.0,47.0,0.9959399999999999,3.4,0.78,11.3,7 +11.7,0.28,0.47,1.7,0.054000000000000006,17.0,32.0,0.9968600000000001,3.15,0.67,10.6,7 +6.8,0.56,0.22,1.8,0.07400000000000001,15.0,24.0,0.9943799999999999,3.4,0.82,11.2,6 +7.2,0.62,0.06,2.7,0.077,15.0,85.0,0.99746,3.51,0.54,9.5,5 +5.8,1.01,0.66,2.0,0.039,15.0,88.0,0.9935700000000001,3.66,0.6,11.5,6 +7.5,0.42,0.32,2.7,0.067,7.0,25.0,0.9962799999999999,3.24,0.44,10.4,5 +7.2,0.62,0.06,2.5,0.078,17.0,84.0,0.99746,3.51,0.53,9.7,5 +7.2,0.62,0.06,2.7,0.077,15.0,85.0,0.99746,3.51,0.54,9.5,5 +7.2,0.635,0.07,2.6,0.077,16.0,86.0,0.9974799999999999,3.51,0.54,9.7,5 +6.8,0.49,0.22,2.3,0.071,13.0,24.0,0.9943799999999999,3.41,0.83,11.3,6 +6.9,0.51,0.23,2.0,0.07200000000000001,13.0,22.0,0.9943799999999999,3.4,0.84,11.2,6 +6.8,0.56,0.22,1.8,0.07400000000000001,15.0,24.0,0.9943799999999999,3.4,0.82,11.2,6 +7.6,0.63,0.03,2.0,0.08,27.0,43.0,0.9957799999999999,3.44,0.64,10.9,6 +7.7,0.715,0.01,2.1,0.064,31.0,43.0,0.99371,3.41,0.57,11.8,6 +6.9,0.56,0.03,1.5,0.086,36.0,46.0,0.9952200000000001,3.53,0.57,10.6,5 +7.3,0.35,0.24,2.0,0.067,28.0,48.0,0.9957600000000001,3.43,0.54,10.0,4 +9.1,0.21,0.37,1.6,0.067,6.0,10.0,0.9955200000000001,3.23,0.58,11.1,7 +10.4,0.38,0.46,2.1,0.10400000000000001,6.0,10.0,0.99664,3.12,0.65,11.8,7 +8.8,0.31,0.4,2.8,0.109,7.0,16.0,0.9961399999999999,3.31,0.79,11.8,7 +7.1,0.47,0.0,2.2,0.067,7.0,14.0,0.9951700000000001,3.4,0.58,10.9,4 +7.7,0.715,0.01,2.1,0.064,31.0,43.0,0.99371,3.41,0.57,11.8,6 +8.8,0.61,0.19,4.0,0.094,30.0,69.0,0.99787,3.22,0.5,10.0,6 +7.2,0.6,0.04,2.5,0.076,18.0,88.0,0.99745,3.53,0.55,9.5,5 +9.2,0.56,0.18,1.6,0.078,10.0,21.0,0.9957600000000001,3.15,0.49,9.9,5 +7.6,0.715,0.0,2.1,0.068,30.0,35.0,0.9953299999999999,3.48,0.65,11.4,6 +8.4,0.31,0.29,3.1,0.19399999999999998,14.0,26.0,0.99536,3.22,0.78,12.0,6 +7.2,0.6,0.04,2.5,0.076,18.0,88.0,0.99745,3.53,0.55,9.5,5 +8.8,0.61,0.19,4.0,0.094,30.0,69.0,0.99787,3.22,0.5,10.0,6 +8.9,0.75,0.14,2.5,0.086,9.0,30.0,0.99824,3.34,0.64,10.5,5 +9.0,0.8,0.12,2.4,0.083,8.0,28.0,0.99836,3.33,0.65,10.4,6 +10.7,0.52,0.38,2.6,0.066,29.0,56.0,0.99577,3.15,0.79,12.1,7 +6.8,0.57,0.0,2.5,0.07200000000000001,32.0,64.0,0.9949100000000001,3.43,0.56,11.2,6 +10.7,0.9,0.34,6.6,0.11199999999999999,23.0,99.0,1.00289,3.22,0.68,9.3,5 +7.2,0.34,0.24,2.0,0.071,30.0,52.0,0.9957600000000001,3.44,0.58,10.1,5 +7.2,0.66,0.03,2.3,0.078,16.0,86.0,0.9974299999999999,3.53,0.57,9.7,5 +10.1,0.45,0.23,1.9,0.08199999999999999,10.0,18.0,0.99774,3.22,0.65,9.3,6 +7.2,0.66,0.03,2.3,0.078,16.0,86.0,0.9974299999999999,3.53,0.57,9.7,5 +7.2,0.63,0.03,2.2,0.08,17.0,88.0,0.99745,3.53,0.58,9.8,6 +7.1,0.59,0.01,2.3,0.08,27.0,43.0,0.9955,3.42,0.58,10.7,6 +8.3,0.31,0.39,2.4,0.078,17.0,43.0,0.99444,3.31,0.77,12.5,7 +7.1,0.59,0.01,2.3,0.08,27.0,43.0,0.9955,3.42,0.58,10.7,6 +8.3,0.31,0.39,2.4,0.078,17.0,43.0,0.99444,3.31,0.77,12.5,7 +8.3,1.02,0.02,3.4,0.084,6.0,11.0,0.99892,3.48,0.49,11.0,3 +8.9,0.31,0.36,2.6,0.055999999999999994,10.0,39.0,0.9956200000000001,3.4,0.69,11.8,5 +7.4,0.635,0.1,2.4,0.08,16.0,33.0,0.99736,3.58,0.69,10.8,7 +7.4,0.635,0.1,2.4,0.08,16.0,33.0,0.99736,3.58,0.69,10.8,7 +6.8,0.59,0.06,6.0,0.06,11.0,18.0,0.9962,3.41,0.59,10.8,7 +6.8,0.59,0.06,6.0,0.06,11.0,18.0,0.9962,3.41,0.59,10.8,7 +9.2,0.58,0.2,3.0,0.081,15.0,115.0,0.998,3.23,0.59,9.5,5 +7.2,0.54,0.27,2.6,0.084,12.0,78.0,0.9964,3.39,0.71,11.0,5 +6.1,0.56,0.0,2.2,0.079,6.0,9.0,0.9948,3.59,0.54,11.5,6 +7.4,0.52,0.13,2.4,0.078,34.0,61.0,0.9952799999999999,3.43,0.59,10.8,6 +7.3,0.305,0.39,1.2,0.059000000000000004,7.0,11.0,0.99331,3.29,0.52,11.5,6 +9.3,0.38,0.48,3.8,0.132,3.0,11.0,0.99577,3.23,0.57,13.2,6 +9.1,0.28,0.46,9.0,0.114,3.0,9.0,0.9990100000000001,3.18,0.6,10.9,6 +10.0,0.46,0.44,2.9,0.065,4.0,8.0,0.99674,3.33,0.62,12.2,6 +9.4,0.395,0.46,4.6,0.094,3.0,10.0,0.99639,3.27,0.64,12.2,7 +7.3,0.305,0.39,1.2,0.059000000000000004,7.0,11.0,0.99331,3.29,0.52,11.5,6 +8.6,0.315,0.4,2.2,0.079,3.0,6.0,0.9951200000000001,3.27,0.67,11.9,6 +5.3,0.715,0.19,1.5,0.161,7.0,62.0,0.99395,3.62,0.61,11.0,5 +6.8,0.41,0.31,8.8,0.084,26.0,45.0,0.99824,3.38,0.64,10.1,6 +8.4,0.36,0.32,2.2,0.081,32.0,79.0,0.9964,3.3,0.72,11.0,6 +8.4,0.62,0.12,1.8,0.07200000000000001,38.0,46.0,0.9950399999999999,3.38,0.89,11.8,6 +9.6,0.41,0.37,2.3,0.091,10.0,23.0,0.9978600000000001,3.24,0.56,10.5,5 +8.4,0.36,0.32,2.2,0.081,32.0,79.0,0.9964,3.3,0.72,11.0,6 +8.4,0.62,0.12,1.8,0.07200000000000001,38.0,46.0,0.9950399999999999,3.38,0.89,11.8,6 +6.8,0.41,0.31,8.8,0.084,26.0,45.0,0.99824,3.38,0.64,10.1,6 +8.6,0.47,0.27,2.3,0.055,14.0,28.0,0.99516,3.18,0.8,11.2,5 +8.6,0.22,0.36,1.9,0.064,53.0,77.0,0.9960399999999999,3.47,0.87,11.0,7 +9.4,0.24,0.33,2.3,0.061,52.0,73.0,0.9978600000000001,3.47,0.9,10.2,6 +8.4,0.67,0.19,2.2,0.09300000000000001,11.0,75.0,0.99736,3.2,0.59,9.2,4 +8.6,0.47,0.27,2.3,0.055,14.0,28.0,0.99516,3.18,0.8,11.2,5 +8.7,0.33,0.38,3.3,0.063,10.0,19.0,0.9946799999999999,3.3,0.73,12.0,7 +6.6,0.61,0.01,1.9,0.08,8.0,25.0,0.99746,3.69,0.73,10.5,5 +7.4,0.61,0.01,2.0,0.07400000000000001,13.0,38.0,0.9974799999999999,3.48,0.65,9.8,5 +7.6,0.4,0.29,1.9,0.078,29.0,66.0,0.9971,3.45,0.59,9.5,6 +7.4,0.61,0.01,2.0,0.07400000000000001,13.0,38.0,0.9974799999999999,3.48,0.65,9.8,5 +6.6,0.61,0.01,1.9,0.08,8.0,25.0,0.99746,3.69,0.73,10.5,5 +8.8,0.3,0.38,2.3,0.06,19.0,72.0,0.9954299999999999,3.39,0.72,11.8,6 +8.8,0.3,0.38,2.3,0.06,19.0,72.0,0.9954299999999999,3.39,0.72,11.8,6 +12.0,0.63,0.5,1.4,0.071,6.0,26.0,0.9979100000000001,3.07,0.6,10.4,4 +7.2,0.38,0.38,2.8,0.068,23.0,42.0,0.99356,3.34,0.72,12.9,7 +6.2,0.46,0.17,1.6,0.073,7.0,11.0,0.99425,3.61,0.54,11.4,5 +9.6,0.33,0.52,2.2,0.07400000000000001,13.0,25.0,0.9950899999999999,3.36,0.76,12.4,7 +9.9,0.27,0.49,5.0,0.08199999999999999,9.0,17.0,0.99484,3.19,0.52,12.5,7 +10.1,0.43,0.4,2.6,0.092,13.0,52.0,0.99834,3.22,0.64,10.0,7 +9.8,0.5,0.34,2.3,0.094,10.0,45.0,0.99864,3.24,0.6,9.7,7 +8.3,0.3,0.49,3.8,0.09,11.0,24.0,0.99498,3.27,0.64,12.1,7 +10.2,0.44,0.42,2.0,0.071,7.0,20.0,0.99566,3.14,0.79,11.1,7 +10.2,0.44,0.58,4.1,0.092,11.0,24.0,0.99745,3.29,0.99,12.0,7 +8.3,0.28,0.48,2.1,0.09300000000000001,6.0,12.0,0.99408,3.26,0.62,12.4,7 +8.9,0.12,0.45,1.8,0.075,10.0,21.0,0.9955200000000001,3.41,0.76,11.9,7 +8.9,0.12,0.45,1.8,0.075,10.0,21.0,0.9955200000000001,3.41,0.76,11.9,7 +8.9,0.12,0.45,1.8,0.075,10.0,21.0,0.9955200000000001,3.41,0.76,11.9,7 +8.3,0.28,0.48,2.1,0.09300000000000001,6.0,12.0,0.99408,3.26,0.62,12.4,7 +8.2,0.31,0.4,2.2,0.057999999999999996,6.0,10.0,0.99536,3.31,0.68,11.2,7 +10.2,0.34,0.48,2.1,0.052000000000000005,5.0,9.0,0.9945799999999999,3.2,0.69,12.1,7 +7.6,0.43,0.4,2.7,0.08199999999999999,6.0,11.0,0.9953799999999999,3.44,0.54,12.2,6 +8.5,0.21,0.52,1.9,0.09,9.0,23.0,0.9964799999999999,3.36,0.67,10.4,5 +9.0,0.36,0.52,2.1,0.111,5.0,10.0,0.9956799999999999,3.31,0.62,11.3,6 +9.5,0.37,0.52,2.0,0.08800000000000001,12.0,51.0,0.99613,3.29,0.58,11.1,6 +6.4,0.57,0.12,2.3,0.12,25.0,36.0,0.99519,3.47,0.71,11.3,7 +8.0,0.59,0.05,2.0,0.08900000000000001,12.0,32.0,0.99735,3.36,0.61,10.0,5 +8.5,0.47,0.27,1.9,0.057999999999999996,18.0,38.0,0.99518,3.16,0.85,11.1,6 +7.1,0.56,0.14,1.6,0.078,7.0,18.0,0.99592,3.27,0.62,9.3,5 +6.6,0.57,0.02,2.1,0.115,6.0,16.0,0.99654,3.38,0.69,9.5,5 +8.8,0.27,0.39,2.0,0.1,20.0,27.0,0.99546,3.15,0.69,11.2,6 +8.5,0.47,0.27,1.9,0.057999999999999996,18.0,38.0,0.99518,3.16,0.85,11.1,6 +8.3,0.34,0.4,2.4,0.065,24.0,48.0,0.99554,3.34,0.86,11.0,6 +9.0,0.38,0.41,2.4,0.10300000000000001,6.0,10.0,0.9960399999999999,3.13,0.58,11.9,7 +8.5,0.66,0.2,2.1,0.09699999999999999,23.0,113.0,0.9973299999999999,3.13,0.48,9.2,5 +9.0,0.4,0.43,2.4,0.068,29.0,46.0,0.9943,3.2,0.6,12.2,6 +6.7,0.56,0.09,2.9,0.079,7.0,22.0,0.99669,3.46,0.61,10.2,5 +10.4,0.26,0.48,1.9,0.066,6.0,10.0,0.99724,3.33,0.87,10.9,6 +10.4,0.26,0.48,1.9,0.066,6.0,10.0,0.99724,3.33,0.87,10.9,6 +10.1,0.38,0.5,2.4,0.10400000000000001,6.0,13.0,0.9964299999999999,3.22,0.65,11.6,7 +8.5,0.34,0.44,1.7,0.079,6.0,12.0,0.99605,3.52,0.63,10.7,5 +8.8,0.33,0.41,5.9,0.073,7.0,13.0,0.9965799999999999,3.3,0.62,12.1,7 +7.2,0.41,0.3,2.1,0.083,35.0,72.0,0.997,3.44,0.52,9.4,5 +7.2,0.41,0.3,2.1,0.083,35.0,72.0,0.997,3.44,0.52,9.4,5 +8.4,0.59,0.29,2.6,0.109,31.0,119.0,0.9980100000000001,3.15,0.5,9.1,5 +7.0,0.4,0.32,3.6,0.061,9.0,29.0,0.99416,3.28,0.49,11.3,7 +12.2,0.45,0.49,1.4,0.075,3.0,6.0,0.9969,3.13,0.63,10.4,5 +9.1,0.5,0.3,1.9,0.065,8.0,17.0,0.99774,3.32,0.71,10.5,6 +9.5,0.86,0.26,1.9,0.079,13.0,28.0,0.9971200000000001,3.25,0.62,10.0,5 +7.3,0.52,0.32,2.1,0.07,51.0,70.0,0.99418,3.34,0.82,12.9,6 +9.1,0.5,0.3,1.9,0.065,8.0,17.0,0.99774,3.32,0.71,10.5,6 +12.2,0.45,0.49,1.4,0.075,3.0,6.0,0.9969,3.13,0.63,10.4,5 +7.4,0.58,0.0,2.0,0.064,7.0,11.0,0.9956200000000001,3.45,0.58,11.3,6 +9.8,0.34,0.39,1.4,0.066,3.0,7.0,0.9947,3.19,0.55,11.4,7 +7.1,0.36,0.3,1.6,0.08,35.0,70.0,0.9969299999999999,3.44,0.5,9.4,5 +7.7,0.39,0.12,1.7,0.09699999999999999,19.0,27.0,0.9959600000000001,3.16,0.49,9.4,5 +9.7,0.295,0.4,1.5,0.073,14.0,21.0,0.99556,3.14,0.51,10.9,6 +7.7,0.39,0.12,1.7,0.09699999999999999,19.0,27.0,0.9959600000000001,3.16,0.49,9.4,5 +7.1,0.34,0.28,2.0,0.08199999999999999,31.0,68.0,0.9969399999999999,3.45,0.48,9.4,5 +6.5,0.4,0.1,2.0,0.076,30.0,47.0,0.99554,3.36,0.48,9.4,6 +7.1,0.34,0.28,2.0,0.08199999999999999,31.0,68.0,0.9969399999999999,3.45,0.48,9.4,5 +10.0,0.35,0.45,2.5,0.092,20.0,88.0,0.99918,3.15,0.43,9.4,5 +7.7,0.6,0.06,2.0,0.079,19.0,41.0,0.99697,3.39,0.62,10.1,6 +5.6,0.66,0.0,2.2,0.087,3.0,11.0,0.9937799999999999,3.71,0.63,12.8,7 +5.6,0.66,0.0,2.2,0.087,3.0,11.0,0.9937799999999999,3.71,0.63,12.8,7 +8.9,0.84,0.34,1.4,0.05,4.0,10.0,0.99554,3.12,0.48,9.1,6 +6.4,0.69,0.0,1.65,0.055,7.0,12.0,0.9916200000000001,3.47,0.53,12.9,6 +7.5,0.43,0.3,2.2,0.062,6.0,12.0,0.99495,3.44,0.72,11.5,7 +9.9,0.35,0.38,1.5,0.057999999999999996,31.0,47.0,0.9967600000000001,3.26,0.82,10.6,7 +9.1,0.29,0.33,2.05,0.063,13.0,27.0,0.99516,3.26,0.84,11.7,7 +6.8,0.36,0.32,1.8,0.067,4.0,8.0,0.9928,3.36,0.55,12.8,7 +8.2,0.43,0.29,1.6,0.081,27.0,45.0,0.99603,3.25,0.54,10.3,5 +6.8,0.36,0.32,1.8,0.067,4.0,8.0,0.9928,3.36,0.55,12.8,7 +9.1,0.29,0.33,2.05,0.063,13.0,27.0,0.99516,3.26,0.84,11.7,7 +9.1,0.3,0.34,2.0,0.064,12.0,25.0,0.99516,3.26,0.84,11.7,7 +8.9,0.35,0.4,3.6,0.11,12.0,24.0,0.99549,3.23,0.7,12.0,7 +9.6,0.5,0.36,2.8,0.11599999999999999,26.0,55.0,0.9972200000000001,3.18,0.68,10.9,5 +8.9,0.28,0.45,1.7,0.067,7.0,12.0,0.99354,3.25,0.55,12.3,7 +8.9,0.32,0.31,2.0,0.08800000000000001,12.0,19.0,0.9957,3.17,0.55,10.4,6 +7.7,1.005,0.15,2.1,0.102,11.0,32.0,0.9960399999999999,3.23,0.48,10.0,5 +7.5,0.71,0.0,1.6,0.092,22.0,31.0,0.99635,3.38,0.58,10.0,6 +8.0,0.58,0.16,2.0,0.12,3.0,7.0,0.99454,3.22,0.58,11.2,6 +10.5,0.39,0.46,2.2,0.075,14.0,27.0,0.99598,3.06,0.84,11.4,6 +8.9,0.38,0.4,2.2,0.068,12.0,28.0,0.9948600000000001,3.27,0.75,12.6,7 +8.0,0.18,0.37,0.9,0.049,36.0,109.0,0.9900700000000001,2.89,0.44,12.7,6 +8.0,0.18,0.37,0.9,0.049,36.0,109.0,0.9900700000000001,2.89,0.44,12.7,6 +7.0,0.5,0.14,1.8,0.078,10.0,23.0,0.99636,3.53,0.61,10.4,5 +11.3,0.36,0.66,2.4,0.12300000000000001,3.0,8.0,0.9964200000000001,3.2,0.53,11.9,6 +11.3,0.36,0.66,2.4,0.12300000000000001,3.0,8.0,0.9964200000000001,3.2,0.53,11.9,6 +7.0,0.51,0.09,2.1,0.062,4.0,9.0,0.99584,3.35,0.54,10.5,5 +8.2,0.32,0.42,2.3,0.098,3.0,9.0,0.9950600000000001,3.27,0.55,12.3,6 +7.7,0.58,0.01,1.8,0.08800000000000001,12.0,18.0,0.9956799999999999,3.32,0.56,10.5,7 +8.6,0.83,0.0,2.8,0.095,17.0,43.0,0.9982200000000001,3.33,0.6,10.4,6 +7.9,0.31,0.32,1.9,0.066,14.0,36.0,0.99364,3.41,0.56,12.6,6 +6.4,0.795,0.0,2.2,0.065,28.0,52.0,0.9937799999999999,3.49,0.52,11.6,5 +7.2,0.34,0.21,2.5,0.075,41.0,68.0,0.9958600000000001,3.37,0.54,10.1,6 +7.7,0.58,0.01,1.8,0.08800000000000001,12.0,18.0,0.9956799999999999,3.32,0.56,10.5,7 +7.1,0.59,0.0,2.1,0.091,9.0,14.0,0.9948799999999999,3.42,0.55,11.5,7 +7.3,0.55,0.01,1.8,0.09300000000000001,9.0,15.0,0.9951399999999999,3.35,0.58,11.0,7 +8.1,0.82,0.0,4.1,0.095,5.0,14.0,0.99854,3.36,0.53,9.6,5 +7.5,0.57,0.08,2.6,0.08900000000000001,14.0,27.0,0.99592,3.3,0.59,10.4,6 +8.9,0.745,0.18,2.5,0.077,15.0,48.0,0.99739,3.2,0.47,9.7,6 +10.1,0.37,0.34,2.4,0.085,5.0,17.0,0.9968299999999999,3.17,0.65,10.6,7 +7.6,0.31,0.34,2.5,0.08199999999999999,26.0,35.0,0.99356,3.22,0.59,12.5,7 +7.3,0.91,0.1,1.8,0.07400000000000001,20.0,56.0,0.99672,3.35,0.56,9.2,5 +8.7,0.41,0.41,6.2,0.078,25.0,42.0,0.9953,3.24,0.77,12.6,7 +8.9,0.5,0.21,2.2,0.08800000000000001,21.0,39.0,0.99692,3.33,0.83,11.1,6 +7.4,0.965,0.0,2.2,0.08800000000000001,16.0,32.0,0.99756,3.58,0.67,10.2,5 +6.9,0.49,0.19,1.7,0.079,13.0,26.0,0.9954700000000001,3.38,0.64,9.8,6 +8.9,0.5,0.21,2.2,0.08800000000000001,21.0,39.0,0.99692,3.33,0.83,11.1,6 +9.5,0.39,0.41,8.9,0.069,18.0,39.0,0.99859,3.29,0.81,10.9,7 +6.4,0.39,0.33,3.3,0.046,12.0,53.0,0.9929399999999999,3.36,0.62,12.2,6 +6.9,0.44,0.0,1.4,0.07,32.0,38.0,0.9943799999999999,3.32,0.58,11.4,6 +7.6,0.78,0.0,1.7,0.076,33.0,45.0,0.9961200000000001,3.31,0.62,10.7,6 +7.1,0.43,0.17,1.8,0.08199999999999999,27.0,51.0,0.99634,3.49,0.64,10.4,5 +9.3,0.49,0.36,1.7,0.081,3.0,14.0,0.99702,3.27,0.78,10.9,6 +9.3,0.5,0.36,1.8,0.084,6.0,17.0,0.9970399999999999,3.27,0.77,10.8,6 +7.1,0.43,0.17,1.8,0.08199999999999999,27.0,51.0,0.99634,3.49,0.64,10.4,5 +8.5,0.46,0.59,1.4,0.414,16.0,45.0,0.99702,3.03,1.34,9.2,5 +5.6,0.605,0.05,2.4,0.073,19.0,25.0,0.9925799999999999,3.56,0.55,12.9,5 +8.3,0.33,0.42,2.3,0.07,9.0,20.0,0.99426,3.38,0.77,12.7,7 +8.2,0.64,0.27,2.0,0.095,5.0,77.0,0.9974700000000001,3.13,0.62,9.1,6 +8.2,0.64,0.27,2.0,0.095,5.0,77.0,0.9974700000000001,3.13,0.62,9.1,6 +8.9,0.48,0.53,4.0,0.10099999999999999,3.0,10.0,0.9958600000000001,3.21,0.59,12.1,7 +7.6,0.42,0.25,3.9,0.10400000000000001,28.0,90.0,0.99784,3.15,0.57,9.1,5 +9.9,0.53,0.57,2.4,0.09300000000000001,30.0,52.0,0.9971,3.19,0.76,11.6,7 +8.9,0.48,0.53,4.0,0.10099999999999999,3.0,10.0,0.9958600000000001,3.21,0.59,12.1,7 +11.6,0.23,0.57,1.8,0.07400000000000001,3.0,8.0,0.9981,3.14,0.7,9.9,6 +9.1,0.4,0.5,1.8,0.071,7.0,16.0,0.9946200000000001,3.21,0.69,12.5,8 +8.0,0.38,0.44,1.9,0.098,6.0,15.0,0.9956,3.3,0.64,11.4,6 +10.2,0.29,0.65,2.4,0.075,6.0,17.0,0.99565,3.22,0.63,11.8,6 +8.2,0.74,0.09,2.0,0.067,5.0,10.0,0.99418,3.28,0.57,11.8,6 +7.7,0.61,0.18,2.4,0.083,6.0,20.0,0.9963,3.29,0.6,10.2,6 +6.6,0.52,0.08,2.4,0.07,13.0,26.0,0.9935799999999999,3.4,0.72,12.5,7 +11.1,0.31,0.53,2.2,0.06,3.0,10.0,0.99572,3.02,0.83,10.9,7 +11.1,0.31,0.53,2.2,0.06,3.0,10.0,0.99572,3.02,0.83,10.9,7 +8.0,0.62,0.35,2.8,0.086,28.0,52.0,0.997,3.31,0.62,10.8,5 +9.3,0.33,0.45,1.5,0.057,19.0,37.0,0.99498,3.18,0.89,11.1,7 +7.5,0.77,0.2,8.1,0.098,30.0,92.0,0.99892,3.2,0.58,9.2,5 +7.2,0.35,0.26,1.8,0.083,33.0,75.0,0.9968,3.4,0.58,9.5,6 +8.0,0.62,0.33,2.7,0.08800000000000001,16.0,37.0,0.9972,3.31,0.58,10.7,6 +7.5,0.77,0.2,8.1,0.098,30.0,92.0,0.99892,3.2,0.58,9.2,5 +9.1,0.25,0.34,2.0,0.071,45.0,67.0,0.99769,3.44,0.86,10.2,7 +9.9,0.32,0.56,2.0,0.073,3.0,8.0,0.99534,3.15,0.73,11.4,6 +8.6,0.37,0.65,6.4,0.08,3.0,8.0,0.9981700000000001,3.27,0.58,11.0,5 +8.6,0.37,0.65,6.4,0.08,3.0,8.0,0.9981700000000001,3.27,0.58,11.0,5 +7.9,0.3,0.68,8.3,0.05,37.5,278.0,0.99316,3.01,0.51,12.3,7 +10.3,0.27,0.56,1.4,0.047,3.0,8.0,0.99471,3.16,0.51,11.8,6 +7.9,0.3,0.68,8.3,0.05,37.5,289.0,0.99316,3.01,0.51,12.3,7 +7.2,0.38,0.3,1.8,0.073,31.0,70.0,0.99685,3.42,0.59,9.5,6 +8.7,0.42,0.45,2.4,0.07200000000000001,32.0,59.0,0.9961700000000001,3.33,0.77,12.0,6 +7.2,0.38,0.3,1.8,0.073,31.0,70.0,0.99685,3.42,0.59,9.5,6 +6.8,0.48,0.08,1.8,0.07400000000000001,40.0,64.0,0.99529,3.12,0.49,9.6,5 +8.5,0.34,0.4,4.7,0.055,3.0,9.0,0.9973799999999999,3.38,0.66,11.6,7 +7.9,0.19,0.42,1.6,0.057,18.0,30.0,0.9940000000000001,3.29,0.69,11.2,6 +11.6,0.41,0.54,1.5,0.095,22.0,41.0,0.99735,3.02,0.76,9.9,7 +11.6,0.41,0.54,1.5,0.095,22.0,41.0,0.99735,3.02,0.76,9.9,7 +10.0,0.26,0.54,1.9,0.083,42.0,74.0,0.99451,2.98,0.63,11.8,8 +7.9,0.34,0.42,2.0,0.086,8.0,19.0,0.99546,3.35,0.6,11.4,6 +7.0,0.54,0.09,2.0,0.081,10.0,16.0,0.99479,3.43,0.59,11.5,6 +9.2,0.31,0.36,2.2,0.079,11.0,31.0,0.99615,3.33,0.86,12.0,7 +6.6,0.725,0.09,5.5,0.11699999999999999,9.0,17.0,0.99655,3.35,0.49,10.8,6 +9.4,0.4,0.47,2.5,0.087,6.0,20.0,0.99772,3.15,0.5,10.5,5 +6.6,0.725,0.09,5.5,0.11699999999999999,9.0,17.0,0.99655,3.35,0.49,10.8,6 +8.6,0.52,0.38,1.5,0.096,5.0,18.0,0.99666,3.2,0.52,9.4,5 +8.0,0.31,0.45,2.1,0.21600000000000003,5.0,16.0,0.9935799999999999,3.15,0.81,12.5,7 +8.6,0.52,0.38,1.5,0.096,5.0,18.0,0.99666,3.2,0.52,9.4,5 +8.4,0.34,0.42,2.1,0.07200000000000001,23.0,36.0,0.99392,3.11,0.78,12.4,6 +7.4,0.49,0.27,2.1,0.071,14.0,25.0,0.9938799999999999,3.35,0.63,12.0,6 +6.1,0.48,0.09,1.7,0.078,18.0,30.0,0.9940200000000001,3.45,0.54,11.2,6 +7.4,0.49,0.27,2.1,0.071,14.0,25.0,0.9938799999999999,3.35,0.63,12.0,6 +8.0,0.48,0.34,2.2,0.073,16.0,25.0,0.9936,3.28,0.66,12.4,6 +6.3,0.57,0.28,2.1,0.048,13.0,49.0,0.99374,3.41,0.6,12.8,5 +8.2,0.23,0.42,1.9,0.069,9.0,17.0,0.9937600000000001,3.21,0.54,12.3,6 +9.1,0.3,0.41,2.0,0.068,10.0,24.0,0.99523,3.27,0.85,11.7,7 +8.1,0.78,0.1,3.3,0.09,4.0,13.0,0.99855,3.36,0.49,9.5,5 +10.8,0.47,0.43,2.1,0.171,27.0,66.0,0.9982,3.17,0.76,10.8,6 +8.3,0.53,0.0,1.4,0.07,6.0,14.0,0.99593,3.25,0.64,10.0,6 +5.4,0.42,0.27,2.0,0.092,23.0,55.0,0.99471,3.78,0.64,12.3,7 +7.9,0.33,0.41,1.5,0.055999999999999994,6.0,35.0,0.9939600000000001,3.29,0.71,11.0,6 +8.9,0.24,0.39,1.6,0.07400000000000001,3.0,10.0,0.99698,3.12,0.59,9.5,6 +5.0,0.4,0.5,4.3,0.046,29.0,80.0,0.9902,3.49,0.66,13.6,6 +7.0,0.69,0.07,2.5,0.091,15.0,21.0,0.99572,3.38,0.6,11.3,6 +7.0,0.69,0.07,2.5,0.091,15.0,21.0,0.99572,3.38,0.6,11.3,6 +7.0,0.69,0.07,2.5,0.091,15.0,21.0,0.99572,3.38,0.6,11.3,6 +7.1,0.39,0.12,2.1,0.065,14.0,24.0,0.9925200000000001,3.3,0.53,13.3,6 +5.6,0.66,0.0,2.5,0.066,7.0,15.0,0.99256,3.52,0.58,12.9,5 +7.9,0.54,0.34,2.5,0.076,8.0,17.0,0.99235,3.2,0.72,13.1,8 +6.6,0.5,0.0,1.8,0.062,21.0,28.0,0.9935200000000001,3.44,0.55,12.3,6 +6.3,0.47,0.0,1.4,0.055,27.0,33.0,0.9922,3.45,0.48,12.3,6 +10.7,0.4,0.37,1.9,0.081,17.0,29.0,0.99674,3.12,0.65,11.2,6 +6.5,0.58,0.0,2.2,0.096,3.0,13.0,0.9955700000000001,3.62,0.62,11.5,4 +8.8,0.24,0.35,1.7,0.055,13.0,27.0,0.9939399999999999,3.14,0.59,11.3,7 +5.8,0.29,0.26,1.7,0.063,3.0,11.0,0.9915,3.39,0.54,13.5,6 +6.3,0.76,0.0,2.9,0.07200000000000001,26.0,52.0,0.99379,3.51,0.6,11.5,6 +10.0,0.43,0.33,2.7,0.095,28.0,89.0,0.9984,3.22,0.68,10.0,5 +10.5,0.43,0.35,3.3,0.092,24.0,70.0,0.99798,3.21,0.69,10.5,6 +9.1,0.6,0.0,1.9,0.057999999999999996,5.0,10.0,0.9977,3.18,0.63,10.4,6 +5.9,0.19,0.21,1.7,0.045,57.0,135.0,0.99341,3.32,0.44,9.5,5 +7.4,0.36,0.34,1.8,0.075,18.0,38.0,0.9933,3.38,0.88,13.6,7 +7.2,0.48,0.07,5.5,0.08900000000000001,10.0,18.0,0.99684,3.37,0.68,11.2,7 +8.5,0.28,0.35,1.7,0.061,6.0,15.0,0.99524,3.3,0.74,11.8,7 +8.0,0.25,0.43,1.7,0.067,22.0,50.0,0.9946,3.38,0.6,11.9,6 +10.4,0.52,0.45,2.0,0.08,6.0,13.0,0.99774,3.22,0.76,11.4,6 +10.4,0.52,0.45,2.0,0.08,6.0,13.0,0.99774,3.22,0.76,11.4,6 +7.5,0.41,0.15,3.7,0.10400000000000001,29.0,94.0,0.9978600000000001,3.14,0.58,9.1,5 +8.2,0.51,0.24,2.0,0.079,16.0,86.0,0.99764,3.34,0.64,9.5,6 +7.3,0.4,0.3,1.7,0.08,33.0,79.0,0.9969,3.41,0.65,9.5,6 +8.2,0.38,0.32,2.5,0.08,24.0,71.0,0.99624,3.27,0.85,11.0,6 +6.9,0.45,0.11,2.4,0.043,6.0,12.0,0.99354,3.3,0.65,11.4,6 +7.0,0.22,0.3,1.8,0.065,16.0,20.0,0.99672,3.61,0.82,10.0,6 +7.3,0.32,0.23,2.3,0.066,35.0,70.0,0.9958799999999999,3.43,0.62,10.1,5 +8.2,0.2,0.43,2.5,0.076,31.0,51.0,0.99672,3.53,0.81,10.4,6 +7.8,0.5,0.12,1.8,0.17800000000000002,6.0,21.0,0.996,3.28,0.87,9.8,6 +10.0,0.41,0.45,6.2,0.071,6.0,14.0,0.99702,3.21,0.49,11.8,7 +7.8,0.39,0.42,2.0,0.086,9.0,21.0,0.99526,3.39,0.66,11.6,6 +10.0,0.35,0.47,2.0,0.061,6.0,11.0,0.99585,3.23,0.52,12.0,6 +8.2,0.33,0.32,2.8,0.067,4.0,12.0,0.9947299999999999,3.3,0.76,12.8,7 +6.1,0.58,0.23,2.5,0.044000000000000004,16.0,70.0,0.9935200000000001,3.46,0.65,12.5,6 +8.3,0.6,0.25,2.2,0.11800000000000001,9.0,38.0,0.99616,3.15,0.53,9.8,5 +9.6,0.42,0.35,2.1,0.083,17.0,38.0,0.9962200000000001,3.23,0.66,11.1,6 +6.6,0.58,0.0,2.2,0.1,50.0,63.0,0.99544,3.59,0.68,11.4,6 +8.3,0.6,0.25,2.2,0.11800000000000001,9.0,38.0,0.99616,3.15,0.53,9.8,5 +8.5,0.18,0.51,1.75,0.071,45.0,88.0,0.99524,3.33,0.76,11.8,7 +5.1,0.51,0.18,2.1,0.042,16.0,101.0,0.9924,3.46,0.87,12.9,7 +6.7,0.41,0.43,2.8,0.076,22.0,54.0,0.99572,3.42,1.16,10.6,6 +10.2,0.41,0.43,2.2,0.11,11.0,37.0,0.9972799999999999,3.16,0.67,10.8,5 +10.6,0.36,0.57,2.3,0.087,6.0,20.0,0.9967600000000001,3.14,0.72,11.1,7 +8.8,0.45,0.43,1.4,0.076,12.0,21.0,0.99551,3.21,0.75,10.2,6 +8.5,0.32,0.42,2.3,0.075,12.0,19.0,0.99434,3.14,0.71,11.8,7 +9.0,0.785,0.24,1.7,0.078,10.0,21.0,0.99692,3.29,0.67,10.0,5 +9.0,0.785,0.24,1.7,0.078,10.0,21.0,0.99692,3.29,0.67,10.0,5 +8.5,0.44,0.5,1.9,0.369,15.0,38.0,0.99634,3.01,1.1,9.4,5 +9.9,0.54,0.26,2.0,0.111,7.0,60.0,0.9970899999999999,2.94,0.98,10.2,5 +8.2,0.33,0.39,2.5,0.07400000000000001,29.0,48.0,0.9952799999999999,3.32,0.88,12.4,7 +6.5,0.34,0.27,2.8,0.067,8.0,44.0,0.99384,3.21,0.56,12.0,6 +7.6,0.5,0.29,2.3,0.086,5.0,14.0,0.9950200000000001,3.32,0.62,11.5,6 +9.2,0.36,0.34,1.6,0.062,5.0,12.0,0.9966700000000001,3.2,0.67,10.5,6 +7.1,0.59,0.0,2.2,0.078,26.0,44.0,0.9952200000000001,3.42,0.68,10.8,6 +9.7,0.42,0.46,2.1,0.07400000000000001,5.0,16.0,0.99649,3.27,0.74,12.3,6 +7.6,0.36,0.31,1.7,0.079,26.0,65.0,0.99716,3.46,0.62,9.5,6 +7.6,0.36,0.31,1.7,0.079,26.0,65.0,0.99716,3.46,0.62,9.5,6 +6.5,0.61,0.0,2.2,0.095,48.0,59.0,0.99541,3.61,0.7,11.5,6 +6.5,0.88,0.03,5.6,0.079,23.0,47.0,0.99572,3.58,0.5,11.2,4 +7.1,0.66,0.0,2.4,0.052000000000000005,6.0,11.0,0.99318,3.35,0.66,12.7,7 +5.6,0.915,0.0,2.1,0.040999999999999995,17.0,78.0,0.99346,3.68,0.73,11.4,5 +8.2,0.35,0.33,2.4,0.076,11.0,47.0,0.9959899999999999,3.27,0.81,11.0,6 +8.2,0.35,0.33,2.4,0.076,11.0,47.0,0.9959899999999999,3.27,0.81,11.0,6 +9.8,0.39,0.43,1.65,0.068,5.0,11.0,0.9947799999999999,3.19,0.46,11.4,5 +10.2,0.4,0.4,2.5,0.068,41.0,54.0,0.99754,3.38,0.86,10.5,6 +6.8,0.66,0.07,1.6,0.07,16.0,61.0,0.99572,3.29,0.6,9.3,5 +6.7,0.64,0.23,2.1,0.08,11.0,119.0,0.9953799999999999,3.36,0.7,10.9,5 +7.0,0.43,0.3,2.0,0.085,6.0,39.0,0.99346,3.33,0.46,11.9,6 +6.6,0.8,0.03,7.8,0.079,6.0,12.0,0.9963,3.52,0.5,12.2,5 +7.0,0.43,0.3,2.0,0.085,6.0,39.0,0.99346,3.33,0.46,11.9,6 +6.7,0.64,0.23,2.1,0.08,11.0,119.0,0.9953799999999999,3.36,0.7,10.9,5 +8.8,0.955,0.05,1.8,0.075,5.0,19.0,0.99616,3.3,0.44,9.6,4 +9.1,0.4,0.57,4.6,0.08,6.0,20.0,0.9965200000000001,3.28,0.57,12.5,6 +6.5,0.885,0.0,2.3,0.166,6.0,12.0,0.99551,3.56,0.51,10.8,5 +7.2,0.25,0.37,2.5,0.063,11.0,41.0,0.99439,3.52,0.8,12.4,7 +6.4,0.885,0.0,2.3,0.166,6.0,12.0,0.99551,3.56,0.51,10.8,5 +7.0,0.745,0.12,1.8,0.114,15.0,64.0,0.9958799999999999,3.22,0.59,9.5,6 +6.2,0.43,0.22,1.8,0.078,21.0,56.0,0.9963299999999999,3.52,0.6,9.5,6 +7.9,0.58,0.23,2.3,0.076,23.0,94.0,0.9968600000000001,3.21,0.58,9.5,6 +7.7,0.57,0.21,1.5,0.069,4.0,9.0,0.9945799999999999,3.16,0.54,9.8,6 +7.7,0.26,0.26,2.0,0.052000000000000005,19.0,77.0,0.9951,3.15,0.79,10.9,6 +7.9,0.58,0.23,2.3,0.076,23.0,94.0,0.9968600000000001,3.21,0.58,9.5,6 +7.7,0.57,0.21,1.5,0.069,4.0,9.0,0.9945799999999999,3.16,0.54,9.8,6 +7.9,0.34,0.36,1.9,0.065,5.0,10.0,0.99419,3.27,0.54,11.2,7 +8.6,0.42,0.39,1.8,0.068,6.0,12.0,0.99516,3.35,0.69,11.7,8 +9.9,0.74,0.19,5.8,0.111,33.0,76.0,0.9987799999999999,3.14,0.55,9.4,5 +7.2,0.36,0.46,2.1,0.07400000000000001,24.0,44.0,0.99534,3.4,0.85,11.0,7 +7.2,0.36,0.46,2.1,0.07400000000000001,24.0,44.0,0.99534,3.4,0.85,11.0,7 +7.2,0.36,0.46,2.1,0.07400000000000001,24.0,44.0,0.99534,3.4,0.85,11.0,7 +9.9,0.72,0.55,1.7,0.136,24.0,52.0,0.9975200000000001,3.35,0.94,10.0,5 +7.2,0.36,0.46,2.1,0.07400000000000001,24.0,44.0,0.99534,3.4,0.85,11.0,7 +6.2,0.39,0.43,2.0,0.071,14.0,24.0,0.9942799999999999,3.45,0.87,11.2,7 +6.8,0.65,0.02,2.1,0.078,8.0,15.0,0.99498,3.35,0.62,10.4,6 +6.6,0.44,0.15,2.1,0.076,22.0,53.0,0.9957,3.32,0.62,9.3,5 +6.8,0.65,0.02,2.1,0.078,8.0,15.0,0.99498,3.35,0.62,10.4,6 +9.6,0.38,0.42,1.9,0.071,5.0,13.0,0.99659,3.15,0.75,10.5,6 +10.2,0.33,0.46,1.9,0.081,6.0,9.0,0.9962799999999999,3.1,0.48,10.4,6 +8.8,0.27,0.46,2.1,0.095,20.0,29.0,0.9948799999999999,3.26,0.56,11.3,6 +7.9,0.57,0.31,2.0,0.079,10.0,79.0,0.99677,3.29,0.69,9.5,6 +8.2,0.34,0.37,1.9,0.057,43.0,74.0,0.99408,3.23,0.81,12.0,6 +8.2,0.4,0.31,1.9,0.08199999999999999,8.0,24.0,0.996,3.24,0.69,10.6,6 +9.0,0.39,0.4,1.3,0.044000000000000004,25.0,50.0,0.9947799999999999,3.2,0.83,10.9,6 +10.9,0.32,0.52,1.8,0.132,17.0,44.0,0.99734,3.28,0.77,11.5,6 +10.9,0.32,0.52,1.8,0.132,17.0,44.0,0.99734,3.28,0.77,11.5,6 +8.1,0.53,0.22,2.2,0.078,33.0,89.0,0.9967799999999999,3.26,0.46,9.6,6 +10.5,0.36,0.47,2.2,0.07400000000000001,9.0,23.0,0.9963799999999999,3.23,0.76,12.0,6 +12.6,0.39,0.49,2.5,0.08,8.0,20.0,0.9992,3.07,0.82,10.3,6 +9.2,0.46,0.23,2.6,0.091,18.0,77.0,0.9992200000000001,3.15,0.51,9.4,5 +7.5,0.58,0.03,4.1,0.08,27.0,46.0,0.99592,3.02,0.47,9.2,5 +9.0,0.58,0.25,2.0,0.10400000000000001,8.0,21.0,0.99769,3.27,0.72,9.6,5 +5.1,0.42,0.0,1.8,0.044000000000000004,18.0,88.0,0.9915700000000001,3.68,0.73,13.6,7 +7.6,0.43,0.29,2.1,0.075,19.0,66.0,0.99718,3.4,0.64,9.5,5 +7.7,0.18,0.34,2.7,0.066,15.0,58.0,0.9947,3.37,0.78,11.8,6 +7.8,0.815,0.01,2.6,0.07400000000000001,48.0,90.0,0.99621,3.38,0.62,10.8,5 +7.6,0.43,0.29,2.1,0.075,19.0,66.0,0.99718,3.4,0.64,9.5,5 +10.2,0.23,0.37,2.2,0.057,14.0,36.0,0.9961399999999999,3.23,0.49,9.3,4 +7.1,0.75,0.01,2.2,0.059000000000000004,11.0,18.0,0.9924200000000001,3.39,0.4,12.8,6 +6.0,0.33,0.32,12.9,0.054000000000000006,6.0,113.0,0.99572,3.3,0.56,11.5,4 +7.8,0.55,0.0,1.7,0.07,7.0,17.0,0.99659,3.26,0.64,9.4,6 +7.1,0.75,0.01,2.2,0.059000000000000004,11.0,18.0,0.9924200000000001,3.39,0.4,12.8,6 +8.1,0.73,0.0,2.5,0.081,12.0,24.0,0.99798,3.38,0.46,9.6,4 +6.5,0.67,0.0,4.3,0.057,11.0,20.0,0.9948799999999999,3.45,0.56,11.8,4 +7.5,0.61,0.2,1.7,0.076,36.0,60.0,0.9949399999999999,3.1,0.4,9.3,5 +9.8,0.37,0.39,2.5,0.079,28.0,65.0,0.99729,3.16,0.59,9.8,5 +9.0,0.4,0.41,2.0,0.057999999999999996,15.0,40.0,0.9941399999999999,3.22,0.6,12.2,6 +8.3,0.56,0.22,2.4,0.08199999999999999,10.0,86.0,0.9983,3.37,0.62,9.5,5 +5.9,0.29,0.25,13.4,0.067,72.0,160.0,0.99721,3.33,0.54,10.3,6 +7.4,0.55,0.19,1.8,0.08199999999999999,15.0,34.0,0.99655,3.49,0.68,10.5,5 +7.4,0.74,0.07,1.7,0.086,15.0,48.0,0.9950200000000001,3.12,0.48,10.0,5 +7.4,0.55,0.19,1.8,0.08199999999999999,15.0,34.0,0.99655,3.49,0.68,10.5,5 +6.9,0.41,0.33,2.2,0.081,22.0,36.0,0.9949,3.41,0.75,11.1,6 +7.1,0.6,0.01,2.3,0.079,24.0,37.0,0.9951399999999999,3.4,0.61,10.9,6 +7.1,0.6,0.01,2.3,0.079,24.0,37.0,0.9951399999999999,3.4,0.61,10.9,6 +7.5,0.58,0.14,2.2,0.077,27.0,60.0,0.9963,3.28,0.59,9.8,5 +7.1,0.72,0.0,1.8,0.12300000000000001,6.0,14.0,0.9962700000000001,3.45,0.58,9.8,5 +7.9,0.66,0.0,1.4,0.096,6.0,13.0,0.99569,3.43,0.58,9.5,5 +7.8,0.7,0.06,1.9,0.079,20.0,35.0,0.9962799999999999,3.4,0.69,10.9,5 +6.1,0.64,0.02,2.4,0.069,26.0,46.0,0.9935799999999999,3.47,0.45,11.0,5 +7.5,0.59,0.22,1.8,0.08199999999999999,43.0,60.0,0.9949899999999999,3.1,0.42,9.2,5 +7.0,0.58,0.28,4.8,0.085,12.0,69.0,0.9963299999999999,3.32,0.7,11.0,6 +6.8,0.64,0.0,2.7,0.12300000000000001,15.0,33.0,0.9953799999999999,3.44,0.63,11.3,6 +6.8,0.64,0.0,2.7,0.12300000000000001,15.0,33.0,0.9953799999999999,3.44,0.63,11.3,6 +8.6,0.635,0.68,1.8,0.40299999999999997,19.0,56.0,0.9963200000000001,3.02,1.15,9.3,5 +6.3,1.02,0.0,2.0,0.083,17.0,24.0,0.9943700000000001,3.59,0.55,11.2,4 +9.8,0.45,0.38,2.5,0.081,34.0,66.0,0.99726,3.15,0.58,9.8,5 +8.2,0.78,0.0,2.2,0.08900000000000001,13.0,26.0,0.9978,3.37,0.46,9.6,4 +8.5,0.37,0.32,1.8,0.066,26.0,51.0,0.99456,3.38,0.72,11.8,6 +7.2,0.57,0.05,2.3,0.081,16.0,36.0,0.99564,3.38,0.6,10.3,6 +7.2,0.57,0.05,2.3,0.081,16.0,36.0,0.99564,3.38,0.6,10.3,6 +10.4,0.43,0.5,2.3,0.068,13.0,19.0,0.996,3.1,0.87,11.4,6 +6.9,0.41,0.31,2.0,0.079,21.0,51.0,0.9966799999999999,3.47,0.55,9.5,6 +5.5,0.49,0.03,1.8,0.044000000000000004,28.0,87.0,0.9908,3.5,0.82,14.0,8 +5.0,0.38,0.01,1.6,0.048,26.0,60.0,0.9908399999999999,3.7,0.75,14.0,6 +7.3,0.44,0.2,1.6,0.049,24.0,64.0,0.9935,3.38,0.57,11.7,6 +5.9,0.46,0.0,1.9,0.077,25.0,44.0,0.99385,3.5,0.53,11.2,5 +7.5,0.58,0.2,2.0,0.073,34.0,44.0,0.9949399999999999,3.1,0.43,9.3,5 +7.8,0.58,0.13,2.1,0.102,17.0,36.0,0.9944,3.24,0.53,11.2,6 +8.0,0.715,0.22,2.3,0.075,13.0,81.0,0.9968799999999999,3.24,0.54,9.5,6 +8.5,0.4,0.4,6.3,0.05,3.0,10.0,0.99566,3.28,0.56,12.0,4 +7.0,0.69,0.0,1.9,0.114,3.0,10.0,0.99636,3.35,0.6,9.7,6 +8.0,0.715,0.22,2.3,0.075,13.0,81.0,0.9968799999999999,3.24,0.54,9.5,6 +9.8,0.3,0.39,1.7,0.062,3.0,9.0,0.9948,3.14,0.57,11.5,7 +7.1,0.46,0.2,1.9,0.077,28.0,54.0,0.9956,3.37,0.64,10.4,6 +7.1,0.46,0.2,1.9,0.077,28.0,54.0,0.9956,3.37,0.64,10.4,6 +7.9,0.765,0.0,2.0,0.084,9.0,22.0,0.9961899999999999,3.33,0.68,10.9,6 +8.7,0.63,0.28,2.7,0.096,17.0,69.0,0.99734,3.26,0.63,10.2,6 +7.0,0.42,0.19,2.3,0.071,18.0,36.0,0.9947600000000001,3.39,0.56,10.9,5 +11.3,0.37,0.5,1.8,0.09,20.0,47.0,0.99734,3.15,0.57,10.5,5 +7.1,0.16,0.44,2.5,0.068,17.0,31.0,0.9932799999999999,3.35,0.54,12.4,6 +8.0,0.6,0.08,2.6,0.055999999999999994,3.0,7.0,0.9928600000000001,3.22,0.37,13.0,5 +7.0,0.6,0.3,4.5,0.068,20.0,110.0,0.9991399999999999,3.3,1.17,10.2,5 +7.0,0.6,0.3,4.5,0.068,20.0,110.0,0.9991399999999999,3.3,1.17,10.2,5 +7.6,0.74,0.0,1.9,0.1,6.0,12.0,0.99521,3.36,0.59,11.0,5 +8.2,0.635,0.1,2.1,0.073,25.0,60.0,0.9963799999999999,3.29,0.75,10.9,6 +5.9,0.395,0.13,2.4,0.055999999999999994,14.0,28.0,0.9936200000000001,3.62,0.67,12.4,6 +7.5,0.755,0.0,1.9,0.084,6.0,12.0,0.99672,3.34,0.49,9.7,4 +8.2,0.635,0.1,2.1,0.073,25.0,60.0,0.9963799999999999,3.29,0.75,10.9,6 +6.6,0.63,0.0,4.3,0.09300000000000001,51.0,77.5,0.9955799999999999,3.2,0.45,9.5,5 +6.6,0.63,0.0,4.3,0.09300000000000001,51.0,77.5,0.9955799999999999,3.2,0.45,9.5,5 +7.2,0.53,0.14,2.1,0.064,15.0,29.0,0.99323,3.35,0.61,12.1,6 +5.7,0.6,0.0,1.4,0.063,11.0,18.0,0.9919100000000001,3.45,0.56,12.2,6 +7.6,1.58,0.0,2.1,0.13699999999999998,5.0,9.0,0.9947600000000001,3.5,0.4,10.9,3 +5.2,0.645,0.0,2.15,0.08,15.0,28.0,0.99444,3.78,0.61,12.5,6 +6.7,0.86,0.07,2.0,0.1,20.0,57.0,0.99598,3.6,0.74,11.7,6 +9.1,0.37,0.32,2.1,0.064,4.0,15.0,0.9957600000000001,3.3,0.8,11.2,6 +8.0,0.28,0.44,1.8,0.081,28.0,68.0,0.9950100000000001,3.36,0.66,11.2,5 +7.6,0.79,0.21,2.3,0.087,21.0,68.0,0.9955,3.12,0.44,9.2,5 +7.5,0.61,0.26,1.9,0.073,24.0,88.0,0.9961200000000001,3.3,0.53,9.8,5 +9.7,0.69,0.32,2.5,0.08800000000000001,22.0,91.0,0.9979,3.29,0.62,10.1,5 +6.8,0.68,0.09,3.9,0.068,15.0,29.0,0.99524,3.41,0.52,11.1,4 +9.7,0.69,0.32,2.5,0.08800000000000001,22.0,91.0,0.9979,3.29,0.62,10.1,5 +7.0,0.62,0.1,1.4,0.071,27.0,63.0,0.996,3.28,0.61,9.2,5 +7.5,0.61,0.26,1.9,0.073,24.0,88.0,0.9961200000000001,3.3,0.53,9.8,5 +6.5,0.51,0.15,3.0,0.064,12.0,27.0,0.9929,3.33,0.59,12.8,6 +8.0,1.18,0.21,1.9,0.083,14.0,41.0,0.9953200000000001,3.34,0.47,10.5,5 +7.0,0.36,0.21,2.3,0.086,20.0,65.0,0.9955799999999999,3.4,0.54,10.1,6 +7.0,0.36,0.21,2.4,0.086,24.0,69.0,0.99556,3.4,0.53,10.1,6 +7.5,0.63,0.27,2.0,0.083,17.0,91.0,0.99616,3.26,0.58,9.8,6 +5.4,0.74,0.0,1.2,0.040999999999999995,16.0,46.0,0.9925799999999999,4.01,0.59,12.5,6 +9.9,0.44,0.46,2.2,0.091,10.0,41.0,0.9963799999999999,3.18,0.69,11.9,6 +7.5,0.63,0.27,2.0,0.083,17.0,91.0,0.99616,3.26,0.58,9.8,6 +9.1,0.76,0.68,1.7,0.414,18.0,64.0,0.9965200000000001,2.9,1.33,9.1,6 +9.7,0.66,0.34,2.6,0.094,12.0,88.0,0.9979600000000001,3.26,0.66,10.1,5 +5.0,0.74,0.0,1.2,0.040999999999999995,16.0,46.0,0.9925799999999999,4.01,0.59,12.5,6 +9.1,0.34,0.42,1.8,0.057999999999999996,9.0,18.0,0.99392,3.18,0.55,11.4,5 +9.1,0.36,0.39,1.8,0.06,21.0,55.0,0.99495,3.18,0.82,11.0,7 +6.7,0.46,0.24,1.7,0.077,18.0,34.0,0.9948,3.39,0.6,10.6,6 +6.7,0.46,0.24,1.7,0.077,18.0,34.0,0.9948,3.39,0.6,10.6,6 +6.7,0.46,0.24,1.7,0.077,18.0,34.0,0.9948,3.39,0.6,10.6,6 +6.7,0.46,0.24,1.7,0.077,18.0,34.0,0.9948,3.39,0.6,10.6,6 +6.5,0.52,0.11,1.8,0.073,13.0,38.0,0.9955,3.34,0.52,9.3,5 +7.4,0.6,0.26,2.1,0.083,17.0,91.0,0.99616,3.29,0.56,9.8,6 +7.4,0.6,0.26,2.1,0.083,17.0,91.0,0.99616,3.29,0.56,9.8,6 +7.8,0.87,0.26,3.8,0.107,31.0,67.0,0.9966799999999999,3.26,0.46,9.2,5 +8.4,0.39,0.1,1.7,0.075,6.0,25.0,0.9958100000000001,3.09,0.43,9.7,6 +9.1,0.775,0.22,2.2,0.079,12.0,48.0,0.9976,3.18,0.51,9.6,5 +7.2,0.835,0.0,2.0,0.166,4.0,11.0,0.99608,3.39,0.52,10.0,5 +6.6,0.58,0.02,2.4,0.069,19.0,40.0,0.99387,3.38,0.66,12.6,6 +6.0,0.5,0.0,1.4,0.057,15.0,26.0,0.9944799999999999,3.36,0.45,9.5,5 +6.0,0.5,0.0,1.4,0.057,15.0,26.0,0.9944799999999999,3.36,0.45,9.5,5 +6.0,0.5,0.0,1.4,0.057,15.0,26.0,0.9944799999999999,3.36,0.45,9.5,5 +7.5,0.51,0.02,1.7,0.084,13.0,31.0,0.9953799999999999,3.36,0.54,10.5,6 +7.5,0.51,0.02,1.7,0.084,13.0,31.0,0.9953799999999999,3.36,0.54,10.5,6 +7.5,0.51,0.02,1.7,0.084,13.0,31.0,0.9953799999999999,3.36,0.54,10.5,6 +7.6,0.54,0.02,1.7,0.085,17.0,31.0,0.9958899999999999,3.37,0.51,10.4,6 +7.5,0.51,0.02,1.7,0.084,13.0,31.0,0.9953799999999999,3.36,0.54,10.5,6 +11.5,0.42,0.48,2.6,0.077,8.0,20.0,0.9985200000000001,3.09,0.53,11.0,5 +8.2,0.44,0.24,2.3,0.063,10.0,28.0,0.99613,3.25,0.53,10.2,6 +6.1,0.59,0.01,2.1,0.055999999999999994,5.0,13.0,0.99472,3.52,0.56,11.4,5 +7.2,0.655,0.03,1.8,0.078,7.0,12.0,0.99587,3.34,0.39,9.5,5 +7.2,0.655,0.03,1.8,0.078,7.0,12.0,0.99587,3.34,0.39,9.5,5 +6.9,0.57,0.0,2.8,0.081,21.0,41.0,0.99518,3.41,0.52,10.8,5 +9.0,0.6,0.29,2.0,0.069,32.0,73.0,0.99654,3.34,0.57,10.0,5 +7.2,0.62,0.01,2.3,0.065,8.0,46.0,0.9933200000000001,3.32,0.51,11.8,6 +7.6,0.645,0.03,1.9,0.086,14.0,57.0,0.9969,3.37,0.46,10.3,5 +7.6,0.645,0.03,1.9,0.086,14.0,57.0,0.9969,3.37,0.46,10.3,5 +7.2,0.58,0.03,2.3,0.077,7.0,28.0,0.9956799999999999,3.35,0.52,10.0,5 +6.1,0.32,0.25,1.8,0.086,5.0,32.0,0.99464,3.36,0.44,10.1,5 +6.1,0.34,0.25,1.8,0.084,4.0,28.0,0.99464,3.36,0.44,10.1,5 +7.3,0.43,0.24,2.5,0.078,27.0,67.0,0.9964799999999999,3.6,0.59,11.1,6 +7.4,0.64,0.17,5.4,0.168,52.0,98.0,0.99736,3.28,0.5,9.5,5 +11.6,0.475,0.4,1.4,0.091,6.0,28.0,0.9970399999999999,3.07,0.65,10.0333333333333,6 +9.2,0.54,0.31,2.3,0.11199999999999999,11.0,38.0,0.9969899999999999,3.24,0.56,10.9,5 +8.3,0.85,0.14,2.5,0.09300000000000001,13.0,54.0,0.99724,3.36,0.54,10.1,5 +11.6,0.475,0.4,1.4,0.091,6.0,28.0,0.9970399999999999,3.07,0.65,10.0333333333333,6 +8.0,0.83,0.27,2.0,0.08,11.0,63.0,0.9965200000000001,3.29,0.48,9.8,4 +7.2,0.605,0.02,1.9,0.096,10.0,31.0,0.995,3.46,0.53,11.8,6 +7.8,0.5,0.09,2.2,0.115,10.0,42.0,0.9971,3.18,0.62,9.5,5 +7.3,0.74,0.08,1.7,0.094,10.0,45.0,0.9957600000000001,3.24,0.5,9.8,5 +6.9,0.54,0.3,2.2,0.08800000000000001,9.0,105.0,0.99725,3.25,1.18,10.5,6 +8.0,0.77,0.32,2.1,0.079,16.0,74.0,0.99656,3.27,0.5,9.8,6 +6.6,0.61,0.0,1.6,0.069,4.0,8.0,0.9939600000000001,3.33,0.37,10.4,4 +8.7,0.78,0.51,1.7,0.415,12.0,66.0,0.99623,3.0,1.17,9.2,5 +7.5,0.58,0.56,3.1,0.153,5.0,14.0,0.9947600000000001,3.21,1.03,11.6,6 +8.7,0.78,0.51,1.7,0.415,12.0,66.0,0.99623,3.0,1.17,9.2,5 +7.7,0.75,0.27,3.8,0.11,34.0,89.0,0.99664,3.24,0.45,9.3,5 +6.8,0.815,0.0,1.2,0.267,16.0,29.0,0.99471,3.32,0.51,9.8,3 +7.2,0.56,0.26,2.0,0.083,13.0,100.0,0.9958600000000001,3.26,0.52,9.9,5 +8.2,0.885,0.2,1.4,0.086,7.0,31.0,0.9946,3.11,0.46,10.0,5 +5.2,0.49,0.26,2.3,0.09,23.0,74.0,0.9953,3.71,0.62,12.2,6 +7.2,0.45,0.15,2.0,0.078,10.0,28.0,0.9960899999999999,3.29,0.51,9.9,6 +7.5,0.57,0.02,2.6,0.077,11.0,35.0,0.9955700000000001,3.36,0.62,10.8,6 +7.5,0.57,0.02,2.6,0.077,11.0,35.0,0.9955700000000001,3.36,0.62,10.8,6 +6.8,0.83,0.09,1.8,0.07400000000000001,4.0,25.0,0.99534,3.38,0.45,9.6,5 +8.0,0.6,0.22,2.1,0.08,25.0,105.0,0.99613,3.3,0.49,9.9,5 +8.0,0.6,0.22,2.1,0.08,25.0,105.0,0.99613,3.3,0.49,9.9,5 +7.1,0.755,0.15,1.8,0.107,20.0,84.0,0.99593,3.19,0.5,9.5,5 +8.0,0.81,0.25,3.4,0.076,34.0,85.0,0.9966799999999999,3.19,0.42,9.2,5 +7.4,0.64,0.07,1.8,0.1,8.0,23.0,0.9961,3.3,0.58,9.6,5 +7.4,0.64,0.07,1.8,0.1,8.0,23.0,0.9961,3.3,0.58,9.6,5 +6.6,0.64,0.31,6.1,0.083,7.0,49.0,0.99718,3.35,0.68,10.3,5 +6.7,0.48,0.02,2.2,0.08,36.0,111.0,0.99524,3.1,0.53,9.7,5 +6.0,0.49,0.0,2.3,0.068,15.0,33.0,0.99292,3.58,0.59,12.5,6 +8.0,0.64,0.22,2.4,0.094,5.0,33.0,0.9961200000000001,3.37,0.58,11.0,5 +7.1,0.62,0.06,1.3,0.07,5.0,12.0,0.9942,3.17,0.48,9.8,5 +8.0,0.52,0.25,2.0,0.078,19.0,59.0,0.9961200000000001,3.3,0.48,10.2,5 +6.4,0.57,0.14,3.9,0.07,27.0,73.0,0.99669,3.32,0.48,9.2,5 +8.6,0.685,0.1,1.6,0.092,3.0,12.0,0.99745,3.31,0.65,9.55,6 +8.7,0.675,0.1,1.6,0.09,4.0,11.0,0.99745,3.31,0.65,9.55,5 +7.3,0.59,0.26,2.0,0.08,17.0,104.0,0.99584,3.28,0.52,9.9,5 +7.0,0.6,0.12,2.2,0.083,13.0,28.0,0.9966,3.52,0.62,10.2,7 +7.2,0.67,0.0,2.2,0.068,10.0,24.0,0.9956,3.42,0.72,11.1,6 +7.9,0.69,0.21,2.1,0.08,33.0,141.0,0.9962,3.25,0.51,9.9,5 +7.9,0.69,0.21,2.1,0.08,33.0,141.0,0.9962,3.25,0.51,9.9,5 +7.6,0.3,0.42,2.0,0.052000000000000005,6.0,24.0,0.9963,3.44,0.82,11.9,6 +7.2,0.33,0.33,1.7,0.061,3.0,13.0,0.996,3.23,1.1,10.0,8 +8.0,0.5,0.39,2.6,0.08199999999999999,12.0,46.0,0.9985,3.43,0.62,10.7,6 +7.7,0.28,0.3,2.0,0.062,18.0,34.0,0.9952,3.28,0.9,11.3,7 +8.2,0.24,0.34,5.1,0.062,8.0,22.0,0.9974,3.22,0.94,10.9,6 +6.0,0.51,0.0,2.1,0.064,40.0,54.0,0.995,3.54,0.93,10.7,6 +8.1,0.29,0.36,2.2,0.048,35.0,53.0,0.995,3.27,1.01,12.4,7 +6.0,0.51,0.0,2.1,0.064,40.0,54.0,0.995,3.54,0.93,10.7,6 +6.6,0.96,0.0,1.8,0.08199999999999999,5.0,16.0,0.9936,3.5,0.44,11.9,6 +6.4,0.47,0.4,2.4,0.071,8.0,19.0,0.9963,3.56,0.73,10.6,6 +8.2,0.24,0.34,5.1,0.062,8.0,22.0,0.9974,3.22,0.94,10.9,6 +9.9,0.57,0.25,2.0,0.10400000000000001,12.0,89.0,0.9963,3.04,0.9,10.1,5 +10.0,0.32,0.59,2.2,0.077,3.0,15.0,0.9994,3.2,0.78,9.6,5 +6.2,0.58,0.0,1.6,0.065,8.0,18.0,0.9966,3.56,0.84,9.4,5 +10.0,0.32,0.59,2.2,0.077,3.0,15.0,0.9994,3.2,0.78,9.6,5 +7.3,0.34,0.33,2.5,0.064,21.0,37.0,0.9952,3.35,0.77,12.1,7 +7.8,0.53,0.01,1.6,0.077,3.0,19.0,0.995,3.16,0.46,9.8,5 +7.7,0.64,0.21,2.2,0.077,32.0,133.0,0.9956,3.27,0.45,9.9,5 +7.8,0.53,0.01,1.6,0.077,3.0,19.0,0.995,3.16,0.46,9.8,5 +7.5,0.4,0.18,1.6,0.079,24.0,58.0,0.9965,3.34,0.58,9.4,5 +7.0,0.54,0.0,2.1,0.079,39.0,55.0,0.9956,3.39,0.84,11.4,6 +6.4,0.53,0.09,3.9,0.12300000000000001,14.0,31.0,0.9968,3.5,0.67,11.0,4 +8.3,0.26,0.37,1.4,0.076,8.0,23.0,0.9974,3.26,0.7,9.6,6 +8.3,0.26,0.37,1.4,0.076,8.0,23.0,0.9974,3.26,0.7,9.6,6 +7.7,0.23,0.37,1.8,0.046,23.0,60.0,0.9971,3.41,0.71,12.1,6 +7.6,0.41,0.33,2.5,0.078,6.0,23.0,0.9957,3.3,0.58,11.2,5 +7.8,0.64,0.0,1.9,0.07200000000000001,27.0,55.0,0.9962,3.31,0.63,11.0,5 +7.9,0.18,0.4,2.2,0.049,38.0,67.0,0.996,3.33,0.93,11.3,5 +7.4,0.41,0.24,1.8,0.066,18.0,47.0,0.9956,3.37,0.62,10.4,5 +7.6,0.43,0.31,2.1,0.069,13.0,74.0,0.9958,3.26,0.54,9.9,6 +5.9,0.44,0.0,1.6,0.042,3.0,11.0,0.9944,3.48,0.85,11.7,6 +6.1,0.4,0.16,1.8,0.069,11.0,25.0,0.9955,3.42,0.74,10.1,7 +10.2,0.54,0.37,15.4,0.214,55.0,95.0,1.00369,3.18,0.77,9.0,6 +10.2,0.54,0.37,15.4,0.214,55.0,95.0,1.00369,3.18,0.77,9.0,6 +10.0,0.38,0.38,1.6,0.16899999999999998,27.0,90.0,0.9991399999999999,3.15,0.65,8.5,5 +6.8,0.915,0.29,4.8,0.07,15.0,39.0,0.99577,3.53,0.54,11.1,5 +7.0,0.59,0.0,1.7,0.052000000000000005,3.0,8.0,0.996,3.41,0.47,10.3,5 +7.3,0.67,0.02,2.2,0.07200000000000001,31.0,92.0,0.99566,3.32,0.68,11.066666666666698,6 +7.2,0.37,0.32,2.0,0.062,15.0,28.0,0.9947,3.23,0.73,11.3,7 +7.4,0.785,0.19,5.2,0.094,19.0,98.0,0.99713,3.16,0.52,9.56666666666667,6 +6.9,0.63,0.02,1.9,0.078,18.0,30.0,0.9971200000000001,3.4,0.75,9.8,5 +6.9,0.58,0.2,1.75,0.057999999999999996,8.0,22.0,0.9932200000000001,3.38,0.49,11.7,5 +7.3,0.67,0.02,2.2,0.07200000000000001,31.0,92.0,0.99566,3.32,0.68,11.1,6 +7.4,0.785,0.19,5.2,0.094,19.0,98.0,0.99713,3.16,0.52,9.6,6 +6.9,0.63,0.02,1.9,0.078,18.0,30.0,0.9971200000000001,3.4,0.75,9.8,5 +6.8,0.67,0.0,1.9,0.08,22.0,39.0,0.9970100000000001,3.4,0.74,9.7,5 +6.9,0.58,0.01,1.9,0.08,40.0,54.0,0.9968299999999999,3.4,0.73,9.7,5 +7.2,0.38,0.31,2.0,0.055999999999999994,15.0,29.0,0.99472,3.23,0.76,11.3,8 +7.2,0.37,0.32,2.0,0.062,15.0,28.0,0.9947,3.23,0.73,11.3,7 +7.8,0.32,0.44,2.7,0.10400000000000001,8.0,17.0,0.9973200000000001,3.33,0.78,11.0,7 +6.6,0.58,0.02,2.0,0.062,37.0,53.0,0.99374,3.35,0.76,11.6,7 +7.6,0.49,0.33,1.9,0.07400000000000001,27.0,85.0,0.9970600000000001,3.41,0.58,9.0,5 +11.7,0.45,0.63,2.2,0.073,7.0,23.0,0.99974,3.21,0.69,10.9,6 +6.5,0.9,0.0,1.6,0.052000000000000005,9.0,17.0,0.99467,3.5,0.63,10.9,6 +6.0,0.54,0.06,1.8,0.05,38.0,89.0,0.99236,3.3,0.5,10.55,6 +7.6,0.49,0.33,1.9,0.07400000000000001,27.0,85.0,0.9970600000000001,3.41,0.58,9.0,5 +8.4,0.29,0.4,1.7,0.067,8.0,20.0,0.99603,3.39,0.6,10.5,5 +7.9,0.2,0.35,1.7,0.054000000000000006,7.0,15.0,0.9945799999999999,3.32,0.8,11.9,7 +6.4,0.42,0.09,2.3,0.054000000000000006,34.0,64.0,0.99724,3.41,0.68,10.4,6 +6.2,0.785,0.0,2.1,0.06,6.0,13.0,0.99664,3.59,0.61,10.0,4 +6.8,0.64,0.03,2.3,0.075,14.0,31.0,0.99545,3.36,0.58,10.4,6 +6.9,0.63,0.01,2.4,0.076,14.0,39.0,0.9952200000000001,3.34,0.53,10.8,6 +6.8,0.59,0.1,1.7,0.063,34.0,53.0,0.9958,3.41,0.67,9.7,5 +6.8,0.59,0.1,1.7,0.063,34.0,53.0,0.9958,3.41,0.67,9.7,5 +7.3,0.48,0.32,2.1,0.062,31.0,54.0,0.9972799999999999,3.3,0.65,10.0,7 +6.7,1.04,0.08,2.3,0.067,19.0,32.0,0.9964799999999999,3.52,0.57,11.0,4 +7.3,0.48,0.32,2.1,0.062,31.0,54.0,0.9972799999999999,3.3,0.65,10.0,7 +7.3,0.98,0.05,2.1,0.061,20.0,49.0,0.99705,3.31,0.55,9.7,3 +10.0,0.69,0.11,1.4,0.084,8.0,24.0,0.9957799999999999,2.88,0.47,9.7,5 +6.7,0.7,0.08,3.75,0.067,8.0,16.0,0.99334,3.43,0.52,12.6,5 +7.6,0.35,0.6,2.6,0.073,23.0,44.0,0.99656,3.38,0.79,11.1,6 +6.1,0.6,0.08,1.8,0.071,14.0,45.0,0.99336,3.38,0.54,11.0,5 +9.9,0.5,0.5,13.8,0.205,48.0,82.0,1.00242,3.16,0.75,8.8,5 +5.3,0.47,0.11,2.2,0.048,16.0,89.0,0.99182,3.54,0.88,13.566666666666698,7 +9.9,0.5,0.5,13.8,0.205,48.0,82.0,1.00242,3.16,0.75,8.8,5 +5.3,0.47,0.11,2.2,0.048,16.0,89.0,0.99182,3.54,0.88,13.6,7 +7.1,0.875,0.05,5.7,0.08199999999999999,3.0,14.0,0.99808,3.4,0.52,10.2,3 +8.2,0.28,0.6,3.0,0.10400000000000001,10.0,22.0,0.99828,3.39,0.68,10.6,5 +5.6,0.62,0.03,1.5,0.08,6.0,13.0,0.99498,3.66,0.62,10.1,4 +8.2,0.28,0.6,3.0,0.10400000000000001,10.0,22.0,0.99828,3.39,0.68,10.6,5 +7.2,0.58,0.54,2.1,0.114,3.0,9.0,0.9971899999999999,3.33,0.57,10.3,4 +8.1,0.33,0.44,1.5,0.042,6.0,12.0,0.9954200000000001,3.35,0.61,10.7,5 +6.8,0.91,0.06,2.0,0.06,4.0,11.0,0.99592,3.53,0.64,10.9,4 +7.0,0.655,0.16,2.1,0.07400000000000001,8.0,25.0,0.9960600000000001,3.37,0.55,9.7,5 +6.8,0.68,0.21,2.1,0.07,9.0,23.0,0.99546,3.38,0.6,10.3,5 +6.0,0.64,0.05,1.9,0.066,9.0,17.0,0.9949600000000001,3.52,0.78,10.6,5 +5.6,0.54,0.04,1.7,0.049,5.0,13.0,0.9942,3.72,0.58,11.4,5 +6.2,0.57,0.1,2.1,0.048,4.0,11.0,0.9944799999999999,3.44,0.76,10.8,6 +7.1,0.22,0.49,1.8,0.039,8.0,18.0,0.99344,3.39,0.56,12.4,6 +5.6,0.54,0.04,1.7,0.049,5.0,13.0,0.9942,3.72,0.58,11.4,5 +6.2,0.65,0.06,1.6,0.05,6.0,18.0,0.9934799999999999,3.57,0.54,11.95,5 +7.7,0.54,0.26,1.9,0.08900000000000001,23.0,147.0,0.99636,3.26,0.59,9.7,5 +6.4,0.31,0.09,1.4,0.066,15.0,28.0,0.99459,3.42,0.7,10.0,7 +7.0,0.43,0.02,1.9,0.08,15.0,28.0,0.99492,3.35,0.81,10.6,6 +7.7,0.54,0.26,1.9,0.08900000000000001,23.0,147.0,0.99636,3.26,0.59,9.7,5 +6.9,0.74,0.03,2.3,0.054000000000000006,7.0,16.0,0.99508,3.45,0.63,11.5,6 +6.6,0.895,0.04,2.3,0.068,7.0,13.0,0.99582,3.53,0.58,10.8,6 +6.9,0.74,0.03,2.3,0.054000000000000006,7.0,16.0,0.99508,3.45,0.63,11.5,6 +7.5,0.725,0.04,1.5,0.076,8.0,15.0,0.99508,3.26,0.53,9.6,5 +7.8,0.82,0.29,4.3,0.083,21.0,64.0,0.9964200000000001,3.16,0.53,9.4,5 +7.3,0.585,0.18,2.4,0.078,15.0,60.0,0.9963799999999999,3.31,0.54,9.8,5 +6.2,0.44,0.39,2.5,0.077,6.0,14.0,0.99555,3.51,0.69,11.0,6 +7.5,0.38,0.57,2.3,0.106,5.0,12.0,0.99605,3.36,0.55,11.4,6 +6.7,0.76,0.02,1.8,0.078,6.0,12.0,0.996,3.55,0.63,9.95,3 +6.8,0.81,0.05,2.0,0.07,6.0,14.0,0.9956200000000001,3.51,0.66,10.8,6 +7.5,0.38,0.57,2.3,0.106,5.0,12.0,0.99605,3.36,0.55,11.4,6 +7.1,0.27,0.6,2.1,0.07400000000000001,17.0,25.0,0.9981399999999999,3.38,0.72,10.6,6 +7.9,0.18,0.4,1.8,0.062,7.0,20.0,0.9941,3.28,0.7,11.1,5 +6.4,0.36,0.21,2.2,0.047,26.0,48.0,0.99661,3.47,0.77,9.7,6 +7.1,0.69,0.04,2.1,0.068,19.0,27.0,0.9971200000000001,3.44,0.67,9.8,5 +6.4,0.79,0.04,2.2,0.061,11.0,17.0,0.9958799999999999,3.53,0.65,10.4,6 +6.4,0.56,0.15,1.8,0.078,17.0,65.0,0.9929399999999999,3.33,0.6,10.5,6 +6.9,0.84,0.21,4.1,0.07400000000000001,16.0,65.0,0.9984200000000001,3.53,0.72,9.23333333333333,6 +6.9,0.84,0.21,4.1,0.07400000000000001,16.0,65.0,0.9984200000000001,3.53,0.72,9.25,6 +6.1,0.32,0.25,2.3,0.071,23.0,58.0,0.9963299999999999,3.42,0.97,10.6,5 +6.5,0.53,0.06,2.0,0.063,29.0,44.0,0.9948899999999999,3.38,0.83,10.3,6 +7.4,0.47,0.46,2.2,0.114,7.0,20.0,0.9964700000000001,3.32,0.63,10.5,5 +6.6,0.7,0.08,2.6,0.106,14.0,27.0,0.99665,3.44,0.58,10.2,5 +6.5,0.53,0.06,2.0,0.063,29.0,44.0,0.9948899999999999,3.38,0.83,10.3,6 +6.9,0.48,0.2,1.9,0.08199999999999999,9.0,23.0,0.99585,3.39,0.43,9.05,4 +6.1,0.32,0.25,2.3,0.071,23.0,58.0,0.9963299999999999,3.42,0.97,10.6,5 +6.8,0.48,0.25,2.0,0.076,29.0,61.0,0.9953,3.34,0.6,10.4,5 +6.0,0.42,0.19,2.0,0.075,22.0,47.0,0.9952200000000001,3.39,0.78,10.0,6 +6.7,0.48,0.08,2.1,0.064,18.0,34.0,0.9955200000000001,3.33,0.64,9.7,5 +6.8,0.47,0.08,2.2,0.064,18.0,38.0,0.9955299999999999,3.3,0.65,9.6,6 +7.1,0.53,0.07,1.7,0.071,15.0,24.0,0.9951,3.29,0.66,10.8,6 +7.9,0.29,0.49,2.2,0.096,21.0,59.0,0.9971399999999999,3.31,0.67,10.1,6 +7.1,0.69,0.08,2.1,0.063,42.0,52.0,0.99608,3.42,0.6,10.2,6 +6.6,0.44,0.09,2.2,0.063,9.0,18.0,0.99444,3.42,0.69,11.3,6 +6.1,0.705,0.1,2.8,0.081,13.0,28.0,0.99631,3.6,0.66,10.2,5 +7.2,0.53,0.13,2.0,0.057999999999999996,18.0,22.0,0.9957299999999999,3.21,0.68,9.9,6 +8.0,0.39,0.3,1.9,0.07400000000000001,32.0,84.0,0.9971700000000001,3.39,0.61,9.0,5 +6.6,0.56,0.14,2.4,0.064,13.0,29.0,0.99397,3.42,0.62,11.7,7 +7.0,0.55,0.13,2.2,0.075,15.0,35.0,0.9959,3.36,0.59,9.7,6 +6.1,0.53,0.08,1.9,0.077,24.0,45.0,0.9952799999999999,3.6,0.68,10.3,6 +5.4,0.58,0.08,1.9,0.059000000000000004,20.0,31.0,0.99484,3.5,0.64,10.2,6 +6.2,0.64,0.09,2.5,0.081,15.0,26.0,0.9953799999999999,3.57,0.63,12.0,5 +7.2,0.39,0.32,1.8,0.065,34.0,60.0,0.9971399999999999,3.46,0.78,9.9,5 +6.2,0.52,0.08,4.4,0.071,11.0,32.0,0.99646,3.56,0.63,11.6,6 +7.4,0.25,0.29,2.2,0.054000000000000006,19.0,49.0,0.99666,3.4,0.76,10.9,7 +6.7,0.855,0.02,1.9,0.064,29.0,38.0,0.99472,3.3,0.56,10.75,6 +11.1,0.44,0.42,2.2,0.064,14.0,19.0,0.9975799999999999,3.25,0.57,10.4,6 +8.4,0.37,0.43,2.3,0.063,12.0,19.0,0.9955,3.17,0.81,11.2,7 +6.5,0.63,0.33,1.8,0.059000000000000004,16.0,28.0,0.99531,3.36,0.64,10.1,6 +7.0,0.57,0.02,2.0,0.07200000000000001,17.0,26.0,0.99575,3.36,0.61,10.2,5 +6.3,0.6,0.1,1.6,0.048,12.0,26.0,0.99306,3.55,0.51,12.1,5 +11.2,0.4,0.5,2.0,0.099,19.0,50.0,0.9978299999999999,3.1,0.58,10.4,5 +7.4,0.36,0.3,1.8,0.07400000000000001,17.0,24.0,0.99419,3.24,0.7,11.4,8 +7.1,0.68,0.0,2.3,0.087,17.0,26.0,0.9978299999999999,3.45,0.53,9.5,5 +7.1,0.67,0.0,2.3,0.083,18.0,27.0,0.9976799999999999,3.44,0.54,9.4,5 +6.3,0.68,0.01,3.7,0.10300000000000001,32.0,54.0,0.9958600000000001,3.51,0.66,11.3,6 +7.3,0.735,0.0,2.2,0.08,18.0,28.0,0.99765,3.41,0.6,9.4,5 +6.6,0.855,0.02,2.4,0.062,15.0,23.0,0.9962700000000001,3.54,0.6,11.0,6 +7.0,0.56,0.17,1.7,0.065,15.0,24.0,0.9951399999999999,3.44,0.68,10.55,7 +6.6,0.88,0.04,2.2,0.066,12.0,20.0,0.99636,3.53,0.56,9.9,5 +6.6,0.855,0.02,2.4,0.062,15.0,23.0,0.9962700000000001,3.54,0.6,11.0,6 +6.9,0.63,0.33,6.7,0.235,66.0,115.0,0.99787,3.22,0.56,9.5,5 +7.8,0.6,0.26,2.0,0.08,31.0,131.0,0.9962200000000001,3.21,0.52,9.9,5 +7.8,0.6,0.26,2.0,0.08,31.0,131.0,0.9962200000000001,3.21,0.52,9.9,5 +7.8,0.6,0.26,2.0,0.08,31.0,131.0,0.9962200000000001,3.21,0.52,9.9,5 +7.2,0.695,0.13,2.0,0.076,12.0,20.0,0.99546,3.29,0.54,10.1,5 +7.2,0.695,0.13,2.0,0.076,12.0,20.0,0.99546,3.29,0.54,10.1,5 +7.2,0.695,0.13,2.0,0.076,12.0,20.0,0.99546,3.29,0.54,10.1,5 +6.7,0.67,0.02,1.9,0.061,26.0,42.0,0.9948899999999999,3.39,0.82,10.9,6 +6.7,0.16,0.64,2.1,0.059000000000000004,24.0,52.0,0.9949399999999999,3.34,0.71,11.2,6 +7.2,0.695,0.13,2.0,0.076,12.0,20.0,0.99546,3.29,0.54,10.1,5 +7.0,0.56,0.13,1.6,0.077,25.0,42.0,0.99629,3.34,0.59,9.2,5 +6.2,0.51,0.14,1.9,0.055999999999999994,15.0,34.0,0.9939600000000001,3.48,0.57,11.5,6 +6.4,0.36,0.53,2.2,0.23,19.0,35.0,0.9934,3.37,0.93,12.4,6 +6.4,0.38,0.14,2.2,0.038,15.0,25.0,0.9951399999999999,3.44,0.65,11.1,6 +7.3,0.69,0.32,2.2,0.069,35.0,104.0,0.9963200000000001,3.33,0.51,9.5,5 +6.0,0.58,0.2,2.4,0.075,15.0,50.0,0.99467,3.58,0.67,12.5,6 +5.6,0.31,0.78,13.9,0.07400000000000001,23.0,92.0,0.99677,3.39,0.48,10.5,6 +7.5,0.52,0.4,2.2,0.06,12.0,20.0,0.99474,3.26,0.64,11.8,6 +8.0,0.3,0.63,1.6,0.081,16.0,29.0,0.9958799999999999,3.3,0.78,10.8,6 +6.2,0.7,0.15,5.1,0.076,13.0,27.0,0.9962200000000001,3.54,0.6,11.9,6 +6.8,0.67,0.15,1.8,0.11800000000000001,13.0,20.0,0.9954,3.42,0.67,11.3,6 +6.2,0.56,0.09,1.7,0.053,24.0,32.0,0.9940200000000001,3.54,0.6,11.3,5 +7.4,0.35,0.33,2.4,0.068,9.0,26.0,0.9947,3.36,0.6,11.9,6 +6.2,0.56,0.09,1.7,0.053,24.0,32.0,0.9940200000000001,3.54,0.6,11.3,5 +6.1,0.715,0.1,2.6,0.053,13.0,27.0,0.9936200000000001,3.57,0.5,11.9,5 +6.2,0.46,0.29,2.1,0.07400000000000001,32.0,98.0,0.9957799999999999,3.33,0.62,9.8,5 +6.7,0.32,0.44,2.4,0.061,24.0,34.0,0.99484,3.29,0.8,11.6,7 +7.2,0.39,0.44,2.6,0.066,22.0,48.0,0.9949399999999999,3.3,0.84,11.5,6 +7.5,0.31,0.41,2.4,0.065,34.0,60.0,0.99492,3.34,0.85,11.4,6 +5.8,0.61,0.11,1.8,0.066,18.0,28.0,0.9948299999999999,3.55,0.66,10.9,6 +7.2,0.66,0.33,2.5,0.068,34.0,102.0,0.9941399999999999,3.27,0.78,12.8,6 +6.6,0.725,0.2,7.8,0.073,29.0,79.0,0.9977,3.29,0.54,9.2,5 +6.3,0.55,0.15,1.8,0.077,26.0,35.0,0.9931399999999999,3.32,0.82,11.6,6 +5.4,0.74,0.09,1.7,0.08900000000000001,16.0,26.0,0.9940200000000001,3.67,0.56,11.6,6 +6.3,0.51,0.13,2.3,0.076,29.0,40.0,0.99574,3.42,0.75,11.0,6 +6.8,0.62,0.08,1.9,0.068,28.0,38.0,0.99651,3.42,0.82,9.5,6 +6.2,0.6,0.08,2.0,0.09,32.0,44.0,0.9949,3.45,0.58,10.5,5 +5.9,0.55,0.1,2.2,0.062,39.0,51.0,0.9951200000000001,3.52,0.76,11.2,6 +6.3,0.51,0.13,2.3,0.076,29.0,40.0,0.99574,3.42,0.75,11.0,6 +5.9,0.645,0.12,2.0,0.075,32.0,44.0,0.9954700000000001,3.57,0.71,10.2,5 +6.0,0.31,0.47,3.6,0.067,18.0,42.0,0.99549,3.39,0.66,11.0,6 diff --git a/oldTestCode.txt b/oldTestCode.txt index 65cf490..c08eb3d 100644 --- a/oldTestCode.txt +++ b/oldTestCode.txt @@ -1,22 +1,22 @@ -// testing the MatrixND class__________________________________________________ -ETL etl("winedata.csv", ",", true); - std::vector> dataSet = etl.readCSV(); - - int rows = dataSet.size(); - int cols = dataSet[0].size(); - - MatrixND dataMat = etl.CSVtoMatrix(dataSet, rows, cols); - - std::cout << "Data Matrix: " << std::endl; - //MatrixND tDataMat = dataMat.transpose(); - - dataMat.print(); - //cout << dataMat << endl; - // unit test to test all the matrixND functions - MatrixND testMat = MatrixND::identity(3); - testMat.print(); - testMat.transpose().print(); - - // test the matrixND class making a zero matrix - MatrixND zeroMat = MatrixND::zero(10, 23); +// testing the MatrixND class__________________________________________________ +ETL etl("winedata.csv", ",", true); + std::vector> dataSet = etl.readCSV(); + + int rows = dataSet.size(); + int cols = dataSet[0].size(); + + MatrixND dataMat = etl.CSVtoMatrix(dataSet, rows, cols); + + std::cout << "Data Matrix: " << std::endl; + //MatrixND tDataMat = dataMat.transpose(); + + dataMat.print(); + //cout << dataMat << endl; + // unit test to test all the matrixND functions + MatrixND testMat = MatrixND::identity(3); + testMat.print(); + testMat.transpose().print(); + + // test the matrixND class making a zero matrix + MatrixND zeroMat = MatrixND::zero(10, 23); zeroMat.print(); \ No newline at end of file diff --git a/old_test_code b/old_test_code index 9adada6..89e20a1 100644 --- a/old_test_code +++ b/old_test_code @@ -1,56 +1,56 @@ - vector v1 = {-3.489, -1.929, 9.193, 3.221, -4.491, 6.154, - -1.605, -4.176, -1.047}; - // test the matrixND class making a random matrix - MatrixND randMat(v1, 3, 3); - cout << "random matrix: " << endl << randMat << endl; - - // adjoint of the randMat - MatrixND adjugate = randMat.adjoint(); - cout << "adjoint of the random matrix: " << endl << adjugate << endl; - - // finding the inverse of a matrix - MatrixND invMat = randMat.inverse(); - cout << "inverse of random matrix: " << endl << invMat << endl; - // finding the determinant of a matrix - double det = randMat.determinant(); - std::cout << "The determinant of the matrix is: " << det << std::endl; - // finding the transpose of a matrix - MatrixND transMat = randMat.transpose(); - cout << "transpose of random matrix: " << endl << transMat << endl; - // finding the trace of a matrix - double trace = randMat.trace(); - std::cout << "The trace of the matrix is: " << trace << std::endl; - // finding the rank of a matrix - int rank = randMat.rank(); - std::cout << "The rank of the matrix is: " << rank << std::endl; - // finding the rref of a matrix - MatrixND rref = randMat.rref(); - cout << "rref of random matrix: " << endl << rref << endl; - // finding the characteristic polynomial of a matrix - vector charPoly = randMat.characteristicPolynomial(); - cout << "characteristic polynomial of random matrix: " << endl; - printVector(charPoly); - - // test multiplication of two matrices - MatrixND mat1(3,3,1.0,2.3,3.4,4.7,5.1,6.3,7.6,8.9,9.2); - cout << "matrix 1: " << endl << mat1 << endl; - MatrixND mat2(3,3,1.3,2.4,3.5,4.6,5.7,6.8,7.9,8.0,9.1); - cout << "matrix 2: " << endl << mat2 << endl; - MatrixND mat3 = mat1 * mat2; - cout << "mat1 * mat2: " << endl << mat3 << endl; - - - - - double M[3][4] = { { 1, 2, -1, -4 }, - { 2, 3, -1, -11 }, - { -2, 0, -3, 22 } }; - - rez::to_reduced_row_echelon_form(M); - cout << "reduced row echelon form: " << endl; - for (int i = 0; i < 3; ++i) - { - for (int j = 0; j < 4; ++j) - std::cout << M[i][j] << '\t'; - std::cout << "\n"; + vector v1 = {-3.489, -1.929, 9.193, 3.221, -4.491, 6.154, + -1.605, -4.176, -1.047}; + // test the matrixND class making a random matrix + MatrixND randMat(v1, 3, 3); + cout << "random matrix: " << endl << randMat << endl; + + // adjoint of the randMat + MatrixND adjugate = randMat.adjoint(); + cout << "adjoint of the random matrix: " << endl << adjugate << endl; + + // finding the inverse of a matrix + MatrixND invMat = randMat.inverse(); + cout << "inverse of random matrix: " << endl << invMat << endl; + // finding the determinant of a matrix + double det = randMat.determinant(); + std::cout << "The determinant of the matrix is: " << det << std::endl; + // finding the transpose of a matrix + MatrixND transMat = randMat.transpose(); + cout << "transpose of random matrix: " << endl << transMat << endl; + // finding the trace of a matrix + double trace = randMat.trace(); + std::cout << "The trace of the matrix is: " << trace << std::endl; + // finding the rank of a matrix + int rank = randMat.rank(); + std::cout << "The rank of the matrix is: " << rank << std::endl; + // finding the rref of a matrix + MatrixND rref = randMat.rref(); + cout << "rref of random matrix: " << endl << rref << endl; + // finding the characteristic polynomial of a matrix + vector charPoly = randMat.characteristicPolynomial(); + cout << "characteristic polynomial of random matrix: " << endl; + printVector(charPoly); + + // test multiplication of two matrices + MatrixND mat1(3,3,1.0,2.3,3.4,4.7,5.1,6.3,7.6,8.9,9.2); + cout << "matrix 1: " << endl << mat1 << endl; + MatrixND mat2(3,3,1.3,2.4,3.5,4.6,5.7,6.8,7.9,8.0,9.1); + cout << "matrix 2: " << endl << mat2 << endl; + MatrixND mat3 = mat1 * mat2; + cout << "mat1 * mat2: " << endl << mat3 << endl; + + + + + double M[3][4] = { { 1, 2, -1, -4 }, + { 2, 3, -1, -11 }, + { -2, 0, -3, 22 } }; + + rez::to_reduced_row_echelon_form(M); + cout << "reduced row echelon form: " << endl; + for (int i = 0; i < 3; ++i) + { + for (int j = 0; j < 4; ++j) + std::cout << M[i][j] << '\t'; + std::cout << "\n"; } \ No newline at end of file diff --git a/templateGraph.cpp b/templateGraph.cpp index e13dbeb..184f369 100644 --- a/templateGraph.cpp +++ b/templateGraph.cpp @@ -1,4 +1,4 @@ -// -// Created by Ryan.Zurrin001 on 12/17/2021. -// -#include "templateGraph.h" +// +// Created by Ryan.Zurrin001 on 12/17/2021. +// +#include "templateGraph.h" diff --git a/templateGraph.h b/templateGraph.h index c5e190a..966298a 100644 --- a/templateGraph.h +++ b/templateGraph.h @@ -1,11 +1,11 @@ -// -// Created by Ryan.Zurrin001 on 12/17/2021. -// - -#ifndef PHYSICSFORMULA_TEMPLATEGRAPH_H -#define PHYSICSFORMULA_TEMPLATEGRAPH_H -// a template graph class - - - -#endif //PHYSICSFORMULA_TEMPLATEGRAPH_H +// +// Created by Ryan.Zurrin001 on 12/17/2021. +// + +#ifndef PHYSICSFORMULA_TEMPLATEGRAPH_H +#define PHYSICSFORMULA_TEMPLATEGRAPH_H +// a template graph class + + + +#endif //PHYSICSFORMULA_TEMPLATEGRAPH_H diff --git a/testFactore.cpp b/testFactore.cpp index 4958ee3..61bbe4c 100644 --- a/testFactore.cpp +++ b/testFactore.cpp @@ -15,7 +15,7 @@ int main(int argc, char* argv[]) //add test code between starred areas //************************************************************************* //Forces::acceleration2masses(75.0, 12.0, 63.0, 38.0, true); - Forces::tensionOnMultipleStrandsHangingObject(1.02, 60.0, 30.0 , true); + Energy::vertical_height_arrow(.120, 430, .71, true); //********************************************************************** ***