diff --git a/src/include/arith.cc.h b/orig/include/arith.cc.h similarity index 100% rename from src/include/arith.cc.h rename to orig/include/arith.cc.h diff --git a/src/include/arith.h b/orig/include/arith.h similarity index 100% rename from src/include/arith.h rename to orig/include/arith.h diff --git a/src/include/base_def.h b/orig/include/base_def.h similarity index 100% rename from src/include/base_def.h rename to orig/include/base_def.h diff --git a/src/include/container_index.cc.h b/orig/include/container_index.cc.h similarity index 100% rename from src/include/container_index.cc.h rename to orig/include/container_index.cc.h diff --git a/src/include/container_index.h b/orig/include/container_index.h similarity index 100% rename from src/include/container_index.h rename to orig/include/container_index.h diff --git a/src/include/conversions.h b/orig/include/conversions.h similarity index 100% rename from src/include/conversions.h rename to orig/include/conversions.h diff --git a/src/include/cxz_array.cc.h b/orig/include/cxz_array.cc.h similarity index 100% rename from src/include/cxz_array.cc.h rename to orig/include/cxz_array.cc.h diff --git a/src/include/cxz_array.h b/orig/include/cxz_array.h similarity index 100% rename from src/include/cxz_array.h rename to orig/include/cxz_array.h diff --git a/src/include/cxz_array_base.cc.h b/orig/include/cxz_array_base.cc.h similarity index 100% rename from src/include/cxz_array_base.cc.h rename to orig/include/cxz_array_base.cc.h diff --git a/src/include/cxz_array_base.h b/orig/include/cxz_array_base.h similarity index 100% rename from src/include/cxz_array_base.h rename to orig/include/cxz_array_base.h diff --git a/src/include/high_level_operation.cc.h b/orig/include/high_level_operation.cc.h similarity index 100% rename from src/include/high_level_operation.cc.h rename to orig/include/high_level_operation.cc.h diff --git a/src/include/high_level_operation.h b/orig/include/high_level_operation.h similarity index 100% rename from src/include/high_level_operation.h rename to orig/include/high_level_operation.h diff --git a/src/include/hl_cnorxz.h b/orig/include/hl_cnorxz.h similarity index 100% rename from src/include/hl_cnorxz.h rename to orig/include/hl_cnorxz.h diff --git a/src/include/map_range.cc.h b/orig/include/map_range.cc.h similarity index 100% rename from src/include/map_range.cc.h rename to orig/include/map_range.cc.h diff --git a/src/include/map_range.h b/orig/include/map_range.h similarity index 100% rename from src/include/map_range.h rename to orig/include/map_range.h diff --git a/src/include/map_range_factory_product_map.h b/orig/include/map_range_factory_product_map.h similarity index 100% rename from src/include/map_range_factory_product_map.h rename to orig/include/map_range_factory_product_map.h diff --git a/src/include/mbase_def.h b/orig/include/mbase_def.h similarity index 100% rename from src/include/mbase_def.h rename to orig/include/mbase_def.h diff --git a/src/include/ranges/anonymous_range.h b/orig/include/ranges/anonymous_range.h similarity index 100% rename from src/include/ranges/anonymous_range.h rename to orig/include/ranges/anonymous_range.h diff --git a/src/include/ranges/dynamic_range.cc.h b/orig/include/ranges/dynamic_range.cc.h similarity index 100% rename from src/include/ranges/dynamic_range.cc.h rename to orig/include/ranges/dynamic_range.cc.h diff --git a/src/include/ranges/dynamic_range.h b/orig/include/ranges/dynamic_range.h similarity index 100% rename from src/include/ranges/dynamic_range.h rename to orig/include/ranges/dynamic_range.h diff --git a/src/include/ranges/index_type.h b/orig/include/ranges/index_type.h similarity index 100% rename from src/include/ranges/index_type.h rename to orig/include/ranges/index_type.h diff --git a/src/include/ranges/index_wrapper.cc.h b/orig/include/ranges/index_wrapper.cc.h similarity index 100% rename from src/include/ranges/index_wrapper.cc.h rename to orig/include/ranges/index_wrapper.cc.h diff --git a/src/include/ranges/index_wrapper.h b/orig/include/ranges/index_wrapper.h similarity index 100% rename from src/include/ranges/index_wrapper.h rename to orig/include/ranges/index_wrapper.h diff --git a/src/include/ranges/multi_range_factory_product_map.h b/orig/include/ranges/multi_range_factory_product_map.h similarity index 100% rename from src/include/ranges/multi_range_factory_product_map.h rename to orig/include/ranges/multi_range_factory_product_map.h diff --git a/src/include/ranges/multi_range_register.h b/orig/include/ranges/multi_range_register.h similarity index 100% rename from src/include/ranges/multi_range_register.h rename to orig/include/ranges/multi_range_register.h diff --git a/src/include/ranges/range_types/header.h b/orig/include/ranges/range_types/header.h similarity index 100% rename from src/include/ranges/range_types/header.h rename to orig/include/ranges/range_types/header.h diff --git a/src/include/ranges/range_types/space_range.h b/orig/include/ranges/range_types/space_range.h similarity index 100% rename from src/include/ranges/range_types/space_range.h rename to orig/include/ranges/range_types/space_range.h diff --git a/src/include/ranges/range_types/spin_range.h b/orig/include/ranges/range_types/spin_range.h similarity index 100% rename from src/include/ranges/range_types/spin_range.h rename to orig/include/ranges/range_types/spin_range.h diff --git a/src/include/ranges/ranges_header.cc.h b/orig/include/ranges/ranges_header.cc.h similarity index 100% rename from src/include/ranges/ranges_header.cc.h rename to orig/include/ranges/ranges_header.cc.h diff --git a/src/include/ranges/rbase_def.h b/orig/include/ranges/rbase_def.h similarity index 85% rename from src/include/ranges/rbase_def.h rename to orig/include/ranges/rbase_def.h index 67cf045..36a5ff2 100644 --- a/src/include/ranges/rbase_def.h +++ b/orig/include/ranges/rbase_def.h @@ -3,18 +3,7 @@ #ifndef __cxz_ranges_base_def_h__ #define __cxz_ranges_base_def_h__ -#include - -#include -#ifndef CHECK -#define CHECK std::cout << __FILE__ << ": @" << __LINE__ << " in " << __func__ << std::endl; -#endif -#ifndef VCHECK -#define VCHECK(a) std::cout << __FILE__ << ": @" << __LINE__ \ - << " in " << __func__ << ": " << #a << " = " << a << std::endl; -#endif - -#include "base_def.h" +#include "base/base.h" #include "allocator.h" #define MUI static_cast(-1) diff --git a/src/include/ranges/reg_ind_num.h b/orig/include/ranges/reg_ind_num.h similarity index 100% rename from src/include/ranges/reg_ind_num.h rename to orig/include/ranges/reg_ind_num.h diff --git a/src/include/ranges/rheader.h b/orig/include/ranges/rheader.h similarity index 100% rename from src/include/ranges/rheader.h rename to orig/include/ranges/rheader.h diff --git a/src/include/ranges/rpheader.h b/orig/include/ranges/rpheader.h similarity index 100% rename from src/include/ranges/rpheader.h rename to orig/include/ranges/rpheader.h diff --git a/src/include/ranges/type_map.h b/orig/include/ranges/type_map.h similarity index 100% rename from src/include/ranges/type_map.h rename to orig/include/ranges/type_map.h diff --git a/src/include/ranges/type_register.h b/orig/include/ranges/type_register.h similarity index 100% rename from src/include/ranges/type_register.h rename to orig/include/ranges/type_register.h diff --git a/src/include/ranges/x_to_string.h b/orig/include/ranges/x_to_string.h similarity index 100% rename from src/include/ranges/x_to_string.h rename to orig/include/ranges/x_to_string.h diff --git a/src/include/slice.cc.h b/orig/include/slice.cc.h similarity index 100% rename from src/include/slice.cc.h rename to orig/include/slice.cc.h diff --git a/src/include/slice.h b/orig/include/slice.h similarity index 100% rename from src/include/slice.h rename to orig/include/slice.h diff --git a/src/lib/high_level_operation.cc b/orig/lib/high_level_operation.cc similarity index 100% rename from src/lib/high_level_operation.cc rename to orig/lib/high_level_operation.cc diff --git a/orig/lib/hl_ops/divides.cc b/orig/lib/hl_ops/divides.cc new file mode 100644 index 0000000..2047a51 --- /dev/null +++ b/orig/lib/hl_ops/divides.cc @@ -0,0 +1,8 @@ +#include "cnorxz.h" +#include "hl_cnorxz.h" + +namespace CNORXZ +{ + template class HighLevelOp,2>; + template class HighLevelOp,2>; +} diff --git a/orig/lib/hl_ops/exp.cc b/orig/lib/hl_ops/exp.cc new file mode 100644 index 0000000..fa51192 --- /dev/null +++ b/orig/lib/hl_ops/exp.cc @@ -0,0 +1,10 @@ +#include "cnorxz.h" +#include "hl_cnorxz.h" + +namespace CNORXZ +{ + template class HighLevelOp,1>; + template class HighLevelOp,1>; + template HighLevelOpHolder hl_exp (const HighLevelOpHolder& in); + template HighLevelOpHolder hl_exp (const HighLevelOpHolder& in); +} diff --git a/orig/lib/hl_ops/minus.cc b/orig/lib/hl_ops/minus.cc new file mode 100644 index 0000000..5faeeaf --- /dev/null +++ b/orig/lib/hl_ops/minus.cc @@ -0,0 +1,8 @@ +#include "cnorxz.h" +#include "hl_cnorxz.h" + +namespace CNORXZ +{ + template class HighLevelOp,2>; + template class HighLevelOp,2>; +} diff --git a/orig/lib/hl_ops/multiplies.cc b/orig/lib/hl_ops/multiplies.cc new file mode 100644 index 0000000..71182e2 --- /dev/null +++ b/orig/lib/hl_ops/multiplies.cc @@ -0,0 +1,8 @@ +#include "cnorxz.h" +#include "hl_cnorxz.h" + +namespace CNORXZ +{ + template class HighLevelOp,2>; + template class HighLevelOp,2>; +} diff --git a/orig/lib/hl_ops/negate.cc b/orig/lib/hl_ops/negate.cc new file mode 100644 index 0000000..79ca9b6 --- /dev/null +++ b/orig/lib/hl_ops/negate.cc @@ -0,0 +1,8 @@ +#include "cnorxz.h" +#include "hl_cnorxz.h" + +namespace CNORXZ +{ + template class HighLevelOp,1>; + template class HighLevelOp,1>; +} diff --git a/orig/lib/hl_ops/plus.cc b/orig/lib/hl_ops/plus.cc new file mode 100644 index 0000000..68fc583 --- /dev/null +++ b/orig/lib/hl_ops/plus.cc @@ -0,0 +1,8 @@ +#include "cnorxz.h" +#include "hl_cnorxz.h" + +namespace CNORXZ +{ + template class HighLevelOp,2>; + template class HighLevelOp,2>; +} diff --git a/src/lib/map_range_factory_product_map.cc b/orig/lib/map_range_factory_product_map.cc similarity index 100% rename from src/lib/map_range_factory_product_map.cc rename to orig/lib/map_range_factory_product_map.cc diff --git a/src/lib/mk_hl_op.sh b/orig/lib/mk_hl_op.sh similarity index 100% rename from src/lib/mk_hl_op.sh rename to orig/lib/mk_hl_op.sh diff --git a/src/lib/ranges/anonymous_range.cc b/orig/lib/ranges/anonymous_range.cc similarity index 100% rename from src/lib/ranges/anonymous_range.cc rename to orig/lib/ranges/anonymous_range.cc diff --git a/src/lib/ranges/dynamic_meta.cc b/orig/lib/ranges/dynamic_meta.cc similarity index 100% rename from src/lib/ranges/dynamic_meta.cc rename to orig/lib/ranges/dynamic_meta.cc diff --git a/src/lib/ranges/dynamic_range.cc b/orig/lib/ranges/dynamic_range.cc similarity index 100% rename from src/lib/ranges/dynamic_range.cc rename to orig/lib/ranges/dynamic_range.cc diff --git a/src/lib/ranges/multi_range_factory_product_map.cc b/orig/lib/ranges/multi_range_factory_product_map.cc similarity index 100% rename from src/lib/ranges/multi_range_factory_product_map.cc rename to orig/lib/ranges/multi_range_factory_product_map.cc diff --git a/src/lib/ranges/range_types/space_range.cc b/orig/lib/ranges/range_types/space_range.cc similarity index 100% rename from src/lib/ranges/range_types/space_range.cc rename to orig/lib/ranges/range_types/space_range.cc diff --git a/src/lib/ranges/range_types/spin_range.cc b/orig/lib/ranges/range_types/spin_range.cc similarity index 100% rename from src/lib/ranges/range_types/spin_range.cc rename to orig/lib/ranges/range_types/spin_range.cc diff --git a/orig/lib/ranges/ranges_deserialize_legacy.cc b/orig/lib/ranges/ranges_deserialize_legacy.cc new file mode 100644 index 0000000..432dbb5 --- /dev/null +++ b/orig/lib/ranges/ranges_deserialize_legacy.cc @@ -0,0 +1,175 @@ + +namespace CNORXZ +{ + + template + using STP = std::tuple...>; + + typedef vector > RVEC; + + template + inline bool compareSpaceTypes(const RVEC& rvec) + { + return RangeHelper::compareSpaceTypes(rvec); + } + + template + inline bool setFactory(const RVEC& rvec, std::shared_ptr& fptr) + { + if(compareSpaceTypes(rvec)) { + STP stp; + RangeHelper::setSpace(rvec, stp); + fptr = std::make_shared >(stp); + return true; + } + else { + return false; + } + } + + size_t indexId() + { + static size_t id = 0; + ++id; + return id; + } + + std::shared_ptr mkMULTI(char const** dp, size_t metaSize) + { + std::shared_ptr out = nullptr; + RVEC rvec(metaSize); + for(size_t i = 0; i != metaSize; ++i){ + auto ff = createRangeFactory(dp); + rvec[i] = ff->create(); + } + + if(metaSize == 0){ + assert(0); + } + else if(metaSize == 1) { +#define register_multi1(TT0) if(setFactory(rvec, out)) {} else +#include "ranges/multi_range_register.h" +#undef register_multi1 + assert(0); + } + else if(metaSize == 2) { +#define register_multi2(TT0,TT1) if(setFactory(rvec, out)) {} else +#include "ranges/multi_range_register.h" +#undef register_multi2 + assert(0); + } + else if(metaSize == 3) { +#define register_multi3(TT0,TT1,TT2) if(setFactory(rvec, out)) {} else +#include "ranges/multi_range_register.h" +#undef register_multi3 + assert(0); + } + else if(metaSize == 4) { +#define register_multi4(TT0,TT1,TT2,TT3) if(setFactory(rvec, out)) {} else +#include "ranges/multi_range_register.h" +#undef register_multi4 + assert(0); + } + else { + assert(0); + } + + return out; + } + + std::shared_ptr mkANONYMOUS(char const** dp, size_t metaSize) + { + std::shared_ptr out = nullptr; + auto arf = std::make_shared(); + for(size_t i = 0; i != metaSize; ++i){ + auto ff = createRangeFactory(dp); + arf->append( ff->create() ); + } + out = arf; + return out; + } + + + std::shared_ptr mkANY(int metaType, size_t metaSize, char const** dp) + { + std::shared_ptr out = nullptr; + if(metaType == -1){ + assert(0); + } +#define register_type(x) else if(x == metaType) { \ + vector::type> vd; \ + metaCat(vd, *dp, metaSize); \ + out = std::make_shared::type, \ + SpaceType::ANY> >(vd); } +#include "ranges/type_map.h" +#undef register_type + else { + assert(0); + } + return out; + } + + std::shared_ptr createSingleRangeFactory(const vector*& d, int metaType, size_t size) + { + std::shared_ptr out = nullptr; + if(metaType == -1){ + assert(0); + } +#define register_type(x) else if(x == metaType) { \ + vector::type> vd(size); \ + std::transform(d,d+size,vd.begin(), \ + [](const vector& c) \ + { assert(c.size() == sizeof(TypeMap::type)); \ + return *reinterpret_cast::type const*>(c.data()); }); \ + out = std::make_shared::type, \ + SpaceType::ANY> >(vd); } +#include "ranges/type_map.h" +#undef register_type + else { + assert(0); + } + return out; + } + + std::shared_ptr createRangeFactory(char const** dp) + { + DataHeader h = *reinterpret_cast(*dp); + *dp += sizeof(DataHeader); + + std::shared_ptr out = nullptr; + + if(h.multiple != 0){ + if(h.spaceType == static_cast( SpaceType::ANY )) { + // multi range + out = mkMULTI(dp, h.metaSize); + } + else if(h.spaceType == static_cast( SpaceType::ANON ) ) { + // anonymous range + out = mkANONYMOUS(dp, h.metaSize); + } + else { + assert(0); + } + } + else { + if(h.spaceType == static_cast( SpaceType::ANY ) ) { + // generic single range + out = mkANY(h.metaType, h.metaSize, dp); + } + else if(h.spaceType == static_cast( SpaceType::NONE ) ) { + // classic range + size_t size = *reinterpret_cast(*dp); + out = std::make_shared >(size); + } +#define include_range_type(x,n) else if(h.spaceType == static_cast( SpaceType::x ) ) { \ + out = mk##x(*dp, h.metaSize); } +#include "ranges/range_types/header.h" +#undef inlcude_range_type + else { + assert(0); + } + *dp += h.metaSize; + } + return out; + } +} diff --git a/src/lib/ranges/type_map.cc b/orig/lib/ranges/type_map.cc similarity index 100% rename from src/lib/ranges/type_map.cc rename to orig/lib/ranges/type_map.cc diff --git a/src/include/allocator.h b/src/include/allocator.h deleted file mode 100644 index 628fded..0000000 --- a/src/include/allocator.h +++ /dev/null @@ -1,107 +0,0 @@ - -#ifndef __cxz_allocator__ -#define __cxz_allocator__ - -#include -#include -#include -#include -#include -#include - -#define MIB_SIZE 1024*1024 // 1MiB -#define WARN_SIZE MIB_SIZE*100 // 100 MiB - -namespace CNORXZInternal -{ - - template - class Allocator - { - private: - static size_t sMemUsage; - - public: - static size_t memUsage() { return sMemUsage; } - - typedef T value_type; - static constexpr size_t type_size = sizeof(value_type); - static constexpr size_t N = 32; // get from environment!!! - - struct VX - { - alignas(N) char x[N]; - }; - - Allocator() = default; - - template - Allocator(const Allocator& x) {} - - T* allocate(size_t n) - { - const size_t nn = n*type_size; - sMemUsage += nn; - if(nn >= WARN_SIZE){ - std::cout << __func__ << ": WARNING: allocating " << nn/(MIB_SIZE) << " MiB" << std::endl; - } - const size_t off = nn%N; - const size_t nnx = (off == 0) ? nn : nn + N - off; - const size_t nnd = nnx/N; - VX* vx = new VX[nnd]; - return reinterpret_cast(vx); - } - - void deallocate(T* p, size_t n) - { - const size_t nn = n*type_size; - sMemUsage -= nn; - VX* vx = reinterpret_cast(p); - delete [] vx; - } - }; - - template - bool operator==(const Allocator& a, const Allocator& b) - { - return true; - } - - template - bool operator!=(const Allocator& a, const Allocator& b) - { - return false; - } - - template - size_t Allocator::sMemUsage = 0; - -} // namespace CNORXZInternal - -namespace CNORXZ -{ - - template - inline size_t memUsage() - { - return CNORXZInternal::Allocator::memUsage(); - } - - template - using vector = std::vector>; - - template - inline std::vector toStdVec(const vector& v) - { - return std::vector(v.begin(), v.end()); - } - - template - inline vector toMatVec(const std::vector& v) - { - return vector(v.begin(), v.end()); - } - -} // namespace CNORXZ - -#endif diff --git a/src/include/access.cc.h b/src/include/array/access.cc.h similarity index 100% rename from src/include/access.cc.h rename to src/include/array/access.cc.h diff --git a/src/include/access.h b/src/include/array/access.h similarity index 100% rename from src/include/access.h rename to src/include/array/access.h diff --git a/src/include/array/array.cc.h b/src/include/array/array.cc.h new file mode 100644 index 0000000..fbc55db --- /dev/null +++ b/src/include/array/array.cc.h @@ -0,0 +1,6 @@ + +//#include "access.cc.h" +#include "darray_base.cc.h" +#include "darray.cc.h" +#include "dcontainer_index.cc.h" +//#include "functional_array.cc.h" diff --git a/src/include/array/array.h b/src/include/array/array.h new file mode 100644 index 0000000..ec4e97d --- /dev/null +++ b/src/include/array/array.h @@ -0,0 +1,6 @@ + +//#include "access.h" +#include "darray_base.h" +#include "darray.h" +#include "dcontainer_index.h" +//#include "functional_array.h" diff --git a/src/include/cxz_darray.cc.h b/src/include/array/darray.cc.h similarity index 100% rename from src/include/cxz_darray.cc.h rename to src/include/array/darray.cc.h diff --git a/src/include/cxz_darray.h b/src/include/array/darray.h similarity index 100% rename from src/include/cxz_darray.h rename to src/include/array/darray.h diff --git a/src/include/cxz_darray_base.cc.h b/src/include/array/darray_base.cc.h similarity index 100% rename from src/include/cxz_darray_base.cc.h rename to src/include/array/darray_base.cc.h diff --git a/src/include/cxz_darray_base.h b/src/include/array/darray_base.h similarity index 100% rename from src/include/cxz_darray_base.h rename to src/include/array/darray_base.h diff --git a/src/include/dcontainer_index.cc.h b/src/include/array/dcontainer_index.cc.h similarity index 58% rename from src/include/dcontainer_index.cc.h rename to src/include/array/dcontainer_index.cc.h index 5ec046b..24805fa 100644 --- a/src/include/dcontainer_index.cc.h +++ b/src/include/array/dcontainer_index.cc.h @@ -1,91 +1,11 @@ +#ifndef __cxz_dcontainer_index_cc_h__ +#define __cxz_dcontainer_index_cc_h__ + #include "dcontainer_index.h" namespace CNORXZ { - /************** - * XIndex * - **************/ - - template - XIndex::XIndex(const IndexPtr& i) : mI(i) {} - - template - XIndex& XIndex::operator=(size_t pos) - { - *mI = pos; - return *this; - } - - template - XIndex& XIndex::operator++() - { - ++(*mI); - return *this; - } - - template - XIndex& XIndex::operator--() - { - --(*mI); - return *this; - } - - template - int XIndex::pp(std::intptr_t idxPtrNum) - { - return mI->pp(idxPtrNum); - } - - template - int XIndex::mm(std::intptr_t idxPtrNum) - { - return mI->mm(idxPtrNum); - } - - template - size_t XIndex::dim() const - { - return mI->dim(); - } - - template - size_t XIndex::getStepSize(size_t n) const - { - return mI->getStepSize(n); - } - - template - std::string XIndex::stringMeta() const - { - return mI->stringMeta(); - } - - template - DType XIndex::meta() const - { - return DType(mI->meta()); - } - - template - XIndexBase& XIndex::at(const DType& meta) - { - // check!!! - mI->at(std::any_cast(meta.get())); - return *this; - } - - template - DynamicExpression XIndex::ifor(size_t step, DynamicExpression ex) const - { - return mI->ifor(step, ex); - } - - template - DynamicExpression XIndex::iforh(size_t step, DynamicExpression ex) const - { - return mI->iforh(step, ex); - } template DConstContainerIndex::DConstContainerIndex(const T* data, const RangePtr& range): @@ -209,3 +129,5 @@ namespace CNORXZ } } + +#endif diff --git a/src/include/array/dcontainer_index.h b/src/include/array/dcontainer_index.h new file mode 100644 index 0000000..2f7e05b --- /dev/null +++ b/src/include/array/dcontainer_index.h @@ -0,0 +1,87 @@ + +#ifndef __cxz_dcontainer_index_h__ +#define __cxz_dcontainer_index_h__ + +#include "range_base.h" +#include "index_base.h" +#include "statics/static_for.h" +#include "xfor/xfor.h" +#include "ranges/xindex.h" +#include "ranges/yindex.h" + +namespace CNORXZ +{ + + + template + class DConstContainerIndex : public IndexInterface,DType> + { + public: + typedef IndexInterface,DType> IB; + + protected: + YIndexPtr mI; + const T* mCData = nullptr; + + public: + DEFAULT_MEMBERS(DConstContainerIndex); + DConstContainerIndex(const T* data, const RangePtr& range); + + DConstContainerIndex& operator=(size_t pos); + DConstContainerIndex& operator++(); + DConstContainerIndex& operator--(); + + template // fast but unsave + DConstContainerIndex operator+(const IndexInterface& i); + + template // fast but unsave + DConstContainerIndex operator-(const IndexInterface& i); + + template // save version of operator+ + DConstContainerIndex plus(const IndexInterface& i); + + template // save version of operator- + DConstContainerIndex minus(const IndexInterface& i); + + int pp(std::intptr_t idxPtrNum); + int mm(std::intptr_t idxPtrNum); + size_t dim() const; + size_t getStepSize(size_t n) const; + std::string stringMeta() const; + DType meta() const; + DType metaPtr() const; + DConstContainerIndex& at(const DType& meta); + DynamicExpression ifor(size_t step, DynamicExpression ex) const; + DynamicExpression iforh(size_t step, DynamicExpression ex) const; + + const T& operator*() const; + const T* operator->() const; + + DConstContainerIndex& sync(); // recalculate 'IB::mPos' when externalControl == true + DConstContainerIndex& operator()(const std::vector& inds); // control via external indice + DConstContainerIndex& operator()(); // -> sync; just to shorten the code + + }; + + template + class DContainerIndex : public DConstContainerIndex + { + public: + typedef DConstContainerIndex CCI; + typedef typename CCI::IB IB; + + private: + T* mData = nullptr; + + public: + + DEFAULT_MEMBERS(DContainerIndex); + DContainerIndex(T* data, const RangePtr& range); + DContainerIndex(T* data, const DConstContainerIndex& cci); + + T& operator*(); + T* operator->(); + }; +} + +#endif diff --git a/src/include/functional_array.cc.h b/src/include/array/functional_array.cc.h similarity index 100% rename from src/include/functional_array.cc.h rename to src/include/array/functional_array.cc.h diff --git a/src/include/functional_array.h b/src/include/array/functional_array.h similarity index 100% rename from src/include/functional_array.h rename to src/include/array/functional_array.h diff --git a/src/include/base/assert.h b/src/include/base/assert.h new file mode 100644 index 0000000..d0a5c63 --- /dev/null +++ b/src/include/base/assert.h @@ -0,0 +1,15 @@ + +#include +#include + +#define CXZ_ERRTAG __FILE__ << '@' << __LINE__ << '(' << __func__ << "): error" +#define CXZ_WARNTAG __FILE__ << '@' << __LINE__ << ": warning" +#define CXZ_ERROR(errmsg) {\ + std::stringstream ss;\ + ss << CXZ_ERRTAG << ": " << errmsg << std::flush;\ + throw std::runtime_error(ss.str()); } + +#define CXZ_WARNING(errmsg) {\ + std::cerr << CXZ_WARNTAG << ": " << errmsg << std::endl; } + +#define CXZ_ASSERT(statement, errmsg) if(not (statement)) { CXZ_ERROR(errmsg); } diff --git a/src/include/base/base.cc.h b/src/include/base/base.cc.h new file mode 100644 index 0000000..31b3622 --- /dev/null +++ b/src/include/base/base.cc.h @@ -0,0 +1,2 @@ + +#include "dtype.cc.h" diff --git a/src/include/base/base.h b/src/include/base/base.h new file mode 100644 index 0000000..9dc7a11 --- /dev/null +++ b/src/include/base/base.h @@ -0,0 +1,12 @@ + +#ifndef __cxz_base_h__ +#define __cxz_base_h__ + +#include +#include + +#include "macros.h" +#include "assert.h" +#include "types.h" + +#endif diff --git a/src/include/ranges/dynamic_meta.cc.h b/src/include/base/dtype.cc.h similarity index 53% rename from src/include/ranges/dynamic_meta.cc.h rename to src/include/base/dtype.cc.h index fb8a8e0..0b9255b 100644 --- a/src/include/ranges/dynamic_meta.cc.h +++ b/src/include/base/dtype.cc.h @@ -1,52 +1,16 @@ +#ifndef __cxz_dtype_cc_h__ +#define __cxz_dtype_cc_h__ + #include -#include "dynamic_meta.h" +#include "dtype.h" +#include "to_string.h" namespace CNORXZ { - template - std::string toString(const T& a) - { - std::stringstream ss; - ss << a; - return ss.str(); - } - - template - std::string toString>(const vector& a) - { - std::stringstream ss; - ss << "["; - auto it = a.begin(); - for(; it != a.end()-1; ++it){ - ss << *it << ","; - } - ss << *it << "]"; - return ss.str(); - } - - template - std::string toString>(const std::array& a) - { - std::stringstream ss; - ss << "("; - auto it = a.begin(); - for(; it != a.end()-1; ++it){ - ss << *it << ","; - } - ss << *it << ")"; - return ss.str(); - } - // for tuple use vector !!! // (yes DType is slow, thats why one should only use it for debugging) - template <> - std::string toString(const DType& a) - { - return a.str(); - } - template DType::DType(const T& d) : mD(d) { @@ -92,3 +56,5 @@ namespace CNORXZ }; } } + +#endif diff --git a/src/include/base/dtype.h b/src/include/base/dtype.h new file mode 100644 index 0000000..64c4576 --- /dev/null +++ b/src/include/base/dtype.h @@ -0,0 +1,51 @@ + +#ifndef __cxz_dynamic_meta_h__ +#define __cxz_dynamic_meta_h__ + +#include +#include +#include +#include +#include + +#include "macros.h" +#include "types.h" + +namespace CNORXZ +{ + class DType + { + private: + std::any mD; + std::function mToStr; + std::function mComp; + + template + void _mkToStr(); + + template + void _mkComp(); + + public: + DEFAULT_MEMBERS(DType); + + template + DType(const T& d); + + template + DType& operator=(const T& d); + + std::string str() const { return mToStr(); } + const std::any& get() const { return mD; } + + bool operator==(const DType& a) const { return mComp(a.mD) == 0; } + bool operator!=(const DType& a) const { return mComp(a.mD) != 0; } + bool operator<(const DType& a) const { return mComp(a.mD) == -1; } + bool operator>(const DType& a) const { return mComp(a.mD) == 1; } + bool operator<=(const DType& a) const { auto c = mComp(a.mD); return c <= 0; } + bool operator>=(const DType& a) const { auto c = mComp(a.mD); return c == 1 or c == 0; } + }; + +} // namespace CNORXZ + +#endif diff --git a/src/include/base/macros.h b/src/include/base/macros.h new file mode 100644 index 0000000..47f3d0c --- /dev/null +++ b/src/include/base/macros.h @@ -0,0 +1,26 @@ + +#ifndef __cxz_macros_h__ +#define __cxz_macros_h__ + +#include + +#ifndef CHECK +#define CHECK std::cout << __FILE__ << ": @" << __LINE__ << " in " << __func__ << std::endl; +#endif +#ifndef VCHECK +#define VCHECK(a) std::cout << __FILE__ << ": @" << __LINE__ \ + << " in " << __func__ << ": " << #a << " = " << a << std::endl; +#endif + +#define DEFAULT_C(__class_name__) __class_name__() = default +#define DEFAULT_COPY_C(__class_name__) __class_name__(const __class_name__& a) = default +#define DEFAULT_COPY_A(__class_name__) __class_name__& operator=(const __class_name__& a) = default +#define DEFAULT_MOVE_C(__class_name__) __class_name__(__class_name__&& a) = default +#define DEFAULT_MOVE_A(__class_name__) __class_name__& operator=(__class_name__&& a) = default +#define DEFAULT_COPY(__class_name__) DEFAULT_COPY_C(__class_name__); DEFAULT_COPY_A(__class_name__) +#define DEFAULT_MOVE(__class_name__) DEFAULT_MOVE_C(__class_name__); DEFAULT_MOVE_A(__class_name__) + +#define DEFAULT_MEMBERS_X(__class_name__) DEFAULT_COPY(__class_name__); DEFAULT_MOVE(__class_name__) +#define DEFAULT_MEMBERS(__class_name__) DEFAULT_C(__class_name__); DEFAULT_MEMBERS_X(__class_name__) + +#endif diff --git a/src/include/base/to_string.cc.h b/src/include/base/to_string.cc.h new file mode 100644 index 0000000..a9988ec --- /dev/null +++ b/src/include/base/to_string.cc.h @@ -0,0 +1,52 @@ + +#ifndef __cxz_to_string_cc_h__ +#define __cxz_to_string_cc_h__ + +#include "to_string.h" +#include + +namespace CNORXZ +{ + template + String toString(const T& a) + { + std::stringstream ss; + ss << a; + return ss.str(); + } + + template + String toString>(const vector& a) + { + std::stringstream ss; + ss << "["; + auto it = a.begin(); + for(; it != a.end()-1; ++it){ + ss << *it << ","; + } + ss << *it << "]"; + return ss.str(); + } + + template + String toString>(const std::array& a) + { + std::stringstream ss; + ss << "("; + auto it = a.begin(); + for(; it != a.end()-1; ++it){ + ss << *it << ","; + } + ss << *it << ")"; + return ss.str(); + } + + template <> + String toString(const DType& a) + { + return a.str(); + } + +} + +#endif diff --git a/src/include/base/to_string.h b/src/include/base/to_string.h new file mode 100644 index 0000000..77ab86e --- /dev/null +++ b/src/include/base/to_string.h @@ -0,0 +1,23 @@ + +#ifndef __cxz_to_string_h__ +#define __cxz_to_string_h__ + +#include "types.h" +#include + +namespace CNORXZ +{ + template + String toString(const T& a); + + template + String toString>(const vector& a); + + template + String toString>(const std::array& a); + + template <> + String toString(const DType& a); +} + +#endif diff --git a/src/include/base/types.h b/src/include/base/types.h new file mode 100644 index 0000000..c68a38e --- /dev/null +++ b/src/include/base/types.h @@ -0,0 +1,68 @@ + +#ifndef __cxz_types_h__ +#define __cxz_types_h__ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace CNORXZ +{ + /********************** + * standard types * + **********************/ + + typedef std::intptr_t PtrId; + typedef int32_t Int; + typedef uint64_t SizeT; + typedef double Double; + typedef Double Real; + typedef std::complex Complex; + typedef std::string String; + + template + using Arr = std::array; + + template + using Sptr = std::shared_ptr; + + template + using Tuple = std::tuple; + + template + using TupleElem = std::tuple_element; + + template + using Map = std::map; + + typedef std::typeinfo TypeInfo; + + /********************* + * library types * + *********************/ + + // definition: base/dtype.h + class DType; + + // definition: memory/allocator.h + template + class Allocator; + + // definition: ranges/range_base.h + class RangeBase; + + /********************* + * derived types * + *********************/ + + template + using Vector = std::vector>; + +} + +#endif diff --git a/src/include/basic_types.h b/src/include/basic_types.h deleted file mode 100644 index 0c806be..0000000 --- a/src/include/basic_types.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __cxz_basic_types_h__ -#define __cxz_basic_types_h__ - -#include - -namespace CNORXZ -{ - - // just to fix this forever: - typedef int32_t Int; - typedef uint64_t SizeT; - typedef double Double; - typedef Double Real; - typedef std::string String; - -} - -#endif diff --git a/src/include/cnorxz.cc.h b/src/include/cnorxz.cc.h index ea17e23..6a2de0e 100644 --- a/src/include/cnorxz.cc.h +++ b/src/include/cnorxz.cc.h @@ -1,18 +1,5 @@ -#include "ranges/ranges_header.cc.h" - -#include "container_index.cc.h" -#include "dcontainer_index.cc.h" -#include "cxz_operation.cc.h" -#include "functional_array.cc.h" -#include "helper_tools.cc.h" -#include "map_range.cc.h" -#include "cxz_array_base.cc.h" -#include "cxz_array.cc.h" -#include "cxz_darray_base.cc.h" -#include "cxz_darray.cc.h" -#include "slice.cc.h" -#include "dynamic_operation.cc.h" -#include "access.cc.h" -#include "op_expressions.cc.h" - +#include "base/base.cc.h" +#include "memory/memory.cc.h" +#include "ranges/ranges.cc.h" +#include "array/array.cc.h" diff --git a/src/include/cnorxz.h b/src/include/cnorxz.h index 80f98ed..3a99d10 100644 --- a/src/include/cnorxz.h +++ b/src/include/cnorxz.h @@ -3,20 +3,9 @@ #ifndef __cxz_cnorxz_h__ #define __cxz_cnorxz_h__ -#include -#include "container_index.h" -#include "dcontainer_index.h" -#include "cxz_operation.h" -#include "cxz_array_base.h" -#include "cxz_array.h" -#include "cxz_darray_base.h" -#include "cxz_darray.h" -#include "functional_array.h" -#include "helper_tools.h" -#include "operation_def.h" -#include "map_range.h" -#include "dynamic_operation.h" -//#include "high_level_operation.h" +#include "base/base.h" +#include "memory/memory.h" +#include "ranges/ranges.h" #include "cnorxz.cc.h" diff --git a/src/include/cxz_assert.h b/src/include/cxz_assert.h deleted file mode 100644 index 3ee5e0b..0000000 --- a/src/include/cxz_assert.h +++ /dev/null @@ -1,15 +0,0 @@ - -#include -#include - -#define MA_ERRTAG __FILE__ << '@' << __LINE__ << '(' << __func__ << "): error" -#define MA_WARNTAG __FILE__ << '@' << __LINE__ << ": warning" -#define MA_ERROR(errmsg) {\ - std::stringstream ss;\ - ss << MA_ERRTAG << ": " << errmsg << std::flush;\ - throw std::runtime_error(ss.str()); } - -#define MA_WARNING(errmsg) {\ - std::cerr << MA_WARNTAG << ": " << errmsg << std::endl; } - -#define MA_ASSERT(statement, errmsg) if(not (statement)) { MA_ERROR(errmsg); } diff --git a/src/include/dcontainer_index.h b/src/include/dcontainer_index.h deleted file mode 100644 index 6865ba6..0000000 --- a/src/include/dcontainer_index.h +++ /dev/null @@ -1,182 +0,0 @@ - -#ifndef __dcontainer_index_h__ -#define __dcontainer_index_h__ - -#include -#include -#include - -#include "ranges/range_base.h" -#include "ranges/index_base.h" -#include "mbase_def.h" -#include "statics/static_for.h" -#include "ranges/range_helper.h" -#include "ranges/dynamic_meta.h" -#include "xfor/xfor.h" - -namespace CNORXZ -{ - namespace - { - using namespace CNORXZInternal; - } - - // Future IndexWrapper - class XIndexBase : public IndexInterface - { - public: - DEFAULT_MEMBERS(XIndexBase); - - constexpr IndexType type() const; - - virtual XIndexBase& operator=(size_t pos) = 0; - virtual XIndexBase& operator++() = 0; - virtual XIndexBase& operator--() = 0; - virtual int pp(std::intptr_t idxPtrNum) = 0; - virtual int mm(std::intptr_t idxPtrNum) = 0; - virtual size_t dim() const = 0; - virtual size_t getStepSize(size_t n) const = 0; - virtual std::string stringMeta() const = 0; - virtual DType meta() const = 0; - virtual XIndexBase& at(const DType& meta) = 0; - virtual DynamicExpression ifor(size_t step, DynamicExpression ex) const = 0; - virtual DynamicExpression iforh(size_t step, DynamicExpression ex) const = 0; - // ...!!! - }; - - typedef std::shared_ptr XIndexPtr; - - // MultiIndex Wrapper: - template - class XIndex : public XIndexBase - { - private: - IndexPtr mI; - - public: - DEFAULT_MEMBERS(XIndex); - XIndex(const IndexPtr& i); - - virtual XIndex& operator=(size_t pos) override; - virtual XIndex& operator++() override; - virtual XIndex& operator--() override; - virtual int pp(std::intptr_t idxPtrNum) override; - virtual int mm(std::intptr_t idxPtrNum) override; - virtual size_t dim() const override; - virtual size_t getStepSize(size_t n) const override; - virtual std::string stringMeta() const override; - virtual DType meta() const override; - virtual XIndexBase& at(const DType& meta) override; - virtual DynamicExpression ifor(size_t step, DynamicExpression ex) const override; - virtual DynamicExpression iforh(size_t step, DynamicExpression ex) const override; - // ....!!!! - }; - - // Future DynamicIndex - //class YIndex : public IndexInterface - class YIndex : public XIndexBase - { - public: - typedef IndexInterface IB; - - private: - vector mIs; - RangePtr mRange; - std::vector mBlockSizes; // dim() elements only!!! - bool mExternalControl = false; - - public: - constexpr IndexType type() const; - - DEFAULT_MEMBERS(YIndex); - YIndex(const RangePtr& range); - YIndex(const RangePtr& range, const std::vector& is); - - YIndex& operator=(size_t pos); - YIndex& operator++(); - YIndex& operator--(); - int pp(std::intptr_t idxPtrNum); - int mm(std::intptr_t idxPtrNum); - size_t dim() const; - size_t getStepSize(size_t n) const; - std::string stringMeta() const; - DType meta() const; - YIndex& at(const DType& meta); - DynamicExpression ifor(size_t step, DynamicExpression ex) const; - DynamicExpression iforh(size_t step, DynamicExpression ex) const; - }; - - typedef std::shared_ptr YIndexPtr; - - template - class DConstContainerIndex : public IndexInterface,DType> - { - public: - typedef IndexInterface,DType> IB; - - protected: - YIndexPtr mI; - const T* mCData = nullptr; - - public: - DEFAULT_MEMBERS(DConstContainerIndex); - DConstContainerIndex(const T* data, const RangePtr& range); - - DConstContainerIndex& operator=(size_t pos); - DConstContainerIndex& operator++(); - DConstContainerIndex& operator--(); - - template // fast but unsave - DConstContainerIndex operator+(const IndexInterface& i); - - template // fast but unsave - DConstContainerIndex operator-(const IndexInterface& i); - - template // save version of operator+ - DConstContainerIndex plus(const IndexInterface& i); - - template // save version of operator- - DConstContainerIndex minus(const IndexInterface& i); - - int pp(std::intptr_t idxPtrNum); - int mm(std::intptr_t idxPtrNum); - size_t dim() const; - size_t getStepSize(size_t n) const; - std::string stringMeta() const; - DType meta() const; - DType metaPtr() const; - DConstContainerIndex& at(const DType& meta); - DynamicExpression ifor(size_t step, DynamicExpression ex) const; - DynamicExpression iforh(size_t step, DynamicExpression ex) const; - - const T& operator*() const; - const T* operator->() const; - - DConstContainerIndex& sync(); // recalculate 'IB::mPos' when externalControl == true - DConstContainerIndex& operator()(const std::vector& inds); // control via external indice - DConstContainerIndex& operator()(); // -> sync; just to shorten the code - - }; - - template - class DContainerIndex : public DConstContainerIndex - { - public: - typedef DConstContainerIndex CCI; - typedef typename CCI::IB IB; - - private: - T* mData = nullptr; - - public: - - DEFAULT_MEMBERS(DContainerIndex); - DContainerIndex(T* data, const RangePtr& range); - DContainerIndex(T* data, const DConstContainerIndex& cci); - - T& operator*(); - T* operator->(); - }; -} - -#endif diff --git a/src/include/memory/allocator.cc.h b/src/include/memory/allocator.cc.h new file mode 100644 index 0000000..352eb9c --- /dev/null +++ b/src/include/memory/allocator.cc.h @@ -0,0 +1,46 @@ + +#ifndef __cxz_allocator_cc_h__ +#define __cxz_allocator_cc_h__ + +#include "allocator.h" +#include "memcount.h" + +namespace CNORXZ +{ + + template + T* Allocator::allocate(SizeT n) + { + const SizeT nn = n*type_size; + MemCount::add(nn); + const SizeT off = nn%N; + const SizeT nnx = (off == 0) ? nn : nn + N - off; + const SizeT nnd = nnx/N; + VX* vx = new VX[nnd]; + return reinterpret_cast(vx); + } + + template + void Allocator::deallocate(T* p, SizeT n) + { + const SizeT nn = n*type_size; + MemCount::sub(nn); + VX* vx = reinterpret_cast(p); + delete [] vx; + } + + template + bool operator==(const Allocator& a, const Allocator& b) + { + return true; + } + + template + bool operator!=(const Allocator& a, const Allocator& b) + { + return false; + } + +} + +#endif diff --git a/src/include/memory/allocator.h b/src/include/memory/allocator.h new file mode 100644 index 0000000..ca3379c --- /dev/null +++ b/src/include/memory/allocator.h @@ -0,0 +1,63 @@ + +#ifndef __cxz_allocator__ +#define __cxz_allocator__ + +#include +#include +#include +#include +#include +#include +#include "base/types.h" + +#define MIB_SIZE 1024*1024 // 1MiB +#define WARN_SIZE MIB_SIZE*100 // 100 MiB + +namespace CNORXZ +{ + + template + class Allocator + { + private: + static SizeT sMemUsage; + + public: + static SizeT memUsage() { return sMemUsage; } + + static constexpr SizeT type_size = sizeof(T); + static constexpr SizeT N = 32; // get from environment!!! + + struct VX + { + alignas(N) char x[N]; + }; + + Allocator() = default; + + template + Allocator(const Allocator& x) {} + + T* allocate(SizeT n); + void deallocate(T* p, SizeT n); + }; + + template + bool operator==(const Allocator& a, const Allocator& b); + + template + bool operator!=(const Allocator& a, const Allocator& b); + + template + SizeT Allocator::sMemUsage = 0; + + + template + inline SizeT memUsage() + { + return Allocator::memUsage(); + } + +} // namespace CNORXZ + +#endif diff --git a/src/include/memory/memcount.h b/src/include/memory/memcount.h new file mode 100644 index 0000000..58edade --- /dev/null +++ b/src/include/memory/memcount.h @@ -0,0 +1,26 @@ + +#ifndef __cxz_memcount_h__ +#define __cxz_memcount_h__ + +#include "allocator_d.h" +#include "base/types.h" + +namespace CNORXZ +{ + class MemCount + { + private: + static SizeT sMemUsage; + static void add(SizeT x) { sMemUsage += x; } + static void sub(SizeT x) { sMemUsage -= x; } + + public: + MemCount() = delete(); // static only + static SizeT usage() { return sMemUsage; } + + friend Allocator; + }; + +} // namespace CNORXZ + +#endif diff --git a/src/include/memory/memory.cc.h b/src/include/memory/memory.cc.h new file mode 100644 index 0000000..cf7861a --- /dev/null +++ b/src/include/memory/memory.cc.h @@ -0,0 +1,2 @@ + +#include "allocator.cc.h" diff --git a/src/include/memory/memory.h b/src/include/memory/memory.h new file mode 100644 index 0000000..9bcba4a --- /dev/null +++ b/src/include/memory/memory.h @@ -0,0 +1,3 @@ + +#include "allocator.h" +#include "memcount.h" diff --git a/src/include/cxz_operation.cc.h b/src/include/operation/cxz_operation.cc.h similarity index 100% rename from src/include/cxz_operation.cc.h rename to src/include/operation/cxz_operation.cc.h diff --git a/src/include/cxz_operation.h b/src/include/operation/cxz_operation.h similarity index 100% rename from src/include/cxz_operation.h rename to src/include/operation/cxz_operation.h diff --git a/src/include/dynamic_operation.cc.h b/src/include/operation/dynamic_operation.cc.h similarity index 100% rename from src/include/dynamic_operation.cc.h rename to src/include/operation/dynamic_operation.cc.h diff --git a/src/include/dynamic_operation.h b/src/include/operation/dynamic_operation.h similarity index 100% rename from src/include/dynamic_operation.h rename to src/include/operation/dynamic_operation.h diff --git a/src/include/extensions/math.h b/src/include/operation/extensions/math.h similarity index 100% rename from src/include/extensions/math.h rename to src/include/operation/extensions/math.h diff --git a/src/include/op_expressions.cc.h b/src/include/operation/op_expressions.cc.h similarity index 100% rename from src/include/op_expressions.cc.h rename to src/include/operation/op_expressions.cc.h diff --git a/src/include/op_expressions.h b/src/include/operation/op_expressions.h similarity index 100% rename from src/include/op_expressions.h rename to src/include/operation/op_expressions.h diff --git a/src/include/operation_def.h b/src/include/operation/operation_def.h similarity index 100% rename from src/include/operation_def.h rename to src/include/operation/operation_def.h diff --git a/src/include/type_operations.h b/src/include/operation/type_operations.h similarity index 100% rename from src/include/type_operations.h rename to src/include/operation/type_operations.h diff --git a/src/include/ranges/dynamic_meta.h b/src/include/ranges/dynamic_meta.h deleted file mode 100644 index 64cda3f..0000000 --- a/src/include/ranges/dynamic_meta.h +++ /dev/null @@ -1,109 +0,0 @@ - -#ifndef __cxz_dynamic_meta_h__ -#define __cxz_dynamic_meta_h__ - -#include -#include -#include -#include -#include - -#include "allocator.h" -#include "rbase_def.h" - -namespace CNORXZ -{ - // DEP: - typedef std::pair DynamicMetaElem; - - template - struct DynamicMetaSetter - { - template - static inline void set(const std::tuple& in, vector& meta) - { - typedef typename std::tuple_element>::type elemtype; - meta[N].first = reinterpret_cast( &std::get(in) ); - meta[N].second = sizeof(elemtype); - DynamicMetaSetter::set(in,meta); - } - }; - - // DEP: - template <> - struct DynamicMetaSetter<0> - { - template - static inline void set(const std::tuple& in, vector& meta) - { - typedef typename std::tuple_element<0,std::tuple>::type elemtype; - meta[0].first = reinterpret_cast( &std::get<0>(in) ); - meta[0].second = sizeof(elemtype); - } - }; - - - // DEP: - class DynamicMetaT - { - private: - vector mMeta; - - public: - DynamicMetaT() = default; - DynamicMetaT(const DynamicMetaT& in) = default; - DynamicMetaT(DynamicMetaT&& in) = default; - DynamicMetaT& operator=(const DynamicMetaT& in) = default; - DynamicMetaT& operator=(DynamicMetaT&& in) = default; - - template - DynamicMetaT(const std::tuple* meta) : mMeta(sizeof...(Us)) - { - DynamicMetaSetter::set(*meta,mMeta); - } - - bool operator==(const DynamicMetaT& in) const; - bool operator!=(const DynamicMetaT& in) const; - - size_t size() const; - - DynamicMetaElem& operator[](size_t pos); - const DynamicMetaElem& operator[](size_t pos) const; - }; - - class DType - { - private: - std::any mD; - std::function mToStr; - std::function mComp; - - template - void _mkToStr(); - - template - void _mkComp(); - - public: - DEFAULT_MEMBERS(DType); - - template - DType(const T& d); - - template - DType& operator=(const T& d); - - std::string str() const { return mToStr(); } - const std::any& get() const { return mD; } - - bool operator==(const DType& a) const { return mComp(a.mD) == 0; } - bool operator!=(const DType& a) const { return mComp(a.mD) != 0; } - bool operator<(const DType& a) const { return mComp(a.mD) == -1; } - bool operator>(const DType& a) const { return mComp(a.mD) == 1; } - bool operator<=(const DType& a) const { auto c = mComp(a.mD); return c <= 0; } - bool operator>=(const DType& a) const { auto c = mComp(a.mD); return c == 1 or c == 0; } - }; - -} // namespace CNORXZ - -#endif diff --git a/src/include/ranges/multi_range.h b/src/include/ranges/multi_range.h index 6efda26..0368422 100644 --- a/src/include/ranges/multi_range.h +++ b/src/include/ranges/multi_range.h @@ -3,121 +3,112 @@ #ifndef __cxz_multi_range_h__ #define __cxz_multi_range_h__ -#include -#include -#include +#include "base/base.h" #include -#include "ranges/range_base.h" -#include "ranges/index_base.h" +#include "range_base.h" +#include "index_base.h" -#include "ranges/range_helper.h" -#include "ranges/multi_range_factory_product_map.h" -#include "ranges/x_to_string.h" -#include "ranges/type_map.h" +#include "range_helper.h" +#include "multi_range_factory_product_map.h" #include "statics/static_for.h" namespace CNORXZ { - namespace - { - using namespace CNORXZInternal; - } template class MultiIndex : public IndexInterface, - std::tuple > + Tuple > { public: typedef IndexInterface, - std::tuple > IB; - typedef std::tuple...> IndexPack; - typedef std::tuple MetaType; + Tuple > IB; + typedef Tuple...> IndexPack; + typedef Tuple MetaType; typedef MultiRange RangeType; typedef MultiIndex IType; static constexpr IndexType sType() { return IndexType::MULTI; } - static constexpr size_t sDim() { return sizeof...(Indices); } - static constexpr size_t totalDim() { return (... * Indices::totalDim()); } + static constexpr SizeT sDim() { return sizeof...(Indices); } + static constexpr SizeT totalDim() { return (... * Indices::totalDim()); } static constexpr SpaceType STYPE = SpaceType::ANY; - static constexpr bool PARALLEL = std::tuple_element<0,std::tuple>::type::PARALLEL; + static constexpr bool PARALLEL = TupleElem<0,Tuple>::type::PARALLEL; private: IndexPack mIPack; - std::array mBlockSizes; + Arr mBlockSizes; + MultiIndex() = default; public: const IndexPack& pack() const { return mIPack; } - MultiIndex() = delete; - // NO DEFAULT HERE !!! // ( have to assign sub-indices (ptr!) correctly ) template - MultiIndex(const std::shared_ptr& range); + MultiIndex(const Sptr& range); - template + template MultiIndex& up(); - template + template MultiIndex& down(); - template + template auto get() const -> decltype( *std::get( mIPack ) )&; - template + template auto getPtr() const -> decltype( std::get( mIPack ) )&; - template - size_t getBlockSize() const { return std::get(mBlockSizes); } + template + SizeT getBlockSize() const { return std::get(mBlockSizes); } // raplace instances (in contrast to its analogon in ConstContainerIndex // MultiIndices CANNOT be influences be its subindices, so there is // NO foreign/external controll) // Do NOT share index instances between two or more MultiIndex instances - MultiIndex& operator()(std::shared_ptr&... indices); - MultiIndex& operator()(const std::tuple...>& indices); + MultiIndex& operator()(Sptr&... indices); + MultiIndex& operator()(const Tuple...>& indices); // ==== >>>>> STATIC POLYMORPHISM <<<<< ==== IndexType type() const; - MultiIndex& operator=(size_t pos); + MultiIndex& operator=(SizeT pos); MultiIndex& operator++(); MultiIndex& operator--(); - int pp(std::intptr_t idxPtrNum); - int mm(std::intptr_t idxPtrNum); + int pp(PtrId idxPtrNum); + int mm(PtrId idxPtrNum); std::string stringMeta() const; MetaType meta() const; MultiIndex& at(const MetaType& metaPos); - size_t dim(); + SizeT dim(); bool first(); bool last(); - std::shared_ptr range(); + Sptr range(); - template + template auto getPtr() -> decltype( std::get( mIPack ) )&; - size_t getStepSize(size_t n); + SizeT getStepSize(SizeT n); template - auto ifor(size_t step, Exprs exs) const; + auto ifor(SizeT step, Exprs exs) const; template - auto iforh(size_t step, Exprs exs) const; + auto iforh(SizeT step, Exprs exs) const; template - auto pifor(size_t step, Exprs exs) const; + auto pifor(SizeT step, Exprs exs) const; }; @@ -133,14 +124,14 @@ namespace CNORXZ typedef MultiRange oType; MultiRangeFactory() = delete; - MultiRangeFactory(const std::shared_ptr&... rs); + MultiRangeFactory(const Sptr&... rs); MultiRangeFactory(const typename MultiRange::Space& space); - virtual std::shared_ptr create() override; + virtual Sptr create() override; private: - std::shared_ptr checkIfCreated(const std::tuple...>& ptp); + Sptr checkIfCreated(const Tuple...>& ptp); }; @@ -153,9 +144,9 @@ namespace CNORXZ { public: typedef RangeBase RB; - typedef std::tuple...> Space; + typedef Tuple...> Space; typedef MultiIndex IndexType; - typedef std::tuple MetaType; + typedef Tuple MetaType; typedef MultiRange RangeType; typedef MultiRangeFactory FType; @@ -164,36 +155,36 @@ namespace CNORXZ MultiRange(const MultiRange& in) = delete; MultiRange& operator=(const MultiRange& in) = delete; - MultiRange(const std::shared_ptr&... rs); + MultiRange(const Sptr&... rs); MultiRange(const Space& space); Space mSpace; public: - static const size_t sdim = sizeof...(Ranges); + static const SizeT sdim = sizeof...(Ranges); - template + template auto get() const -> decltype( *std::get( mSpace ) )&; - size_t getMeta(const MetaType& metaPos) const; + SizeT getMeta(const MetaType& metaPos) const; - template + template auto getPtr() const -> decltype( std::get( mSpace ) )&; - virtual std::shared_ptr sub(size_t num) const override; + virtual Sptr sub(SizeT num) const override; - virtual size_t dim() const final; - virtual size_t size() const final; + virtual SizeT dim() const final; + virtual SizeT size() const final; virtual SpaceType spaceType() const final; virtual DataHeader dataHeader() const final; - virtual vector typeNum() const final; - virtual size_t cmeta(char* target, size_t pos) const final; - virtual size_t cmetaSize() const final; - virtual std::string stringMeta(size_t pos) const final; - virtual vector data() const final; + virtual Vector typeNum() const final; + virtual SizeT cmeta(char* target, SizeT pos) const final; + virtual SizeT cmetaSize() const final; + virtual std::string stringMeta(SizeT pos) const final; + virtual Vector data() const final; const Space& space() const; @@ -201,15 +192,15 @@ namespace CNORXZ virtual IndexType end() const final; template - auto cat(const std::shared_ptr >& erange) - -> std::shared_ptr >; + auto cat(const Sptr >& erange) + -> Sptr >; friend MultiRangeFactory; static constexpr bool HASMETACONT = false; static constexpr bool defaultable = false; - static constexpr size_t ISSTATIC = (... & Ranges::ISSTATIC); - static constexpr size_t SIZE = (... * Ranges::SIZE); + static constexpr SizeT ISSTATIC = (... & Ranges::ISSTATIC); + static constexpr SizeT SIZE = (... * Ranges::SIZE); }; } @@ -227,7 +218,7 @@ namespace CNORXZ } // -> define in range_base.cc - std::shared_ptr mkMULTI(const char** dp); + Sptr mkMULTI(const char** dp); /****************** * MultiIndex * @@ -235,8 +226,8 @@ namespace CNORXZ template template - MultiIndex::MultiIndex(const std::shared_ptr& range) : - IndexInterface,std::tuple >(range, 0) + MultiIndex::MultiIndex(const Sptr& range) : + IndexInterface,Tuple >(range, 0) { std::get(mBlockSizes) = 1; sfor_mn @@ -257,7 +248,7 @@ namespace CNORXZ } template - template + template MultiIndex& MultiIndex::up() { static_assert(DIR < sizeof...(Indices), "DIR exceeds number of sub-indices"); @@ -275,7 +266,7 @@ namespace CNORXZ } template - template + template MultiIndex& MultiIndex::down() { static_assert(DIR < sizeof...(Indices), "DIR exceeds number of sub-indices"); @@ -293,27 +284,27 @@ namespace CNORXZ } template - template + template auto MultiIndex::get() const -> decltype( *std::get( mIPack ) )& { return *std::get(mIPack); } template - template + template auto MultiIndex::getPtr() const -> decltype( std::get( mIPack ) )& { return std::get(mIPack); } template - MultiIndex& MultiIndex::operator()(std::shared_ptr&... indices) + MultiIndex& MultiIndex::operator()(Sptr&... indices) { return (*this)(std::make_tuple(indices...)); } template - MultiIndex& MultiIndex::operator()(const std::tuple...>& indices) + MultiIndex& MultiIndex::operator()(const Tuple...>& indices) { sfor_pn<0,sizeof...(Indices)> ( [&](auto i) { std::get(mIPack) = std::get(indices); return 0; } ); @@ -328,7 +319,7 @@ namespace CNORXZ } template - MultiIndex& MultiIndex::operator=(size_t pos) + MultiIndex& MultiIndex::operator=(SizeT pos) { IB::mPos = pos; RangeHelper::setIndexPack(mIPack, pos); @@ -365,7 +356,7 @@ namespace CNORXZ template - int MultiIndex::pp(std::intptr_t idxPtrNum) + int MultiIndex::pp(PtrId idxPtrNum) { const int tmp = RangeHelper::ppx(mIPack, mBlockSizes, idxPtrNum); IB::mPos += tmp; @@ -373,7 +364,7 @@ namespace CNORXZ } template - int MultiIndex::mm(std::intptr_t idxPtrNum) + int MultiIndex::mm(PtrId idxPtrNum) { const int tmp = RangeHelper::mmx(mIPack, mBlockSizes, idxPtrNum); IB::mPos -= tmp; @@ -407,7 +398,7 @@ namespace CNORXZ } template - size_t MultiIndex::dim() + SizeT MultiIndex::dim() { return sizeof...(Indices); } @@ -425,21 +416,21 @@ namespace CNORXZ } template - std::shared_ptr::RangeType> + Sptr::RangeType> MultiIndex::range() { return std::dynamic_pointer_cast( IB::mRangePtr ); } template - template + template auto MultiIndex::getPtr() -> decltype( std::get( mIPack ) )& { return std::get(mIPack); } template - size_t MultiIndex::getStepSize(size_t n) + SizeT MultiIndex::getStepSize(SizeT n) { if(n >= sizeof...(Indices)){ assert(0); @@ -450,21 +441,21 @@ namespace CNORXZ template template - auto MultiIndex::ifor(size_t step, Exprs exs) const + auto MultiIndex::ifor(SizeT step, Exprs exs) const { return RangeHelper::mkFor<0>(step, mIPack, mBlockSizes, exs); } template template - auto MultiIndex::iforh(size_t step, Exprs exs) const + auto MultiIndex::iforh(SizeT step, Exprs exs) const { return RangeHelper::mkForh<0>(step, mIPack, mBlockSizes, exs); } template template - auto MultiIndex::pifor(size_t step, Exprs exs) const + auto MultiIndex::pifor(SizeT step, Exprs exs) const { return RangeHelper::mkPFor<0>(step, mIPack, mBlockSizes, exs); } @@ -474,19 +465,19 @@ namespace CNORXZ *************************/ template - MultiRangeFactory::MultiRangeFactory(const std::shared_ptr&... rs) + MultiRangeFactory::MultiRangeFactory(const Sptr&... rs) { - mProd = std::shared_ptr< MultiRange >( new MultiRange( rs... ) ); + mProd = Sptr< MultiRange >( new MultiRange( rs... ) ); } template MultiRangeFactory::MultiRangeFactory(const typename MultiRange::Space& st) { - mProd = std::shared_ptr< MultiRange >( new MultiRange( st ) ); + mProd = Sptr< MultiRange >( new MultiRange( st ) ); } template - std::shared_ptr MultiRangeFactory::create() + Sptr MultiRangeFactory::create() { mProd = checkIfCreated( std::dynamic_pointer_cast( mProd )->mSpace ); setSelf(); @@ -494,14 +485,14 @@ namespace CNORXZ } template - std::shared_ptr MultiRangeFactory::checkIfCreated(const std::tuple...>& ptp) + Sptr MultiRangeFactory::checkIfCreated(const Tuple...>& ptp) { - std::shared_ptr out; + Sptr out; bool check = false; for(auto& x: MultiRangeFactoryProductMap::mAleadyCreated){ if(x.second.size() == sizeof...(Ranges)){ check = sfor_p<0,sizeof...(Ranges)> - ( [&](auto i) { return reinterpret_cast( std::get(ptp).get() ) == x.second[i]; }, + ( [&](auto i) { return reinterpret_cast( std::get(ptp).get() ) == x.second[i]; }, [&](auto a, auto b) { return a and b; } ); if(check){ out = x.first; @@ -510,9 +501,9 @@ namespace CNORXZ } } if(not check){ - vector pv(sizeof...(Ranges)); + Vector pv(sizeof...(Ranges)); sfor_pn<0,sizeof...(Ranges)> - ( [&](auto i) { pv[i] = reinterpret_cast( std::get(ptp).get() ); return 0; } ); + ( [&](auto i) { pv[i] = reinterpret_cast( std::get(ptp).get() ); return 0; } ); MultiRangeFactoryProductMap::mAleadyCreated[mProd] = pv; out = mProd; } @@ -524,33 +515,33 @@ namespace CNORXZ ******************/ template - MultiRange::MultiRange(const std::shared_ptr&... rs) : mSpace(std::make_tuple(rs...)) {} + MultiRange::MultiRange(const Sptr&... rs) : mSpace(std::make_tuple(rs...)) {} template MultiRange::MultiRange(const Space& space) : mSpace( space ) {} template - template + template auto MultiRange::get() const -> decltype( *std::get( mSpace ) )& { return *std::get(mSpace); } template - size_t MultiRange::getMeta(const MetaType& metaPos) const + SizeT MultiRange::getMeta(const MetaType& metaPos) const { return RangeHelper::getMeta(mSpace,metaPos); } template - template + template auto MultiRange::getPtr() const -> decltype( std::get( mSpace ) )& { return std::get(mSpace); } template - std::shared_ptr MultiRange::sub(size_t num) const + Sptr MultiRange::sub(SizeT num) const { assert(num < sizeof...(Indices)); return sforx_p<0,sizeof...(Indices)> @@ -559,13 +550,13 @@ namespace CNORXZ } template - size_t MultiRange::dim() const + SizeT MultiRange::dim() const { return sdim; } template - size_t MultiRange::size() const + SizeT MultiRange::size() const { return sfor_p<0,sizeof...(Ranges)> ( [&](auto i) { return std::get(mSpace)->size(); }, @@ -585,29 +576,29 @@ namespace CNORXZ } template - vector MultiRange::typeNum() const + Vector MultiRange::typeNum() const { - vector o; + Vector o; RangeHelper::getTypeNum(o,mSpace); return o; } template - size_t MultiRange::cmeta(char* target, size_t pos) const + SizeT MultiRange::cmeta(char* target, SizeT pos) const { - const size_t off = cmetaSize(); + const SizeT off = cmetaSize(); MetaType* xtarget = reinterpret_cast(target); return RangeHelper::getCMeta(xtarget,pos,mSpace,off); } template - size_t MultiRange::cmetaSize() const + SizeT MultiRange::cmetaSize() const { return RangeHelper::getCMetaSize<0>(mSpace); } template - std::string MultiRange::stringMeta(size_t pos) const + std::string MultiRange::stringMeta(SizeT pos) const { auto i = begin(); i = pos; @@ -615,16 +606,16 @@ namespace CNORXZ } template - vector MultiRange::data() const + Vector MultiRange::data() const { DataHeader h = dataHeader(); - vector out; + Vector out; //out.reserve(h.metaSize + sizeof(DataHeader)); char* hcp = reinterpret_cast(&h); out.insert(out.end(), hcp, hcp + sizeof(DataHeader)); sfor_pn<0,sizeof...(Ranges)> ( [&](auto i) { - vector part = std::get(mSpace)->data(); + Vector part = std::get(mSpace)->data(); out.insert(out.end(), part.begin(), part.end()); return 0; } ); @@ -646,7 +637,7 @@ namespace CNORXZ { MultiIndex i( std::dynamic_pointer_cast > - ( std::shared_ptr( RB::mThis ) ) ); + ( Sptr( RB::mThis ) ) ); i = 0; return i; } @@ -656,15 +647,15 @@ namespace CNORXZ { MultiIndex i( std::dynamic_pointer_cast > - ( std::shared_ptr( RB::mThis )) ); + ( Sptr( RB::mThis )) ); i = size(); return i; } template template - auto MultiRange::cat(const std::shared_ptr >& erange) - -> std::shared_ptr > + auto MultiRange::cat(const Sptr >& erange) + -> Sptr > { auto crange = std::tuple_cat(mSpace, erange->space()); MultiRangeFactory rf(crange); diff --git a/src/include/ranges/range_base.h b/src/include/ranges/range_base.h index ff39e63..ac31ea5 100644 --- a/src/include/ranges/range_base.h +++ b/src/include/ranges/range_base.h @@ -3,21 +3,12 @@ #ifndef __cxz_range_base_h__ #define __cxz_range_base_h__ -#include -#include -#include - -#include "rbase_def.h" - -namespace CNORXZ -{ - class RangeBase; -} +#include "base/base.h" namespace CNORXZ { - size_t indexId(); + SizeT indexId(); enum class SpaceType { @@ -33,17 +24,19 @@ namespace CNORXZ struct DataHeader { public: - static constexpr size_t VERSION = 1; // fixed by version of this repository ! + static constexpr SizeT VERSION = 1; // fixed by version of this repository ! private: - size_t version = VERSION; + SizeT version = VERSION; public: int spaceType = static_cast( SpaceType::NONE ); - size_t metaSize = 0; // size of meta data + SizeT metaSize = 0; // size of meta data int multiple = 0; // = 1 if multi range int metaType = 0; // type of meta data - inline size_t v() const { return version; } + inline SizeT v() const { return version; } }; - + + typedef Sptr RangePtr; + class RangeFactoryBase { public: @@ -51,19 +44,25 @@ namespace CNORXZ RangeFactoryBase() = default; virtual ~RangeFactoryBase() = default; - // should return mProd !! - virtual std::shared_ptr create() = 0; + RangePtr create(); protected: - std::shared_ptr mProd; + virtual void make() = 0; + + RangePtr fromCreated(const TypeInfo& info, const Vector& rids) const; + void addToCreated(const TypeInfo& info, const Vector& rids, const RangePtr& r); + + RangePtr mProd; + + private: + // also add single ranges here (PtrId -> own) + static Map,RangePtr>> sCreated; - // call this function before returning product !! - void setSelf(); }; - std::shared_ptr createRangeFactory(const char** dp); - std::shared_ptr createSingleRangeFactory(const vector*& d, int metaType, size_t size); + Sptr createRangeFactory(const char** dp); + Sptr createSingleRangeFactory(const Vector*& d, int metaType, SizeT size); class RangeBase { @@ -71,28 +70,28 @@ namespace CNORXZ virtual ~RangeBase() = default; - virtual size_t size() const = 0; - virtual size_t dim() const = 0; + virtual SizeT size() const = 0; + virtual SizeT dim() const = 0; bool operator==(const RangeBase& in) const; bool operator!=(const RangeBase& in) const; - std::intptr_t id() const; + virtual TypeInfo type() const = 0; + PtrId id() const; XIndexPtr beginX() const; XIndexPtr endX() const; - virtual vector typeNum() const = 0; - virtual size_t cmeta(char* target, size_t pos) const = 0; - virtual size_t cmetaSize() const = 0; - virtual std::string stringMeta(size_t pos) const = 0; - virtual vector data() const = 0; // usefull when writing to files, etc... + virtual Vector typeNum() const = 0; + virtual SizeT cmeta(char* target, SizeT pos) const = 0; + virtual SizeT cmetaSize() const = 0; + virtual String stringMeta(SizeT pos) const = 0; + virtual Vector data() const = 0; // usefull when writing to files, etc... virtual SpaceType spaceType() const = 0; virtual DataHeader dataHeader() const = 0; - virtual std::shared_ptr sub(size_t num) const { return std::shared_ptr(); } - virtual std::shared_ptr aindex() const = 0; + virtual RangePtr sub(SizeT num) const { return RangePtr(); } friend RangeFactoryBase; @@ -103,7 +102,7 @@ namespace CNORXZ }; template - inline std::shared_ptr mkIndexWrapper(const Index& i); + inline Sptr mkIndexWrapper(const Index& i); template class RangeInterface : public RangeBase @@ -117,18 +116,15 @@ namespace CNORXZ virtual Index begin() const = 0; virtual Index end() const = 0; - std::shared_ptr beginPtr() const { return std::make_shared(this->begin()); } - std::shared_ptr endPtr() const { return std::make_shared(this->end()); } - virtual std::shared_ptr aindex() const override final + Sptr beginPtr() const { return std::make_shared(this->begin()); } + Sptr endPtr() const { return std::make_shared(this->end()); } + virtual Sptr aindex() const override final { return mkIndexWrapper(this->begin()); } - //{ auto i = std::make_shared(this->begin()); return std::make_shared>(i); } //!!! - //{ auto i = std::make_shared(this->begin()); return nullptr; } //!!! protected: RangeInterface() = default; }; - typedef std::shared_ptr RangePtr; RangePtr operator*(const RangePtr& a, const RangePtr& b); // -> Ptr to MultiRange } diff --git a/src/include/ranges/ranges.cc.h b/src/include/ranges/ranges.cc.h new file mode 100644 index 0000000..51d721c --- /dev/null +++ b/src/include/ranges/ranges.cc.h @@ -0,0 +1,2 @@ + +#include "xindex.cc.h" diff --git a/src/include/ranges/ranges.h b/src/include/ranges/ranges.h new file mode 100644 index 0000000..0159ac6 --- /dev/null +++ b/src/include/ranges/ranges.h @@ -0,0 +1,10 @@ + +#include "index_base.h" +#include "multi_range.h" +#include "range_base.h" +#include "range_helper.h" +#include "single_range.h" +//#include "subrange.h" +//#include "value_range.h" +#include "xindex.h" +#include "yindex.h" diff --git a/src/include/xfor/exttype.h b/src/include/ranges/xfor/exttype.h similarity index 100% rename from src/include/xfor/exttype.h rename to src/include/ranges/xfor/exttype.h diff --git a/src/include/xfor/for_type.h b/src/include/ranges/xfor/for_type.h similarity index 100% rename from src/include/xfor/for_type.h rename to src/include/ranges/xfor/for_type.h diff --git a/src/include/xfor/for_utils.h b/src/include/ranges/xfor/for_utils.h similarity index 100% rename from src/include/xfor/for_utils.h rename to src/include/ranges/xfor/for_utils.h diff --git a/src/include/xfor/iloop.h b/src/include/ranges/xfor/iloop.h similarity index 100% rename from src/include/xfor/iloop.h rename to src/include/ranges/xfor/iloop.h diff --git a/src/include/xfor/xfor.h b/src/include/ranges/xfor/xfor.h similarity index 100% rename from src/include/xfor/xfor.h rename to src/include/ranges/xfor/xfor.h diff --git a/src/include/ranges/xindex.cc.h b/src/include/ranges/xindex.cc.h new file mode 100644 index 0000000..ec5d29e --- /dev/null +++ b/src/include/ranges/xindex.cc.h @@ -0,0 +1,95 @@ + +#ifndef __cxz_xindex_cc_h__ +#define __cxz_xindex_cc_h__ + +#include "xindex.h" + +namespace CNORXZ +{ + /************** + * XIndex * + **************/ + + template + XIndex::XIndex(const IndexPtr& i) : mI(i) {} + + template + XIndex& XIndex::operator=(size_t pos) + { + *mI = pos; + return *this; + } + + template + XIndex& XIndex::operator++() + { + ++(*mI); + return *this; + } + + template + XIndex& XIndex::operator--() + { + --(*mI); + return *this; + } + + template + int XIndex::pp(std::intptr_t idxPtrNum) + { + return mI->pp(idxPtrNum); + } + + template + int XIndex::mm(std::intptr_t idxPtrNum) + { + return mI->mm(idxPtrNum); + } + + template + size_t XIndex::dim() const + { + return mI->dim(); + } + + template + size_t XIndex::getStepSize(size_t n) const + { + return mI->getStepSize(n); + } + + template + std::string XIndex::stringMeta() const + { + return mI->stringMeta(); + } + + template + DType XIndex::meta() const + { + return DType(mI->meta()); + } + + template + XIndexBase& XIndex::at(const DType& meta) + { + // check!!! + mI->at(std::any_cast(meta.get())); + return *this; + } + + template + DynamicExpression XIndex::ifor(size_t step, DynamicExpression ex) const + { + return mI->ifor(step, ex); + } + + template + DynamicExpression XIndex::iforh(size_t step, DynamicExpression ex) const + { + return mI->iforh(step, ex); + } + +} + +#endif diff --git a/src/include/ranges/xindex.h b/src/include/ranges/xindex.h new file mode 100644 index 0000000..b16d5d2 --- /dev/null +++ b/src/include/ranges/xindex.h @@ -0,0 +1,64 @@ + +#ifndef __cxz_xindex_h__ +#define __cxz_xindex_h__ + +#include "base/base.h" +#include "range_base.h" +#include "index_base.h" + +namespace CNORXZ +{ + // Future IndexWrapper + class XIndexBase : public IndexInterface + { + public: + DEFAULT_MEMBERS(XIndexBase); + + constexpr IndexType type() const; + + virtual XIndexBase& operator=(size_t pos) = 0; + virtual XIndexBase& operator++() = 0; + virtual XIndexBase& operator--() = 0; + virtual int pp(std::intptr_t idxPtrNum) = 0; + virtual int mm(std::intptr_t idxPtrNum) = 0; + virtual size_t dim() const = 0; + virtual size_t getStepSize(size_t n) const = 0; + virtual std::string stringMeta() const = 0; + virtual DType meta() const = 0; + virtual XIndexBase& at(const DType& meta) = 0; + virtual DynamicExpression ifor(size_t step, DynamicExpression ex) const = 0; + virtual DynamicExpression iforh(size_t step, DynamicExpression ex) const = 0; + // ...!!! + }; + + typedef std::shared_ptr XIndexPtr; + + // MultiIndex Wrapper: + template + class XIndex : public XIndexBase + { + private: + IndexPtr mI; + + public: + DEFAULT_MEMBERS(XIndex); + XIndex(const IndexPtr& i); + + virtual XIndex& operator=(size_t pos) override; + virtual XIndex& operator++() override; + virtual XIndex& operator--() override; + virtual int pp(std::intptr_t idxPtrNum) override; + virtual int mm(std::intptr_t idxPtrNum) override; + virtual size_t dim() const override; + virtual size_t getStepSize(size_t n) const override; + virtual std::string stringMeta() const override; + virtual DType meta() const override; + virtual XIndexBase& at(const DType& meta) override; + virtual DynamicExpression ifor(size_t step, DynamicExpression ex) const override; + virtual DynamicExpression iforh(size_t step, DynamicExpression ex) const override; + // ....!!!! + }; + +} + +#endif diff --git a/src/include/ranges/yindex.h b/src/include/ranges/yindex.h new file mode 100644 index 0000000..3543926 --- /dev/null +++ b/src/include/ranges/yindex.h @@ -0,0 +1,48 @@ + +#ifndef __cxz_yindex_h__ +#define __cxz_yindex_h__ + +#include "base/base.h" +#include "ranges/range_base.h" +#include "ranges/index_base.h" +#include "xfor/xfor.h" + +namespace CNORXZ +{ + // Future DynamicIndex + //class YIndex : public IndexInterface + class YIndex : public XIndexBase + { + public: + typedef IndexInterface IB; + + private: + RangePtr mRange; + vector mIs; + std::vector mBlockSizes; // dim() elements only!!! + bool mExternalControl = false; + + public: + + DEFAULT_MEMBERS(YIndex); + YIndex(const RangePtr& range); + YIndex(const RangePtr& range, const std::vector& is); + + YIndex& operator=(size_t pos); + YIndex& operator++(); + YIndex& operator--(); + int pp(std::intptr_t idxPtrNum); + int mm(std::intptr_t idxPtrNum); + size_t dim() const; + size_t getStepSize(size_t n) const; + std::string stringMeta() const; + DType meta() const; + YIndex& at(const DType& meta); + DynamicExpression ifor(size_t step, DynamicExpression ex) const; + DynamicExpression iforh(size_t step, DynamicExpression ex) const; + }; + + typedef std::shared_ptr YIndexPtr; +} + +#endif diff --git a/src/include/statics/traits.h b/src/include/statics/traits.h index 9f16627..aac875e 100644 --- a/src/include/statics/traits.h +++ b/src/include/statics/traits.h @@ -14,12 +14,12 @@ namespace CNORXZ static constexpr bool VALUE = true; \ } - add_array_trait(ArrayBase); - add_array_trait(MutableArrayBase); - add_array_trait(Array); - add_array_trait(FunctionalArray); - add_array_trait(Slice); - add_array_trait(ConstSlice); + add_array_trait(DArrayBase); + add_array_trait(MDArrayBase); + add_array_trait(DArray); + //add_array_trait(FunctionalArray); + //add_array_trait(Slice); + //add_array_trait(ConstSlice); #undef add_array_trait diff --git a/src/include/helper_tools.cc.h b/src/include/utils/helper_tools.cc.h similarity index 100% rename from src/include/helper_tools.cc.h rename to src/include/utils/helper_tools.cc.h diff --git a/src/include/helper_tools.h b/src/include/utils/helper_tools.h similarity index 100% rename from src/include/helper_tools.h rename to src/include/utils/helper_tools.h diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index ce7ba5a..1a50051 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -1,42 +1,20 @@ -#execute_process ( COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/mk_hl_op.sh -# WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ ) - set(libcnorxz_a_SOURCES ${CMAKE_SOURCE_DIR}/src/lib/ranges/range_base.cc - ${CMAKE_SOURCE_DIR}/src/lib/ranges/anonymous_range.cc - ${CMAKE_SOURCE_DIR}/src/lib/ranges/dynamic_meta.cc - ${CMAKE_SOURCE_DIR}/src/lib/ranges/dynamic_range.cc - ${CMAKE_SOURCE_DIR}/src/lib/ranges/type_map.cc - ${CMAKE_SOURCE_DIR}/src/lib/ranges/multi_range_factory_product_map.cc - ${CMAKE_SOURCE_DIR}/src/lib/map_range_factory_product_map.cc + ${CMAKE_SOURCE_DIR}/src/lib/ranges/yindex.cc ) -#set(libhlcnorxz_a_SOURCES -# ${CMAKE_SOURCE_DIR}/src/lib/high_level_operation.cc -# ) -#message(WARNING ${libhlcnorxz_a_SOURCES}) - file(GLOB cc_files "${CMAKE_SOURCE_DIR}/src/lib/ranges/range_types/*.cc") foreach(ccfile ${cc_files}) set(libcnorxz_a_SOURCES ${libcnorxz_a_SOURCES} ${ccfile}) endforeach(ccfile) -#file(GLOB cc_files "${CMAKE_SOURCE_DIR}/src/lib/hl_ops/*.cc") -#foreach(ccfile ${cc_files}) -# set(libhlcnorxz_a_SOURCES ${libhlcnorxz_a_SOURCES} -# ${ccfile}) -#endforeach(ccfile) - add_library(cnorxz_obj OBJECT ${libcnorxz_a_SOURCES} ) -#add_library(hlcnorxz_obj OBJECT -# ${libhlcnorxz_a_SOURCES} -# ) + set_target_properties(cnorxz_obj PROPERTIES POSITION_INDEPENDENT_CODE TRUE) -#set_target_properties(hlcnorxz_obj PROPERTIES POSITION_INDEPENDENT_CODE TRUE) add_library(cnorxz SHARED $ @@ -48,16 +26,6 @@ add_library(cnorxz_static ) set_target_properties(cnorxz_obj PROPERTIES POSITION_INDEPENDENT_CODE TRUE) -#add_library(hlcnorxz SHARED -# $ -# ) -#set_target_properties(hlcnorxz PROPERTIES POSITION_INDEPENDENT_CODE TRUE) - -#add_library(hlcnorxz_static -# $ -# ) -#set_target_properties(hlcnorxz_obj PROPERTIES POSITION_INDEPENDENT_CODE TRUE) - install(TARGETS cnorxz ARCHIVE DESTINATION ${INSTALL_PATH}/lib LIBRARY DESTINATION ${INSTALL_PATH}/lib) @@ -65,11 +33,3 @@ install(TARGETS cnorxz install(TARGETS cnorxz_static ARCHIVE DESTINATION ${INSTALL_PATH}/lib LIBRARY DESTINATION ${INSTALL_PATH}/lib) - -#install(TARGETS hlcnorxz -# ARCHIVE DESTINATION ${INSTALL_PATH}/lib -# LIBRARY DESTINATION ${INSTALL_PATH}/lib) - -#install(TARGETS hlcnorxz_static -# ARCHIVE DESTINATION ${INSTALL_PATH}/lib -# LIBRARY DESTINATION ${INSTALL_PATH}/lib) diff --git a/src/lib/ranges/range_base.cc b/src/lib/ranges/range_base.cc index ba8a3be..3def0e2 100644 --- a/src/lib/ranges/range_base.cc +++ b/src/lib/ranges/range_base.cc @@ -1,199 +1,36 @@ -// -//#include "ranges/single_range.h" -#include "ranges/type_map.h" -#include "ranges/rheader.h" -#include "ranges/range_types/header.h" - #include "ranges/range_base.h" -#include "ranges/ranges_header.cc.h" -#include "ranges/range_helper.h" - -#include namespace CNORXZ { - - //using namespace CNORXZInternals; - - template - using STP = std::tuple...>; - - typedef vector > RVEC; - - template - inline bool compareSpaceTypes(const RVEC& rvec) - { - return RangeHelper::compareSpaceTypes(rvec); - } - - template - inline bool setFactory(const RVEC& rvec, std::shared_ptr& fptr) - { - if(compareSpaceTypes(rvec)) { - STP stp; - RangeHelper::setSpace(rvec, stp); - fptr = std::make_shared >(stp); - return true; - } - else { - return false; - } - } - - size_t indexId() - { - static size_t id = 0; - ++id; - return id; - } - - std::shared_ptr mkMULTI(char const** dp, size_t metaSize) - { - std::shared_ptr out = nullptr; - RVEC rvec(metaSize); - for(size_t i = 0; i != metaSize; ++i){ - auto ff = createRangeFactory(dp); - rvec[i] = ff->create(); - } - - if(metaSize == 0){ - assert(0); - } - else if(metaSize == 1) { -#define register_multi1(TT0) if(setFactory(rvec, out)) {} else -#include "ranges/multi_range_register.h" -#undef register_multi1 - assert(0); - } - else if(metaSize == 2) { -#define register_multi2(TT0,TT1) if(setFactory(rvec, out)) {} else -#include "ranges/multi_range_register.h" -#undef register_multi2 - assert(0); - } - else if(metaSize == 3) { -#define register_multi3(TT0,TT1,TT2) if(setFactory(rvec, out)) {} else -#include "ranges/multi_range_register.h" -#undef register_multi3 - assert(0); - } - else if(metaSize == 4) { -#define register_multi4(TT0,TT1,TT2,TT3) if(setFactory(rvec, out)) {} else -#include "ranges/multi_range_register.h" -#undef register_multi4 - assert(0); - } - else { - assert(0); - } - - return out; - } - - std::shared_ptr mkANONYMOUS(char const** dp, size_t metaSize) - { - std::shared_ptr out = nullptr; - auto arf = std::make_shared(); - for(size_t i = 0; i != metaSize; ++i){ - auto ff = createRangeFactory(dp); - arf->append( ff->create() ); - } - out = arf; - return out; - } - - - std::shared_ptr mkANY(int metaType, size_t metaSize, char const** dp) - { - std::shared_ptr out = nullptr; - if(metaType == -1){ - assert(0); - } -#define register_type(x) else if(x == metaType) { \ - vector::type> vd; \ - metaCat(vd, *dp, metaSize); \ - out = std::make_shared::type, \ - SpaceType::ANY> >(vd); } -#include "ranges/type_map.h" -#undef register_type - else { - assert(0); - } - return out; - } - - std::shared_ptr createSingleRangeFactory(const vector*& d, int metaType, size_t size) - { - std::shared_ptr out = nullptr; - if(metaType == -1){ - assert(0); - } -#define register_type(x) else if(x == metaType) { \ - vector::type> vd(size); \ - std::transform(d,d+size,vd.begin(), \ - [](const vector& c) \ - { assert(c.size() == sizeof(TypeMap::type)); \ - return *reinterpret_cast::type const*>(c.data()); }); \ - out = std::make_shared::type, \ - SpaceType::ANY> >(vd); } -#include "ranges/type_map.h" -#undef register_type - else { - assert(0); - } - return out; - } - - std::shared_ptr createRangeFactory(char const** dp) - { - DataHeader h = *reinterpret_cast(*dp); - *dp += sizeof(DataHeader); - - std::shared_ptr out = nullptr; - - if(h.multiple != 0){ - if(h.spaceType == static_cast( SpaceType::ANY )) { - // multi range - out = mkMULTI(dp, h.metaSize); - } - else if(h.spaceType == static_cast( SpaceType::ANON ) ) { - // anonymous range - out = mkANONYMOUS(dp, h.metaSize); - } - else { - assert(0); - } - } - else { - if(h.spaceType == static_cast( SpaceType::ANY ) ) { - // generic single range - out = mkANY(h.metaType, h.metaSize, dp); - } - else if(h.spaceType == static_cast( SpaceType::NONE ) ) { - // classic range - size_t size = *reinterpret_cast(*dp); - out = std::make_shared >(size); - } -#define include_range_type(x,n) else if(h.spaceType == static_cast( SpaceType::x ) ) { \ - out = mk##x(*dp, h.metaSize); } -#include "ranges/range_types/header.h" -#undef inlcude_range_type - else { - assert(0); - } - *dp += h.metaSize; - } - return out; - } /************************* * RangeFactoryBase * *************************/ + + static Map,RangePtr>> RangeFactoryBase::sCreated; - void RangeFactoryBase::setSelf() + RangePtr RangeFactoryBase::create() { + mProd = this->make(); mProd->mThis = mProd; + return mProd; + } + + RangePtr RangeFactoryBase::fromCreated(const TypeInfo& info, const Vector& rids) const + { + RangePtr out = nullptr; + if(sCreated.count(info) != 0){ + if(sCreated[info].count(rids) != 0){ + out = sCreated[info][rids]; + } + } + return out; + } + + void RangeFactoryBase::addToCreated(const TypeInfo& info, const Vector& rids, const RangePtr& r) + { + sCreated[info][rids] = r; } /****************** diff --git a/src/lib/dcontainer_index.cc b/src/lib/ranges/yindex.cc similarity index 65% rename from src/lib/dcontainer_index.cc rename to src/lib/ranges/yindex.cc index edd0495..105f31d 100644 --- a/src/lib/dcontainer_index.cc +++ b/src/lib/ranges/yindex.cc @@ -1,66 +1,67 @@ -#include "dcontainer_index.h" +#include "ranges/yindex.h" namespace CNORXZ { YIndex::YIndex(const RangePtr& range) : - IndexInterface(range, 0) + mIs(mRange.dim()), mBlockSizes(mRange.dim()), mExternalControl(false) { - //...!!! + // init ...!!! } - - YIndex::YIndex(const RangePtr& range, const std::vector& is) : - IndexInterface(range, 0) + + YIndex::YIndex(const RangePtr& range, const Vector& is) : + mIs(is), mBlockSizes(mRange.dim()), mExternalControl(false) { - //...!!! + CXZ_ASSERT(mIs.size() == mRange.dim(), "obtained wrong number of indices"); + // init ...!!! } YIndex& YIndex::operator=(size_t pos) { IB::mPos = pos; - // sub inds...!!! + // sub inds... (LAZY!!!) !!! return *this; } YIndex& YIndex::operator++() { if(mExternalControl) this->sync(); - // increment sub inds !!! + // increment sub inds (LAZY!!!) !!! ++mPos; return *this; } - + YIndex& YIndex::operator--() { if(mExternalControl) this->sync(); - // decrement sub inds !!! + // decrement sub inds (LAZY!!!) !!! --mPos; return *this; } - + int YIndex::pp(std::intptr_t idxPtrNum) { } - + int YIndex::mm(std::intptr_t idxPtrNum) { } - + size_t YIndex::dim() const { - return mIs.size(); + return mRange->dim(); } - + size_t YIndex::getStepSize(size_t n) const { - + } - - std::string YIndex::stringMeta() const + + String YIndex::stringMeta() const { - std::string out = "["; + String out = "["; auto it = mIs.begin(); for(; it != mIs.end()-1; ++it){ out += it->stringMeta() + "," @@ -68,33 +69,33 @@ namespace CNORXZ out += it->stringMeta() + "]" return out; } - + DType YIndex::meta() const { //this->sync(); - vector v(mIs.size()); + Vector v(mIs.size()); std::transform(mIs.begin(), mIs.end(), v.begin(), [](auto& x) { return x->meta() }); return DType(v); } - + YIndex& YIndex::at(const DType& meta) { - auto& v = std::any_cast&>(meta.get()); + auto& v = std::any_cast&>(meta.get()); assert(v.size() == mIs.size()); for(size_t i = 0; i != mIs.size()){ mIs[i]->at(v[i]); } return *this; } - + DynamicExpression YIndex::ifor(size_t step, DynamicExpression ex) const { } - + DynamicExpression YIndex::iforh(size_t step, DynamicExpression ex) const { } - -} // namespace CNORXZ + +} diff --git a/src/opt/COMMENT b/src/opt/COMMENT new file mode 100644 index 0000000..3b9fd30 --- /dev/null +++ b/src/opt/COMMENT @@ -0,0 +1 @@ +wrappers for usage with external libraries diff --git a/src/opt/cereal/COMMENT b/src/opt/cereal/COMMENT new file mode 100644 index 0000000..6ed9dd6 --- /dev/null +++ b/src/opt/cereal/COMMENT @@ -0,0 +1 @@ +coming soon diff --git a/src/opt/hdf5/COMMENT b/src/opt/hdf5/COMMENT new file mode 100644 index 0000000..6ed9dd6 --- /dev/null +++ b/src/opt/hdf5/COMMENT @@ -0,0 +1 @@ +coming soon diff --git a/src/opt/mpi/COMMENT b/src/opt/mpi/COMMENT new file mode 100644 index 0000000..6ed9dd6 --- /dev/null +++ b/src/opt/mpi/COMMENT @@ -0,0 +1 @@ +coming soon diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index d284997..cdb019f 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -1,4 +1,10 @@ +add_definitions("-DTEST_NUMBER_FILE=${CMAKE_SOURCE_DIR}/src/tests/numbers.txt") + +set(test_SOURCES + ${CMAKE_SOURCE_DIR}/src/tests/test_numbers.cc +) + #add_executable(iutest ranges/index_unit_test.cc) #add_dependencies(iutest cnorxz) #target_link_libraries(iutest ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} cnorxz) @@ -14,7 +20,7 @@ #target_link_libraries(mautest ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} cnorxz) #add_test(NAME mautest COMMAND mautest) -add_executable(dautest darray_unit_test.cc) +add_executable(dautest darray_unit_test.cc ${test_SOURCES}) add_dependencies(dautest cnorxz) target_link_libraries(dautest ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} cnorxz) add_test(NAME dautest COMMAND dautest) diff --git a/src/tests/numbers.txt b/src/tests/numbers.txt new file mode 100644 index 0000000..00dad40 --- /dev/null +++ b/src/tests/numbers.txt @@ -0,0 +1,10001 @@ +10000 +-7.817620348532174 +19.20591204498905 +-9.388674220631525 +4.551874631580226 +-2.7482104682130135 +4.089006976068585 +-11.113358565521562 +14.759346909380213 +-13.801338638761447 +1.8520000080901653 +-13.775111807528454 +-2.521796284410879 +8.288924189691535 +-7.78751285286412 +-8.330367593924812 +11.538603206021705 +-9.844136244873543 +-10.932669335696827 +18.55908574977854 +-17.691497339121348 +8.029502892677542 +-15.447097913716487 +17.24848600249571 +3.8756526905041646 +17.95148753272087 +-14.590249322958812 +2.1691637164504662 +16.639431861651765 +18.09780741060858 +2.3759557562284392 +19.538302427938618 +-6.341839020786617 +-1.573165690337678 +-1.126513318993986 +18.722126502359345 +-11.922766911855058 +19.03654942388109 +-6.493934962276295 +19.01052616177678 +5.912790045448247 +-16.00896256296273 +18.993453947580896 +-13.17865048385011 +0.7029103567193964 +18.724285191973614 +10.323948039913702 +6.5353553918205165 +2.7459974337631294 +-19.818611591523698 +19.712681655164197 +17.60021239295557 +6.234849634148304 +-12.325840617896567 +-11.75882646974948 +10.825036969581838 +-1.8867932266718483 +13.0218689602234 +1.748927789066581 +-15.430121812606536 +-19.877438054352176 +-12.969586661560978 +11.86830522892815 +-13.376714379332903 +19.575477275171096 +8.546590589425975 +6.481221879228272 +-5.047884711523718 +15.202761849546953 +2.3008955079019557 +11.792162728888314 +6.356823578179849 +8.370926286866908 +-14.055888951334232 +9.320755181394233 +13.215154202591151 +10.021087458653689 +-5.310417159780627 +-13.877179092621251 +-5.441119378462673 +-18.29284501432975 +-14.467161695806183 +17.563622640837252 +16.779737423862464 +6.256598238179372 +17.74346015065518 +2.7354361764470667 +-19.145979213781864 +12.99817123745499 +3.1122434329064745 +10.041905321149102 +16.877934363771985 +-15.001496700704635 +1.7896379124280735 +-4.808339798825925 +3.660940767657163 +-6.618767515985841 +0.4419235544356397 +-17.811648885206 +-10.423211690145786 +-6.50572789021027 +13.29504027492603 +8.059491055165289 +-17.58492964600491 +-14.010963109635167 +6.239018281990354 +5.005841130089422 +-14.803299680502843 +18.480117643057334 +-11.73247958508981 +4.407160403850817 +-14.457658122048782 +-6.392953651024573 +-15.471484841962887 +12.359359830822982 +12.336608777635242 +-2.6990454654833655 +-16.359740933068082 +-14.46215003805657 +-18.825398363325316 +-11.220692722992665 +-19.09357997160739 +13.624820637403516 +-9.184378515477011 +-3.161851944987358 +11.660533483839849 +15.6038060067984 +10.179829703333283 +17.547133111665694 +-0.9237782447678455 +8.415986476467975 +11.792408614570785 +7.355448878630998 +13.855921791878323 +11.202671700256314 +14.06802315934086 +-2.212069427352297 +-19.33156373084257 +11.969126091774704 +-11.294590216492807 +8.558587812697187 +-17.869731329052335 +-5.102761027233672 +-16.0622074516207 +7.444465181284961 +6.961897296738194 +5.760011313918948 +8.632397377100563 +-12.592698950870087 +-18.981821691751904 +18.86460051128615 +4.958243873860244 +13.518888057186857 +-3.3218771584563243 +-15.669446716080188 +-9.59227178976423 +-3.8500165644608657 +2.8823228450708918 +5.822603075842757 +10.782666706587168 +-6.01934413026556 +9.125532474847518 +-9.651202250965166 +4.045345893829861 +-5.9069251553026945 +-3.0718783129024594 +-5.875240471956808 +15.778013499844583 +-8.770873023063114 +-17.07786053670955 +10.687358359931565 +0.2619056979058385 +11.418881571135351 +2.861298904365203 +0.33408933750742165 +-11.4885225713688 +12.012579812268143 +-5.425249783236371 +19.101084132484104 +8.731129457043387 +1.4988571082042697 +10.55764897822515 +-15.681548250207037 +-6.82333415622351 +-15.533116988183298 +13.785163695003376 +-5.362458185993134 +4.744099806725398 +3.5641431561872636 +4.506058704027346 +1.5155653676428642 +17.662143826050084 +7.483012158320005 +19.6650235619501 +-17.092457508801914 +3.0246910608826454 +0.7758874439277577 +-15.381102591896374 +7.479290467222064 +1.2301875351964924 +14.80070226511841 +8.132018652865924 +18.79544705723108 +3.9521309229586343 +5.336290436073057 +-14.215262145803024 +6.029632989230475 +-12.431071305579856 +8.833364654964466 +-0.4463777173912007 +13.918630545952695 +11.42089055438607 +17.433560026232293 +17.23531182697539 +2.8147772103673177 +-11.638450999410432 +11.343378164476867 +-16.359060751655758 +-18.49919679436907 +13.730359768781128 +2.441038195765085 +6.393764373930047 +4.554395864551562 +6.232234894985776 +-15.204309005711899 +-6.103852762036084 +9.575955035749594 +-15.05046528680312 +-2.1862760178727356 +12.562593406843263 +-10.846442564331177 +-2.8733741746131223 +-6.519492993318764 +-1.7277033564516628 +-12.562885614341909 +-9.56234728851463 +6.65602953955052 +9.273058508062348 +9.031756101974672 +17.576992504643897 +-1.7050071975607821 +5.884321944305881 +-14.241018219658494 +4.780427273657288 +-6.121736620814531 +2.0896367900957173 +-1.7008623924699187 +2.3672055862007895 +-7.592617842908233 +19.94149901706806 +-0.9443480703793625 +-14.615675144454642 +19.033074625052777 +-16.820379330693772 +-4.337628240656848 +18.00425240780841 +-15.97915882485642 +9.815924616581473 +19.397478150040158 +-13.298005381328387 +3.0121468285375563 +0.9953089547411906 +-15.275051889074112 +12.277595602758915 +17.672857925398027 +-7.720595109516708 +13.408189281619158 +-14.569084279921093 +7.501120080335699 +-11.779005517382375 +13.130813554171944 +19.552993675452953 +-19.68703139007566 +-14.031997975719284 +18.780852874270963 +-17.326979364261902 +-4.821878886684816 +11.051028158974997 +19.74513019427046 +1.9429489555842316 +12.1848011594953 +19.44792303730911 +7.015371663506187 +-5.286336291611313 +16.53884634473939 +-17.80648138176059 +-9.136268149030403 +-10.830807742964321 +1.0107926137584187 +-15.499071625149217 +15.219158229518037 +-12.64329622681748 +-14.392145655574176 +-7.004115129158976 +2.597410806295141 +3.0762984388245798 +5.810761674128212 +10.119072240928652 +3.9392370835116566 +-17.52148756007566 +-15.597051486439351 +-10.5063306613948 +2.460581553984408 +3.750065918641006 +-10.956326954545963 +-0.7636649281662784 +-6.181422127060978 +-19.692199358874127 +-19.071795885576066 +-5.0402672791222525 +-18.533903213628346 +19.250759225578193 +18.939410576485017 +-11.959612629318347 +11.23815895737404 +-17.662351109498616 +5.442683401256314 +-19.98408595392965 +-6.893324866937522 +1.2684613586434779 +-17.26815986893054 +-16.986855777445665 +-12.064218442514626 +-5.301031971482226 +-18.961020611454455 +-1.7504552494347827 +8.1237067418467 +10.61479156713581 +0.22277226356596813 +0.810486488689321 +13.23661273015415 +-11.38634585179883 +9.875570080304769 +19.377952222593116 +13.037592104329931 +-16.159775836457623 +2.4288809802433633 +-14.083097516297244 +-1.7528918584073807 +-13.463758516147122 +-1.5655518569711724 +-4.4473973879399065 +-14.35881235896472 +2.163774894279044 +-10.993037999668163 +2.1364344173146463 +15.326927634479958 +5.539578580071179 +-3.5461429593256284 +6.0533937838758725 +12.411456260986697 +-4.304945136924925 +-2.5756647870606457 +-1.7700413195162632 +4.589838532057726 +-14.528908901300351 +-14.898049343623057 +-16.738911650750833 +-6.020426718199321 +15.818949159215464 +11.377376409101863 +-18.29499672374372 +12.92202868489828 +-12.647652823413305 +4.851822508045423 +-2.8114959670463193 +0.008839438017393064 +9.013458963535584 +12.454157419029805 +-11.987265281703277 +-8.235847070245699 +13.49733389589587 +11.417250745220194 +16.51468365174197 +-17.245062136576745 +-18.49793680710309 +-3.3534482463017454 +10.738970576039936 +-19.69942825358711 +-7.814943325156083 +4.563631415043918 +11.833999243619147 +-10.853259992920465 +-9.457985185628427 +-0.34915370774968224 +0.5013173768370116 +-10.852290177304006 +12.69717610613148 +-7.385469041064852 +-13.967262547658322 +2.1078226816799344 +5.184266221473113 +1.1296229121069388 +-6.870275374584853 +-12.850330002110768 +13.599793219174117 +-15.538449342255518 +-11.368969219731358 +-1.8155435333267178 +-10.247353035396953 +-7.896817477453922 +-10.313618337434264 +-10.741347136716799 +-10.660491442116218 +-18.216464725274438 +-16.60228711013594 +-12.228072058322027 +13.372885719620491 +1.3692190113584992 +-14.766438851732332 +16.58535960605549 +-10.637801536024295 +11.809040689449741 +15.831117529319144 +-13.92299361869767 +-14.429020108487215 +19.783223095540777 +19.15595468621293 +19.597698115298307 +15.518497604127049 +1.3659638235167328 +-16.42046688530375 +-19.053794985339984 +8.371432026657754 +10.257867620180289 +4.26994578181403 +17.37955333615791 +1.3825694713079457 +-9.628328440680619 +13.018551882282452 +7.744086484345516 +6.597071223272483 +11.323017021263531 +-17.285284154561538 +18.72441649761108 +0.5608987560138843 +-1.3326461926557798 +0.2158596976180327 +-17.42285605520779 +5.927568376072809 +12.544399322464365 +13.794036680006407 +-18.065707832645053 +-19.832837172740227 +-2.5961230792580707 +5.094355593100911 +0.1482738128028096 +-16.623347966497203 +12.809757242143235 +-15.395924641335895 +19.271832803974277 +15.696503027278489 +3.310689223726037 +-9.176427539898611 +11.573646115435793 +-16.44727479003434 +-13.501398396901894 +14.396150963358878 +-5.161144674970757 +-10.388291478322621 +17.361652852765793 +-2.9101219233924382 +-9.954380662342007 +6.839063435239773 +-13.93733864331855 +-14.333280320543178 +-18.781235051399197 +17.042224127342614 +16.01589374476916 +10.691987497641378 +-15.600618268637167 +-19.921461773119304 +-18.834793845194298 +-3.889626513509924 +1.4370261382746534 +17.374305400396096 +4.701642405844172 +18.882475494655175 +12.242021266362258 +16.14249959209586 +-6.157392804460207 +-4.027126872476252 +-9.28269525814866 +4.749324142049932 +-5.799777058225942 +-0.6619973886562605 +12.738876740510314 +-17.035680579960978 +14.694757354097248 +6.655815865300067 +-17.65151854933698 +-6.970334070414301 +11.135751582142351 +-1.6357144277803535 +14.750066209452477 +-7.625660966013754 +11.308270856939991 +-11.12132979635826 +-4.089641382780069 +-8.869670098966132 +-16.807610666083708 +12.396557279790436 +-15.291155819199389 +-7.356875638278936 +3.496206194389803 +-9.940008782630079 +5.618922113750298 +15.121290760916615 +15.40449990728952 +-17.465051759600463 +-16.87661213210191 +-18.791805813877517 +13.835301869939357 +-10.896581773802033 +-11.286227905666465 +16.360487902489396 +-5.591995172356681 +12.48714817239297 +-12.925981848372485 +8.396209871769482 +5.949418614725165 +-16.158605048382377 +-3.9379228802974175 +17.720052377694216 +-14.450588443873338 +-6.277809309192946 +15.883782232207118 +-14.754976660612327 +-12.787293870049105 +-10.211218252117305 +-14.001213513291324 +-1.1100422181002259 +8.824832128701804 +12.856375418197437 +-11.887778816878726 +15.289431133203514 +5.405640455721013 +12.629764139672744 +0.3822786110623575 +16.207261731369407 +-17.4454655607272 +7.793775331950556 +-8.65057458345126 +-9.70879217171647 +17.52651673097474 +-8.495102517950865 +-7.78448338096795 +0.7868614280361825 +-13.72425871131146 +5.263521351384284 +12.0289578905506 +18.521895849574925 +12.604887094798258 +13.146593588521512 +14.02644267198525 +-2.7315772473659408 +2.793332532305147 +11.908297913735261 +-16.95550912927621 +-1.2607211789330393 +8.973028523732886 +-17.44231325681688 +-9.283288058987122 +15.290782232023354 +-3.008391495810958 +6.222690845352194 +15.165953194748951 +-8.515841553493395 +-5.326580288846618 +6.680882471712248 +-0.9750502582070695 +4.1541394036220325 +-11.261197994059211 +-2.831194208923094 +0.6258698361834014 +14.91166533696871 +-10.749057843455647 +10.504475123104704 +6.702065074681656 +17.772504840111402 +14.042877301491295 +-1.1433040610710101 +-19.36210091638656 +-2.173544253635967 +2.1770560546907447 +10.861773901457916 +11.580025479904346 +-14.02636854672545 +11.876812825826622 +-14.88109258207758 +3.539349309309884 +18.05144663564073 +-9.22657273949358 +-7.002815180711789 +11.813749467012983 +-6.907317994858616 +-4.240994062674432 +2.9381781707438215 +10.094502300964038 +-16.7818107088967 +19.065553768427193 +-4.404275501611679 +9.875709508417785 +-8.437342003903957 +-4.049763789755939 +-0.49006130843449824 +6.920185839373531 +19.431949563355253 +-2.6725152476204492 +7.485037141532423 +-17.678240812777876 +-7.944897319347923 +9.040261500268372 +-19.054023050146004 +-10.684767064311952 +-18.25461224321675 +-14.835115503153808 +-17.350566670746037 +16.031445291471158 +-4.9143990404151605 +-11.431005046328625 +14.57648681450322 +-17.84917558261491 +13.780278094969923 +-4.850506517633288 +9.887360430536134 +15.348454865470494 +3.7855549621144924 +10.662276756278644 +-11.996164280888898 +-19.444288132083706 +-12.84194296845186 +3.3088888115443957 +-16.56581368560394 +0.6331243165933031 +2.818931626689274 +-0.2780938099043979 +-11.643896494627842 +-6.491130340095159 +-14.269576899327632 +13.514209850254169 +7.768610052245293 +18.664443293223115 +-13.944767429130529 +-9.128388477509258 +-12.093079002125569 +-18.479430328198436 +3.2675635961677862 +-13.470422407823452 +-3.573425737803042 +-5.718636944280595 +14.789258652614286 +8.796065552265876 +-0.5952630707038011 +6.272338280094413 +7.509301181166109 +2.9709927754586616 +8.09944882956136 +-19.362739001171214 +15.757948611313893 +-3.5834577250387127 +7.468180421338182 +-17.620873174554376 +14.6602183625684 +19.63944097059023 +7.18270538968585 +4.458309398077894 +3.7851598353375664 +6.380188541571567 +14.75354423283413 +7.004323883802265 +7.409622648865401 +-9.381610774867326 +10.161106632916276 +-16.139953276981398 +-16.4811755541638 +16.703322438135928 +-0.3237413745152793 +-4.711365883038061 +11.853975977328837 +-16.650840846315326 +-6.560245088570088 +15.251891141627269 +5.101387021484296 +18.924876548868042 +10.847027702232033 +12.988642489817359 +11.876731643788148 +-4.541964987971694 +-14.22586011973312 +-9.748787924201627 +1.5511873548160224 +-4.332000623156404 +-17.7549176095488 +15.426449556486915 +-16.73935298889921 +-12.053003171159 +2.3572154952053737 +-6.344603536368139 +1.8438868748620187 +-18.330886567915563 +-1.0320268520816 +8.788812812504567 +9.370378313632784 +-5.404879381402399 +-18.432628352603917 +7.333809353135226 +-4.792165963616167 +8.575858508157204 +2.404615143947236 +-9.785360833038105 +10.816347039651003 +1.8804147508985523 +5.437804835457399 +4.816564655750781 +-3.315601908162769 +-16.174919372548928 +-11.828280931148889 +-10.046021970067795 +4.2757869219655475 +-15.354118476744576 +7.90576767767179 +-12.151842589274292 +-3.48006939928883 +-8.290772740979522 +9.191353418159775 +0.22857409193300526 +16.74793349301779 +-5.851625686424917 +15.201354785949363 +16.742297587272603 +0.7028930157449764 +15.266571825407105 +-12.076694056583367 +17.173200274268666 +-3.1825967177229657 +0.3092147617822789 +5.213034739001113 +0.25051485960079134 +-16.133081295690396 +5.6759433487350535 +-16.72584367359211 +-8.861904577657707 +6.701949545098806 +14.531495827386259 +7.607756026888705 +18.02450972994984 +-18.711974877136374 +10.571067867096147 +-0.26850099483291245 +-3.1662755989782063 +-5.992456643469666 +7.0466746926801385 +14.305005577008828 +-16.31023890422223 +-6.9897174965877795 +-15.654389050814528 +16.26039737862022 +11.838035415530843 +-4.3955271035155 +2.4512667725402757 +-18.52123003216757 +-7.258354419925986 +17.814191712874916 +1.246950617120092 +9.810740564398706 +1.7650302342890747 +-1.081017629778266 +-17.252080166683633 +1.3846565391603214 +18.32237473961554 +-9.766507652282295 +-11.486893638510587 +19.352683104026823 +9.44340351195974 +-10.98988896617849 +14.512386330310527 +11.3853177848757 +5.689578277690757 +10.83329949995857 +-17.644031867653858 +3.4188054751707284 +12.215210493155041 +-14.667955904182328 +-10.759329460497238 +-8.623602890956462 +-11.963342431300221 +-4.922261129645754 +16.15934177269815 +7.425630554549404 +-11.578400995916533 +-9.973508650528258 +-1.3946336465134763 +-10.205074011827758 +-12.105478049004637 +16.045663027257703 +18.968571881927076 +10.267685440249238 +-0.06926031642781538 +-10.476867003460084 +6.5296481801817166 +4.832242830697432 +5.493831206386549 +-14.37084153253782 +17.21294810762808 +18.724971299996284 +-17.44859429417707 +-9.094467589829778 +2.7247750878693147 +18.47215958202478 +-6.837469520217944 +-17.20853646664071 +6.1957512532034755 +-15.300718502564305 +-17.778462337565166 +-16.793307453478448 +19.49232425988469 +0.6463219575320842 +-18.306301740441178 +9.534454788142924 +-16.042040349480352 +0.15284699217561837 +10.72891901652497 +-9.030449074722506 +7.978623034591298 +-16.813412776950972 +4.6188956047185386 +17.657398745098185 +-3.8243769102526493 +-19.381077877961886 +8.36366181685505 +-7.795759826643547 +10.283814331702239 +-18.13648100281652 +8.171210449916764 +-8.12632037336154 +-5.472196874854456 +-13.906040312611726 +-8.109174812182417 +12.401836872248722 +-0.6663877419702544 +5.105803647681192 +13.000273274189901 +-12.638929474632201 +4.521680154963512 +-19.986486940899702 +17.787117170657957 +-12.93994170407348 +-15.308860917659546 +7.080426570532808 +9.544591591223739 +0.7033192827913055 +-13.202743094176018 +-16.3278160698881 +10.580474288529004 +5.032520863972671 +-2.836925986704216 +12.29291679314585 +-14.319139101281495 +-2.333704680279954 +9.74411586669937 +18.724466405625208 +-17.88823264425762 +15.308395254154348 +8.247831419501175 +19.921517373932254 +-15.046854232064387 +-15.387652037428964 +11.353116370633707 +-16.632298709786603 +19.893086247034 +-3.507526520906538 +-13.07391927823332 +14.278933026074206 +6.3959518618723195 +4.0784397373377566 +2.557507866805583 +0.5158341413758265 +-9.292594249069982 +-7.132491531638303 +-19.338421928815915 +-11.441023091042961 +-14.169179544316709 +-8.32699229565392 +1.1273897433559377 +12.294304179177246 +-5.207823408227995 +-13.157464935877092 +5.172695753737798 +-11.103504356684288 +-6.725332452922075 +15.363439393792326 +-16.52963224528492 +2.948168492130094 +-9.74819124124891 +4.567820265588015 +16.477732507098835 +18.104894796576083 +-3.651217461715646 +9.954927761302503 +-11.737327238790712 +1.3736892992970837 +6.733098459339818 +-10.348545703749942 +-1.0220186322662101 +-7.937745007859217 +-6.950955172831893 +4.382008553475455 +10.532188385311173 +0.6434016356034924 +10.852745050807808 +-5.7254739829379595 +-7.2025245811772045 +-15.741600702132402 +18.09408358247343 +5.989306180079513 +8.624217288062766 +3.606471851371804 +6.123945390537415 +-4.161142835307885 +18.32578392830179 +0.17331417423086393 +-1.740992841031428 +-13.359224450613048 +7.556460998083491 +16.964055784581056 +12.467398242608155 +16.930460950572225 +9.074676925357789 +9.46625765290188 +16.45670695438848 +-2.9624601349815016 +-15.839765239795565 +19.49608292115684 +-7.874443726919171 +9.555284447233959 +-11.933558787858427 +-5.542071961406304 +2.5389431094262065 +-0.2234005362691569 +-7.166613091946182 +17.97137802428174 +-15.933560704523607 +-2.3226122852565823 +0.7876829050033294 +11.406452414191136 +-19.52775786387899 +17.971311820600654 +0.22022921188041522 +-10.907387478845244 +11.344409461407036 +-5.982146795274392 +-1.404193059055224 +19.306548712144227 +16.580938068498313 +-8.2664953368426 +-4.105886757585511 +18.552232264925983 +7.864483967374166 +-3.810909445587445 +19.58782697973089 +-4.776804224215731 +7.543639494680807 +15.281164437443472 +10.160557110577663 +18.676178934654224 +-3.7797446272380313 +14.468322851175316 +-7.652485836630007 +-2.770318650051916 +-5.314582297446657 +-6.116389578346052 +8.053984741647227 +-19.339559491998543 +-11.74424456969382 +12.135155918907707 +-15.629606222322593 +-0.0009355652605691489 +11.872070322088856 +-0.7769828640769845 +-4.441644858850719 +6.726491243978781 +3.663353961679327 +19.169374103135446 +9.152990069924464 +0.9712102484101521 +1.4640075445140326 +-7.10265524591286 +2.246417400341901 +-3.575035139874707 +16.72666472151127 +2.7864032249896624 +10.786222217119704 +-13.710791512384013 +-16.019115312446655 +10.734144688232732 +-8.369274790824779 +9.527905643925664 +-17.073265124812714 +-4.431956917929156 +2.5981484692375254 +-16.359130830862956 +-4.128652336935641 +-16.56266872911661 +4.976536433053731 +19.824532922757868 +-13.77021764522883 +18.116969149943003 +18.87700523149674 +11.732534804299505 +-19.056635109525516 +7.691491146418052 +-15.842531692270786 +-10.493714895824615 +12.470896398540617 +-18.618342689764926 +0.3696409281453299 +15.246763184987493 +17.236916017832343 +-19.396856775238916 +-15.227658116986058 +-18.176152692299524 +-9.781699137504848 +-6.330365649389176 +18.027348514834358 +-2.4206435316091977 +17.19463858029701 +0.5460886513512229 +-6.315347958263295 +4.987142171661873 +19.819870775504562 +8.312971268822743 +17.988498623625432 +-14.48273490993206 +16.257555425735127 +5.839174776780066 +-1.1620821351826685 +19.48313381681917 +5.646141936905067 +3.6855597972237177 +5.445527397458871 +-10.992791215029033 +-11.047107629255834 +-17.634744496985224 +5.731546339603618 +-15.435990295126501 +-11.440828101720815 +-14.316102384414338 +4.68786094321624 +0.2900310149804284 +-1.0348341623540946 +2.1109350003081353 +-3.718187526076271 +-4.759486369504948 +-14.767344778425633 +18.443850401792268 +-10.52357363851591 +-16.335814672344743 +0.37758998775319697 +5.391528715964334 +13.611536614114101 +17.85949617700497 +-15.22909255584274 +7.2439787990286355 +13.898904308449872 +-0.2556349138781435 +13.050845518780008 +-12.330399099822253 +-18.04393728295348 +16.643866046534043 +14.99847548661785 +0.22168761788644886 +3.56864297390997 +-7.435351153117766 +-11.119086260125695 +16.582497122732875 +-1.735560943178676 +-17.50869884775763 +-7.121094572687365 +13.923800826892872 +-6.62067700400199 +-8.076567876163935 +12.065528803486188 +-10.381661579396141 +-13.016316355251018 +-6.489106930267688 +-14.350447112054944 +16.532049969431547 +-8.186163296659078 +-8.607445846559983 +2.4609274735574758 +7.021144748979438 +-18.34734967005692 +16.15428874164924 +-12.923448763412395 +-8.44847732954248 +-3.6678146023975664 +-14.176090973646843 +2.625863495078953 +-13.600042353101017 +15.21990995737358 +-18.275594147211372 +-8.450001335480643 +-4.8866478686787485 +3.837034862458978 +0.3716342560383268 +-17.012027512173795 +-11.054170063017175 +13.91487589223373 +-9.202741894137262 +12.343187984265164 +-15.911552231254511 +-3.615313537580491 +10.582128368724831 +-12.941004475110844 +-13.914041470913677 +-0.42628938875012423 +6.207271759895754 +-1.511497080788903 +-15.619282764329876 +-8.013107239973142 +-9.48246434645942 +11.8103676131689 +14.726179788979152 +-12.685820630326624 +13.907546389782944 +0.6449833698503085 +-17.77417597457919 +-7.753875885758937 +-4.534648268222652 +-9.565828678176995 +7.09306429979906 +-12.547842211124927 +1.018605277229753 +-12.99827112906927 +1.5793208492730741 +17.619914337746152 +7.760673462298257 +-3.2751653869751927 +-0.7633041323240022 +-14.962288236941959 +10.1710715654789 +2.715573003863348 +19.273388458730395 +8.378594263456183 +-13.303921190218233 +11.305328265264368 +-0.3513354264799915 +-8.431850341916087 +-13.477208215227314 +3.2637592838288896 +15.469526018043304 +16.976318600493016 +9.021527493767522 +-9.481420690540903 +5.348972495375477 +-13.40209849236854 +2.484111967692975 +11.596619945740475 +10.765366891964817 +-18.553542561552327 +14.093460749819762 +-14.913703974703832 +13.738681600044565 +3.618005278554147 +10.988400889585321 +15.840219680124797 +12.113348496588749 +0.5664928308223871 +-13.155954675116522 +-5.5081404469816455 +-0.3897647340614796 +-12.143234542044347 +2.915514249981115 +0.3643446303870945 +-8.76827950184194 +-2.3182002250872067 +-3.555966504261839 +18.272623298199115 +-7.897540434610306 +-2.273855485603651 +1.480370721203343 +-14.441104429852206 +2.603476543586428 +13.274103408887783 +-6.255162732538096 +12.030813186667643 +-7.689175250582391 +6.353958190959688 +-0.1343047201223584 +10.608825853479871 +7.238872100414973 +11.531786177735594 +5.24747210910402 +-19.70210381884122 +5.60691984047352 +-13.067856832387395 +-0.7441067363268594 +-9.666938109044846 +-13.945795272710573 +7.655962789539217 +3.863672390259268 +7.506342860103686 +-5.064623823559767 +13.945586060775973 +-10.431048088966225 +-17.993746623744997 +6.336107715351869 +-3.333643782560909 +-13.000768500871466 +-5.7901487707116 +-11.265087801922625 +-12.951106982207365 +-16.10297661276805 +19.591635500365634 +-14.404167423500782 +10.765365675635493 +3.276586059747917 +-1.2229309105374355 +14.455438678693149 +-0.9692339226228128 +-0.1953608214789817 +3.0627165802501892 +17.54449751029113 +-5.934617825259863 +-12.695387354765376 +3.822189351237874 +-4.3607763957550425 +-17.05432465933591 +-17.069660901313263 +-3.3623123302752944 +10.462050070229346 +17.217630403752928 +8.449181290980746 +-19.025577554222473 +-8.992859153281092 +-7.950433882755995 +-2.5960633710438366 +-8.87424006963962 +7.5163026045044 +19.078077450997675 +-16.627464139323642 +-13.752153937926636 +9.114993529652942 +11.89820899453349 +5.121070739936062 +-0.18598876142788967 +18.535505837736743 +-3.4635982597361163 +17.72836517114144 +5.6410191120096265 +-14.3652422853973 +16.96118144339175 +-18.65142466760591 +-8.879253866809659 +17.488254667378868 +-10.017727262877631 +11.458422110756153 +7.5581787963766445 +-5.446949052952794 +5.564957523015153 +-3.6432448501092267 +-0.844306833296713 +-2.3538943127113114 +2.9617309419880513 +-1.3913242159988428 +14.409065215877888 +-1.8416698449281412 +-2.716651331295253 +5.98835132993932 +-18.237582549066282 +14.475622112763446 +-2.2091875188637715 +6.268326013242142 +10.98098459218404 +-3.0285664156045513 +2.5599752366548003 +8.520572745408952 +-12.743577013167965 +-6.078523644842594 +-7.308166511569279 +14.146472359433758 +13.756745001959615 +-0.6141180170955778 +13.365136229839443 +-2.2459761684022297 +17.52532882926441 +10.55413399622093 +-0.7015250649092941 +-8.887665786411008 +-17.24333057958618 +6.034481180172747 +2.3949308324522534 +-19.636155023608232 +1.3789846239208785 +-4.81028594662979 +19.87053282182385 +-5.516516014028635 +18.321684486985873 +14.491252725933613 +-11.069929213499424 +6.466161125933887 +10.350032767808099 +18.765882150476507 +12.198119457915361 +14.910130563845684 +16.39298242991798 +-12.62967199088337 +5.721445504119043 +-11.174834086156554 +-17.613981601850845 +-10.328645289568911 +-12.9359902980673 +2.504964429800978 +-4.57677378908576 +-0.7212683389261834 +-9.208831723625401 +-10.737931588116897 +9.49460220460875 +-7.327321043268604 +-4.664142771899016 +16.44565540494152 +-10.263793810199108 +-16.80509624879223 +5.1555582153083215 +15.347463448837807 +-3.0777531528946014 +17.585241159998766 +-9.064979029746954 +5.007052151153925 +4.175698235968817 +5.964585115466651 +1.4214287479700793 +-4.049524804204525 +-0.33086089076111236 +11.858217100276764 +12.418244958038692 +16.912455815591805 +9.390565264127385 +17.498790335616114 +-12.899439099747108 +12.754472890992815 +7.825979273191113 +11.643895599253131 +-12.381454356871933 +-1.364729010563753 +-14.098342699286883 +-11.870553100938244 +18.298806638103294 +12.043333145395081 +5.329703108493483 +-7.370673548575187 +14.548151459419913 +2.1881397746446076 +-8.601400517538721 +-18.131452803811015 +-7.6606537102511965 +-4.201979342011244 +14.698140380144189 +0.282348512873817 +-8.19728995072811 +-4.008698289067443 +9.370351399429232 +16.45426476232194 +-12.030359816703214 +14.012428603351779 +-3.178266699099538 +-3.68219095341923 +2.3806454979054372 +5.016429249838161 +6.503046387708427 +-11.145034617540169 +7.925357975080022 +-7.691948676696763 +-3.4488137215375367 +-13.386168989343666 +-18.88342962295827 +3.8430987376996697 +-18.30115547664342 +0.19295495936963647 +18.0849014641774 +-14.031079696900353 +-18.45887916239078 +5.625738251783744 +-16.04859323469285 +-5.436583095030132 +16.09191954460976 +-6.163669511377465 +1.2560250955584138 +-0.436382918527805 +5.798082459627629 +17.645213015185412 +-15.170810779344123 +-8.077866012915834 +5.213285589421524 +6.708427007002445 +-14.120764710192763 +4.220956662133801 +16.239641425627255 +12.026789586741764 +7.738880362884348 +-14.588942134934552 +14.58798662626534 +5.0869225821896045 +-2.1434503139170857 +11.914084632355618 +-16.03338763517709 +-5.390631015859736 +2.7758693385328 +8.187908983614761 +19.051850647714225 +11.400463163859975 +-15.769622794173 +11.604237428709318 +17.35212460250971 +3.3414012621935463 +-1.079478482967847 +2.014176830098368 +-17.467793471128527 +19.661036292108847 +1.1700748317019318 +-8.90646915258496 +-19.633696616884762 +-1.2547021135133605 +9.231198184309278 +9.1220108785404 +-2.5001325233685634 +-4.971393208277878 +-1.3093987218906875 +-12.684430361877208 +-1.651016628163756 +-18.293692609234483 +-9.96692117284474 +-10.846081090485304 +17.44994439968724 +-16.769893786458287 +-12.039165360883892 +-13.485670445701006 +-1.1564842487298996 +-6.860212382172136 +6.541529015187493 +7.509771329688647 +11.037963571154169 +-7.6402416900450465 +-19.570492502251113 +5.253400621294595 +1.275759534074652 +2.343748350347301 +17.541499703824208 +8.373604714779027 +-19.96584610481611 +8.150335871896797 +-6.854616563269369 +11.842682815573863 +6.20176038650947 +3.8133420908809903 +-12.954063217419938 +12.538113310435165 +13.509945355945653 +18.73400142633512 +-19.74360314842087 +-17.536309530490183 +7.174320498306308 +-9.091753817822683 +-19.001765706528285 +-2.2882056925935714 +-1.481587855972677 +-1.3420811967015425 +12.809289973619798 +0.9828450668370365 +12.404800237382318 +6.145612634557306 +15.851217577799027 +-17.474386056686626 +-3.8408229838806704 +18.378898233033276 +12.6517293879037 +-3.774406609718035 +-17.309265867025253 +-0.13709299050655233 +-12.013743950213872 +1.0866667134967223 +-19.172286036599754 +11.557304788380694 +1.9222914656526449 +18.59001308982792 +-9.28840507508815 +7.060646712535608 +-14.795097040743745 +6.6505627658006325 +3.4225328575220146 +-5.032551308178551 +-3.9861479421856494 +-2.5341317621589 +16.948543339759382 +18.90722210730359 +-17.110991241846556 +13.265773715756445 +-12.988009785216788 +-11.39045661528443 +14.976704668915033 +16.078588242420594 +-19.237736218319768 +13.223972044005777 +-7.447227558664714 +-6.550799259353525 +-13.380282426487424 +1.9619008265929878 +-19.631636070389433 +14.922601930100988 +-8.989899004213102 +-18.527897697833914 +16.467774228172452 +-9.818994764047734 +9.693753218975768 +16.52425391554408 +0.8573971152572071 +-4.5891523506109255 +-13.299752678592238 +3.772186038399145 +19.390993281451927 +-18.100563978769237 +13.407437457646182 +-7.677355673979136 +-1.120851948593863 +10.91583422522703 +-14.205848445064113 +18.900174084325286 +-18.828441110487816 +10.773194397593862 +-3.6748504402626807 +-18.596387190366283 +-7.823034180684786 +16.35484716757719 +4.162063660366503 +12.133693942957976 +18.210230736031065 +2.5409913917866547 +-4.620566890398926 +3.9466814176540765 +-14.041190444012477 +-5.611777689484953 +5.471631740460499 +3.76318995099005 +8.926212804295272 +-13.034678285410006 +-12.18506748029457 +-0.19196150776915744 +-3.465724053616256 +-14.149087155256531 +15.237433524948628 +-19.977410862478347 +-0.6664348286154542 +14.056937365821916 +19.189235479965298 +-2.923946933769649 +-2.2484528973417817 +-11.307387904377585 +6.6069011249972505 +-6.7058153090244765 +-13.019786026799437 +18.079345337662353 +10.62543830107677 +0.11953881144308554 +14.500941009755252 +-16.397881917492583 +-10.173482227513144 +-11.285581398764556 +-1.5941984486040859 +-8.970414993173158 +3.695425732510465 +9.858211601269488 +11.391393520759134 +-12.522777647266924 +19.003016243999127 +-4.647589783085886 +-1.7985228697191928 +-8.826716269857148 +10.737192818503708 +11.470505503297183 +3.0505167132463704 +-15.151994466022947 +16.56605718467778 +-9.316410350767747 +-18.34023640636183 +11.072991274239389 +5.993029543979169 +3.6098843712064053 +-10.55514795796154 +-3.9544034917684314 +-6.9952402497495925 +-11.657577160152496 +6.557607983080082 +3.296458855667236 +-12.384242254979956 +-7.61445645844586 +15.86987320770178 +-5.6198439235982 +5.133081215930318 +9.049818297830754 +-11.655382450687828 +-8.914671844282708 +2.6105109552532824 +10.057519156812415 +-8.990614211725955 +8.919749017352835 +-16.2338185381796 +0.3579907730830172 +-6.995435110968767 +-9.136002369631102 +7.029981224680043 +-5.361605696809285 +11.448807959196124 +1.0584984814871312 +-19.38401653695273 +4.535597257889847 +12.330924139915773 +1.5440855006221987 +-10.125653802916329 +5.096833430910813 +-17.86025388036751 +9.613160316349667 +-3.482346541388562 +10.023544059380317 +5.210609891709211 +7.40364825257565 +10.610575490189614 +-6.268374369152889 +-17.405179289747778 +15.56549761214059 +4.454520798368588 +-7.350527855770954 +9.537596709088817 +8.042238664186687 +-13.450581196751497 +-8.228457851807898 +14.499085276703447 +-11.170719420964272 +2.224550420158643 +-5.691072976585145 +9.445632501968518 +9.764019501417266 +17.28492156259321 +-4.464883347883507 +14.557819406402707 +-19.51234719705484 +-10.648118362667995 +-15.429893196033664 +9.429344749563707 +7.779026831389903 +-0.14777706966624038 +10.747293778911285 +5.967700973064282 +14.046186040493247 +-5.403936270062104 +6.301460068866518 +11.684209684120038 +13.85350203964893 +15.353302987999356 +-6.0974497437680775 +18.42995892062406 +0.021403251564425574 +-5.471354597267567 +5.138708644992942 +-9.648718401622443 +-6.858268965101395 +2.2534794697902356 +-3.946714237051946 +-2.766853896516057 +15.560618153636142 +7.351298311306202 +18.97424333159953 +19.49886536410083 +15.88396055439388 +-6.194316668486625 +0.5588841533457156 +12.780201464843039 +12.566082642415104 +13.455205206875739 +-1.6101620505930612 +-13.29459900954221 +19.241029705977674 +14.016935734663754 +-11.20085635906424 +-10.686078924894979 +2.576795871333232 +-18.645129123861807 +2.3753797019400835 +2.3937557916806362 +-9.812473271801503 +-15.379704211832323 +-6.620404739959017 +-13.958410512243953 +0.2032768822239639 +-2.949397011905507 +-3.0214682537224427 +-6.541840821966755 +13.171129048862255 +1.6926629764649057 +-1.1380797985680076 +-12.2594977051439 +-14.430033850595386 +4.108324052680562 +10.32986459831011 +-17.19341717804912 +-6.411748686485193 +11.22294349603061 +-6.854615868012118 +-1.7621992927291714 +6.026022098991824 +-16.56734516200741 +-11.780768731309003 +-12.344399364604373 +10.02528275321648 +-18.6863654822689 +-2.221777108733196 +4.687870609317738 +8.273437981578333 +18.629322386240283 +-1.4584961878059701 +-3.3989169113091506 +15.60605903619642 +-3.20323895525787 +-1.5757523795060102 +15.059180164257995 +10.112903510066879 +-18.865637058499274 +6.538027025021496 +-14.951238117589764 +13.427584056665012 +16.296101510729216 +15.283244554607151 +-7.6353758309060105 +-19.230855077576607 +14.455320841457812 +16.84788231107283 +-0.28599842866083236 +-16.9697847541659 +14.488262941179016 +-3.1278494825089567 +17.129436587349993 +-19.81908190933565 +-14.609710716849488 +14.280442455632198 +-19.484090744675193 +13.005279087818415 +15.871801823405804 +8.49518834165352 +-10.33034863651794 +-8.6333288967557 +9.566157994946831 +-11.284436574222717 +-10.976735729148706 +1.5318928082519 +-6.026959462611728 +8.211668849855464 +19.67083625848008 +-15.386897574129051 +-14.998728215646686 +2.3401115794704843 +17.700104714533822 +4.000767091585232 +12.179278085834738 +14.11079100859979 +-13.281552044470523 +18.616819157089978 +4.836040829086542 +-8.854121832124875 +14.338326701189793 +-16.596743024091673 +14.205703258623771 +-4.2637610508892045 +-7.6086164575100135 +9.585932259270681 +-10.118157078552127 +8.452286651879177 +15.177894640846688 +19.23700456523865 +7.195615014076271 +10.115298687714368 +-11.788802065509621 +10.714003329937867 +-9.984265292480373 +-17.784560259354294 +-9.385147162175747 +15.375194082517197 +-7.115655452666134 +17.485341005368184 +15.759818409070576 +16.877648616166503 +-2.4979471883714695 +9.145363334635299 +-10.017006728236254 +12.446578839245717 +-10.13153864606814 +8.001132183153356 +-5.150976210029015 +16.80933893776293 +14.27106258724615 +-5.783878232113707 +-15.267871938976647 +0.540444662273373 +-6.694455494325634 +-2.4713715918831234 +12.475666394369235 +-14.91343684625921 +-14.64944699070946 +-0.14143763829473954 +1.6047451840377818 +-9.20582895262282 +13.0774049959155 +-15.228985683413857 +-5.458600082980812 +-7.03662386168145 +-4.972614367042931 +14.255504148187207 +1.9860431197175927 +4.67103013991029 +5.205420776063544 +-8.251993098956598 +15.10072033990297 +-14.616981837260617 +17.778539380883828 +5.007797472502613 +13.27930099384215 +-16.503311698650332 +7.945682482463958 +16.119365588235468 +9.372958507797748 +19.204715467513452 +-10.887421429022561 +-15.176368031935015 +-2.3661721387926136 +-9.132344676913018 +-3.056832046624244 +19.073026978885522 +7.16615712541369 +-15.562351795682009 +19.64454779890128 +-1.1249413023726582 +16.71488939856539 +4.893554654530252 +-10.21176853297051 +-2.734663873342569 +2.2062040003726544 +7.356711502159467 +-10.453687709416567 +-17.379834791112327 +14.702673378631083 +9.269194519338107 +8.706520042361767 +-1.7408790833824348 +-12.286633151039918 +4.479560861983725 +13.462390167777102 +11.26781170963897 +-15.82387358623658 +-16.22748862475667 +0.5627709255544957 +-16.170301696494008 +-16.441355492803392 +9.688695397155598 +11.490861506652944 +19.99383338455592 +7.231441970152094 +-1.9373452474863413 +-9.672907409764925 +-1.4998687983267125 +-18.81473818280466 +0.5211570970898691 +12.290794014996308 +9.232512100366552 +-9.932297753294637 +6.4717031387028925 +-13.92588014532523 +16.875786139382626 +5.431727425478865 +0.832584410490739 +16.432485590400745 +17.434144183580585 +11.25125897765075 +-10.438146923614568 +9.607217168350864 +-7.021496963149595 +0.41923556072279666 +13.55193269323214 +16.390139197090832 +-9.712938523822952 +-5.562928273178077 +8.282773008707611 +-9.404292048058451 +-2.4993595474016495 +-9.44796993385312 +-18.098692884221702 +-1.1234790150658398 +16.79381695802128 +-17.26308896837988 +-8.98819767825286 +-19.192575401100186 +-15.661393887590918 +-12.470457916802737 +17.40889109075769 +-3.828759431133836 +-12.605138919486789 +-3.8821331651317017 +-1.778933215160535 +-17.85352722836062 +-14.28671465668133 +-18.86234902888934 +-14.67225950677979 +12.878282875580396 +10.94826895896404 +3.455679082943057 +15.869321505783034 +6.840762457378329 +9.019969811870116 +0.1338947349646027 +-0.6471517244303655 +-6.242661124094724 +18.510299581824633 +-7.759548074869315 +-8.890587543191245 +-14.356762384331056 +-1.5272350140785598 +-14.065624166039559 +-13.22878334699431 +7.286930855983641 +-10.398701735813066 +-6.8329104514811725 +8.501464732945717 +9.52655451627124 +15.728865277310938 +19.9803923167378 +9.652955038963885 +-14.012232396001352 +-15.568405996969581 +-11.088423960177396 +13.398873316307814 +-7.4943731238267794 +16.90262398734258 +7.461109795382562 +1.4449152061738566 +5.629297860114807 +-10.53333107576063 +6.732241827496949 +3.144610176679727 +-14.940451726459179 +-1.7077074830550174 +19.005865502507987 +10.781188500431927 +19.849249641831527 +11.771257749054076 +14.796146689850808 +12.00941798960016 +-19.04322777963413 +3.30973988813016 +12.826724618753175 +8.981907576397859 +14.102728355304656 +19.266536491644565 +8.684737198871765 +-1.1749242243290894 +-10.167121000397565 +-13.128492570752023 +15.161864815897665 +-4.382070284490908 +9.035785642541441 +5.025337649379512 +8.77304869154947 +0.5749900823170115 +-12.93308100781438 +-5.283428623483296 +5.95222966029538 +5.004584877712087 +-11.23040603030633 +19.206862369680266 +-16.929179996826566 +-9.861722740807725 +-11.287786218029371 +12.54295880466723 +3.8852373169905086 +-1.2465402617632293 +10.261896480513364 +3.0063432301765403 +6.4233161543124595 +-13.989976227440707 +-10.637610429320091 +-0.8324215475251435 +-5.352879037117395 +5.225205033646247 +16.173873896463306 +14.486998341674749 +-14.883542996301866 +1.2475341016462949 +-1.654602582609396 +-15.962707275166043 +14.138610145546998 +1.671153553770992 +-3.3867932870639983 +-2.6685474548429795 +-19.02199367777566 +9.975321574584967 +14.338943396508029 +11.881980769698444 +14.868287459586902 +-16.681485985793945 +-14.294672195668156 +11.789075009131537 +-2.9236966339059975 +15.27705230582675 +17.612133923803356 +9.69929093820788 +-13.645444245639755 +-5.9415596134119575 +3.0713300649368627 +18.417651833538272 +3.60846371460298 +13.710101576454036 +0.14059598527176576 +-19.54922354920662 +7.118280404939725 +1.3821870188707592 +-1.7597489282165597 +14.700953973597642 +-4.343959913789973 +-8.543112242600746 +15.20828628127682 +5.1809197097983315 +13.952916043990726 +-18.539298959394475 +5.552818145869594 +-9.742656370483441 +-13.492511683505848 +4.93413332121175 +-17.54366810898931 +-16.83866848854359 +1.6492264406723045 +7.028949640070863 +-4.029401435944905 +-6.007540439382616 +11.746235615907178 +-6.540594557772623 +-5.678896375173025 +16.951551429300395 +4.944885150413491 +11.610030576029608 +-11.474796148624655 +16.585142539842515 +18.402455106802194 +1.1242030486737633 +9.068081721976018 +-3.691704312072204 +6.8246273211507 +16.383850878394647 +-13.42440550260271 +6.925621174217056 +5.944605403380557 +11.376808560168804 +16.458694966636067 +2.3558038136063146 +-15.209446237389773 +-12.644721607291949 +18.997298554830714 +17.90766277836429 +-3.621524350891889 +-9.919040288149956 +12.784494406727596 +-3.4806003891457493 +-11.105223562087186 +15.48627289599601 +-13.224505680540268 +2.5899472483895103 +-5.073047297029532 +-10.159885976342519 +11.641797665050525 +8.40810359117155 +-8.555393980558064 +-13.577249863992979 +11.34820117195678 +6.267504409988192 +-11.407046283254513 +14.530883241063883 +-11.169019149598679 +-4.608189170112361 +-5.487654240393196 +10.0217151021433 +16.0130082230963 +-16.736115694523214 +5.29416691810939 +-19.504147952600622 +-13.586233941157534 +16.314746435136882 +-16.33284825527401 +19.30573966504579 +3.4308058010938254 +10.960648572395748 +3.789790749913333 +-1.096466200723377 +19.455693545897383 +3.785797970274743 +15.533418181300483 +8.874640884968336 +-15.455965959711971 +-10.991661465694996 +12.052038426524184 +-6.741423521363149 +3.2832394360581993 +-14.024354125370984 +0.7601514810896433 +-12.276948933718707 +6.936665508217498 +9.066926479963058 +14.609016086144067 +-9.184115360743576 +-1.5880410099568252 +12.003386273259565 +6.588521206485858 +-9.54463188078488 +-4.539044534915146 +-0.06109669809469054 +2.910059283820271 +15.418054173926336 +-8.642771691834197 +10.102356865318633 +-12.950612715089346 +16.873759929786544 +13.456994198394632 +-3.1404600965312035 +19.420738829615672 +-3.542294456110106 +14.938674468288752 +14.781044319303703 +-18.934243091494135 +-17.337970757744966 +-19.869173382481115 +2.6751252570430637 +-8.723408213119557 +12.096471901303651 +-9.859908348389688 +6.127109967690171 +10.566924802836624 +-7.360412839546836 +17.70326871478793 +-18.58037979430111 +0.41535745119077916 +-19.630803713203726 +0.09478184940636325 +-8.45142486037885 +-4.943511722532413 +-7.476881583835858 +7.523459480016857 +-4.55722815680935 +-13.419940993153583 +4.835937280675221 +3.6008102903429773 +10.97679489425363 +-7.012466179882889 +-6.215738260503937 +-8.80315867698446 +-11.493046343078346 +-9.301144707797825 +3.0914897004509925 +-2.933700323162178 +-15.062184083039604 +-6.1361831737229355 +-16.48467775401572 +9.421217270924593 +-19.91371454588076 +-16.472897091161478 +-3.354777075065101 +0.04947997808383775 +-10.60234134767978 +12.387230588185815 +-19.107311708906725 +0.35155419128896526 +7.540524313656547 +-16.625582372153254 +8.009267845771607 +2.312025191675989 +15.559289508327026 +-0.3047250603512879 +-18.521445015934507 +16.178119682408287 +-14.306690487636446 +-6.818325747756084 +-8.545241382590252 +-16.523692602337597 +4.379331479707819 +-18.615295397886136 +-5.085545895161072 +6.331703191373595 +15.56528005041033 +-10.345884136064868 +-1.1914097235476788 +-14.669906986689574 +-2.575199613315956 +4.986260386203668 +-0.381601928056682 +-0.761765870203881 +-1.481578175648913 +12.503232906274874 +-17.34726132594854 +-7.870677012806446 +-3.2274970229196995 +-14.035072011257594 +-18.098773952564258 +16.679414801449262 +7.7231137982711395 +-1.6475872331676236 +-19.632674858234957 +-4.532210300513828 +10.542386948895231 +11.194247009838023 +-11.936198585419366 +16.481221919343668 +-18.810440530828277 +-7.983006563590557 +-6.317846413973474 +-16.657859795065768 +-17.382019250993594 +-2.132556898945836 +-3.892923926605114 +-19.402960621497215 +-15.251335629666203 +-10.220969984405057 +19.724827589967532 +-0.6948607472809343 +5.7489664262441345 +11.725979274581931 +8.889223482326088 +4.028822348222011 +18.59243460288993 +10.524021755586467 +16.941688535439965 +7.315851867283033 +-19.57601034192009 +5.925674809680352 +-8.986446241813129 +16.197730176771927 +-8.219816866073844 +-17.160365412716743 +-7.227542726812462 +16.520566855925516 +6.58852678938954 +10.202562797119867 +-9.207099871168083 +7.022103150394308 +-2.5085982225425028 +-14.439099846773548 +18.468009029724406 +-1.8349958857924236 +-4.148191088857791 +-12.171865218067627 +-18.56661202728876 +-7.1994062387091375 +4.444051561626814 +-6.278736960349121 +-16.781945959963313 +6.024508438572738 +-15.40673597022018 +8.876888587530413 +4.644001946188379 +-4.8494301372981585 +-0.18503951699269194 +-0.9519504518913955 +-10.061577203945916 +1.7887472498083596 +-0.44279040573155726 +16.47625246758725 +16.516608163419505 +2.2442974400080686 +-16.3862552380902 +15.068268699720427 +-10.420023943085992 +-16.721528026053655 +-16.524368657099714 +15.52258794794892 +-6.171534953719462 +-6.643927428740133 +-9.286919330530461 +5.332621975379425 +15.346771135388266 +13.230779965608896 +12.60804493810825 +-4.65779983424294 +14.640698168800895 +-7.132529233733539 +-2.7681132291727266 +-11.773081881709135 +18.44566813362912 +1.7488371137616738 +15.540888472150975 +13.489207541551252 +10.292993918498684 +19.74612068478521 +6.424199622042149 +-4.50498553179818 +6.115288305128548 +7.2716777206737895 +4.535613051813378 +13.675496132900157 +15.011555380717788 +16.57149715641625 +-16.150438070157232 +-19.403424989104394 +-19.90702392775731 +4.560303602534269 +-11.772902558330514 +-2.2617183193965964 +9.149611719810416 +18.164822760707857 +-10.913917196275587 +-18.53745391076395 +-10.033889180836617 +11.435963358188456 +-6.665228118428921 +-9.037688075958261 +19.77738055067136 +5.378082148042598 +4.771622740422142 +-4.732591198192178 +19.243392647219224 +1.02887581766144 +6.043060018693364 +-17.131373525933103 +15.224859274267317 +11.478683505815923 +1.2370036569065945 +-15.366553807064566 +19.39009077706239 +-9.944609628078815 +4.487908179387002 +14.371148537412658 +-14.622695147921725 +-9.020131846890646 +-5.1257456405462385 +9.352919268899885 +19.63263362707901 +-19.330100214302956 +-5.340018337701391 +18.0472140753349 +-16.341169601496098 +-14.3977894416214 +-18.462773450400903 +19.59066710459772 +13.349099803871283 +2.999446711896667 +8.166277862711038 +-9.23131041540505 +-1.4675407824860223 +1.8026837124851625 +-11.165266068705574 +12.476810274567192 +-12.776206637862195 +-5.37844277955724 +0.38161516383457794 +-12.949925012111931 +17.14766206417235 +1.0665851945599378 +19.569552388832307 +-4.174023234439241 +-9.422501567533343 +-16.867453993641327 +-0.3171157613866349 +-19.79420543463037 +4.203453044393591 +2.174024365634697 +-19.606640054262286 +13.40631421509761 +-12.529361264820835 +5.325316382138027 +13.019083005078954 +1.2521516469727771 +1.4995343641690475 +-18.243660745344457 +-9.001008701459039 +9.11986789471641 +1.4580931397320285 +8.881062661865244 +-0.30463031856600153 +2.9752400210398697 +-8.358317357055611 +0.7494850201851193 +1.4389750373398726 +-12.10690698556245 +-5.0414483973527915 +2.153272712982858 +-9.528528554967268 +5.018701887542587 +-9.216624131865663 +10.391469654348633 +8.225334619675778 +14.810223217553478 +-2.1119835333357493 +7.920836371728317 +-13.752857623156105 +-4.296468265631429 +-15.673438242510445 +18.60012206002493 +-3.696267712829613 +8.616791146208932 +18.73349302870878 +-0.005813104718743745 +-15.453528359872637 +-19.687358198974145 +-18.411031316589717 +-10.718155088007393 +-10.972631739176975 +-16.202806508296455 +-10.417695138926465 +3.5467279539363403 +0.1447095812210506 +-16.620857839683726 +0.07823092424555966 +7.718657625959903 +-3.159556986286308 +8.839560126361864 +12.997662930018798 +-14.327838364040023 +-0.9329574310971367 +19.97001033399502 +-1.8812649939971884 +9.59015838688256 +1.3923638694469567 +-6.917668016482574 +2.046909608730317 +-14.674133982346028 +14.546253173316103 +12.158347644567776 +10.528014874727166 +-14.52022645817944 +18.055015189448632 +-4.317486431125888 +-2.6454563189019886 +17.547847386158104 +3.331512317697481 +-19.85182852815225 +13.145838502421732 +16.046122206841332 +10.064453075353672 +-15.439769709184358 +-9.04627404654578 +5.62096486701742 +-18.32475842453958 +-5.351760169414671 +6.47061766520288 +11.375124548415062 +12.209536047295074 +-17.985388896558057 +2.6816243346180215 +18.583766094785048 +-17.428393126612253 +-15.935183081465665 +6.926062861446244 +-13.879877022427971 +-15.315257845030562 +-17.17232073634383 +17.047529396573815 +-8.447035384756854 +14.057978866057063 +-2.690867314793909 +-3.37242268576545 +-9.193253261626047 +-18.338792179210387 +-9.127577553684837 +15.58382916365558 +-9.724091236727986 +16.717321077769583 +-14.973303103906218 +-16.225056609599534 +-1.699531479531391 +15.354686586633044 +-4.803835204408365 +7.574578820393015 +11.27575026627985 +-4.4891353989656615 +18.317853722636038 +2.5589505454107595 +8.97198547175141 +8.350753903086275 +-9.0250975051889 +-15.829837054534238 +-14.49145551102719 +18.338819530442095 +1.1340289071245806 +19.469085305725685 +8.657574118331326 +-4.8395067589353715 +-10.974618029451229 +-15.461104914557904 +17.03705851011989 +-17.685727667008784 +19.427073265354977 +-16.173817817599797 +-12.855557103069145 +-0.02477874868428742 +0.778978967480711 +-8.953024767020178 +15.640187824923657 +-4.811256618914484 +-2.961821772936297 +0.7128402026303817 +9.490542081006655 +17.68837109592772 +-14.016081120879257 +16.420091513760823 +-14.126151662164524 +17.43261013238179 +12.3722552379025 +-8.179925278985811 +15.292243673681007 +7.790785944560543 +-12.15197961383831 +12.234648118483719 +15.121655540772004 +-10.528945850194088 +10.281780845713186 +19.967689246362553 +-9.763803209614315 +-9.356041620657688 +19.996598366050797 +10.24896892003673 +16.770284802593714 +5.875997236292907 +13.792856662923228 +13.47738695599066 +6.968912919722886 +8.706253738378326 +-17.278591926911083 +-1.202908384428703 +0.6334021567955936 +17.9865678322747 +13.718028532469177 +8.099144009865825 +-11.020992449503515 +-11.321374250832976 +-0.9455369251923926 +14.53646049217732 +10.021721036355132 +13.14652085317973 +3.2848685401752533 +-4.7260758802191525 +19.977890980173044 +-3.2889665932877 +-12.339766833589305 +10.3685170784204 +-0.37138672213593793 +-6.580867877853148 +-15.438637881679963 +-7.528910606785239 +0.3654764047474792 +1.8804854164213722 +-0.730205894463829 +-9.942132830854877 +14.364558845522545 +-6.893585125092937 +-3.6899744131934753 +-11.159141891185547 +15.84674355020232 +3.9538881318882666 +-1.2130426930779237 +8.59651286109586 +17.772552210967284 +-7.536239566643896 +13.040531636491373 +-17.367022846133118 +1.2088752147404414 +-14.339770568513304 +18.502564251274066 +-8.054190269037488 +-5.097593499944342 +3.2127918477892337 +-10.200201062302572 +-10.607473164610933 +-7.44074761404006 +0.8793992019612205 +-4.02662164833767 +-17.66856002265817 +4.967223046421097 +3.2309220572138884 +-2.327670908418071 +1.384110123329659 +-7.064056110203595 +-18.926670311019823 +13.081757562598746 +18.69270640959074 +3.233208879292711 +-8.452246530630664 +0.6308060431832239 +-3.257426775403502 +-6.6054893470774125 +-12.700943444381894 +-0.32908279754841985 +-6.022122131644835 +18.011110844555787 +-18.791306564707497 +-14.46604264265265 +-8.738555792238042 +-1.6363900822471713 +-10.068559836217169 +1.262632600854424 +-16.330687356248703 +-10.669883347767462 +-5.920160063991906 +6.879584214908725 +-13.599036939160491 +-4.4410105104883115 +-8.17725636179949 +-3.5779656637586044 +-13.743825598762566 +-19.1419066187659 +6.728888447366348 +13.271699450449951 +0.3211916187195172 +-2.7176352968545068 +12.142487959651362 +7.645259798456841 +7.865232360845397 +13.010619767176543 +3.5922103799951017 +13.83029588657643 +7.894985864043733 +-8.01337454625381 +-3.5159892499124226 +-6.508467905266571 +16.888184930091363 +13.69320206605419 +5.88197614789199 +4.485448006968305 +-10.657750249322815 +-17.163909951358395 +-9.493817146173559 +14.834663423968138 +0.17978771104754188 +15.99719208900499 +-0.1005512906796504 +15.864164529529411 +9.888099288735276 +9.475477681263754 +5.904883796274088 +5.165435186045961 +-8.444042507455013 +9.730352431644192 +11.526038336747373 +12.80176037641128 +-16.37086294903524 +4.049861448315319 +12.743006832524898 +8.181694754003193 +1.4235619390663068 +6.677194810708798 +4.638626668770765 +15.262601395228003 +18.32298653659643 +13.288200777534115 +3.99263584334388 +-18.691743677130482 +1.7234690149333431 +19.041725309029417 +-1.2105418597997861 +-9.361466765284195 +-14.79441486593958 +-0.17108081888468263 +5.2311201555363205 +-1.8655708882544744 +-8.857132147760872 +3.831235427077555 +-16.544484553270784 +-11.125370765805567 +-8.164849899224112 +-18.217810812726793 +6.980825666059243 +18.233508288854196 +-14.12020157878171 +13.97611339800249 +-19.718693770851793 +-0.6945017981130377 +-17.16841950709105 +-7.742317092819139 +-5.8854779486451605 +-14.549733210684042 +-6.982258309050188 +-7.81382884368352 +7.635712142869902 +-6.10373853211275 +6.996933264186495 +-12.367346397499496 +-4.626418467499631 +-6.330626194242669 +-11.45670976250118 +6.159552035683493 +-6.874604538275232 +14.619994864165186 +4.590985416084013 +2.7625533811172573 +15.96574701733956 +-13.975755488866529 +-11.939538115187368 +-12.948286376637492 +5.942789093883505 +1.5751141804561328 +-3.6438720947212566 +-8.790488744867266 +-12.26476231851847 +11.89412299507498 +7.198652602014043 +-8.320975186379416 +7.804353229027829 +1.0413618168070613 +14.652360409593044 +11.88104541919558 +-8.180155019688108 +0.923086983856308 +-14.398386779436315 +0.19488733936169922 +0.36363915715007167 +18.14927499394009 +19.44038180371824 +14.481737121425638 +1.159100499578173 +-15.913921855361352 +-9.610164029342076 +-16.080293738622252 +12.479348063149132 +3.2125464367547742 +-14.928025052391387 +-17.27676783983146 +0.11680894644537432 +13.306431695708724 +16.397102136519138 +10.862578577323703 +-15.028313829219915 +-18.643013427657706 +-18.561258753212453 +-14.805911460872355 +18.553130190005163 +2.7065204128163103 +5.610399229479086 +-8.892808398998579 +10.730852519812334 +-5.018768184582193 +-16.124911567069205 +-11.16713128467473 +4.234830877040352 +-9.602946461862674 +5.005636345759182 +11.550023739099405 +-10.45904738407506 +-15.00337444530011 +-18.367360195721663 +-18.89724949115486 +17.500765884692818 +-6.131911199590888 +-0.12218211584271899 +14.91017879617965 +-15.003184993219252 +-9.903439856696266 +-7.81816662484545 +-2.823343088697019 +9.804485285666694 +-2.921625159683213 +-18.694900094508213 +-6.609066279033389 +-13.398938588072529 +-16.74800408980854 +-19.98629851802224 +0.3987955120636535 +0.10473808496858794 +-18.445807169298313 +-17.81923003899296 +-2.2260642853262347 +15.154326867331676 +6.739735718440947 +-11.528738777893942 +-9.02807909812736 +15.831605448268384 +9.079805081421494 +15.81125828993435 +-11.109394909200926 +-6.018663247853686 +17.346801028356452 +-13.25622836973755 +-17.293724262691224 +8.566379820839781 +15.848386498921244 +9.864237273173636 +-3.4112671309815177 +10.980181603195586 +0.8400926356723843 +5.7634934245677485 +-16.52878972979221 +6.314521721185272 +-17.38071590315198 +-3.87009141250725 +-5.457634329590363 +-14.327893469300932 +-1.9910035561214912 +1.3905414598145356 +-9.690886661960878 +-19.51136009298647 +2.4289666313380955 +6.85448422010559 +-7.096418843356167 +15.887146120466 +13.235118688995911 +-4.081179998313642 +0.17087497861087542 +-3.87196463668635 +11.593426319145 +-11.969203456641342 +6.224500965232277 +1.7389619700640644 +18.6148322982624 +-17.839283295916772 +18.482296702448892 +5.205875669651139 +-6.212951538579743 +7.814860146959937 +-10.681833030335145 +2.2082489988645477 +-14.731659026368224 +13.59180575820077 +-11.265930755301676 +-8.324538472637828 +-0.3933428580911382 +-9.347763584983365 +-14.334487164354211 +1.4496340122048181 +8.163000910055459 +8.686660229934535 +10.955653475922603 +0.9382077955157762 +3.3827843832096782 +-5.373814441364303 +-12.75218583050869 +10.377975563321002 +14.081926823575628 +6.1552255511400205 +19.193257256721054 +-9.338978163174424 +19.390736351708696 +18.029925770606624 +-14.06088133166925 +0.9917737644112243 +-11.807889392408475 +5.841698223625457 +-10.189487928179354 +12.182742671508265 +-16.469090377464077 +15.869681303933014 +11.066009879355413 +0.5400802236904951 +16.548770064438074 +2.360723971451634 +1.6216584060156016 +-12.146204193565637 +-1.3787510831573542 +-18.531538157019163 +-1.3875424381957941 +13.291437554886087 +0.9774302693815855 +-3.5739816813506877 +-2.5847529954899997 +5.4168750131920085 +-17.728062633711442 +-17.93505310186105 +-8.631438094435824 +10.743701458209575 +12.245328871532834 +11.153087893647047 +-9.38777351491694 +-19.983077485685552 +-14.764489325732825 +15.060085138954769 +-7.70814293973849 +4.138080081360826 +6.600234938113417 +5.450389751761293 +9.087182939269773 +16.853085857359403 +-18.38372329525709 +18.775024485871022 +15.642637586204074 +8.83436573803532 +8.756631015024574 +17.175952599227166 +15.488733011213554 +-17.022760398414647 +-8.73423821228199 +-8.966354643916453 +15.692643551691155 +4.105773224429498 +9.548144401749393 +9.202932991620617 +10.19337994341937 +-14.81531723750027 +10.562113486217044 +16.992543434603483 +9.481770755781035 +0.11782798543575979 +-15.097886001486863 +3.3229528736861127 +11.598053548896278 +-6.950669309513753 +4.739501605962914 +-12.200220191923346 +-6.988539299089375 +13.218019773029674 +4.266922644694265 +9.333760824147618 +-19.179209803339777 +-0.9431110504607467 +7.435831977392144 +1.4701682286451998 +-1.484926539890843 +-6.04500038808351 +-17.050595438317515 +-10.585488322912742 +-2.767814776091136 +16.92334647920226 +-12.675784983295696 +2.4040387132976093 +-13.730490809936015 +-4.505022136206293 +-17.24478227845111 +12.897098600652704 +-14.095406102203093 +-0.7298200875878216 +6.900811000855732 +15.561507298669007 +-3.4322325235835827 +-18.11530188805156 +4.498092786375079 +-11.16670142760082 +18.073286563818044 +-11.634507153384028 +-6.634759133636518 +-19.12890929905204 +5.427639932040638 +-18.127664493640616 +5.275343958036046 +14.566072123857488 +-9.734426862293626 +13.274595845920516 +-17.023774224528644 +9.754255920944125 +-15.326045798815716 +-13.83696296462718 +9.392565385322783 +13.866898560546673 +11.535249647066998 +-16.443917227192006 +5.92204456818844 +-0.8227072513811393 +-19.943874762761496 +2.1835099698628397 +-6.585449685160501 +0.652715670885307 +14.522465378849773 +-11.39757631785832 +18.98519932900617 +-12.095902770393314 +-10.465443416997271 +-4.290564547077551 +-17.57886309854188 +-14.504870971500164 +18.16977563641141 +-8.540880665171695 +-3.1798376206057313 +10.986767129188447 +17.390129661998706 +9.586783514842079 +-1.7259285142915957 +-16.010670628937053 +-17.584210257596283 +-8.525280415382245 +12.942868028022396 +19.369894000682926 +11.15574239340972 +-12.064814754494586 +-5.244920250600966 +1.1260057795276808 +-3.571020872540732 +-4.469608355761183 +14.589711399518343 +-16.922521632400787 +-17.235833454834054 +18.909201697043713 +3.555954455108381 +11.93555260250427 +-6.077343462347615 +19.266400661089406 +-18.739458231174567 +-16.919011647822163 +-0.5932807667182445 +5.100210835203676 +1.3384423145558841 +16.28635771905315 +5.636120083794083 +-16.632106635383153 +0.40867124200132565 +10.907245196789525 +-9.172761516142852 +-18.762170293803457 +-1.1653491346557274 +7.8671992112747375 +-11.580237204661369 +17.684453635139036 +14.556002042829292 +2.6728296611427673 +-14.747557351313457 +-9.148329659862263 +11.150413311486538 +-1.1521943033292068 +4.224359439342699 +6.755164502854484 +16.29417304362945 +-19.58883418114703 +11.304909831517893 +8.412577882148046 +17.175220620854084 +-2.4473793881852473 +-9.535530954145969 +-1.9965714898746967 +-14.114162166797675 +-4.921638009378739 +4.621494706457273 +-18.650421870520955 +-8.921810985019608 +5.6521848777057 +-9.961565847412043 +-15.151329166701437 +14.551685860073377 +19.59139456643814 +-19.027475794665595 +15.438008944017561 +-5.554048130888649 +-9.134804987165225 +-14.53095424976858 +-14.766335196707638 +-5.4714497066359655 +-2.0193134514728115 +4.54471400790958 +8.85008888734458 +12.014741092470935 +15.02456336229735 +2.0402413607478636 +-7.036911730027295 +2.014128461862793 +-14.258872261264344 +6.952392136316096 +-3.0903349669162985 +-4.784622580202594 +5.071615835511238 +7.166612233551017 +-4.113190986779003 +-8.736481292900358 +-14.879901417478102 +-9.136032727936868 +-15.517200393934472 +6.115816562069561 +16.01783650173428 +-16.966489673667393 +-8.881854989871796 +0.027507278247988154 +3.8158845739857306 +0.9476232343603996 +-7.898055492146842 +16.259422825482723 +14.468260732197066 +0.28365695350537834 +10.687962153679486 +-15.945692768136436 +11.503210335348992 +9.67876553568594 +7.770563892370859 +18.305371589611653 +-17.72282818922281 +19.13032371731328 +14.14390936215026 +6.355567041428461 +-12.363558788117643 +-1.3068880626651733 +-8.096277547328992 +18.478203278091918 +-0.3446800717883569 +13.415421711866664 +-11.830747255585067 +0.45362297318650846 +-7.225203527335031 +11.552227071341239 +9.0190709642604 +-0.8637322454585536 +-18.232093265770892 +-8.894582241324418 +-7.392398466200785 +1.4335167635468515 +-16.592181539811012 +-0.4170362667046419 +17.13230511537202 +4.918703209109758 +-3.6786903465081835 +10.57946443174881 +-1.1204909438177246 +8.36851269905818 +3.944324317417042 +13.590145865079805 +-13.40179771951258 +-0.28033801143200776 +-12.54168088977413 +7.916311542393309 +18.713141561368197 +-5.3429824188347155 +1.186993477058703 +-14.882774075212168 +15.400651168685187 +13.253542766044873 +10.03150697622285 +16.98633701326849 +4.6788997446273015 +-7.59159138044641 +-15.804241904570869 +1.3480959679554232 +-3.2895805638350986 +-2.3258399394842755 +13.561790985425738 +1.0346461054435991 +1.914937547089334 +4.260999404367787 +5.54243111035688 +-19.69441092765477 +11.076685541446626 +-13.056554282624395 +5.344515143409318 +-14.506508009648687 +14.684855559842433 +6.499737782807852 +-15.155944620660522 +3.1835532538441598 +0.9972817172987334 +-3.2835055095434313 +14.439708115809708 +15.950428755011401 +-10.898090851207463 +10.268178507523942 +-5.941027312459482 +15.044794393175856 +-14.119570589811454 +2.095994782345201 +2.890420353225295 +-12.314355053893657 +-5.453173468732469 +3.891826037243085 +19.32683820693645 +-13.909700289184425 +13.686012131936359 +4.465560646643013 +10.961925435221175 +18.92112588148163 +-15.985783068370672 +-5.67407786207394 +-11.947564290990034 +-3.762204959825354 +-1.5375045187632708 +18.14757283655939 +1.1151403682685768 +7.961899219568885 +6.8403143162212885 +-2.7400987123125873 +5.434452315271756 +0.9177592475461935 +-19.230967449620135 +4.068681721001454 +-16.39208300482057 +-6.3122713025719825 +-19.14132072739852 +-16.02489488709338 +16.38376267895574 +17.453793731805916 +19.770622803472364 +9.238313957083829 +-1.2134038802419767 +12.507870295692996 +6.496363054805041 +-1.3730180296274739 +-6.783444291767067 +-8.169530991858561 +-12.233855724995134 +2.3528195437755244 +-13.55312631641597 +12.751931228126487 +-6.6992299401158295 +-8.015168403750256 +-8.656617073954308 +-6.61245356462536 +9.056682985223983 +14.892922221570132 +12.054218965447227 +-15.840770622713958 +-14.037613491177602 +-9.026803774435347 +16.366664215759016 +-16.755934563236785 +18.602350654857624 +-17.678842718531268 +-4.392269442227562 +11.669946279237358 +18.98609095083024 +0.5167298670413629 +2.2675283935977077 +-3.2707193842952407 +-11.515293966415374 +4.135614836443786 +-0.07051528447898647 +-12.93469753905149 +-1.1854533287571414 +9.395225771993687 +7.267370363651196 +-8.775940962493 +16.489604455173705 +18.115941689853145 +-2.4059425603791738 +-17.44162118582217 +-14.582890414937598 +10.747372894641785 +3.9172069517649746 +-14.95764709799741 +-5.0862103789011925 +-7.607691671807171 +-19.4390088277877 +1.4393068779607532 +-13.34664894343872 +10.08674434378004 +-15.685057965820842 +-19.261075017052953 +-3.894264099992178 +-4.284029461648885 +-5.841035797816922 +-10.46617176837119 +-5.456657013627515 +-6.789735129782063 +12.609327245878042 +-17.936520998606575 +11.313448507671403 +-3.8371857318617586 +-15.535189611642494 +3.4020939989288976 +11.904145804368728 +3.443262947644115 +9.224059674435047 +-5.470571165335372 +-4.133153376437955 +0.3877742174177783 +-15.802141969617303 +17.0767788357021 +19.820954735061164 +13.269641537149312 +-13.268386593313565 +7.35652610023903 +-14.682367496535193 +-15.379418162922342 +-16.89390238511131 +-12.513750282307893 +-5.401807178456664 +-7.335659111464054 +15.773207400077538 +14.571460302154534 +-4.309519806006792 +-15.50496452292116 +1.4410525098059743 +-15.331547684238402 +13.445502177525015 +17.65908993070395 +-2.8390803393429387 +3.1819929675992995 +-16.6156978436496 +-14.487395450335221 +-19.683597587791585 +-8.917284947646928 +16.500322448966102 +11.83956744776873 +3.9939690452332783 +0.014920875292400382 +-12.260752572980262 +5.849981388864105 +13.03898639704029 +9.494694144982745 +15.564707365925827 +-4.058408968839586 +17.988418427257045 +-6.92486948103603 +10.370998297344073 +3.891658850554002 +-2.610861017624412 +-7.307258565804302 +-9.893850783593194 +-12.750109672432952 +-1.6619436258893856 +-6.421219787464537 +-6.371558980695568 +-16.6784877840086 +19.843194742261318 +15.541384419781622 +-5.111338332718439 +-13.146283138067588 +-5.761645450431288 +3.364365415533406 +-19.30365254250374 +-2.296037240639741 +18.490417250823995 +-19.23719840941784 +-8.544230282904127 +9.992025143703547 +-18.623033743149264 +-11.080055927854069 +1.3221339956590086 +1.3027299330505748 +-17.22700290750344 +19.318239611615894 +-11.800372830824447 +-12.570727397850131 +-19.542401243931206 +13.190043868903231 +-0.5256990448178946 +-19.845153491503037 +13.40509431871061 +13.64018234989058 +-2.159769059265937 +10.834191605938468 +-15.010554722361453 +8.651570431042877 +-1.6790570531359883 +-3.1113481230308757 +8.871128105495693 +17.460455187016095 +14.308664668724951 +-2.020400138372487 +11.463191311261362 +-6.631279830709413 +4.409031577715755 +-2.580641777575604 +-13.424748397405022 +-18.162221971409828 +5.81159891141607 +7.013323706755735 +12.63702293350429 +12.398635481307501 +16.31180025784613 +11.473452438833682 +7.2166913886748745 +6.444634496077327 +1.9985261837693287 +-1.0453596918016785 +-2.425168642514116 +-10.501102904249722 +15.34630372306573 +-5.853531713528284 +8.02865195731339 +-9.53996954467959 +13.270457490574302 +-10.419570029953938 +18.246842986824497 +-7.504236113972098 +-15.26044297059805 +7.032359834129267 +-16.023309284725265 +-5.546993778774855 +-1.3057177425951316 +-2.684496923593109 +-7.13584553850775 +11.456486722407966 +-16.328968833867172 +19.15169898698086 +-11.216947239247425 +-6.254173572262079 +-6.0474002920340375 +3.6935453624073844 +-13.893528307458563 +13.536896550130159 +10.791070534034194 +-1.058920703306061 +-2.2048833055124035 +13.053614017872206 +18.776459770756865 +14.483351974251292 +-6.9687658577741995 +-9.809733714278526 +-17.073331509629877 +8.979326899777263 +6.383469186288636 +-6.4170352787475835 +-7.717432976535452 +7.793556402200537 +8.384694668391202 +18.51566954779257 +17.866609055756342 +-16.74013262920745 +-5.8592130574715675 +5.679728050740774 +9.738134765428903 +5.977656504058444 +15.082311033599055 +-9.122428321418967 +8.571349991370688 +-3.6129909933112856 +7.37864427005978 +-16.793630039810786 +4.19812531437254 +8.589429468812199 +10.662280348423995 +0.1793554169952536 +11.800871080072916 +-14.074123438936098 +-9.080284491868342 +9.605723282557026 +-9.439131819649123 +13.188297222582122 +-11.590020623400164 +-4.510246041877085 +-3.7218634404399786 +5.496082188470584 +16.103237645881386 +-5.197784410051591 +14.098155803119987 +10.840417604797228 +16.769015037943326 +-17.34425688466873 +-5.037096658254194 +1.3167588328041155 +10.554218728883736 +-6.623131429834022 +-1.5581646018734148 +-14.771421808166632 +-11.993779201391618 +-2.32424211560199 +0.0965799536595604 +19.45988620994917 +12.114679726098366 +13.892032481088378 +12.416184762471111 +8.069534872780388 +8.195250851039063 +9.223098002044104 +-2.8326747983650478 +-5.695768782516165 +14.192492541489806 +2.78524374818889 +-13.779366979034027 +-6.226096506499319 +9.233762919338929 +-14.901922927660554 +-17.109785839857473 +-7.791742351007045 +-14.932381130093448 +-7.497068609250261 +-1.0500837259471005 +12.5535579147014 +-14.966505662522458 +-19.857416723376453 +13.06805669513389 +-14.942477234770477 +18.38308730766822 +2.154769235708123 +1.0626811305064585 +-13.370951917728995 +-12.527251846086966 +-9.70645422242891 +16.702682960184376 +6.115890630077146 +9.651373132773777 +4.551774488539337 +-14.163075052282865 +-14.161660856898234 +-10.788645750285998 +9.16100171097731 +-17.192694860280827 +-16.16215383124746 +0.6123434830909886 +13.142326474837532 +-5.668640390969566 +14.524743059794588 +8.735586282400941 +19.81981335699639 +10.322252427416515 +-10.115648186094223 +-0.32571248857866664 +-16.47144523536955 +18.270965691011803 +9.213242224352335 +9.32435163723963 +7.2690367421070015 +7.223248008170906 +-0.15549774277450013 +-19.418268241529898 +13.208634208529858 +-16.774586886819826 +4.2449150759944985 +14.730133017966324 +-3.3639170606858855 +17.80655081469559 +-12.430212504652246 +-5.7691764972308235 +17.232339869012996 +10.823618513386677 +9.513258418104805 +10.777583567383644 +-6.6097841119492 +10.061530306943585 +18.822324198301956 +12.65983009446898 +-19.193540390559733 +12.05348913750128 +15.951649144051892 +-7.256558861279409 +-11.817205553556667 +-18.416701849443243 +3.1393155179439844 +15.263536473796748 +9.48271392661383 +16.545035266213247 +-10.39604063012122 +-15.985420446697546 +7.658556745807296 +-13.082862785522442 +6.068988626090729 +-18.167300337648165 +-8.97137265592345 +-18.225567065866745 +4.517257072189324 +-0.4087409556492574 +-1.048842393638843 +8.53692054052317 +-4.815623322493131 +-13.94302791383556 +-1.1179748812539074 +-19.51384604625052 +-1.1906664747218372 +-5.578387050971024 +-6.404362226887352 +-6.2850200405893055 +18.254914032633238 +18.644305211656707 +-17.059762290740665 +16.858876526006988 +19.3445007875494 +1.8343973199132009 +-0.44955137779942334 +5.111169255640043 +18.191206013607022 +-3.2336690049675987 +-7.798618343966911 +-11.062810655117072 +-17.019233349476167 +-10.246236634573208 +-18.56197300320586 +-12.020736153983446 +6.155442497780953 +-8.320558947503315 +-3.911583669407669 +16.302048371484304 +11.08580738143295 +1.1688821821593862 +4.801605466292479 +-14.135241446509808 +-19.407214030680255 +15.497819097899523 +-7.008225349850834 +-0.8884219903226089 +5.929784133274051 +12.405604786384828 +-0.7905853287953271 +-2.29739039857515 +-17.184944952020697 +11.232557947701128 +16.16919678935038 +9.796702848940594 +1.9438492636401428 +19.978661764953173 +19.06472416553443 +13.928192139165645 +-6.453957392111537 +15.73560948781715 +-1.5375817151415276 +-7.87653675464461 +-7.115731653856624 +-2.5867040174698666 +9.127536542216848 +-18.98047754408217 +1.8558602118013923 +16.72173655449155 +14.60513975045388 +-9.310200661572846 +-12.201654791954514 +-2.8861052453547558 +2.84615279722356 +-11.52850825646599 +15.811482814355365 +-19.699921544826672 +6.818082787346821 +12.821392313805681 +10.226585978481644 +13.667589948801393 +5.456761128608964 +17.581128398553588 +16.07181017616915 +-1.103525906103478 +-1.3818008525371361 +-14.760200115822798 +17.008602431803084 +-4.834237673286488 +12.145066433062773 +-8.438591619813604 +-19.098489954595475 +-2.574099709296437 +-1.9518650903142323 +-0.6879631743580958 +-16.055166988782883 +-1.6615820018495242 +-6.030398976714718 +19.155641719433405 +-4.85296613881253 +-1.5429869758193604 +-18.215854346397702 +-12.214286546150017 +-6.105434471445834 +15.24759444457446 +-7.3972423774039875 +-16.506286888795746 +3.456238497955244 +12.661917843328787 +5.841133741116238 +19.519740027266636 +-11.991817137501597 +-19.06555585884806 +13.322744206752901 +10.291936392347981 +-5.9469855840728805 +15.591903265200791 +-7.64400962353394 +6.706899867093782 +-0.45762211666627906 +-18.84348299942637 +-7.993185829133989 +1.818744316491923 +2.5035802402321714 +-3.3641851290055413 +0.6323347788653813 +4.715795870803966 +15.265714450238711 +9.212014931292849 +-17.183309244525972 +-7.2622973778406 +-14.55667316010134 +2.0007225829240056 +10.485105028354962 +5.818303324409047 +1.724381211564868 +6.604190827481599 +-3.2924602414011943 +-16.049271930511484 +-19.051154150183145 +17.494661817860745 +-17.04927835667787 +-17.131276114706363 +19.053373717287286 +10.34374099322898 +-14.24455187535807 +-9.214366278765018 +-5.145765333277179 +17.847381335635674 +1.6965570010037112 +2.8694343430890292 +-16.488618833013703 +-13.766732792538967 +18.887588474772926 +-19.818216059798633 +15.036951388817712 +15.813741477975583 +3.441971800259065 +0.8127877836475186 +-11.88022585418626 +6.753851814899868 +-8.058490503068612 +8.148650465785408 +10.47072729363358 +-14.721034006136486 +12.26473142355956 +-18.277935981020207 +-16.305797689613005 +-9.970673754558025 +-18.38100168636175 +-11.639027449946898 +7.580616133763236 +17.245172113050522 +-0.6196556933510387 +-7.022381294444763 +-11.413115428910832 +19.329720544725042 +-6.947968294871107 +-16.302191742236012 +6.358608638209866 +-12.520138815167282 +-11.16976315709124 +17.04126723045497 +-8.815899454622915 +-4.940507827007469 +11.263039502665517 +-0.6556486790200999 +-17.827297487674436 +-8.089733371112121 +-3.2382710788042104 +-4.186545357028365 +-16.27851949963094 +7.929125386897532 +11.760414268769487 +2.8235497081006287 +8.451326466262998 +-4.6188719619633645 +-18.94248839647561 +19.146990819700726 +-0.5424340808993122 +-14.358193385557833 +-1.2475697435966424 +-14.381234982494156 +-12.718470742910842 +12.994468182725448 +18.20970648931182 +-19.354751985637044 +-18.881833135557816 +-15.951937771507811 +-6.390365388002209 +7.494659289150448 +2.8799877547061286 +-6.021092379864154 +3.0272824313108835 +7.523796307058323 +15.09886898297303 +-6.662216813619072 +-5.1458578629612095 +-4.923860807334247 +-0.27909803247368004 +-8.01368700231719 +0.7524591904377758 +-5.85166162858215 +12.53974428322482 +-5.692655934052242 +9.444211367821978 +4.51238490639949 +-6.41960243479549 +-19.8153729110292 +-19.589968165739407 +-13.748122145222258 +-2.5974446956760104 +16.109833640303933 +-18.564310493857853 +-11.560428538444572 +-19.717511855998453 +-7.322557465182587 +-2.9112838515027306 +-14.323563239985493 +-18.504302789737473 +10.56813021271065 +-8.793340597698688 +8.718795421276575 +19.09101868612528 +-10.991014513344094 +18.889657315990995 +16.532965742778742 +12.881519052216909 +-14.469562951478213 +-12.412596162061655 +-16.064963636506924 +-19.625576989420953 +-14.551887261620609 +-15.188602164447374 +2.1983152778091437 +-4.89476641732125 +6.274130981084944 +0.6696034691094432 +17.575384555588165 +15.912168422425772 +-10.890610273875478 +-0.037816290585787726 +2.0837221352066457 +4.262511905203908 +-3.0147899324281546 +-10.09184772027535 +4.448425480226671 +-14.595652887420556 +11.012464558182732 +-14.676951483550425 +-1.6659100244869691 +-5.466626264159867 +-6.4815918224275 +-4.739770358445341 +9.030040887171829 +-11.591342957871467 +-13.62167095362322 +0.22318277156574595 +-13.654556651979304 +-13.875232286162603 +2.2251943892849297 +17.889205013468114 +-11.465656740643233 +7.208247833803018 +8.417849053435074 +-16.751725168567077 +8.307754478707619 +10.499984709970299 +14.334860262980953 +5.933216311613339 +-18.907507610544265 +-18.276967864834614 +7.2557896476175685 +-4.3727984098536865 +-18.750675353821684 +1.2219379636868197 +-7.354906488877958 +-6.643293045310617 +-15.02091852596771 +-5.504906269486675 +19.105831685375804 +-7.026456568500334 +-2.7690501428905208 +15.013587549290122 +0.3032835217230456 +4.004374509156975 +-13.045214640644605 +9.463665139808278 +-8.359855840554612 +-8.470192105814327 +-3.670911562973565 +-1.938955619761792 +-16.686830288340786 +14.225017814386824 +8.379542035750912 +6.806122157435276 +18.00068530700858 +-19.39509586996438 +-2.311244280126104 +-0.3141884891329454 +-16.11507373482949 +3.218547073910333 +-0.3082637621559279 +13.674373897708286 +15.311947541813204 +12.289325061538129 +16.765202958661824 +19.20835237797879 +-3.3103071797571744 +-8.001903117592516 +-4.516193211901033 +3.6267967123671383 +15.710879189062261 +17.206160176465673 +5.48749884846702 +5.728573255127486 +2.2995917982696987 +-14.112586396002197 +-18.389115640392653 +12.92328757026928 +0.031849600468468964 +7.7454404531994605 +8.348077129470852 +1.658232346626015 +11.34722460990578 +15.264542300848873 +8.277480544968789 +6.439597956398142 +-16.40242698876645 +-6.585683453035568 +-14.62725785870635 +-12.982364942532744 +4.450541945248602 +19.916431108190807 +-0.3901866189119687 +-17.762501660594282 +-19.748894096824202 +-6.786447310817255 +9.085575200382209 +4.549397974910114 +-7.704405838427903 +-18.577960637503995 +-2.1901723503003367 +18.758446063301882 +-3.4398486524553533 +-5.898149017312928 +8.155294908813822 +-19.07210511444943 +15.392250176343936 +-18.51775846961587 +-8.1510539472063 +-8.64497818952592 +-1.895524357374775 +-17.915826236400726 +14.39788339605284 +3.5997892221977956 +-5.966324365958284 +16.50816144583579 +3.0899114336857814 +-15.517069530510895 +-5.908554332209652 +4.280071338461081 +-0.8722752600324881 +0.3234060925852056 +-2.2605945618338943 +-12.522483267204203 +17.660176413724272 +17.89890950517522 +0.7036216967910356 +19.47930319173024 +-7.731197956483378 +8.116603695194797 +8.599763704470732 +-12.42217088825242 +1.3777127318076445 +-1.3192515257053081 +-3.2487829845124168 +15.124721486617041 +-1.7283668698099461 +-1.5061595471891778 +18.815539595246598 +-7.009352763866028 +12.74784399745809 +-7.82417134327229 +19.650474146450897 +-2.7375447925579266 +19.715354946930468 +3.935831647571625 +2.0931136792867058 +6.3008634063910165 +-8.502587867286643 +6.6102290901792 +-6.811805287250108 +9.66896268780651 +4.820863640956823 +-6.464638712049124 +-4.158236587032382 +-9.612563768470173 +-2.131772473882954 +-12.403172320033903 +-14.876737453808495 +-8.067692356367742 +4.600182681149278 +-8.3358285511734 +18.223101407234466 +-6.346140854699499 +-13.974521056556156 +18.727492961174953 +-16.276556792887114 +-16.199747429169875 +-14.075797291483596 +2.2574366702178708 +-9.050895174931174 +-9.067094986417974 +-17.44430081267222 +-19.508169435084906 +10.25402052969401 +-17.564643091399148 +-0.48277207558193425 +-7.147673823733687 +9.258711040323703 +-13.733135566132182 +-5.501728755291598 +-0.8067470856737131 +-16.63967659806051 +-15.709009112993403 +3.7509938216298053 +-0.5560303082863207 +-0.5052982691388408 +-15.906083993980037 +4.680199713065747 +19.76729628897312 +-3.7779461471398115 +4.323441401866152 +-19.770037936120957 +18.355996135536486 +17.43734512844601 +10.060067801876407 +5.9896978866163195 +-10.33937188670945 +-12.127762630506314 +10.1073242655619 +-13.817642177100339 +14.55255355510075 +3.5797582441035694 +-2.39098639348218 +11.525301587686396 +8.779814056134438 +14.164382553187039 +1.3903580339112231 +16.483061726172735 +17.552097169690953 +-18.50713702288256 +17.707488768712636 +-5.2629469007565 +14.091793568127663 +-16.29887150688171 +-16.391859477592195 +-3.2270050925478024 +-10.47372120699328 +7.227750684298112 +-13.882088566117186 +14.593573208910186 +-16.830535873520493 +-10.066749964400202 +7.742072649397109 +4.12710617145602 +-16.896778323887595 +12.980723858432299 +3.154246857325923 +19.6617199951586 +-5.970368223774738 +-13.300282177670987 +-3.6191592719368124 +0.39168416743626366 +11.946304262022146 +-0.7119436892398703 +18.677417102020314 +7.019766101757302 +0.2174096115755404 +1.767493856774827 +-13.659662298635586 +16.57876284726631 +-11.998172568098875 +-9.058284362896817 +2.512755677853164 +5.56975663454109 +-5.538557159953497 +5.3826509245630945 +18.023291922600528 +6.423681308126113 +-9.8834507500717 +17.217078056318847 +12.501405424492624 +0.8619993533850163 +0.8438481413803274 +7.781502087990702 +11.375819808033203 +15.270729793482197 +-13.466503603825464 +6.915697759668834 +-17.108174579311143 +-7.304672861687681 +17.346304915004218 +6.894776164186254 +16.94459900804214 +-18.671426113944207 +11.774544261242657 +-14.03481875034808 +-11.569411658097515 +19.499569157513847 +-18.547338638945536 +13.33202155872489 +12.859993666993525 +13.895078525029277 +-11.976076444444516 +6.192738458352352 +17.99863522845557 +2.275903720384491 +14.189014146140153 +-13.06466198268685 +3.270350630197548 +15.121231530675601 +2.565227884906175 +16.12101516290251 +11.82861866441332 +13.763341366383337 +15.295482695056215 +13.611189611301441 +1.730460063065081 +-16.21750172634418 +0.37321916972862823 +7.277762034150861 +3.2162948509275147 +8.260274292741215 +-13.43224500384225 +-16.590677688694516 +-7.817066242430615 +-4.790720321684265 +-16.289879287270885 +-4.784236126234154 +-9.335953380913672 +16.76709479177135 +15.714615285925163 +18.714966147178878 +-13.849887661316158 +3.8075676728040904 +3.3854661029467827 +-18.515056829435878 +-5.4409987038505125 +-4.184157023193853 +17.72684546019343 +-7.6872280971642795 +19.292655682626837 +-15.544045681201414 +1.109782197107311 +-2.7156953111195037 +18.621883342446466 +-0.14763719485531368 +-19.42797641856972 +-11.264866925732807 +8.606899585907346 +-14.233743414161225 +12.140854558004435 +-9.548255610741062 +8.491513385893121 +-16.70186032827184 +9.649156457632365 +-12.833377626881376 +4.291033396854672 +11.885946939191463 +-8.006945617588457 +14.840624167203636 +-8.594701119830791 +-14.112823347777104 +4.075920549831817 +17.681980627316925 +10.91971487353604 +2.9795891986716683 +6.2303909898730225 +-6.9537067418611755 +-18.460233588702685 +-0.5202778608935255 +16.56083746913125 +17.162317290099892 +6.522267104573679 +-6.429940923233426 +-11.858961847320924 +-15.288733747601029 +2.725886453790224 +-0.1567612193406589 +16.96694100291318 +-11.180776746473775 +-17.324184351592514 +19.669981039872432 +-13.827808742904125 +16.88560452408384 +18.217789022183183 +10.812350911955644 +19.316691231106383 +14.483906251939857 +-16.228332128083665 +-1.5635368293227785 +-17.8334182960645 +-10.739715983885901 +-0.24145425292200073 +11.076596964631158 +-13.06474307861071 +7.376935803325292 +15.831952667180708 +-6.661689946416086 +-3.923962712868967 +-18.163464393804354 +-12.046984536706699 +16.661010924111388 +12.494910512621097 +-0.4664835454146221 +6.7509562974289175 +9.39202609904127 +-2.935885620293579 +17.116068525602145 +5.552954328466324 +17.861525385379416 +10.072771870459945 +-10.28883392398804 +-19.44948677016342 +15.495770020374593 +1.0771351299952485 +-14.96582334170026 +-9.110217156117475 +9.662887963106584 +13.688533119515256 +-2.794266587766124 +-11.928968070058911 +13.02335358886068 +-13.38708787785861 +-10.49630691219992 +5.637712714119694 +-1.7007813724006837 +-2.037379392567253 +18.499973702511845 +-12.082512345949382 +-1.4793705064182987 +15.687247760390221 +1.0582569842218525 +5.670081955392966 +14.413989467730836 +-19.307617487954126 +-17.362294218165232 +11.416810467918559 +-0.21428215239399506 +16.65616034365717 +18.7709065113282 +-6.732385342269506 +16.421707330115197 +-6.4545725826291935 +-16.511926068460298 +4.7724700393472475 +-14.050935843953907 +10.806591646362868 +2.5613243329611315 +-12.882414143798337 +10.155503547535595 +16.206542602976597 +10.838776536762008 +-13.872839486924677 +5.516812362684661 +-1.9221958529407672 +4.928555796923291 +15.59800654010246 +14.987105171946212 +-9.513020203596332 +10.716081911996088 +-7.075077068505461 +-11.937397958980043 +19.448226055542094 +-3.702387652855478 +-4.34167421878621 +9.44788908898434 +9.731738819592874 +3.976289789509245 +-7.585835199439014 +-12.537045023058031 +-8.502629842770535 +12.067540073449024 +1.8571731060428895 +-10.815531448079367 +-9.268072705688365 +-18.15682415730162 +19.256427442363133 +-0.3659513376954351 +2.2312522012684894 +14.255740353628589 +13.642734637227171 +7.078521134598859 +-13.168451076101256 +-11.68877925984544 +8.790364346729987 +-1.7212597813954886 +-15.899508367162372 +-6.321782812299057 +-13.5869209085181 +15.737862850925296 +13.121509658262745 +10.536814528367163 +-8.52333881756483 +1.5947143374303572 +18.827056102559695 +16.835896375217906 +13.017409294814797 +12.922344486198185 +5.613300697513843 +3.32926374110135 +13.180330782946562 +-7.699687535359526 +-18.797501168280597 +13.456114800604404 +-17.754586574800623 +3.9266056201232438 +-18.084110299296796 +9.33127811182771 +6.348663901645629 +10.422978850681464 +-11.732246558849365 +-1.9363437032294257 +15.426135284415295 +4.933005990505336 +-12.49799049750003 +1.1168534002390587 +2.7552765285888583 +-16.436847045327326 +18.285590301927158 +-6.905192839582398 +6.7085870656872615 +-13.774081810000038 +-9.075342093085673 +-19.518055194358283 +-19.678336259225855 +10.148585688395876 +10.125058287804535 +-6.506170973632983 +13.631508689469555 +-2.6693639359150083 +-7.516304776105343 +13.985721072406207 +-13.739795460669932 +-0.6718616258244765 +-3.948176301480583 +19.22411777863423 +11.963440973428074 +-10.927624928207532 +-2.5935270520449976 +-6.95006096840029 +5.3522412340741035 +13.485736862969041 +-3.5828670797561486 +0.8174930704359156 +-12.699996243150583 +5.778272890045393 +-4.536115198837152 +7.449392883219822 +11.805740744121948 +2.7947764450187087 +7.971256723413713 +-3.6758518879639794 +-16.71075402878392 +-4.186012988118598 +6.045167290347603 +9.768922074094753 +5.839169463252919 +3.334911474610074 +0.06277488215516769 +13.895161946007377 +-5.116994512135484 +19.903505903756773 +8.269215610260016 +-15.644809028351464 +-18.257525909475028 +7.62513950158807 +-19.07449451005745 +-4.899962638672303 +4.225809532062783 +16.417170870021437 +3.6109307513751006 +7.247964778029193 +-11.71856830710917 +-19.953342827619053 +17.403913989836525 +-18.646121353503595 +-13.277370065768043 +-16.018672877584045 +-12.420433532782301 +-15.825490246536402 +-6.307180404914302 +-9.109601657901973 +-10.831083244073461 +19.021722948386753 +-13.185512572147417 +9.095419221472675 +-11.511656371021486 +-11.790245245459205 +-15.498805417577879 +-13.12157428378276 +-2.4871916091098427 +-4.965908331491434 +-11.697379948046486 +2.5267750972131964 +14.618912570927257 +-19.20563286734766 +0.7994043187811641 +19.83785198758794 +1.8899461845851846 +-13.937256173338586 +8.93836032364851 +0.07621424681932254 +-6.800288307933084 +0.4662899241093257 +7.612596236130052 +19.634123508305287 +-4.150972830748273 +-12.500868355275362 +-2.6259766754551883 +-17.288992845080166 +8.80528467719867 +-7.691136788584313 +2.668610690796566 +-14.844290331194143 +15.183540362788463 +4.409733956629939 +7.368136762860832 +5.05894631054117 +-4.147775065429741 +-2.1856639538525577 +2.4284334130963536 +-17.715521298190904 +3.141825555683006 +-9.500194555058457 +-3.719517438015881 +-2.3585331308270163 +15.367680889871743 +-0.9932279940655029 +-6.158992765697544 +6.057325922766346 +-3.395774944344012 +4.666711887133651 +-10.99580637844166 +1.881767612798562 +-18.055383063231645 +-10.40136106714229 +-19.25367422485222 +9.24497259726932 +-19.016211575898314 +15.363828523823749 +-4.6407289144404995 +-19.620430703677627 +-15.06607704274748 +-15.114663126395943 +-8.13401935324399 +-4.101277779626621 +-15.07477696366351 +-16.869897529150037 +-19.603645796920905 +8.566208827772005 +-17.63032449209632 +13.067677884184924 +-9.011462076988416 +7.595043243776214 +12.411151993601429 +-4.026406452677506 +-3.9061226860397333 +13.894184161668463 +-3.266851331225581 +-14.655503737504244 +11.048810480999869 +-8.192009881607074 +-18.575904018497194 +-14.824372007963692 +19.74272012308593 +-8.891522358678392 +-1.0599129467229318 +-17.754782277784003 +2.0544594545554986 +18.57566226362289 +4.106761192675172 +-16.749321429698732 +15.00530362331854 +9.675274249963973 +0.018183974834137473 +-15.133326422485087 +1.6699659419932686 +12.59522743903323 +11.486874175294169 +10.72840188660355 +-19.429939229534146 +5.503894389884977 +18.865665144324254 +1.6535307153775989 +-15.716854112823091 +8.890175744226166 +6.668566515192346 +-5.791757851979341 +-0.42162174475125624 +-19.97503970392403 +-17.55879915868858 +-5.7353522660357115 +13.49510543951721 +18.16539456382708 +-17.18104905212091 +-16.519073023956068 +1.639878908421899 +17.07634824273719 +4.055750230642552 +-14.046515229112142 +14.81818124441893 +-11.386936880295506 +-18.792045686294145 +13.446584378777516 +-10.592084855012075 +2.3816750685156194 +-14.298101594312582 +-13.358331440351892 +12.624620531922012 +-18.809150049321048 +12.885857953679107 +-10.069724341043415 +13.40096886963952 +-1.0624881373286321 +-7.791660344031243 +16.80311949098794 +0.9789914723119608 +-0.019673425564125324 +-10.600789680834701 +-11.846692494566845 +-15.565285275785342 +-13.400836724721668 +-0.4010025708268792 +8.373731149349595 +-15.394459259120605 +-15.467023986356775 +19.212199453877794 +1.4758640596547359 +1.8349530935225964 +19.30353894151314 +5.4815463734596825 +19.928157068495047 +6.135759743112978 +-1.582877808323122 +13.505620718866773 +2.9382263118154412 +15.984581750080032 +-1.162370991294985 +-19.11057452935884 +-16.113074111675644 +18.4480757721052 +-17.059517166160518 +0.5109988138274062 +2.632553351464516 +14.069388461870915 +19.588411266258234 +7.315603623249906 +-4.123718044730641 +-13.403381369130738 +0.5321829877181727 +5.4278120341364975 +-15.705297082079124 +0.31494164992268026 +14.046819453080019 +14.249506822511762 +-17.09093026790388 +13.093878426633573 +-2.348899967313667 +7.298439968909079 +-19.296696177744323 +-0.2186873226769528 +13.388750114683845 +14.157575964621344 +9.451021033147484 +4.701294552034945 +-1.4085856890420665 +17.75454943914307 +16.60183844893482 +-19.159540692368203 +2.108982116966086 +6.367881056317465 +1.536540782277438 +15.684628552970416 +18.754802791139483 +9.232483972673307 +-15.29648955500579 +-5.108267027534886 +3.3541627375080623 +9.394477434323328 +-18.750206642187962 +-17.117199485536002 +-6.156242221138438 +-19.150409042885556 +-17.775745489866488 +4.219197239969873 +-8.752592065451195 +-17.65808236699574 +-5.458908376974749 +-2.9127100744119048 +18.566930531600377 +-15.347373127891494 +18.831046192645246 +19.056443839206267 +10.374043453384804 +3.5722434462815755 +6.0604552041318485 +11.624933344502082 +8.81404866484197 +-18.083714785089278 +-18.593070746872648 +-5.060037640455569 +7.204484494059969 +8.097029497793269 +2.657350907515685 +-14.21829816195935 +-1.732410131809175 +-3.3778054801003776 +5.574677384457203 +13.86425099552418 +13.128077956190893 +1.143257492226276 +14.072789523200342 +12.950959803679297 +-2.8839827400933693 +1.8213633344217648 +10.832014509342649 +10.649096158426481 +-18.55719025697807 +-6.901984259649584 +-11.34438786250402 +-6.183544301956317 +4.866377938050654 +-5.115534167782387 +-6.942552120271186 +8.574526420409946 +5.490771453767071 +0.13675901096000231 +6.1149824874105505 +0.08090891623732333 +-10.778079056745886 +14.237779868364413 +-11.200765857954753 +-17.46514733313672 +13.417033676890021 +13.800355424642504 +-7.225920811598163 +-17.46246010596538 +-17.556273145667536 +-7.304186961702687 +7.694146159207595 +11.371898082009452 +-6.7857593205186895 +16.665792522404388 +-1.3960883845145062 +13.21131414164978 +11.811798639269306 +-17.729725420637507 +8.451321618305201 +17.729776223747606 +-7.299886216917164 +9.445795814584486 +-7.060805800122353 +-5.872116864582564 +-9.28514899096404 +3.453393571666247 +15.31210701120959 +-2.460517754428704 +10.274574688342376 +6.769757309048828 +-18.66970421256484 +-4.682613131280387 +-13.409502271313007 +0.18839150169604224 +-17.98462875734343 +15.049832191983839 +14.098374003167343 +-1.088979017925233 +2.5815672478994856 +-11.91435765353158 +3.829432701664814 +12.700433873001288 +16.746494278569344 +-2.6187227137847593 +18.23424369029967 +-2.5578362554518392 +-0.559372906421288 +13.968275914191992 +-5.029322775119409 +-14.02003100358355 +18.04550229310668 +-14.352738907857038 +-19.31712499790255 +-19.451440476935527 +-8.215524466520927 +-11.666725481059288 +5.472791450666993 +-0.6530632695889835 +19.15578970613212 +4.376382524055643 +19.25676599581284 +15.211478987977635 +-13.888646843739899 +-12.9172876811147 +6.242259374776712 +-8.485767155694797 +-5.894870009219254 +16.97540819087738 +-3.2583576865124577 +4.0718910754729265 +8.488554851594387 +-13.326122226879606 +13.587282537648747 +-8.764626245831293 +17.46036188065891 +-10.615296330389349 +3.869724188541692 +-6.202353090873061 +14.935365229764209 +5.489909236543898 +0.46590764197849666 +-16.801314844475602 +-14.613700237541112 +-9.827551865111278 +7.30458463454816 +-17.100907556887744 +9.912584033550587 +-4.68409962720315 +19.48458974337374 +11.613167508885418 +-2.2985999515234568 +19.42364473256682 +-0.5758472913642194 +-6.326911476338308 +-8.42022126246679 +-2.947427912782004 +18.79738953666549 +-16.573064744330726 +16.743116348064262 +-4.715719880860792 +4.559630760134745 +3.649030814178353 +17.566139687172722 +10.853337984145579 +-2.2884809548674596 +-14.641835403677689 +0.4119120919493966 +0.7347166878293088 +16.969384846467783 +8.082044079691428 +15.220761879459687 +11.653169948984594 +-14.748596093375399 +-1.5187266446504282 +-2.8764803003974357 +6.336239644440415 +-12.379451606529663 +15.100839973946918 +6.181682813593561 +-18.573670516491916 +11.978887392838551 +3.071687699262583 +-19.71779457132573 +17.067796349788217 +14.06334233159037 +5.428390684408107 +-11.7855221548778 +-17.65589928407856 +19.028496061385567 +19.553643228550996 +-13.96333445654577 +14.30944549023755 +1.8822905225323652 +2.9785057829274244 +-19.911580936767304 +5.967918397694675 +14.0831266983 +-8.400143787061754 +13.24312105764448 +12.587751008399934 +14.76133555971903 +3.556083857730499 +-6.3810188995322825 +-17.16991170527608 +15.19946149560441 +-7.231649393339993 +-14.479585756656782 +-0.8034008796414227 +-14.660733865094059 +5.09194058704805 +-10.672000195528488 +-6.130923112956847 +-14.526644208494979 +19.24708863146057 +-8.185433656209069 +10.025387585869648 +4.999016842299863 +19.650998756481435 +17.140278735701116 +-3.3496342723002996 +18.179134577187995 +6.3453743748851394 +14.120411050613491 +-14.075251336827016 +8.79034631280821 +-6.4979576147789775 +13.706617887099561 +-12.335690858266414 +-5.068006483608421 +-19.46507783488384 +-7.048312331960185 +18.76926622873288 +-15.013833093145546 +-10.134029006549747 +19.064913866825293 +0.5865087407414329 +-5.2301670698275515 +-13.678915080911857 +4.776033030108167 +3.923686462793601 +5.095397886302532 +-18.496749680985044 +16.50865485036536 +-10.123891221377622 +-6.308062960503932 +-4.108207426695687 +-16.311264756769617 +-6.145402850905629 +-14.564823423284764 +-9.426902648481574 +-4.181724911016168 +-10.204221914042115 +12.162609290974089 +16.90696600385627 +12.95736471120285 +-19.276419544888036 +10.505670376897616 +-0.6909723299737678 +-8.161092257221437 +18.044715434395485 +13.369034151936717 +2.575938469270433 +-4.4797707805564535 +16.012500975073756 +0.40321437858013454 +10.018252706401416 +3.4582977231739633 +3.3508463923448275 +3.888375719863909 +7.157061140985693 +18.505678543359764 +-7.19876288821947 +13.993280722725473 +-7.899484294785669 +-5.303825048734021 +-4.136978141484601 +-3.2106145434908164 +4.87296745170978 +11.925157674002872 +-4.054426115334833 +3.385156578091607 +-18.20387162296045 +12.925479151264042 +0.3418334231756539 +-15.620812466257856 +0.3355402195005155 +1.3918568073558149 +0.1361991617648357 +18.87905154100641 +2.8405446401373133 +12.444546360624642 +-1.6730179019786178 +15.22880488876175 +0.42769805915767023 +-6.760468721293202 +-8.861165578560959 +15.84427409231811 +-2.0782238309596934 +17.831724839358372 +-17.143853186606943 +12.247321537527 +3.3943858987256945 +-1.2104593146145923 +-10.33818579764118 +-15.215644525414614 +-0.40173639523025173 +-14.503064939350882 +10.088419957452388 +-4.6736731027577285 +-17.815911305230124 +10.651413713189637 +-14.285214671484926 +19.537185494858093 +-4.260737796790281 +-13.765279297517324 +14.024499870840913 +-7.423073742777619 +19.366110421806482 +10.24675455520913 +3.800632724661078 +3.131842467607928 +11.143031593900872 +0.23023347664519633 +3.174913664619808 +7.228633674688378 +4.111629607624941 +8.775804302242083 +1.0371881100962312 +-8.4774555067911 +12.428207366321352 +4.085624296518734 +-18.799829447340585 +8.833108889901329 +-9.461235311026353 +-0.9878616840604728 +-9.369724691305121 +-17.03784614563281 +0.9022583790543557 +16.052270796979954 +1.5177988403685276 +3.783049055011336 +-11.451462592626864 +-15.235150210029342 +-3.0457467067385515 +3.8278975710760577 +-0.9220591899064488 +-13.515224459515194 +5.258739928442218 +-18.111810035663 +10.197788708136205 +0.5533133323981296 +-18.868184087433274 +-6.412741874872317 +-3.6902586225517524 +-1.0660774843047918 +2.3465434207644336 +-15.584080157434022 +9.86753841862425 +19.665612689583057 +-2.8832680595434184 +1.5233572094837555 +10.32822366161345 +-5.763781246409643 +-12.095487350104221 +14.469473689696663 +6.60555272484789 +-0.2293051700283577 +19.593721808694156 +-7.47291431711686 +18.28061290471041 +5.362072147563044 +6.4192002276285685 +-5.095452230395248 +2.2651447677101473 +7.097926233486291 +17.907823066474215 +19.133120399244426 +7.695699876014288 +-16.528611513283636 +-5.475298863938637 +-14.979641576541972 +2.105656082609375 +-3.90697914235416 +-17.75778331570145 +-2.0258230895331373 +5.891342289825857 +-3.8620094365825253 +-17.415430813619984 +1.522221588953876 +4.380912745436692 +8.691092860310285 +18.089848514561126 +19.711376532464257 +-19.743169642086013 +-10.825088645493626 +-13.639051273062218 +17.9975263879374 +-0.3968554854517379 +-0.7533457503575747 +3.615028022717137 +-11.898061955298541 +13.448367060238894 +-10.188379815093489 +-8.862975842041529 +2.746366904376476 +-18.246321290981026 +5.251035550569366 +0.7634716892424649 +6.243244550017572 +17.275192464484817 +-15.799142509950869 +-0.03008084305161063 +-9.593719754568749 +14.162356311843354 +5.799223487368192 +-18.563333090965223 +-9.061864975318109 +-12.145768501298786 +7.1012383060523305 +17.163376102135885 +-12.541499306837833 +-12.301985309757715 +-8.162024468365043 +14.784691174883797 +11.599793729762112 +-15.47884514562158 +-8.726692017931178 +11.114180171757116 +19.338655853115768 +8.976826458858884 +19.918464063442606 +-17.263372058868253 +4.900418753809575 +1.742229022527198 +11.850607955770414 +-14.879794955516568 +3.1080447756229255 +10.871923224129006 +-8.485444340951496 +18.991759753608605 +3.326203022410816 +-5.306672142499998 +8.786755562905881 +-18.775673189676915 +3.5191788937317092 +-3.4509935753102923 +3.8216346919499884 +5.63797678448346 +2.5257834589441366 +-13.342866543354459 +-3.9984566992371953 +-4.816935729410169 +-3.427643990686434 +-17.646142566358233 +-2.149639245871775 +8.540263846271984 +-2.8331436741958846 +8.244850211580243 +-15.556697800319563 +-7.395527385271468 +-6.019452778883462 +-4.862435793767169 +17.631605545201545 +13.51150312644046 +1.2014128464076457 +-16.456582369445726 +4.69805641890369 +3.846307325023602 +0.8755023276006995 +17.037178087197077 +-7.2726937254103685 +0.8941874762602424 +11.500502395160801 +15.377291252871544 +12.442542564545732 +-16.212390157527764 +-7.6571136981593355 +-2.94579568014683 +-0.976553641663692 +14.125128958339332 +-5.732582386578313 +-18.155950010115816 +-16.651386252124336 +15.528507998660984 +11.27246796745623 +-15.09506691678177 +10.69259098036925 +-12.359822295541045 +-9.418925594559852 +14.502547185853764 +-15.390024894724883 +5.980861228665752 +-11.308908736179095 +-10.773470803396833 +3.5157732134862485 +-4.791445167761239 +14.325477449181811 +-6.966646760345586 +-10.158797500194483 +-10.946066922582967 +4.4325348602815495 +-7.751524499239487 +-12.1400565381953 +13.273253658624135 +-9.493483815277601 +-1.6149512248789257 +-4.6403123578133165 +9.8861955273672 +7.0264475394216035 +-0.5339686783736006 +-6.382483954054429 +-18.993987059632445 +-3.0858333640792637 +-17.41937506463794 +-7.033491888711133 +-2.4526911793141934 +-18.93646057066233 +2.896766874908643 +-18.434028963531055 +14.94315628800689 +-19.69953179393852 +16.02995602280118 +13.85845755103206 +-3.669449289701401 +-9.144480437218917 +5.146709258962009 +-1.9194737905609145 +3.885273306420661 +-12.3890665926262 +-5.053113066198861 +0.06701469291305884 +17.973824240165648 +-19.870278611549523 +13.128537801618172 +9.341680379902307 +-5.568468338518242 +-19.303516293666508 +-8.08762149404242 +8.163649743945939 +-9.511280103279036 +-0.690740048278581 +14.446196222816937 +2.378466628909859 +16.585892375174396 +9.75941834058581 +-4.266663891507809 +-17.683395254751865 +-15.42508455472742 +0.992169341374094 +-9.006492358911018 +11.79864477131698 +0.7063361711767797 +-15.041404453161933 +-1.678353621299614 +-12.564572110253373 +6.006224025340188 +-6.2544778674095305 +-4.011738647267311 +12.079013449533285 +12.847535209238593 +15.575365591035855 +8.785964866545992 +-6.754512868730274 +-17.488732183628663 +-5.240367540351052 +-10.90677255095918 +7.101185805247198 +-4.8250959314128306 +2.612654987868879 +1.3673565056748131 +5.910255219276095 +-7.5341989616802465 +10.585803841145875 +-15.924593221816124 +2.206297464595931 +3.1634465417207025 +-15.599488290992408 +-8.740640533198182 +16.882392526176567 +11.485190658658482 +-1.9725457844143293 +12.332704106375957 +0.3234951496118974 +-0.866091122604594 +5.4918048459204485 +4.5136506678995225 +5.243900319847754 +-15.35151322672441 +-6.668242857795764 +-7.455051220370287 +15.588023608750234 +9.383028540927619 +18.72351903144957 +-8.725988878576603 +4.549747635796475 +2.7174105213607724 +2.7475943250997226 +-8.238167710025635 +16.103198145684964 +14.74188380218009 +-15.111461841708289 +-12.182515342412232 +-4.541045826787432 +-3.069500656328131 +-4.57077979642234 +-4.847370227786945 +-7.379706097007098 +5.198772851936063 +-8.128754341402296 +-5.403546926250247 +-9.684003662577831 +-16.06469554145675 +12.139289921933617 +6.965539588701173 +16.957306305177767 +11.459717593430753 +-10.597548098817615 +12.2398645316012 +14.464934635618391 +-9.723728108709352 +-12.552032102328008 +-10.350961351568717 +16.75102721253041 +19.817032352599057 +6.027308918959594 +19.362550709205266 +0.5983770838182387 +-13.801807519902397 +14.015908622380778 +18.04107270670896 +-2.18071713880704 +-8.606977493696197 +-11.368333124836525 +-10.323008303957337 +15.45216788841423 +-9.168414900151474 +8.835185695311687 +10.795803629602428 +0.9725770448565427 +13.120353535150102 +-9.285685913562393 +5.519197771157984 +-11.703978021307986 +1.4315513997966747 +4.40445047324814 +9.57725403973678 +-2.650282290951658 +-0.27742584753132604 +3.08923656885327 +13.44644344854099 +-13.108295731119007 +10.815092032481445 +18.06380793240858 +-10.565397284201499 +-2.3430285558483703 +-0.5664672736526235 +-16.131668348279348 +-1.9099977855329442 +14.258098825067052 +-11.368369125808396 +-14.014187077989849 +-10.19483569248659 +-4.26988383650766 +-10.866019782835203 +-0.7373477998460096 +-1.1394518136297158 +-12.129288898524887 +10.44743815431216 +-12.519490978048573 +18.71121430879829 +8.432078492472886 +-19.386108239480407 +-0.968164325975561 +-2.823054103524022 +12.151746449065584 +-3.7835140824144915 +8.520557574813601 +-19.198055328713654 +-11.296158749463935 +-1.8237493308363568 +0.0013333267431860918 +18.27058793005618 +-6.7682803032509185 +-11.410106297217286 +-7.5635060610693685 +-7.9314626216540205 +-3.0316399399244496 +-19.816771381446454 +-15.92034089701665 +18.473543851423976 +-12.235325459069735 +-8.47381608510867 +13.99878967413796 +4.008098003533661 +-15.90100538714486 +-11.387149698760615 +2.4740202234928503 +-13.955531387137047 +16.131917622971805 +-6.715938479676362 +10.510170472111568 +19.01653321407057 +19.94350277295088 +9.350589383204046 +-17.698680256756305 +8.874532698576594 +-13.393443331479151 +-2.8438519097815593 +-2.6856502648183245 +10.460609648708136 +-4.400797548322419 +-5.330460626246424 +-6.020324051277193 +-18.978140413925022 +11.165844974665973 +-9.745796730127271 +19.860557249278735 +-9.928058936142573 +2.518696461867364 +-12.884015719328419 +-10.821829368751029 +-7.62196894704716 +-16.152743884879822 +6.997079643840863 +-2.793216394131804 +-10.741064339700625 +0.3862515980324588 +-16.901203405918125 +-15.712319855438368 +-4.02412676441363 +-6.124947637917536 +7.469587981257526 +16.78239582708479 +-17.863061220497922 +18.192329931274628 +12.440065170014407 +3.982655301564062 +10.625232169750703 +-3.9959661143306455 +-17.853326534326225 +-2.0576011746635317 +3.2712345749556917 +10.65290759399658 +15.351343487705691 +-13.103050513678651 +8.955663799976364 +14.585798354897655 +-19.27804308189486 +13.887192576577043 +14.775699274495125 +-13.997577553870531 +-0.29854748509415074 +8.987041199174882 +-19.177933013082374 +-6.125610152914515 +-7.0186871262442185 +10.756872361396866 +-16.105663136706774 +10.403869385370466 +5.408558571948877 +-18.97705130882116 +0.3475677697369228 +-15.169137163840336 +-1.6610512893562621 +0.18002914341659704 +-11.437048359292898 +3.937680203566117 +-16.14381593625165 +-18.738157432445746 +7.849172056660873 +-12.27964042174284 +14.456134078142483 +-0.7727159863030799 +-19.18429503615392 +5.801739367982741 +17.186421651864322 +-8.869799418652082 +-11.104825267635823 +-11.604390095904606 +-7.443924543494628 +14.876649429377075 +2.668417875568977 +18.737155799194845 +3.9497914889351833 +-14.226175513487691 +-3.4037803660716435 +-10.738612353260244 +-14.030937257907583 +-12.306589992859847 +15.552036055647953 +8.21390492678205 +-11.840139315820055 +13.197818024652612 +-6.433949222934272 +10.208184440064038 +-19.91607484089469 +-8.580003335509492 +-16.572877368160817 +8.733076955928503 +10.628934166447799 +11.048623892977112 +-6.667070115124156 +-14.36112364737987 +-12.054430827984572 +17.770692891709075 +7.886242683315924 +-14.529387720790794 +-1.054706542343034 +-13.53517742904617 +-10.216200228768372 +14.236754969809134 +-4.574739481961899 +-0.35401235058162683 +6.857192304154257 +-9.905275043358825 +-12.192700258016913 +11.854180501653147 +-5.355883212975346 +-10.690781136666395 +8.6253351783342 +-12.538869879408448 +1.398924393920538 +8.231571844248808 +-16.396204491595956 +-8.124694010055125 +8.76733911315096 +1.7512069807172956 +-4.724678241892555 +14.158579061374034 +5.167186069802533 +-10.870199072359439 +-9.834236519241815 +1.2306622783570305 +-19.380852244491354 +11.794843015676019 +0.36747013903641346 +-18.366491799547187 +0.86776672040736 +1.1120692087138124 +7.32276806889891 +19.75164920718744 +-5.414705698405754 +1.1243833358014363 +-6.305687854459565 +14.258766106522607 +-19.86230209115896 +5.596195995325047 +-17.852464783244066 +-14.511951042265583 +-15.801149563877619 +12.137864738700003 +-7.688910147148924 +18.62412420546365 +9.813943050510993 +11.0149177115278 +-19.05330492773404 +10.667064867971767 +-7.430630185310104 +8.312447699101043 +6.689017621712697 +1.379986997009027 +-19.175161725485577 +4.143478204990071 +-12.562888911444645 +11.903771798679653 +-15.066856940151858 +-15.985402869924531 +19.713913921812363 +-6.773159754031504 +-11.54993857053729 +-9.143007120687816 +7.533831623034082 +4.244828658484696 +9.0970320982224 +-17.39082100081015 +2.3979009060516105 +-3.770553222341281 +-10.198029357764945 +18.121509643924107 +-12.388690630691563 +8.883809506815044 +-19.078488545690995 +14.67030306083052 +-1.878086978665685 +-1.8298490698632577 +-16.040335868592628 +-12.54045939112527 +-11.42404650531233 +-4.7083092760214775 +-17.84074789108777 +2.8161056435116976 +-19.39812802012709 +-3.29635004614763 +8.190199899774449 +9.302633874381069 +-18.123677786086603 +14.179223301715446 +16.391481261076734 +-11.543041479105508 +-14.452857305237643 +-17.40777737077947 +4.55559425301697 +1.2448054445157375 +-18.228670718204484 +-4.389431146470667 +-12.195690387188996 +7.670774883401297 +-5.316629655120995 +-18.30620532222285 +15.059173842635673 +16.367496008037378 +13.195667865816645 +-19.0419037118749 +-1.0791715250868634 +-19.922905327036627 +14.339966941247589 +-0.7201419383208645 +12.648707799295046 +14.165643282620948 +10.563859807368697 +14.52485241887699 +-10.460335872190054 +-17.592836336711475 +15.742419291414109 +6.503287058436932 +13.068326699914351 +11.433733364413694 +9.840522812714664 +12.016157729127627 +15.592727824807909 +16.476095781546803 +4.415703119953598 +0.15250751251429762 +-15.557285718842063 +13.341750402222715 +-2.819085345892578 +13.65261715742517 +-1.796842933235446 +4.775092037623519 +-8.067108814629407 +10.01838377574968 +14.806561124942178 +-2.6973969506537507 +13.63471193743554 +18.00035855857307 +13.57295280895923 +18.07913072496426 +8.057553311528714 +8.13021858655885 +10.617042891396519 +14.243218992018292 +7.7166905396816645 +3.798361379829231 +13.456414933107808 +9.905984107850522 +4.7547928310660765 +-19.910604654850154 +19.82243488804906 +7.887590834984358 +-6.548949190482807 +16.49205027752479 +-14.594911132000131 +-0.9582004054469486 +-5.140353019895368 +11.392241209490045 +11.581127750488992 +-18.120955264495887 +14.416554255914825 +-0.1683289917841151 +6.2516896250232925 +-19.815283489178608 +17.073650871859975 +-1.416150772607672 +3.1259074247222003 +15.28654218351609 +-0.7774984722613709 +-17.05713047843372 +-18.193472830683977 +-16.92770248185429 +-6.274421147469326 +10.28674372035255 +-2.8001192884042396 +-6.869333297551918 +-0.25065839158246916 +-19.88461193490766 +19.50091337752025 +-3.7175740258042467 +12.178284923317698 +-15.220527720442455 +11.943817926932404 +-9.349951946965312 +1.2162150942448164 +-9.436069860882089 +6.4153379081679205 +17.91233409886147 +-0.65423714160206 +-6.7049281108290195 +-13.831454517568215 +12.499056736601212 +1.282621345894004 +-6.755146373237221 +8.712443059306779 +-9.702744237956967 +9.66340786989582 +-1.70065935947461 +14.179270790001553 +18.508321452917038 +-14.103422637486096 +4.352408192741343 +-1.1502960187452516 +13.389678236975428 +1.6433007667971076 +18.28520523546188 +17.477239172678082 +12.52659412700443 +4.901340233647673 +9.446884820699331 +-11.542308088265969 +-8.730807695248167 +-6.232786889551933 +8.131114411094181 +-9.252138793192287 +-15.802329207918442 +-4.6149561820178775 +13.466282799128095 +-0.6741606763031811 +7.579214759088394 +8.930487148729846 +13.836428209685437 +-0.34089060339795907 +-9.852332846982662 +-6.192419957321151 +-4.529673685776938 +-7.2987489315523835 +14.637424295979272 +7.022372322837825 +17.834669434500753 +-8.546563082128387 +-7.2660414927082595 +8.267235164867017 +2.008267920849093 +-2.3807604729646457 +-5.942583882877418 +-16.38805886082331 +-16.46974761177638 +2.220637027146193 +-10.987966033841289 +13.742156001087487 +9.293017738254466 +-10.317592757666084 +1.6416023363447465 +-16.21348717005587 +-17.461107782910705 +6.91573510847423 +-11.38266950438172 +-12.81555840566921 +2.9448903176857364 +-6.727892798947233 +-15.55960422660478 +1.930090406724073 +-2.2484771061991253 +0.3190474544900468 +-9.41131879560572 +-2.418274395194153 +19.701251276257523 +12.544721939747724 +5.840604691315335 +-18.24151119415637 +16.64465577516672 +16.93367662236588 +-10.056103565320278 +19.755162783957317 +12.404323859338675 +1.14072957322459 +3.54770974417681 +-17.35425034964061 +-14.60370142140917 +14.443894555549946 +12.581218101302902 +-3.4611546828925164 +-7.145351556621655 +16.49002002339784 +7.77551090739464 +-5.725154707100799 +-5.413279968417356 +6.458985575214491 +10.599281960811545 +6.950049470869828 +-17.860372271411155 +5.67609710803233 +6.6146448594799025 +2.291038096201831 +5.928573816292175 +1.3973618654735134 +17.036480840275082 +-7.475383978538082 +0.7259644731870942 +4.397339581299118 +-2.0904974301220527 +8.758711935408417 +9.025235729877839 +6.675436809598395 +-1.3978734640898622 +8.664611876892621 +19.29395997598359 +12.207664081707975 +16.14061622066481 +14.566675458496832 +-18.595856646867993 +4.462417512501894 +0.8242267276266588 +-10.898482729776685 +-9.69855020608736 +0.6909060957120339 +-9.149746296406969 +0.884432525063346 +-8.671040605264606 +-0.9194382696413683 +0.6318923674768229 +-16.02783427263396 +18.978367740019316 +-15.628712922512209 +14.77567068036705 +-0.028789097172683853 +-12.96780573436616 +-9.236684603232789 +2.9385297259968155 +-0.05021054428118177 +-19.79927770786705 +-4.541429021776278 +-16.490459641399013 +9.907503955981962 +-5.472103896483649 +-11.901792685997407 +7.453951469166768 +17.652257804873045 +-14.47003565838751 +13.667919006601586 +18.900595272476302 +-9.095145138378573 +14.834938292013682 +5.5791051150372795 +-17.34845536704451 +-13.098870914385792 +-1.8526769009347497 +-12.612772364415324 +-12.891651202083816 +18.4038846745946 +-2.4331245686128185 +17.009909213677105 +-7.780458475378689 +-11.856996275031024 +-7.432711381927351 +1.9938426901494708 +12.749157121755609 +-3.593749043071366 +7.675848658700385 +-10.853228571538773 +-16.682029417238358 +0.1326515208833321 +4.78734245798886 +-0.5641213378560224 +10.491929118159 +-4.302964338577539 +-6.833107579822858 +8.984944262237896 +-12.405506279573032 +-15.704741077230429 +11.61306891134096 +-0.195364946824526 +-8.34423577910858 +16.392351664783583 +-7.750602088441546 +17.86894351496621 +-5.6982234134523 +19.706791566792226 +17.97221367186664 +4.723989152269134 +-1.903628666963101 +-11.224411763856658 +-13.365630862863425 +4.827860470232771 +-12.132772236443468 +-3.5743472522805853 +17.194152839689167 +-7.903479718203439 +-12.22691498085557 +-0.25334163201791426 +-19.393182928655087 +-8.529861136231926 +-17.44722277586225 +18.87434389802791 +-9.404333092403032 +-14.053849509087431 +-6.067805545307326 +-11.112820676783087 +-17.33222685532993 +16.26442686546178 +-17.015410500644144 +-8.204842567009152 +15.751428948452322 +-11.024283855846937 +19.417951924924786 +-11.575577069896896 +6.14294086237193 +0.06168630733727554 +16.591892378702354 +13.597048750887488 +14.32904158377444 +16.31594445227944 +-8.85416656205658 +-5.1485090377824285 +-18.798791723319646 +-11.493706595749597 +-9.48027513145345 +9.085523414392785 +-13.03406681132676 +-13.203263643012368 +-9.037601675433615 +16.94268084704789 +-17.556641321620575 +-14.982465222468342 +-9.854240173860859 +4.690606545983549 +12.703523556656265 +14.04878505144736 +-10.465616536027472 +17.037008955785083 +16.96159822755738 +-10.866815883657694 +-16.033883050385114 +-17.208972127490505 +-10.631208240696992 +-0.1284157395675578 +-1.5040516629178313 +5.731320645909026 +0.6865697783370273 +14.444466798556242 +-19.14083958797768 +14.33767031249873 +-7.304431640208842 +17.241539632661045 +2.7349689311524585 +12.329203989312312 +-19.80490648799748 +-1.4507918671780047 +11.202091409956694 +-10.896762064065854 +-5.077878675704346 +12.46085406835298 +-8.94144542992799 +-19.684668779033313 +-9.257084877216869 +-3.007567349854593 +-12.312574468583076 +-15.300031333048647 +17.588336345916133 +8.290530342944926 +-2.860820930103177 +19.00809645387917 +5.336851358682274 +10.367577054521227 +4.757035214873582 +-2.6639313741825497 +4.412571137750646 +-13.442937112224648 +6.301303457830919 +15.432484915398405 +-8.646486103937821 +19.90993237493975 +4.033803820244273 +-19.126172961824636 +-3.8004582804319327 +-10.923594893066078 +3.1823659972974383 +-16.45068271365462 +7.392526563167948 +-15.043062656315724 +7.844886984949714 +9.531373409135014 +19.59962837216993 +-4.741734720273616 +-9.688759190180836 +7.101117918150145 +18.620925027420753 +-17.042254761436556 +-18.020234061058883 +-4.561530366413415 +-0.03517188911971658 +-6.724573979497684 +6.076268597985486 +-10.618775055878604 +18.54664275304681 +-0.4864284202954785 +-16.229927796617368 +-18.957149416839524 +10.002947010589097 +-15.987219923070487 +-6.378815143143971 +-10.60836642192517 +-0.7865920683536061 +-1.2804202673790641 +15.565394561239515 +2.164411587606047 +11.220720848088877 +-4.721775221643455 +-5.643248568724628 +-5.371775774387405 +-13.98950567347458 +-18.93026515980523 +14.057352930098176 +-10.75093296894213 +18.082729129732783 +14.765622125604473 +15.885716592887285 +-5.275496432065969 +-1.1461354928885257 +-10.769113197488235 +-18.015573434296424 +1.7017688762903447 +17.750789271585326 +8.502756249557855 +-3.320810833402863 +-13.283886791174332 +4.346420515098281 +-12.540507038334013 +8.304796841559412 +10.893821833302386 +3.194484428394393 +-13.29717499448735 +12.64156125902143 +10.382557557707734 +9.08792351337776 +15.035942182073072 +4.252148831322025 +9.70345092881346 +-15.563011899546755 +1.656628344203991 +-7.061812595197221 +-5.934233505895721 +12.279117539167224 +-12.591447007593173 +-4.263863349979005 +-7.567935531574994 +5.1172660119077875 +-3.2280328116505217 +-9.037792388691322 +13.52847794683769 +7.363523397040055 +18.42132998932781 +16.075822188284725 +11.370136663800025 +-0.11008604336567274 +10.92244687865771 +-7.480187102671362 +-8.079361746699751 +16.787374083907196 +-7.12641138681381 +12.344391803288048 +-4.659880422029685 +19.670835267127032 +11.168411297198624 +-12.19246886414529 +19.10614068302739 +-4.754917044783689 +15.962884911315165 +6.029678876311838 +7.313377704037663 +-12.497226628211159 +7.901570097159105 +-11.389983389228387 +-19.43242574930425 +11.46772528996399 +-8.31876316909446 +-4.848041207618969 +8.143560537475803 +-15.489042849859619 +-1.217641281163285 +13.278015832852468 +-5.099213770648628 +-1.1821918162416658 +-4.06730528071002 +-3.782481099832715 +17.76211210513386 +2.5098980695589113 +18.35662751805195 +-0.7706707117130343 +3.51301976545016 +-0.706131631555813 +6.690648385866261 +-8.43709917834579 +9.097170062556366 +16.63587174370098 +2.159875962114679 +8.85774057075546 +-0.5009108131677742 +10.35650072551686 +9.283825421717566 +9.874200334198608 +16.663047902934096 +15.413989412065803 +7.723032572605213 +-7.186224615282843 +-5.826295278063981 +12.525887190383976 +16.886352854056156 +9.787161696066363 +-4.245761672112369 +-19.368541208486967 +-11.787799089865555 +-1.7807226297439414 +-2.413646199040368 +-9.193893278231556 +4.2113683756502915 +-10.398631394631694 +-17.126630552981172 +-17.550436100884884 +-19.455740116606872 +-12.765976190996202 +-19.13434735877999 +3.4067979515171487 +-13.64128507769005 +-9.591156857649521 +1.1284403099908893 +2.1619241681509713 +-0.39167556410828297 +-5.017860749697247 +3.5068116523467943 +14.965111690148845 +-6.556621155986999 +14.417772170983852 +11.199892798451515 +15.308521680563686 +12.470800478628 +12.235182200028476 +12.948477769757446 +6.7555214593347515 +17.13420761357966 +9.88252374422181 +-11.742780848009247 +11.663162323337719 +-9.450203030597013 +-15.90165459214198 +11.783320500264864 +6.885235343278726 +-12.771457399521173 +3.7763718241932835 +-4.57534568074664 +19.974850820527962 +-1.062699272393644 +14.370801040996824 +10.31995619254506 +17.523317048049634 +7.974897111926353 +2.11520690243794 +6.143423729768806 +-6.216705296619946 +4.221052179650357 +13.03891336164827 +-6.443174514160429 +-11.525002800701145 +16.721939145184578 +-5.7205472176827055 +8.176984432169089 +-6.083641195877529 +11.923081236408098 +19.28051227203248 +12.41743646472807 +-18.204465359664532 +-1.4702518451831423 +-18.8568303381697 +-0.7622570091163752 +-10.190701162868896 +-3.4114029753783903 +9.653237083290925 +12.472501919015436 +-10.816677849120119 +10.203432320066497 +16.964898544702088 +7.931929573731786 +14.987938932346779 +-10.141681556209496 +13.378516432219982 +-16.051376264091026 +-1.5139526659361167 +18.186568996083558 +8.10678426323804 +-9.393564943958364 +-13.369292318066677 +-5.724241405802681 +4.263164121507618 +-16.5966624230092 +-10.400554376612394 +7.582714146211622 +17.09641738216377 +-11.470049320731977 +-18.088255381461412 +-11.560545379622527 +8.493905493739149 +11.505717177586906 +-18.299315416597437 +5.629960735997127 +-10.747292127724224 +-6.062147878376063 +-0.04647445534590133 +-17.86695533764935 +2.815247266927848 +13.432117024510134 +5.703543816912813 +-3.13307606530757 +17.84184785922455 +0.4038714668366268 +-3.6331996299826557 +8.350449911128742 +10.920921923221222 +-18.807918247216744 +4.035324197724606 +-15.24938537642123 +10.389111161998525 +-7.750156439603515 +-12.16064525512567 +7.508021757256742 +-17.1328730744779 +-4.704766825033007 +17.945470145165444 +-4.993016528490504 +-7.164746291777192 +18.907319924646018 +-8.991494290065965 +15.433274331671932 +-16.989536579689243 +-4.752511522834579 +-7.705858483908731 +-10.455955851574906 +13.803049541557158 +-16.05395141338791 +15.391217931848836 +6.676649976020819 +-13.02915785092313 +-5.101869586058388 +6.436169668450113 +-16.85504750449951 +16.180955195051432 +3.8889426439717454 +-10.091542506005148 +8.693560276330743 +1.867299086386744 +-16.23386005596305 +-18.349148970140657 +-18.67219430324792 +3.6638811838120233 +19.056515850870753 +-5.951278755350149 +17.56869249573832 +11.7474665148818 +-9.163618804885427 +-18.219585269810814 +-9.973231714180608 +16.611523677794636 +11.388792313619135 +-12.103870285636024 +-13.73856315421007 +-16.398786055993327 +-5.486904645775134 +-9.294888010951553 +-11.589288898935685 +-17.09930327515023 +-8.411686816776562 +-8.832037328364656 +-15.43630726821756 +-16.79998297782383 +4.924495132592639 +16.671122141567977 +1.5406863610649388 +-10.119788467318118 +14.262796059216456 +-9.702125283883788 +-5.1881640190380764 +-1.8989681802803418 +0.34290216589013767 +5.63697094274162 +-2.254802898042499 +-9.747408062922105 +-5.663361896381435 +-14.461851524482604 +-8.537611380641792 +-6.263403350624017 +17.036717945500676 +0.16630697612065148 +8.062786315743224 +19.129808156542552 +16.155476673795704 +17.75021487093001 +-11.760181183923418 +17.104883736768393 +-16.531079671596117 +-18.392739447411245 +15.592095657457811 +6.525145932625321 +-15.61789436876493 +-19.7166905105466 +-4.066727389753137 +-10.349948542235477 +11.396862279495302 +-17.42809236727875 +-11.006301358066203 +7.687074429123083 +-14.068140360666117 +-13.307231751598207 +10.3077580439253 +1.8355095216940533 +-7.291285448766601 +-17.093391881374494 +19.66765472069803 +-4.905124789944555 +8.268744024864397 +16.2890991129428 +-3.1861477638742777 +-10.987103185073606 +-7.915090878168387 +-2.9059345801791636 +1.4610336671750872 +-4.674487382570716 +0.28167794502429544 +0.449904501534256 +17.953925349205043 +-12.258481138116824 +-10.116247746206103 +18.558933195077522 +13.331686276571688 +-0.4045934709168364 +-11.771240916005933 +-16.781378287902058 +19.433688078662946 +4.76869640508896 +5.639169351474777 +8.586452002554363 +6.583246371868903 +-16.81188911804302 +-18.490095669861056 +4.752796035441786 +-12.799104959754244 +9.132539948221591 +-15.218459052843553 +13.750522030087708 +16.396392458045312 +10.186530613724607 +-8.845789629945102 +-10.383874783065954 +15.081189786985128 +9.292248627299422 +16.458587623983313 +-6.977380697692773 +-0.7207655977231511 +18.915126332208708 +-13.263050624223226 +2.0621747355066233 +-13.119161776193394 +4.007817051603361 +-6.177338138588539 +-12.895584355648303 +-0.830880389531707 +7.421740880367999 +-2.6791180339004548 +-15.297208363732025 +-4.1317503391048795 +-0.46002051506379615 +14.980774754309628 +-13.63442313290462 +7.615430732681936 +-9.188884791671255 +7.427316353170834 +6.020635735418779 +8.139509001305129 +-14.90405741558035 +-0.1647507971182236 +18.835045904768407 +14.811376329865034 +-11.0334003400778 +-5.298971060854591 +-8.78327340054756 +9.707381276251404 +-3.007496030115586 +16.27314634449567 +15.53796283905875 +-0.13558161715209494 +-7.387728619605198 +15.82182175519064 +-3.436718697746919 +10.67215597534134 +8.396536063120745 +-4.612936521742981 +-15.96528751433853 +15.53369354974906 +18.51080042475791 +-5.861932037826332 +10.189925064452861 +-16.917861922281165 +2.414267419880126 +-8.466764175274268 +12.885746434601089 +-18.565996953375873 +-15.467923530118316 +3.2570408333426926 +-1.33552221053057 +0.10895582597637699 +-18.634547796145185 +15.075135567921862 +6.486047768202546 +-16.259711617088062 +10.313951487440114 +11.695621198270764 +13.414548307318725 +-7.534138231331941 +2.814666560598912 +8.57787028767294 +5.394627941099603 +-1.079357571003765 +3.036942558319705 +0.1924251670415984 +-3.383715495666305 +-10.457301352063087 +-18.819597868809996 +-11.622090342638156 +13.122407183697234 +-18.034891807244154 +6.753616497041257 +0.9619236001392792 +19.27040351356893 +13.026118428487138 +2.243900362927299 +-8.45969814886712 +3.5891119134980016 +3.6810737629197767 +-1.573791522996558 +16.94382167839641 +17.126173746821813 +-8.946436006527719 +-15.2674176516682 +12.83887921664062 +11.438515093043709 +9.511594354779639 +12.068993326332517 +-6.512850175414453 +17.9031034160898 +-16.606640828411557 +2.801184008562295 +0.3634594543729506 +9.175764234135215 +8.411522797920657 +16.16342413944451 +19.98423965976039 +-4.319525907566334 +9.686729427536527 +-5.997958785074875 +14.924066652408804 +-15.40628394704957 +-14.786080139674226 +-9.6983665989461 +13.715088507428703 +-10.478458945099941 +-8.573502535062323 +7.85152099757066 +14.4523826949817 +-3.467217142890618 +16.982843518945778 +-4.304659736145391 +11.064702180447362 +-3.723800053200801 +12.483310306142712 +-8.172950237548786 +3.8853465772163887 +-18.488497509688465 +-18.071390839137415 +16.981524180677127 +-15.919307111031458 +8.672276351665815 +-17.2541696012162 +1.030999912439917 +2.7781940696882472 +-10.70389387199616 +10.072644681542787 +19.110345448518522 +10.32242716203509 +7.034468093729018 +15.337762082707648 +11.991705632522645 +15.93934742692879 +16.609434390424056 +0.01551209261224784 +11.073698387453966 +-14.114089049750035 +8.328469652362202 +-12.827933375923454 +-4.841089347646022 +-9.454331341593424 +-15.427717413896364 +-0.4412049200398336 +15.02420492591925 +18.770051701367507 +-12.949327385519531 +1.6805239351187105 +-0.8021827581235712 +3.7735521915272976 +1.1463171466502153 +7.894240345758195 +2.80117497512267 +8.519718384822554 +11.738544400026246 +19.26997905506306 +13.109541867966065 +-2.248898577456547 +8.346498408539318 +15.337789278246802 +-0.3127148422417534 +11.129224575436481 +-19.03475379387973 +0.09612430987803933 +-2.2087558873340996 +-11.934118884147974 +-1.946624040731443 +8.264526841980562 +9.767775542666154 +-10.14296000133288 +-1.55006704636358 +9.93977367399389 +-16.022638037478117 +-7.417239808020678 +-15.480797595010243 +-12.083937573029967 +-0.5920484118090101 +-6.8203909802504405 +9.197354306875472 +-18.949342408817955 +-8.730175987695041 +12.304543350480763 +-16.757379019839767 +-16.320583728715796 +-1.6582944909416462 +12.321565375965037 +6.149324130488367 +-7.841917327605547 +3.6429706783900464 +-12.305984264270098 +19.024869898500093 +15.307247693763834 +-15.629328755464623 +17.829177625904762 +-1.6959981242291562 +-11.061044922908518 +-15.775963924106641 +-18.371056517058534 +9.716390036602 +0.10106012728036262 +-7.0325215117291116 +10.26809937105854 +-17.377989344424634 +-12.971221528978596 +11.071496742419221 +-1.0648874085984694 +5.659662280190545 +-17.967764784070255 +9.884079003707456 +10.855730201572825 +17.395077966270186 +-4.8017324567229345 +7.98012017559936 +-17.012235650325596 +0.018837446113799672 +-2.1819675850734868 +-12.133558080234788 +-12.078708803209093 +-12.511886786325665 +-8.569513729441521 +-6.191580915050947 +8.431393742372613 +-5.213359752205054 +-16.447257103235465 +8.653860858629365 +-9.97870148239549 +18.8009353674721 +10.454393777640554 +-14.122821977747613 +0.8963669323014898 +12.983358812429714 +3.469135094130852 +-5.676656699720844 +17.93704744479713 +-1.5336914553765446 +2.3632969456435546 +-16.07364339383127 +9.95699297677465 +11.132479966498046 +11.298421524050994 +8.31646623762824 +9.61726037241105 +14.758380163409527 +5.291571786901276 +3.816652083201035 +16.54681871084908 +13.949497448176224 +18.881846767664136 +-8.932294288512619 +-19.921482180864018 +-7.840097266748742 +9.92797628198202 +-9.578870117300045 +-13.59281817023974 +-14.206987349238108 +9.323940609094539 +2.242831090159921 +-15.180590340826367 +-11.661175914992135 +15.059357990075426 +-8.001364201799772 +7.547342194032389 +-13.92807782654522 +8.318514887444476 +6.740660668296691 +10.431901391911932 +-8.818433037094927 +-10.174823402058824 +-13.16171453470699 +11.081796429920956 +-1.0010549909635884 +12.288410388009204 +15.25604168718857 +8.279299893206389 +-19.87424183047098 +16.145875236535325 +18.56765599519752 +14.529380638774334 +18.985065980207693 +15.907269717725242 +11.2820254013028 +-0.7875566236970535 +2.7287745541799246 +-19.966882800001517 +7.002491494232196 +-14.640448179077904 +-12.182963144203764 +9.73773612990447 +-19.44649797033643 +2.3298062209701875 +-18.27257292692831 +-4.10362502690421 +-8.558123531829844 +13.028967049973367 +13.494333644742419 +18.39583430709539 +-11.246730000938916 +9.906257191103471 +-18.432247420013404 +-15.451853045872014 +-0.2016819274283712 +4.634559376135698 +-18.718118101940874 +16.3081441697542 +18.828941749303716 +4.691814913524361 +-12.796399116303583 +-11.86656057301185 +1.4439512315440552 +-15.059514375727394 +6.215696668707675 +-0.06297539217325365 +9.485484375253613 +-3.351971247211168 +6.432814939948287 +7.454993437072144 +-0.24747125640999457 +4.522941631051488 +-6.303853561874533 +16.669369876557518 +-3.3759068229742972 +12.168965255958177 +-1.2922301334229722 +-6.330366365700817 +-10.800237622561056 +-2.934590212443151 +6.301047467044455 +-11.116688583937808 +-2.220063136069861 +9.099318356036271 +16.48834403137309 +-19.06548665900754 +-6.085145478927473 +16.48609164660163 +3.5584364084546465 +-15.963555291023974 +-4.808980737267902 +9.117174269566192 +-10.544908639502925 +-17.762571222623205 +-18.020654192902544 +-11.570244447270891 +19.08300914927169 +-0.4600412727811545 +-16.572021866014133 +19.421935794450178 +-6.5889757338667145 +-12.136644239549055 +1.8930938731190423 +-1.3695988966049981 +2.2417737604024097 +-2.4525853599296212 +14.902721645238621 +4.756087335658773 +19.13314951849418 +5.922339591501672 +-1.6251744593506778 +15.412758516964892 +0.1283848433972281 +16.215694695620826 +7.751399012157751 +6.926351592962021 +4.10325203113041 +-11.55780210291001 +0.18847038932881333 +-16.696172602255672 +0.7052568802378012 +11.069061054502782 +15.957031857564573 +0.22238362429708758 +17.559986256588466 +-3.3057977885651866 +-0.5044878231206873 +-10.91915282544936 +16.852679350505966 +-16.914836346800506 +4.214718488899564 +-6.551091455780238 +-14.631806347742486 +15.987048539830482 +17.76453648178964 +5.459210984963182 +19.52577782215417 +3.142114934109898 +19.30520558506015 +-13.984037203125572 +-4.91227246583934 +6.254009320808173 +-16.97907880148261 +-8.580112645098188 +9.667770759925727 +19.20440439788063 +9.669492239404072 +-13.672366030621891 +5.772728328238944 +2.3261600857163387 +1.8918436004140844 +-0.5858441447598253 +-15.727813590578625 +-16.61689789173604 +-0.7878644605155181 +-2.2652455352245795 +-12.381959081531736 +12.499606686260684 +1.393883987399569 +-2.6491687482144357 +7.6824702879791005 +-5.062196668559519 +2.484695591385627 +-5.961075522404986 +-1.4575579689271798 +-10.301972412142305 +5.631471619828421 +5.86876195663573 +-5.860833758190198 +-19.94337163421281 +17.70304353927309 +-6.502012442407823 +1.8344170466731669 +-18.072566720981232 +0.8940730539782678 +8.370637974563483 +0.5244259316289401 +-2.051800031309398 +-8.800636495810696 +-6.312209871102986 +9.387001574557317 +-4.538259890374171 +11.452418010106381 +-8.72864229088293 +10.34593616957126 +-15.34881849245565 +-17.011696931659102 +13.913081370578404 +15.656772421178864 +8.739030010738887 +-18.43337170007068 +9.021423952800035 +17.291343067881222 +-13.258857944255897 +-0.6131303511110033 +0.2793535830908951 +16.348877394514773 +2.31942218958811 +-13.470600970118385 +4.9934423812294355 +13.591371990643374 +-4.2995263261377215 +10.475804277753276 +5.9941209673090015 +8.091176816885035 +-5.906484328753642 +-6.117446762963485 +19.88999061233703 +17.574982210352452 +-19.271403771315782 +9.986250152186468 +17.101028947045066 +16.390540975779018 +9.8135828657377 +12.800490297964004 +-10.72234923338371 +-11.787384034632895 +-9.214119224030132 +2.42389567513149 +1.760826713076952 +14.782907916641484 +2.314562472495119 +-1.3144480465561799 +15.203525246866583 +7.70502700069088 +-10.900428730362997 +-19.970029835630243 +13.015135802385444 +-6.262440063197388 +4.847739376788368 +10.724347473689857 +-11.980456343960446 +-2.4376362695678644 +-14.137015080410231 +-10.190286172342201 +-17.28219685060711 +10.046570927961294 +2.4214360226094556 +5.380660735430954 +12.193419498631016 +-6.90708535984653 +19.123252642248453 +4.756826533010692 +-11.594495824048225 +6.749129878416483 +-14.462333614477703 +16.762150422711073 +-10.675004278890977 +-11.40071143300014 +-11.82610105612195 +9.748552506379234 +-1.0027470889561805 +3.633840831263523 +1.1799038403776478 +-5.044136532303112 +-11.00388714191784 +2.5810478097429908 +7.150594941872335 +-14.33118785695292 +14.097784717852647 +1.9985673692807566 +11.7277290280989 +18.519174658347907 +-16.985039957354356 +7.071848739085752 +-19.786079232152083 +-5.7880283235140695 +-11.413127601189714 +-9.902463369038234 +-16.320153088454212 +-13.743880664890128 +17.965626844137006 +8.102190907759088 +-5.841705078338375 +13.039822834784658 +8.256747442467987 +-2.6253134605334765 +16.840503493861604 +-8.743825408236848 +1.5470776279289957 +11.520805650176207 +-6.221714987156851 +2.5697971259151586 +-11.626485221534555 +-10.38293692909361 +3.489716923829299 +2.5360248589165693 +3.204071134739131 +1.7644510649255452 +-5.575699555008281 +-3.072535746083549 +14.893637222345227 +15.747798664633933 +-8.499396272146251 +2.9231518407403136 +6.4959464134968705 +-5.7710863611984955 +1.8157074791279406 +-2.355779570083101 +-10.939908837543424 +12.014549671236992 +9.721306954561943 +-7.730026222284007 +8.226821369066908 +0.49606971135050415 +19.107614762764115 +12.087416680720878 +2.7305907393187283 +1.7738025044690318 +-4.120487961722258 +17.32964385072482 +6.643688285939049 +1.8699422987924024 +-11.397080489301237 +10.86372101527202 +-17.391838971569126 +0.11497630097440492 +-12.478568341786334 +8.034222466448504 +11.006799347226949 +12.651915222731695 +15.553106544704463 +-17.978521716699074 +2.962054164223005 +14.663622077451343 +12.757367392853126 +2.925271211017538 +-7.653531807199139 +-5.672100405543578 +-9.77145442906263 +-10.039531751742752 +-2.8434094989428758 +12.759578237414757 +-8.833536518416455 +5.223336794987027 +9.683135983264247 +-16.796996583287424 +3.8020322951305374 +9.691306513448346 +15.359548421061305 +-9.280227647119146 +6.90893489545455 +-11.670545435758978 +-5.6687214393471805 +11.345597425644307 +2.4792533969861275 +-6.138749364736258 +-3.5358779349834357 +10.632311716794582 +16.82185670592326 +-12.445459665481309 +-2.6876390915276325 +-0.9585592224496544 +-12.624265725169415 +19.121456199837105 +-7.5614718693223 +-8.636675616038207 +11.573134751579275 +16.119419889471885 +14.0792064100119 +-17.93046002355693 +14.164382829562612 +-3.7923680237063486 +-2.2242354433088067 +-16.59754617470668 +-2.3192151400136787 +-12.839644211602197 +-1.6738448758057345 +-2.5035961453740683 +-6.091093159437602 +5.766264310581359 +-16.229226362906427 +6.041714486746372 +18.52396503985409 +-2.4433214502219727 +-7.1187548107841145 +-16.055255305488622 +13.551717607336087 +16.196729469093775 +16.4566747673505 +-7.980968615524478 +8.636546723385216 +-0.20382840070453767 +-11.273125239211383 +9.871976870088108 +-4.586061573194865 +4.68249752559165 +12.471920946531078 +-3.5690328063991608 +-7.224531045513501 +-5.672359214137304 +-1.8376552096161056 +-2.5163640766799666 +16.49946783429545 +-18.564935142115043 +-19.670834257057482 +-2.1811036301162012 +-14.786154469490555 +0.3320093306819736 +-1.3896661075173142 +5.04546452177015 +-3.618568851680294 +9.395887916552756 +-16.882006369137113 +4.508119934237303 +18.467768320171047 +0.49241693434886 +-10.780572277534425 +19.64818425214399 +15.63766664465669 +15.377395115569776 +-11.402481730715927 +-18.894987326492277 +18.04356700160801 +-18.9430043611955 +-6.251882913401548 +0.6638013740055193 +-0.7314440210025062 +14.25005406044346 +4.6329563915480705 +-5.716957550495829 +8.502190703725777 +13.126146262337215 +-9.437779054879044 +7.163490061520768 +11.336972944943184 +18.465603260449797 +-19.666978797701372 +11.39431304691972 +-11.28633436857383 +-12.381626896133762 +5.753458819407097 +11.578365817827425 +-16.2628804637886 +-17.752727438768716 +-5.052493211314504 +-16.07549457765062 +7.769236257517953 +1.9965539736578783 +-10.120199182177107 +0.6920901031601687 +15.86256344527169 +17.590122687642584 +-4.8921198909423325 +-7.78874717178371 +-0.9365337044475837 +9.565229064213018 +-7.820387337254804 +15.261254447134085 +6.905084862832119 +19.50630991224712 +13.587348178332327 +-14.604119672058843 +12.805111672224662 +-10.000969672640965 +9.529393697668048 +-11.49234814376479 +12.98497322282472 +-4.857257372775381 +4.222387809680079 +6.951779210648997 +17.3331842546597 +7.8203724508735135 +-17.08889292660136 +-10.346763165917041 +15.020797706912568 +10.112747848118207 +-6.35274777661564 +12.695106126271362 +-9.349072337309243 +-1.7184429678709812 +-16.662726198888134 +4.349078216800066 +3.1490230056320883 +-5.514776574001354 +-4.381432173988301 +-1.911473303883163 +-16.470917726508567 +-14.606383523016277 +3.6413361867089797 +-4.303530304279576 +18.035785062590506 +-16.965575704095723 +-13.039714921971841 +-15.912071110803044 +4.28685284460585 +18.41840689769122 +-3.634310294767733 +-11.618409704180488 +-14.382395911148965 +10.182528401033771 +-2.9913153098991216 +-5.643584021871369 +-3.5371422034857716 +-15.016148820644695 +6.884552037114826 +2.438983326203047 +-11.983054711289224 +-8.849641512641767 +4.386214749462383 +-6.733091447479742 +16.76387574651266 +12.152797479808441 +-2.7485042770011816 +5.226583538177763 +3.242302425120222 +11.842017656890881 +7.446999487468847 +16.832112921988177 +-5.426368522964022 +6.2117542089652105 +-17.77778235945091 +16.624957626486108 +19.942691857525453 +-14.691228169470296 +-1.6147884174328695 +15.429602011940737 +13.530902655435746 +18.034663325116014 +4.150475844931748 +11.395524669934403 +-5.724106140234344 +-6.1866794075826945 +7.09358817960991 +12.258212685177405 +-8.530014591202724 +11.161115384478638 +-10.852742969248975 +-15.011611333328418 +-7.447513695237689 +-16.4938106623651 +4.549738987915429 +10.355267367919897 +14.66491197436811 +15.435366222458022 +4.766855965053416 +5.780698246014037 +12.127706304736883 +-12.234074114394389 +-3.150747573978933 +2.2190346297893413 +16.570801736974452 +-4.834308951840306 +-5.340284342894289 +-4.02425251736576 +9.772015592094846 +-8.779750765029544 +-15.631792385458336 +13.45132810308138 +0.407987492900304 +8.908922304501079 +0.746583271677494 +-10.719173483140967 +-5.95854716621111 +-12.827956312468052 +-1.7778630108957714 +-1.9416890789355357 +5.020155858038343 +14.403577248500973 +-12.374497875540008 +-9.14780708915288 +13.078703057182068 +6.43568879429797 +-9.782338233813164 +-8.820498987670614 +-3.252418259355899 +13.754410501219652 +-12.279916059698639 +9.297048965594087 +-12.435141278013496 +-14.38229251885689 +-11.88231043584067 +-7.803288222342699 +-1.9890427934964414 +-4.700828979283976 +-11.248726953631337 +8.722586167834201 +-2.328864653721592 +11.066841329763161 +-0.591058524206435 +-8.371886063235983 +9.476005163186084 +6.999606766663415 +4.498253246031815 +5.4182585658273865 +-8.650106763487848 +-9.155777552451054 +3.0212492268801583 +-7.296498467378804 +19.40861287496616 +6.633429269723067 +-2.50202915285562 +-9.260770718230944 +12.266479125326939 +-6.148979173099418 +-2.2896467301480854 +-7.745710358223214 +14.269757376894184 +19.060385480642523 +10.98493445234945 +-3.068552052151844 +8.638891148133261 +5.460034575486578 +-16.860136933370825 +-19.753679380667645 +-13.770104186041028 +15.452387098618331 +11.25313155412687 +-8.283346680532361 +13.08754630667351 +-13.481285649707694 +17.598216376894698 +18.326489901283935 +0.627673032930673 +19.04820514387758 +-1.8454065637639836 +10.234522048717277 +-5.402647790317733 +15.728426421578916 +0.6791750856387679 +17.26584968419079 +-15.889320976456425 +1.2687120762614477 +-17.819143605569252 +3.4626204310175552 +-17.307428286773995 +0.8005995352383124 +4.8425551906756255 +-12.33161905463309 +16.68674426117 +-9.861198787190819 +-10.799631512054852 +10.670031163328243 +4.150982219010508 +17.92751701779943 +-17.769168906658386 +-18.899437182807265 +-10.08266180831981 +2.207297918917824 +-14.762293827053332 +6.987635348732191 +-17.27280410813481 +-11.84280231611671 +18.93154187376072 +1.026970335312015 +0.40978569255848285 +2.9490548633227007 +-13.052854069031724 +10.101553358836782 +5.069379851609099 +2.6975532644376017 +13.978097863011271 +-6.7681852761499695 +-10.464854316720857 +-16.400345775377833 +-15.908139184902765 +6.766843871809787 +4.722148817749169 +2.334357971943291 +19.69758024734847 +3.4203088643987343 +10.615213602817128 +4.172713267545596 +17.576468484397402 +14.193292089898755 +-19.482335532347477 +-14.779917239135711 +-9.2094375086354 +-0.48525974376680736 +-3.467485266105829 +2.056499378560158 +17.292497376821707 +-12.645307114934274 +2.407345839721337 +-14.552303668546212 +2.3542591350363935 +-14.432945568630133 +-3.7938231326787957 +-0.23346326982248655 +-15.60849809182756 +2.781797888367951 +15.46497938055068 +-0.277663288997946 +-6.358208711020655 +1.1575035823323176 +-5.807713598294612 +8.137617585611004 +-12.480566762597057 +2.7170005644267725 +13.688771026691157 +9.79262936909651 +5.977353881263369 +13.061542957648498 +-17.74037032899806 +17.191960477589056 +19.592163540342668 +-11.1258675947559 +-19.696091925423115 +-15.618151068083845 +-11.548409677715142 +-11.710551813319277 +16.452538297402157 +14.042639402684813 +2.2547233994108 +-17.701217425833896 +2.131322996347315 +5.245327641755928 +-7.030501425331561 +18.656323701075507 +1.9126885603813832 +-8.563500216577594 +-5.7027425485243874 +-15.053253562727917 +-18.157225465367738 +17.486443697575126 +12.907757169431349 +-10.13042800439627 +17.540989918606677 +-3.7411459291051017 +-0.5172937419499171 +-2.3475771789884874 +-16.840320525419173 +-4.270960637600872 +-13.150168043341445 +5.98757472031761 +-6.271514586457929 +7.117372639333016 +-12.797861219050684 +-19.073818316935093 +-17.02124951189115 +10.504258979297969 +-15.19766812505222 +14.243582427029963 +3.2483943302666134 +5.840687520987547 +-1.0418690270481612 +-0.6855313931361025 +-3.0417907897492142 +4.123757440770092 +18.143280382946486 +19.7207371057695 +-7.826190653406751 +-16.892916358698482 +18.830783431829772 +1.05158796762014 +-12.132718098666558 +13.677169025356484 +14.390672876291127 +4.247039653695541 +2.6041257081639557 +-5.569845143519423 +15.385752061626341 +8.689053306619627 +-9.647565583201452 +12.730769003394805 +-3.7119012124675237 +10.142402650058298 +-12.259643506525567 +12.961805046203295 +-9.851884949831868 +10.985050749877626 +-3.1358167185307515 +18.056275388454154 +-0.6725882220590123 +2.190810250322169 +17.842420987398967 +-6.155999573489218 +1.5302247407001417 +-6.7171319002716245 +2.445380181589961 +4.6717941479049045 +13.862055323022481 +4.3966330991202405 +-18.344125162353386 +3.123257975416397 +18.315341260849316 +-17.31234250422417 +2.160629638043691 +6.506967329426736 +13.738740478310575 +-14.511072556792888 +17.96121342744241 +-3.8395039162665547 +-7.841012489812211 +-2.221422974177365 +-10.384168402959233 +19.8173216484508 +-6.236666336589668 +14.231208777784133 +-14.265487249619731 +19.59740349394032 +-6.153666207045196 +12.978952632202216 +3.125341585392043 +11.710959970155422 +-11.349478186918688 +13.899689562587696 +19.964032479737888 +4.042899437521488 +-6.996455968012381 +-16.6090838022332 +15.688815474057513 +16.388526177271025 +-5.320070918975951 +-7.163487629880878 +-1.9612355107869348 +0.29529342112004997 +-10.130032715334337 +19.128685852849074 +1.6656314804733157 +-19.88946108685966 +-6.920942558016954 +-16.51414699883993 +-3.8433537575595267 +-16.873275661089583 +-6.705792971520776 +13.124034912740441 +-15.9713388361175 +-6.477802293123865 +18.2631112508775 +16.6294603371707 +14.36558342896953 +7.117634016168388 +3.158463998836215 +12.686913297464109 +-3.8244140175422494 +-0.7962290643250505 +-9.03269847222834 +1.3049996607180105 +-18.96849106318639 +-11.000074401069163 +0.7480001157766552 +1.2088460836050317 +-19.96870403989181 +3.820926273394612 +0.9728447799509112 +19.283619340108366 +-11.966205929834949 +14.590655266223436 +-5.64040584429871 +12.703298854240273 +6.5866744810664954 +-18.79526579462783 +3.2313012113976605 +-5.834191709251574 +10.831710388640985 +-11.043612463202276 +8.564072441556139 +-19.64446035923398 +17.37897185778248 +12.198984125105568 +16.92475162191812 +3.1401158454493903 +6.803159534604223 +-7.6946099721185455 +2.5247339467643997 +-6.89431818118992 +7.389697189011322 +-16.312341166240895 +11.559353602510033 +8.486141910167674 +-19.48749788045779 +3.9313582854629026 +8.786063821187618 +3.7451233993076087 +-13.024357942780282 +-11.34902877196215 +-5.5787332634351685 +-18.110454739814138 +-15.631253369203284 +0.3799129496993068 +-14.056923899409849 +2.8797390252395374 +-19.561609974810985 +-13.194038068056742 +8.203501746784696 +1.6456047391986743 +-4.954546350985293 +16.801995243903917 +13.095294196696472 +15.985350869316633 +18.65014563346554 +9.018311767248782 +-8.988973645144892 +8.24948959816966 +15.445556138903285 +16.929622569749384 +-11.252257549966277 +14.12040865278734 +8.780163090429166 +-19.99202763264551 +18.368485716378906 +-18.116492977962643 +3.889273398531884 +-0.2467447961764755 +9.565101030865439 +-14.74962924641435 +15.01547394855389 +2.6577093283194877 +-14.473569983091842 +11.832119904957942 +-7.016714825967005 +-8.301564129398372 +-6.2686483035618 +-16.31734076489515 +5.2441732246593205 +15.872312386831183 +3.7974559063032096 +-7.346920558311574 +14.781950656863003 +-13.227779166778536 +-17.30348147412299 +-15.356088576450437 +6.756754460054196 +-14.083897291930615 +-7.389383814288948 +-6.650251622432615 +-1.4880283109186685 +9.206476137914002 +-11.41157238726258 +-2.452789539863204 +-7.499557904869505 +18.32036927593188 +16.169095439442856 +8.656838756475565 +-9.552631321578673 +5.9639496608070175 +-14.80159276369092 +-13.385749898794423 +-6.691073156359305 +14.514670343695158 +-13.942094579417677 +4.804451410270715 +-15.105925323300063 +6.4123863893119974 +19.785141526824418 +19.321246100930892 +-13.310523041354617 +7.881984751096489 +0.136284961793951 +-7.930653612272831 +-6.88888965322886 +14.103496971879139 +-19.416731330422895 +-8.514234038871251 +-0.46131326740196243 +-13.055939515740139 +-12.518432995273958 +-8.836410020237174 +-2.8528749570633813 +-5.23829644208314 +-8.71014290667298 +-14.869977803651615 +5.335905823285799 +4.966628392229559 +-18.364776696175888 +12.36593223724116 +-7.1452440353192905 +3.487242438895734 +-10.91543036806395 +-9.234617335835722 +19.907935832617206 +19.416755365027548 +13.735799318548807 +-12.440841787377654 +19.347366645568478 +-0.6359535187235181 +8.249568510665625 +-18.62346571897739 +3.183763496861175 +-7.140007145693904 +5.292885913100328 +14.933626167546834 +-3.723266724874076 +-11.938657488555187 +-1.828659872184911 +-13.277050923598729 +16.27278731749334 +-7.902704267391648 +14.337028576249523 +-11.514130028012683 +-19.527603298124934 +19.89874584817658 +-16.153974543483795 +10.97861373768589 +-2.0294187767589804 +2.324158923051346 +12.973959563336365 +4.724242590224549 +-2.195617528682675 +-6.169780378905836 +11.70974607110757 +10.929012391058613 +-2.4120959211403594 +5.778046249788119 +17.94723242132551 +8.263486122659288 +-8.478190886213133 +-19.46344560145085 +10.272140988848388 +-12.639014632399643 +-9.69839386943702 +-11.520334305432197 +-18.37857813344217 +7.5551691067272095 +-8.925681990098738 +-12.366695374250401 +-10.912265764514085 +-11.910021294046071 +4.586984615788687 +14.93870192939577 +-4.850843125051396 +-13.218352565980602 +12.85476299582237 +3.221077249608321 +0.12950033350337975 +9.662725289734592 +11.228469570182412 +-3.5040182311417283 +2.5658812899501307 +8.984755931360212 +11.018903910587984 +12.184874761241389 +12.86667530770925 +14.078853842147666 +11.982268436767832 +15.19274796822576 +11.74134000593487 +-13.89506017929599 +3.770646178891365 +-0.014619046809439595 +19.45943840493419 +-5.692393479180975 +2.5099423802125997 +4.581460612327078 +-15.343749697264556 +8.67360047043562 +2.590976341340941 +2.3310268744676854 +-12.22329002373709 +11.800095132293912 +-13.266247912453855 +7.5294090525023165 +15.211772248658008 +10.724517392424943 +-7.526569922088434 +-11.537957871356097 +-1.217349529011173 +2.997909571674736 +-13.803001483126964 +-9.013337509886195 +-11.681211882463227 +8.217870166669439 +-17.524363298936684 +-4.409885202523757 +-17.048575062969682 +-16.566353982175222 +-4.8226344363252505 +11.23363084694649 +10.214494714038405 +16.154423126190935 +8.804745819508138 +15.163559965063406 +-6.76445518183054 +0.7006286157345762 +-11.078477328306931 +4.8396555169032105 +4.624765828712523 +-19.05693312304788 +16.417150039717683 +-2.299021655372595 +-11.906684930245394 +2.587358267216775 +10.619855169408467 +16.19830298627283 +-10.546333586488172 +-5.224165181696003 +1.3765508047340873 +-17.84876475039146 +-14.544499475841253 +-17.968267681732005 +-6.2798611261489015 +12.140931530234901 +-2.3277316700781405 +-5.21526974848037 +4.757724391896112 +-12.958159302177386 +3.7277268587268892 +18.135276691695353 +-13.06260525402596 +-2.7416621048333667 +-5.8890723156306315 +-5.227536036614374 +-19.000140603046276 +-11.376348859820649 +-17.23970019885026 +13.63689121896801 +18.691918038151968 +16.331660561901174 +9.576662070011142 +18.672581797216246 +-8.937317187695474 +15.001917659573138 +0.7714474870614332 +-14.870273399535158 +-6.16912999743116 +-8.774692499729584 +10.240187927045724 +-15.91375651148839 +5.107667472980189 +-0.5483616793358195 +5.232031274376169 +-17.256079705611032 +10.099570413142054 +-13.71194690050434 +-9.035520059352002 +12.861664013295048 +-0.6265582405191736 +-4.925747302231525 +19.573739968843945 +-6.987045789723432 +-14.6162023729968 +7.380969204929066 +-15.664041766751184 +4.158901997864618 +5.429968401284505 +4.8740051814128975 +6.410146423544518 +-0.7329628474394809 +8.803849792340248 +-8.098477921244896 +9.998093548244459 +2.7916288550673585 +-10.763955725228964 +18.474688295454932 +1.1739986950998258 +-4.654047361202714 +-8.7300792865102 +0.2839959427957197 +-8.220536615121743 +16.906338789611425 +6.417834876101452 +-7.28538225421838 +-1.724885380740453 +7.550728216647062 +-9.591132056569393 +-2.0827592488248783 +-11.715140278322842 +15.412794533754628 +4.7250987451989275 +1.2362922540817962 +-13.962680843588725 +6.352672788712255 +-19.820997610803843 +-1.1019180753569344 +10.938802296571374 +9.840002974934308 +18.11465692770266 +-12.02797825096885 +-12.388379955848539 +-5.435251421337339 +-6.359088499647845 +-16.86407632207711 +-9.298734302407738 +13.119222939576872 +-17.854930657017025 +15.518257487480817 +15.754070662125265 +-13.156292295225915 +2.036132381735488 +-8.609420492803714 +-18.43051187329888 +-16.007120570209317 +-8.140451157584327 +-9.356769591846508 +8.328700096929786 +-12.578599888020934 +11.225303834700924 +6.519886330861464 +14.881178667601759 +11.356729369892445 +-11.349146228029472 +-14.084553602433942 +-3.965159651890488 +-15.82481253888972 +10.39441781584539 +7.788081928253522 +18.270083027248695 +-0.667237440633631 +-8.447548175971793 +-10.048832288871004 +3.1759860521824876 +-15.620810867698527 +-11.868122694204972 +-11.428251219208093 +19.80542670968221 +9.277985069636582 +6.067199042298583 +12.139179669497807 +-7.000650235158194 +-15.571074422208051 +-1.531908722335821 +-11.35724975946934 +1.3348166880475105 +-1.8536903441872887 +18.717716114502863 +0.6568400165456048 +16.071205815749316 +-17.44001231569134 +-4.990906197524772 +4.390999665090874 +-17.082233493951335 +-0.27112925676481936 +9.82829133119942 +-8.057671317269692 +-4.641075353892553 +1.8183955250910167 +4.2208145434253765 +9.941927071806795 +15.068672619358999 +-17.752133894731767 +14.996121769793504 +-8.022061159681009 +-8.08068866036654 +4.382835343185366 +-16.953958663106924 +-18.006246650456994 +1.5148375142646664 +-3.512640204149811 +-6.959180652261846 +8.607133811543033 +18.486705221824174 +5.86296917049129 +-9.938566503925612 +-13.127014239208838 +-15.913322965864655 +-16.062636257040914 +-3.062847066259934 +16.636354572756332 +-16.508419635099987 +-16.268260281123244 +-12.935128964055945 +3.930224578286122 +-16.864433619412242 +11.504520764396862 +6.037356407861925 +-6.384843335674354 +-4.907884744945203 +2.606151825435475 +6.522371509372633 +15.151392673820638 +-9.26630296809924 +-12.644252279179184 +-9.47819041328021 +0.87915969940709 +13.215237930144788 +-12.364315449399935 +14.373711308147968 +-9.241161713695757 +-10.882037364179045 +12.046499090820205 +-14.739264782913452 +7.525472366575194 +4.653871556239931 +-12.130027828944318 +3.594989347352193 +16.71943969226551 +-15.427482418650706 +-10.400333316866664 +15.406714430897779 +12.683235360891203 +2.840273903006512 +-14.397887128618976 +-13.677049334136647 +-14.957081845991432 +-11.542410517078498 +-0.8931498899948522 +2.328681092613465 +-16.818187040636765 +-12.56777552512962 +-12.34242025450207 +-14.353075869616724 +-4.223955408912792 +17.770787964388617 +10.88339216400798 +-4.017235806300574 +-5.937742313099253 +-0.4133489616551458 +4.725900786253927 +-10.774750025375344 +11.510446908656036 +1.495832844269124 +-10.636489861817754 +-2.0651976606009192 +19.94637456947072 +-5.269518631089852 +5.8447930995397925 +-18.195998055467605 +-17.004181488482033 +14.499766211153243 +19.13977457675876 +-12.330848541913536 +-13.991276332569633 +-5.0408829203452665 +-17.895042409731516 +-12.636982242042096 +-16.82655135566202 +9.421185740923924 +10.312961001764908 +5.519588491447649 +-5.614745798842339 +-7.323334307165226 +-15.315661586987028 +1.568275965628814 +16.417106384082146 +-0.9129430018310067 +-6.350317953369737 +-9.929136529058047 +-4.249934499791696 +-9.782746154491978 +-1.3227782676942397 +-13.526937953681761 +-5.24477556400489 +15.60209338475913 +-19.01365609388069 +10.501422147397207 +-12.84556057244754 +-17.502743249726716 +18.44640634189335 +18.608885272633636 +14.157182950255496 +16.48334253889624 +0.8706450379167023 +15.077846514793258 +10.884398828758002 +9.533768592707222 +-7.57594182498571 +-16.88267177678523 +3.022742127518036 +-13.274291339992313 +-1.6892615938725584 +14.923860218602755 +-11.661895411491896 +-8.457334679139525 +0.6267553854208465 +11.420952661141545 +18.69957193477854 +-9.320541662904404 +-19.265178032805032 +-19.688244002357102 +-8.884349931125811 +0.17684746814325436 +-0.8013556655541265 +5.555911043190616 +-8.812333450164015 +-0.8781899459031735 +-19.154608401352974 +-14.19882361354119 +-18.19531696003237 +11.832522127820955 +-10.757117588044537 +9.888740058249397 +7.986323146274348 +2.6028032703896926 +-0.7355715384946606 +7.332996655267415 +-11.829747514996578 +-3.3643686191067133 +-4.514933075964077 +4.5010095249802475 +-18.757159038335693 +6.00755585388665 +13.511469947771516 +-3.9583995578513793 +-12.46617587979793 +-18.31924931578778 +3.734143242404329 +14.764925483859244 +-6.052322950237468 +19.968401049644797 +14.35963861710708 +4.975337529465275 +-0.7509323912900072 +7.339280184313402 +6.389501853303059 +-10.172533134383999 +3.2493909999263053 +0.5557962598127304 +-5.565599001688506 +4.51676261709401 +-18.612677361418747 +-7.247116593688716 +-5.177996157988968 +-1.4287086592408862 +-5.851930621424328 +-19.071714795286976 +-15.928241786443142 +-7.208246687388309 +-10.372452422087894 +-17.627911242209173 +-6.8258222536028015 +18.82778010484254 +14.979164526845338 +-4.754850438854735 +-12.316714915463258 +12.607862179139843 +8.12517870850996 +16.709205339011945 +16.38389354478717 +-15.455682556531176 +-6.661352327254036 +10.282647342885724 +-4.87023160932579 +-9.315945649699522 +-6.77721708934914 +0.8856482933863461 +11.033052206900603 +-3.4915230724973547 +18.029981269457352 +-7.515499894307865 +12.730035437366361 +13.470243893464072 +11.227060241587651 +-6.1060353736714 +16.494322026359647 +-14.750192996752677 +-3.5856022907093887 +14.667493605049579 +4.468743992216769 +-18.354248332749368 +-6.657000997510952 +-6.586309536700341 +-15.940344052172101 +13.932315210622107 +-0.36964855619979176 +12.010600766304599 +19.345135505045043 +18.699696803406567 +10.3328689993246 +1.5511937501741286 +-3.8174863898225695 +-6.447651263396018 +-6.903457761868793 +13.203231272418037 +-3.429607610229155 +-14.783592630442213 +-5.732550730505359 +-17.157479402789964 +-8.320093907563614 +8.711549387766446 +-17.196989273977046 +5.343847024884219 +0.36562747666578943 +2.7033464105673275 +6.541180875374497 +-5.700529240399703 +13.291406879002892 +1.3508040392010692 +-16.780340856755135 +14.9305002070817 +11.543869836706438 +9.835574087230352 +13.68334918941764 +-15.945617383736895 +-10.335456202589398 +-7.662154114370928 +-3.336777699661976 +-7.582696802694082 +10.139019560368986 +6.972358347049251 +-14.584027672871294 +-5.482466711364893 +19.377883739773253 +3.9021782667109015 +5.840123976619811 +1.4947535098172047 +-11.08493560171313 +10.035401384495366 +16.626741216479303 +9.215559370282115 +-10.767580690163339 +-4.156695327393427 +7.922935051308244 +4.256800421945741 +-1.096843129435232 +-2.8496680584872855 +17.901903321313142 +13.764424575627672 +-10.154974915183583 +-10.839137849602087 +-19.931403251576157 +10.266218726318982 +-13.98101421627957 +-10.639186841264298 +-15.627383796054648 +-3.7838729453003417 +8.120488004331282 +18.9129890642867 +7.7480543250286935 +-11.78322369638623 +-7.646761257997344 +-10.76043295041503 +6.928920978859949 +18.459086664140663 +-5.649277092892024 +0.37494673906578413 +19.387573325175623 +-11.883362268934729 +-16.13174165237034 +-4.233904386028161 +12.520135608370879 +-12.045119533251958 +9.811590499876147 +15.220161960305141 +14.910617391460917 +-0.9386104047030344 +-2.2266043364641135 +7.3021686004717345 +12.650518723777402 +17.49039406541457 +2.8709730565433063 +-9.950059304570198 +11.462362819666506 +-17.6180862324393 +0.08980832781234938 +-5.022137561034068 +13.037349892941293 +-1.5997055533155837 +11.967778660405504 +-0.9963099759006475 +9.15821743862341 +18.738145268725134 +-18.658163142929148 +15.351537933908553 +6.046978964381115 +18.42254041799721 +-10.941630125123103 +19.852457040299363 +-8.26202508436178 +6.535418940510127 +6.041845596173818 +19.69338695800314 +11.88911009753841 +-9.192667240990424 +11.786871942257477 +-13.993537525805312 +1.688259117960552 +0.6628179988047513 +-0.3060249204299126 +8.582485803920004 +-4.6783342181757614 +-19.67960423977086 +-3.4135469826189606 +5.680549503528653 +-4.204389357915952 +-5.433943422215588 +19.89231112612479 +-6.937701823644771 +11.665734813102397 +-2.2641285026185365 +14.21207724929885 +0.2473608582230291 +4.652957144996481 +-15.502117860018947 +-6.373010714145568 +-6.701349780721637 +16.296685758631938 +9.536424892652526 +-4.916602669441787 +-14.288538268792323 +14.733308311459446 +-8.720238794832484 +-13.759414998928538 +-1.3380570186520302 +13.174359583886243 +0.5139530315024032 +8.246283419959912 +-1.5183117233055263 +-15.04509876648668 +-1.4759772166123533 +-15.491946565977099 +-4.729148423075316 +-16.75405603070855 +-12.49220357677206 +9.846967730105149 +18.937361826184166 +-1.5215024550458978 +3.861270821036161 +0.0813637661598463 +19.21101499842726 +-17.8279903754079 +-4.343799732724044 +10.467605778532054 +-3.654313844396473 +10.461145275318628 +-18.746527833816053 +0.1788748450706521 +-4.2529834837213585 +-18.50365515686837 +6.869724367864329 +-15.63927647040198 +19.554453938576664 +-15.67424493698596 +13.025728768661125 +5.8840473099842825 +14.014712833470135 +16.289606801132862 +-15.310423372738256 +-13.41629121962313 +-19.035733090673634 +-8.655742151183343 +13.889648515597784 +9.488737809054221 +14.348608745426816 +18.009861451363662 +9.046146754458142 +-1.5942759189297995 +-10.846518693014211 +-14.449181449788124 +5.0378559617428 +-13.853961696743688 +-11.645574747484577 +17.15081334382618 +-5.633432732600255 +-17.51034672871398 +-3.9672220370581393 +-15.050341194214552 +-11.738100007367516 +-2.4732361677933135 +-18.116350208907555 +-9.46931349897207 +6.504844474344594 +0.1693199980550375 +-5.866951037554532 +5.147728808019998 +13.729138900423514 +-8.009347829756424 +12.72764203577993 +5.690221236385273 +-16.26234854744245 +11.991154081616404 +-1.243358876870083 +-6.712618296998979 +13.269645092525401 +10.637865218617627 +-12.060844250639985 +14.142791595260874 +7.923459548134403 +-18.58892229598912 +-6.363983277600198 +-1.6021182355913375 +7.410472040993081 +-8.31791600414122 +11.279586070058734 +13.914926174004684 +11.729692654780663 +-12.155305732388456 +-17.50460692424108 +4.46070035059909 +3.2725983533124605 +-2.3142996319568887 +6.014809596438866 +-7.247709216853826 +-14.4940391854142 +-6.146358498995955 +-9.39931736626459 +13.51707410513611 +-9.142154152693953 +10.208596094682466 +-10.763831385484547 +0.6793032321176398 +-1.9807189064403055 +1.2025264614522833 +-8.526665621559602 +-7.799633895753853 +11.346875311969562 +18.92080591080837 +18.517411420544562 +-6.3491728825046465 +9.83116248381834 +-2.714250512734793 +-15.33286558422935 +-10.579039755926129 +-15.355163802394651 +-18.897867377026486 +3.8414683970849453 +-17.19311751929603 +-13.194024831360448 +1.7229069065389808 +14.281823541933008 +-13.674788003437278 +16.53706216187193 +4.125899927575688 +-10.279013652125663 +-16.373571890797237 +-15.43750660406172 +4.8794473457693925 +-15.831263304141622 +1.3057699299440841 +-17.744825090230417 +-11.49461238103659 +-17.302753001832805 +0.3428769589286631 +-19.260040879942323 +19.98144739563523 +12.823003315570368 +-16.940668622261327 +-13.544234913075716 +-6.74868472795584 +1.709422058517994 +-17.29795694878504 +-13.853448184216308 +0.9063038940650401 +15.399456658614433 +-11.807327591970154 +-4.907188025614136 +5.213188995661994 +12.955725519642137 +17.943077132243232 +0.14181518596060627 +-3.4589350969892507 +13.47061185634982 +-15.874935929676198 +-6.154057148220232 +18.912533603722075 +11.47503282139192 +-0.7551979306221632 +15.43569337773527 +1.507064110378554 +-0.8471461160670941 +4.021299386573535 +-11.50156602558383 +-16.371343214090444 +-11.466447096862765 +-16.213213654712874 +19.208078742472097 +7.065806840581278 +-12.571810242694351 +4.334710805982951 +12.209589228749202 +-16.976553036275888 +5.001311071758554 +-12.86400676857069 +18.53492538891873 +11.643364311884557 +-19.413733489546093 +8.308901991507291 +5.343755813214564 +14.7190449556728 +4.548676397842932 +5.031883606807423 +-8.128021520264967 +5.24632486895371 +2.649642825183925 +-6.942959319901689 +0.35471458374263776 +9.342231051749785 +-2.766252443814121 +-17.975636743596137 +10.28579267905053 +2.468771374925094 +-11.62186898279533 +8.03403401663234 +-13.198756181869298 +-6.51716666018145 +13.225059126128322 +4.619045772043826 +18.567490167816814 +-13.948679943715788 +13.492560236620648 +-13.531734402978671 +4.054794146801491 +17.35182053899222 +6.388087669464429 +-4.9121369159566175 +19.13263797979412 +0.3595335688672421 +-18.64827216350519 +8.427016207424025 +8.536030244509348 +-17.435371088475655 +5.157152536950701 +-10.909882118902603 +-17.75386544832306 +-0.01144090185605151 +-12.26868158502354 +-12.41342762877997 +-5.849276884612763 +13.374381708306458 +12.456195424254801 +-17.600038515510825 +-6.464043079508514 +-1.7448761409725542 +11.87572555590572 +15.465647908091555 +-2.140184907497776 +-13.977035423814574 +13.003807951120976 +2.128959459645934 +-17.00206553429598 +12.182294304319278 +-10.163764743944812 +-4.472074447370119 +-19.882528037638743 +-6.330355956635373 +3.001109175361023 +-15.603724286202842 +-10.417622187298106 +15.911338164417629 +13.551775191468202 +8.312084690061184 +-17.361114718756912 +3.735267107683711 +4.984269049603892 +-15.493578759851601 +-13.61861109501342 +-11.857154550190554 +17.124366196712664 +9.13326562286382 +15.098554863170094 +5.644027476221968 +-7.191307403326878 +17.987213382580272 +14.000902063633802 +7.480989501244917 +-1.3749304568429537 +9.779809110508417 +-15.88517727934278 +-8.251058965897684 +-14.298999363613788 +1.3191394662761944 +0.6718015067069345 +1.819639144534655 +7.194209226651132 +9.181410982733382 +17.760611822786302 +4.596628908008235 +-14.352006418404555 +15.359696768175112 +0.5878163302261683 +1.5233591376212559 +-0.264701475358855 +8.402436929798078 +-19.66732699700172 +-13.247277127422219 +-0.4139175420374457 +13.966935813581948 +-15.010188863987262 +-5.487808104742019 +-0.17349846988349427 +17.975118965873932 +-6.318565056373551 +17.189589101749974 +4.191287274309428 +11.707309889940856 +-2.3640780929521874 +-7.430684492827133 +14.79214008175341 +-10.660374968803122 +-8.433717933016492 +9.319173240932646 +6.757378861962419 +5.342247148157405 +5.320486694546581 +17.41756506214857 +10.002038601531794 +19.50373837610126 +-11.260892609758017 +-9.371432291147013 +-6.693227875438069 +8.064733280809936 +-6.645656319753449 +16.14392832639868 +18.210187818625265 +11.976221890192377 +-16.932504017123186 +6.094305910714098 +-12.708571907804833 +-15.17224590836788 +-9.607729631010816 +13.635780098640893 +14.067617591030064 +19.864989155706738 +9.106418431115397 +-6.3705953925599665 +-9.405257687063347 +14.357550188504618 +0.5096162982245076 +-15.545653697022598 +18.457600343892885 +-4.105064317213714 +11.264907486146146 +19.914881942762683 +-3.96260609273763 +12.013071824495043 +-2.5010437696728616 +-18.741338909566785 +-11.670623602571887 +8.654483609020417 +-16.79355119087804 +8.449910265579263 +4.214749920272926 +-7.5377200329331515 +-3.5510714566265733 +-14.02854204829234 +11.397546428403057 +1.5169016107584028 +-19.012675229715157 +-0.10978519387511199 +5.700573393405477 +4.10330758770376 +13.283964553971963 +-12.286198741165112 +11.468224320680424 +-7.947072712082122 +13.922163836133592 +15.373089182664835 +-16.112979104887177 +11.46412844397057 +-18.01490408098715 +19.079939193773832 +-17.45099110824338 +-7.4527122591255655 +15.40956632844101 +-0.07825084825111617 +-8.612179402949259 +16.295649851351627 +-16.787995841851455 +-0.7151793876075203 +17.11260567766581 +5.080888701732942 +-16.065783305621103 +-11.299373167795705 +-17.8099018083446 +-12.5023334014418 +-12.798266653493116 +11.931732122591718 +11.507770626608664 +16.32185736090419 +-18.208962931131577 +3.8036474698017813 +-16.611226050631196 +-14.126658358290713 +18.576904510344214 +19.10503577633977 +18.97007845275381 +-18.174167285122085 +3.479477572640306 +-9.691595459476265 +10.51379446417084 +5.5738154751762 +7.206806370182402 +-19.94282996614855 +-10.679334046081483 +-9.199551306181002 +-14.482247386184044 +-11.916522769603342 +0.787831856579686 +-3.690733585447539 +-0.7345450111765857 +-19.148974068180667 +10.433596618827398 +-17.66544671129335 +-14.046975123355082 +-8.893849985230236 +15.173615941348977 +-0.7715540405556922 +3.6249132770929613 +0.3322838370898573 +2.7958651547453464 +8.01851462194261 +3.354992769686138 +13.147485635169176 +-17.282710529821944 +-5.3444595120635086 +4.6314763490885795 +-4.325692180218091 +14.810360046381149 +-3.3694268294478213 +12.753486084390403 +5.297116395699277 +8.277395166028857 +-19.821278970032672 +-12.297485265622562 +14.919288631055295 +-8.651097424495081 +-9.670403049731657 +-17.977223763507588 +4.410606370314277 +14.423493849895777 +-19.25154158771246 +-17.966835758079025 +-14.196123861963063 +-8.373420375136025 +5.0867196741895455 +17.728630369047295 +-5.005847209190666 +17.67744345253638 +16.037571864707758 +-0.09317842861183223 +3.3725242740974615 +6.46431697143429 +4.734337158420566 +19.390527368200488 +14.808493906533712 +16.740962132681382 +5.07523782987143 +0.5842157417712137 +2.271423088947966 +17.889990496737212 +-19.72737351884455 +-16.249654221561997 +-5.349634332644953 +-11.768712283978173 +18.16583999274514 +11.718779609284418 +-12.236127632891023 +14.698741437447708 +-4.565474676119248 +8.161180395684301 +10.462167943621367 +-9.274753241486735 +-6.911859799347901 +-16.75723839719619 +-13.051572691245132 +0.2695972343103321 +16.10768891953048 +12.329344793312323 +-15.039775497388996 +12.941591052337138 +-14.812687593630397 +-19.506344996007993 +-17.423145604174138 +-1.350844545565181 +-15.567456530012812 +9.35443306044002 +-19.083578492641763 +3.3749538545629356 +-1.3662256232134382 +-4.822182967420993 +-0.2778080493683106 +-4.753366020813399 +-8.825540333024527 +9.629202335925552 +-12.455098304824514 +8.715003651026215 +-6.638980803309394 +-13.461893765483467 +19.686079837292425 +-3.8980827099228286 +12.105917996080976 +12.629480912265372 +7.887093097379815 +8.999936404212988 +18.03386138048235 +-14.548254421546755 +13.156920009239165 +-3.741681603398174 +6.51558300758812 +10.496443573803134 +10.140380965302104 +-12.926495957006821 +17.933904089430584 +7.315551921037073 +-2.319044267009197 +-19.660844134403956 +-5.629578459868373 +-7.748981109249012 +-17.893993233107494 +-3.3086812886751993 +2.663254220261031 +13.150348103561676 +-15.403274929211555 +15.088311213008772 +-9.172749879480966 +-17.2305089457114 +-2.482640587538434 +13.774652707752672 +12.643964269504309 +-13.913161694641737 +18.73876381465721 +14.748875666901583 +2.1513548111244205 +-14.45433419059141 +11.716828990129812 +-9.378575545505399 +6.331450409271696 +8.206644136251164 +-1.17347132047124 +-18.995440668146205 +11.502320456223408 +11.120831897111138 +16.314651807680015 +13.084000911912426 +12.241001262726513 +5.443886193540045 +16.402664381276082 +-0.7680406248592142 +12.227768789143731 +4.020516951223378 +8.96292307514054 +4.797070673476867 +19.45878627578687 +-12.845237475953013 +-13.881262460127356 +-0.07906864921267598 +17.048058841671647 +-17.3478551366605 +-0.1981437516370903 +9.036894972582207 +9.067555614213603 +1.943518597585431 +-13.176760431884249 +13.566830065646599 +-14.740080698458605 +-2.6798017331244672 +-0.1507909844267452 +-2.5774682125598893 +7.822425822190702 +13.62623295482787 +12.673515034092837 +6.867516213874794 +-15.50353289256147 +2.2106650224223046 +4.650257304303459 +15.423776673429465 +-7.410753235164513 +15.94897258581205 +-0.06741162964951997 +7.621882236386128 +-9.354017778010665 +9.50101048032699 +4.788174791520596 +-4.583250279142765 +17.899355115437523 +-19.960236108806683 +1.4047061491598178 +-2.0381162008741356 +-7.693732219668936 +7.264123448340484 +13.63540151661553 +-2.8880610165382663 +-8.587083852088938 +-5.046826487915407 +14.83041367374338 +-2.75521463607803 +-18.32392133788069 +13.737693917387489 +-16.09117016262605 +-2.361353809963159 +-5.000376132030432 +16.77351400864218 +9.293715109484594 +19.936980599520723 +-10.76112734946923 +0.1359109791356481 +-13.554828509549042 +12.61539846732164 +-19.66625048340912 +4.906093977994711 +7.32353339116322 +-12.476254659077561 +14.922842069892646 +19.90867044405016 +8.345419986930356 +18.04747134651832 +-19.391773012777428 +-5.847226183236236 +7.1047736594227615 +-6.026013168396771 +3.3653705144188173 +-13.387330633120825 +13.153344339257266 +10.710797566945747 +16.925771860778 +-15.784265604006254 +14.964022996196533 +-12.040448722198116 +-13.978260140580879 +-4.194133652391653 +19.052503564946647 +6.329050542098088 +-12.915484790654936 +-15.330984747511351 +10.079858441704083 +-0.30863695964990256 +0.46721152119425113 +-6.408770494081537 +-11.598114354214033 +16.375443662204084 +2.3823660896185572 +8.38290732057347 +17.29541093318671 +11.432809266422655 +-5.933031144688403 +11.937423222218552 +12.885636176072396 +9.84542499616072 +-16.253835872968686 +-19.610111401066185 +15.699547675512015 +12.250854245368231 +-10.56706811993157 +12.518924978293143 +8.419735460288269 +15.20658919341227 +-8.541960014341967 +-18.354504684755028 +7.820000682840128 +-2.5573527459202055 +-0.24089002310252994 +11.694658214597492 +-3.8382968383424085 +6.648733125770427 +-19.65721920677652 +-9.329716873280187 +8.900312912382393 +-18.673310099313017 +-9.943650386394122 +-19.05389544881419 +-5.16065845516804 +-8.733805742055356 +13.900821809286896 +-5.493891677116721 +-9.104107848765764 +-18.712152136321176 +-0.8776797578876874 +4.448701936929325 +1.8666260614662846 +-19.003064669505918 +16.48100073842653 +-6.871999051180682 +-12.215929658367365 +1.4891511330487575 +-3.292754789340158 +1.5363649205475873 +-7.615879228519642 +-7.108362993282302 +-16.05783401985132 +-19.43065135086328 +10.810617275181702 +-19.12318802477975 +-19.522112427627214 +-6.712980774077973 +5.148344446327137 +-3.746484517851357 +-14.82561369702287 +-0.16840669086846916 +18.45033938609896 +4.66387732214627 +-17.207713188901927 +-5.326300610887081 +-3.4175002151771885 +11.291069303898269 +4.546721479603008 +4.916658305205676 +-16.958267691299636 +-17.61800897611846 +9.192538648034368 +-0.7181366234986264 +10.26648253910162 +-15.212884214380518 +3.955218460614006 +-11.052159560096548 +1.7916857864467062 +-12.561335643926261 +-9.346049407827831 +15.412864492550248 +-6.096355123660668 +17.547448338999047 +-4.451629083360773 +16.6519306132449 +17.49234895397113 +-3.874976928828101 +-9.653289532340107 +19.217244450525037 +-1.021650458523709 +18.16958991753892 +-10.639401551703273 +3.3885393966910655 +9.823569152720857 +14.91606374813508 +18.503408672834375 +17.698893218383624 +-19.719965613495752 +12.778095476939967 +-5.169962467341298 +-12.12750542610257 +1.0893924722330866 +-13.65445578955442 +-8.672818104022667 +10.41300133766153 +7.48580267204272 +16.788891108343435 +-0.9267283534733934 +19.587592387889913 +7.395073422832695 +-10.997123368101827 +-0.06692693817396389 +5.141495613134552 +17.645882253689457 +-17.436846743048196 +19.993577471346967 +-9.861883208866743 +-19.06968338196335 +12.152932558719534 +-5.795177352132971 +15.397181053901825 +-13.038481967439637 +19.34214074356092 +12.107312744548842 +-3.6816018402957553 +-14.475593547318049 +-6.9459159197966525 +-10.616366916783559 +6.264736015820887 +18.650852924228644 +9.037204817608764 +-17.934436805824674 +-10.506560408856508 +5.833921773047269 +-14.256990685478339 +16.289183789689652 +13.219585955054164 +18.98209267509675 +-0.1312959295783358 +17.54771719393044 +-1.292412947356194 +7.755617747770511 +-13.31897503629893 +11.561087131457342 +7.722003963505703 +19.43114998795587 +-3.6153001402565934 +13.595783874317519 +16.500314146000754 +-11.033028881203215 +-6.1617585580409795 +16.201631619667765 +-16.653202023589692 +-12.84215408185894 +-14.205842874731074 +-7.455031739575745 +-19.920940902998616 +4.906245171860068 +-2.389329687874742 +0.5622235838534451 +-1.888891333934943 +-0.8615415229067693 +3.2230233248348448 +-14.015415233214226 +19.650241622903515 +3.4996227210725053 +-6.816905568373848 +17.187450560241388 +-7.002247618771671 +-17.489862650113217 +-6.812940799921421 +-19.678391608355014 +8.675587421880063 +16.37672673460458 +7.297166274130674 +-11.041326042697662 +-5.474094416231598 +6.216860121775714 +7.600590189871372 +18.950003703347534 +7.362815943524517 +12.752073266189626 +8.346919932338356 +-9.36028044626378 +7.596638651390126 +5.74254131699206 +-11.336642651930454 +-19.76247559105747 +-8.03095101597651 +-15.941375590883183 +6.056209136277403 +13.149804226378684 +-5.969134035656477 +8.92691496875651 +16.275282858243536 +1.7246784870602738 +6.239473890110748 +9.433388209353563 +-14.729021530507254 +3.652637465252255 +12.23798640070386 +-1.269174664386206 +-11.979752115357126 +-16.418544378632532 +-12.805877781214509 +-6.969686168903655 +-0.3073467591067178 +14.19708271021858 +9.277901120700975 +3.186042422631754 +13.532216808122975 +-10.426280063483851 +-15.29310789883854 +0.7844528342374382 +-7.81132143044692 +16.960576089650047 +12.070861196594997 +11.404138385853955 +11.168974437218786 +16.114015411734798 +7.030355069908726 +-13.824919869606012 +-11.857951955693725 +-16.621677013730437 +15.352602950684393 +-2.1747977228872095 +-9.121797192175197 +16.450448124527767 +-9.260414644938546 +-12.69304818283672 +-4.654069743279852 +7.0948370455753675 +8.25917906076122 +6.308756134469359 +14.59909209922911 +9.550909387256077 +14.674563765952186 +-8.761488396560475 +-4.195392150745807 +2.4694428108373216 +5.53816283922658 +-10.928084940926656 +4.542010581607435 +-0.411166660503266 +-11.778507787714227 +14.829840292111484 +-2.0918283704154277 +7.197229719653727 +-6.655519576031036 +2.4076668002034296 +-8.516373036244019 +6.328641063104186 +-17.35045164280212 +15.279527942993269 +-18.3841285089083 +-5.265684646609493 +-17.787680060193868 +-0.47072826389804234 +18.734578336341833 +-15.691190047437505 +-4.14416204713679 +17.764875359651995 +6.376402573361677 +12.418390401517485 +-3.6904805484207195 +-0.4487965524164004 +4.378774427806491 +17.048583722592106 +-7.8914125068062155 +-10.93502525892501 +7.512222980851419 +15.713611356105666 +3.643546867260973 +14.101034292886297 +11.651946492081407 +-13.799734087424387 +-14.260352922390016 +-11.065899449289024 +-15.467864330995816 +5.004401765008794 +-14.098461351940212 +-18.212626201437434 +18.10554244316304 +6.365534390552696 +-13.280938926200058 +12.007802203385026 +9.913523194430173 +16.68183800880928 +12.204908432623476 +10.613252693640586 +-16.739228305746266 +1.3828707932784994 +8.279617509897335 +16.248345485016657 +-16.762590045089315 +0.06179630005413017 +-18.779959552804947 +2.193823235809333 +-5.110006315571782 +5.614697669979126 +18.82797135481293 +4.240909501432672 +-2.28624788006902 +-10.15732908361263 +0.878968057140213 +2.8520936565286057 +3.706978591634229 +-15.283099576745244 +-2.823502171137907 +-18.851072798408865 +-13.864717403513204 +13.719871086287881 +5.014554271943808 +-12.181419652530776 +-8.888140331956894 +19.679067943550507 +15.080710698310526 +-3.3036877353410006 +1.5168310606823283 +-6.189112504721681 +18.786554006841975 +-8.268222724960737 +0.121131946256412 +-6.42101627339397 +9.428227188303214 +8.121401394998621 +16.847322287803294 +3.301476655928006 +8.45926016079051 +-0.6816687591370822 +-7.298032392363449 +10.069074088356448 +-14.185595379303209 +-2.9606999280570925 +7.745937398914236 +-4.600694106030353 +3.5904199155142322 +18.069903960994274 +9.684532862679816 +3.142829757870622 +-14.199787381444526 +-10.613668830226914 +-0.33245798461528864 +-5.335747514577296 +4.055856070741367 +2.977252573342817 +-6.687752964956486 +-1.679522079838737 +18.861488079717333 +-7.037117913019424 +-5.801220222265965 +-16.690511658281896 +18.595892959835375 +0.2954987459874623 +16.434125507733484 +12.475684389198761 +-19.952204100166316 +-13.403181222750087 +6.9130108672581905 +1.3836512178557605 +-12.085245397240998 +19.80133277884982 +19.5078242358439 +14.734839796430535 +16.104303555784497 +7.583058709798863 +7.947692928889921 +0.10822703587071913 +-14.222001751882729 +-13.690655155066809 +-3.3179585523294577 +15.423405031886702 +18.191277829396434 +19.547126904578413 +1.1698740686557159 +-1.13303815233618 +2.752528809686634 +11.31985290206768 +-15.471942604457617 +8.121218626841848 +8.306569543898817 +-19.098181077670098 +-12.914046963748964 +-2.0434832788761916 +-7.409601394508352 +-15.284340783205664 +8.14889234776254 +3.2609265477849227 +-18.544752350265515 +-19.08807767669749 +-3.457070738547845 +-11.06078686832567 +-12.57365025947025 +9.554707142949006 +10.70079689213236 +-13.456025452677718 +-17.372432496243423 +2.140073860749485 +-9.09434620719674 +-11.011071531128191 +-8.27346709920803 +-17.92796053000294 +-18.74246164744681 +18.28419539659575 +-12.005454430968854 +-16.592704489212935 +-7.319198052860667 +-10.340484953109193 +-3.351141830422879 +-14.151508128301128 +19.23860291143643 +-16.564987484655205 +11.126175869771568 +6.641384416801852 +-2.113321800919479 +-18.44204190060671 +-15.720492869364882 +-9.82565290894399 +-12.221266013537559 +14.799146717644703 +-10.448995977495926 +-0.4063402673177805 +-14.673425911154263 +6.260262039883884 +12.063698285440779 +-1.9997221042393036 +-19.76134793382157 +-16.634807045064626 +-16.667620445887437 +-5.975802005588985 +-18.81633251352158 +19.290947344943923 +10.157130821374281 +-10.319920610866461 +-11.66786998684438 +-7.245628291864126 +6.299076519675232 +-3.996368070126124 +-3.7422699873674325 +5.682941918946437 +19.725636347392054 +14.687363791152904 +-0.8256097515331859 +18.295382894261046 +14.370633676706518 +2.7574187600957387 +-9.627747410259794 +-12.204423569538108 +-2.2215228634831945 +15.568917696808668 +8.78421272278327 +15.586504689255094 +-13.090176329879299 +-16.18590955133258 +-14.960785088410189 +7.754113634399925 +14.6161325733923 +-9.84767509538389 +-14.149800988118667 +10.071211622792507 +-15.137658149242409 +-3.2165764369958723 +-18.287061492154322 +-3.3511775464218765 +-8.559083232510654 +14.2154031127494 +-11.218329916712722 +8.828339672350545 +-6.859558463555352 +-1.6655657040842407 +-17.490340923859407 +16.639225596530267 +19.91040549368519 +-19.907188165892936 +19.0178365581934 +-12.597347725065342 +6.4020126545063185 +-15.872755313637912 +7.4688901040047355 +-9.912237213250506 +19.750415622404567 +-13.95257547695759 +16.130954155093647 +-12.187410480169145 +-16.191164672218896 +-7.688572785444393 +17.06115354261317 +16.705497245146177 +-3.437621362608901 +-4.682209571668675 +15.018278471315568 +13.636741166356273 +10.891761440540005 +-9.13713131060046 +-18.10188547041144 +-11.904915808595229 +3.6300099378336093 +-8.282359478658478 +2.277711557233687 +1.1971511175313445 +-4.638032533314508 +13.106925391881056 +9.098804367001133 +-9.317776003311016 +-1.7644184845793696 +-18.2127396832037 +14.389034046050817 +-7.141930386040247 +12.502483197396657 +-1.5527083659892718 +18.8455573017807 +10.071717042136427 +-1.0846381182146025 +6.325692397550945 +14.126996064077993 +0.8171065029084978 +19.814142868299015 +7.667371020122733 +16.59519335366832 +-8.501812196923915 +12.960299346886963 +-3.4892635268798635 +-3.5685608109097515 +-19.963672499445288 +-5.182075999735648 +2.137167300045064 +-8.381396948115803 +-9.646688179392747 +-17.58052007102004 +8.61114359832317 +11.770155590610575 +-18.17918686409672 +-18.690694522437763 +18.543814921682163 +17.419684366577314 +-12.112645095952796 +6.539548002346621 +-2.6984042540918267 +-5.097636971256726 +3.379241256101256 +19.767076630716446 +7.717503661029795 +-15.133102083420425 +-0.04375410974649441 +-19.199689962444953 +-3.755751538701311 +-14.099704034902793 +-17.010924825043364 +-16.030820752823303 +-12.418745747222806 +-9.767511721508209 +-4.570728303205369 +-15.554478217310654 +-12.110827108711746 +18.90973577138412 +19.662891853989663 +3.926144684307033 +7.887986165987201 +18.769786947251724 +13.27594751154384 +6.14635044064206 +9.725747804436693 +3.6972645220509257 +11.083652012889441 +-6.642225990150319 +-17.868838540324838 +-5.9724384989175014 +-18.265957497901336 +3.763646377071346 +-11.763494387808038 +-14.8708121245275 +-18.17047605722766 +12.458933224205325 +1.871529806693296 +-19.131969229567197 +13.160267288247923 +6.726091825867524 +8.198674772728971 +-7.41928991572879 +16.889966236288117 +6.946254912523383 +19.17378070692112 +12.18611123604257 +-5.802958548327277 +-8.556557415544184 +-7.175918197197074 +18.802118204298516 +0.46052304858548965 +8.219380261762677 +19.891328731758783 +18.59996615698261 +3.9327607787486656 +15.266534674056729 +-11.3745131715682 +-17.669631313631747 +-9.688126698680847 +-16.118549855222422 +2.7586584032077113 +12.344881536321878 +13.868892118154243 +4.071686565566374 +18.110537131721202 +13.288824614521069 +-6.763495650672118 +-14.045694049716726 +-5.901071401091297 +6.727879258093061 +-16.727982379261142 +19.23197302429174 +17.914857265841903 +18.791513813568933 +-12.675735036044479 +1.3493797198559463 +-6.142611072027853 +1.0781737308327308 +11.976556961125098 +-0.339708086941954 +15.325405971157679 +-8.991240508817441 +-5.383453558861454 +-9.613955170593783 +19.47030308087794 +-7.842925017269987 +-0.2077200566088777 +16.128661441850525 +5.935688352615575 +11.90218121525064 +-18.556080465156537 +0.53061727207837 +-16.35349189162957 +-17.540290910691727 +-10.59370987155841 +-17.663176844699805 +15.832309165102487 +0.7079743270134671 +13.49070850851539 +9.089226739104845 +5.107993558921034 +8.193296000086544 +-17.84940876217025 +11.71163223814802 +5.6058552284286165 +-0.1372198751579461 +-6.04553918790554 +-10.80873650561033 +8.197492810331532 +-8.990471591185951 +-11.148406448178235 +-12.003291761016865 +-15.591276105046212 +-14.154960977363068 +-7.663373118004753 +-9.999240941598648 +3.822969514793858 +-6.234672842290742 +3.778212046727379 +-17.575663768246713 +-4.572624923150057 +8.93684270822931 +14.115652278378647 +-5.022439293246634 +-9.63083502543316 +1.6423993610552579 +-2.1048500117724736 +11.733058140229161 +17.351700930625157 +5.371518486010302 +15.944825224550982 +-6.961430681201989 +-3.713412230586176 +-13.679158644325732 +-8.941556991069056 +15.293193448540478 +5.919433965389764 +-14.290054801115804 +4.625450389381921 +10.338162041989353 +18.05601633690152 +8.055131032335336 +12.777199581377964 +-16.82890225582435 +-19.63495125092349 +15.463996764553812 +-7.975841160890189 +2.16505698848513 +-1.8242603401705146 +13.650691855674175 +16.179813658459743 +-19.99694428987813 +8.50150774550077 +17.365459349397902 +0.20441158632564083 +4.996791590898031 +-15.029263286629423 +9.1594123790458 +8.519082858738926 +-13.312519772676756 +4.603843815233315 +13.363770217594222 +-14.502190081117226 +-8.195183732139423 +-8.156694228419731 +-14.033134397593216 +-12.731193578457294 +-3.7419498967341625 +-0.2435081441373086 +2.2861852311129667 +-2.048281608204366 +-12.818287076505023 +13.094786190194398 +14.96068540262418 +-1.279381344700763 +8.052501971323188 +-13.587283257012635 +-2.9889430320383497 +-11.178906357134846 +6.012060255061794 +-8.084220797472499 +17.265972716635552 +14.600488080455797 +-10.140474105869872 +16.487431466461373 +-3.880708797895874 +-0.45862512692619006 +10.550840344096773 +19.518369922508093 +9.920499512043044 +-12.773303290454407 +18.857015027384833 +9.376286563840871 +8.802379646531957 +11.365270901275025 +-9.14341662830395 +14.766630723167964 +-8.163759840605987 +-16.35493987193245 +-5.37978815671487 +-12.723291794432981 +-0.6054755305857604 +13.338188006234844 +18.50021692486657 +-17.74913010466001 +-11.189705584371254 +-1.9525223665865177 +-2.374595634948019 +-14.557393145585372 +-9.327676352730109 +9.508025667031891 +-4.667568315761681 +-16.47202886814087 +13.518506360252232 +-5.6772067710604635 +14.211236941305415 +-2.2342806943421323 +-7.27868558011814 +-8.928325453774416 +4.189839189263193 +1.1697302021375222 +-6.791709911533857 +-2.635192289677704 +-3.2741999441584824 +-13.851044073137167 +4.604104374869028 +-9.01139917667701 +-0.11243388454363412 +16.39980478834476 +-16.00339697292676 +10.198892538146293 +13.293877944832545 +9.170332750676064 +16.13917362428581 +19.50198879280463 +-19.171698835566218 +-5.183175372872402 +-4.456954433254779 +18.5343679829314 +-11.512824168126361 +-10.339555992205733 +-14.715345898456945 +-4.877497901322281 +-10.22927424122534 +-12.185312775767482 +4.159347420543789 +6.5386110289833255 +10.92110634726032 +-3.183030058631523 +14.952438189461432 +-6.982899384130544 +-9.761725868184445 +-2.6070228943421085 +-8.022030729142804 +9.383232978578135 +-13.751055375488196 +-1.0449283977888157 +-7.108532427512756 +-17.941928375477573 +-7.0821611372296935 +0.12627547951431595 +5.210400979293123 +13.111652896053812 +1.997155272281237 +4.850456360482099 +18.387421324250333 +-13.69707288422057 +-18.671025876304938 +13.037508440233864 +2.0810186516455076 +-19.013320786429013 +12.627698918451891 +-4.597904108162787 +-18.85745882536733 +7.855539739624508 +14.690215375010432 +-17.332426768944377 +12.446411968570771 +13.974140561046056 +-5.434570465197112 +17.940343104345942 +-8.274536268887509 +8.012715012045465 +2.3989553422156646 +8.071800272984827 +10.23028497439411 +-18.14884526694309 +-10.677759261363642 +4.507296881455147 +-15.366160963690882 +-0.7865567043213986 +-8.144797045454304 +6.168644311946252 +0.9119671287001374 +14.896416080456312 +7.932906437325791 +-19.774160516618142 +-15.497480692783165 +8.248607552868773 +-17.10735789667451 +-9.492918570780798 +5.243346982428161 +1.2983344497679106 +14.851175759641805 +-16.869430709124874 +2.5605257168416387 +15.289540079577584 +18.827301353358067 +7.041081537792628 +6.726081295291838 +3.267607107072344 +8.890584733265406 +5.560563167449494 +12.977815169832922 +-13.552913434876 +15.341010920533257 +-18.486172629257776 +-10.876532164577362 +-18.79681470140914 +-16.69452052583168 +11.753862733540032 +-5.833835446039771 +15.768510074066512 +5.15342824004756 +-5.7372332570456805 +-18.19840100709388 +0.3774766740105875 +-16.65903630880001 +-10.081988176622998 +-8.011152929621318 +10.498730743157218 +-8.698268914071035 +-7.290307186117646 +3.0532726574928972 +11.733344519820662 +0.7162311539070885 +17.576480148467198 +6.40039068024943 +-13.978660599378848 +15.13555426940301 +6.0215391756077565 +-10.060926313713088 +-3.2093050287415466 +-8.872314940027755 +-2.831915753126882 +12.964947523038802 +17.182296784989525 +16.810404921148184 +-19.870351875009092 +-10.751069275267007 +-9.500098883250256 +13.637422682722125 +-6.3516039109869915 +-5.797446686287845 +-11.793550787116892 +17.495313658847877 +-4.221324425055535 +-6.206851126373266 +-13.137052537893421 +-12.258979171170502 +8.922638815375823 +12.940450550840616 +-14.890546540057601 +11.664020142148907 +-19.510055958928668 +8.297891263260912 +7.326082705261751 +-15.281215810067463 +18.49335877016661 +19.168216364365144 +6.033039873277538 +-0.21380232143923905 +-13.675945409901118 +6.722387976453081 +12.179636860308818 +-7.847575320486362 +-7.593385283502613 +7.661527296818548 +11.313103871397026 +11.899734677712516 +-13.002195670522925 +14.667953536337322 +-11.749337222024145 +9.216875925466972 +-2.930833911291405 +0.4649023016789684 +-1.4824202577637422 +-3.634030672079973 +-0.3237190191784123 +0.1949873623286109 +-13.472528659304697 +11.448726696963046 +-10.269933268946145 +-14.028080332499147 +19.17707120698107 +5.712366385390794 +2.9957205069156316 +-4.562390434615686 +-14.126169808738709 +6.166603362584841 +-0.45695702699681107 +-18.6837338460804 +-6.953277267884754 +8.114459155714115 +3.658295181149853 +16.323829651972325 +18.505276966748056 +-3.3950622630588185 +13.530167783731201 +-17.60199169661654 +-15.833382518776284 +0.6919894251060974 +-1.6495173426969814 +-2.432507302578557 +-13.280549254315805 +-12.49569726178188 +-14.41381978652033 +-8.609314232211457 +10.355410721209427 +-18.035178145859497 +-8.331445270308713 +-5.442077732293772 +-4.670681228277438 +15.03907719338524 +-5.78864941351636 +-15.86938135178579 +7.1386268916409215 +-16.650340647349196 +-8.811220707612799 +-18.648010073413325 +5.743289751497443 +-2.945271155793776 +-0.9326430400273935 +11.067980705749584 +9.377216211150888 +-6.253668156563435 +5.566833503502803 +-1.8893317673620338 +-0.7996842081940194 +-14.964308472715931 +-10.212604252939359 +15.896190184349194 +1.0630514457199602 +-3.381882506618659 +5.1342773209472625 +9.868942568471851 +13.532912546316993 +11.618709676375705 +-6.189045436102155 +-14.322972411440835 +12.16414078177057 +-2.355408614885871 +-8.473169969607603 +-16.920835250613052 +16.889201212236472 +5.054098078227241 +3.001771055767044 +15.797507722996187 +6.262581048027084 +0.3826481327714788 +7.814835587962463 +12.307663197598238 +-1.024545148736756 +1.0407193015532812 +-18.097212946247986 +-10.729708840885412 +18.01383628229128 +-14.936334288477289 +9.725878617120944 +-18.174525862611993 +-10.089515734785941 +15.704770924887221 +2.038058073710161 +-3.228407097468292 +1.2398728886450812 +15.62455244497147 +-9.110552610676631 +1.2431346247535835 +-7.786275368076359 +13.93423218673557 +9.091676131759524 +-0.575610545849166 +-5.700646863133883 +-0.4451073679271502 +11.324997894654288 +17.22476043381966 +-9.054159021609852 +3.269513657553283 +-0.2719056990024882 +-9.755283666941805 +-0.35518865548907286 +11.922159660204876 +-0.977623829853222 +-1.9750979477697719 +-9.151323202960677 +-17.16331585314602 +-14.634216941656128 +12.325774379296377 +-5.6974045751035 +-13.9048552097859 +9.284934703696635 +-17.024029179024566 +-0.5225353078255246 +16.960947913618917 +11.502895184608136 +8.23476522898613 +-6.315796083544987 +-0.35445865613215943 +-16.196036545769967 +7.252908925824599 +-3.7191153643886388 +2.137732620595294 +-17.138408727445142 +15.162491423894764 +-9.340686461905623 +15.106873052731757 +-6.9604293240095405 +-5.910639179816691 +-8.421164325247767 +18.38028201116454 +19.940267242109236 +-14.781308086234862 +17.97898720390932 +7.379262707059784 +6.473623748306579 +9.890706614207112 +12.410091605418522 +-9.400057516016624 +0.15209853351366576 +-19.21396115995853 +-19.375366636715533 +4.170723690781504 +3.1714436615916277 +18.03053736911758 +5.248406854385603 +11.011063416733524 +-19.971488296116068 +18.260537295541454 +10.901075258928259 +-9.009239812261264 +-17.510142387181766 +-5.961794129484961 +-8.384849392877815 +-2.3039766705292024 +-17.953623868625336 +6.448269142784969 +12.456395602849767 +-15.799389708799453 +11.707903998255532 +-16.1675669215137 +-9.355797348734093 +-13.200252676774088 +-9.057868839374583 +-13.96891528172684 +-19.798561846802343 +6.882173754398423 +-1.5181325566009534 +-4.995967660081554 +13.533171376094955 +4.436909055657328 +4.0298831328076545 +-2.2680671529688325 +5.315506004587046 +11.743544102877685 +19.246963278105994 +16.34753629748098 +-1.0162575036562203 +19.495374705970605 +14.124116877102814 +6.256070391350278 +-4.609662835090415 +-1.3566909981215929 +-2.4717276956484824 +-16.275627267975356 +-2.633821803807077 +18.009596990137958 +-6.030422919312102 +4.946236874537497 +14.600284810903005 +5.52314051128247 +-7.366121454761426 +-18.926052015710116 +19.450392478489917 +-18.651111251094143 +7.427911538998483 +-19.88354335757092 +8.278542381348647 +12.72085035492482 +5.43375520225101 +2.7532010112631227 +-0.022295743838157023 +-11.342229858570075 +9.066009446711018 +14.711245055072474 +12.973922603938782 +15.372360589765172 +-4.765201228279899 +-6.953853801930556 +-18.695324230778645 +-8.316299675435497 +-17.651712916173956 +-14.894510906802644 +3.2619527739278524 +10.767430404861983 +-19.540582933914756 +4.967699245324834 +17.90333969523209 +-13.191846126402012 +-18.573399078787077 +6.659845155898843 +13.782074523054689 +7.080582492470363 +13.454591214500965 +-12.400197026199793 +11.894359119566037 +14.098441847684427 +15.833848566970474 +17.170202198048877 +11.563894879674802 +-18.622905114953138 +15.729424843081183 +-19.86848134723686 +-5.213459073363303 +6.127382688345364 +-5.864473772899284 +-3.7958632385514406 +-13.984282077516257 +-4.911150704721813 +11.699433964542916 +-5.508869903788316 +15.90605366127555 +4.929940126050081 +-14.638186052346507 +-2.087322715225124 +9.224384948935104 +15.435384634123075 +2.0272105448318385 +0.6728455051517699 +-4.918666209577317 +9.450660122272758 +-15.013753438470388 +-18.846415152990023 +-5.3936962595210325 +16.369296094489613 +15.983429019771485 +4.8228857122589766 +-8.47185556118681 +-2.358465694536033 +11.800971438481508 +-19.266164799116122 +17.734705111212683 +12.69788452713388 +10.584296767908398 +-14.911312275577115 +-3.025018598887293 +13.126813474373208 +15.099807427580508 +5.68790811407553 +-12.349185900766123 +17.53470985454598 +13.756171666278071 +8.154495889201833 +14.742284239686484 +1.8625102873152528 +7.975768660512582 +-12.138721029310968 +19.217623120138853 +-18.093601815818555 +17.595785735420897 +-17.659585285124816 +-13.737950840270482 +-13.452488154533482 +-8.542857472395916 +19.965302009737094 +2.05790257690375 +-9.26809880123427 +-7.381652919803168 +14.820820757630074 +4.456890805301601 +-19.29050982936885 +10.792591198417028 +9.607939502348803 +-14.436331327963284 +15.563955932133517 +17.8897227876517 +4.309515842151171 +-10.619459304594212 +0.9497164425827833 +-14.945154767820021 +19.69891517011481 +6.959489174605885 +-3.200534046338337 +-9.61101753272981 +-13.307449822387461 +-15.870112612595669 +6.9371289761771 +-6.038146703448568 +-0.04024537794236949 +-11.613663903025206 +14.088326985043537 +-18.786249077466252 +7.761655423339011 +13.635765499897914 +-9.406367748713791 +-6.760044051369274 +-17.80913628212941 +0.4263875836880118 +17.91184196010053 +-8.346765884277389 +0.2043695172104023 +16.36569912170581 +-2.7881758720437446 +-7.6041440298931295 +-12.582686625571258 +-19.919491088784042 +3.7499647108693104 +-8.176356922627669 +9.185260946788372 +2.484703390831381 +1.9206557474491994 +-5.0738433988631435 +-11.3626830472322 +10.713851802868621 +-17.35570630430885 +-9.937087612859568 +17.729525843765067 +-12.508807181693747 +-8.458772884705308 +-7.674219000624799 +-3.934410703917642 +-18.343344406458947 +-12.057601879444665 +-9.071266771779275 +-16.00189237457495 +-15.272981022748088 +-5.868131637283543 +5.809704009205056 +-16.19243917742885 +-14.498990537278655 +1.9808571168982354 +9.429759884636667 +12.3141622469386 +2.490391680387802 +2.2756262269605756 +2.417070802771452 +-0.49098317943901293 +9.940219071600662 +-3.0111969456767724 +8.14824937099225 +-12.279669372652728 +19.56084737062804 +-10.614308911774742 +1.211871228455493 +-1.769493295505118 +16.720162042906345 +18.620214372178104 +-17.42959723735389 +6.148835932914096 +4.970118317964033 +-4.597819195139255 +1.981434036837296 +-16.976712226442444 +12.711398294155032 +-12.516471540240524 +16.01923710032778 +-7.499266937400586 +15.443134851924931 +-14.987965214236137 +11.53250041193093 +-11.851143503540658 +3.1519058396531534 +3.7090371075720263 +4.067124240532387 +6.144106971104222 +-1.0099394176224585 +2.4994271522188996 +7.989842069886528 +-8.913249759624215 +19.9268457427329 +-18.76412014543131 +4.783938353859526 +-6.6827426500591045 +12.524702900037866 +-14.120928483380574 +19.307197162281255 +7.432935087829492 +9.767141220579838 +-15.17185807090813 +-2.559053230396877 +19.888898000982913 +-11.827144564583314 +-9.039736649662578 +6.770321062380926 +-13.239616497139682 +-0.2827711921397622 +-16.66283508844664 +-0.7544045672377777 +-1.0968064963302382 +4.620116772153949 +1.8222313917530961 +-3.653896258425398 +-5.438549545878967 +-14.982299716508628 +-4.55627846245684 +-19.232638561458828 +16.215997978251117 +-11.85271851841069 +9.42512975631778 +0.885206361543883 +1.3147768139017515 +13.201981152533861 +2.660827924940463 +-16.05760836757135 +-17.568236849183975 +-18.26102521788115 +19.165493370621732 +19.467159954483947 +-7.4520713628339195 +17.06760820128344 +-16.311406491867395 +2.747300925716356 +-7.664894382156948 +11.969995489388232 +-12.985108137456356 +-9.780736395021815 +10.865755829827684 +15.435650546293886 +-5.422466795304178 +14.57873483951505 +7.940232566447683 +-0.7750695680850264 +-11.833549299784076 +3.197622799721781 +8.054017167173516 +-11.370195158241284 +6.149085593763143 +8.363372035410308 +-5.068228539118792 +-18.28730515425186 +8.268474321503344 +14.116842256713802 +-10.398751090160484 +-19.01661591987489 +12.88205838998065 +5.463389444917372 +14.564617233160654 +19.931260116958086 +12.78658314734011 +-13.062180780303212 +15.565540241686428 +4.87377102481641 +1.9417337558554912 +10.213252967302967 +-16.379520627874754 diff --git a/src/tests/test_numbers.cc b/src/tests/test_numbers.cc new file mode 100644 index 0000000..cc535b0 --- /dev/null +++ b/src/tests/test_numbers.cc @@ -0,0 +1,10 @@ + +#include "test_numbers.h" + +namespace CNORXZ +{ + namespace Test + { + static Vector Number::sCont; + } +} diff --git a/src/tests/test_numbers.h b/src/tests/test_numbers.h new file mode 100644 index 0000000..7bd0b8d --- /dev/null +++ b/src/tests/test_numbers.h @@ -0,0 +1,55 @@ + +#include +#include "base/types.h" +#include "base/assert.h" + +#ifndef TEST_NUMBER_FILE +#define TEST_NUMBER_FILE "" // CMake Variable +#endif + +namespace CNORXZ +{ + namespace Test + { + class Numbers + { + private: + static Vector sCont; + static void init() + { + std::fstream f(TEST_NUMBER_FILE, f.in); // text file with simple format: size\nnum0\nnum1\n... + CXZ_ASSERT(f.is_open(), "test number file '" << TEST_NUMBER_FILE << "'not found"); + SizeT nsize; + f >> nsize; + sCont.resize(nsize); + for(SizeT i = 0; i != nsize; ++i){ + f >> sCont[i]; + } + CXZ_ASSERT(f.good(), "error while reading test number file '" << TEST_NUMBER_FILE << "'"); + f.close(); + } + + public: + + static auto begin() + { + if(sCont.size() == 0) init(); + return sCont.cbegin(); + } + + static auto end() + { + if(sCont.size() == 0) init(); + return sCont.cend(); + } + + static auto get(SizeT pos, SizeT size) + { + auto b = begin()+pos; + auto e = b+size; + CXZ_ASSERT(e <= end(), "requested test numbers out of range"); + return Vector(b,e); + } + }; + } +}